Composio 测评换 Harness,TaoToken 作为模型入口
2026/9/19 7:03:01 网站建设 项目流程

1. 先统一模型入口:换 Harness 前必须锁定的 Base URL

在 Pi、Prime、Deep Agents、Hermes 之间换 Harness 跑同一批 Agentic Tasks 时,最先暴露的问题往往不是模型答错,而是请求日志里的 token 对不上。为了把变量收敛,我先把模型入口统一到 TaoToken(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=harness-entry),Base URL 填 https://taotoken.net/api,再去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=get-key 领取 Key。Composio 早前把 DeepSeek V4 Flash 分别放进 Pi Agent、Prime Agent、Deep Agents 和 Hermes Agent,跑了同一批 30 个 Agentic Tasks,Pi 在这组测试里通过率是 66.7%,中位任务成本只有 0.012 美元。数字本身不是重点,重点是它证明了一件事:模型没换,Harness 一换,模型能看到的上下文、走过的工具路径、循环轮数和停止条件都会跟着变。

对做 Harness 选型实验的开发者来说,这意味着一开始就要把“模型入口”和“运行时行为”拆开。模型入口负责把请求送到正确的模型、记录 token、返回结构化响应;Harness 负责决定每一轮塞多少历史、暴露哪些工具、什么时候压缩上下文、允不允许子 Agent 并行、失败后从哪里恢复。两者混在一起调,最后根本说不清是模型能力变化,还是 Harness 的上下文装配策略变了。

Agent 从一次 LLM 调用长成完整 Harness,过程并不神秘。最早只有一个输入到输出的函数,模型不记得上一轮说过什么,于是应用在前面拼上下文;模型不能改文件、不能执行命令,于是系统注册工具;一次工具调用解决不了长任务,于是出现 ReAct 式的 Thought、Action、Observation 循环;完整历史塞不进窗口,于是分出 Working Memory 和长期记忆;循环开始写文件、跑命令、访问网络,于是加权限、审批和沙箱;一个循环不够并行,于是派生拥有独立上下文和生命周期的子 Agent。每一层都是模型撞上边界后补出来的。

当这些补丁多到一定程度,它们就不会继续散落在应用代码里,而是收拢成一个运行时层。Agent 决定下一步做什么,Harness 决定这一步在什么上下文、什么权限、什么生命周期和什么持久化规则下发生。Pi、OpenCode、Codex、Hermes 共享 Agent Loop、Tool Calling 和 Context Assembly 这些基本能力,但把成本花在了完全不同的位置。

所以本节点的实验目标很明确:固定模型入口,固定任务集,只切换 Harness,产出多 Harness 请求日志、Token 消耗和通过率对照。入口统一方式就是 TaoToken 的 Key 加 Base URL。你可以在官网完成注册和 Key 领取:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=harness-register 。拿到 Key 后,无论后面接 Claude Code、Codex 还是自研 Harness,模型侧都走 https://taotoken.net/api 。

2. 配置:Claude Code、Codex、CC Switch 的模型入口

先把三类常见客户端的入口配好,后面跑对照实验才不会因为客户端差异污染日志。注意,Claude Code 用 ANTHROPIC_* 系列环境变量,Codex 用 config.toml,两者不要混用,尤其不要把 ANTHROPIC_* 塞进 Codex 配置。

2.1 Claude Code:settings.json 与 ANTHROPIC_*

Claude Code 常见做法是在 ~/.claude/settings.json 里写环境变量,或者在 shell 里导出。推荐把配置写进 settings.json,便于不同项目之间复制。

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5-20250929", "ANTHROPIC_SMALL_FAST_MODEL": "claude-haiku-4-5-20251001" } }

如果客户端版本读取的是 ANTHROPIC_API_KEY,可以同时保留:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "YOUR_API_KEY", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5-20250929" } }

保存后重启 Claude Code,或者新开一个终端。验证时先跑一个最小请求:

claude --version claude "只回复 ok"

如果返回 401 或 403,先检查 Key 是否复制完整,再检查 Base URL 是否被客户端自动追加了多余路径。TaoToken 的 Base URL 是 https://taotoken.net/api ,不要手写成带 /v1/chat/completions 的完整端点。模型 ID 如果报 404,回到控制台确认当前 Key 可用的模型列表。控制台入口在这里:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=harness-keys 。

2.2 Codex:config.toml

