feat: goal 模式新语义——prompt 即目标,无验收命令,不限轮次,模型宣告完成 (#67)

console 打勾 goal 模式时不再有专用 goal 文本、验收命令、轮次
三个输入(已移除,换成说明行),只发 goal_mode=1;server 侧
goal_mode=1 时 goal 存 prompt、验收命令空、轮次存 0,带验收
命令或与计划模式同用时 400,旧的带验收命令任务照原样可用。

host.py goal 循环:verify 为空时不跑验测,轮次提示里写明
标记约定;模型在完整跑完的回合末尾单独一行输出“目标已
达成”即达标(超时回合的部分文本含标记也不算);--max-rounds
0 为不限轮次,goal-resume 续跑按 0 处理(不用 or 兜底成 3)。
刹车只有取消与预算耗尽(后者记 interrupted、可续跑)。

迁移与 worker:tasks 加 goal_mode 列(server 迁移、worker 列
补齐、PG schema 三处同步);worker 按 goal_mode 或
verify_command 判定 goal 路径,重试与后续消息排空对新语义
同样只跑一次/不排空;Local/Docker goal_task 的 --verify 可选、
--max-rounds 0 原样传。

Co-authored-by: host <host@test.local>
This commit is contained in:
openqjandhost authored and GitHub committed 2026-10-27 03:54:48 +08:00
1 parent 4179fb1a0a
commit c86b450851
10 files changed
+519 -108

No files matched your search

+18 -5
View File
@@ -333,11 +333,24 @@ class TestGoalExecutors(unittest.TestCase):
self.assertEqual(result["status"], "failed")
self.assertIn("请新建任务", result["goal_error"])
def test_local_goal_task_requires_verify(self):
with self.assertRaises(ValueError):
LocalExecutor("/fake/host.py",
runner=lambda cmd: None).goal_task(
{"id": "t1", "prompt": "do it"})
def test_local_goal_task_without_verify_is_llm_decided(self):
# 新语义:没有验收命令不再抛错——走模型自决分支:
# 命令里没有 --verify,轮次缺省仍为 3(任务行没写时)。
seen = []
def fake(cmd):
seen.append(list(cmd))
return SimpleNamespace(
returncode=0,
stdout="goal met after rounds\n",
stderr="")
result = LocalExecutor("/fake/host.py",
runner=fake).goal_task(
{"id": "t1", "prompt": "do it"})
self.assertEqual(result["status"], "completed")
self.assertNotIn("--verify", seen[0])
self.assertEqual(seen[0][seen[0].index("--max-rounds") + 1], "3")
def test_base_goal_task_not_implemented(self):
with self.assertRaises(NotImplementedError):