feat: 会话内 LLM 自判 goal / 自动化标记工具,不靠关键词
agent 在回合输出里写 goal-convert 块,worker 在轮次边界 排成 /goal 自后续消息、走已有 followup 转换路径把本会话 转成 goal;写 automation-create 块,worker 在轮次边界 创建自动化定义(权限 create_task、配额整轮门、创建人跟 父任务走、name 缺失自动生成、首次时刻已过去单块拒绝、 bind heartbeat 可绑回本会话)。 automations 新增 first_run_at / run_once:首次时刻只管 首次、之后按间隔算;只跑一次跑过后 is_due / due / claim 三处都不再到期(SQL 到期条件与 Python 口径共用同一 _DUE_SQL);API 创建与更新同步接受这两个字段。 刻意不向 LLM 自动注入工具指南:避免 prompt 臃肿,格式 只写进 docs/marker-tools.md 与 README,需要时由用户在 会话里手动告诉 agent;服务端不按关键词再猜意图。 单测 cloud/tests/test_session_goal_automation.py 12 项, 相关回归 218 项全过。
This commit is contained in:
1 parent
f1aab5415c
commit
e81ba8d2bf
8 files changed
+892
-51
No files matched your search
+66
-1
@@ -3,9 +3,19 @@
|
||||
适用基线:main d129f7b 上的 feat-marker-tools 分支(本地提交,未推、
|
||||
未建 PR、未部署)。本批只做四类标记工具,不要把本文档读成
|
||||
“所有 Codex app 线程工具都已实现”:handoff、worktree 创建状态、
|
||||
PR 检查诊断、automation、clock-sleep 都不在本批;MCP 真工具路
|
||||
PR 检查诊断、clock-sleep 都不在本批;MCP 真工具路
|
||||
(同轮函数返回)也不在本批。
|
||||
|
||||
新增(feat-mainline-goal 分支,本地提交,未推、未部署):
|
||||
goal-convert 与 automation-create 两个标记工具已实现,见下面
|
||||
新增的两节。注意:本批刻意**不**向 LLM 自动注入工具指南——
|
||||
不靠服务端再猜关键词、也不让每个任务的 prompt 都变长;
|
||||
agent 知道这两个工具的唯一途径,是用户在会话里手动告诉它
|
||||
(例如把下面两节的格式贴给它),或由调用方在任务 prompt 里
|
||||
自己写明。LLM 是否用它们、判成 goal 还是自动化,全由 LLM
|
||||
按用户话里的意图决定,服务端不按“收 / 每天 / 明天”这类词
|
||||
再做一次关键词判断。
|
||||
|
||||
## 一句话原理
|
||||
|
||||
agent 不用联网、不用凭证。agent 在回合输出里写标记块,本地与
|
||||
@@ -32,6 +42,61 @@ Docker 执行器都经 sandbox 的结果解析提取标记块(与 task-message
|
||||
- 容易混淆的一点:协调员的子任务本身是普通任务(不是协调员
|
||||
任务),它写标记块会被解析;它的派生代数从 0 计(见“派生护栏”)。
|
||||
|
||||
## 新增的两个工具:goal-convert 与 automation-create
|
||||
|
||||
### goal-convert:把本会话转成 goal
|
||||
|
||||
```text
|
||||
```goal-convert
|
||||
{"goal": "收 xxx 到 yyy 为止"}
|
||||
```
|
||||
```
|
||||
|
||||
- goal 必填、1-20000 字;每轮最多 1 块。转成的是新语义 goal
|
||||
(goal_mode=1、无限轮直到模型自己输出“目标已达成”),
|
||||
与服务端 /goal 转换同款,不接受 verify_command /
|
||||
goal_max_rounds。
|
||||
- 执行方式是排队,不是立即转:worker 把它排成一条
|
||||
“/goal <目标>”的自后续消息,放在本轮其它工具的报告消息
|
||||
之后——排空先跑报告那轮,再跑 /goal 那条走已有的 followup
|
||||
/goal 转换路径(plan 冲突、CAS、终局 queued 都在那条路里)。
|
||||
所以同轮其它标记块的报告不会丢在 goal 循环外。
|
||||
- 只在普通任务里有效:goal 任务与协调员任务不解析标记块。
|
||||
|
||||
### automation-create:新建自动化定义
|
||||
|
||||
```text
|
||||
```automation-create
|
||||
{"name": "看 xxx 每日", "prompt": "查看 xxx 最新并汇总",
|
||||
"interval_seconds": 86400,
|
||||
"first_run_at": "2026-10-30T09:00:00+08:00",
|
||||
"once": false, "bind": null, "repo_url": null}
|
||||
```
|
||||
```
|
||||
|
||||
- prompt 必填、1-20000 字;name 可选、1-100 字,缺失时
|
||||
worker 自动生成(`auto-<任务短 id>-<时间>-<序号>`),不会因
|
||||
重名撞上同项目已有的 active 自动化。
|
||||
- interval_seconds 可选、缺省 86400,必须是整数且在 60 到
|
||||
30*86400 之间;非法时整块跳过,不静默钳制。
|
||||
- first_run_at 可选:epoch 秒(毫秒级自动除 1000)、ISO8601
|
||||
字符串(带偏移量按偏移量算,无时区按 Asia/Shanghai 算)。
|
||||
不给表示建完即到期(沿用自动化原有语义);给了表示首次
|
||||
在该时刻跑——“每天 9 点”要写成 first_run_at=下一个 9 点 +
|
||||
interval_seconds=86400,而不是只写间隔(只写间隔会从创建
|
||||
时间起算,每天跑在创建时间那个钟点)。首次时刻已过去的块
|
||||
在 worker 层拒绝并写进报告,agent 下一轮可纠正。
|
||||
- once 可选、缺省 false;true 表示只跑一次,跑过后 is_due /
|
||||
due / claim 三处都不再到期(automations 模块的
|
||||
first_run_at / run_once 字段与 SQL 到期条件已同步改过,
|
||||
API 的创建与更新也接受这两个字段)。
|
||||
- bind 可选、缺省 null(到期独立跑新任务);"heartbeat"
|
||||
表示绑到本会话,到期唤醒本线程;"cron" 与 null 同款。
|
||||
- 每轮最多 5 块;创建人跟父任务走,须有项目 create_task
|
||||
权限,配额超限时整轮跳过。创建只是登记定义,到期执行
|
||||
仍走 automations 的 claim 门与外部触发器,不是建完就跑。
|
||||
- 只在普通任务里有效:goal 任务与协调员任务不解析标记块。
|
||||
|
||||
## 四个工具的标记格式
|
||||
|
||||
### task-create:新建平级主线任务
|
||||
|
||||
Reference in new issue
Block a user