agent-Specialization/cache_research/gateway/phase12_implementation_plan.md
JOJO 652c160640 feat(runtime): 抽出 RuntimeService 公共任务入口,任务线程拆除 Flask 隐式上下文
Gateway 化阶段一/二实施(公共任务入口),计划与验收记录见 cache_research/gateway/phase12_implementation_plan.md;契约文档 docs/runtime_contract.md 为本地文档按仓库惯例不入库

- 新增 server/runtime/:RuntimeContext 三层模型(TrustedPrincipal/TaskParams/InternalDirectives)+ RuntimeService(create_task/cancel/guidance/queue/get_task_events)
- create_chat_task 强制显式 session_data(缺失 ValueError,i18n key tasks.missing_session_data);6 处调用点迁移至 runtime_service.create_task()(tasks/api、api_v1、workflow_runtime_api x2、chat_flow_task_main x2),门闸 token 移交与 notice 互斥豁免语义保留
- _run_chat_task 拆除 test_request_context 桥,任务线程全程 RuntimeIdentity 驱动
- 审批超时经 terminal._approval_timeout_seconds 透传至工具循环 4 个 _wait_* 调用点(默认 3600s 语义不变)
- 附带:config/_load_dotenv 容忍沙箱禁读 .env;AGENTS.md 同步结构

测试:改造相关 24/24 全绿(冒烟 6 + runtime_service 10 + model_persistence 4 + identity 路由 4);真实环境验证已由用户人工完成

Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
Co-authored-by: Codex powered by ChatGPT-6-Astra <codex@example.com>
2026-09-07 16:16:12 +08:00

7.3 KiB
Raw Blame History

阶段一/二实施计划记录

日期2026-09-07 上游文档:gateway_work_plan.md(三阶段路线)、eval_summary.md(范围与复杂度评估,含 R1-R6 审阅修订) 范围:阶段一(契约文档)+ 阶段二(公共任务入口);阶段三定时任务未讨论功能与实现,明确不做。

目标

按 work plan 阶段一/二的完成标准交付:

  • 阶段一:docs/runtime_contract.md 落地——状态责任表、概念对齐、公共入口上下文契约、调用方迁移表、回归用例清单。目标入口的状态修改路径和执行裁决可定位;已有保障成为明确约束。
  • 阶段二:不创建浏览器会话、不伪造 HTTP 请求,能通过显式身份和资源上下文启动一次受控任务、读取结果并取消;同对话重入仍受门闸保护;现有 Web/CLI 行为兼容。

阶段二设计决策(按 R4 审阅意见)

RuntimeContext 三层分离

TrustedPrincipal   可信身份与资源范围username / workspace_id / host_mode /
                   host_workspace_id / is_api_user / role
                   ——只能由适配层认证后构造,客户端不可自报
TaskParams         本次任务参数message / images / videos / files / model_key /
                   run_mode / thinking_mode / max_iterations / conversation_id /
                   goal_mode / skill_context_messages / message_source
InternalDirectives 内部执行信息main_task_gate_token / auto_user_message_event /
                   auto_user_message_payload / preceding_user_notices /
                   approval_timeout_seconds仅透传机制默认语义不变
                   ——普通客户端不可提交,仅内部调用方(通知链/工作流/派发器)使用

默认值解析优先级:本次显式传参 > 对话元数据绑定 > 会话/用户偏好快照 > 系统默认。 会话配置恢复(模型/模式)仍在 get_user_resources + 会话加载链路内完成RuntimeContext 携带的是「本次覆盖」与「身份快照」,不替代既有恢复逻辑。

RuntimeService 最小接口集

  • create_task(principal, params, directives) -> task_id(受理:互斥裁决 + 登记 + 起执行)
  • cancel_task(username, task_id)
  • enqueue_runtime_guidance / enqueue_runtime_pending_message / remove_runtime_pending_message / promote_runtime_pending_to_guidance
  • get_task / get_task_events(username, task_id, offset)内部查询接口CLI/定时任务不必走 HTTP
  • 审批回答复用现有三个 manager通过明确关联接入不进 RuntimeService 首版。

两步走

  • 步骤①(兼容期)RuntimeContext + RuntimeService 骨架落地,create_chat_task 接受显式上下文6 处调用点迁移;test_request_context保留作为兜底(显式快照灌回 session 的既有行为不变)。
  • 步骤②(拆桥)get_user_resources 增加显式参数变体principal + 快照参数),_apply_workspace_personalization_preferences 参数化,auth_helpers 提供显式 record/role 入口;_run_chat_task 改走显式路径后删除 test_request_context 桥;ensure_conversation_loaded 的 session 回写移出任务路径。