Codex 不要用 ANTHROPIC_*。它读的是 config.toml,通常位于 ~/.codex/config.toml。一个可用的供应商配置可以写成下面这样:

model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"

然后在 shell 里导出 Key:

export TAOTOKEN_API_KEY=YOUR_API_KEY codex --version codex "只回复 ok"

如果你的 Codex 版本使用 chat completions 兼容模式,把 wire_api 改成 "chat" 再试。关键点是 base_url 只填 https://taotoken.net/api ,env_key 指向环境变量名,不要把真实 Key 写进仓库里的 config.toml。项目级配置可以放在仓库的 .codex/config.toml,但 Key 仍然走环境变量或本地未跟踪文件。

2.3 CC Switch 三件套:供应商、Base URL、API Key

如果你同时切 Claude Code 和 Codex,手动改配置文件很容易把 ANTHROPIC_* 和 Codex 的 provider 配置搞混。CC Switch 这类切换工具的核心就是三件套:

配置项填什么
供应商名称TaoToken
Base URLhttps://taotoken.net/api
API KeyYOUR_API_KEY

切完供应商后,重启对应客户端,再跑一次最小请求。建议先把 Claude Code 和 Codex 分别验证通过,再进入 Harness 对照实验。否则一旦日志里出现 401,你分不清是 Harness 的调用方式有问题,还是客户端切换后环境变量没生效。

配置完成后,建议用同一句话做一次冒烟测试,例如“只回复 ok”。记录这次请求的耗时和 token,作为后续对照的基线。

3. 把 Harness 选型做成可复现实验:日志字段、Token 统计与通过率

Harness 选型最容易变成“感觉 Pi 更省”“感觉 Codex 更稳”。要可复现,至少要把任务集、请求日志和统计口径固定下来。

任务集可以沿用 Composio 那类 Agentic Tasks 思路:选 30 个边界清晰、可自动判定的任务,覆盖读文件、改代码、跑测试、查资料、多步修复等类型。每个 Harness 使用独立会话目录和独立 Key 配额,避免缓存和会话恢复互相污染。模型侧统一走 TaoToken,Base URL 固定为 https://taotoken.net/api 。

每次模型请求写一行 JSONL,字段建议如下:

{"harness":"pi","task_id":"repo-fix-001","turn":3,"tool_calls":5,"prompt_tokens":8123,"completion_tokens":934,"total_tokens":9057,"elapsed_ms":42110,"passed":true,"notes":"read write edit bash"}

一行代表一次采样,不是整个任务。整个任务结束时再汇总一行:

{"harness":"pi","task_id":"repo-fix-001","total_turns":7,"total_tool_calls":13,"total_tokens":28431,"elapsed_ms":132400,"passed":true}

统计脚本可以直接在本地读 JSONL,不需要连接任何生产数据库:

import json from collections import defaultdict from statistics import median runs = defaultdict(list) with open("harness_runs.jsonl", encoding="utf-8") as f: for line in f: row = json.loads(line) runs[row["harness"]].append(row) for harness, rows in runs.items(): total_tokens = [r["total_tokens"] for r in rows] passed = [r for r in rows if r.get("passed")] avg_turns = sum(r["total_turns"] for r in rows) / len(rows) avg_tool_calls = sum(r["total_tool_calls"] for r in rows) / len(rows) print(harness, { "runs": len(rows), "pass_rate": round(len(passed) / len(rows), 4), "median_tokens": median(total_tokens), "avg_turns": round(avg_turns, 2), "avg_tool_calls": round(avg_tool_calls, 2), })

最终对照表可以长这样:

Harness通过率中位 Token平均轮数平均工具调用主要成本项
Pi以日志为准以日志为准以日志为准以日志为准上下文装配、工具描述
OpenCode以日志为准以日志为准以日志为准以日志为准事件投影、压缩、后台 Agent
Codex以日志为准以日志为准以日志为准以日志为准审批、沙箱、线程生命周期
Hermes以日志为准以日志为准以日志为准以日志为准记忆写入、检索、后台复习

这里不要急着编数字。Composio 的数字只说明“换 Harness 会显著改变成本与通过率”,Databricks 的内部基准也说明同一模型、同一推理强度换到更紧的 Harness 后,质量可能基本不变,单任务成本却能差出两倍以上。你自己的 30 个任务跑完,日志才是选型依据。

