持久目标
目标是会话要达成的持久声明。它跨轮次、压缩和恢复保留,并且与 goal 分离:goal 是推进目标的其中一次尝试。
目标功能和 agent 驱动的模式切换默认开启。用 NEXGEN_EXPERIMENTAL_OBJECTIVE=0 和 NEXGEN_EXPERIMENTAL_AGENT_MODES=0 关闭它们。允许 agent 进入 Plan 模式或 Swarm 模式的 ModeControl 工具还需要 [modes] agent_control = true,这也是默认值。
目标是什么
目标是一段短文本,带有单调递增的修订号和来源(user 或 model)。它没有终态:只能设置、替换或清除。每次变化都会写入会话 wire,因此恢复时会被重建。
目标变化时,NexgenK 在会话流上发布 objective.updated 事件。该事件与 goal.updated 分离,所以更新目标不会清除 goal,也不会推进排队的 goal。
启用目标
两个开关默认开启。设为 0 即可恢复原来的行为:
NEXGEN_EXPERIMENTAL_OBJECTIVE=0 NEXGEN_EXPERIMENTAL_AGENT_MODES=0 nexgenk设置 NEXGEN_EXPERIMENTAL_OBJECTIVE=0 后,界面保持原样:不捕获目标,不显示目标框,也不会注册 SetObjective 和 AskSuperUserQuestion 工具。设置 [modes] agent_control = false 后 agent 不能自行切换模式;设置 [swarm] allow_agent_entry = false 后 agent 不能为当前轮次开启 Swarm 模式。
捕获目标块
用配置的标记包裹的文本块会从对话中捕获:
<objetivo>
Redactar el informe trimestral y validarlo con finanzas.
</objetivo>用户写下的块会立即应用。模型写下的块会变成提案,需要你亲自应用,因此模型无法悄悄缩小目标。一条消息中有多个块时,最后一个生效。行内提及、语言不是 text 的代码围栏、以及超过 max_chars 的块会被忽略或以可见原因拒绝。
配置目标
所有设置都位于 config.toml 的 [objective] 段:
[objective]
markers = ["<objetivo>"]
max_chars = 2000
inject = "change"
max_goal_rewrites = 3
scan_max_chars = 32000
box = "auto"
superuser_timeout_ms = 120000| 键 | 默认值 | 作用 |
|---|---|---|
markers | ["<objetivo>"] | 界定目标块的文本标记 |
max_chars | 2000 | 可接受的最大目标长度;更长的文本会被拒绝,绝不截断 |
inject | "change" | 提醒 agent 的时机:每次修订变化、每轮("turn")或从不("off") |
max_goal_rewrites | 3 | 同一目标修订最多允许重写多少个 goal |
scan_max_chars | 32000 | 超过此长度的消息不会被扫描目标块 |
box | "auto" | 目标框可见性:"auto"、"on" 或 "off" |
superuser_timeout_ms | 120000 | AskSuperUserQuestion 咨询的超时时间 |
目标框
目标可见时,终端界面会在编辑器上方显示一个紧凑的框。折叠行显示修订号和文本开头,后面跟着 ctrl+r。按 ctrl+r 展开或折叠。展开后完整文本会换行,框体最多保留八行,并在框内滚动。目标框居中显示,最宽不超过 76 列。
box = "off" 时目标框隐藏。box = "auto" 时,有目标就显示;终端很矮时会自动折叠,让审批提示和编辑器仍能放下。
目标与 goal 及重写
目标说了算,goal 为其服务:
- 为目标创建的 goal 会记录它来自哪个修订(
derivedFrom与derivedFromRevision)。 - 当 goal 处于
blocked且目标仍然成立时,agent 会把 goal 改小,而不是放弃。 - 重写预算由
max_goal_rewrites(默认 3)控制。预算用尽后,agent 停止重写并向你报告阻塞原因。 - 新的目标修订会重置重写预算。
- 目标不会自行完成。工作变化时,请清除或替换它。
无界面命令
在 print 模式下,NexgenK 会直接解释两个命令,不把它们发给模型:
| 命令 | 作用 |
|---|---|
/objective set <text> | 把文本应用为当前目标 |
/objective apply | 应用待处理的模型提案 |
文本输出时,修订号在 stderr 上报告一次,格式为 Objective (revision N): ...。使用 --output-format stream-json 时,每一行都是 JSON 对象;目标变化是一行 {"role":"meta","type":"objective.updated",...},写在任何尚未关闭的 thinking 块关闭之后。
REST 与 SDK
服务端在会话上暴露持久目标:
| 方法 | 路径 | 用途 |
|---|---|---|
GET | /api/v1/sessions/{session_id}/objective | 读取记录,包括待处理提案 |
PUT | /api/v1/sessions/{session_id}/objective | 用 { "text": "..." } 设置目标 |
DELETE | /api/v1/sessions/{session_id}/objective | 清除目标 |
POST | /api/v1/sessions/{session_id}/objective/apply | 应用待处理提案 |
SDK 提供相同操作:session.getObjective()、session.setObjective()、session.clearObjective() 和 session.applyObjective()。即使会话没有 goal,ResumedAgentState.objective 也会携带持久记录。