Módulo de Entrada HTTP
🌐 Outros idiomas
O módulo de Entrada HTTP fornece um servidor webhook que permite que sistemas externos invoquem agentes Symbiont através de requisições HTTP. Este módulo permite integração com serviços externos, webhooks e APIs expondo agentes através de endpoints HTTP.
Visão Geral
O módulo de Entrada HTTP consiste em:
- Servidor HTTP: Um servidor web baseado em Axum que escuta requisições HTTP recebidas
- Autenticação: Suporte para autenticação baseada em Bearer token e JWT
- Roteamento de Requisições: Regras de roteamento flexíveis para direcionar requisições para agentes específicos
- Controle de Resposta: Formatação de resposta configurável e códigos de status
- Recursos de Segurança: Suporte CORS, limites de tamanho de requisição e registro de auditoria
- Gerenciamento de Concorrência: Limitação de taxa de requisições integrada e controle de concorrência
O módulo é compilado condicionalmente com a flag de recurso http-input
e integra-se perfeitamente com o runtime de agentes Symbiont.
Configuração
O módulo de Entrada HTTP é configurado usando a estrutura HttpInputConfig
:
Configuração Básica
use symbiont_runtime::http_input::HttpInputConfig;
use symbiont_runtime::types::AgentId;
let config = HttpInputConfig {
bind_address: "0.0.0.0".to_string(),
port: 8081,
path: "/webhook".to_string(),
agent: AgentId::from_str("webhook_handler")?,
// ... other fields
..Default::default()
};
Campos de Configuração
Campo | Tipo | Padrão | Descrição |
---|---|---|---|
bind_address |
String |
"0.0.0.0" |
Endereço IP para vincular o servidor HTTP |
port |
u16 |
8081 |
Número da porta para escutar |
path |
String |
"/webhook" |
Endpoint de caminho HTTP |
agent |
AgentId |
Novo ID | Agente padrão para invocar para requisições |
auth_header |
Option<String> |
None |
Bearer token para autenticação |
jwt_public_key_path |
Option<String> |
None |
Caminho para arquivo de chave pública JWT |
max_body_bytes |
usize |
65536 |
Tamanho máximo do corpo da requisição (64 KB) |
concurrency |
usize |
10 |
Máximo de requisições concorrentes |
routing_rules |
Option<Vec<AgentRoutingRule>> |
None |
Regras de roteamento de requisições |
response_control |
Option<ResponseControlConfig> |
None |
Configuração de formatação de resposta |
forward_headers |
Vec<String> |
[] |
Cabeçalhos para encaminhar aos agentes |
cors_enabled |
bool |
false |
Habilitar suporte CORS |
audit_enabled |
bool |
true |
Habilitar registro de auditoria de requisições |
Regras de Roteamento de Agentes
Rotear requisições para diferentes agentes baseado nas características da requisição:
use symbiont_runtime::http_input::{AgentRoutingRule, RouteMatch};
let routing_rules = vec![
AgentRoutingRule {
condition: RouteMatch::PathPrefix("/api/github".to_string()),
agent: AgentId::from_str("github_handler")?,
},
AgentRoutingRule {
condition: RouteMatch::HeaderEquals("X-Source".to_string(), "slack".to_string()),
agent: AgentId::from_str("slack_handler")?,
},
AgentRoutingRule {
condition: RouteMatch::JsonFieldEquals("source".to_string(), "twilio".to_string()),
agent: AgentId::from_str("sms_handler")?,
},
];
Controle de Resposta
Personalizar respostas HTTP com ResponseControlConfig
:
use symbiont_runtime::http_input::ResponseControlConfig;
let response_control = ResponseControlConfig {
default_status: 200,
agent_output_to_json: true,
error_status: 500,
echo_input_on_error: false,
};
Recursos de Segurança
Autenticação
O módulo de Entrada HTTP suporta múltiplos métodos de autenticação:
Autenticação com Bearer Token
Configurar um bearer token estático:
let config = HttpInputConfig {
auth_header: Some("Bearer your-secret-token".to_string()),
..Default::default()
};
Integração com Armazenamento de Segredos
Usar referências de segredos para segurança aprimorada:
let config = HttpInputConfig {
auth_header: Some("vault://webhook/auth_token".to_string()),
..Default::default()
};
Autenticação JWT
Configurar autenticação baseada em JWT:
let config = HttpInputConfig {
jwt_public_key_path: Some("/path/to/jwt/public.key".to_string()),
..Default::default()
};
Controles de Segurança
- Limites de Tamanho de Requisição: Tamanho máximo configurável do corpo previne esgotamento de recursos
- Limites de Concorrência: Semáforo integrado controla processamento de requisições concorrentes
- Suporte CORS: Cabeçalhos CORS opcionais para aplicações baseadas em navegador
- Registro de Auditoria: Registro estruturado de todas as requisições recebidas quando habilitado
- Resolução de Segredos: Integração com Vault e armazenamentos de segredos baseados em arquivo
Exemplo de Uso
Iniciando o Servidor de Entrada HTTP
use symbiont_runtime::http_input::{HttpInputConfig, start_http_input};
use symbiont_runtime::secrets::SecretsConfig;
use std::sync::Arc;
// Configurar o servidor de entrada HTTP
let config = HttpInputConfig {
bind_address: "127.0.0.1".to_string(),
port: 8081,
path: "/webhook".to_string(),
agent: AgentId::from_str("webhook_handler")?,
auth_header: Some("Bearer secret-token".to_string()),
audit_enabled: true,
cors_enabled: true,
..Default::default()
};
// Opcional: Configurar segredos
let secrets_config = SecretsConfig::default();
// Iniciar o servidor
start_http_input(config, Some(runtime), Some(secrets_config)).await?;
Exemplo de Definição de Agente
Criar um agente manipulador de webhook em webhook_handler.dsl
:
agent webhook_handler(body: JSON) -> Maybe<Alert> {
capabilities = ["http_input", "event_processing", "alerting"]
memory = "ephemeral"
privacy = "strict"
policy webhook_guard {
allow: use("llm") if body.source == "slack" || body.user.ends_with("@company.com")
allow: publish("topic://alerts") if body.type == "security_alert"
audit: all_operations
}
with context = {} {
if body.type == "security_alert" {
alert = {
"summary": body.message,
"source": body.source,
"level": body.severity,
"user": body.user
}
publish("topic://alerts", alert)
return alert
}
return None
}
}
Exemplo de Requisição HTTP
Enviar uma requisição webhook para acionar o agente:
curl -X POST http://localhost:8081/webhook \
-H "Content-Type: application/json" \
-H "Authorization: Bearer secret-token" \
-d '{
"type": "security_alert",
"message": "Suspicious login detected",
"source": "slack",
"severity": "high",
"user": "admin@company.com"
}'
Resposta Esperada
O servidor retorna uma resposta JSON com a saída do agente:
{
"status": "invoked",
"agent_id": "webhook_handler",
"timestamp": "2024-01-15T10:30:00Z"
}
Padrões de Integração
Endpoints de Webhook
Configurar diferentes agentes para diferentes fontes de webhook:
let routing_rules = vec![
AgentRoutingRule {
condition: RouteMatch::HeaderEquals("X-GitHub-Event".to_string(), "push".to_string()),
agent: AgentId::from_str("github_push_handler")?,
},
AgentRoutingRule {
condition: RouteMatch::JsonFieldEquals("source".to_string(), "stripe".to_string()),
agent: AgentId::from_str("payment_processor")?,
},
];
Integração com Gateway de API
Usar como serviço backend atrás de um gateway de API:
let config = HttpInputConfig {
bind_address: "0.0.0.0".to_string(),
port: 8081,
path: "/api/webhook".to_string(),
cors_enabled: true,
forward_headers: vec![
"X-Forwarded-For".to_string(),
"X-Request-ID".to_string(),
],
..Default::default()
};
Endpoint de Verificação de Saúde
O servidor automaticamente fornece capacidades de verificação de saúde para balanceadores de carga e sistemas de monitoramento.
Tratamento de Erros
O módulo de Entrada HTTP fornece tratamento de erros abrangente:
- Erros de Autenticação: Retorna
401 Unauthorized
para tokens inválidos - Limitação de Taxa: Retorna
429 Too Many Requests
quando limites de concorrência são excedidos - Erros de Payload: Retorna
400 Bad Request
para JSON malformado - Erros de Agente: Retorna status de erro configurável com detalhes do erro
- Erros do Servidor: Retorna
500 Internal Server Error
para falhas de runtime
Monitoramento e Observabilidade
Registro de Auditoria
Quando audit_enabled
é true, o módulo registra informações estruturadas sobre todas as requisições:
INFO HTTP Input: Received request with 5 headers
INFO Would invoke agent webhook_handler with input data
Integração de Métricas
O módulo integra-se com o sistema de métricas do runtime Symbiont para fornecer:
- Contagem e taxa de requisições
- Distribuições de tempo de resposta
- Taxas de erro por tipo
- Contagens de conexões ativas
- Utilização de concorrência
Melhores Práticas
- Segurança: Sempre usar autenticação em ambientes de produção
- Limitação de Taxa: Configurar limites de concorrência apropriados baseados na sua infraestrutura
- Monitoramento: Habilitar registro de auditoria e integrar com sua stack de monitoramento
- Tratamento de Erros: Configurar respostas de erro apropriadas para seu caso de uso
- Design de Agentes: Projetar agentes para lidar com formatos de entrada específicos de webhook
- Limites de Recursos: Definir limites razoáveis de tamanho de corpo para prevenir esgotamento de recursos