为了让日志可对比,还要固定这些条件:同一模型 ID、同一温度、同一最大步数、同一工具集、同一任务集、同一判定脚本。如果某个 Harness 默认开子 Agent,就在日志里单独记录子 Agent 的 token;如果它默认开启压缩,就在 notes 里标记压缩发生轮次。这样后面分析时,才能把 Token 消耗归因到具体机制,而不是笼统地说“这个 Harness 贵”。

4. 四套 Harness 的成本结构:Pi、OpenCode、Codex、Hermes 分别把 Token 花在哪

同一模型换 Harness 后,Token 差异通常来自四件事:每轮 Working Memory 多大、工具 schema 占多少、循环轮数多少、后台辅助调用多少。Pi、OpenCode、Codex、Hermes 正好代表四种取舍。

4.1 Pi:极简 Harness 把上下文压到最紧

Pi 在 Composio 测评里完成得最多、花得最少,核心原因是它尽量不让模型反复读无关内容。它默认只暴露 read、write、edit、bash 四个工具,工具描述短,动作空间窄。Resource Loader 在运行前装配当前会话启用的指令、Skills 和 Prompt Templates,Session Manager 再用活动分支和 Compaction 把完整会话投影成更紧的 Working Memory。每轮请求携带的上下文更少,历史噪声和工具说明也更少,模型便能用更少 token、更少循环抵达结果。

但极简也有代价。Pi 当前不内置限制文件系统、进程、网络或凭证访问的权限系统,默认继承启动它的用户权限。把它放进高风险环境,需要外部容器或沙箱补边界。选 Pi 做实验时,日志里要重点看每轮 prompt_tokens 是否稳定、Compaction 触发后是否丢关键事实、工具调用失败后循环会不会停。

4.2 OpenCode:事件驱动让恢复能力变强,也增加状态成本

OpenCode 把一次 Assistant Message 拆成 Reasoning、Text、Tool、Step Start、Step Finish、Patch、Compaction 等 Part。用户看到的一段回复,在存储层是一串有结构和生命周期的轨迹数据。Agent.Info 不只包含 Prompt,还把模型、Mode、Permission、步数与生成参数放进同一个配置对象。Build 和 Plan 是主 Agent,General 和 Explore 是子 Agent,Compaction、Title、Summary 是用户看不见的后台 Agent。

这套设计的好处是 Session 可恢复、行为可审计、子 Agent 可隔离。Message 与 Part 更新会驱动 Projector,把 Session、Message、Part 分别写进 SQLite。长会话接近上限时,隐藏的 Compaction Agent 汇总较早历史,旧工具输出可以被裁剪,压缩摘要与近期消息再组成下一轮 Working Memory。

成本也在这里:Compaction、Title、Summary 会引入额外模型调用;权限组合、事件顺序、数据库投影、压缩边界都需要维护。跑对照实验时,OpenCode 的日志里要把后台 Agent 的 token 单独归集,否则总 token 会看起来比前台循环高很多。

4.3 Codex:用线程生命周期和安全边界换可控性

Codex 的模型入口配置走 config.toml,运行时则围绕 Thread、Turn、Item 展开。Thread 承载可多轮持续的任务,Turn 表示用户推动任务向前的一次过程,Item 把模型消息、Reasoning、命令执行、文件修改、工具调用和审批拆成可观察单元。App Server 提供统一协议,让不同客户端面对同一套任务生命周期、审批请求和流式事件。

Thread Manager 维护活跃任务表,按 Thread ID 找到正在跑的任务,继续投递 Turn 与操作。任务离开内存后,从 Thread Store 或 Rollout 装回历史,重建可运行的 CodexThread。每次模型采样还有更短的执行现场,源码中的 StepContext 会引用当前 TurnContext,并捕获这一刻的环境、Capability Roots、Tool Router 与 AGENTS.md。

代价是重。OpenBench 把同一模型放进多套 Coding Agent Harness 比较时,Codex 的通过率不错,但中位耗时和每个成功任务平均消耗的新 token 都处于偏重一档。线程生命周期、审批、沙箱、事件、持久化和恢复机制,在短任务里会被算成额外开销;在长任务里,它们换来的可监督、可中断、可恢复、可并行,才真正体现价值。

4.4 Hermes:把成本推到下一次任务

Pi 关心眼前这次任务如何少花 Harness tax,Hermes 把问题推到下一次:第二次遇到类似任务时,能不能少走弯路?这要求 Harness 不只保存聊天记录,还要判断一次经历里哪些是稳定事实,哪些是可复用流程,哪些旧知识应该被新修正覆盖。

