☰
什么是 Loop Engineering?它和 Harness Engineering 有什么不同?TaoToken 配置骨架与验证动作
2026/9/29 20:54:47 网站建设 项目流程

1. 先把两个词拆开:Loop Engineering 到底在管什么

Loop Engineering 和 Harness Engineering 最近被频繁放在一起讨论,很多人第一反应是“这不就是换了个名字的 workflow 吗”。我一开始也这么想,直到把两者放进同一个项目里跑了一遍,才发现它们管的根本不是同一层东西。

用一句话概括:Harness Engineering 管的是“一个 agent 怎么稳定地跑完一次任务”,Loop Engineering 管的是“谁来发现任务、派给谁、跑完之后怎么判断该不该继续”。前者是单次运行的环境,后者是跨多次运行的调度层。

举个具体例子。你写一个 agent 去修 CI 失败,Harness 关心的是:给它多少上下文、允许它调用哪些工具、失败重试几次、日志写到哪里、多轮对话后它忘了目标怎么办。Loop 关心的是:谁在每天早上 9 点触发这次检查、这次修完的结果要不要写进一个状态文件、明天的运行怎么知道今天已经修过哪些、谁来验证修复是否真的通过。

这两件事混在一起写,代码会迅速失控。分开之后,Harness 是一个可复用的执行容器,Loop 是一个薄薄的控制面。本文就按这个分层,给你一套可以直接复制的配置骨架,并用 TaoToken 作为统一的模型通道,把 CC Switch、Cline 这些工具接进来,最后逐项验证。

适合谁看:正在搭 AI 工具链、手里已经有至少一个 coding agent 在跑、想把“手动 prompt”升级成“可调度 loop”的开发者。如果你还在纠结要不要用 agent,那这篇可以先收藏,等工具链跑起来再回来看。

2. TaoToken 前置:统一 Key 与 API 通道

在讲配置之前,先把模型通道这件事定下来。Loop 和 Harness 都会调用模型,如果每个工具各自配一套 Key、各自记一套 endpoint,排障时会非常痛苦。我的做法是让所有工具走同一个 API 通道,TaoToken 在这里扮演的就是这个统一入口。

你需要先拿到一个 API Key。登录官网后进入控制台,在 API Keys 页面创建一个新 Key。地址是 https://taotoken.net/api ,注意这个是不带追踪参数的 API 基址,配置里填的就是它。

创建完 Key 之后,建议先做一次最小验证,确认通道是通的,再去接 CC Switch 和 Cline。验证用 curl 就够了:

curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "reply with ok"}], "max_tokens": 16 }'

返回里能看到choices[0].message.content就说明通道没问题。这一步别跳过,后面 CC Switch 和 Cline 报错时,你能立刻判断是工具配置问题还是通道问题。

关于模型选择,Loop 里的 maker 和 checker 建议用不同模型。maker 用能力强的,checker 用便宜快速的,这样成本可控。TaoToken 的模型对话页面可以先把几个候选模型都试一遍,确认哪个在你们的任务上判断质量够用。

3. 可复制配置:settings.json 与 config.toml 骨架

这一节给两份骨架。第一份是 Harness 层的settings.json,第二份是 Loop 层的config.toml。两份都走 TaoToken 通道。

先看 Harness 层的settings.json,这份配置的核心是把执行环境固定下来:模型通道、工具权限、重试策略、日志位置。

{ "harness": { "name": "ci-fix-agent", "model": { "provider": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "model_id": "claude-sonnet-4-20250514", "max_tokens": 8192, "temperature": 0.2 }, "tools": { "allow": ["read_file", "write_file", "run_shell", "git_diff"], "deny": ["deploy", "db_write"], "shell_timeout_sec": 120 }, "retry": { "max_attempts": 3, "backoff_sec": 5, "retry_on": ["rate_limit", "timeout"] }, "state": { "persist_path": "./.agent-state/harness.json", "log_path": "./.agent-state/harness.log" } } }

几个关键点。api_key_env用环境变量而不是硬编码,避免 Key 进 git。tools.deny里显式禁掉 deploy 和 db_write,这是 Harness 层最重要的安全边界,agent 再聪明也不该在生产库上动手。state.persist_path是给 Harness 自己用的,记录单次运行内的中间状态,和 Loop 层的状态文件是两回事,别混。

再看 Loop 层的config.toml,这份管的是调度、状态、maker/checker 分离。

[loop] name = "daily-ci-triage" schedule = "0 9 * * *" state_file = "./.agent-state/loop-state.md" max_iterations = 8 [loop.trigger] type = "schedule" command = "gh run list --status failure --limit 20" [loop.maker] harness_config = "./settings.json" task_template = "triage the failures listed in {trigger_output}, fix the ones caused by our own commits" [loop.checker] model_id = "claude-haiku-4-20250514" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" goal = "all targeted tests pass and lint is clean" judge_prompt = "given the diff and test output, decide if the goal is met. answer pass or fail with one reason." [loop.state] append_only = true fields = ["date", "failures_seen", "fixed", "skipped", "reason"]

