# Manual do Agent Contas Migrado para agent_framework_oci ## 1. Objetivo Esta versão reconstrói o Agent Contas sobre o `agent_framework_oci` com uma regra arquitetural simples: **o código executável novo não depende do pacote anterior do Contas**. O projeto anterior é apenas referência funcional para preservar regras, contratos de API, fixtures e comportamentos de negócio durante a migração. O agente novo reutiliza do framework tudo que é infraestrutura genérica: LangGraph, router, stickiness, supervisor, confirmação transacional, clarificação, memória, summary memory, long-term memory, checkpoints, persistence, RAG, embeddings, MCP Tool Router, guardrails, output supervisor, judges, identity, channels, SSE, usage accounting e telemetria. O novo domínio Contas mantém somente o que é realmente específico da TIM: chamadas de faturas, VAS, contestação, protocolos, tracking, SMS, Secure PDF e regras que relacionam essas operações. ## 2. Regra de independência A Definition of Done da migração é: ```bash grep -R "agente_contas_tim" app mcp config ``` Resultado esperado: nenhuma ocorrência/import do pacote anterior. O pacote entregue já inclui `tests/migration/test_no_legacy_dependency.py` para impedir regressão dessa regra. ## 3. Arquitetura ```text Canal / Frontend | v app/main.py | v agent_framework_oci |-- ChannelGateway / IdentityResolver |-- LangGraph / AgentWorkflow |-- EnterpriseRouter / Route Stickiness / Supervisor |-- Guardrails / Output Supervisor / Judges |-- Memory / Summary Memory / LTM / Checkpoints |-- RAG / Embeddings / Cache |-- MCPToolRouter |-- Langfuse / Analytics / OTEL / OCI Streaming | v MCP Contas :8400 | v app/domain/contas |-- TimApiClient |-- ContasDomainService `-- fixtures de desenvolvimento | v APIs TIM ``` Não existe um segundo LangGraph, LLM gateway, confirmation manager, workflow engine ou memory store dentro do MCP. ## 4. Agentes de domínio A versão migrada possui quatro agentes reais do domínio Contas: | Agente | Responsabilidade | |---|---| | `faturas_agent` | Consulta de faturas, composição, variação e explicação de cobrança | | `vas_agent` | Consulta de VAS, histórico, serviços estratégicos/bundles e informação de serviços | | `contestacao_agent` | Cancelamento transacional de VAS e contestação de cobrança | | `suporte_contas_agent` | Protocolos, acompanhamento, suporte e encerramento | Todos herdam `AgentRuntimeMixin` do framework. Eles não implementam máquina de confirmação/clarificação própria. ## 5. LangGraph do framework O fluxo principal é o `StateGraph` do `agent_framework_oci` usado em `app/workflows/agent_graph.py`: ```text START -> input_guardrails -> load_long_term_memory -> routing_decision -> agente de domínio -> output_supervisor -> output_guardrails -> judge -> supervisor_review -> persist_long_term_memory -> persist -> END ``` O `EnterpriseRouter` decide a intent, agente e tools. O route stickiness decide continuidade da conversa. O runtime do framework controla coleta de parâmetros e confirmação de tools transacionais. ## 6. Transações As tools abaixo são transacionais em `config/tool_policies.yaml`: - `cancelar_vas_avulso` - `tratar_vas_estrategico` - `contestar_cobranca` A confirmação ocorre **antes** da chamada MCP e é responsabilidade do `AgentRuntimeMixin`. O domínio recebe a chamada somente depois de a política do framework permitir execução. Isso evita o problema clássico de um "sim" responder à pergunta errada: a confirmação está vinculada ao estado transacional/tool pendente do framework, não a heurísticas no prompt. ## 7. RAG Conhecimento conceitual não é uma API TIM e por isso não é implementado como "workflow de busca" dentro do MCP. O projeto usa diretamente: - `RagService` - `create_embedding_provider()` - `VECTOR_STORE_PROVIDER` - `GRAPH_STORE_PROVIDER` - `EMBEDDING_PROVIDER` `buscar_informacao` permanece desabilitada no catálogo MCP; perguntas de conhecimento passam pelo RAG nativo do framework. ## 8. Funcionalidades migradas | Funcionalidade do Contas | Nova implementação | Responsabilidade do framework | |---|---|---| | Consulta de faturas | `ContasDomainService.consultar_faturas` | seleção da tool, identity, cache, resposta | | Explicação de fatura | API de fatura + billing analysis como evidência | LLM produz explicação grounded | | Consulta VAS | `consultar_vas` | routing/tool selection | | Histórico VAS | `consultar_historico_vas` | routing/tool selection | | Cancelamento VAS avulso | consulta -> match -> bloqueio -> cancelamento | parâmetros + confirmação + estado | | VAS estratégico/bundle | domínio retorna serviço e orientação | conversa/continuidade no LangGraph | | Contestação | faturas/contrato/profile -> protocolo -> contestação -> tracking | parâmetros + confirmação + estado | | Status de solicitação | `consultar_status_solicitacao` | roteamento e contexto | | SMS | `enviar_sms` | tool policy/contexto | | Secure PDF | `recuperar_fatura_pdf` | roteamento/identity | | Encerramento | efeitos de domínio opcionais | `end_session`, memória e telemetria | | Guardrails | nenhum código local duplicado | framework | | Judges | nenhum código local duplicado | framework | | Memória | nenhum store local de conversa | framework | | LTM | nenhum mecanismo local | framework | | Checkpoint | nenhum `MemorySaver` dentro do MCP | framework | | Telemetria | eventos do runtime/framework | framework | ## 9. Estrutura do projeto ```text app/ main.py state.py agents/ faturas_agent.py vas_agent.py contestacao_agent.py suporte_contas_agent.py domain/contas/ client.py service.py fixtures/ workflows/ agent_graph.py observability/ config/ routing.yaml tools.yaml tool_policies.yaml mcp_servers.yaml mcp_parameter_mapping.yaml identity.yaml prompts/ contas_mcp/servers/contas_mcp_server/ main.py agent_framework_oci/ ... framework reutilizado ... ``` ## 10. Arquivo `.env` O `.env` fornecido para esta reconstrução foi preservado byte a byte no pacote. Não foi recomposto nem reduzido. O arquivo contém dois grupos: 1. configurações do `agent_framework_oci`; 2. variáveis TIM de domínio/compatibilidade já compiladas para os ambientes. Embora algumas variáveis antigas possam deixar de ser usadas depois da migração, elas foram mantidas para não perder o trabalho de consolidação. A remoção deve ocorrer apenas após testes de DEV/FQA/PRD. ### Variáveis principais do framework - `LLM_PROVIDER` - `OCI_AUTH_MODE`, `OCI_CONFIG_FILE`, `OCI_PROFILE`, `OCI_COMPARTMENT_ID`, `OCI_REGION` - `SESSION_REPOSITORY_PROVIDER` - `MEMORY_REPOSITORY_PROVIDER` - `CHECKPOINT_REPOSITORY_PROVIDER` - `VECTOR_STORE_PROVIDER` - `GRAPH_STORE_PROVIDER` - `EMBEDDING_PROVIDER` - `ENABLE_LANGFUSE` - `ENABLE_INPUT_GUARDRAILS` - `ENABLE_OUTPUT_GUARDRAILS` - `ENABLE_JUDGES` - `ENABLE_SUPERVISOR` - `ENABLE_ROUTE_STICKINESS` - `ENABLE_MCP_TOOLS` - `ENABLE_CONVERSATION_SUMMARY_MEMORY` - `ENABLE_LONG_TERM_MEMORY` ### Modo mock x APIs TIM reais Mock atual: ```env TIM_GATEWAY_MODE=mock TIM_USE_MOCK_GATEWAY=true ``` Integrações reais: ```env TIM_GATEWAY_MODE=real TIM_USE_MOCK_GATEWAY=false ``` Os dois valores devem estar coerentes. ## 11. Integrações TIM | Integração | Variável | Método | VPN TIM provável | |---|---|---|---| | Complete Invoices | `TIM_COMPLETE_INVOICES_URL` | POST | Sim em FQA interno | | Billing Analysis | `TIM_DIVERGENCIA_URL` | POST | Sim | | Consulta VAS | `TIM_URL_CONSULTA_VAS` | GET | Sim | | Histórico VAS | `TIM_VAS_HISTORY_URL` | GET | Sim | | Bloqueio VAS | `TIM_URL_BLOQUEIO_VAS` | POST | Sim | | Cancelamento VAS | `TIM_CANCELAMENTO_URL` | DELETE | Sim | | Contrato | `TIM_CONTRATO_URL` | GET | Sim | | Full Profile | `TIM_PROFILE_FULL_URL` | GET | Sim | | Contestação | `TIM_CUSTOMER_CONTESTATION_URL` | POST | Sim | | Protocolo | `TIM_PROTOCOL_URL` | POST | Sim | | Service Request Status | `TIM_SERVICE_REQUEST_STATUS_URL` | POST | Sim | | Tracking Activities | `TIM_TRACKING_ACTIVITIES_URL` | POST | Sim | | SMS | `TIM_SMS_URL` | POST | Sim | | Secure PDF | `TIM_URL_INVOICE_RECOVER` | POST | Sim | Os endpoints FQA do `.env` usam `pmidfqa.internal.timbrasil.com.br`; portanto DNS/rota corporativa precisa estar disponível para teste real. ## 12. Outras integrações | Integração | Uso | Ativação | |---|---|---| | OCI GenAI | LLM | `LLM_PROVIDER=oci_sdk` + `OCI_AUTH_MODE` | | Autonomous DB | session/memory/checkpoint/vector/usage | providers `autonomous` + `ADB_*` | | OCI Embeddings | RAG | `EMBEDDING_PROVIDER=oci` | | Langfuse | tracing | `ENABLE_LANGFUSE=true` | | GCP Pub/Sub | analytics corporativo | `ENABLE_ANALYTICS=true`, provider Pub/Sub e credencial GCP | | MongoDB | sequence Pub/Sub | `PUBSUB_SEQUENCE_PROVIDER=mongodb` | | Redis | cache/sequence opcional | `ENABLE_REDIS_CACHE=true` ou provider sequence redis | | OTEL | logs/traces | `ENABLE_OTEL=true` + endpoint | | OCI Streaming | eventos alternativos | `ENABLE_OCI_STREAMING=true` | ## 13. Instalação local Recomendado: Linux/WSL com Python 3.13. ```bash cd contas_migrado_framework_native uv sync ``` Se o `uv` ainda não estiver disponível, instale-o conforme o padrão do seu ambiente e depois execute `uv sync`. ## 14. Subir o MCP Contas Terminal 1: ```bash uv run uvicorn contas_mcp.servers.contas_mcp_server.main:app \ --host 0.0.0.0 --port 8400 ``` Validar: ```bash curl http://localhost:8400/health curl http://localhost:8400/mcp/tools/list ``` `/health` deve reportar: ```json { "status": "ok", "architecture": "framework-native", "legacy_dependency": false } ``` ## 15. Subir o Agent Contas Terminal 2: ```bash uv run uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` Validar: ```bash curl http://localhost:8000/health ``` ## 16. Smoke test do MCP em mock ```bash PYTHONPATH=".:agent_framework_oci/libs/agent_framework/src" \ python scripts/smoke_mcp.py ``` Esse teste cobre faturas, invoice explanation, VAS, histórico, cancelamento e contestação usando fixtures migradas para o novo domínio. ## 17. Testar o agente pelo Gateway Exemplo de consulta: ```bash curl -X POST http://localhost:8000/gateway/message \ -H 'Content-Type: application/json' \ -d '{ "channel":"web", "agent_id":"telecom_contas", "tenant_id":"default", "payload":{ "text":"Quero consultar minha fatura", "session_id":"contas-test-001", "user_id":"user-001", "msisdn":"11999999999", "message_id":"msg-001" } }' ``` Depois teste continuidade na mesma `session_id`. ## 18. Teste transacional de VAS 1. Envie: `Quero cancelar TIM Fashion Mensal`. 2. O framework deve identificar tool transacional e pedir confirmação. 3. Responda `sim` na mesma sessão. 4. Somente então `cancelar_vas_avulso` deve ser chamada. 5. Em modo mock, o resultado deve conter `block.status=200` e `cancellation.status=200`. Teste negativo importante: 1. Entre em estado aguardando confirmação de cancelamento. 2. Envie `você ainda está por aí?`. 3. A frase não pode confirmar a transação. ## 19. Teste de contestação Em mock: ```text Quero contestar Tamboro Mensal no valor de 14,99, não reconheço essa cobrança. ``` Esperado: - route `contestacao_agent`; - parâmetros `subject` e `valor` coletados; - confirmação antes da mutação; - abertura de protocolo; - contestação; - tracking; - resposta final grounded nos retornos da tool. ## 20. Testes de memória ### Short-term / summary Na mesma sessão: ```text Meu serviço é TIM Fashion Mensal. ... Qual serviço eu mencionei antes? ``` ### Long-term memory Com `ENABLE_LONG_TERM_MEMORY=true`, grave uma informação elegível, encerre a sessão e abra outra sessão com a mesma identidade de negócio. Verifique se o contexto é recuperado conforme as regras de LTM do framework. ## 21. Testes de RAG Valide que a intent de conhecimento não dispara MCP desnecessariamente. Exemplos: ```text O que significa cobrança proporcional? Como funciona o vencimento da fatura? ``` O trace deve mostrar `RagService`; a tool `buscar_informacao` não precisa ser executada. ## 22. Testes de guardrails e judges Com as flags habilitadas no `.env`: - prompt injection deve passar pelos input guardrails; - resposta candidata passa pelo Output Supervisor/output guardrails; - groundedness deve considerar `mcp_results` quando a resposta usa dados TIM; - judges rodam após a geração e antes da persistência final. Use o Langfuse para observar a sequência de nodes do LangGraph. ## 23. Teste de conectividade/VPN O pacote contém: ```bash python scripts/check_integrations.py ``` O script resolve DNS e testa TCP dos endpoints configurados. Execute antes e depois de conectar a VPN. Para APIs FQA, um resultado `DNS_FAIL`, `TCP_FAIL` ou timeout indica que a rede ainda não está pronta. Um `TCP_OK` prova conectividade de rede, mas não autenticação/contrato HTTP. ## 24. Ativar APIs reais gradualmente Não habilite todas as mutações de uma vez. Ordem recomendada: 1. VPN/DNS; 2. `consultar_faturas`; 3. `consultar_vas`; 4. `consultar_historico_vas`; 5. contrato/profile; 6. billing analysis; 7. Secure PDF; 8. protocol/status/tracking; 9. SMS; 10. cancelamento VAS; 11. contestação. Depois faça teste end-to-end completo. ## 25. Kubernetes Use o mesmo `.env` como fonte para construir ConfigMap/Secret, separando segredos no mecanismo corporativo apropriado. O backend necessita alcançar: - MCP Contas; - OCI GenAI; - Autonomous DB; - Langfuse, se habilitado; - endpoints TIM internos em modo real; - providers de analytics habilitados. O MCP pode rodar no mesmo pod como sidecar ou, preferencialmente, como deployment/service separado. Configure `config/mcp_servers.yaml` para o DNS do Service Kubernetes. ## 26. Critérios de aceite da migração A migração é considerada concluída quando: - [ ] zero imports/referências executáveis ao pacote anterior; - [ ] backend e MCP sobem após o diretório anterior ser removido; - [ ] read-only APIs funcionam em FQA; - [ ] cancelamento exige confirmação do framework e funciona em FQA; - [ ] contestação exige confirmação e reproduz efeitos esperados; - [ ] RAG usa `RagService` do framework; - [ ] memory/summary/LTM/checkpoint usam providers do framework; - [ ] guardrails e judges aparecem nos traces; - [ ] LangGraph é a única máquina de estados conversacional; - [ ] Pub/Sub/sequence/OTEL/Langfuse são validados conforme ambiente; - [ ] testes de carga são executados antes de produção. ## 27. Segurança do `.env` O arquivo preservado contém material sensível. Ele foi mantido porque isso foi um requisito explícito da reconstrução. Para distribuição fora do ambiente controlado, rotacione credenciais expostas e substitua valores por Secrets/Vault/Key Vault/Kubernetes Secret conforme política corporativa.