feat: delegate_task/cancel_delegate_task 前台工具(issue #55) #59
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/55-delegate-task-tools"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #55
这个 PR 做了什么
实现 issue #55「delegate_task/cancel_delegate_task 前台工具 + 任务登记表」。这是深挖任务委托(issue #52 PRD)的前台触发入口——用户显式请求 → 模型登记任务 → 当轮应声 → 后台异步跑 #54 的执行核。本片暂不接完成后的送回(issue #56 的范围)。
进程内任务登记表(
delegate_task.py)DelegatedTaskRegistry:per-chat_id 至多一条运行中任务句柄,内存字典不落盘(ADR-0020"备注"节已拍板,同_pending_flushes/_pending_followup_checks先例)——进程崩溃/重启即丢失在途任务,不重放RuntimeLoop触发持久存在(同storage/_silence_window先例):__init__.py构造一个进程级单例,经RuntimeLoop构造函数注入两个新增 core 原生工具(
tools.py)delegate_task(description):不经工具港(同note_pending_intent/search_memory先例)cancel_delegate_task(task_id?)RUN_LIMIT_EXEMPT_TOOL_NAMES(原OUTPUT_TOOL_NAMES,本次改名——不计入本轮run_limit,ADR-0020"本身不是当轮消耗的一步推理,真正的推理工作在后台异步跑")RuntimeLoop 工具处理器
_handle_delegate_task:先查登记表判重——已有任务在跑时直接返回可读的"已有任务在跑"结果,不新起第二个;否则asyncio.create_task启动 #54 的执行核并登记,不阻塞当轮_handle_cancel_delegate_task:真中断(task.cancel()),找不到对应任务(或task_id不匹配)视为无操作,fail-closed 不报错阻断对话_run_delegated_task:后台任务包装,收尾(正常完成或被取消)后从登记表移除自己测试
test_delegate_task.py:登记表纯单测,含真实asyncio.Task取消语义验证test_delegate_task_tools.py:RuntimeLoop.run()脚本化对话测试——登记+同轮应声、去重、跨 chat 隔离、run_limit豁免、真中断、fail-closed、端到端验证登记的任务确实驱动 #54 执行核(显式await任务让其在受控脚本下真正跑完)全部 878 个测试通过,
ruff check/ruff format干净。Code review
跑过
/code-review(Standards + Spec 两轴并行子智能体):OUTPUT_TOOL_NAMES语义已超出"输出类工具"范畴(新增两个工具豁免 run_limit 的理由不同),改名为RUN_LIMIT_EXEMPT_TOOL_NAMES;②_run_delegated_task的try/finally缺少异常可观测性说明,补充文档解释为何不加except(模块刻意框架无关,不依赖nonebot.log,同既有 fire-and-forget 任务一致的已接受风险敞口)