state_file是整个 loop 的脊梁。模型在两次运行之间会忘掉一切,但这个 markdown 文件不会。append_only = true保证历史不被覆盖,明天的运行读它就知道今天修过什么。checker用独立模型和独立 goal,这就是 maker/checker 分离,执行任务的 agent 不给自己打分。

4. 接入 CC Switch 与 Cline 的配置片段

骨架有了,接下来把工具接上。CC Switch 用来在多个 Claude Code 配置之间切换,Cline 是 VS Code 里的 agent 插件。两者都指向 TaoToken 通道。

CC Switch 的配置片段,加到它的 provider 列表里:

{ "providers": [ { "name": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "models": [ "claude-sonnet-4-20250514", "claude-haiku-4-20250514" ], "default_model": "claude-sonnet-4-20250514" } ] }

Cline 的配置在 VS Code 设置里,找到 Cline 的 API Provider 部分,选 OpenAI Compatible,然后填:

{ "cline.apiProvider": "openai", "cline.openAiBaseUrl": "https://taotoken.net/api/v1", "cline.openAiApiKey": "${env:TAOTOKEN_API_KEY}", "cline.openAiModelId": "claude-sonnet-4-20250514" }

注意 Cline 的 base URL 要带/v1,CC Switch 的不用,这是两个工具对 endpoint 处理方式不同导致的,踩过一次坑。配完之后,Cline 里发一条消息,能正常返回就说明接上了。

如果你打算长期跑 coding agent 和 loop,建议看一下 Coding Plan 这类按周期计费的方式,比按 token 现付更适合高频调度场景。地址是 https://taotoken.net/api-keys 旁边的 plan 入口,具体以控制台显示为准。

5. 验证请求与成功结果

配置写完不算完,得逐项验证。我按从下到上的顺序验,先通道,再 Harness,再 Loop。

第一步,通道验证。前面那条 curl 再跑一次,确认返回正常。如果这一步失败,后面都不用看。

第二步,Harness 验证。手动触发一次单次运行,不经过 loop:

TAOTOKEN_API_KEY=sk-xxx python -m harness.run \ --config ./settings.json \ --task "list the failing tests in test/auth and explain each"

预期结果是 agent 读取文件、运行测试、返回一段解释,并且./.agent-state/harness.log里有完整调用记录。如果日志里出现 401,说明 Key 没读到;出现 429,说明触发了限流,检查 retry 配置。

第三步,Loop 验证。先干跑一次,不真正执行修复:

python -m loop.run --config ./config.toml --dry-run

dry-run 会执行 trigger、读 state_file、生成 maker 任务,但不调用 maker。确认 trigger 输出正确、state_file 被正确读取后,再去掉 dry-run 真跑一次。

真跑成功后,你会看到loop-state.md里多了一行,类似:

| 2025-01-15 | 3 | 2 | 1 | flaky test, skipped |

这一行就是 loop 的记忆。第二天再跑,maker 会先读它,知道昨天修过什么。到这一步,Harness 和 Loop 的分层就算跑通了。

6. 本篇常见错排查

报错一:401 Unauthorized。九成是环境变量没传进去。检查TAOTOKEN_API_KEY是否在当前 shell 里export过,CC Switch 和 Cline 是否读的是同一个变量名。别在配置里硬编码 Key。

报错二:Cline 连不上,CC Switch 正常。大概率是 base URL 少了/v1。Cline 走 OpenAI 兼容协议,endpoint 要带版本路径;CC Switch 走的是另一套约定。两个都填对就行。

报错三:loop 反复修同一个失败。说明 state_file 没被 maker 读到,或者append_only被关掉了。检查state_file路径是否是绝对路径,相对路径在不同工作目录下会指向不同文件。

报错四:checker 一直判 fail,loop 跑满 max_iterations。通常是 goal 写得太模糊。goal = "code is good"这种没法验证,改成goal = "all tests in test/auth pass and lint is clean"这种可判定的条件。checker 的 judge_prompt 也要明确要求它输出 pass 或 fail 加一个理由。

报错五:token 消耗远超预期。检查 maker 的 max_iterations 和 trigger 频率。一个每 15 分钟跑一次、每次最多 8 轮的 loop,一天就是 768 次模型调用。如果任务本身不需要 runtime 判断,写个 bash script 更划算。Loop 只在需要动态推理时才值得。

报错六:Harness 日志里出现工具被拒。说明 agent 尝试调用了tools.deny里的工具。这是预期行为,不是 bug。如果确实需要放开,改settings.json的 allow 列表,别直接删 deny。

排查顺序建议固定:先 curl 验通道,再单跑 Harness,再 dry-run Loop,最后真跑。任何一层出问题,都不要跳到下一层,否则错误会叠加,定位成本翻倍。

如果你在接入过程中卡在某个具体报错,可以到接入文档里对照参数说明,或者直接在模型对话里把报错贴进去让它帮你定位。长期跑 coding agent 的话,Coding Plan 那条路径更适合高频调度,具体入口在控制台里能看到。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询