mirror of
https://github.com/langgenius/dify.git
synced 2026-09-05 08:48:10 +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> |
||
|---|---|---|
| .. | ||
| utils | ||
| __init__.py | ||
| _workflow_exc.py | ||
| account.py | ||
| agent_config_entities.py | ||
| agent.py | ||
| api_based_extension.py | ||
| base.py | ||
| comment.py | ||
| credential_permission.py | ||
| dataset.py | ||
| engine.py | ||
| enums.py | ||
| execution_extra_content.py | ||
| human_input.py | ||
| model.py | ||
| oauth.py | ||
| onboarding.py | ||
| provider_ids.py | ||
| provider.py | ||
| snippet.py | ||
| source.py | ||
| task.py | ||
| tools.py | ||
| trigger.py | ||
| types.py | ||
| web.py | ||
| workflow.py | ||