Skip to content

持久目标 ​

目标是会话要达成的持久声明。它跨轮次、压缩和恢复保留,并且与 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 即可恢复原来的行为:

bash
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 模式。

捕获目标块 ​

用配置的标记包裹的文本块会从对话中捕获:

text
<objetivo>
Redactar el informe trimestral y validarlo con finanzas.
</objetivo>

用户写下的块会立即应用。模型写下的块会变成提案,需要你亲自应用,因此模型无法悄悄缩小目标。一条消息中有多个块时,最后一个生效。行内提及、语言不是 text 的代码围栏、以及超过 max_chars 的块会被忽略或以可见原因拒绝。

配置目标 ​

所有设置都位于 config.toml 的 [objective] 段:

toml
[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_chars2000可接受的最大目标长度;更长的文本会被拒绝,绝不截断
inject"change"提醒 agent 的时机:每次修订变化、每轮("turn")或从不("off")
max_goal_rewrites3同一目标修订最多允许重写多少个 goal
scan_max_chars32000超过此长度的消息不会被扫描目标块
box"auto"目标框可见性:"auto"、"on" 或 "off"
superuser_timeout_ms120000AskSuperUserQuestion 咨询的超时时间

目标框 ​

目标可见时,终端界面会在编辑器上方显示一个紧凑的框。折叠行显示修订号和文本开头,后面跟着 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 也会携带持久记录。