mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-11-08 03:30:34 +00:00
scan_skill_content and the goal evaluator built their chat model inline on the Gateway event loop. When the provider reads local credential files (the Codex provider reads the Codex CLI auth.json while it is constructed), each scanned skill edit, rollback, install or agent-managed skill write, and the evaluator construction in each goal run, did synchronous file IO on the shared loop, so other requests and streams waited for it. #7484 removed the same stall for the one-shot helpers and listed these two constructors in the utils guidance as not covered. Build both providers through run_assembly, as the one-shot helpers do: the moderation model in scan_skill_content, the evaluator in evaluate_goal_completion when no model is injected, and the run worker's cached evaluator factory. A scan without app_config (the in-graph skill_manage call) also reads the live config in that pool, and its fail-closed fallback reuses that config instead of reading config.yaml again on the loop; an unreadable config still fails closed. Verdicts, the fail-open/fail-closed policy, error propagation and tracing are unchanged, and cancellation during construction never starts inference. tests/blocking_io/test_system_model_offloop.py builds a real CodexChatModel under the strict Blockbuster gate. On main the scan fell back to its fail-closed "unavailable" block, the evaluator raised BlockingError (os.stat), and the worker stood the goal down as evaluator_failed.