关键风险与对策

  1. get_user_resources 参数化最高风险host_mode/is_api_user 分支选错 → 静默串工作区。对策:显式变体与现有 web 路径并存,先任务线程单点切换,回归验证后再推广。
  2. 门闸 token 移交语义InternalDirectives 原样承载;通知链「预占→移交→认领→失败回滚」不变。
  3. task_type="notice" 互斥豁免保留。
  4. 异常回退路径chat_flow_task_main.py:645-675 直接执行 handle_task_with_sender保留语义验收覆盖其门闸/事件/取消生命周期。
  5. 事件前台干扰:阶段二不加 source 字段(阶段三产品决策),现有行为不变。

验收

  • python3 -m py_compile 触及文件全过
  • python -m pytest test/test_server_refactor_smoke.py -q 通过
  • 新增测试:显式上下文(无 HTTP 请求)受理任务 → 拒绝同对话并发 chat 任务 → 取消;不触达真实模型调用
  • 服务重启与人工验证交用户执行(不擅自重启 8091/8092

实施结果2026-09-07 完成,待 commit

状态:阶段一/二代码工作全部完成,改造相关测试 24/24 全绿;工作区改动未提交。

阶段一交付

  • docs/runtime_contract.md概念对齐Session/Run/Schedule/Occurrence/Event、10 项状态责任表、已有保障约束清单、RuntimeService 契约(含 RuntimeContext 三层模型定义、调用方迁移表、12 项回归用例 T01-T12。

阶段二交付

  • 新建 server/runtime/ 包:
    • context.pyRuntimeContext 三层模型TrustedPrincipal / TaskParams / InternalDirectivesfrom_terminal()principal_from_session_snapshot()to_session_data()
    • service.pyRuntimeServicecreate_task / cancel / guidance / queue / get_task_events+ 进程级单例 runtime_service
  • TaskManager.create_chat_task 强制显式 session_data缺失即 ValueErrori18n key tasks.missing_session_data)。
  • 6 处调用点全部迁移到 runtime_service.create_task()server/tasks/api.pyserver/api_v1.pyserver/workflow_runtime_api.py×2、server/chat_flow_task_main.py×2完成通知派发 :613、多智能体 idle 派发 :1416。门闸 token 移交、task_type="notice" 互斥豁免语义原样保留。
  • server/context.py989 行)拆分为 server/context/ 子包identity / broadcast / personalization / usage / upload / conversation / resources / decorators / reaper 共 9 模块 + __init__.py 兼容 re-export外部 import 路径不变)。
  • get_user_resources 参数化:新增 RuntimeIdentity 显式身份快照(定义在 server/context/identity.pyruntime 包引用之,依赖方向自下而上无循环)。
  • test_request_context 桥已拆除server/tasks/models.py::_run_chat_task 不再建立 Flask 请求上下文,任务线程全程 RuntimeIdentity 驱动。
  • 审批超时透传管道terminal 属性 _approval_timeout_seconds(默认语义 3600s 不变),_run_chat_task setattr → server/chat_flow_tool_loop.py::_approval_timeout_for() helper → 4 个 _wait_* 调用点。
  • 附带修复:config/_load_dotenv 对禁读 .env 的沙箱环境加 try/except不再 PermissionError 崩溃)。

测试验收

  • 改造相关 24/24 全绿:test_server_refactor_smoke6+ test_runtime_service10新增+ test_conversation_model_persistence4patch 目标随迁)+ test_runtime_identity_resources4新增覆盖 get_user_resources 的 web/host/api 身份路由)。
  • 存量失败 4 项conversation_workspace_storage / host_workspace_manager / skills_manager / token_usage_extractor经甄别与本次改动零相关未修。

遗留待办

  1. 真实运行环境验证Web 聊天 / 停止 / 审批 / workflow 激活 / 多智能体派发需用户重启服务后人工完成——get_user_resources 分支选错会静默串工作区,这是最高风险点。
  2. 审批条目 task_id 恒 None静态疑点待运行时验证
  3. socket 软 stop 不打断审批等待REST 硬取消可以),留待阶段三或独立决策。