mirror of
https://github.com/langgenius/dify.git
synced 2026-09-08 11:04:27 +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> |
||
|---|---|---|
| .. | ||
| agent | ||
| app | ||
| base | ||
| callback_handler | ||
| datasource | ||
| entities | ||
| extension | ||
| external_data_tool | ||
| file | ||
| helper | ||
| llm_generator | ||
| logging | ||
| mcp | ||
| memory | ||
| model_runtime | ||
| moderation | ||
| ops | ||
| plugin | ||
| prompt | ||
| rag | ||
| repositories | ||
| schemas | ||
| telemetry | ||
| tools | ||
| trigger | ||
| variables | ||
| workflow | ||
| __init__.py | ||
| test_file.py | ||
| test_model_manager.py | ||
| test_provider_configuration.py | ||
| test_provider_manager.py | ||
| test_trigger_debug_event_selectors.py | ||