mirror of
https://github.com/langgenius/dify.git
synced 2026-09-08 02:43:49 +08:00
The occurrence selector tells a per-call list from a single call's list value by length alone. One test pinned the side where that is unambiguous -- a 3-element list against 2 calls, replayed whole. The side that decides whether the rule is safe is the other one: a tool called n times whose single stored value is a list of length n. That case was decided by the rule and described by no test, so it read as an oversight rather than a decision. Pin it at both readers. The replay reader in base_agent_runner and the display reader on MessageAgentThought each get a two-call record whose one stored value is a two-element list, asserting that call 1 reads element 0 and call 2 reads element 1 -- what the rule does today. The name says what the case concedes rather than what it asserts. The docstrings say why the asymmetry is tolerable. observation values are always str: ToolEngine.agent_invoke is typed -> tuple[str, list[str], ToolInvokeMeta] and both runners store element 0, so a list under a tool name is not a shape any writer produces and the length check is defensive there. tool_input values are json.loads of the model's arguments with no shape check, so a legacy list-valued input is possible in principle, and that is the side the collision can reach. The selector is defined twice, identically, because models/ importing from core/agent/ is the worse layering trade and the reverse is odd. Neither copy is in the wrong place, so each now names the other and says the duplication is deliberate -- enough for a future editor to find both. No behaviour change: the condition, the ordering and the fallback are untouched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| test_account_models.py | ||
| test_agent_config_entities.py | ||
| test_agent.py | ||
| test_app_models.py | ||
| test_base.py | ||
| test_comment_models.py | ||
| test_conversation_variable.py | ||
| test_dataset_models.py | ||
| test_end_user_type.py | ||
| test_enums_creator_user_role.py | ||
| test_file_input_compat.py | ||
| test_model.py | ||
| test_plugin_entities.py | ||
| test_provider_models.py | ||
| test_recipient_type_label.py | ||
| test_snippet.py | ||
| test_tool_models.py | ||
| test_types.py | ||
| test_workflow_models.py | ||
| test_workflow_node_execution_offload.py | ||
| test_workflow.py | ||