From d986b9751fcef42c9c21df73bbd4ed71a3ccb178 Mon Sep 17 00:00:00 2001 From: "cristiano.hoshikawa" Date: Thu, 17 Sep 2026 10:23:35 -0300 Subject: [PATCH] bugfix: ABANDON precedence --- .../enterprise_router.cpython-313.pyc | Bin 42902 -> 80714 bytes .../routing/enterprise_router.py | 353 +++++++++++++++--- .../__pycache__/__init__.cpython-313.pyc | Bin 413 -> 404 bytes .../__pycache__/idempotency.cpython-313.pyc | Bin 8914 -> 8905 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 215 -> 206 bytes .../cache/__pycache__/cache.cpython-313.pyc | Bin 16525 -> 16516 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 216 -> 207 bytes .../__pycache__/settings.cpython-313.pyc | Bin 13791 -> 13941 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 308 -> 299 bytes .../mcp_gateway_client.cpython-313.pyc | Bin 3334 -> 3325 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 410 -> 401 bytes .../__pycache__/mcp_mapper.cpython-313.pyc | Bin 4694 -> 4685 bytes .../__pycache__/models.cpython-313.pyc | Bin 3146 -> 3137 bytes .../__pycache__/resolver.cpython-313.pyc | Bin 4715 -> 4706 bytes .../llm/__pycache__/__init__.cpython-313.pyc | Bin 478 -> 469 bytes .../llm/__pycache__/base.cpython-313.pyc | Bin 1625 -> 1616 bytes .../structured_output.cpython-313.pyc | Bin 7461 -> 7452 bytes .../llm/__pycache__/types.cpython-313.pyc | Bin 1276 -> 1267 bytes .../mcp/__pycache__/__init__.cpython-313.pyc | Bin 475 -> 466 bytes .../mcp/__pycache__/client.cpython-313.pyc | Bin 18428 -> 18419 bytes .../mcp/__pycache__/models.cpython-313.pyc | Bin 2138 -> 2129 bytes .../mcp/__pycache__/registry.cpython-313.pyc | Bin 4742 -> 4733 bytes .../__pycache__/tool_policy.cpython-313.pyc | Bin 5687 -> 5678 bytes .../__pycache__/tool_router.cpython-313.pyc | Bin 14191 -> 14182 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1137 -> 1128 bytes .../message_history.cpython-313.pyc | Bin 8361 -> 8352 bytes .../summary_memory.cpython-313.pyc | Bin 12512 -> 12503 bytes .../__pycache__/summary_store.cpython-313.pyc | Bin 9522 -> 9513 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 216 -> 207 bytes .../__pycache__/session.cpython-313.pyc | Bin 2710 -> 2701 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 221 -> 212 bytes .../__pycache__/sqlite_store.cpython-313.pyc | Bin 15020 -> 15011 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 649 -> 640 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 2691 -> 2682 bytes .../__pycache__/continuity.cpython-313.pyc | Bin 15935 -> 15926 bytes .../enterprise_router.cpython-313.pyc | Bin 69460 -> 80708 bytes .../__pycache__/models.cpython-313.pyc | Bin 2448 -> 2439 bytes .../__pycache__/multi_intent.cpython-313.pyc | Bin 19986 -> 20259 bytes .../pending_topics.cpython-313.pyc | Bin 16122 -> 16125 bytes .../routing/enterprise_router.py | 353 +++++++++++++++--- .../__pycache__/__init__.cpython-313.pyc | Bin 350 -> 341 bytes .../__pycache__/agent_runtime.cpython-313.pyc | Bin 198240 -> 206053 bytes .../transaction_parameters.cpython-313.pyc | Bin 19585 -> 19576 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 880 -> 871 bytes .../__pycache__/graph.cpython-313.pyc | Bin 1417 -> 1408 bytes .../input_contract.cpython-313.pyc | Bin 8792 -> 8783 bytes .../__pycache__/models.cpython-313.pyc | Bin 7671 -> 7662 bytes .../__pycache__/registry.cpython-313.pyc | Bin 2363 -> 2354 bytes .../__pycache__/repository.cpython-313.pyc | Bin 2716 -> 2707 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 36154 -> 36145 bytes .../__pycache__/tool_executor.cpython-313.pyc | Bin 1968 -> 1959 bytes .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 806 -> 800 bytes ...me_precedence.cpython-313-pytest-9.0.2.pyc | Bin 67370 -> 67366 bytes ...saction_shift.cpython-313-pytest-9.0.2.pyc | Bin 25812 -> 28012 bytes ...stomer_facing.cpython-313-pytest-9.0.2.pyc | Bin 4803 -> 4799 bytes ...ral_candidate.cpython-313-pytest-9.0.2.pyc | Bin 17575 -> 64262 bytes ...lm_precedence.cpython-313-pytest-9.0.2.pyc | Bin 57846 -> 58414 bytes ..._interruption.cpython-313-pytest-9.0.2.pyc | Bin 28289 -> 28283 bytes ...it_abandonment_and_structural_candidate.py | 261 +++++++++++++ ...st_transaction_parameter_llm_precedence.py | 18 +- ...ics_isolation.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 33551 bytes 61 files changed, 875 insertions(+), 110 deletions(-) create mode 100644 tests/unit/__pycache__/test_pending_topics_isolation.cpython-313-pytest-9.0.2.pyc diff --git a/libs/agent_framework/build/lib/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc b/libs/agent_framework/build/lib/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc index b805d8d4e6ecc20c130b7d8e3bb6ac098be4a16b..8dbf921583f5c8d58a29450ab541cde440422065 100644 GIT binary patch literal 80714 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 X{W`ZKnKcLg5#)Lcv7F`*vibZ!5yOyu diff --git a/libs/agent_framework/build/lib/agent_framework/routing/enterprise_router.py b/libs/agent_framework/build/lib/agent_framework/routing/enterprise_router.py index ef8a569e..836282a5 100644 --- a/libs/agent_framework/build/lib/agent_framework/routing/enterprise_router.py +++ b/libs/agent_framework/build/lib/agent_framework/routing/enterprise_router.py @@ -630,32 +630,144 @@ class EnterpriseRouter: if state_decision: tx_status = str(state.get("transaction_status") or "").strip().upper() - # Confirmation is the only transaction input with absolute precedence: - # an explicit yes/no answers the confirmation contract itself. - if tx_status == "AWAITING_CONFIRMATION": - consumed = await self._transaction_parameter_precedence( - state, text=str(text), state_decision=state_decision - ) - if consumed is not None: - await self._emit(consumed, state) - return consumed + active_tx = state.get("active_transaction") if isinstance(state.get("active_transaction"), dict) else {} + legacy_tx = state.get("pending_tool_call") or state.get("selected_tool_call") or {} + state_lock_name = str( + state_decision.next_state + or current_state + or state_decision.intent.removeprefix("state:") + or "" + ).strip().upper() + transactional_state_lock = state_lock_name.startswith( + ("WAITING_", "COLLECTING_", "AWAITING_") + ) - # Transaction parameter precedence is absolute while collecting: - # first let the active transaction try to consume the current turn. - # Only when NO pending parameter can be extracted do we ask the - # semantic classifier whether the user changed goals. This prevents - # value/name/reference answers (for example "a de 14,99") from being - # stolen by a semantically plausible but incompatible intent. - if tx_status == "COLLECTING_PARAMETERS": + # Rich transactional latches remain the primary source of truth. + # The domain state lock is only a recovery fallback for checkpoints + # where those latches were not restored. This prevents a generic + # COLLECTING_* state from stealing a legitimate parameter answer. + rich_transaction_context = bool( + active_tx.get("tool_name") + or (isinstance(legacy_tx, dict) and legacy_tx.get("tool_name")) + or tx_status in {"COLLECTING_PARAMETERS", "AWAITING_CONFIRMATION"} + ) + fallback_state_lock_context = bool( + transactional_state_lock and not rich_transaction_context + ) + has_transaction_context = bool( + rich_transaction_context or fallback_state_lock_context + ) + + # Some hosts restore the domain state but omit transaction_status. + # Infer only the generic phase needed by the precedence logic; do not + # replace richer transaction data when it exists. + effective_tx_status = tx_status + if not effective_tx_status: + if state_lock_name.startswith("COLLECTING_"): + effective_tx_status = "COLLECTING_PARAMETERS" + elif state_lock_name.startswith("AWAITING_") or "CONFIRMATION" in state_lock_name: + effective_tx_status = "AWAITING_CONFIRMATION" + + precedence_state = state + if effective_tx_status and effective_tx_status != tx_status: + precedence_state = dict(state) + precedence_state["transaction_status"] = effective_tx_status + + # Transactional interruption precedence is semantic, not lexical. + # + # COLLECTING_PARAMETERS is special: the pending parameter gets the + # first opportunity to consume the turn. If the input is pertinent + # to the parameter, extraction returns values and the transaction + # continues. Only when the input is not pertinent do we ask the + # semantic interruption classifier whether the user abandoned the + # active transaction. This preserves inputs such as + # ``motivo é que desisti`` as a legitimate ``reason`` value while + # still allowing ``não quero mais devolver; quero ver meus serviços`` + # to abandon the current operation and start a new objective. + if effective_tx_status == "COLLECTING_PARAMETERS": + if rich_transaction_context: + relevance = await self._classify_transaction_parameter_relevance( + precedence_state, text=str(text) + ) + if relevance is True: + consumed = await self._transaction_parameter_precedence( + precedence_state, text=str(text), state_decision=state_decision + ) + if consumed is not None: + consumed.metadata = { + **(consumed.metadata or {}), + "transaction_parameter_relevant": True, + } + await self._emit(consumed, state) + return consumed + + # Pertinent to the requested parameter, but extraction did + # not produce a structured value. Keep transaction + # ownership and let the agent reprompt/clarify; do not + # reinterpret the same input as ABANDON or SHIFT. + state_decision.metadata = { + **(state_decision.metadata or {}), + "transaction_parameter_relevant": True, + "transaction_parameter_extraction_empty": True, + } + await self._emit(state_decision, state) + return state_decision + + if relevance is None: + # Compatibility/fail-safe when the relevance classifier is + # unavailable: retain the previous extractor-first behavior. + consumed = await self._transaction_parameter_precedence( + precedence_state, text=str(text), state_decision=state_decision + ) + if consumed is not None: + consumed.metadata = { + **(consumed.metadata or {}), + "transaction_parameter_relevance": "unknown", + } + await self._emit(consumed, state) + return consumed + + if has_transaction_context: + abandonment = await self._transaction_state_interruption_candidate( + precedence_state, + text=str(text), + state_decision=state_decision, + abandon_only=True, + ) + if abandonment is not None: + abandonment.metadata = { + **(abandonment.metadata or {}), + "transaction_parameter_relevant": False if rich_transaction_context else None, + } + await self._emit(abandonment, state) + return abandonment + + # In confirmation/waiting phases there is no pending free-form + # parameter whose value can be confused with abandonment. Evaluate + # ABANDON semantically before confirmation/state-lock consumption. + # Plain confirmations (e.g. yes/no) are classified as CONTINUE by + # this probe and then follow the normal confirmation path below. + elif has_transaction_context: + abandonment = await self._transaction_state_interruption_candidate( + precedence_state, + text=str(text), + state_decision=state_decision, + abandon_only=True, + ) + if abandonment is not None: + await self._emit(abandonment, state) + return abandonment + + if effective_tx_status == "AWAITING_CONFIRMATION": consumed = await self._transaction_parameter_precedence( - state, text=str(text), state_decision=state_decision + precedence_state, text=str(text), state_decision=state_decision ) if consumed is not None: await self._emit(consumed, state) return consumed interruption = await self._transaction_state_interruption_candidate( - state, text=str(text), state_decision=state_decision + precedence_state, text=str(text), state_decision=state_decision ) if interruption is not None: await self._emit(interruption, state) @@ -686,19 +798,61 @@ class EnterpriseRouter: method="state", next_state=tx_status, ) - if tx_status == "AWAITING_CONFIRMATION": - consumed = await self._transaction_parameter_precedence( - state, text=str(text), state_decision=synthetic - ) - if consumed is not None: - consumed.metadata = { - **(consumed.metadata or {}), - "transaction_state_recovered": True, - } - await self._emit(consumed, state) - return consumed - if tx_status == "COLLECTING_PARAMETERS": + relevance = await self._classify_transaction_parameter_relevance( + state, text=str(text) + ) + if relevance is True: + consumed = await self._transaction_parameter_precedence( + state, text=str(text), state_decision=synthetic + ) + if consumed is not None: + consumed.metadata = { + **(consumed.metadata or {}), + "transaction_state_recovered": True, + "transaction_parameter_relevant": True, + } + await self._emit(consumed, state) + return consumed + synthetic.metadata = { + **(synthetic.metadata or {}), + "transaction_state_recovered": True, + "transaction_parameter_relevant": True, + "transaction_parameter_extraction_empty": True, + } + await self._emit(synthetic, state) + return synthetic + + if relevance is None: + consumed = await self._transaction_parameter_precedence( + state, text=str(text), state_decision=synthetic + ) + if consumed is not None: + consumed.metadata = { + **(consumed.metadata or {}), + "transaction_state_recovered": True, + "transaction_parameter_relevance": "unknown", + } + await self._emit(consumed, state) + return consumed + + # No parameter was consumed (or this is confirmation): now decide + # semantically whether the user abandoned the active transaction. + abandonment = await self._transaction_state_interruption_candidate( + state, + text=str(text), + state_decision=synthetic, + abandon_only=True, + ) + if abandonment is not None: + abandonment.metadata = { + **(abandonment.metadata or {}), + "transaction_state_recovered": True, + } + await self._emit(abandonment, state) + return abandonment + + if tx_status == "AWAITING_CONFIRMATION": consumed = await self._transaction_parameter_precedence( state, text=str(text), state_decision=synthetic ) @@ -837,6 +991,82 @@ class EnterpriseRouter: return decision + async def _classify_transaction_parameter_relevance( + self, state: dict[str, Any], *, text: str + ) -> bool | None: + """Semantically decide whether the turn answers a pending parameter. + + This is intentionally separate from extraction. A parameter extractor + may be able to manufacture a syntactically valid value from unrelated + text; relevance answers the higher-level question first: does the user + appear to be responding to what the active transaction asked for? + + Returns True/False when classification succeeds and None when the + classifier is unavailable or its output cannot be trusted. + """ + if not (self.enable_llm_router and self.llm is not None): + return None + missing = [str(name) for name in (state.get("missing_parameters") or []) if str(name).strip()] + if not missing: + return None + active = state.get("active_transaction") if isinstance(state.get("active_transaction"), dict) else {} + tool_name = str(active.get("tool_name") or "").strip() + if not tool_name: + return None + payload = { + "message": str(text or ""), + "transaction": { + "intent": active.get("started_from_intent") or state.get("intent"), + "tool_name": tool_name, + "tool_description": active.get("tool_description"), + "missing_parameters": missing, + "parameter_schema": active.get("parameter_schema") or {}, + "known_arguments": active.get("arguments") or {}, + "relevant_conversation_context": ( + active.get("parameter_conversational_context") + or self._collect_transaction_parameter_context(state=state, current_text=str(text)) + ), + }, + } + system = ( + "Você decide somente se a mensagem do usuário é uma resposta pertinente ao(s) " + "parâmetro(s) que a transação ativa está pedindo. Avalie significado e contexto, " + "não palavras isoladas. Considere RELEVANT quando a mensagem fornece, esclarece, " + "corrige ou referencia plausivelmente o dado solicitado, mesmo em linguagem livre. " + "Considere NOT_RELEVANT quando a mensagem abandona a ação, inicia outro objetivo, " + "faz uma pergunta diferente ou não responde ao dado pedido. Não extraia valores e " + "não decida abandono/intent; classifique apenas pertinência. Retorne somente JSON " + "válido: {\"relevance\":\"RELEVANT|NOT_RELEVANT\",\"confidence\":0.0,\"reason\":\"...\"}." + ) + try: + answer = await self.llm.ainvoke( + [ + {"role": "system", "content": system}, + {"role": "user", "content": json.dumps(payload, ensure_ascii=False)}, + ], + temperature=0.0, + max_tokens=256, + profile_name="router", + component_name="router.transaction_parameter_relevance", + generation_name="llm.transaction_parameter_relevance", + ) + data = self._parse_json(answer) + except Exception as exc: + logger.warning("Falha ao classificar pertinência do parâmetro transacional: %s", exc) + return None + relevance = str(data.get("relevance") or "").strip().upper() + try: + confidence = float(data.get("confidence") or 0.0) + except (TypeError, ValueError): + return None + if confidence < self.intent_shift_threshold: + return None + if relevance == "RELEVANT": + return True + if relevance == "NOT_RELEVANT": + return False + return None + async def _transaction_parameter_precedence( self, state: dict[str, Any], @@ -846,11 +1076,12 @@ class EnterpriseRouter: ) -> RouteDecision | None: """Try to consume the turn under the active transaction contract first. - AWAITING_CONFIRMATION consumes an explicit confirmation before any shift - classification. COLLECTING_PARAMETERS also has precedence: if at least one - pending parameter can be extracted, the active transaction keeps ownership - of the turn. Semantic intent-shift is evaluated only when extraction returns - no usable pending parameter. + In AWAITING_CONFIRMATION, an explicit ABANDON candidate is classified + before confirmation consumption; plain yes/no responses still keep + deterministic confirmation precedence because they do not pass the + abandonment gate. In COLLECTING_PARAMETERS, ABANDON is likewise checked + before extraction, while SHIFT remains after parameter extraction so valid + referential/value answers are not stolen from the active transaction. """ tx_status = str(state.get("transaction_status") or "").strip().upper() if tx_status == "AWAITING_CONFIRMATION": @@ -966,13 +1197,14 @@ class EnterpriseRouter: *, text: str, state_decision: RouteDecision, + abandon_only: bool = False, ) -> RouteDecision | None: """Detecta semanticamente mudança de intenção durante uma transação. - Não existe lista de palavras para desistência ou mudança de assunto. Uma - interrupção nasce de uma intent diferente resolvida por uma keyword - configurada no ``routing.yaml`` ou, na ausência dela, por uma decisão - semântica do LLM com o contexto da transação pendente. + Não existe lista de palavras para desistência. ABANDON é sempre uma + decisão semântica do LLM baseada no contexto transacional. Uma possível + nova intenção pode aparecer como hint do ``routing.yaml``, mas esse hint + não decide abandono e não substitui a classificação semântica. """ active_tx = state.get("active_transaction") if isinstance(state.get("active_transaction"), dict) else {} started_intent = str(active_tx.get("started_from_intent") or "").strip() @@ -1038,18 +1270,32 @@ class EnterpriseRouter: else None ), } - system = ( - "Você decide apenas se o turno atual continua a transação ativa ou muda de intenção. " - "Use o significado da mensagem e o contexto transacional; não use palavras isoladas como regra. " - "A extração dos parâmetros pendentes já foi tentada antes desta etapa e não consumiu o turno. " - "Se ainda assim a mensagem for apenas uma resposta referencial/valor/nome ao dado pendente, retorne CONTINUE. " - "Se o usuário passou claramente a perseguir outro objetivo sem desistir explicitamente da ação atual, " - "retorne SHIFT e a nova intent permitida. " - "Se o usuário desistiu explicitamente da ação/transação atual, retorne ABANDON. " - "Quando ABANDON vier acompanhado de um novo objetivo, também informe intent e agent desse novo objetivo. " - "Quando for apenas abandono sem novo objetivo, intent e agent podem ser nulos. " - "Retorne somente JSON válido com decision, intent, agent, confidence, reason." - ) + if abandon_only: + system = ( + "Você decide somente se o usuário desistiu explicitamente da ação/transação ativa. " + "Quando a transação estava coletando parâmetros, a pertinência ao parâmetro já foi avaliada antes desta etapa; " + "portanto não transforme uma resposta pertinente ao parâmetro em abandono. " + "Use o significado completo da mensagem e o contexto transacional; não use palavras isoladas como regra. " + "Se houver desistência explícita da ação atual, retorne ABANDON. " + "Quando o abandono vier acompanhado de um novo objetivo, também informe intent e agent desse novo objetivo. " + "Quando for apenas abandono sem novo objetivo, intent e agent podem ser nulos. " + "Se a mensagem apenas fornece parâmetro, confirma contexto, ou somente muda/adiciona outro objetivo sem " + "desistir explicitamente da ação atual, retorne CONTINUE. " + "Retorne somente JSON válido com decision, intent, agent, confidence, reason." + ) + else: + system = ( + "Você decide apenas se o turno atual continua a transação ativa ou muda de intenção. " + "Use o significado da mensagem e o contexto transacional; não use palavras isoladas como regra. " + "A extração dos parâmetros pendentes já foi tentada antes desta etapa e não consumiu o turno. " + "Se ainda assim a mensagem for apenas uma resposta referencial/valor/nome ao dado pendente, retorne CONTINUE. " + "Se o usuário passou claramente a perseguir outro objetivo sem desistir explicitamente da ação atual, " + "retorne SHIFT e a nova intent permitida. " + "Se o usuário desistiu explicitamente da ação/transação atual, retorne ABANDON. " + "Quando ABANDON vier acompanhado de um novo objetivo, também informe intent e agent desse novo objetivo. " + "Quando for apenas abandono sem novo objetivo, intent e agent podem ser nulos. " + "Retorne somente JSON válido com decision, intent, agent, confidence, reason." + ) user = { "message": text, "transaction": transaction_context, @@ -1074,7 +1320,10 @@ class EnterpriseRouter: return None decision_kind = str(data.get("decision") or "").strip().upper() - if decision_kind not in {"SHIFT", "ABANDON"}: + if abandon_only: + if decision_kind != "ABANDON": + return None + elif decision_kind not in {"SHIFT", "ABANDON"}: return None confidence = float(data.get("confidence") or 0.0) if confidence < self.intent_shift_threshold: diff --git a/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc index 9e6ab7b1546b373394ba976bcdb57f9efd829fc2..4a44168d543f33e5c335efa7d3fefe0420c96f8c 100644 GIT binary patch delta 55 zcmbQsJcXJ2GcPX}0}$wGt)9sJUOrtvH?KrLC9xz?KQSpWFC{-OzBn~EF|Q;uIX*43 JVzLrrH2}{B5J1HeeKQTQu UuOvP>Kd&UQINoS;0du500OQvdxBvhE diff --git a/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc index 570985a09abeab3709960b58077d9cf26ce1b13d..0bb6f40ccc378a8add3e2ca60f633ff29e12827a 100644 GIT binary patch delta 54 zcmcc4c#e_#GcPX}0}vQ!t)9qjET5~Nn^&Trl30?cpO}=Gmy(|sU!0nom{*dS9G{k1 IF)^(W0K1tIGynhq delta 63 zcmX@dc%6~^GcPX}0}$NKSv-;3SffloH?KrLMc+5rGd`dwKPxr4q*y;YDJ4liF+DY} RBtAJmuOzWJ-e_WMApnVC70Lhr diff --git a/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc b/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc index d1242ed33ed4909ef592ca9c4900a2205964de0e..4b39fce9dccc11b9d203203001f6954a8d52a095 100644 GIT binary patch delta 59 zcmeBeWNc|<x+HA|@ZU+F^KNe2_ diff --git a/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc index a251e6897423687e4df318dd219d0d9ff0bfca67..07780aa3ca0da997147d9f69551878681fdf6250 100644 GIT binary patch delta 54 zcmcb?c%G5_GcPX}0}$wGt)9qjET5;Jn^&Trl30?cpO}=Gmy(|sU!0nom{*dS9G{k1 IF)^(O0K3!@HUIzs delta 63 zcmX@lc!QDqGcPX}0}$NGSv-;3SfgA&H?KrLMc+5rGd`dwKPxr4q*y;YDJ4liF+DY} RBtAJmuOzWJ-e_WM5dewT70mzu diff --git a/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc b/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc index 4175dd4cb67a7efffc555037aa91e40a49524e8a..774134a7c466f570fae7d549d4995aa1608e5f3f 100644 GIT binary patch delta 2233 zcmZ9Odr(w$6vy|%MOI#|ETE#qE3W-(`g+r0UWM3U1wuwEJ9x|(-*bykOnj1=}VGYq*aEpd@ z+_0X!4Nyw;8;MkSo$5CcDe#6P(5?&%qy?MV10S!3ye&{BW@tA82L~%Kvp21U8;7|1 zz$_ZSg9>f%CXKJ_`gQPKt)(bq%@EcIE`$=)&_?=*Sez;Z{RHY#Ye__9|~|99l8u$t(5rb?o- zL{p%Oj(CpfJXF)6E)ZRWHAI()x?wHRWuhyvj_4}U53ru-M>+v{J}0_KbPKjp-)*8h@CDJI77yO& zUD!tW7bX9O?L_|&sj!3A|I1WMbdTsh)ZvO3CA$Gx{FY!R_KL`l9e>c-k=Y4=U60;} zN0j!VVK&%}qXh?Yp%K31*1qfn!5(&k*$IJqc0$<+gS~vHC(yCmpn>O_xS}64a!)ut zzgTI8ecTj5O$zLPbViYnLVkSFvF@=EUz*IF+v?KP?#y zT}HdByu3hf3!NL39yK;IE7O^srRGe`9y8gQHU5Q3<3!wLBHuo7`~=nc$|QBd%(^mU0vlH}FHk~00GE5spS1(5MLAk0ev8tw97~V#?gK}59Xf>PeVQ3Kd0)8m6);A@_8iHXcN*Ia>r5{Q-iWwyW zB~r^s8DxzTVUHMN=yIo)xXV-Xa?5j5bEoFI^Ge;$GFM5iyS!kUb9%unZDER2s?x8e zyeh|?Nw9e3=!&dP*>WZ(&MQYO&g&Fztm2jXSC~6xMSm%^-aq8DocL`*x>p`lVLz>h zjd)Fx;=02X`tZx7;R5lqKu3G1BU)E)&Kwi delta 2110 zcmZ9Ndr*{B7{>R5gT-*cY#eb1inTews< zS{gZSv4k1K&q!Hg$zXPCWU8W6>$yr>h|f-iF00GzTx%8EP6ri%)`9Hg2CZj$7W5ud zF=zuQh8DV_oEt+#57BEAyc$~MG6|~XdC(v}$64=-bQQ zYXRO-_Fi|He3MV64`x5D#sv(32I&o#MKn1Ea?qO?eH?Ux-a_&u@4bz^k3n{N2lNR@ zrFR2{53#of-UBAQ7N5fWj5M?y203UgntaZ*4)g`ndY4t39rm#AX{x~yzlQ$})uO{G z&}rHX8U>9}9q3!ocT^Ah9(0BpKtF)&v<0(%1f8X=;*NjfJN}syjYypH0e_(;l%EIv zO55;Ae*^ta+i}1PpoeG&=nv4Jv=epXpo_E%bP05sc7v{fuF@XRUmyp)kMY;6;#(-c z`yT+WWAg^>#fY1rzo{98w-XUA0 z!^ojy;ys-=`I$1{s&rhqZs|^Z)kQ_7+!McN(TQR;ElWRVSsA9c#F-SOR&SqvFi2_F zJu^-RE2s1)RliXQ(xYdVD#}T{D)o_|_>H2LHc6?GQYWQeN`v-Q+T8HHa@j1UMN3Jy z-q#_Qol^W#x}5z}>0J*Uep8x;= delta 63 zcmZ3@w1tWLGcPX}0}$NGSv--uNuyFfH?KrLMc+5rGd`dwKPxr4q*y;YDJ4liF+DY} RBtAJmuOzWJ-e}^QdH{#T7Bm0= diff --git a/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc b/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc index 6c5836963c0c2fe412f6ee530092e81dd785c2f9..1a6e4c9363493d9b0be221b201c3976414f142a9 100644 GIT binary patch delta 57 zcmZpZ`YXx(nU|M~0SFAVR&V4!!6;v)pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+V&yBR4ky2I3QA delta 66 zcmew>*(SyPnU|M~0SIp8EZ)d{f>EPcKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvP>Kd&UQINoUUCq`~=0OZ#e_y7O^ diff --git a/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc index 79439883877a81131f504af51643c66ccd62e957..cea3ca9c89e27e5ba5ee1b8281201ba7b42a4b29 100644 GIT binary patch delta 55 zcmbQmJdv6EGcPX}0}vQ!t)9sJRK7qzH?KrLC9xz?KQSpWFC{-OzBn~EF|Q;uIX*43 JVzLBd69CP~5;*_> delta 64 zcmbQpJd2t8GcPX}0}$NKSv-;ZsYa!KZeEFgioS2KXM8|WepYI7NwI!*Qc9A3VtQ&` SNqlmCUP)qcywPNS#wGxvT@}v& diff --git a/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc b/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc index 1fffb81f904a1d66b1ea13111d0202d3cda5198d..7ed3b8000c410a9c00afc0c5831b07d5c1ef74c2 100644 GIT binary patch delta 57 zcmcbna#n@=GcPX}0}vQ!t=`D(#4KN=pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+Tj4`5_+w{WKF{ delta 66 zcmX@Ba!rN%GcPX}0}$NKS-g?kiCLpsKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvP>Kd&UQINoS;4)a4k0M}p^_W%F@ diff --git a/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc b/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc index b015c14bb4e41702938dbcf88dfd013b8a2b8b20..0f857e2848227f76ac901690ee710fd94c2d5795 100644 GIT binary patch delta 57 zcmX>laZrN$GcPX}0}vQ!t=`C8&Mcp&pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+RK)^8yY4`kNC_ delta 66 zcmX>oaY};wGcPX}0}$NKS-g?EoLQq>KR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvP>Kd&UQINoUULgob=0MyVH<^TWy diff --git a/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc b/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc index 4e40edf35a91d7f130e258cb754b00901ce14d29..385eeb5ccdf375be02163f37fbe5d80caa5f3370 100644 GIT binary patch delta 57 zcmaE@@<@gIGcPX}0}vQ!t=`BT%q(A^pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+Ti|`6(X&2@Vsl delta 66 zcmaE)@>+%aGcPX}0}$NKS-g=um|3GzKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvP>Kd&UQINoS;E%Q@80Oc$fMF0Q* diff --git a/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc index 914bae727f0c854903138793069b6b25db2e7772..d86c644c398374b02da958b1710a32ec10fb0a46 100644 GIT binary patch delta 56 zcmcb|e3hB|GcPX}0}$wIt=`D3$ta(#pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% KSur_=u?Ya#2@+%g delta 65 zcmcc0e23lTo8YKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu TuOvP>Kd&UQINoS-Fk=${tfCeA diff --git a/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc b/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc index 05e9824adaf056284f6481b823be6c35cbbc0a4c..3f8b7f64ffde4ba57377abda795fecedb91244ae 100644 GIT binary patch delta 57 zcmcb~bAgBZGcPX}0}$wIt=`CehEYCUKR2&LKP9mwQ9m&$F)t-QFTOZ6H!-gyGdVsj Lvtsjq#wZp52u~BL delta 66 zcmcb>bCZYrGcPX}0}$NGS-g?^45LPYer{fgeu}KmY&$ diff --git a/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc b/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc index 83898b8edc56dfeee37a1cb99e0dfb74c4ecec18..d598db127c1e1f98957c8f586292e4a1f93cf102 100644 GIT binary patch delta 57 zcmZ2#HOGqkGcPX}0}$wIt=`DJhgrTvKR2&LKP9mwQ9m&$F)t-QFTOZ6H!-gyGdVsj LvtsjmW;00u1eOzk delta 66 zcmbPZwbY9HGcPX}0}$NGS-g>Z53@$Cer{fgeu}J1HeeKQTQu UuOvP>Kd&UQINoUUBIZCw0ObG{(EtDd diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc index 21ce5a3a02008685f9c11124e6de500af8115262..99e6e2618558ad08abf14c0c87b4e4ff52f95809 100644 GIT binary patch delta 56 zcmcc3e2JO+GcPX}0}$wGt=`D3#VDVxpPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% KSur`5u?_&&xe{9d delta 65 zcmcb_e4Cm3GcPX}0}$NKS-g>3i&3LQKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu TuOvP>Kd&UQINoS-2xA=ptArKv diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc index 07e23de33db0a38d056b55aa3c18e5050cccef90..d54d85d9c5f61707e3b35108137df58151a614a4 100644 GIT binary patch delta 59 zcmey<&-l5Yk^3_*FBbz4=xMFq$i0wRK2tw8uS7p3u_RGHF)1-GB|k5|I5jshuOu@$ NJ}t9i^A%J1HeeKQTQu UuOvP>Kd&UQINoS;5z~EE0M5)7%>V!Z diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc index 9913bbf6e5726f89613b355ea1ed2bae67a6ceea..4932ae5d9e15d4df9be758021802a4bb9ebdf228 100644 GIT binary patch delta 57 zcmZou{j0+LnU|M~0SNT8R&V4MVUo|*&&?~*Pf09E)K5%G%uC77i!V;iP0TCFOpZ^> Ltk~?%WG?^!>vIx2 delta 66 zcmeyX(x%G&nU|M~0SIpAEZ)d1!lY56pPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!C`pI4Gt9B;JQj>%pC0K@nd(*OVf diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc index 3a3a8c72fd0eb2ed2f34445c3ab9f17253cd1f09..a7955344ad56cccb65a4d6e284388085b3fb1d97 100644 GIT binary patch delta 57 zcmdn4vrdQmGcPX}0}$wGt=`C8#3Y}mpPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+RL3(J1HeeKQTQu UuOvP>Kd&UQINoUU9HvRa0Mp|Z*#H0l diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc index ecc2d0cf7c0a8bfb7223b4aea3912aea8ea8e452..445d2bfef4927edcb93760bf964db6efd0ed901c 100644 GIT binary patch delta 57 zcmaE#_biY5GcPX}0}$wGt=`DJpG!VZKR2&LKP9mwQ9m&$F)t-QFTOZ6H!-gyGdVsj Lvtsinu38-cJc|_L delta 66 zcmaEs_dbvNGcPX}0}$NKS-g>ZKbJZF0)3ter{fgeu}I(03O( diff --git a/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc b/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc index ade5aed48131fefc6657431fb3dc46b38c5560e8..a71ccf2d4412fe06a3255a7a2b85fa42a09be860 100644 GIT binary patch delta 57 zcmZ4KxWJM7GcPX}0}$wIt=`D}k5RrYber{fgeu}5&ou_jVI5 delta 66 zcmZ4KwaJV7GcPX}0}$NKS-g>3mPw;VKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvP>Kd&UQINoTpJJTa20MMlt#Q*>R diff --git a/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc index 3fa4f4580a96881f56ec63771c4d0436c50bf31a..87f406dd6ace10e1e1eeef5c608389f74cf74d1a 100644 GIT binary patch delta 54 zcmcb?c%G5_GcPX}0}$wIt)9qjET5;Jn^&Trl30?cpO}=Gmy(|sU!0nom{*dS9G{k1 IF)^(O0K5GXHvj+t delta 63 zcmX@lc!QDqGcPX}0}$NGSv-;3SfgA&H?KrLMc+5rGd`dwKPxr4q*y;YDJ4liF+DY} RBtAJmuOzWJ-e_WM5dewT70mzu diff --git a/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc b/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc index 142868d5e629495f8be33b5c8a4235c453ff5c4b..3e0b7ae42cde6079b688932d3bcd5b04b601173c 100644 GIT binary patch delta 57 zcmbOx+AGTanU|M~0SNT9R&V5HW|q&@&&?~*Pf09E)K5%G%uC77i!V;iP0TCFOpZ^> Ltk`VEoWKqM&O{Nn delta 66 zcmeAbohHitnU|M~0SIp8EZ)e?%&bwSpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!C`pI4Gt9B;H)mpOqQ0HAdhO#lD@ diff --git a/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc index 733a8d0f08330da33f7b24958960e0abee0fdb83..696b94fa5a5a8262710d8b239dea72ee8a2ea937 100644 GIT binary patch delta 54 zcmcc1c!iPsGcPX}0}vQ!t)9qjEMKgjn^&Trl30?cpO}=Gmy(|sU!0nom{*dS9G{k1 IF)^(i0KVrEOaK4? delta 63 zcmcb@c$bm;GcPX}0}$NGSv-;3SffTiH?KrLMc+5rGd`dwKPxr4q*y;YDJ4liF+DY} RBtAJmuOzWJ-e_WMIRK3x72yB? diff --git a/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc b/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc index cb0ebebe271e34b231de61c6e39fb8d9eceb287a..6a3c582d917c9fefc255ce6a9bea3c491c166328 100644 GIT binary patch delta 57 zcmZ2ey1114GcPX}0}vQ!t=`C;!YE&^pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+RLKqo^eS5?m8g delta 66 zcmZ2nx~7!-GcPX}0}$NGS-g=ug;AqHKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvP>Kd&UQINoS;AET%x0Ps&1=l}o! diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc index 3c9f6b052ae831637e9a78a6fccfddc39b520b3c..7ba8b55e6485323bd2c594edbb0983357ffb7f17 100644 GIT binary patch delta 56 zcmeBVZD8g8%*)Hg00ahFt2c6=VwBI<&&?~*Pf09E)K5%G%uC77i!V;iP0TCFOpZ^> KteE_lu?GOp=_?Wl%JKFTvDu`os^QKpO~JS TR}!C`pI4Gt9B(xF3u6xeqka~p diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc index fcbbfdfba170cdeb06407386d4215f3d09cb648d..7eac0414ba71472adb31c5ccc19018bf2725b814 100644 GIT binary patch delta 57 zcmZn`{UyTvnU|M~0SFAVR&V5<$tYiJ1HeeKQTQu UuOvP>Kd&UQINoUUVaDwo0N246E&u=k diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc index 3bb32a12ef258f28a8935899d0d5033bfe76a16f..0e187ef96026679164476bc5ce5b1747538d820b 100644 GIT binary patch delta 57 zcmdmAv#o~vGcPX}0}vQ!t=`C8!6aX(pPN^rpORRTsGpdWn3s~D7hjy3o0wOUnH-;% LS+RLF(-dm}AzKtI delta 66 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 delta 7714 zcmbtZdvsG(x*pOT!% zjs256QYu;%Gp!Xe=n^5Rzd}l5niQ#0vN6sw<{#&z$&#H}tXHt4GfOJ;JVnYtezfN_ zX{zL4RvTESNtr*f+E?hMEGfI+L!>Gx2Tg1E(WdEObV}LGmV22kLz*t-F<6JBk@7uc zEGX$JNsN0dnbHiYfO%y})lwnjvZWfSh;ccfb1^R0Db187#93*URLrYDkw+WJHv7`5NV$>V6=oAd2YhM zme%cd4GB!7Kd#lYOdwDKpn^Vxt6K)WQSXmEzPC{H`ugJzq7+hPp-%!PI{y* z*XDF_;6LZz^-n^7uBGZHn7RJk1ZFN`^0_WryFQa9D+lO{YYgzbKv5(=#p`Jsi*`x0yyw`EDOVc zVZKyYNg4@g>oyi#A>sc|te;HANGv!R@mO-N7)vgTg-ujat_x!>yrN$r^DD#&Eh%(y zZC8!vh?ANnu1XV^gc7sHK|TyQSDUG9inhqR1}ED^CE2UowZ8=s+D?(n%5B zvoSr(HR3xmaRDz&?i_WciDc^oGniCMw{FRywvTM|cUvm5iv7hM0_ckY`)a^;b=(Y+ ztL19CeTFT4p%$W&OUF%UY0E-bt2WKp(?|C_ZFl-7NLRB(4+T(K1i|`1Q|Jf4mZb=l zyjWUNO{AqBjlZ--om@d|yuXy5f!JH<(2aA+GDJ1$M@AsKDG3$O+O4%vDYtKZC9BLo zadcEmAwqYD4{3{!4z0H**KB~-a}HZE?(x|-7y2jq%OuI8fmP#XGvLMLtT|5B#YJV#kNmm1Oz_rxU+1qkR8(qHbLBloDGU;0B8fiKGaogPf6rWAc z%{Ti#WppP{lWz}DqwiWq>wp@3n}O>-P~+VKG#hc<^w>9Zy%#;7+uI{j-K;<1b=_KtWWVueNOgYsZZZm zKkw1^!d04X;{L^eVaH8cdhQm7$IUDELa4EnNHh=)ws!?PLy=Hej-@v&UbwKaq1Ee~ z-@c@-rEXDUYh#NB-+@X@{+s>s*HP2O9PY_j{j~2T~qV3EixZ@=dPu&LMA4C3W+4!rRk4C><&U$simms+)k~5j}{>!V$y#Din{; z0ns8HpF3|RiXYT~m?nHMGYh2;?I5KKAEq}LP&}CjVy191zrKGq${#yH&JjM&ou@_d zGwdi&_^ha&p!kIg!~)@q2~L#0Bp|tjFL^hU%0Ma+zAR_9uP~&E!dHeOw0%_$(j?)l zNz8WI08*uJ+L(j3(-T0NDxB^wp3k9tz8K``!ugU}D1B1|Qnm1ni}mrX8Khalw<*ka z!3fe^;ev_valu3Cnt9%10js1btjnuMXoQkV#kn;?B&voO@eL#i!Y|4>uX4A!7&E*NGB zL-V;LCeMd_VaM~66HiOxnU;8_C!QD>`sE~^Ft^NO#pfmfL;K^lzCzP+0z2^2*BQ~j5;p>dn?##9r6M&(=*_K2VU5g zOm3&SZ+QFbmeqM#Rccu5Yx1@%s%!Nw_KAt25fKBj7~Ht7C)62=qOv=r^aikgh#kT1 zuo49OCNZ)))EzZ;_5>o4PK2(;JSzy-XI4R z2x6Tv+$}~|2gPWgB6~zB*c*_ep-vI&o*bRT!W2UhF}Oa^(+AbL3;OEWByLz8#6dD( z9GMct_7S5T7W*QBj-H_Svv52{0lB<>x1;+wDh-s&qN%Iz>HGPHgnSL;03wDCrT6j^jS( zwsGh4==Bek4Saj3OPAT1*!?+tro!J2jw9#R80qH!?K2B)NuXgrzd*^0>GZ0!TB4pMPxa zj;E(Es2Yw+8y~yPiqoy6%FZBe-Ocj2{o zvlt_M1sCCMT(g7Y!cW4{azcr53BM?d<4gb|n`EQkWaF+G^Q(n0jDBNF9*&C`ar_!% zi^$H*#+E|5r`oQUOacckE*uKYeJ@3u3{5oXYP&+5kbVaZzh@-zDY^YUpF!W@!sN!2 z2cw0SKyNr`&y=hl4II98QmRKMo24{4#n1cA{$vJn;##~PCea^WNl&#`aw8`}DcvK; z7W%~dlMEUD6v^S?rA+$a`vsFMc)zdaQB%Q7IdFl?g@1WceznfaNxIdr$kvm)G(K%I zCtK;E)eeVs^!%PWZlR>Iwe;qz271wzO6Bj2v@I=%KJ|e!Qz~R9cfxV2bZvOKWIunr z!M4}3%{ilhHouM5epp7(mPbzSs%m&7w0V6 zu`UB9{ERCr5uCFk-Jd>!+ZAtFHyRz-pdZ`M2AK6>wyAg|Ua5rceYYa_3eiZV@Ny*M z{Lwf6k!7;NWVr=Sn&?TQ){h)!`v?NuJsNS@G>mGbvTB2z;m>fvk`&=jHg=EW*wOqs zIFe5pi8P4|h_D>f+NRNm*W^}+{g}JN^ZrTu5x{PciT-B!pzy`a-%9TpEFA6o?vnkNq-?MThgisFP zVxTW_@JYEdgmLr)%13e7tpEZrMuNQu_u(D|9$|6e!bPyh_KIQLX``?sg+=H9_9ZzI zhzE=t5yl4l58H2M!bHdSpaqaY1@6wA#-|wRoKyQqCp~#8Q^&TJh4jZ$Ge_9kPqO(M ze&F!uFB5v;%QBie=%f#PKDkgiju7txaSKqggOLb)X^NTR-9xp9JHztRSJ7JsO;kNy zOurZ`qX$nfwP~ehZ&R!CGB!Slgrciy``0dAC%T2{uCEK|pP$Wz-Rr>DqE;~jEH^)H$_0*>X$t_KmwX z-eWv!DLQ6x?^TYPCLS|Y9x+uOHBC8YnsLN5nYEB~G9wH-pFF09HKc?%R8>Q+=Qjw07c|7DZF>S7nv`XL?NjjUP^<6OWkV-PtzZl3;{!U@gU?iUiY1kbM z@j3K)9?1(Tu@EnLLS0}X%lMd}K58K!=&@foyX{tYS&386UIDA}kopHJ$+SL-&1PeC ze?o3h{U0ltL)uk)DtUnat1$SdRC0-sxr2YSkqjYCMkEb;`<3|XGI-2Esx&iMdB6(b z*2LJSguaL}rW2G1g7*P|&lN$aIb8u|Q#+oCm0jxl#UzVtPy;z+R@o->!{ZlApE3&( ztx6dx;0qSVPI-x*)z@=i2DYoiIb?BJEw;m=q&$e^78DO7xedh%;9^PZ0-JimfiAV% zNeYRm?sAd}{=6{woRjn?IoQZ_afpN1CNaDvF4Dv|jSfXw2vBZ8IfU3h)hZ{j*|^d+ zHfUu%y2nTA+<^Q>B=Dh<+idLV>Gfb$hYu#3)YKBvT-J}qtw`8hWnMo1aq+1;OUU$9 z+tGIsc7GFc1<2w5Hn8HQ>_FX4AZ|yowaX9(^$qvlcnrJ!*Yb!i{w!xx2grD zWC35J9h6JSYz?_v{e2m6X5NafnEIc-TQ{jE%18;nNvj&l$#d?zv42f`B=v}P9?5ag z{66I)KgTX9d##Rs(eEzey;0m0V_=YInDEi=X41n-8 zd7PU9AIY&BR!%=bgj1v+=%>Jf`q${3h!HRiJ)uanEfQ6(gVeCv$82LUJcbB~)Bu+N zAG5PDFl=4C>azB1;j*0JOTSrtbsBN^GkI*xg2GniXe&6Xz ztVir2Ca~OyF?~DxlG@%LGpceG+0vNOp%D(A>`QWx)VkA zlCt+W6U110JNv2{>TC~0qe`d)CMVL~uDqx&olczO;X!#ixsCMKCTTN=n^HCrZQcn> z?ywda_<(9j8#XZ3$Ym7|n;4tS8S~DY8M|KN Ltk@jMY|aJ%(1H=f delta 66 zcmZn{o*>NqnU|M~0SIpAEZ)ei#;j4MpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!C`pI4Gt9B;HafZ3c40HbFWS^xk5 diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc index 57aed7e1517b89b69d528f01bc37ac370f5bac4a..fea4a01f68927e99e9f7117be2391dc9468b15a7 100644 GIT binary patch delta 2601 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 bool | None: + """Semantically decide whether the turn answers a pending parameter. + + This is intentionally separate from extraction. A parameter extractor + may be able to manufacture a syntactically valid value from unrelated + text; relevance answers the higher-level question first: does the user + appear to be responding to what the active transaction asked for? + + Returns True/False when classification succeeds and None when the + classifier is unavailable or its output cannot be trusted. + """ + if not (self.enable_llm_router and self.llm is not None): + return None + missing = [str(name) for name in (state.get("missing_parameters") or []) if str(name).strip()] + if not missing: + return None + active = state.get("active_transaction") if isinstance(state.get("active_transaction"), dict) else {} + tool_name = str(active.get("tool_name") or "").strip() + if not tool_name: + return None + payload = { + "message": str(text or ""), + "transaction": { + "intent": active.get("started_from_intent") or state.get("intent"), + "tool_name": tool_name, + "tool_description": active.get("tool_description"), + "missing_parameters": missing, + "parameter_schema": active.get("parameter_schema") or {}, + "known_arguments": active.get("arguments") or {}, + "relevant_conversation_context": ( + active.get("parameter_conversational_context") + or self._collect_transaction_parameter_context(state=state, current_text=str(text)) + ), + }, + } + system = ( + "Você decide somente se a mensagem do usuário é uma resposta pertinente ao(s) " + "parâmetro(s) que a transação ativa está pedindo. Avalie significado e contexto, " + "não palavras isoladas. Considere RELEVANT quando a mensagem fornece, esclarece, " + "corrige ou referencia plausivelmente o dado solicitado, mesmo em linguagem livre. " + "Considere NOT_RELEVANT quando a mensagem abandona a ação, inicia outro objetivo, " + "faz uma pergunta diferente ou não responde ao dado pedido. Não extraia valores e " + "não decida abandono/intent; classifique apenas pertinência. Retorne somente JSON " + "válido: {\"relevance\":\"RELEVANT|NOT_RELEVANT\",\"confidence\":0.0,\"reason\":\"...\"}." + ) + try: + answer = await self.llm.ainvoke( + [ + {"role": "system", "content": system}, + {"role": "user", "content": json.dumps(payload, ensure_ascii=False)}, + ], + temperature=0.0, + max_tokens=256, + profile_name="router", + component_name="router.transaction_parameter_relevance", + generation_name="llm.transaction_parameter_relevance", + ) + data = self._parse_json(answer) + except Exception as exc: + logger.warning("Falha ao classificar pertinência do parâmetro transacional: %s", exc) + return None + relevance = str(data.get("relevance") or "").strip().upper() + try: + confidence = float(data.get("confidence") or 0.0) + except (TypeError, ValueError): + return None + if confidence < self.intent_shift_threshold: + return None + if relevance == "RELEVANT": + return True + if relevance == "NOT_RELEVANT": + return False + return None + async def _transaction_parameter_precedence( self, state: dict[str, Any], @@ -846,11 +1076,12 @@ class EnterpriseRouter: ) -> RouteDecision | None: """Try to consume the turn under the active transaction contract first. - AWAITING_CONFIRMATION consumes an explicit confirmation before any shift - classification. COLLECTING_PARAMETERS also has precedence: if at least one - pending parameter can be extracted, the active transaction keeps ownership - of the turn. Semantic intent-shift is evaluated only when extraction returns - no usable pending parameter. + In AWAITING_CONFIRMATION, an explicit ABANDON candidate is classified + before confirmation consumption; plain yes/no responses still keep + deterministic confirmation precedence because they do not pass the + abandonment gate. In COLLECTING_PARAMETERS, ABANDON is likewise checked + before extraction, while SHIFT remains after parameter extraction so valid + referential/value answers are not stolen from the active transaction. """ tx_status = str(state.get("transaction_status") or "").strip().upper() if tx_status == "AWAITING_CONFIRMATION": @@ -966,13 +1197,14 @@ class EnterpriseRouter: *, text: str, state_decision: RouteDecision, + abandon_only: bool = False, ) -> RouteDecision | None: """Detecta semanticamente mudança de intenção durante uma transação. - Não existe lista de palavras para desistência ou mudança de assunto. Uma - interrupção nasce de uma intent diferente resolvida por uma keyword - configurada no ``routing.yaml`` ou, na ausência dela, por uma decisão - semântica do LLM com o contexto da transação pendente. + Não existe lista de palavras para desistência. ABANDON é sempre uma + decisão semântica do LLM baseada no contexto transacional. Uma possível + nova intenção pode aparecer como hint do ``routing.yaml``, mas esse hint + não decide abandono e não substitui a classificação semântica. """ active_tx = state.get("active_transaction") if isinstance(state.get("active_transaction"), dict) else {} started_intent = str(active_tx.get("started_from_intent") or "").strip() @@ -1038,18 +1270,32 @@ class EnterpriseRouter: else None ), } - system = ( - "Você decide apenas se o turno atual continua a transação ativa ou muda de intenção. " - "Use o significado da mensagem e o contexto transacional; não use palavras isoladas como regra. " - "A extração dos parâmetros pendentes já foi tentada antes desta etapa e não consumiu o turno. " - "Se ainda assim a mensagem for apenas uma resposta referencial/valor/nome ao dado pendente, retorne CONTINUE. " - "Se o usuário passou claramente a perseguir outro objetivo sem desistir explicitamente da ação atual, " - "retorne SHIFT e a nova intent permitida. " - "Se o usuário desistiu explicitamente da ação/transação atual, retorne ABANDON. " - "Quando ABANDON vier acompanhado de um novo objetivo, também informe intent e agent desse novo objetivo. " - "Quando for apenas abandono sem novo objetivo, intent e agent podem ser nulos. " - "Retorne somente JSON válido com decision, intent, agent, confidence, reason." - ) + if abandon_only: + system = ( + "Você decide somente se o usuário desistiu explicitamente da ação/transação ativa. " + "Quando a transação estava coletando parâmetros, a pertinência ao parâmetro já foi avaliada antes desta etapa; " + "portanto não transforme uma resposta pertinente ao parâmetro em abandono. " + "Use o significado completo da mensagem e o contexto transacional; não use palavras isoladas como regra. " + "Se houver desistência explícita da ação atual, retorne ABANDON. " + "Quando o abandono vier acompanhado de um novo objetivo, também informe intent e agent desse novo objetivo. " + "Quando for apenas abandono sem novo objetivo, intent e agent podem ser nulos. " + "Se a mensagem apenas fornece parâmetro, confirma contexto, ou somente muda/adiciona outro objetivo sem " + "desistir explicitamente da ação atual, retorne CONTINUE. " + "Retorne somente JSON válido com decision, intent, agent, confidence, reason." + ) + else: + system = ( + "Você decide apenas se o turno atual continua a transação ativa ou muda de intenção. " + "Use o significado da mensagem e o contexto transacional; não use palavras isoladas como regra. " + "A extração dos parâmetros pendentes já foi tentada antes desta etapa e não consumiu o turno. " + "Se ainda assim a mensagem for apenas uma resposta referencial/valor/nome ao dado pendente, retorne CONTINUE. " + "Se o usuário passou claramente a perseguir outro objetivo sem desistir explicitamente da ação atual, " + "retorne SHIFT e a nova intent permitida. " + "Se o usuário desistiu explicitamente da ação/transação atual, retorne ABANDON. " + "Quando ABANDON vier acompanhado de um novo objetivo, também informe intent e agent desse novo objetivo. " + "Quando for apenas abandono sem novo objetivo, intent e agent podem ser nulos. " + "Retorne somente JSON válido com decision, intent, agent, confidence, reason." + ) user = { "message": text, "transaction": transaction_context, @@ -1074,7 +1320,10 @@ class EnterpriseRouter: return None decision_kind = str(data.get("decision") or "").strip().upper() - if decision_kind not in {"SHIFT", "ABANDON"}: + if abandon_only: + if decision_kind != "ABANDON": + return None + elif decision_kind not in {"SHIFT", "ABANDON"}: return None confidence = float(data.get("confidence") or 0.0) if confidence < self.intent_shift_threshold: diff --git a/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc index 0a6e6f4620ce400e6095a0caaa3adacb48872253..4986b94191156131b9eea41fb595291c682847df 100644 GIT binary patch delta 54 zcmcb|bd`zwGcPX}0}vQ!t)9reRz6=pH?KrLC9xz?KQSpWFC{-OzBn~EF|Q;uIX*43 IV&a230MS$vM*si- delta 63 zcmcc0bdQPqGcPX}0}$NKSv-+@twx1@ZeEFgioS2KXM8|WepYI7NwI!*Qc9A3VtQ&` RNqlmCUP)qcywSw#bpWIY7To{< diff --git a/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc b/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc index 2fa877d076862bb9d7d541240fc59c60b89124d7..d43e74772c51ef7e62cd087e8412fd2a17c2e4c6 100644 GIT binary patch delta 27299 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 delta 21496 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 diff --git a/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc b/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc index 359fe7555dc034a5afc286ac2ead3f396a3e8d3f..506ac4d157842ac5edde238a50daab675f5886d5 100644 GIT binary patch delta 59 zcmZpi$@pUiBll-sUM>b8Fwk1Pk=un?zE(dsuS7p3u_RGHF)1-GB|k5|I5jshuOu@$ NJ}t9ib2&4YCjcr(6O{k} delta 68 zcmew{gRyZYBll-sUM>b8xSg|jBex5)Mw@8drB^N6I diff --git a/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc index 1ea33ed21c02a2e041e955618cbf48939e0e9cc8..2653f6d63037e76036e50585bc69bb8deb6d5058 100644 GIT binary patch delta 56 zcmeys_MDCTGcPX}0}vQ!t=`BzpGm$@KR2&LKP9mwQ9m&$F)t-QFTOZ6H!-gyGdVsj Kvtsfkrg;GNFB6{t delta 65 zcmaFP_JNK2GcPX}0}$NKS-g>ZK9fe3er{fgeu}L(^8=B4E4#TTdMCgzo7Cda2` LR&1_h7GMGZ&omLd delta 66 zcmZqR?&RkF%*)Hg00g&l7H{NsW7a6w&&?~*Pto@c_KXiG%FjwoE-BW}PD)AAPfSnE UD~V6e&nrnRjyKv|z%0N70HQP%QUCw| diff --git a/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc b/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc index e81dd4bfec4404adb67d959186270541f99c629b..74036e8af080422c057836f7e9aac4450dcb29f0 100644 GIT binary patch delta 57 zcmccNa^8jeGcPX}0}vQ!t=`DJj#<83KR2&LKP9mwQ9m&$F)t-QFTOZ6H!-gyGdVsj Lvtsi@=5jdz9rqL{ delta 66 zcmX@_a>IrDGcPX}0}$NKS-g>Z9kWJ*er{fgeu}EGcPX}0}vQ$t=`D}iAg?RKR2&LKP9mwQ9m&$F)t-QFTOZ6H!-gyGdVsj LvtqL<^Cc+&F0B+R delta 66 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 diff --git a/tests/__pycache__/test_transaction_parameter_llm_precedence.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_transaction_parameter_llm_precedence.cpython-313-pytest-9.0.2.pyc index d728688f7a303d95282720daf298ec673db9b0fa..cfa0343cb129e510e678bebc303528376e23e564 100644 GIT binary patch delta 2610 zcmd5-ZA?^W7QW|>bLRt?513(K`0ygIU8)SY)z&XWsiQU;RaQVpwOno{(S`_$N)iwynACq@^`(uD_r$7%uRsVYNWr zq6U3U!P=0&Q4NM0>T2s7+O%VFyVt{fJioOF7HDriS_Syl=7bgbkq1g-=2ru9(7#iD zqKO-!tqt|zkgV2+{Y;(-Avdc`ZS-?jKJy3st!l8&ubHb`b?^t=SJNq}Zb7IvV%Dlm zhoV;`#h@5Hy2U_y6oecBGrC;arkSx~UbaaPe3Bq2ah1B|oT26mLZwgy_;Q!Sp~UAW z2tr5(@(>Q}$jXbQ{$|E!4=y)^p@BSo+2D~DuTt)wZ#)85LgJTfR}4!1GCd05eHhAOG#up@V~7G4KHvr z^xlt5us1%LBIr3(Fc+?CE0kq!_fssAXNT~GD4MdqG+Jg-pNr46wcnEZM;4}11UJEc z(grDjrO_~*L!O;|M2;zf+!*PG7RoR+vR?m7?rX>Gk^9U^qzQt%wd0XYJ6z_u9EMLQ zkK+D0m~}b{M}M>P|0(a>JIkAw=S+D&2x{;DEO1`g`?_2henB=_D)oy%v2I$8>N+QO z8|>)pv{d(n*Bx}7+kVNQP-c=g*oVm|L1L5Xr+ zDHTF=WI#AFAIB6EHfLJqG?yxlpLV@i14~q#NKm=kMwB~{Lw4b95)75!rL zG9^VxRoqINlCETU^fP~pwzJG16z_y_rgz=0;425OOR>I$lZO^c2GWQT4|*L~*wZIn z;lof5j`l47!6s!M&KcXh?fks$~I_$GA*!ZWFN0lpX6` z_hNT%BP`Os>HQ3#5I^agXN#(JR=jR>9}XDqT}|yqgJsP@Ws9?w7hx-7UG3h511d| z^9y*rgp63+pRPT1tiuR#Yb)7|K2k8o!5!`rxIWL=JzBB=y*9B$bw^O3WW!vOwn zgzpp2jXYWGCucM-hxiKYZGw98Wsp_KtvnqIlKoc#+7LTJRs&hbacWBv?7){t-N0~g zG)tm=F*^H##JJds$BErVz%c7V}i#Xbuf&+hl39f3t{y+qXVC{uY zxQ73_u)+}GMC!bri>dlHZhwyD7t?t5w_ZFV711(bv`w7jIs32e^4fJ9X)9-TfKlrIyM_s*D82NEeK z67a8Nhfw}#N?8w(dtE1p&S{a%X|E`V#;4QvrF{U7^WeB9md_H%oUXZ(@ECx6BLbPz JZMbpj$alqs#OnY6 delta 2302 zcmc&#Yitx%6rMBNeRUu0w%Zq_b(TKpLTP!G0u``WpuDOu6bcl}v>i%eySv=kzP1oW z1%e1l4whF!5Mx5YKyWCcF;Kt+2vE=;3I(bKVn9&0B8C_fy?3@1eEim%%*l7p`R=*r zo_o&RL+5nAoYC1I+H8>=9mmh^SrM#1VsEfytjw+R26C&VfRsz*Mju&O;gJHe63CTm zWN)CN%I6J8iu#_VWj6X3OoXB8;RW+yPEDeTo2D!2&DSjhcXqI(P$0785xjDvP~)RO z3DkP1Twc2@pkxb`^#Q@>^)w68vVcqkzeJ=unIX9;K%}ZbtT~CJO~@pIW2N~39(QGvErVkMdq4A(|Ur=LqAT!TT6?r21+F(nRPUWW28fH z07Fd$SlXO{zDm(HIcxF|AbLtFX*1&5_Bgy#IX%*Djv_PJni$NlQg{nsZ-EP}*jbfn zCQfQ-gWxC(oleHY>XZmN8LLeeR`H+4H0MyuM;z9Eq#ur(!7C z0+HA|Zv>U6)<1(^pEu+8J{z4e>y@nxg$5*962dMyj;?!mZx$|1u@CT15$*r^t`Ytz ziwEG_<5FY9DA70^#Awkmj!zGFbx(0zY=7TI{TZ=FPZwjvSkWoQiSc4Wj=q1H*0+gI z^=$%1`bxGWNAB3fqnv?^30*oc3VTc-prP^~HBG!5UTU=<8crN3XVK2 zd2nO&!F862l$%NSQB2HRnfmzPbQ3hHlaD$9ns7mT?Z86HXw(?g*?R5~4`vC%!586; z_DUF!la7@^5$-tlmVPQFSE<<_T{FT))o@Y=@CHV9>=-zk>fL&h$Ku({gqMl4Oo(`* z<5SpzEvNDgjMipi|2x+_W}8pvWClfDwu*`>kEAG7vd2?V(FWuN{NYrhemW&=#O_N; zQ3ms6kS#^lS{IvXj+{bvsAD=B${TK?Hp1GJ;z+bN zK;N-s%Vxhfy7YLabuq!3g0Na9tO5zUX~Nb8Fx6VUk=un?K21M2uS7p3u_RGHF)1-GB|k5|I5jshuOu@$ NJ}t9ia|ttVHULJi6fgh) delta 65 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