diff --git a/agent_framework_oci/Documentacao/README_MCP.md b/agent_framework_oci/Documentacao/README_MCP.md index 5397002f..247fe2e8 100644 --- a/agent_framework_oci/Documentacao/README_MCP.md +++ b/agent_framework_oci/Documentacao/README_MCP.md @@ -77,3 +77,12 @@ No compose, o backend usa `config/mcp_servers.docker.yaml` para apontar para `te ## Operações read-only e transacionais Use `config/tool_policies.yaml` no backend para classificar somente as operações que precisam de tratamento adicional. A validação é aplicada no roteador central antes do MCP Gateway/Server. O arquivo é opcional e templates antigos continuam usando as políticas já presentes em `tools.yaml`. A configuração completa e o roteiro de migração estão em [README_TOOL_POLICIES.md](README_TOOL_POLICIES.md). + + +## Chamadas MCP multi-item + +Para operações com listas de produtos, pedidos, ativos ou outros recursos, **não implemente loops de chamadas MCP dentro do agente**. O framework possui contrato genérico para parâmetros `array/list`, pre-validation, confirmação e resultado por item (`SUCCESS`, `PARTIAL_SUCCESS`, `FAILED`). + +Guia completo: [MCP Multi-item — Guia do Desenvolvedor](../docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md). + +A tool primária deve retornar `results[]` com `success` ou `ok` booleano por item. Em workflows, use preferencialmente `output[tool_name].results`. diff --git a/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/IMPLEMENTACAO_MULTI_ITEM_MCP.md b/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/IMPLEMENTACAO_MULTI_ITEM_MCP.md new file mode 100644 index 00000000..8c0662cc --- /dev/null +++ b/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/IMPLEMENTACAO_MULTI_ITEM_MCP.md @@ -0,0 +1,236 @@ +# Implementação prática — MCP Multi-Item + +Este documento mostra o caminho mínimo para adicionar uma operação multi-item a um agente sem criar lógica paralela no código do agente. + +## 1. Modele uma única operação lógica + +Exemplo de requisito: + +```text +quero cancelar Produto A, Produto B e Produto C +``` + +A operação lógica deve continuar sendo uma só: + +```text +cancelar_produtos +``` + +Não crie `cancelar_produto_1`, `cancelar_produto_2`, loops no agent ou intents artificiais por item. + +## 2. Declare a coleção em `tools.yaml` + +```yaml +tools: + cancelar_produtos: + description: Cancela um ou mais produtos do cliente. + mcp_server: contas + enabled: true + tool_type: action + confirmation_required: true + requires: [items] + args_schema: + items: + type: array + label: os produtos + description: Lista de produtos a cancelar. + user_prompt: Quais produtos deseja cancelar? +``` + +Também é aceito `type: list` quando o projeto já usa essa forma. + +## 3. Use a policy transacional existente + +```yaml +tool_policies: + cancelar_produtos: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validar_produtos_cancelamento + fail_open: false +``` + +Nenhuma chave específica de multi-item é necessária. + +## 4. Canonicalize os itens no MCP validator + +Entrada possível: + +```json +{ + "items": ["produto a", "produto b", "produto c"] +} +``` + +Saída recomendada: + +```json +{ + "eligible": true, + "status": "ELIGIBLE", + "transaction_decision": { + "resolved_arguments": { + "items": [ + {"name": "Produto A", "id": "1001"}, + {"name": "Produto B", "id": "1002"}, + {"name": "Produto C", "id": "1003"} + ] + }, + "target_tool": "cancelar_produtos", + "confirmation_message": "Você confirma o cancelamento de Produto A, Produto B e Produto C?" + } +} +``` + +O validator deve ser side-effect-free. + +## 5. Não transforme uma falha individual em rejeição global + +Caso: + +```text +A = válido +B = inválido +C = válido +``` + +Se A e C ainda podem ser executados, não use simplesmente: + +```json +{ + "eligible": false, + "reason": "B inválido" +} +``` + +Isso encerraria a transação inteira. + +Prefira manter a transação elegível quando houver item acionável e preservar informação suficiente para a tool primária produzir o resultado final por item. + +## 6. Execute a coleção no MCP Server ou workflow + +### Backend com API batch + +```python +async def cancelar_produtos(items): + response = await backend.cancel_batch(items) + return normalize_results(response) +``` + +### Backend com API apenas unitária + +```python +async def cancelar_produtos(items): + results = [] + for item in items: + try: + response = await backend.cancel_one(item) + results.append({ + "name": item["name"], + "success": True, + "response": response, + }) + except Exception as exc: + results.append({ + "name": item["name"], + "success": False, + "error": str(exc), + }) + return {"results": results} +``` + +O loop acima pertence ao MCP/workflow, **não ao Agent**. + +## 7. Retorne `results[]` por item + +Contrato mínimo: + +```json +{ + "results": [ + {"name": "Produto A", "success": true}, + {"name": "Produto B", "success": false, "error": "not_found"}, + {"name": "Produto C", "success": true} + ] +} +``` + +O framework aceita `success` ou `ok` booleano por item. + +## 8. Resultado interpretado pelo framework + +No exemplo anterior: + +```text +items_count = 3 +items_succeeded_count = 2 +items_failed_count = 1 +multi_item_status = PARTIAL_SUCCESS +``` + +O framework preserva os resultados terminais e fornece esse contexto para composição/presentation. + +## 9. Workflow com etapa auxiliar + +Estrutura recomendada: + +```json +{ + "status": "COMPLETED", + "output": { + "cancelar_produtos": { + "results": [ + {"name": "A", "success": true}, + {"name": "B", "success": true} + ] + }, + "registrar_analitica": { + "success": false, + "error": "analytics unavailable" + } + } +} +``` + +O resultado autoritativo da operação principal deve estar em: + +```text +workflow.output[cancelar_produtos].results +``` + +Assim uma falha auxiliar não converte A e B em falha operacional. + +## 10. Checklist do desenvolvedor + +Antes de criar código adicional, verifique: + +- [ ] existe uma única tool lógica para a operação; +- [ ] a coleção está declarada como `array` ou `list` em `tools.yaml`; +- [ ] confirmação/pre-validation usam `tool_policies.yaml` existente; +- [ ] canonicalização pertence ao MCP validator; +- [ ] fan-out, se necessário, pertence ao MCP Server/workflow; +- [ ] a tool primária devolve `results[]`; +- [ ] cada item contém `success` ou `ok` booleano; +- [ ] sucessos parciais não são apagados por uma falha global posterior; +- [ ] a apresentação comunica sucesso/falha por item; +- [ ] não foi criado um segundo motor multi-item no Agent. + +## 11. Testes mínimos recomendados + +Cubra ao menos: + +```text +1 item / sucesso +N itens / todos sucesso +N itens / sucesso parcial +N itens / todos falha +item não canonicalizado +confirmação única para N itens +falha auxiliar após sucesso primário +replay/idempotência da mesma operação +``` + +Para detalhes do contrato interno do runtime, consulte `docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md`. diff --git a/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/README.md b/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/README.md new file mode 100644 index 00000000..629eb417 --- /dev/null +++ b/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/README.md @@ -0,0 +1,229 @@ +# Multi-Item MCP + +Capability de referência para operações MCP que precisam processar **mais de um item do mesmo tipo** em uma única intenção: produtos, pedidos, VAS, ativos, faturas, linhas, contratos ou recursos. + +> Esta capability é **framework-native**. Ela não exige um motor multi-item dentro do agente e não adiciona novos atributos obrigatórios a `tools.yaml` ou `tool_policies.yaml`. + +## Quando usar + +Use quando o usuário puder solicitar, por exemplo: + +```text +cancele Produto A, Produto B e Produto C +``` + +ou: + +```text +consulte os pedidos 1001, 1002 e 1003 +``` + +O desenvolvedor deve modelar **uma operação lógica** que receba a coleção. O framework cuida de estado, confirmação e interpretação de resultados; o MCP Server ou workflow de domínio cuida da execução dos itens. + +## Divisão de responsabilidades + +```text +Agent + seleciona a operação + NÃO cria motor multi-item + + ↓ + +tools.yaml + declara array/list + NÃO exige chave multi_item + + ↓ + +tool_policies.yaml + confirmação + pre-validation + usa o mesmo contrato transacional existente + + ↓ + +MCP validator + resolve/canonicaliza os itens + pode preencher transaction_decision.resolved_arguments + + ↓ + +MCP tool / workflow + executa os itens + devolve results[] com success/ok por item + + ↓ + +Agent Framework + mantém estado + controla confirmação + interpreta results[] + preserva evidência por item + calcula SUCCESS / PARTIAL_SUCCESS / FAILED + + ↓ + +LLM / Presentation + apresenta cada sucesso/falha +``` + +## Configuração mínima + +### `tools.yaml` + +O modo de configuração continua o mesmo. Declare o parâmetro como `array` ou `list`: + +```yaml +tools: + cancelar_produtos: + description: Cancela um ou mais produtos. + mcp_server: contas + enabled: true + tool_type: action + confirmation_required: true + requires: [items] + args_schema: + items: + type: array + label: os produtos + description: Produtos solicitados pelo cliente. + user_prompt: Informe quais produtos deseja cancelar. +``` + +Não é necessário criar configuração como: + +```yaml +# NÃO EXISTE / NÃO É NECESSÁRIO +multi_item: true +multi_item_strategy: partial +fan_out: framework +``` + +### `tool_policies.yaml` + +O contrato também continua o mesmo: + +```yaml +tool_policies: + cancelar_produtos: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validar_produtos_cancelamento + fail_open: false +``` + +## Pre-validation e lista canônica + +O validator pode transformar nomes informais em uma coleção canônica antes da confirmação: + +```json +{ + "eligible": true, + "transaction_decision": { + "resolved_arguments": { + "items": [ + {"name": "Produto A", "id": "1001"}, + {"name": "Produto B", "id": "1002"}, + {"name": "Produto C", "id": "1003"} + ] + }, + "target_tool": "cancelar_produtos", + "confirmation_message": "Você confirma o cancelamento de Produto A, Produto B e Produto C?" + } +} +``` + +### Validação parcial + +`eligible` é global para a transação. Portanto, se pelo menos um item puder ser processado, o validator **não deve reprovar o lote inteiro apenas porque outro item falhou**. + +Padrão recomendado: + +1. `eligible: true` quando existe pelo menos um item acionável; +2. preservar/canonicalizar todos os itens necessários em `resolved_arguments`; +3. executar a operação primária; +4. retornar o resultado terminal individual em `results[]`. + +Se nenhum item puder ser processado, `eligible: false` é apropriado. + +## Resultado MCP esperado + +A tool primária deve retornar `results[]` com `success` ou `ok` booleano por item: + +```json +{ + "results": [ + {"name": "Produto A", "success": true}, + {"name": "Produto B", "success": false, "error": "not_found"}, + {"name": "Produto C", "success": true} + ] +} +``` + +O framework deriva automaticamente: + +```text +PARTIAL_SUCCESS +2 succeeded +1 failed +``` + +Estados possíveis: + +| Resultado dos itens | Status do framework | +|---|---| +| todos concluídos | `SUCCESS` | +| alguns concluídos e alguns falharam | `PARTIAL_SUCCESS` | +| todos falharam | `FAILED` | + +## Uma chamada lógica, não N chamadas no agente + +Se o backend suporta batch, prefira: + +```text +Agent -> cancelar_produtos(items=[A,B,C]) -> MCP +``` + +Se o backend possui apenas API unitária, o fan-out deve ficar encapsulado no MCP Server ou no workflow de domínio: + +```text +Agent -> cancelar_produtos(items=[A,B,C]) + | + v + MCP/workflow + / | \ + A B C + \ | / + results[] +``` + +Evite: + +```python +# NÃO: lógica multi-item dentro do agente +for item in items: + await tool_router.call("cancelar_produto", {"item": item}) +``` + +## Workflow-backed tools + +Quando a operação é implementada por workflow, o caminho preferencial do resultado primário é: + +```text +workflow.output[tool_name].results +``` + +Isso permite distinguir a operação primária de etapas auxiliares. Uma falha posterior não deve apagar o sucesso terminal de itens já executados. + +## Documentação completa + +Consulte também: + +- `docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md` — guia canônico em português; +- `docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md` — guia canônico em inglês; +- `templates/agent_template_backend/docs/MCP_MULTI_ITEM.md` — referência junto ao template; +- `specs/SPEC-010-Agent-Development.md` — regra arquitetural de desenvolvimento. + +Para um passo a passo prático, leia `IMPLEMENTACAO_MULTI_ITEM_MCP.md` nesta pasta. diff --git a/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/README_en.md b/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/README_en.md new file mode 100644 index 00000000..afe5a5e7 --- /dev/null +++ b/agent_framework_oci/Tuning-Performance/Multi_Item_MCP/README_en.md @@ -0,0 +1,69 @@ +# Multi-Item MCP + +Reference capability for MCP operations that process **multiple items of the same kind** in one user intent: products, orders, services, assets, invoices, lines, contracts, or resources. + +This capability is **framework-native**. It does not require a multi-item engine in the agent and does not introduce new mandatory keys in `tools.yaml` or `tool_policies.yaml`. + +```text +Agent selects the operation; no fan-out engine + -> tools.yaml declares array/list + -> tool_policies.yaml confirmation + pre-validation + -> MCP validator resolves/canonicalizes items + -> MCP tool/workflow executes items and returns results[] + -> Agent Framework preserves per-item evidence and derives + SUCCESS / PARTIAL_SUCCESS / FAILED + -> Presentation reports each success/failure +``` + +## Minimal configuration + +`tools.yaml` keeps the existing list contract: + +```yaml +tools: + cancel_products: + requires: [items] + args_schema: + items: + type: array +``` + +`tool_policies.yaml` also keeps the current transaction contract: + +```yaml +tool_policies: + cancel_products: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validate_products_for_cancellation + fail_open: false +``` + +No `multi_item: true`, framework fan-out flag, or extra agent code is required. + +## MCP result contract + +The primary tool should return `results[]` with boolean `success` or `ok` per item: + +```json +{ + "results": [ + {"name": "A", "success": true}, + {"name": "B", "success": false, "error": "not_found"}, + {"name": "C", "success": true} + ] +} +``` + +The framework derives `PARTIAL_SUCCESS` for the example above and preserves the successful items. + +If the downstream system only supports single-item APIs, put the fan-out inside the MCP Server or domain workflow, not inside the agent. + +For the complete contract see: + +- `docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md` +- `docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md` +- `IMPLEMENTACAO_MULTI_ITEM_MCP.md` diff --git a/agent_framework_oci/Tuning-Performance/README.md b/agent_framework_oci/Tuning-Performance/README.md index 4f527547..d03dc6cf 100644 --- a/agent_framework_oci/Tuning-Performance/README.md +++ b/agent_framework_oci/Tuning-Performance/README.md @@ -8,3 +8,4 @@ Variantes e documentos de referência para comparar funcionalidades e impacto de - `Deterministic_Transactional_Workflow`: transações multi-etapas executadas por workflow LangGraph determinístico após clarification e confirmação. - `Transaction_Evidence`: persistência e correlação de resultados transacionais como evidência operacional para turnos posteriores e groundedness. - `Transaction_Pre_Validation`: pré-validação MCP side-effect-free antes da confirmação transacional; regras de elegibilidade permanecem no domínio. +- `Multi_Item_MCP`: operações MCP sobre listas de produtos/pedidos/serviços/ativos com confirmação única, canonicalização e resultado por item (`SUCCESS` / `PARTIAL_SUCCESS` / `FAILED`), sem criar motor multi-item no agente. diff --git a/agent_framework_oci/docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md b/agent_framework_oci/docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md new file mode 100644 index 00000000..6d5244f3 --- /dev/null +++ b/agent_framework_oci/docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md @@ -0,0 +1,363 @@ +# MCP Multi-item — Guia do Desenvolvedor + +## Objetivo + +Use este guia quando uma única intenção do usuário precisa operar sobre **mais de um item do mesmo tipo** em uma chamada MCP, por exemplo: + +- cancelar vários VAS/produtos; +- devolver ou consultar vários pedidos; +- alterar vários ativos; +- processar uma lista de faturas, linhas, contratos ou recursos. + +O framework já possui contratos genéricos para **coleta de listas**, **pré-validação/canonicalização**, **confirmação transacional**, **execução MCP** e **normalização do resultado por item**. O desenvolvedor não deve criar um segundo motor de multi-item dentro do agente. + +## Regra principal + +**Não faça loop de negócio no agente.** O agente declara a tool e seus parâmetros; o runtime mantém estado, confirmação e evidência. A operação em lote deve ser exposta como uma tool MCP que aceite uma coleção, ou como uma tool transacional apoiada por um workflow/MCP que processe a coleção. + +Fluxo recomendado: + +```text +Usuário cita N itens + -> Router/Agent seleciona a tool + -> Runtime coleta/reconcilia parâmetro array/list + -> (opcional) pre-validation canonicaliza itens + -> Runtime pede UMA confirmação coerente para o conjunto + -> MCP recebe a coleção + -> MCP/workflow processa item a item + -> MCP devolve results[] com success/ok por item + -> Framework normaliza SUCCESS / PARTIAL_SUCCESS / FAILED + -> Composição final relata sucessos e falhas individualmente +``` + +## 1. Declarar um parâmetro de lista em `tools.yaml` + +O reconciliador transacional do framework aceita `type: array` ou `type: list`. + +```yaml +tools: + cancelar_produtos: + description: Cancela um ou mais produtos do cliente. + mcp_server: contas + enabled: true + tool_type: action + confirmation_required: true + requires: [items] + args_schema: + items: + type: array + label: os produtos + description: Lista de produtos que o cliente deseja cancelar. + user_prompt: Informe quais produtos deseja cancelar. +``` + +O runtime pode reconciliar uma frase como: + +```text +quero cancelar TIM Fashion, Aya Audiobooks e Neymar Jr +``` + +para um argumento lógico semelhante a: + +```json +{ + "items": ["TIM Fashion", "Aya Audiobooks", "Neymar Jr"] +} +``` + +A semântica de domínio e a validação dos nomes continuam pertencendo ao MCP/pre-validator, não ao core. + +## 2. Quando usar pre-validation + +Use `tool_policies.yaml` quando a lista precisa ser resolvida/canonicalizada antes da confirmação. + +```yaml +tool_policies: + cancelar_produtos: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validar_produtos_cancelamento + fail_open: false +``` + +O pre-validator pode retornar `eligible: true` e substituir argumentos por valores canônicos em `transaction_decision.resolved_arguments`: + +```json +{ + "eligible": true, + "transaction_decision": { + "resolved_arguments": { + "items": [ + {"name": "TIM Fashion Mensal", "id": "1001"}, + {"name": "Aya Audiobooks Premium", "id": "1002"}, + {"name": "Neymar Jr", "id": "1003"} + ] + }, + "target_tool": "cancelar_produtos", + "confirmation_message": "Você confirma o cancelamento de TIM Fashion Mensal, Aya Audiobooks Premium e Neymar Jr?" + } +} +``` + +### Importante para validação parcial + +O contrato `eligible` da pre-validation é global. Portanto, **não retorne `eligible: false` apenas porque um item da lista falhou**, caso os demais ainda possam ser processados. Isso encerraria toda a transação. + +Para permitir resultado parcial, a estratégia recomendada é: + +1. retornar `eligible: true` quando existe pelo menos um item acionável; +2. preservar/canonicalizar a coleção em `resolved_arguments`; +3. deixar a tool primária devolver o resultado terminal de **cada item** em `results[]`. + +Se nenhum item puder ser processado, então `eligible: false` é apropriado. + +## 3. Contrato de entrada do MCP + +Prefira uma única chamada MCP com uma coleção explícita: + +```json +{ + "tool_name": "cancelar_produtos", + "arguments": { + "customer_id": "123", + "items": [ + {"name": "TIM Fashion Mensal", "id": "1001"}, + {"name": "Aya Audiobooks Premium", "id": "1002"}, + {"name": "Neymar Jr", "id": "1003"} + ] + } +} +``` + +O framework **não deve ser usado como um loop improvisado que chama N vezes uma tool escalar a partir do agente**. Se o backend só possui API unitária, o fan-out pode ficar encapsulado no MCP Server ou em um workflow de domínio, mantendo uma única tool lógica para o agente. + +## 4. Contrato obrigatório de resultado por item + +Para o framework reconhecer multi-item automaticamente, a **tool primária solicitada** deve expor uma lista `results` com **dois ou mais itens**, e cada item deve possuir um booleano `success` ou `ok`. + +Exemplo: + +```json +{ + "ok": true, + "result": { + "results": [ + {"id": "1001", "subject": "TIM Fashion Mensal", "success": true}, + {"id": "1002", "subject": "Aya Audiobooks Premium", "success": false, "reason": "not_found"}, + {"id": "1003", "subject": "Neymar Jr", "success": true} + ] + } +} +``` + +Campos como `id`, `subject`, `name`, `reason`, `error`, `protocol` e outros são de domínio e opcionais. O sinal estrutural exigido pelo normalizador é `success: true|false` ou `ok: true|false` por item. + +### Workflow-backed tool + +Se a tool é executada por workflow, o caminho preferencial e autoritativo é: + +```text +workflow.output[tool_name].results +``` + +Exemplo: + +```json +{ + "ok": false, + "result": { + "status": "COMPLETED", + "output": { + "cancelar_produtos": { + "results": [ + {"subject": "A", "success": true}, + {"subject": "B", "success": false, "reason": "not_found"}, + {"subject": "C", "success": true} + ] + }, + "etapa_auxiliar": { + "success": false, + "error": "falha em pós-processamento" + } + } + }, + "error": "falha em pós-processamento" +} +``` + +O runtime preserva o resultado da operação primária e não permite que uma falha auxiliar apague itens já concluídos. + +## 5. O que o framework produz automaticamente + +Com `results[]` válido, o runtime adiciona: + +```json +{ + "multi_item_status": "PARTIAL_SUCCESS", + "partial_success": true, + "metadata": { + "multi_item": { + "status": "PARTIAL_SUCCESS", + "items_count": 3, + "items_succeeded_count": 2, + "items_failed_count": 1, + "primary_tool": "cancelar_produtos" + } + } +} +``` + +Estados possíveis: + +| Situação | `multi_item_status` | +|---|---| +| todos os itens concluíram | `SUCCESS` | +| parte concluiu e parte falhou | `PARTIAL_SUCCESS` | +| todos falharam | `FAILED` | + +Se uma etapa posterior fizer o wrapper retornar `ok=false`, mas pelo menos um item primário tiver sucesso, o framework preserva para auditoria: + +```json +{ + "ok": true, + "original_ok": false, + "secondary_error": "erro da etapa posterior" +} +``` + +Isso evita transformar sucesso parcial/real em falha total na resposta ao usuário. + +## 6. O que NÃO fazer + +Evite estes padrões: + +```python +# NÃO: motor multi-item paralelo dentro do agente +for product in products: + await tool_router.call("cancelar_produto", {"product": product}) +``` + +```json +// NÃO: apenas um approved global sem evidência por item +{ + "approved": false, + "error": "um item falhou" +} +``` + +```json +// NÃO: um único success agregado quando houve resultados mistos +{ + "success": false, + "message": "operação bloqueada" +} +``` + +Esses formatos perdem a evidência terminal individual e podem fazer itens concluídos desaparecerem da composição final. + +## 7. Exemplo completo: vários pedidos + +### `tools.yaml` + +```yaml +tools: + cancelar_pedidos: + description: Cancela um ou mais pedidos. + mcp_server: retail + enabled: true + tool_type: action + confirmation_required: true + requires: [order_ids] + args_schema: + order_ids: + type: array + label: os pedidos + description: Lista de identificadores de pedidos a cancelar. + user_prompt: Quais pedidos deseja cancelar? +``` + +### Retorno MCP + +```json +{ + "ok": true, + "result": { + "results": [ + {"order_id": "P-100", "success": true, "protocol": "ABC1"}, + {"order_id": "P-101", "success": false, "reason": "already_shipped"}, + {"order_id": "P-102", "success": true, "protocol": "ABC3"} + ] + } +} +``` + +O framework classificará automaticamente como `PARTIAL_SUCCESS` e fornecerá ao LLM a instrução de relatar os resultados item a item. + +## 8. Read-only multi-item + +A mesma estrutura serve para consultas em lote. A diferença é que normalmente não existe confirmação: + +```yaml +tool_policies: + consultar_pedidos: + operation_type: read_only + require_confirmation: false +``` + +A tool ainda pode retornar `results[]` com `success/ok` por item para que uma consulta parcialmente indisponível não esconda as consultas bem-sucedidas. + +## 9. Idempotência e protocolos + +Em operações com efeito colateral: + +- use uma chave de idempotência de requisição e, quando necessário, uma chave por item; +- devolva protocolo/operation id no próprio item; +- não dependa apenas de uma mensagem textual agregada; +- em retry, preserve os itens já concluídos e execute apenas o que a regra de domínio permitir. + +O framework preserva evidência; a política de idempotência do sistema de destino continua pertencendo ao MCP/workflow de domínio. + +## 10. Checklist para o desenvolvedor + +- [ ] A tool aceita `array/list` quando o caso de uso é multi-item. +- [ ] Não existe loop MCP de negócio dentro da classe do agente. +- [ ] Se houver canonicalização, ela está em pre-validation/MCP, não hardcoded no agente. +- [ ] A confirmação mostra o conjunto efetivo de itens. +- [ ] A tool primária retorna `results[]` com `success` ou `ok` por item. +- [ ] Resultado parcial não é reduzido a um único `approved=false` ou `success=false` global. +- [ ] Workflow usa `output[tool_name].results` para a evidência terminal da tool primária. +- [ ] Testes cobrem todos-sucesso, parcial, todos-falha e falha auxiliar posterior. +- [ ] A resposta final menciona sucessos e falhas quando houver `PARTIAL_SUCCESS`. + +## 11. Onde o comportamento existe no framework + +Referências atuais: + +```text +libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py + - coerção de type=array/list + +libs/agent_framework/src/agent_framework/runtime/agent_runtime.py + - pre-validation e resolved_arguments + - _primary_multi_item_outcomes() + - _normalize_multi_item_tool_result() + - instrução de composição multi-item para o LLM + +tests/test_multi_item_result_normalization.py + - regressões de SUCCESS/PARTIAL_SUCCESS e proteção contra falha auxiliar +``` + +## 12. Resumo de responsabilidade + +| Camada | Responsabilidade | +|---|---| +| Agente | declarar intenção/tool e usar o runtime; não implementar motor multi-item | +| `tools.yaml` | declarar parâmetro `array/list` e schema | +| `tool_policies.yaml` | confirmação e pre-validation | +| Pre-validator MCP | resolver/canonicalizar entidades e argumentos | +| Tool MCP/workflow | executar a coleção e produzir resultado por item | +| Framework runtime | manter estado, confirmação, normalizar resultado multi-item e preservar evidência | +| LLM/presentation | transformar evidências em resposta, sem apagar sucesso/falha individual | diff --git a/agent_framework_oci/docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md b/agent_framework_oci/docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md new file mode 100644 index 00000000..a032f42a --- /dev/null +++ b/agent_framework_oci/docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md @@ -0,0 +1,252 @@ +# MCP Multi-item — Developer Guide + +## Purpose + +Use this guide when a single user intent must operate on **more than one item of the same kind** through MCP, such as multiple products, orders, assets, invoices, lines, contracts, or resources. + +The framework already provides generic contracts for **list parameter collection**, **pre-validation/canonicalization**, **transaction confirmation**, **MCP execution**, and **per-item result normalization**. Do not create a second multi-item engine inside an agent. + +## Main rule + +**Do not implement business fan-out loops in the agent.** The agent declares the tool and parameters; the runtime owns state, confirmation, and evidence. A bulk operation should be exposed as an MCP tool that accepts a collection, or as a transactional tool backed by a domain MCP/workflow that processes the collection. + +Recommended flow: + +```text +User names N items + -> Router/Agent selects the tool + -> Runtime collects/reconciles an array/list parameter + -> optional pre-validation canonicalizes items + -> Runtime asks ONE coherent confirmation for the set + -> MCP receives the collection + -> MCP/workflow processes each item + -> MCP returns results[] with success/ok per item + -> Framework normalizes SUCCESS / PARTIAL_SUCCESS / FAILED + -> Final composition reports successes and failures individually +``` + +## 1. Declare a list parameter in `tools.yaml` + +The transaction parameter reconciler accepts `type: array` and `type: list`. + +```yaml +tools: + cancel_products: + description: Cancels one or more customer products. + mcp_server: accounts + enabled: true + tool_type: action + confirmation_required: true + requires: [items] + args_schema: + items: + type: array + label: the products + description: List of products the customer wants to cancel. + user_prompt: Which products do you want to cancel? +``` + +A phrase naming several products can therefore be reconciled into a logical list argument. Domain semantics and canonical name validation remain in MCP/pre-validation, not in the core. + +## 2. Use pre-validation for canonicalization + +Configure `tool_policies.yaml` when the list must be resolved before confirmation: + +```yaml +tool_policies: + cancel_products: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validate_products_for_cancellation + fail_open: false +``` + +A validator may return `eligible: true` and replace the raw list through `transaction_decision.resolved_arguments`: + +```json +{ + "eligible": true, + "transaction_decision": { + "resolved_arguments": { + "items": [ + {"name": "Product A", "id": "1001"}, + {"name": "Product B", "id": "1002"} + ] + }, + "target_tool": "cancel_products", + "confirmation_message": "Do you confirm cancellation of Product A and Product B?" + } +} +``` + +### Partial validation + +The pre-validation `eligible` flag is global. **Do not return `eligible: false` only because one list item failed** when other items can still run; that would terminate the entire transaction. + +For partial outcomes, the recommended pattern is: + +1. return `eligible: true` when at least one item is actionable; +2. canonicalize/preserve the collection in `resolved_arguments`; +3. let the primary tool publish terminal status for **every item** in `results[]`. + +If no item can be processed, `eligible: false` is appropriate. + +## 3. MCP input contract + +Prefer one logical MCP call containing the collection: + +```json +{ + "tool_name": "cancel_products", + "arguments": { + "customer_id": "123", + "items": [ + {"name": "Product A", "id": "1001"}, + {"name": "Product B", "id": "1002"} + ] + } +} +``` + +Do not use the agent as an improvised loop that invokes a scalar tool N times. If the downstream backend only offers a single-item API, encapsulate fan-out in the MCP Server or domain workflow while keeping one logical tool for the agent. + +## 4. Required per-item result contract + +For automatic multi-item recognition, the **requested primary tool** must expose a `results` list with **two or more entries**, and every entry must contain boolean `success` or `ok`. + +```json +{ + "ok": true, + "result": { + "results": [ + {"id": "1001", "subject": "Product A", "success": true}, + {"id": "1002", "subject": "Product B", "success": false, "reason": "not_found"}, + {"id": "1003", "subject": "Product C", "success": true} + ] + } +} +``` + +Fields such as `id`, `subject`, `name`, `reason`, `error`, and `protocol` are domain-specific and optional. The structural signal required by the normalizer is per-item `success: true|false` or `ok: true|false`. + +### Workflow-backed tools + +For workflow-backed execution, the preferred authoritative location is: + +```text +workflow.output[tool_name].results +``` + +This prevents an auxiliary/post-processing failure from overwriting terminal outcomes of the requested primary operation. + +## 5. What the runtime adds automatically + +With a valid `results[]`, the runtime derives: + +```json +{ + "multi_item_status": "PARTIAL_SUCCESS", + "partial_success": true, + "metadata": { + "multi_item": { + "status": "PARTIAL_SUCCESS", + "items_count": 3, + "items_succeeded_count": 2, + "items_failed_count": 1, + "primary_tool": "cancel_products" + } + } +} +``` + +| Situation | `multi_item_status` | +|---|---| +| all items succeeded | `SUCCESS` | +| mixed success/failure | `PARTIAL_SUCCESS` | +| all items failed | `FAILED` | + +If a later step makes the outer wrapper `ok=false` while at least one primary item succeeded, the framework preserves audit information as `original_ok=false` and `secondary_error`, while keeping the executed item outcomes authoritative. + +## 6. Anti-patterns + +Do not implement a business loop in the agent: + +```python +for product in products: + await tool_router.call("cancel_product", {"product": product}) +``` + +Do not return only a global decision such as: + +```json +{"approved": false, "error": "one item failed"} +``` + +or a single aggregate `success=false` when the actual outcomes are mixed. These formats lose per-item terminal evidence. + +## 7. Read-only multi-item calls + +The same result contract can be used for bulk queries. Usually only the policy changes: + +```yaml +tool_policies: + query_orders: + operation_type: read_only + require_confirmation: false +``` + +Returning `results[]` with `success/ok` per item ensures one unavailable item does not hide successful queries. + +## 8. Idempotency and protocols + +For side-effecting operations: + +- use a request idempotency key and, when necessary, an item-level key; +- return protocol/operation id on the item itself; +- do not rely only on an aggregate text message; +- on retry, preserve completed items and execute only what domain policy allows. + +The runtime preserves evidence; downstream idempotency remains the responsibility of the domain MCP/workflow. + +## 9. Developer checklist + +- [ ] The tool accepts `array/list` for a multi-item use case. +- [ ] There is no business MCP loop inside the agent class. +- [ ] Canonicalization belongs to pre-validation/MCP, not hardcoded agent logic. +- [ ] Confirmation describes the effective item set. +- [ ] The primary tool returns `results[]` with per-item `success` or `ok`. +- [ ] Partial outcome is not collapsed into a single global failure flag. +- [ ] Workflow-backed tools use `output[tool_name].results` for primary terminal evidence. +- [ ] Tests cover all-success, partial, all-failure, and later auxiliary failure. +- [ ] Final response reports both successes and failures for `PARTIAL_SUCCESS`. + +## 10. Framework implementation references + +```text +libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py + - array/list coercion + +libs/agent_framework/src/agent_framework/runtime/agent_runtime.py + - pre-validation and resolved_arguments + - _primary_multi_item_outcomes() + - _normalize_multi_item_tool_result() + - multi-item LLM composition instruction + +tests/test_multi_item_result_normalization.py + - SUCCESS/PARTIAL_SUCCESS regressions and auxiliary-failure protection +``` + +## 11. Responsibility summary + +| Layer | Responsibility | +|---|---| +| Agent | select/declaratively use the tool; do not implement a multi-item engine | +| `tools.yaml` | declare `array/list` parameter and schema | +| `tool_policies.yaml` | confirmation and pre-validation | +| MCP pre-validator | resolve/canonicalize entities and arguments | +| MCP tool/workflow | execute the collection and return per-item outcomes | +| Framework runtime | state, confirmation, multi-item normalization, evidence preservation | +| LLM/presentation | verbalize evidence without hiding per-item success/failure | diff --git a/agent_framework_oci/docs/developer/en/04_mcp_integration_tools_and_policies.md b/agent_framework_oci/docs/developer/en/04_mcp_integration_tools_and_policies.md index 146418f5..d5d433e6 100644 --- a/agent_framework_oci/docs/developer/en/04_mcp_integration_tools_and_policies.md +++ b/agent_framework_oci/docs/developer/en/04_mcp_integration_tools_and_policies.md @@ -82,6 +82,31 @@ projeto_multi_agent_isolado/ ### Main components + + +### MCP multi-item: product, order, and resource lists + +When one intent must operate on several items, **do not create an MCP loop inside the agent**. The framework supports `array/list` parameters, pre-validation with `resolved_arguments`, set-level transaction confirmation, and automatic normalization of per-item `results[]` into `SUCCESS`, `PARTIAL_SUCCESS`, or `FAILED`. + +The complete contract, `tools.yaml` / `tool_policies.yaml` examples, MCP payloads, per-item output, workflow behavior, partial validation, and anti-patterns are documented in: + +- [MCP Multi-item — Developer Guide](../../MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md) + +Minimum structural result from the primary tool: + +```json +{ + "result": { + "results": [ + {"subject": "A", "success": true}, + {"subject": "B", "success": false, "reason": "not_found"} + ] + } +} +``` + +Every item must expose boolean `success` or `ok`. For workflow-backed tools, prefer `workflow.output[tool_name].results`. A later auxiliary failure must not erase terminal item outcomes. + ### Simplified HTTP contract used by the project ``` diff --git a/agent_framework_oci/docs/developer/en/INDEX_DEVELOPER_GUIDE.md b/agent_framework_oci/docs/developer/en/INDEX_DEVELOPER_GUIDE.md index 7dfff1e7..b803ac5c 100644 --- a/agent_framework_oci/docs/developer/en/INDEX_DEVELOPER_GUIDE.md +++ b/agent_framework_oci/docs/developer/en/INDEX_DEVELOPER_GUIDE.md @@ -27,6 +27,7 @@ If something is not working, use **Search by problem** below. | A tool does not appear or cannot be found | `tools.yaml`, MCP catalog, discovery | [MCP/Tools](docs/developer/en/04_mcp_integration_tools_and_policies.md) | | MCP Server does not appear in the catalog | registration, manifest/discovery, MCP Gateway | [MCP/Tools](docs/developer/en/04_mcp_integration_tools_and_policies.md) and [Gateways](docs/developer/en/05_agent_gateway_mcp_gateway_and_auth.md) | | Parameters sent to the tool are wrong | schema, mapping, BusinessContext, extractor | [MCP/Tools](docs/developer/en/04_mcp_integration_tools_and_policies.md) | +| I need to run one operation for multiple products/orders/items | array/list parameter, pre-validation, single confirmation, per-item outcome | [MCP Multi-item](../../MCP_MULTI_ITEM_DEVELOPER_GUIDE_en.md) and [MCP/Tools](./04_mcp_integration_tools_and_policies.md) | | A transactional operation executes without confirmation | tool policy, `require_confirmation` | [MCP/Tools](docs/developer/en/04_mcp_integration_tools_and_policies.md) | | A name search requires an overly exact match | parameter extraction/mapping and agent logic | [MCP/Tools](docs/developer/en/04_mcp_integration_tools_and_policies.md) | | I receive 401 between gateway/backend/MCP | Basic Auth, credentials per hop | [Gateways and Auth](docs/developer/en/05_agent_gateway_mcp_gateway_and_auth.md) | @@ -73,9 +74,9 @@ If something is not working, use **Search by problem** below. ### [04 — MCP, Tools, Policies, and Parameter Extraction](docs/developer/en/04_mcp_integration_tools_and_policies.md) -**What it is:** reference for tools, MCP Servers, mappings, policies, and parameter extraction. +**What it is:** reference for tools, MCP Servers, mappings, policies, parameter extraction, and multi-item calls. -**Use when:** tool integration/execution is incorrect or needs to be created. +**Use when:** tool integration/execution is incorrect, needs to be created, or must process item lists without parallel logic in the agent. ### [05 — Agent Gateway, MCP Gateway, and Authentication](docs/developer/en/05_agent_gateway_mcp_gateway_and_auth.md) diff --git a/agent_framework_oci/docs/developer/pt/04_mcp_integration_tools_and_policies.md b/agent_framework_oci/docs/developer/pt/04_mcp_integration_tools_and_policies.md index d9c1c522..d9942074 100644 --- a/agent_framework_oci/docs/developer/pt/04_mcp_integration_tools_and_policies.md +++ b/agent_framework_oci/docs/developer/pt/04_mcp_integration_tools_and_policies.md @@ -83,6 +83,31 @@ projeto_multi_agent_isolado/ ### Componentes principais + + +### MCP multi-item: listas de produtos, pedidos e outros recursos + +Quando uma única intenção precisa operar sobre vários itens, **não crie um loop MCP dentro do agente**. O framework suporta parâmetros `array/list`, pre-validation com `resolved_arguments`, confirmação transacional do conjunto e normalização de `results[]` por item em `SUCCESS`, `PARTIAL_SUCCESS` ou `FAILED`. + +O contrato completo, exemplos de `tools.yaml`, `tool_policies.yaml`, payload MCP, retorno por item, workflows, validação parcial e anti-patterns estão em: + +- [MCP Multi-item — Guia do Desenvolvedor](../../MCP_MULTI_ITEM_DEVELOPER_GUIDE.md) + +Regra estrutural mínima do retorno da tool primária: + +```json +{ + "result": { + "results": [ + {"subject": "A", "success": true}, + {"subject": "B", "success": false, "reason": "not_found"} + ] + } +} +``` + +Cada item deve expor `success` ou `ok` booleano. Para tool baseada em workflow, prefira `workflow.output[tool_name].results`. Uma falha auxiliar posterior não deve apagar resultados terminais já executados. + ### Contrato HTTP simplificado usado no projeto ``` diff --git a/agent_framework_oci/docs/developer/pt/INDEX_DEVELOPER_GUIDE.md b/agent_framework_oci/docs/developer/pt/INDEX_DEVELOPER_GUIDE.md index eda78895..67d0cfa8 100644 --- a/agent_framework_oci/docs/developer/pt/INDEX_DEVELOPER_GUIDE.md +++ b/agent_framework_oci/docs/developer/pt/INDEX_DEVELOPER_GUIDE.md @@ -28,6 +28,7 @@ Se algo não está funcionando, use **Buscar pelo problema** abaixo. | Uma tool não aparece ou não é encontrada | `tools.yaml`, catálogo MCP, discovery | [MCP/Tools](./04_mcp_integration_tools_and_policies.md) | | MCP Server não aparece no catálogo | registration, manifest/discovery, MCP Gateway | [MCP/Tools](./04_mcp_integration_tools_and_policies.md) e [Gateways](./05_agent_gateway_mcp_gateway_and_auth.md) | | Parâmetros enviados à tool estão errados | schema, mapping, BusinessContext, extractor | [MCP/Tools](./04_mcp_integration_tools_and_policies.md) | +| Preciso chamar a mesma operação para vários produtos/pedidos/itens | parâmetro array/list, pre-validation, confirmação única, resultado por item | [MCP Multi-item](../../MCP_MULTI_ITEM_DEVELOPER_GUIDE.md) e [MCP/Tools](./04_mcp_integration_tools_and_policies.md) | | Uma operação transacional executa sem confirmação | tool policy, `require_confirmation` | [MCP/Tools](./04_mcp_integration_tools_and_policies.md) | | Uma busca por nome exige correspondência exata demais | extração/mapeamento de parâmetros e lógica do agente | [MCP/Tools](./04_mcp_integration_tools_and_policies.md) | | Recebo 401 entre gateway/backend/MCP | Basic Auth, credenciais por hop | [Gateways e Auth](./05_agent_gateway_mcp_gateway_and_auth.md) | @@ -74,9 +75,9 @@ Se algo não está funcionando, use **Buscar pelo problema** abaixo. ### [04 — MCP, Tools, Policies e Extração de Parâmetros](./04_mcp_integration_tools_and_policies.md) -**O que é:** referência de tools, MCP Servers, mappings, policies e parameter extraction. +**O que é:** referência de tools, MCP Servers, mappings, policies, parameter extraction e chamadas multi-item. -**Use quando:** integração/execução de tool está incorreta ou precisa ser criada. +**Use quando:** integração/execução de tool está incorreta, precisa ser criada ou deve processar listas de itens sem lógica paralela no agente. ### [05 — Agent Gateway, MCP Gateway e Autenticação](./05_agent_gateway_mcp_gateway_and_auth.md) diff --git a/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/runtime/agent_runtime.py b/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/runtime/agent_runtime.py index dbae2498..2ec6be62 100644 --- a/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/runtime/agent_runtime.py +++ b/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/runtime/agent_runtime.py @@ -1351,6 +1351,101 @@ class AgentRuntimeMixin: # Compatibilidade com versões antigas do router. return None, arguments or {}, None + @staticmethod + def _primary_multi_item_outcomes(tool_name: str, result: dict[str, Any]) -> list[dict[str, Any]]: + """Return explicit per-item outcomes for the requested tool, when present. + + The contract is intentionally structural and domain-agnostic: the framework + only recognizes an array named ``results`` whose entries expose an explicit + boolean ``success``/``ok`` signal. For workflow-backed tools, preference is + given to ``workflow.output[tool_name].results`` so a later auxiliary/composite + step cannot overwrite the already executed primary operation. + """ + if not isinstance(result, dict): + return [] + + body = result.get("result") if isinstance(result.get("result"), dict) else result + candidates: list[Any] = [] + + if isinstance(body, dict): + output = body.get("output") + if isinstance(output, dict): + primary = output.get(tool_name) + if isinstance(primary, dict): + candidates.append(primary.get("results")) + candidates.append(body.get("results")) + + candidates.append(result.get("results")) + + for candidate in candidates: + if not isinstance(candidate, list) or len(candidate) < 2: + continue + normalized: list[dict[str, Any]] = [] + valid = True + for item in candidate: + if not isinstance(item, dict): + valid = False + break + signal = item.get("success") if isinstance(item.get("success"), bool) else item.get("ok") + if not isinstance(signal, bool): + valid = False + break + normalized.append(dict(item)) + if valid and normalized: + return normalized + return [] + + @classmethod + def _normalize_multi_item_tool_result(cls, tool_name: str, result: dict[str, Any]) -> dict[str, Any]: + """Preserve partial/full success of a multi-item primary operation. + + Some composite workflows execute the requested tool successfully for one or + more items and then fail in a secondary validation/post-processing step. A + wrapper-level ``ok=false`` must not erase those terminal item outcomes. + + This normalizer never invents business semantics. It activates only when + the requested tool itself exposes two or more explicit item outcomes with a + boolean success signal. + """ + if not isinstance(result, dict): + return result + outcomes = cls._primary_multi_item_outcomes(tool_name, result) + if not outcomes: + return result + + succeeded = sum(1 for item in outcomes if bool(item.get("success") if isinstance(item.get("success"), bool) else item.get("ok"))) + failed = len(outcomes) - succeeded + if succeeded and failed: + status = "PARTIAL_SUCCESS" + elif succeeded: + status = "SUCCESS" + else: + status = "FAILED" + + normalized = dict(result) + metadata = dict(normalized.get("metadata") or {}) + metadata["multi_item"] = { + "status": status, + "items_count": len(outcomes), + "items_succeeded_count": succeeded, + "items_failed_count": failed, + "primary_tool": tool_name, + } + normalized["metadata"] = metadata + normalized["multi_item_status"] = status + normalized["partial_success"] = status == "PARTIAL_SUCCESS" + + # The requested action is considered operationally successful whenever at + # least one explicitly identified item completed. Preserve the original + # wrapper status/error for audit instead of discarding it. + if succeeded > 0 and normalized.get("ok") is False: + normalized["original_ok"] = False + normalized["ok"] = True + if normalized.get("error"): + normalized["secondary_error"] = normalized.get("error") + + return normalized + async def _call_mcp_tool_uncached( self, tool_name: str, @@ -1384,6 +1479,7 @@ class AgentRuntimeMixin: ) result = res.model_dump(mode="json") if hasattr(res, "model_dump") else dict(res) if isinstance(result, dict): + result = self._normalize_multi_item_tool_result(tool_name, result) result.setdefault("cached", False) await self._emit_ic( "IC.MCP_TOOL_EXECUTED", @@ -3839,6 +3935,21 @@ class AgentRuntimeMixin: "Resultados MCP normalizados pelo framework:\n" + self._compact_llm_value(mcp_results, max_chars=18000) ) + multi_item_summaries = [] + for item in mcp_results: + metadata = item.get("metadata") if isinstance(item, dict) else None + summary = metadata.get("multi_item") if isinstance(metadata, dict) else None + if isinstance(summary, dict): + multi_item_summaries.append(summary) + if multi_item_summaries: + sections.append( + "Semântica operacional multi-item do framework:\n" + + self._compact_llm_value(multi_item_summaries, max_chars=4000) + + "\nOs resultados explícitos por item da operação primária são evidência terminal e " + "devem ser relatados individualmente. Um erro de etapa auxiliar/pós-processamento " + "não pode converter itens já concluídos com sucesso em falha, nem omiti-los. " + "Quando houver sucessos e falhas, descreva o resultado como parcial e informe ambos." + ) transaction_evidence = self.transaction_evidence_for_turn(state, mcp_results) if transaction_evidence: sections.append( diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc index 4beeadf8..c90b9cf5 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc index df240730..29dcb1a6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc index a526262e..49e7eeed 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc index 2aa5c9ba..cb07b29b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc index 6f06afb7..736d34bf 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc index 57af840d..b27cca73 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc index d28453d9..99dc601e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc index 09eb4d94..e6291469 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc index 65d1d490..d162b8c2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc index 1350a170..53839a5e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc index 50374fbb..d730909a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc index bb1b7d8e..2f832e92 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc index e2bfdc6c..1c8ddcb8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc index d7b6bafd..31fee362 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc index 1dfea145..d970a9cf 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc index a47ad326..2b7b5810 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc index 89af7e7d..f7fa4328 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc index b7c26689..a3604e64 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc index 999a0421..96c7bcec 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc index bb93988a..599a2f89 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc index 26bec0f6..3ac254ef 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc index dfc8266e..24e30c3c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc index 0f8134e4..d2b66476 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc index b7058f90..8e6f6ff8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc index c4eeee9d..7292b69c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc index 9ea9e415..b4d95169 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc index 1d39403a..7bb5d695 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc index e874174f..f71ef5ce 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc index 1c996b7a..75738974 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc index 37e51598..5529caf0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc index e3620c74..191cf79f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc index 1876f380..fe8c7412 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc index b7933581..c8b2c65c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc index daa4d787..b7440582 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc index b59b1a3f..410f3416 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc index dc2c8dde..3707422a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc index f1aaec9a..347747a8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc index 271e5d60..e7d68871 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/dlex_sanitizer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/dlex_sanitizer.cpython-313.pyc index d8a868cc..7c7d0c9c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/dlex_sanitizer.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/dlex_sanitizer.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc index 48666933..567e2fe4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc index efdc67db..0a7ca946 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc index d945f0b1..40bb9186 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc index 7c280a45..bc72ad3f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc index 9408e0b7..7149a33f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc index c43b8e56..f7d4da13 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc index 3484fe0b..442aaffb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc index 69d84557..b78cd0b9 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc index 3c8b0a05..eb54420a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc index 365d13c0..fa19d804 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc index 43a26825..706f3cf5 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc index 658adb8b..889e7169 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc index 8c22899e..03658432 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc index d13ac46c..2cdab806 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc index 52950889..b289d89d 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc index 38f1aea0..f65196d3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc index 9b2f632d..8517b365 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc index 78b3a8c5..87cf9fbc 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc index bb720a1c..19e28320 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index 81bdd670..b4566fed 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc index 6bc38dea..90abefbc 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc index e80e85dc..4df9c408 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc index b2fb4d10..34afa788 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc index d4050835..097df85d 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc index 2d6adf34..1688d5d6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc index 2c3791e9..eef8446f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc index 3b9b522d..d13f10b9 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc index 702a1c14..e9494bd2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc index e1602bd0..a25fe0a2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc index bf3d5635..c0b97c48 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc index d9615b9f..44757b12 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc index 4b93a350..f3df8b2b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc index 2a99c447..981a1b21 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc index 4ac41e0a..761308a9 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc index fede3088..08f827f4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc index 8e47205e..419f2174 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc index 9feeeb4e..e5d55be2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc index 3947485c..7586e9bc 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc index f46198f4..3a37461e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc index 86d3ca74..7c2839ac 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc index d365db44..c5be330f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc index 57ba0f7a..1f1da754 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc index f48f21d4..398ae9a4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc index 738af6c8..8e5fdab2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc index 1efddfba..9c226d6c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc index 13ed30bb..12d8e3d2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc index 43e7ad7a..d67bce9c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc index c2ca0e75..7f3406d0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc index 257c4153..d99815c0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc index 03c55fa7..99332fb1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc index 8f8ba56a..1807483c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc index 04d62397..6a632a9c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc index bf49c597..22069715 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc index 08fc703b..fce729e1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index be306050..2ec04b11 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc index 2ac1c475..b7527e60 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc index cf04890a..9a409f13 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc index 090fb2e2..c3390974 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc index ff5a0c2a..de1c2322 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc index 3cb62fd0..58f0f6ca 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc index e760abd2..cfc82c03 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc index f80dc48b..ca24bcc1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc index 1a7095ac..698ce2e2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc index 1fe1d943..864235c0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc index 52218b3d..03e8e227 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc index c48d691b..de23ebc1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc index 83879cb7..6cf734b3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc index 0fcf8a97..d6725a6b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc index 20a34108..24583c52 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc index 33367480..f474b97d 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc index 679ede05..1f1e78c7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc index 38925995..51cba2e5 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc index 6a7f80bc..a16a8d55 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc index d94ef3d5..41a3c38c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc index 9f8133b7..9236ac0c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc index 3037dbf9..2a984f32 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc index 439d80f7..af4743f7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc index b8449b8f..b7f02d74 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc index ccafa0cb..2b62fc7f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc index 2562f26c..6dcea183 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc index 23837c6f..cc83f917 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc index d3d2aada..385f333b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc index f441e5e7..09f45904 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc index bf56e96e..230366f0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc index 670030b6..4a3d2814 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc index 1b693ec7..cf881877 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc index 88fdd0d5..c11c2cbe 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc index 54c02645..f8fa5098 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc index 6d0d5f59..941aed10 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc index 7aaf3326..f4e9539a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc index e13ae831..96d1455b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc index 6a7b77e2..b9496669 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc index d9233aff..758ed352 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc index 648d7ef4..9a0b6d0b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc index 9b8ac37b..d70b0139 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc index ef4d76fe..fe6c03bb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc index 209e5189..fe43eb8b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc index 2518acb9..72ec0316 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc index 374c66c0..75197bad 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc index 73fd59ea..1c31529e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc index 222e5a11..983600bb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc index d3887592..412dea3c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc index 5fea2f23..b32886e3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc index da54d260..e5661200 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc index 47ffce89..ab3f0dea 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc index 7849c05a..1520a9ee 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc index b6c3eb30..0a3c7f63 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc index 83b55a51..feb23515 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc index 1817712b..775e6dc7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc index 57c3b081..d629751d 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc index bdfb5969..5d5cb937 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc index 72b82210..56db0687 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc index 29b006dc..dfd1b6ac 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc index 2903d0c8..eb077b66 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc index 11ca557e..641c1b4e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc index c97830a4..0ae4aa5a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc index 96c6acb1..803e56ff 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc index 164b46f7..b0b4917a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc index ab56bdb0..62180be3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc index f8c401b7..7480b74c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc index c6302b5f..ef67a44b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc index 4e496180..a25f7332 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/pending_topics.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/pending_topics.cpython-313.pyc index 4054cb73..09c21775 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/pending_topics.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/pending_topics.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc index ac1069dc..a361f806 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc index 61dadcc3..c23d6d16 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc index 75b492e0..533e9ec4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py index dbae2498..2ec6be62 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py @@ -1351,6 +1351,101 @@ class AgentRuntimeMixin: # Compatibilidade com versões antigas do router. return None, arguments or {}, None + @staticmethod + def _primary_multi_item_outcomes(tool_name: str, result: dict[str, Any]) -> list[dict[str, Any]]: + """Return explicit per-item outcomes for the requested tool, when present. + + The contract is intentionally structural and domain-agnostic: the framework + only recognizes an array named ``results`` whose entries expose an explicit + boolean ``success``/``ok`` signal. For workflow-backed tools, preference is + given to ``workflow.output[tool_name].results`` so a later auxiliary/composite + step cannot overwrite the already executed primary operation. + """ + if not isinstance(result, dict): + return [] + + body = result.get("result") if isinstance(result.get("result"), dict) else result + candidates: list[Any] = [] + + if isinstance(body, dict): + output = body.get("output") + if isinstance(output, dict): + primary = output.get(tool_name) + if isinstance(primary, dict): + candidates.append(primary.get("results")) + candidates.append(body.get("results")) + + candidates.append(result.get("results")) + + for candidate in candidates: + if not isinstance(candidate, list) or len(candidate) < 2: + continue + normalized: list[dict[str, Any]] = [] + valid = True + for item in candidate: + if not isinstance(item, dict): + valid = False + break + signal = item.get("success") if isinstance(item.get("success"), bool) else item.get("ok") + if not isinstance(signal, bool): + valid = False + break + normalized.append(dict(item)) + if valid and normalized: + return normalized + return [] + + @classmethod + def _normalize_multi_item_tool_result(cls, tool_name: str, result: dict[str, Any]) -> dict[str, Any]: + """Preserve partial/full success of a multi-item primary operation. + + Some composite workflows execute the requested tool successfully for one or + more items and then fail in a secondary validation/post-processing step. A + wrapper-level ``ok=false`` must not erase those terminal item outcomes. + + This normalizer never invents business semantics. It activates only when + the requested tool itself exposes two or more explicit item outcomes with a + boolean success signal. + """ + if not isinstance(result, dict): + return result + outcomes = cls._primary_multi_item_outcomes(tool_name, result) + if not outcomes: + return result + + succeeded = sum(1 for item in outcomes if bool(item.get("success") if isinstance(item.get("success"), bool) else item.get("ok"))) + failed = len(outcomes) - succeeded + if succeeded and failed: + status = "PARTIAL_SUCCESS" + elif succeeded: + status = "SUCCESS" + else: + status = "FAILED" + + normalized = dict(result) + metadata = dict(normalized.get("metadata") or {}) + metadata["multi_item"] = { + "status": status, + "items_count": len(outcomes), + "items_succeeded_count": succeeded, + "items_failed_count": failed, + "primary_tool": tool_name, + } + normalized["metadata"] = metadata + normalized["multi_item_status"] = status + normalized["partial_success"] = status == "PARTIAL_SUCCESS" + + # The requested action is considered operationally successful whenever at + # least one explicitly identified item completed. Preserve the original + # wrapper status/error for audit instead of discarding it. + if succeeded > 0 and normalized.get("ok") is False: + normalized["original_ok"] = False + normalized["ok"] = True + if normalized.get("error"): + normalized["secondary_error"] = normalized.get("error") + + return normalized + async def _call_mcp_tool_uncached( self, tool_name: str, @@ -1384,6 +1479,7 @@ class AgentRuntimeMixin: ) result = res.model_dump(mode="json") if hasattr(res, "model_dump") else dict(res) if isinstance(result, dict): + result = self._normalize_multi_item_tool_result(tool_name, result) result.setdefault("cached", False) await self._emit_ic( "IC.MCP_TOOL_EXECUTED", @@ -3839,6 +3935,21 @@ class AgentRuntimeMixin: "Resultados MCP normalizados pelo framework:\n" + self._compact_llm_value(mcp_results, max_chars=18000) ) + multi_item_summaries = [] + for item in mcp_results: + metadata = item.get("metadata") if isinstance(item, dict) else None + summary = metadata.get("multi_item") if isinstance(metadata, dict) else None + if isinstance(summary, dict): + multi_item_summaries.append(summary) + if multi_item_summaries: + sections.append( + "Semântica operacional multi-item do framework:\n" + + self._compact_llm_value(multi_item_summaries, max_chars=4000) + + "\nOs resultados explícitos por item da operação primária são evidência terminal e " + "devem ser relatados individualmente. Um erro de etapa auxiliar/pós-processamento " + "não pode converter itens já concluídos com sucesso em falha, nem omiti-los. " + "Quando houver sucessos e falhas, descreva o resultado como parcial e informe ambos." + ) transaction_evidence = self.transaction_evidence_for_turn(state, mcp_results) if transaction_evidence: sections.append( diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc index 4758e940..5ac50c81 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc index 61119b56..11389d3a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc index 73d0402c..486ab59d 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc index 5877fa05..35dd1f3e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc index e036addd..9ebb82b4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc index c75cf677..c8050ff4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc index c3276735..f61ef43e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc index ab8b87d3..57fca6e8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc index 0dbba318..145eccfa 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc index af17ba4b..6003c0c1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc index efb677e8..c2208066 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc index d68fa005..a3ed0b06 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc differ diff --git a/agent_framework_oci/specs/SPEC-010-Agent-Development.md b/agent_framework_oci/specs/SPEC-010-Agent-Development.md index 5b46f7a9..65b37c9e 100644 --- a/agent_framework_oci/specs/SPEC-010-Agent-Development.md +++ b/agent_framework_oci/specs/SPEC-010-Agent-Development.md @@ -230,6 +230,23 @@ Durante uma transação ativa, parâmetros já coletados são preservados e novo Antes de publicar um novo template/host, execute os cenários multi-turno descritos no [`Transaction State Developer Guide`](../docs/TRANSACTION_STATE_DEVELOPER_GUIDE.md). +## Contrato MCP Multi-item + +Para uma intenção que opere sobre múltiplos itens homogêneos, o agente **não deve implementar fan-out/loop de chamadas MCP por conta própria**. Deve reutilizar o runtime e declarar a coleção no schema da tool (`type: array` ou `type: list`). + +Regras: + +1. canonicalização de itens pertence ao MCP/pre-validation e pode usar `transaction_decision.resolved_arguments`; +2. confirmação transacional deve representar o conjunto efetivo de itens; +3. a tool primária deve retornar `results[]` com dois ou mais itens contendo `success` ou `ok` booleano por item; +4. para workflow-backed tools, a fonte preferencial é `workflow.output[tool_name].results`; +5. o runtime normaliza o agregado para `SUCCESS`, `PARTIAL_SUCCESS` ou `FAILED`; +6. falha em etapa auxiliar posterior não pode apagar evidência terminal de itens concluídos; +7. um `eligible=false` global em pre-validation encerra toda a transação; para processamento parcial, mantenha `eligible=true` quando houver ao menos um item acionável e deixe a tool primária materializar o resultado por item. + +Referência de implementação: [`MCP Multi-item — Guia do Desenvolvedor`](../docs/MCP_MULTI_ITEM_DEVELOPER_GUIDE.md). + + ## Testes | Teste | Escopo | @@ -292,6 +309,7 @@ Antes de publicar um novo template/host, execute os cenários multi-turno descri - [ ] Configuração ocorre por YAML e `.env`. - [ ] Agente usa BusinessContext. - [ ] Agente acessa MCP por router/gateway. +- [ ] Casos multi-item usam array/list + resultado por item, sem loop MCP de negócio dentro do agente. - [ ] Agente não conhece payload bruto de canal. - [ ] Guardrails e judges são configurados. - [ ] Dataset de eval existe. diff --git a/agent_framework_oci/templates/agent_template_backend/.env b/agent_framework_oci/templates/agent_template_backend/.env new file mode 100644 index 00000000..2a4774ef --- /dev/null +++ b/agent_framework_oci/templates/agent_template_backend/.env @@ -0,0 +1,250 @@ +############################################################################### +# AI AGENT PLATFORM - CONFIGURAÇÃO ÚNICA +# Este arquivo é lido por Pydantic Settings no framework e no backend template. +############################################################################### + +APP_NAME=ai-agent-template +APP_ENV=local +LOG_LEVEL=INFO +API_HOST=0.0.0.0 +API_PORT=8000 +CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173 + +############################################################################### +# LLM - OCI Generative AI como provider principal +############################################################################### +# Opções: mock, oci_openai, oci_sdk, openai_compatible +LLM_PROVIDER=oci_sdk +LLM_TEMPERATURE=0.2 +LLM_MAX_TOKENS=2048 +LLM_TIMEOUT_SECONDS=120 + +# OCI OpenAI-compatible endpoint +OCI_GENAI_BASE_URL=https://inference.generativeai.us-chicago-1.oci.oraclecloud.com +OCI_GENAI_MODEL=openai.gpt-4.1 +OCI_GENAI_API_KEY=sk-ph3FgX6iP3fxAQCXb9IpPIDTadkeeYAWntUWhzcWysIM6zsS +OCI_GENAI_PROJECT_OCID= + +#OCI_GENAI_BASE_URL=https://inference.generativeai.eu-frankfurt-1.oci.oraclecloud.com/openai/v1 +#OCI_GENAI_MODEL=ocid1.generativeaiendpoint.oc1.eu-frankfurt-1.amaaaaaad6nji3aa5fmicyft7qci6snu5idhwoomviehnsv4lrostzbmenkq +#OCI_GENAI_API_KEY=sk-TB0OzfrhPLXbQTqZ4aKlrLpcgjHAcn11O1o8C4I4aPvWF0Vx +#OCI_GENAI_PROJECT_OCID= + + +# OCI_AUTH_MODE=config_file|instance_principal|resource_principal +OCI_AUTH_MODE=config_file +# OCI SDK / signer / profiles +OCI_CONFIG_FILE=~/.oci/config +OCI_PROFILE=LATINOAMERICA-Chicago +OCI_COMPARTMENT_ID=ocid1.compartment.oc1..aaaaaaaaexpiw4a7dio64mkfv2t273s2hgdl6mgfvvyv7tycalnjlvpvfl3q +OCI_REGION=us-chicago-1 + +############################################################################### +# Persistência +############################################################################### +# Opções: memory, autonomous, mongodb +SESSION_REPOSITORY_PROVIDER=autonomous +MEMORY_REPOSITORY_PROVIDER=autonomous +CHECKPOINT_REPOSITORY_PROVIDER=autonomous + +# Autonomous Database +ADB_USER=admin +ADB_PASSWORD=Moniquinha19721972 +ADB_DSN=oradb23ai_high +ADB_WALLET_LOCATION=/mnt/d/Dropbox/ORACLE/LatinoAmerica/Wallet_ORADB23ai +ADB_WALLET_PASSWORD=Moniquinha1972 +ADB_TABLE_PREFIX=AGENTFW + +# MongoDB - também pode representar Autonomous usando API compatível com Mongo, se habilitada no ambiente +MONGODB_URI=mongodb://mongo:mongopassword@localhost:27017 +MONGODB_DATABASE=agent_platform + +# Redis +REDIS_URL=redis://localhost:6379/0 +ENABLE_REDIS_CACHE=false + +############################################################################### +# RAG / Vector / Graph +############################################################################### +VECTOR_STORE_PROVIDER=autonomous +GRAPH_STORE_PROVIDER=autonomous +RAG_TOP_K=5 +EMBEDDING_PROVIDER=oci +OCI_EMBEDDING_MODEL=cohere.embed-multilingual-v3.0 +RAG_FILE_GLOBS=*.md,*.txt,*.yaml,*.yml,*.json + +############################################################################### +# Observabilidade +############################################################################### +ENABLE_LANGFUSE=true + # Opcional: verbose, compact +LANGFUSE_TRACE_MODE=compact +# Nome customizado do trace pai, ex.: backoffice.checklist.workflow ou backoffice.emulador.workflow +LANGFUSE_COMPACT_VISIBLE_EVENT_PREFIXES=AGA.,NOC., IC. +LANGFUSE_COMPACT_SUPPRESSED_PREFIXES=llm.chat_completion +LANGFUSE_IGNORE_HEALTHCHECKS=true +LANGFUSE_IGNORED_PATHS=/health,/ready,/metrics +LANGFUSE_PUBLIC_KEY=pk-lf-4a1e3921-5158-4fd3-a16d-7a77549fb312 +LANGFUSE_SECRET_KEY=sk-lf-efc6fd59-c5ec-4858-b6ec-4aa129734915 +LANGFUSE_HOST=http://localhost:3005 +ENABLE_OTEL=false +OTEL_EXPORTER_OTLP_ENDPOINT= +OTEL_SERVICE_NAME=ai-agent-template +ENABLE_LANGFUSE_OPENAI_AUTO_INSTRUMENTATION=true +ENABLE_LANGFUSE_ANALYTICS_PUBLISHER=false + +############################################################################### +# Analytics / Observer corporativo +############################################################################### +# Quando true, AgentObserver publica eventos IC.*, NOC.* e GRL.* nos providers abaixo. +ENABLE_ANALYTICS=true +# Providers aceitos: oci_streaming,pubsub,noop +ANALYTICS_PROVIDERS=pubsub +# Compatibilidade FIRST/TIM: pode informar AGENT_PUBSUB_TOPIC diretamente. +AGENT_PUBSUB_TOPIC=teste_pubsub +PUBSUB_TOPIC_PATH=projects/project-7f829b68-bf43-442c-ad3/topics/teste_pubsub +PROJECT_ID=project-7f829b68-bf43-442c-ad3 +GCP_PUBSUB_TOPIC_PATH=projects/project-7f829b68-bf43-442c-ad3/topics/teste_pubsub +GCP_PROJECT_ID=project-7f829b68-bf43-442c-ad3 +GCP_PUBSUB_TOPIC=teste_pubsub +GCP_PUBSUB_TIMEOUT_SECONDS=30 +# Credencial GCP segue padrão Google: +GOOGLE_APPLICATION_CREDENTIALS=/mnt/d/Dropbox/ORACLE/TIM/FY27/Testes/sa-hoshikawa.json + +PUBSUB_SEQUENCE_ENABLED=true +PUBSUB_SEQUENCE_PROVIDER=mongodb + +#PUBSUB_SEQUENCE_MONGODB_URI=mongodb://mongo:mongopassword@localhost:27017 +#PUBSUB_SEQUENCE_MONGODB_DATABASE=agent_platform + +PUBSUB_SEQUENCE_MONGODB_URI=mongodb://ADMIN:Moniquinha1972@srlrz1eg.adb.sa-saopaulo-1.oraclecloudapps.com:37017/ADMIN?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true +PUBSUB_SEQUENCE_MONGODB_DATABASE=ADMIN + +PUBSUB_SEQUENCE_MONGODB_COLLECTION=observer_event_counters + +PUBSUB_SEQUENCE_TTL_SECONDS=86400 +PUBSUB_SEQUENCE_KEY_PREFIX=observer:sequence + +PUBSUB_SEQUENCE_MEMORY_FALLBACK=false +SIMULATE_AGA_MISSING_TRANSACTION_ID=true +############################################################################### +# OCI Streaming +############################################################################### +ENABLE_OCI_STREAMING=false +OCI_STREAM_ENDPOINT= +OCI_STREAM_OCID= +OCI_STREAM_PARTITION_KEY=agent-events + +############################################################################### +# Guardrails, Judges, Supervisor +############################################################################### +ENABLE_INPUT_GUARDRAILS=true +ENABLE_OUTPUT_GUARDRAILS=true +ENABLE_JUDGES=true +ENABLE_SUPERVISOR=true +ENABLE_OUTPUT_SUPERVISOR=true +ENABLE_PARALLEL_GUARDRAILS=true +GUARDRAILS_FAIL_FAST=true +OUTPUT_SUPERVISOR_MAX_RETRIES=3 +GUARDRAILS_CONFIG_PATH=./config/guardrails.yaml +JUDGES_CONFIG_PATH=./config/judges.yaml +PROMPT_POLICY_PATH=./config/prompt_policy.yaml + +############################################################################### +# Gateway de canais +############################################################################### +DEFAULT_CHANNEL=web +# embedded = backend may parse simple/native channel payloads. +# external = backend only accepts GatewayRequest normalized by an external Channel Gateway. +FRAMEWORK_CHANNEL_INPUT_MODE=embedded +ENABLE_VOICE_ADAPTER=true +ENABLE_WHATSAPP_ADAPTER=true +ENABLE_TEXT_ADAPTER=true + +################################################# +# ENTERPRISE ROUTING +################################################# +# Arquivo YAML com intents, keywords, políticas de estado e fallback. +ROUTING_CONFIG_PATH=./config/routing.yaml +# true = usa LLM para classificar quando keywords/estado não resolverem. +# Em produção, costuma ser útil; em desenvolvimento, false evita custo e latência. +ENABLE_LLM_ROUTER=true + +# Semantic route stickiness (optional). +# Uses a lightweight LLM profile to decide only CONTINUE vs ROUTE. +# There are no regexes or deterministic language rules. +ENABLE_ROUTE_STICKINESS=true +ROUTE_STICKINESS_LLM_PROFILE=route_continuity +ROUTE_STICKINESS_CONFIDENCE_THRESHOLD=0.90 +ROUTE_STICKINESS_HISTORY_TURNS=2 +ROUTE_STICKINESS_MAX_TOKENS=80 +HUMAN_HANDOFF_MESSAGE=Vou encaminhar seu atendimento para uma pessoa. +END_SESSION_MESSAGE=Atendimento encerrado. Obrigado pelo contato. + +############################################################################### +# MCP / Tools +############################################################################### +ENABLE_MCP_TOOLS=true +MCP_SERVERS_CONFIG_PATH=./config/mcp_servers.yaml +TOOLS_CONFIG_PATH=./config/tools.yaml +MCP_TOOL_TIMEOUT_SECONDS=30 + +# router = EnterpriseRouter seleciona um agente; supervisor = pode acionar múltiplos agentes +ROUTING_MODE=router + +# Usage/cost accounting +USAGE_REPOSITORY_PROVIDER=autonomous +IDENTITY_CONFIG_PATH=./config/identity.yaml +MCP_PARAMETER_MAPPING_PATH=./config/mcp_parameter_mapping.yaml + +# ----------------------------------------------------------------------------- +# ConversationSummaryMemory / compressão de contexto conversacional +# ----------------------------------------------------------------------------- +ENABLE_CONVERSATION_SUMMARY_MEMORY=true +MEMORY_CONTEXT_STRATEGY=summary +MEMORY_HISTORY_LIMIT=80 +MEMORY_RECENT_MESSAGES_LIMIT=8 +MEMORY_SUMMARY_TRIGGER_MESSAGES=20 +MEMORY_MAX_SUMMARY_CHARS=6000 +MEMORY_SUMMARY_USE_LLM=true +MEMORY_INJECT_RECENT_MESSAGES=true +MEMORY_INJECT_SUMMARY=true + +############################################################################### +# LONG-TERM MEMORY +############################################################################### +ENABLE_LONG_TERM_MEMORY=true +LONG_TERM_MEMORY_PROVIDER=sqlite +LONG_TERM_MEMORY_SQLITE_PATH=./data/agent_framework.db +LONG_TERM_MEMORY_TABLE=agentfw_long_term_memory +# For Autonomous/Oracle, defaults to ${ADB_TABLE_PREFIX}_LONG_TERM_MEMORY +# LONG_TERM_MEMORY_ORACLE_TABLE=AGENTFW_LONG_TERM_MEMORY +LONG_TERM_MEMORY_MAX_CONTEXT_ITEMS=20 +LONG_TERM_MEMORY_MIN_CONFIDENCE=0.70 +LONG_TERM_MEMORY_AUTO_EXTRACT=true +LONG_TERM_MEMORY_INJECT_CONTEXT=true + +############################################################################### +# RAG provider selection (mutually exclusive at runtime) +############################################################################### +# standard = RAG original do agent_framework_oci (default, backward compatible) +# kbdb = KBDB enterprise via PKG_KB_SERVING.SEARCH_KNOWLEDGE_BASE +RAG_PROVIDER=kbdb + +# Somente usados quando RAG_PROVIDER=kbdb. Se vazios, credenciais caem para ADB_*. +KBDB_DB_USER=KB_USER +KBDB_DB_PASSWORD=SuperStr0ngPa##w0rd +KBDB_DB_DSN=kbdb_public_high +KBDB_DB_WALLET_LOCATION=/mnt/d/Dropbox/ORACLE/TIM/FY27/kb/Wallet_kbdb +KBDB_DB_WALLET_PASSWORD=SuperStr0ngPa##w0rd +KBDB_SEARCH_TYPE=hybrid +KBDB_NODE_EXPANSION=true +KBDB_NODE_MAX_RELATED=8 +KBDB_GRAPH_CROSS_REF=false +KBDB_MAX_CROSS_REF_HOPS=1 +KBDB_DOCUMENT_TYPE=customer_safe +KBDB_METADATA_JSON= +KBDB_MIN_SCORE=0.5 +KBDB_IDENTIFY_DOCUMENT=true +KBDB_STORE_QUERY=true +KBDB_IDENTIFY_TOP_N=3 \ No newline at end of file diff --git a/agent_framework_oci/templates/agent_template_backend/README.md b/agent_framework_oci/templates/agent_template_backend/README.md index 8483e89a..055597a0 100644 --- a/agent_framework_oci/templates/agent_template_backend/README.md +++ b/agent_framework_oci/templates/agent_template_backend/README.md @@ -172,6 +172,15 @@ config/agents//judges.yaml --- + +## MCP multi-item — não implemente loops no agente + +Se uma mesma solicitação envolve vários produtos, pedidos ou outros itens, use o mecanismo multi-item do framework. Declare o parâmetro como `array/list`, use pre-validation para canonicalização quando necessário e faça a tool MCP primária devolver `results[]` com `success`/`ok` por item. O runtime preserva sucesso parcial e produz `SUCCESS`, `PARTIAL_SUCCESS` ou `FAILED`. + +Guia copiável e completo neste template: [`docs/MCP_MULTI_ITEM.md`](docs/MCP_MULTI_ITEM.md). + +> Anti-pattern: executar `tool_router.call(...)` em um `for` dentro do agente para simular uma operação em lote. Se o backend só expõe API unitária, encapsule o fan-out no MCP Server/workflow. + ## 3. Pré-requisitos ### 3.1. Requisitos locais diff --git a/agent_framework_oci/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc index f6a2b79f..a252d88c 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc index 08f8cb6c..d63c5001 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc index 31cdc3a5..4bca3564 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc index 4e27b205..527b98ea 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc index 803273eb..725972e7 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc index 104fb209..b29b8b8b 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc index eda48f56..e8484aad 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc index df7bf154..5ed22f0b 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc index 7fbc59f0..f9a485ff 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc index 9144c5b2..f37b96e4 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc index 9495cf23..642f8b71 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc index 9191fadd..a5565f1e 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 32e74b95..c08d32a5 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/agent_framework_oci/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc index 3515b5c1..e984ebe3 100644 Binary files a/agent_framework_oci/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc and b/agent_framework_oci/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc differ diff --git a/agent_framework_oci/templates/agent_template_backend/data/agent_framework.db b/agent_framework_oci/templates/agent_template_backend/data/agent_framework.db new file mode 100644 index 00000000..f767effa Binary files /dev/null and b/agent_framework_oci/templates/agent_template_backend/data/agent_framework.db differ diff --git a/agent_framework_oci/templates/agent_template_backend/docs/MCP_MULTI_ITEM.md b/agent_framework_oci/templates/agent_template_backend/docs/MCP_MULTI_ITEM.md new file mode 100644 index 00000000..6d5244f3 --- /dev/null +++ b/agent_framework_oci/templates/agent_template_backend/docs/MCP_MULTI_ITEM.md @@ -0,0 +1,363 @@ +# MCP Multi-item — Guia do Desenvolvedor + +## Objetivo + +Use este guia quando uma única intenção do usuário precisa operar sobre **mais de um item do mesmo tipo** em uma chamada MCP, por exemplo: + +- cancelar vários VAS/produtos; +- devolver ou consultar vários pedidos; +- alterar vários ativos; +- processar uma lista de faturas, linhas, contratos ou recursos. + +O framework já possui contratos genéricos para **coleta de listas**, **pré-validação/canonicalização**, **confirmação transacional**, **execução MCP** e **normalização do resultado por item**. O desenvolvedor não deve criar um segundo motor de multi-item dentro do agente. + +## Regra principal + +**Não faça loop de negócio no agente.** O agente declara a tool e seus parâmetros; o runtime mantém estado, confirmação e evidência. A operação em lote deve ser exposta como uma tool MCP que aceite uma coleção, ou como uma tool transacional apoiada por um workflow/MCP que processe a coleção. + +Fluxo recomendado: + +```text +Usuário cita N itens + -> Router/Agent seleciona a tool + -> Runtime coleta/reconcilia parâmetro array/list + -> (opcional) pre-validation canonicaliza itens + -> Runtime pede UMA confirmação coerente para o conjunto + -> MCP recebe a coleção + -> MCP/workflow processa item a item + -> MCP devolve results[] com success/ok por item + -> Framework normaliza SUCCESS / PARTIAL_SUCCESS / FAILED + -> Composição final relata sucessos e falhas individualmente +``` + +## 1. Declarar um parâmetro de lista em `tools.yaml` + +O reconciliador transacional do framework aceita `type: array` ou `type: list`. + +```yaml +tools: + cancelar_produtos: + description: Cancela um ou mais produtos do cliente. + mcp_server: contas + enabled: true + tool_type: action + confirmation_required: true + requires: [items] + args_schema: + items: + type: array + label: os produtos + description: Lista de produtos que o cliente deseja cancelar. + user_prompt: Informe quais produtos deseja cancelar. +``` + +O runtime pode reconciliar uma frase como: + +```text +quero cancelar TIM Fashion, Aya Audiobooks e Neymar Jr +``` + +para um argumento lógico semelhante a: + +```json +{ + "items": ["TIM Fashion", "Aya Audiobooks", "Neymar Jr"] +} +``` + +A semântica de domínio e a validação dos nomes continuam pertencendo ao MCP/pre-validator, não ao core. + +## 2. Quando usar pre-validation + +Use `tool_policies.yaml` quando a lista precisa ser resolvida/canonicalizada antes da confirmação. + +```yaml +tool_policies: + cancelar_produtos: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validar_produtos_cancelamento + fail_open: false +``` + +O pre-validator pode retornar `eligible: true` e substituir argumentos por valores canônicos em `transaction_decision.resolved_arguments`: + +```json +{ + "eligible": true, + "transaction_decision": { + "resolved_arguments": { + "items": [ + {"name": "TIM Fashion Mensal", "id": "1001"}, + {"name": "Aya Audiobooks Premium", "id": "1002"}, + {"name": "Neymar Jr", "id": "1003"} + ] + }, + "target_tool": "cancelar_produtos", + "confirmation_message": "Você confirma o cancelamento de TIM Fashion Mensal, Aya Audiobooks Premium e Neymar Jr?" + } +} +``` + +### Importante para validação parcial + +O contrato `eligible` da pre-validation é global. Portanto, **não retorne `eligible: false` apenas porque um item da lista falhou**, caso os demais ainda possam ser processados. Isso encerraria toda a transação. + +Para permitir resultado parcial, a estratégia recomendada é: + +1. retornar `eligible: true` quando existe pelo menos um item acionável; +2. preservar/canonicalizar a coleção em `resolved_arguments`; +3. deixar a tool primária devolver o resultado terminal de **cada item** em `results[]`. + +Se nenhum item puder ser processado, então `eligible: false` é apropriado. + +## 3. Contrato de entrada do MCP + +Prefira uma única chamada MCP com uma coleção explícita: + +```json +{ + "tool_name": "cancelar_produtos", + "arguments": { + "customer_id": "123", + "items": [ + {"name": "TIM Fashion Mensal", "id": "1001"}, + {"name": "Aya Audiobooks Premium", "id": "1002"}, + {"name": "Neymar Jr", "id": "1003"} + ] + } +} +``` + +O framework **não deve ser usado como um loop improvisado que chama N vezes uma tool escalar a partir do agente**. Se o backend só possui API unitária, o fan-out pode ficar encapsulado no MCP Server ou em um workflow de domínio, mantendo uma única tool lógica para o agente. + +## 4. Contrato obrigatório de resultado por item + +Para o framework reconhecer multi-item automaticamente, a **tool primária solicitada** deve expor uma lista `results` com **dois ou mais itens**, e cada item deve possuir um booleano `success` ou `ok`. + +Exemplo: + +```json +{ + "ok": true, + "result": { + "results": [ + {"id": "1001", "subject": "TIM Fashion Mensal", "success": true}, + {"id": "1002", "subject": "Aya Audiobooks Premium", "success": false, "reason": "not_found"}, + {"id": "1003", "subject": "Neymar Jr", "success": true} + ] + } +} +``` + +Campos como `id`, `subject`, `name`, `reason`, `error`, `protocol` e outros são de domínio e opcionais. O sinal estrutural exigido pelo normalizador é `success: true|false` ou `ok: true|false` por item. + +### Workflow-backed tool + +Se a tool é executada por workflow, o caminho preferencial e autoritativo é: + +```text +workflow.output[tool_name].results +``` + +Exemplo: + +```json +{ + "ok": false, + "result": { + "status": "COMPLETED", + "output": { + "cancelar_produtos": { + "results": [ + {"subject": "A", "success": true}, + {"subject": "B", "success": false, "reason": "not_found"}, + {"subject": "C", "success": true} + ] + }, + "etapa_auxiliar": { + "success": false, + "error": "falha em pós-processamento" + } + } + }, + "error": "falha em pós-processamento" +} +``` + +O runtime preserva o resultado da operação primária e não permite que uma falha auxiliar apague itens já concluídos. + +## 5. O que o framework produz automaticamente + +Com `results[]` válido, o runtime adiciona: + +```json +{ + "multi_item_status": "PARTIAL_SUCCESS", + "partial_success": true, + "metadata": { + "multi_item": { + "status": "PARTIAL_SUCCESS", + "items_count": 3, + "items_succeeded_count": 2, + "items_failed_count": 1, + "primary_tool": "cancelar_produtos" + } + } +} +``` + +Estados possíveis: + +| Situação | `multi_item_status` | +|---|---| +| todos os itens concluíram | `SUCCESS` | +| parte concluiu e parte falhou | `PARTIAL_SUCCESS` | +| todos falharam | `FAILED` | + +Se uma etapa posterior fizer o wrapper retornar `ok=false`, mas pelo menos um item primário tiver sucesso, o framework preserva para auditoria: + +```json +{ + "ok": true, + "original_ok": false, + "secondary_error": "erro da etapa posterior" +} +``` + +Isso evita transformar sucesso parcial/real em falha total na resposta ao usuário. + +## 6. O que NÃO fazer + +Evite estes padrões: + +```python +# NÃO: motor multi-item paralelo dentro do agente +for product in products: + await tool_router.call("cancelar_produto", {"product": product}) +``` + +```json +// NÃO: apenas um approved global sem evidência por item +{ + "approved": false, + "error": "um item falhou" +} +``` + +```json +// NÃO: um único success agregado quando houve resultados mistos +{ + "success": false, + "message": "operação bloqueada" +} +``` + +Esses formatos perdem a evidência terminal individual e podem fazer itens concluídos desaparecerem da composição final. + +## 7. Exemplo completo: vários pedidos + +### `tools.yaml` + +```yaml +tools: + cancelar_pedidos: + description: Cancela um ou mais pedidos. + mcp_server: retail + enabled: true + tool_type: action + confirmation_required: true + requires: [order_ids] + args_schema: + order_ids: + type: array + label: os pedidos + description: Lista de identificadores de pedidos a cancelar. + user_prompt: Quais pedidos deseja cancelar? +``` + +### Retorno MCP + +```json +{ + "ok": true, + "result": { + "results": [ + {"order_id": "P-100", "success": true, "protocol": "ABC1"}, + {"order_id": "P-101", "success": false, "reason": "already_shipped"}, + {"order_id": "P-102", "success": true, "protocol": "ABC3"} + ] + } +} +``` + +O framework classificará automaticamente como `PARTIAL_SUCCESS` e fornecerá ao LLM a instrução de relatar os resultados item a item. + +## 8. Read-only multi-item + +A mesma estrutura serve para consultas em lote. A diferença é que normalmente não existe confirmação: + +```yaml +tool_policies: + consultar_pedidos: + operation_type: read_only + require_confirmation: false +``` + +A tool ainda pode retornar `results[]` com `success/ok` por item para que uma consulta parcialmente indisponível não esconda as consultas bem-sucedidas. + +## 9. Idempotência e protocolos + +Em operações com efeito colateral: + +- use uma chave de idempotência de requisição e, quando necessário, uma chave por item; +- devolva protocolo/operation id no próprio item; +- não dependa apenas de uma mensagem textual agregada; +- em retry, preserve os itens já concluídos e execute apenas o que a regra de domínio permitir. + +O framework preserva evidência; a política de idempotência do sistema de destino continua pertencendo ao MCP/workflow de domínio. + +## 10. Checklist para o desenvolvedor + +- [ ] A tool aceita `array/list` quando o caso de uso é multi-item. +- [ ] Não existe loop MCP de negócio dentro da classe do agente. +- [ ] Se houver canonicalização, ela está em pre-validation/MCP, não hardcoded no agente. +- [ ] A confirmação mostra o conjunto efetivo de itens. +- [ ] A tool primária retorna `results[]` com `success` ou `ok` por item. +- [ ] Resultado parcial não é reduzido a um único `approved=false` ou `success=false` global. +- [ ] Workflow usa `output[tool_name].results` para a evidência terminal da tool primária. +- [ ] Testes cobrem todos-sucesso, parcial, todos-falha e falha auxiliar posterior. +- [ ] A resposta final menciona sucessos e falhas quando houver `PARTIAL_SUCCESS`. + +## 11. Onde o comportamento existe no framework + +Referências atuais: + +```text +libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py + - coerção de type=array/list + +libs/agent_framework/src/agent_framework/runtime/agent_runtime.py + - pre-validation e resolved_arguments + - _primary_multi_item_outcomes() + - _normalize_multi_item_tool_result() + - instrução de composição multi-item para o LLM + +tests/test_multi_item_result_normalization.py + - regressões de SUCCESS/PARTIAL_SUCCESS e proteção contra falha auxiliar +``` + +## 12. Resumo de responsabilidade + +| Camada | Responsabilidade | +|---|---| +| Agente | declarar intenção/tool e usar o runtime; não implementar motor multi-item | +| `tools.yaml` | declarar parâmetro `array/list` e schema | +| `tool_policies.yaml` | confirmação e pre-validation | +| Pre-validator MCP | resolver/canonicalizar entidades e argumentos | +| Tool MCP/workflow | executar a coleção e produzir resultado por item | +| Framework runtime | manter estado, confirmação, normalizar resultado multi-item e preservar evidência | +| LLM/presentation | transformar evidências em resposta, sem apagar sucesso/falha individual | diff --git a/agent_framework_oci/templates/agent_template_backend_day_zero/README_DAY_ZERO.md b/agent_framework_oci/templates/agent_template_backend_day_zero/README_DAY_ZERO.md index 869ed33c..2e9f3349 100644 --- a/agent_framework_oci/templates/agent_template_backend_day_zero/README_DAY_ZERO.md +++ b/agent_framework_oci/templates/agent_template_backend_day_zero/README_DAY_ZERO.md @@ -87,3 +87,8 @@ Esses arquivos são o esqueleto de execução usando o framework. # Política opcional de tools O arquivo `config/tool_policies.yaml` classifica tools como `read_only` ou `transactional`. Para uma transação real, ative `require_confirmation: true`; chamadas sem `confirmed: true` ou `confirmation: true` serão bloqueadas antes do MCP. A ausência do arquivo preserva o comportamento de templates anteriores. + + +## MCP multi-item + +Para listas de produtos/pedidos/itens, não crie loop MCP no agente. O runtime aceita parâmetros `array/list` e normaliza `results[]` por item em `SUCCESS`, `PARTIAL_SUCCESS` ou `FAILED`. Consulte [`docs/MCP_MULTI_ITEM.md`](docs/MCP_MULTI_ITEM.md) antes de criar qualquer mecanismo próprio de lote. diff --git a/agent_framework_oci/templates/agent_template_backend_day_zero/docs/MCP_MULTI_ITEM.md b/agent_framework_oci/templates/agent_template_backend_day_zero/docs/MCP_MULTI_ITEM.md new file mode 100644 index 00000000..6d5244f3 --- /dev/null +++ b/agent_framework_oci/templates/agent_template_backend_day_zero/docs/MCP_MULTI_ITEM.md @@ -0,0 +1,363 @@ +# MCP Multi-item — Guia do Desenvolvedor + +## Objetivo + +Use este guia quando uma única intenção do usuário precisa operar sobre **mais de um item do mesmo tipo** em uma chamada MCP, por exemplo: + +- cancelar vários VAS/produtos; +- devolver ou consultar vários pedidos; +- alterar vários ativos; +- processar uma lista de faturas, linhas, contratos ou recursos. + +O framework já possui contratos genéricos para **coleta de listas**, **pré-validação/canonicalização**, **confirmação transacional**, **execução MCP** e **normalização do resultado por item**. O desenvolvedor não deve criar um segundo motor de multi-item dentro do agente. + +## Regra principal + +**Não faça loop de negócio no agente.** O agente declara a tool e seus parâmetros; o runtime mantém estado, confirmação e evidência. A operação em lote deve ser exposta como uma tool MCP que aceite uma coleção, ou como uma tool transacional apoiada por um workflow/MCP que processe a coleção. + +Fluxo recomendado: + +```text +Usuário cita N itens + -> Router/Agent seleciona a tool + -> Runtime coleta/reconcilia parâmetro array/list + -> (opcional) pre-validation canonicaliza itens + -> Runtime pede UMA confirmação coerente para o conjunto + -> MCP recebe a coleção + -> MCP/workflow processa item a item + -> MCP devolve results[] com success/ok por item + -> Framework normaliza SUCCESS / PARTIAL_SUCCESS / FAILED + -> Composição final relata sucessos e falhas individualmente +``` + +## 1. Declarar um parâmetro de lista em `tools.yaml` + +O reconciliador transacional do framework aceita `type: array` ou `type: list`. + +```yaml +tools: + cancelar_produtos: + description: Cancela um ou mais produtos do cliente. + mcp_server: contas + enabled: true + tool_type: action + confirmation_required: true + requires: [items] + args_schema: + items: + type: array + label: os produtos + description: Lista de produtos que o cliente deseja cancelar. + user_prompt: Informe quais produtos deseja cancelar. +``` + +O runtime pode reconciliar uma frase como: + +```text +quero cancelar TIM Fashion, Aya Audiobooks e Neymar Jr +``` + +para um argumento lógico semelhante a: + +```json +{ + "items": ["TIM Fashion", "Aya Audiobooks", "Neymar Jr"] +} +``` + +A semântica de domínio e a validação dos nomes continuam pertencendo ao MCP/pre-validator, não ao core. + +## 2. Quando usar pre-validation + +Use `tool_policies.yaml` quando a lista precisa ser resolvida/canonicalizada antes da confirmação. + +```yaml +tool_policies: + cancelar_produtos: + operation_type: transactional + require_confirmation: true + requires: [items] + pre_validation: + enabled: true + tool: validar_produtos_cancelamento + fail_open: false +``` + +O pre-validator pode retornar `eligible: true` e substituir argumentos por valores canônicos em `transaction_decision.resolved_arguments`: + +```json +{ + "eligible": true, + "transaction_decision": { + "resolved_arguments": { + "items": [ + {"name": "TIM Fashion Mensal", "id": "1001"}, + {"name": "Aya Audiobooks Premium", "id": "1002"}, + {"name": "Neymar Jr", "id": "1003"} + ] + }, + "target_tool": "cancelar_produtos", + "confirmation_message": "Você confirma o cancelamento de TIM Fashion Mensal, Aya Audiobooks Premium e Neymar Jr?" + } +} +``` + +### Importante para validação parcial + +O contrato `eligible` da pre-validation é global. Portanto, **não retorne `eligible: false` apenas porque um item da lista falhou**, caso os demais ainda possam ser processados. Isso encerraria toda a transação. + +Para permitir resultado parcial, a estratégia recomendada é: + +1. retornar `eligible: true` quando existe pelo menos um item acionável; +2. preservar/canonicalizar a coleção em `resolved_arguments`; +3. deixar a tool primária devolver o resultado terminal de **cada item** em `results[]`. + +Se nenhum item puder ser processado, então `eligible: false` é apropriado. + +## 3. Contrato de entrada do MCP + +Prefira uma única chamada MCP com uma coleção explícita: + +```json +{ + "tool_name": "cancelar_produtos", + "arguments": { + "customer_id": "123", + "items": [ + {"name": "TIM Fashion Mensal", "id": "1001"}, + {"name": "Aya Audiobooks Premium", "id": "1002"}, + {"name": "Neymar Jr", "id": "1003"} + ] + } +} +``` + +O framework **não deve ser usado como um loop improvisado que chama N vezes uma tool escalar a partir do agente**. Se o backend só possui API unitária, o fan-out pode ficar encapsulado no MCP Server ou em um workflow de domínio, mantendo uma única tool lógica para o agente. + +## 4. Contrato obrigatório de resultado por item + +Para o framework reconhecer multi-item automaticamente, a **tool primária solicitada** deve expor uma lista `results` com **dois ou mais itens**, e cada item deve possuir um booleano `success` ou `ok`. + +Exemplo: + +```json +{ + "ok": true, + "result": { + "results": [ + {"id": "1001", "subject": "TIM Fashion Mensal", "success": true}, + {"id": "1002", "subject": "Aya Audiobooks Premium", "success": false, "reason": "not_found"}, + {"id": "1003", "subject": "Neymar Jr", "success": true} + ] + } +} +``` + +Campos como `id`, `subject`, `name`, `reason`, `error`, `protocol` e outros são de domínio e opcionais. O sinal estrutural exigido pelo normalizador é `success: true|false` ou `ok: true|false` por item. + +### Workflow-backed tool + +Se a tool é executada por workflow, o caminho preferencial e autoritativo é: + +```text +workflow.output[tool_name].results +``` + +Exemplo: + +```json +{ + "ok": false, + "result": { + "status": "COMPLETED", + "output": { + "cancelar_produtos": { + "results": [ + {"subject": "A", "success": true}, + {"subject": "B", "success": false, "reason": "not_found"}, + {"subject": "C", "success": true} + ] + }, + "etapa_auxiliar": { + "success": false, + "error": "falha em pós-processamento" + } + } + }, + "error": "falha em pós-processamento" +} +``` + +O runtime preserva o resultado da operação primária e não permite que uma falha auxiliar apague itens já concluídos. + +## 5. O que o framework produz automaticamente + +Com `results[]` válido, o runtime adiciona: + +```json +{ + "multi_item_status": "PARTIAL_SUCCESS", + "partial_success": true, + "metadata": { + "multi_item": { + "status": "PARTIAL_SUCCESS", + "items_count": 3, + "items_succeeded_count": 2, + "items_failed_count": 1, + "primary_tool": "cancelar_produtos" + } + } +} +``` + +Estados possíveis: + +| Situação | `multi_item_status` | +|---|---| +| todos os itens concluíram | `SUCCESS` | +| parte concluiu e parte falhou | `PARTIAL_SUCCESS` | +| todos falharam | `FAILED` | + +Se uma etapa posterior fizer o wrapper retornar `ok=false`, mas pelo menos um item primário tiver sucesso, o framework preserva para auditoria: + +```json +{ + "ok": true, + "original_ok": false, + "secondary_error": "erro da etapa posterior" +} +``` + +Isso evita transformar sucesso parcial/real em falha total na resposta ao usuário. + +## 6. O que NÃO fazer + +Evite estes padrões: + +```python +# NÃO: motor multi-item paralelo dentro do agente +for product in products: + await tool_router.call("cancelar_produto", {"product": product}) +``` + +```json +// NÃO: apenas um approved global sem evidência por item +{ + "approved": false, + "error": "um item falhou" +} +``` + +```json +// NÃO: um único success agregado quando houve resultados mistos +{ + "success": false, + "message": "operação bloqueada" +} +``` + +Esses formatos perdem a evidência terminal individual e podem fazer itens concluídos desaparecerem da composição final. + +## 7. Exemplo completo: vários pedidos + +### `tools.yaml` + +```yaml +tools: + cancelar_pedidos: + description: Cancela um ou mais pedidos. + mcp_server: retail + enabled: true + tool_type: action + confirmation_required: true + requires: [order_ids] + args_schema: + order_ids: + type: array + label: os pedidos + description: Lista de identificadores de pedidos a cancelar. + user_prompt: Quais pedidos deseja cancelar? +``` + +### Retorno MCP + +```json +{ + "ok": true, + "result": { + "results": [ + {"order_id": "P-100", "success": true, "protocol": "ABC1"}, + {"order_id": "P-101", "success": false, "reason": "already_shipped"}, + {"order_id": "P-102", "success": true, "protocol": "ABC3"} + ] + } +} +``` + +O framework classificará automaticamente como `PARTIAL_SUCCESS` e fornecerá ao LLM a instrução de relatar os resultados item a item. + +## 8. Read-only multi-item + +A mesma estrutura serve para consultas em lote. A diferença é que normalmente não existe confirmação: + +```yaml +tool_policies: + consultar_pedidos: + operation_type: read_only + require_confirmation: false +``` + +A tool ainda pode retornar `results[]` com `success/ok` por item para que uma consulta parcialmente indisponível não esconda as consultas bem-sucedidas. + +## 9. Idempotência e protocolos + +Em operações com efeito colateral: + +- use uma chave de idempotência de requisição e, quando necessário, uma chave por item; +- devolva protocolo/operation id no próprio item; +- não dependa apenas de uma mensagem textual agregada; +- em retry, preserve os itens já concluídos e execute apenas o que a regra de domínio permitir. + +O framework preserva evidência; a política de idempotência do sistema de destino continua pertencendo ao MCP/workflow de domínio. + +## 10. Checklist para o desenvolvedor + +- [ ] A tool aceita `array/list` quando o caso de uso é multi-item. +- [ ] Não existe loop MCP de negócio dentro da classe do agente. +- [ ] Se houver canonicalização, ela está em pre-validation/MCP, não hardcoded no agente. +- [ ] A confirmação mostra o conjunto efetivo de itens. +- [ ] A tool primária retorna `results[]` com `success` ou `ok` por item. +- [ ] Resultado parcial não é reduzido a um único `approved=false` ou `success=false` global. +- [ ] Workflow usa `output[tool_name].results` para a evidência terminal da tool primária. +- [ ] Testes cobrem todos-sucesso, parcial, todos-falha e falha auxiliar posterior. +- [ ] A resposta final menciona sucessos e falhas quando houver `PARTIAL_SUCCESS`. + +## 11. Onde o comportamento existe no framework + +Referências atuais: + +```text +libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py + - coerção de type=array/list + +libs/agent_framework/src/agent_framework/runtime/agent_runtime.py + - pre-validation e resolved_arguments + - _primary_multi_item_outcomes() + - _normalize_multi_item_tool_result() + - instrução de composição multi-item para o LLM + +tests/test_multi_item_result_normalization.py + - regressões de SUCCESS/PARTIAL_SUCCESS e proteção contra falha auxiliar +``` + +## 12. Resumo de responsabilidade + +| Camada | Responsabilidade | +|---|---| +| Agente | declarar intenção/tool e usar o runtime; não implementar motor multi-item | +| `tools.yaml` | declarar parâmetro `array/list` e schema | +| `tool_policies.yaml` | confirmação e pre-validation | +| Pre-validator MCP | resolver/canonicalizar entidades e argumentos | +| Tool MCP/workflow | executar a coleção e produzir resultado por item | +| Framework runtime | manter estado, confirmação, normalizar resultado multi-item e preservar evidência | +| LLM/presentation | transformar evidências em resposta, sem apagar sucesso/falha individual | diff --git a/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc index 4af29071..4aee37c9 100644 Binary files a/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_advanced_developer_documentation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_advanced_developer_documentation.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..e7ed2d54 Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_advanced_developer_documentation.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_multi_item_documentation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_multi_item_documentation.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..e4de9c84 Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_multi_item_documentation.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_readme_financeiro_agent_example.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_readme_financeiro_agent_example.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..789ed502 Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_readme_financeiro_agent_example.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/test_multi_item_documentation.py b/agent_framework_oci/tests/test_multi_item_documentation.py new file mode 100644 index 00000000..4aae39ab --- /dev/null +++ b/agent_framework_oci/tests/test_multi_item_documentation.py @@ -0,0 +1,51 @@ +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] + + +def test_multi_item_guide_documents_runtime_contract(): + text = (ROOT / "docs" / "MCP_MULTI_ITEM_DEVELOPER_GUIDE.md").read_text(encoding="utf-8") + for token in ( + "type: array", + "resolved_arguments", + "results[]", + "PARTIAL_SUCCESS", + "workflow.output[tool_name].results", + "eligible: false", + "Não faça loop de negócio no agente.", + ): + assert token in text + + +def test_multi_item_guide_is_discoverable_from_main_entry_points(): + for path in ( + ROOT / "README.md", + ROOT / "Documentacao" / "README_MCP.md", + ROOT / "docs" / "developer" / "pt" / "INDEX_DEVELOPER_GUIDE.md", + ROOT / "templates" / "agent_template_backend" / "README.md", + ): + assert "MCP_MULTI_ITEM" in path.read_text(encoding="utf-8") or "MCP multi-item" in path.read_text(encoding="utf-8") or "MCP Multi-item" in path.read_text(encoding="utf-8") + + +def test_multi_item_is_discoverable_from_tuning_performance(): + tuning_index = (ROOT / "Tuning-Performance" / "README.md").read_text(encoding="utf-8") + tuning_readme = (ROOT / "Tuning-Performance" / "Multi_Item_MCP" / "README.md").read_text(encoding="utf-8") + implementation = (ROOT / "Tuning-Performance" / "Multi_Item_MCP" / "IMPLEMENTACAO_MULTI_ITEM_MCP.md").read_text(encoding="utf-8") + + assert "Multi_Item_MCP" in tuning_index + for token in ( + "tools.yaml", + "tool_policies.yaml", + "results[]", + "PARTIAL_SUCCESS", + "NÃO cria motor multi-item", + ): + assert token in tuning_readme + + for token in ( + "MCP Server ou workflow", + "success", + "PARTIAL_SUCCESS", + "Checklist do desenvolvedor", + ): + assert token in implementation diff --git a/agent_framework_oci/tests/test_multi_item_result_normalization.py b/agent_framework_oci/tests/test_multi_item_result_normalization.py new file mode 100644 index 00000000..481e1904 --- /dev/null +++ b/agent_framework_oci/tests/test_multi_item_result_normalization.py @@ -0,0 +1,87 @@ +from agent_framework.runtime.agent_runtime import AgentRuntimeMixin + + +def _workflow_result(*, items, ok=False, error="secondary step failed"): + return { + "tool_name": "cancelar_vas_avulso", + "ok": ok, + "result": { + "status": "COMPLETED", + "output": { + "cancelar_vas_avulso": { + "success": all(bool(item.get("success")) for item in items), + "results": items, + }, + "secondary_step": {"success": False, "error": error}, + }, + }, + "error": error, + "metadata": {"workflow_status": "COMPLETED"}, + } + + +def test_multi_item_partial_success_preserves_successful_items(): + raw = _workflow_result(items=[ + {"subject": "A", "success": True}, + {"subject": "B", "success": False, "reason": "not_found"}, + {"subject": "C", "success": True}, + ]) + + result = AgentRuntimeMixin._normalize_multi_item_tool_result("cancelar_vas_avulso", raw) + + assert result["ok"] is True + assert result["original_ok"] is False + assert result["partial_success"] is True + assert result["multi_item_status"] == "PARTIAL_SUCCESS" + assert result["metadata"]["multi_item"] == { + "status": "PARTIAL_SUCCESS", + "items_count": 3, + "items_succeeded_count": 2, + "items_failed_count": 1, + "primary_tool": "cancelar_vas_avulso", + } + assert result["secondary_error"] == "secondary step failed" + assert raw["ok"] is False # normalizer is non-mutating + + +def test_multi_item_primary_success_is_not_overwritten_by_secondary_composite_failure(): + raw = _workflow_result(items=[ + {"subject": "TIM Fashion Mensal", "success": True}, + {"subject": "Aya Audiobooks Premium", "success": True}, + {"subject": "Neymar Jr", "success": True}, + ], error="Item ausente em validação posterior") + + result = AgentRuntimeMixin._normalize_multi_item_tool_result("cancelar_vas_avulso", raw) + + assert result["ok"] is True + assert result["multi_item_status"] == "SUCCESS" + assert result["partial_success"] is False + assert result["metadata"]["multi_item"]["items_succeeded_count"] == 3 + assert result["secondary_error"] == "Item ausente em validação posterior" + + +def test_single_item_result_does_not_change_existing_semantics(): + raw = _workflow_result(items=[{"subject": "A", "success": True}]) + result = AgentRuntimeMixin._normalize_multi_item_tool_result("cancelar_vas_avulso", raw) + assert result == raw + + +def test_unrelated_nested_results_do_not_override_primary_tool_failure(): + raw = { + "tool_name": "cancelar_vas_avulso", + "ok": False, + "result": { + "status": "COMPLETED", + "output": { + "other_tool": { + "results": [ + {"subject": "A", "success": True}, + {"subject": "B", "success": True}, + ] + } + }, + }, + "error": "primary tool failed", + } + result = AgentRuntimeMixin._normalize_multi_item_tool_result("cancelar_vas_avulso", raw) + assert result == raw