mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-07-09 16:08:31 +00:00
* feat(middleware): add structured tool result meta and tool-progress state machine
feat:
- Add tool_result_meta.py: ToolResultMeta dataclass (status/error_type/retryable/
recoverable_by_model/recommended_next_action/source) + normalize_tool_result and
stamp_exception_meta utilities; classifies every ToolMessage regardless of path
- Add ToolProgressMiddleware: per-(thread_id, tool_name) state machine ACTIVE →
WARNED (hint injected as HumanMessage) → BLOCKED (call short-circuited); Jaccard
near-duplicate detection for repeated successful results; auth/config/internal
errors bypass WARNED and go directly to BLOCKED; LRU-bounded thread state store
- Add ToolProgressConfig: all thresholds configurable (stagnation_threshold,
warn_escalation_count, jaccard_similarity_threshold, exempt_tools, etc.);
disabled by default (enabled: false)
- Wire ToolProgressMiddleware as outer wrapper around ToolErrorHandlingMiddleware
in _build_runtime_middlewares so it receives results already carrying
deerflow_tool_meta
fix:
- ToolErrorHandlingMiddleware now calls stamp_exception_meta on exception path and
normalize_tool_result on success path so every ToolMessage carries deerflow_tool_meta
test:
- Add test_tool_result_meta.py: 26 cases covering all classification paths,
stamp_exception_meta, and normalize_tool_result Command passthrough
- Add test_tool_progress_middleware.py: 27 cases including full async paths,
Jaccard duplicate detection, LRU eviction, hint injection, and malformed meta
passthrough
- Extend test_tool_error_handling_middleware.py: middleware ordering invariant and
meta stamping on exception
docs:
- Add tool_progress section to config.example.yaml with all fields and descriptions
- Update CLAUDE.md middleware chain documentation (entries 8-9)
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix(middleware): recoverable errors stay WARNED; fix auth keyword shadowing
fix:
- WARNED is terminal for recoverable_by_model=True errors (no_results, not_found,
permission); hint re-injected on each problem call instead of escalating to
BLOCKED, so the model can retry with different parameters (e.g. fresh query,
new URL) without being hard-blocked by a prior stagnation count.
Non-recoverable (rate_limited, transient) still escalate WARNED → BLOCKED
after warn_escalation_count more problems; auth/config/internal remain
immediately BLOCKED.
- Remove bare "api key" keyword from auth classification rule so "no api key
configured" correctly classifies as config (not auth), producing the accurate
block-reason text for the model.
docs:
- CLAUDE.md: document all three ToolProgressMiddleware transition paths
- config.example.yaml: update inline state-machine comment to match new paths
test:
- test_recoverable_errors_stay_warned_indefinitely: WARNED never escalates for
recoverable errors regardless of how many problem calls accumulate
- test_recoverable_error_re_injects_hint_past_escalation: hints continue past
the escalation zone for recoverable errors
- test_no_api_key_is_config_not_auth: regression guard for keyword shadowing fix
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix(tool_result_meta): add JSON error extraction and fix source classification
fix:
- Fix non-standard error path: source was "exception" but should be "tool_return"
- Add _extract_json_error_text to isolate JSON error fields from noisy JSON bodies
(e.g. Brave Search {"error": "...", "query": "..."} — query keywords no longer
pollute error classification)
- Add success-path JSON extraction to catch tools that return HTTP 200 with a JSON
error body (status="success" but {"error": "API key not configured"})
- Add _SEMANTIC_ZERO_ERROR_STRINGS frozenset to suppress false positives from tools
that use {"error": "none"} / {"error": "null"} / {"error": "ok"} as success signals
- Document that stamp_exception_meta always overwrites existing TOOL_META_KEY
(exception-derived classification is authoritative over tool return-time stamps)
test:
- Add parametrized regression tests for all semantic-zero error strings
- Add tests for non-standard error path source field
- Add tests for JSON error extraction (nonstd, success-path, numeric, falsy values)
- Correct test comment for test_no_api_key_is_config_not_auth
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix(tool_progress_middleware): fix 6 bugs, add terminal guard and structured logging
fix:
- H1: fix exempt_tools empty-set silently ignored — use `is not None` instead of
truthiness check so ToolProgressConfig(exempt_tools=set()) correctly disables all
exemptions
- Fix _get_block_reason creating phantom LRU entries via _get_state (write path);
now uses dict.get + explicit move_to_end on read path only
- Fix _pending memory leak: LRU eviction of _phase_states now synchronously removes
all (evicted_thread, *) keys from _pending
- Fix _assess_and_transition missing terminal guard for blocked state — a recoverable
error result could silently demote blocked → warned in concurrent-race scenarios;
early return preserves terminal semantics
- Fix recent_word_sets window: stored [-5:] but is_near_duplicate only compared [-3:];
align to [-3:] and change type list→tuple (prevents accidental in-place mutation
across dataclasses.replace shallow copies)
- Fix _format_hint missing "success" key and "continue" action: Jaccard near-duplicate
results produced the generic fallback instead of a specific actionable message
feat:
- Add structured state-transition logging (ACTIVE/WARNED/BLOCKED transitions, blocked
intercepts, hint injection debug log)
test:
- Add regression tests for all 6 bug fixes (H1, phantom LRU, pending leak, terminal
guard, window alignment, format_hint near-dup)
- Add Jaccard near-threshold boundary test (7/9 vs 8/9 Jaccard)
- Add production min_words=10 skip test for short content
- Add exempt_tools empty-set and None round-trip tests
- Add _augment_request deduplication test
- Add before_agent current-run preservation test
- Add structured logging tests (WARNED/BLOCKED/ACTIVE/intercepted/debug)
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* chore(config): remove unused backward-compat fields from ToolProgressConfig
Remove max_calls_per_intent and window_size fields that were marked
"Retained for backward compatibility; not used by the current state machine"
when the state machine was introduced. Pydantic v2 ignores unknown fields
by default, so existing config.yaml files with these keys remain valid.
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
* fix(tool_progress): address PR review and multi-agent review findings
fix:
- Remove <80-char length gate for partial_success; only _PARTIAL_MARKERS now
- Add word-boundary regex for numeric HTTP codes (401/403/404/500) to avoid
false positives like "500ms" or "4010 rows" triggering hard-block
- Add "task" to default exempt_tools (delegation primitive, not a search tool)
- Remove move_to_end() from _get_block_reason read path; blocked threads were
permanently warm in LRU, starving active threads of eviction slots
- Add _reset_blocked_states in before_agent: scope BLOCKED and WARNED states
to a single run; clear recent_word_sets so stale Jaccard windows don't cause
false near-duplicate detections in the next run
- Compute word_set() lazily (only for success results); cap content at 8192
chars to bound memory and CPU cost on large tool results
- Remove unused retryable field from ToolResultMeta (no consumer existed)
- Add isinstance-based ordering guard and warning log for missing meta
- Fix JSON-without-error-key fallback: use _UNKNOWN_ERROR instead of
classifying incidental field values (e.g. {"user_id": 401} → auth → stop)
- Fix _extract_json_error_text: use json.dumps for dict/list error fields
instead of str() which produced Python repr matching config rules spuriously
- Add "no results found"/"no content found"/"no images found" to _PARTIAL_MARKERS
so success responses with empty results trigger stagnation detection
- Fix immediate-block path to increment consecutive_problems (was left at 0)
- Fix _queue_assessment: skip phantom _pending entries for evicted threads
- Bump config_version 13→16 (upstream added 14/15; tool_progress is additive)
test:
- Update test_short_content_is_partial → test_short_terse_success_is_not_partial
- Add parametrized test_numeric_keyword_word_boundary (8 positive + negative cases)
- Add test_before_agent_resets_blocked_states_for_new_run (strengthened assertions)
- Add test_before_agent_resets_warned_states_for_new_run
- Add test_missing_meta_on_non_exempt_tool_emits_warning
- Add test_middleware_ordering_guard_raises_when_progress_is_inner
- Add test_auth_error_immediately_blocked asserts consecutive_problems == 1
- Add tests for JSON-without-error-key, dict error field, no-results partial_success
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(tool_progress): address second PR review — perf, architecture doc, concurrency note
fix:
- Extract content.lower() once before _PARTIAL_MARKERS check in normalize_tool_message;
previously computed up to 7× per call inside the generator (once per marker)
docs:
- Add division-of-labor paragraph to ToolProgressMiddleware module docstring explaining
coexistence with LoopDetectionMiddleware: result-quality guard (per-tool BLOCK) vs
call-pattern guard (whole-turn hard-stop); no shared state, no double-stop risk
- Add threading.Lock comment explaining why asyncio.Lock is not used (short critical
sections, must also protect sync wrap_tool_call path from subagent executor threads)
- Update backend/CLAUDE.md entry 8 with division-of-labor summary; fix entry 9
(remove stale retryable field reference, add missing recoverable_by_model/source)
test:
- Add test_tool_progress_and_loop_detection_coexist_without_interfering: drives both
middlewares to WARNED state simultaneously, verifies independent state, independent
hint queues, and no cross-contamination; uses snapshot copy for final assertion
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(tool_progress): reset all tool states at run boundary; fix semantic-zero test validity
fix:
- _reset_run_states (formerly _reset_blocked_states) drops the phase filter and
resets all tracked (thread, tool) pairs unconditionally at before_agent; ACTIVE
tools with sub-threshold consecutive_problems or cached recent_word_sets no longer
bleed into the next run, preventing spurious WARNED transitions on clean R2 calls
- test_normalize_json_semantic_zero_error_string_not_treated_as_error: replace
{error_value!r} f-string (produces invalid JSON with single quotes) with
json.dumps so _extract_json_error_text actually parses the payload and the
_SEMANTIC_ZERO_ERROR_STRINGS guard is exercised, not bypassed at json.loads
test:
- add test_before_agent_resets_active_state_consecutive_problems_and_word_sets to
lock the ACTIVE-phase run-boundary reset: drives tool to active/cp=1/ws≠() in R1,
asserts both fields are zero/empty after before_agent fires for R2
* docs(tool_progress): document intentional per-run reset vs LoopDetection thread-scoped retention
Addresses reviewer observation in PR #3601 that _reset_run_states diverges
from LoopDetectionMiddleware's cross-run scoping policy without explanation.
Expands the _reset_run_states docstring to record the intentional design
choice: ToolProgressMiddleware resets per-run because result-quality errors
(rate_limited, transient) are time-bound and may resolve between turns —
retaining stale counters would risk false-positive BLOCKED calls.
LoopDetectionMiddleware retains history across runs because call-pattern
loops are time-invariant. The divergence is by design, not oversight.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(middleware): restore ReadBeforeWriteMiddleware as outermost write gate
A merge conflict resolution had accidentally placed ReadBeforeWriteMiddleware
after ToolErrorHandlingMiddleware (inner), reversing the original intent from
|
||
|---|---|---|
| .. | ||
| blocking_io | ||
| fixtures/replay | ||
| support | ||
| _agent_e2e_helpers.py | ||
| _replay_fixture.py | ||
| _router_auth_helpers.py | ||
| _run_message_pagination_helpers.py | ||
| conftest.py | ||
| replay_provider.py | ||
| seed_runs_router.py | ||
| test_acp_config.py | ||
| test_additional_channel_connections.py | ||
| test_aio_sandbox.py | ||
| test_aio_sandbox_local_backend.py | ||
| test_aio_sandbox_provider.py | ||
| test_aio_sandbox_readiness.py | ||
| test_app_config_name_indexes.py | ||
| test_app_config_reload.py | ||
| test_artifacts_router.py | ||
| test_assistant_payload_replay.py | ||
| test_auth.py | ||
| test_auth_config.py | ||
| test_auth_errors.py | ||
| test_auth_middleware.py | ||
| test_auth_type_system.py | ||
| test_base_to_dict.py | ||
| test_boxlite_provider.py | ||
| test_brave_tools.py | ||
| test_browserless_client.py | ||
| test_cancel_run_idempotent.py | ||
| test_channel_connections_config.py | ||
| test_channel_connections_repository.py | ||
| test_channel_connections_router.py | ||
| test_channel_file_attachments.py | ||
| test_channel_user_id_env.py | ||
| test_channels.py | ||
| test_channels_router.py | ||
| test_check_script.py | ||
| test_checkpointer.py | ||
| test_checkpointer_none_fix.py | ||
| test_clarification_middleware.py | ||
| test_claude_provider_oauth_billing.py | ||
| test_claude_provider_prompt_caching.py | ||
| test_cli_auth_providers.py | ||
| test_client.py | ||
| test_client_e2e.py | ||
| test_client_langfuse_metadata.py | ||
| test_client_live.py | ||
| test_client_message_serialization.py | ||
| test_codex_provider.py | ||
| test_compose_default_workers.py | ||
| test_config_version.py | ||
| test_console_router.py | ||
| test_converters.py | ||
| test_crawl4ai_tools.py | ||
| test_create_deerflow_agent.py | ||
| test_create_deerflow_agent_live.py | ||
| test_credential_loader.py | ||
| test_csrf_middleware.py | ||
| test_custom_agent.py | ||
| test_dangling_tool_call_middleware.py | ||
| test_ddg_search_tools.py | ||
| test_deferred_catalog.py | ||
| test_deferred_filter_middleware.py | ||
| test_deferred_promotion_integration.py | ||
| test_deferred_setup.py | ||
| test_deferred_tool_crosscontext.py | ||
| test_deferred_tool_promotion_real_llm.py | ||
| test_delegation_ledger.py | ||
| test_delegation_ledger_live.py | ||
| test_deploy_uv_extras.py | ||
| test_detect_blocking_io_static.py | ||
| test_detect_thread_boundaries.py | ||
| test_detect_uv_extras.py | ||
| test_detector_repo_root.py | ||
| test_dev_entrypoint.py | ||
| test_dingtalk_channel.py | ||
| test_discord_channel.py | ||
| test_discord_channel_connections.py | ||
| test_docker_sandbox_mode_detection.py | ||
| test_doctor.py | ||
| test_durable_context_middleware.py | ||
| test_dynamic_context_middleware.py | ||
| test_e2b_sandbox_provider.py | ||
| test_ensure_admin.py | ||
| test_exa_tools.py | ||
| test_fastcrw_tools.py | ||
| test_features_router.py | ||
| test_feedback.py | ||
| test_feishu_parser.py | ||
| test_file_conversion.py | ||
| test_file_io.py | ||
| test_firecrawl_tools.py | ||
| test_gateway_config_freshness.py | ||
| test_gateway_docs_toggle.py | ||
| test_gateway_imports.py | ||
| test_gateway_lifespan_shutdown.py | ||
| test_gateway_run_drain_shutdown.py | ||
| test_gateway_run_recovery.py | ||
| test_gateway_runtime_cleanup.py | ||
| test_gateway_services.py | ||
| test_github_agents_config.py | ||
| test_github_app_auth.py | ||
| test_github_channel.py | ||
| test_github_dispatcher.py | ||
| test_github_identity.py | ||
| test_github_prompts.py | ||
| test_github_registry.py | ||
| test_github_token_plumbing.py | ||
| test_github_triggers.py | ||
| test_github_webhooks.py | ||
| test_goal_runtime.py | ||
| test_goal_worker.py | ||
| test_groundroute_tools.py | ||
| test_guardrail_middleware.py | ||
| test_harness_boundary.py | ||
| test_harness_packaging.py | ||
| test_infoquest_client.py | ||
| test_initialize_admin.py | ||
| test_input_sanitization_middleware.py | ||
| test_internal_auth.py | ||
| test_interrupt_serialization.py | ||
| test_invoke_acp_agent_tool.py | ||
| test_jina_client.py | ||
| test_jsonl_event_store_async_io.py | ||
| test_langgraph_auth.py | ||
| test_lead_agent_model_resolution.py | ||
| test_lead_agent_prompt.py | ||
| test_lead_agent_skills.py | ||
| test_llm_error_handling_middleware.py | ||
| test_local_bash_tool_loading.py | ||
| test_local_sandbox_command_timeout.py | ||
| test_local_sandbox_encoding.py | ||
| test_local_sandbox_path_regex_cache.py | ||
| test_local_sandbox_provider_mounts.py | ||
| test_local_sandbox_virtual_path_contract.py | ||
| test_local_skill_storage_write.py | ||
| test_logging_config.py | ||
| test_logging_level_from_config.py | ||
| test_loop_detection_config.py | ||
| test_loop_detection_middleware.py | ||
| test_mcp_client_config.py | ||
| test_mcp_config_secrets.py | ||
| test_mcp_custom_interceptors.py | ||
| test_mcp_file_migration.py | ||
| test_mcp_oauth.py | ||
| test_mcp_session_pool.py | ||
| test_mcp_sync_wrapper.py | ||
| test_memory_prompt_injection.py | ||
| test_memory_queue.py | ||
| test_memory_queue_user_isolation.py | ||
| test_memory_router.py | ||
| test_memory_staleness_review.py | ||
| test_memory_storage.py | ||
| test_memory_storage_user_isolation.py | ||
| test_memory_thread_meta_isolation.py | ||
| test_memory_updater.py | ||
| test_memory_updater_user_isolation.py | ||
| test_memory_upload_filtering.py | ||
| test_migration_user_isolation.py | ||
| test_mindie_provider.py | ||
| test_model_config.py | ||
| test_model_factory.py | ||
| test_multi_worker_postgres_gate.py | ||
| test_multiturn_message_stream_graph_integration.py | ||
| test_oidc_auth.py | ||
| test_openapi_operation_ids.py | ||
| test_owner_isolation.py | ||
| test_patched_deepseek.py | ||
| test_patched_mimo.py | ||
| test_patched_minimax.py | ||
| test_patched_openai.py | ||
| test_patched_stepfun.py | ||
| test_paths_user_isolation.py | ||
| test_persistence_autogen_script.py | ||
| test_persistence_bootstrap.py | ||
| test_persistence_bootstrap_concurrency.py | ||
| test_persistence_bootstrap_pg_lock.py | ||
| test_persistence_bootstrap_regression.py | ||
| test_persistence_bootstrap_sqlite_lock.py | ||
| test_persistence_bootstrap_url.py | ||
| test_persistence_migrations_env.py | ||
| test_persistence_scaffold.py | ||
| test_persistence_timezone.py | ||
| test_present_file_tool_core_logic.py | ||
| test_provisioner_kubeconfig.py | ||
| test_provisioner_pvc_volumes.py | ||
| test_provisioner_request_threading.py | ||
| test_read_before_write_middleware.py | ||
| test_read_file_tool_binary.py | ||
| test_readability.py | ||
| test_reflection_resolvers.py | ||
| test_reload_boundary.py | ||
| test_remote_sandbox_backend.py | ||
| test_replay_golden.py | ||
| test_replay_provider.py | ||
| test_run_event_store.py | ||
| test_run_event_store_by_run_index.py | ||
| test_run_event_store_filter.py | ||
| test_run_event_store_pagination.py | ||
| test_run_events_endpoint.py | ||
| test_run_journal.py | ||
| test_run_manager.py | ||
| test_run_naming.py | ||
| test_run_repository.py | ||
| test_run_worker_rollback.py | ||
| test_runs_api_endpoints.py | ||
| test_runtime_channel_config_merge.py | ||
| test_runtime_lifecycle_e2e.py | ||
| test_runtime_paths.py | ||
| test_safety_finish_reason_graph_integration.py | ||
| test_safety_finish_reason_middleware.py | ||
| test_safety_termination_detectors.py | ||
| test_sandbox_audit_middleware.py | ||
| test_sandbox_memory_profile_script.py | ||
| test_sandbox_middleware.py | ||
| test_sandbox_orphan_reconciliation.py | ||
| test_sandbox_orphan_reconciliation_e2e.py | ||
| test_sandbox_provider_lifecycle.py | ||
| test_sandbox_search_tools.py | ||
| test_sandbox_tools_security.py | ||
| test_sandbox_windows_path_normalization.py | ||
| test_scan_changed_blocking_io.py | ||
| test_scheduled_task_claims.py | ||
| test_scheduled_task_lifecycle.py | ||
| test_scheduled_task_models.py | ||
| test_scheduled_task_repository.py | ||
| test_scheduled_task_router.py | ||
| test_scheduled_task_router_behavior.py | ||
| test_scheduled_task_schedules.py | ||
| test_scheduled_task_service.py | ||
| test_searxng_client.py | ||
| test_security_scanner.py | ||
| test_serialization.py | ||
| test_serialize_message_content.py | ||
| test_serper_tools.py | ||
| test_serve_nginx_stop.py | ||
| test_setup_agent_e2e_user_isolation.py | ||
| test_setup_agent_http_e2e_real_server.py | ||
| test_setup_agent_tool.py | ||
| test_setup_wizard.py | ||
| test_should_ignore_name.py | ||
| test_skill_catalog.py | ||
| test_skill_container_path_defaults.py | ||
| test_skill_context.py | ||
| test_skill_describe.py | ||
| test_skill_manage_tool.py | ||
| test_skill_permissions.py | ||
| test_skill_request_scoped_secrets.py | ||
| test_skill_storage_lifecycle.py | ||
| test_skills_archive_root.py | ||
| test_skills_bundled.py | ||
| test_skills_custom_router.py | ||
| test_skills_installer.py | ||
| test_skills_loader.py | ||
| test_skills_parser.py | ||
| test_skills_router_authz.py | ||
| test_skills_validation.py | ||
| test_slack_channel_connections.py | ||
| test_slash_skills.py | ||
| test_sse_format.py | ||
| test_stateless_runs_owner_isolation.py | ||
| test_stream_bridge.py | ||
| test_subagent_checkpointer_isolation.py | ||
| test_subagent_deferred_promotion_integration.py | ||
| test_subagent_executor.py | ||
| test_subagent_limit_middleware.py | ||
| test_subagent_prompt_security.py | ||
| test_subagent_skills_config.py | ||
| test_subagent_status_contract.py | ||
| test_subagent_step_events.py | ||
| test_subagent_timeout_config.py | ||
| test_subagent_token_collector.py | ||
| test_suggestions_router.py | ||
| test_summarization_middleware.py | ||
| test_summarization_summary_text.py | ||
| test_support_bundle.py | ||
| test_system_message_coalescing_middleware.py | ||
| test_task_tool_core_logic.py | ||
| test_task_tool_usage_recorder.py | ||
| test_telegram_channel_connections.py | ||
| test_thread_data_middleware.py | ||
| test_thread_messages_feedback.py | ||
| test_thread_meta_repo.py | ||
| test_thread_regenerate_prepare.py | ||
| test_thread_run_messages_pagination.py | ||
| test_thread_state_promoted.py | ||
| test_thread_state_reducers.py | ||
| test_thread_token_usage.py | ||
| test_threads_router.py | ||
| test_tiktoken_cache_and_count_tokens.py | ||
| test_title_generation.py | ||
| test_title_middleware_core_logic.py | ||
| test_todo_middleware.py | ||
| test_token_budget_middleware.py | ||
| test_token_usage.py | ||
| test_token_usage_by_model.py | ||
| test_token_usage_config.py | ||
| test_token_usage_middleware.py | ||
| test_tool_args_schema_no_pydantic_warning.py | ||
| test_tool_deduplication.py | ||
| test_tool_error_handling_middleware.py | ||
| test_tool_error_handling_subagent_stamp.py | ||
| test_tool_output_budget_middleware.py | ||
| test_tool_output_truncation.py | ||
| test_tool_progress_middleware.py | ||
| test_tool_result_meta.py | ||
| test_tool_search.py | ||
| test_trace_context.py | ||
| test_trace_middleware.py | ||
| test_tracing_config.py | ||
| test_tracing_factory.py | ||
| test_tracing_metadata.py | ||
| test_tui_app.py | ||
| test_tui_cli.py | ||
| test_tui_cli_main.py | ||
| test_tui_command_registry.py | ||
| test_tui_composer.py | ||
| test_tui_input_history.py | ||
| test_tui_message_format.py | ||
| test_tui_overlays.py | ||
| test_tui_palette.py | ||
| test_tui_palette_render.py | ||
| test_tui_persistence.py | ||
| test_tui_render.py | ||
| test_tui_runtime.py | ||
| test_tui_session.py | ||
| test_tui_view_state.py | ||
| test_update_agent_e2e_user_isolation.py | ||
| test_update_agent_tool.py | ||
| test_uploads_manager.py | ||
| test_uploads_middleware_core_logic.py | ||
| test_uploads_router.py | ||
| test_user_context.py | ||
| test_user_scoped_skill_storage.py | ||
| test_utils_messages.py | ||
| test_utils_time.py | ||
| test_uvicorn_reload_exclude.py | ||
| test_view_image_middleware.py | ||
| test_view_image_tool.py | ||
| test_vllm_provider.py | ||
| test_wait_disconnect_handling.py | ||
| test_warm_pool_lifecycle.py | ||
| test_wechat_channel.py | ||
| test_worker_langfuse_metadata.py | ||
| test_worker_subagent_persistence.py | ||
| test_workspace_changes.py | ||
| test_write_file_tool_size_guard.py | ||