PAST-Bench 用 26 个场景、204 个跨会话 Episode 测试这类能力。早期 Episode 留下偏好、流程或修正,后续 Episode 清空当前上下文,再测 Memory、Procedural Reuse、Information Gathering 和 Update。Hermes 的架构里,前台 Agent Loop 解决当前任务,Session Archive 留下原始经历,Memory 和 Skills 分别承载稳定事实与可复用流程,Background Review 决定哪些经验值得影响未来。

短期看,Hermes 的记忆写入、检索、整合和后台复习都会消耗模型调用,Token 不一定低。长期看,如果它真的减少了重复探索,单位任务成本可能下降。做选型实验时,Hermes 要跑跨会话任务,不能只跑单次任务,否则它的核心能力根本不会出现在日志里。

5. 排障手册:同一模型换 Harness 后的常见异常与定位顺序

换 Harness 后报错,先不要改模型,按下面顺序排查。

第一,401 或 403。优先检查 Key 是否有效、是否复制完整、是否在对应客户端里生效。Claude Code 看 ANTHROPIC_AUTH_TOKEN 或 ANTHROPIC_API_KEY;Codex 看 TAOTOKEN_API_KEY 环境变量和 config.toml 里的 env_key。CC Switch 用户确认三件套没有被旧配置覆盖。

第二,404 或 model not found。检查模型 ID 是否拼错,检查当前 Key 是否有该模型权限。不要把一个客户端的模型 ID 直接复制到另一个客户端,Claude Code、Codex 和自研 Harness 的模型名映射可能不同。

第三,工具调用格式漂移。早期 Agent 靠正则解析 Search[Wikipedia] 这类文本,现在结构化 Tool Calling 要求工具名、调用 ID、参数都符合 schema。如果 Harness 输出的工具调用被模型包在解释文字里,先收窄工具描述,再检查 Tool Router 是否严格校验参数。

第四,上下文爆炸。如果 prompt_tokens 每轮快速上涨,说明 Working Memory 没有裁剪或压缩策略不生效。Pi 看 Compaction 和活动分支;OpenCode 看隐藏 Compaction Agent 是否触发;Codex 看 Rollout 与当前上下文装配;Hermes 看记忆检索条数是否过多。

第五,循环不停止。给每个任务设置最大轮数和最大工具调用数,超限就标记失败并保存最后状态。否则一个 Harness 可能因为停止条件模糊,把 token 烧在重复工具调用上。

第六,子 Agent 重复执行。检查父任务和子任务是否共享了同一份历史,或者 Fork 后是否重新注入了完整父上下文。子 Agent 应该拥有独立上下文、工具运行时和生命周期,只把状态与结果送回父任务。

6. 从模型对话到 Coding Plan:把实验接回日常开发

Harness 选型不是一次性评测。模型会更新,Harness 会改默认工具集,压缩策略和记忆策略也会变。最稳的做法是保留一套固定任务集和 JSONL 日志,每次只换一个变量:要么换模型,要么换 Harness,要么换工具集。模型入口始终走 TaoToken 的 Base URL https://taotoken.net/api ,Key 从控制台统一管理。

如果你想先确认模型在对话入口的表现,可以从模型对话进入:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=harness-chat 。把任务描述、工具路径和期望输出先在这里跑通,再放进 Harness 里,能减少很多配置噪声。

要把实验中的 Harness 切换变成日常开发流,先看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=harness-plan 。它适合需要长期在 Claude Code、Codex 或自研 Agent 里切换模型的场景。

然后在 API Keys 页面创建或复制 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=harness-keys 。Key 只放在本地环境变量或未跟踪的配置里,不要提交到仓库。

Claude Code 的完整环境变量与 settings.json 写法在:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=harness-claudecode 。配置时记住:Claude Code 用 ANTHROPIC_*,Codex 用 config.toml,两边不要混。

最后回官网领取 Key 并开始你的多 Harness 对照:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=harness-final 。先统一模型入口,再跑 30 个任务,记录每一次请求的轮数、工具调用和 token。Pi 可能把上下文压到最紧,OpenCode 把状态工程做厚,Codex 用线程与安全边界换可控性,Hermes 把成本推到下一次任务。选哪套,不取决于谁的宣传更响,而取决于你的真实环境更需要低成本、强恢复、强安全,还是长期学习。模型决定下一步行动,Harness 决定这一步能不能持续、可控、可复现地发生。

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

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

立即咨询