Files
agent_contas/docs/EXTERNAL_GUARDRAILS_JUDGES.md

4.3 KiB

Guardrails e Judges externos — Contas

Objetivo

O agent_framework_oci mantém apenas mecanismos e políticas realmente genéricos. O agente Contas mantém políticas, exemplos e prompts que conhecem TIM, Contas, VAS, fatura, cancelamento ou nomenclaturas comerciais.

Regra arquitetural

  • Framework: engine, contratos, execução paralela, fail-fast, telemetria, carregamento YAML e implementações genéricas.
  • Agente: prompts/policies de domínio e classes externas.
  • Um componente externo só é importado quando o YAML do agente declara type: external.
  • Guardrails/judges nativos continuam funcionando sem qualquer alteração de configuração.

Configuração de guardrail externo

output:
  - code: TIM_AOFERTA
    type: external
    class: app.extensions.tim_guardrails:TimProactiveOfferRail
    enabled: true

O código TIM_AOFERTA deixa explícito que esta política é do agente Contas. O framework continua podendo oferecer AOFERTA como rail genérico para outros agentes.

Configuração de judge externo

judges:
  - name: tim_groundedness
    type: external
    class: app.extensions.tim_judges:TimGroundednessJudge
    enabled: true
    threshold: 0.60

Concorrência e threads

O ParallelRailExecutor executa todos os rails concorrentemente. evaluate() assíncrono roda no event loop; plugin síncrono roda por asyncio.to_thread, portanto não bloqueia o loop. Judges nativos e externos são disparados com asyncio.gather; judges síncronos também são deslocados para asyncio.to_thread. A ordem da lista de resultados permanece a ordem do YAML.

Compatibilidade

A extensão é aditiva. Entradas antigas como {code: PINJ} e {name: groundedness} seguem nativas. Somente itens com type: external usam import dinâmico. Isso evita dependência reversa do framework para app.*.

Mapeamento nesta versão do Contas

Genérico no framework Específico no Contas Motivo
OOS TIM_OOS escopo do Contas/TIM
AOFERTA TIM_AOFERTA política de oferta do atendimento TIM
REVPREC TIM_REVPREC exemplos e ações transacionais TIM
FRASEOLOGIA TIM_FRASEOLOGIA fraseologia própria (mantido desabilitado como antes)
response_quality tim_response_quality prompt original do auditor Contas
groundedness tim_groundedness prompt original de alucinação/grounding do Contas

Os prompts originais foram preservados em app/extensions/tim_prompts/. As versões sob agent_framework/.../calibrated/prompts foram generalizadas e não devem conter nomes comerciais TIM.

Como criar um novo componente

  1. Implemente uma classe no agente com evaluate(...).
  2. Para guardrail, retorne RailDecision/RailResult; para judge, retorne JudgeResult.
  3. Declare type: external e o caminho module:Class no YAML.
  4. Não crie cliente LLM próprio: use o llm fornecido pelo framework/contexto para manter llm_profiles.yaml, Langfuse e contabilização.
  5. Teste convivência com os rails/judges nativos e o comportamento fail-closed.

Hardcodes de integração do Contas

Os valores legados de clientId, channel, cspId, sender e URLs que antes apareciam como fallback em Python foram movidos para config/tim_integration_defaults.yaml. A precedência é:

  1. variável de ambiente;
  2. config/tim_integration_defaults.yaml;
  3. default explícito somente quando a chamada realmente define um default técnico.

Isso preserva contratos diferentes por operação (TIM_CANCELAMENTO_CHANNEL, TIM_DIVERGENCIA_CHANNEL, etc.) sem usar um TIM_DEFAULT_* que altere silenciosamente o legado.

Validação de contestação

validate_contestation_items é regra do domínio Contas e agora vive em app/domain/contas/contestation_validation.py. O módulo antigo no framework existe apenas como shim de compatibilidade/depreciação; código novo do Contas importa a implementação do agente diretamente.

Observabilidade dos códigos externos

O código semântico de um guardrail/judge externo não deve ser alterado para atender um código numérico de um cliente. Use config/observability_mapping.yaml para o contrato de telemetria. Exemplo: a extensão pode continuar emitindo GRL.TOXOUT, enquanto o contrato publica GRL.004. Isso mantém a política do agente separada do catálogo externo de observabilidade.