Atualizar Regra
curl --request PATCH \
--url http://api.gu1.ai/rules/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"category": "<string>",
"enabled": true,
"priority": 123,
"score": 123,
"status": "<string>",
"conditions": {},
"actions": [
{}
],
"targetEntityTypes": [
{}
],
"evaluationMode": "<string>",
"riskMatrixId": "<string>",
"scope": {},
"tags": [
{}
]
}
'import requests
url = "http://api.gu1.ai/rules/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"category": "<string>",
"enabled": True,
"priority": 123,
"score": 123,
"status": "<string>",
"conditions": {},
"actions": [{}],
"targetEntityTypes": [{}],
"evaluationMode": "<string>",
"riskMatrixId": "<string>",
"scope": {},
"tags": [{}]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
category: '<string>',
enabled: true,
priority: 123,
score: 123,
status: '<string>',
conditions: {},
actions: [{}],
targetEntityTypes: [{}],
evaluationMode: '<string>',
riskMatrixId: '<string>',
scope: {},
tags: [{}]
})
};
fetch('http://api.gu1.ai/rules/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "http://api.gu1.ai/rules/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'category' => '<string>',
'enabled' => true,
'priority' => 123,
'score' => 123,
'status' => '<string>',
'conditions' => [
],
'actions' => [
[
]
],
'targetEntityTypes' => [
[
]
],
'evaluationMode' => '<string>',
'riskMatrixId' => '<string>',
'scope' => [
],
'tags' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://api.gu1.ai/rules/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"category\": \"<string>\",\n \"enabled\": true,\n \"priority\": 123,\n \"score\": 123,\n \"status\": \"<string>\",\n \"conditions\": {},\n \"actions\": [\n {}\n ],\n \"targetEntityTypes\": [\n {}\n ],\n \"evaluationMode\": \"<string>\",\n \"riskMatrixId\": \"<string>\",\n \"scope\": {},\n \"tags\": [\n {}\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("http://api.gu1.ai/rules/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"category\": \"<string>\",\n \"enabled\": true,\n \"priority\": 123,\n \"score\": 123,\n \"status\": \"<string>\",\n \"conditions\": {},\n \"actions\": [\n {}\n ],\n \"targetEntityTypes\": [\n {}\n ],\n \"evaluationMode\": \"<string>\",\n \"riskMatrixId\": \"<string>\",\n \"scope\": {},\n \"tags\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://api.gu1.ai/rules/{id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"category\": \"<string>\",\n \"enabled\": true,\n \"priority\": 123,\n \"score\": 123,\n \"status\": \"<string>\",\n \"conditions\": {},\n \"actions\": [\n {}\n ],\n \"targetEntityTypes\": [\n {}\n ],\n \"evaluationMode\": \"<string>\",\n \"riskMatrixId\": \"<string>\",\n \"scope\": {},\n \"tags\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"version": 123,
"previousVersionId": "<string>",
"updatedBy": "<string>",
"updatedAt": "<string>"
}Referência API
Atualizar Regra
Atualizar a configuração de uma regra existente — no motor de regras gu1 para compliance e detecção de risco, com exemplos para update.
PATCH
/
rules
/
{id}
Atualizar Regra
curl --request PATCH \
--url http://api.gu1.ai/rules/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"category": "<string>",
"enabled": true,
"priority": 123,
"score": 123,
"status": "<string>",
"conditions": {},
"actions": [
{}
],
"targetEntityTypes": [
{}
],
"evaluationMode": "<string>",
"riskMatrixId": "<string>",
"scope": {},
"tags": [
{}
]
}
'import requests
url = "http://api.gu1.ai/rules/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"category": "<string>",
"enabled": True,
"priority": 123,
"score": 123,
"status": "<string>",
"conditions": {},
"actions": [{}],
"targetEntityTypes": [{}],
"evaluationMode": "<string>",
"riskMatrixId": "<string>",
"scope": {},
"tags": [{}]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
category: '<string>',
enabled: true,
priority: 123,
score: 123,
status: '<string>',
conditions: {},
actions: [{}],
targetEntityTypes: [{}],
evaluationMode: '<string>',
riskMatrixId: '<string>',
scope: {},
tags: [{}]
})
};
fetch('http://api.gu1.ai/rules/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "http://api.gu1.ai/rules/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'category' => '<string>',
'enabled' => true,
'priority' => 123,
'score' => 123,
'status' => '<string>',
'conditions' => [
],
'actions' => [
[
]
],
'targetEntityTypes' => [
[
]
],
'evaluationMode' => '<string>',
'riskMatrixId' => '<string>',
'scope' => [
],
'tags' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://api.gu1.ai/rules/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"category\": \"<string>\",\n \"enabled\": true,\n \"priority\": 123,\n \"score\": 123,\n \"status\": \"<string>\",\n \"conditions\": {},\n \"actions\": [\n {}\n ],\n \"targetEntityTypes\": [\n {}\n ],\n \"evaluationMode\": \"<string>\",\n \"riskMatrixId\": \"<string>\",\n \"scope\": {},\n \"tags\": [\n {}\n ]\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("http://api.gu1.ai/rules/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"category\": \"<string>\",\n \"enabled\": true,\n \"priority\": 123,\n \"score\": 123,\n \"status\": \"<string>\",\n \"conditions\": {},\n \"actions\": [\n {}\n ],\n \"targetEntityTypes\": [\n {}\n ],\n \"evaluationMode\": \"<string>\",\n \"riskMatrixId\": \"<string>\",\n \"scope\": {},\n \"tags\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://api.gu1.ai/rules/{id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"category\": \"<string>\",\n \"enabled\": true,\n \"priority\": 123,\n \"score\": 123,\n \"status\": \"<string>\",\n \"conditions\": {},\n \"actions\": [\n {}\n ],\n \"targetEntityTypes\": [\n {}\n ],\n \"evaluationMode\": \"<string>\",\n \"riskMatrixId\": \"<string>\",\n \"scope\": {},\n \"tags\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"version": 123,
"previousVersionId": "<string>",
"updatedBy": "<string>",
"updatedAt": "<string>"
}Visão Geral
Actualiza la configuración de una regla existente. Todos los campos son opcionales - solo incluya los campos que desea actualizar. Actualizar una regla incrementa automáticamente su número de versión y mantiene el historial de versiones para propósitos de auditoría.Endpoint
PATCH http://api.gu1.ai/rules/{id}
Autenticação
Requer uma chave API válida no cabeçalho de Authorization:Authorization: Bearer YOUR_API_KEY
Parâmetros de Rota
string
required
UUID de la regla a actualizar
Corpo da Requisição
Todos los campos son opcionales. Solo incluya los campos que desea modificar.string
Actualizar nombre de la regla
string
Actualizar descripción de la regla
string
Actualizar categoría:
kyc, kyb, aml, fraud, compliance, customboolean
Habilitar o deshabilitar la regla
number
Actualizar prioridad (1-100)
number
Actualizar puntaje de riesgo (0-100)
string
Actualizar estado:
draft, in_progress, in_review, active, shadow, archived, inactiveobject
Actualizar lógica de condiciones
array
Actualizar array de acciones
array
Actualizar tipos de entidad objetivo
string
Actualizar modo de evaluación:
sync o asyncstring
Actualizar UUID de matriz de riesgo asociada
object
Actualizar configuración de alcance
array
Actualizar array de etiquetas
Respuesta
string
UUID de la regla actualizada
number
Nuevo número de versión (incrementado)
string
UUID de la versión anterior
string
ID del usuario que actualizó la regla
string
Marca de tiempo ISO de la actualización
Exemplos de Requisições
Habilitar/Deshabilitar Regla
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
const response = await fetch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
{
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
enabled: false
})
}
);
const rule = await response.json();
console.log('Regla deshabilitada. Nueva versión:', rule.version);
import requests
response = requests.patch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'enabled': False
}
)
rule = response.json()
print(f"Regla deshabilitada. Nueva versión: {rule['version']}")
Actualizar Prioridad y Puntaje
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"priority": 90,
"score": 75
}'
const response = await fetch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
{
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
priority: 90,
score: 75
})
}
);
const rule = await response.json();
console.log('Prioridad y puntaje actualizados');
response = requests.patch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'priority': 90,
'score': 75
}
)
rule = response.json()
print('Prioridad y puntaje actualizados')
Actualizar Condiciones
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conditions": {
"operator": "OR",
"conditions": [
{
"id": "cond-1",
"type": "simple",
"field": "enrichmentData.normalized.taxId",
"operator": "eq",
"value": "33.592.510/0001-54",
"filters": []
},
{
"id": "cond-2",
"type": "simple",
"field": "enrichmentData.normalized.taxId",
"operator": "eq",
"value": "12.345.678/0001-90",
"filters": []
}
]
}
}'
const response = await fetch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
{
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
conditions: {
operator: 'OR',
conditions: [
{
id: 'cond-1',
type: 'simple',
field: 'enrichmentData.normalized.taxId',
operator: 'eq',
value: '33.592.510/0001-54',
filters: []
},
{
id: 'cond-2',
type: 'simple',
field: 'enrichmentData.normalized.taxId',
operator: 'eq',
value: '12.345.678/0001-90',
filters: []
}
]
}
})
}
);
const rule = await response.json();
console.log('Condiciones actualizadas. Ahora verificando 2 CNPJs');
response = requests.patch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'conditions': {
'operator': 'OR',
'conditions': [
{
'id': 'cond-1',
'type': 'simple',
'field': 'enrichmentData.normalized.taxId',
'operator': 'eq',
'value': '33.592.510/0001-54',
'filters': []
},
{
'id': 'cond-2',
'type': 'simple',
'field': 'enrichmentData.normalized.taxId',
'operator': 'eq',
'value': '12.345.678/0001-90',
'filters': []
}
]
}
}
)
rule = response.json()
print('Condiciones actualizadas. Ahora verificando 2 CNPJs')
Agregar Acciones
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"actions": [
{
"type": "createAlert",
"createAlert": {
"type": "COMPLIANCE",
"title": "High Risk Entity Detected",
"description": "Entity matched high-risk criteria",
"severity": "CRITICAL",
"recipients": ["compliance@company.com", "security@company.com"]
},
"tags": ["high-risk", "urgent"]
},
{
"type": "updateEntityStatus",
"updateEntityStatus": {
"status": "under_review",
"reason": "Flagged by automated rule"
}
},
{
"type": "sendNotification",
"sendNotification": {
"channel": "email",
"recipients": ["compliance-lead@company.com"],
"message": "Immediate review required for high-risk entity"
}
}
]
}'
Actualizar Estado a Modo Shadow
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "shadow",
"enabled": true
}'
// Desplegar regla en modo shadow (registra coincidencias sin ejecutar acciones)
const response = await fetch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
{
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'shadow',
enabled: true
})
}
);
const rule = await response.json();
console.log('Regla desplegada en modo shadow para pruebas');
# Desplegar regla en modo shadow
response = requests.patch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'status': 'shadow',
'enabled': True
}
)
rule = response.json()
print('Regla desplegada en modo shadow para pruebas')
Actualizar Etiquetas
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": ["blocklist", "high-priority", "brazil", "automated"]
}'
const response = await fetch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
{
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
tags: ['blocklist', 'high-priority', 'brazil', 'automated']
})
}
);
const rule = await response.json();
console.log('Etiquetas actualizadas');
response = requests.patch(
'http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'tags': ['blocklist', 'high-priority', 'brazil', 'automated']
}
)
rule = response.json()
print('Etiquetas actualizadas')
Exemplo de Resposta
{
"id": "e2cdd639-52cc-4749-9b16-927bfa5dfaea",
"organizationId": "71e8f908-e032-4fcb-b0ce-ad0cd0ffb236",
"name": "CNPJ Blocklist Check",
"description": "Block companies with specific CNPJ",
"category": "kyb",
"status": "active",
"enabled": true,
"priority": 90,
"score": 75,
"conditions": {...},
"actions": [...],
"scope": {...},
"targetEntityTypes": ["company"],
"evaluationMode": "sync",
"riskMatrixId": "d257247b-af7b-402a-ad8f-eac209e2990e",
"version": 2,
"previousVersionId": "e2cdd639-52cc-4749-9b16-927bfa5dfaea-v1",
"tags": ["blocklist", "high-priority"],
"createdBy": "f35c10cb-9b67-4cda-9aea-f36567375dba",
"createdAt": "2024-12-22T14:10:28.131Z",
"updatedBy": "f35c10cb-9b67-4cda-9aea-f36567375dba",
"updatedAt": "2024-12-23T10:30:00.000Z",
"stats": {
"failures": 0,
"successes": 7,
"executions": 7
}
}
Respostas de Erro
404 Not Found
{
"error": "Rule not found",
"id": "e2cdd639-52cc-4749-9b16-927bfa5dfaea"
}
400 Bad Request - Datos Inválidos
{
"error": "Validation failed",
"details": {
"field": "priority",
"message": "Priority must be between 1 and 100"
}
}
401 Unauthorized
{
"error": "Invalid or missing API key"
}
403 Forbidden
{
"error": "Access denied",
"message": "You don't have permission to update this rule"
}
409 Conflict
{
"error": "Rule is currently being executed",
"message": "Cannot update rule during active execution"
}
Casos de Uso
Refinamiento Progresivo de Reglas
// Comenzar con modo shadow, luego activar gradualmente
async function deployRuleProgressively(ruleId) {
// Fase 1: Desplegar en modo shadow
console.log('Fase 1: Despliegue en modo shadow...');
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'shadow',
enabled: true
})
});
// Esperar y monitorear por 1 semana...
console.log('Monitoreando modo shadow por 1 semana...');
// Fase 2: Activar con baja prioridad
console.log('Fase 2: Activando con baja prioridad...');
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'active',
priority: 20
})
});
// Esperar y monitorear rendimiento...
console.log('Monitoreando rendimiento...');
// Fase 3: Aumentar prioridad si funciona bien
console.log('Fase 3: Aumentando prioridad...');
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
priority: 80
})
});
console.log('Regla completamente desplegada');
}
Actualización Masiva de Reglas por Categoría
def bulk_update_by_category(category, updates):
"""Actualizar todas las reglas en una categoría"""
# Obtener todas las reglas en la categoría
response = requests.get(
'http://api.gu1.ai/rules',
headers={
'Authorization': 'Bearer YOUR_API_KEY'
},
params={
'category': category,
'pageSize': 100
}
)
rules = response.json()['rules']
print(f"Actualizando {len(rules)} reglas en categoría '{category}'...")
for rule in rules:
update_response = requests.patch(
f'http://api.gu1.ai/rules/{rule["id"]}',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json=updates
)
if update_response.status_code == 200:
print(f" Actualizada: {rule['name']}")
else:
print(f" Falló: {rule['name']}")
print(f"Actualización masiva completada")
# Ejemplo: Deshabilitar todas las reglas AML temporalmente
bulk_update_by_category('aml', {'enabled': False})
Pruebas A/B de Reglas
async function setupRuleABTest(ruleId) {
// Obtener regla original
const originalResponse = await fetch(
`http://api.gu1.ai/rules/${ruleId}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const original = await originalResponse.json();
// Crear variante con diferente puntaje
const variantResponse = await fetch(
'http://api.gu1.ai/rules',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
...original,
id: undefined,
name: original.name + ' (Variante)',
score: original.score + 10,
tags: [...original.tags, 'ab-test', 'variant'],
enabled: false // Iniciar deshabilitada
})
}
);
const variant = await variantResponse.json();
// Etiquetar original como control
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
tags: [...original.tags, 'ab-test', 'control']
})
});
console.log('Prueba A/B configurada completamente');
console.log('Control:', ruleId);
console.log('Variante:', variant.id);
return { control: ruleId, variant: variant.id };
}
Rotar Destinatarios de Acciones
def rotate_alert_recipients(rule_id, new_recipients):
"""Actualizar destinatarios de alertas para una regla"""
# Obtener regla actual
response = requests.get(
f'http://api.gu1.ai/rules/{rule_id}',
headers={
'Authorization': 'Bearer YOUR_API_KEY'
}
)
rule = response.json()
# Actualizar destinatarios de alertas en acciones
updated_actions = []
for action in rule['actions']:
if action['type'] == 'createAlert':
action['createAlert']['recipients'] = new_recipients
updated_actions.append(action)
# Actualizar regla
update_response = requests.patch(
f'http://api.gu1.ai/rules/{rule_id}',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'actions': updated_actions
}
)
if update_response.status_code == 200:
print(f"Destinatarios de alerta actualizados a: {new_recipients}")
else:
print(f"Falló la actualización de destinatarios")
return update_response.json()
Melhores Práticas
- Actualizaciones Parciales: Solo envíe campos que desea cambiar
- Probar Primero: Use endpoint de ejecución para probar antes de actualizar reglas de producción
- Modo Shadow: Pruebe cambios de condiciones en modo shadow antes de activar
- Historial de Versiones: Mantenga registro de números de versión para capacidad de rollback
- Monitorear Estadísticas: Observe estadísticas de ejecución después de actualizaciones
- Despliegue Gradual: Actualice prioridad gradualmente al desplegar nueva lógica
- Etiquetar Cambios: Etiquete reglas con metadatos de actualización para seguimiento
Versionamiento
Cada actualización crea una nueva versión:version: Se incrementa en 1previousVersionId: Enlaza a versión anterior- El historial de versiones se mantiene para auditoría y rollback
Notas
- Las actualizaciones se aplican inmediatamente para reglas sync
- Las reglas async pueden tomar algunos minutos en reflejar cambios
- Las estadísticas se preservan a través de actualizaciones
- Las reglas deshabilitadas no se ejecutan pero permanecen en el sistema
Veja Também
- Obter Regra - Recuperar estado actual de regla
- Executar Regra - Probar reglas actualizadas
- Criar Regra - Crear nuevas reglas
- Listar Regras - Consultar reglas
Was this page helpful?
⌘I