ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Claude Code 配 TaoToken:跑通 AI Agent Harness Engineering 代码示例

Claude Code 配 TaoToken:跑通 AI Agent Harness Engineering 代码示例 把原文 3.1.3 节的感知系统脚本存成perception_system.py第一次运行就卡在client.chat.completions.create那一行。报错五花八门gpt-4这个模型名在你手上的 Key 下不存在401 鉴权失败偶尔还有连接超时。根因其实是一致的模型通道和 Key 没有对齐。我后来把所有模型请求切到 TaoToken 统一 API 上一套 Key、一个 Base URL 就解决了。注册和创建 Key 在官网 TaoToken 完成。下面按原文的代码示例把感知系统understand_input与规划系统create_plan跑通并说明 Claude Code 在这个流程里的实际分工。1. 复现原文 3.1.3感知系统脚本卡在了请求那一行1.1 报错先于调参原文的感知系统依赖 OpenAI SDK初始化方式很简洁from openai import OpenAI import os client OpenAI(api_keyos.getenv(OPENAI_API_KEY))开发者复现时通常会把OPENAI_API_KEY换成自己常用的那把 Key。问题往往就出在这里你常用的 Key 可能是另一个平台发的原始模型名不叫gpt-4环境变量被多个工具改写过指向的 Key 早已失效有些平台要求在请求里带自定义 Base URLSDK 默认却请求了api.openai.com于是你还没跑到环境建模就被 401 拦住了。与其逐条排查 Key 归属、逐个平台去对模型名不如先把底层的请求通道统一掉。这也是我在复现原文代码时学到的第一课报错出现得越早越说明外层配置需要整理而不是急着改 prompt 或 temperature。1.2 通道统一之前先别急着调逻辑TaoToken 的定位是「统一 API / 兼容通道」把 Base URL 固定到一个入口API Key 换成同一把模型 ID 从模型广场复制。原文的 OpenAI SDK 代码不需要改业务逻辑只改两行初始化参数感知和规划这两个函数就能在同一套配置下跑起来。这个思路也贴合 AI Agent Harness Engineering 里的「外部化依赖」原则把容易变化的大模型供应商细节从智能体内核里剥出去让感知、规划、记忆都面向同一个稳定接口。所以本文不打算教你改算法而是先把原文代码里最容易被卡住的模型通道理顺。2. 把官网 Key、模型 ID、Base URL 三处先对齐2.1 在 TaoToken 创建 Key 并抄下模型 ID操作路径是打开 TaoToken 注册登录进控制台创建 API Key再到模型广场找你要用的模型 ID。Key 创建后只显示一次复制到本地.env文件保存TAOTOKEN_API_KEYYOUR_API_KEY TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODEL你在模型广场复制的模型ID注意API Key 占位符是YOUR_API_KEY从 TaoToken 控制台创建。模型 ID 不要凭记忆写gpt-4也不要套用别的教程里带日期后缀的 ID。以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场当前列表为准复制粘贴最稳妥。2.2 Claude Code 的 settings.json环境变量指到同一套通道Claude Code 本身是命令行 AI 编程助手它读的是 Anthropic 兼容的环境变量。在~/.claude/settings.json里写入{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: 模型ID } }保存后完全退出终端再重新打开让 Claude Code 重新加载环境变量。这里的ANTHROPIC_BASE_URL同样是 https://taotoken.net/api末尾不加/v1ANTHROPIC_AUTH_TOKEN用同一把 Key。设置好后Claude Code 的对话和代码解释都会走 TaoToken 通道你在编辑器里问问题和在终端里跑脚本用的是同一套模型配置。2.3 原文 client OpenAI(...) 同步改指感知系统脚本里的client初始化改为从.env读取import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) ) MODEL os.getenv(TAOTOKEN_MODEL, 模型ID)原文代码的后续调用不用动create方法里的model参数统一用MODEL变量。这样无论你后面在模型广场换成哪个模型只需要改.env不需要改 Python 代码。3. 跑通 understand_input感知系统与环境模型3.1 对应原文 3.1.3 的实现原文 3.1.3 节的感知系统包含两个部分understand_input负责从用户输入里解析意图和实体EnvironmentModel负责维护环境状态。保存为perception_system.py并替换配置后完整可运行版本如下import json import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) ) MODEL os.getenv(TAOTOKEN_MODEL, 模型ID) def understand_input(user_input, contextNone): prompt f 分析用户的输入提取意图和关键实体以JSON格式返回结果。 用户输入: {user_input} 上下文: {json.dumps(context, ensure_asciiFalse) if context else 无上下文} 意图包括: 预订(机票、酒店、餐厅)、查询(天气、时间、信息)、提醒、任务管理、日程安排、一般对话等。 返回格式: {{intent: 意图分类, entities: {{实体类型: 实体值}}, confidence: 0.0, ambiguity: null}} response client.chat.completions.create( modelMODEL, # 未传 response_format原因见第 4 节 messages[ {role: system, content: 你是一个专业的自然语言理解系统。}, {role: user, content: prompt} ] ) return json.loads(response.choices[0].message.content) class EnvironmentModel: def __init__(self): self.state { time: None, user_location: None, user_preferences: {}, context_history: [] } def update_state(self, perception_result): entities perception_result.get(entities, {}) if time in entities: self.state[time] entities[time] if location in entities: self.state[user_location] entities[location] self.state[context_history].append(perception_result) def get_state(self): return self.state.copy() if __name__ __main__: sample 帮我订一张明天下午去北京的机票尽量便宜但不要太早 result understand_input(sample) print(json.dumps(result, indent2, ensure_asciiFalse)) env EnvironmentModel() env.update_state(result) print(json.dumps(env.get_state(), indent2, ensure_asciiFalse))这里没有引入任何新的业务库OpenAI SDK 仍然是原代码用的依赖只是api_key与base_url被替换成 TaoToken 提供的入口。3.2 在本地执行并把结果贴回 Claude Code在项目目录运行python perception_system.py你会看到intent被识别为「预订」entities里有 time、destination 等字段。把这段输出复制给 Claude Code让它检查实体提取是否完整、EnvironmentModel的状态更新有没有漏掉字段。Claude Code 只负责解释、对照、提出修改建议真正的脚本执行仍在你的本地环境完成结果再贴回对话里继续讨论。4. 跑通 create_plan推理与规划4.1 改后的规划代码原文 3.2.3 节的推理与规划系统同样基于 OpenAI SDK。把planner.py的初始化替换成相同的client配置后核心函数create_plan如下import json import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api) ) MODEL os.getenv(TAOTOKEN_MODEL, 模型ID) def create_plan(goal, current_state, available_actions): actions_str \n.join( f- {a[name]}: {a[description]}\n 前置条件: {a[preconditions]}\n 效果: {a[effects]} for a in available_actions ) prompt f 请创建实现目标的计划按JSON格式返回。 目标: {goal} 当前状态: {json.dumps(current_state, ensure_asciiFalse)} 可用行动: {actions_str} 返回格式: {{plan: [{{step_number: 1, action: 行动名称, reasoning: 选择理由, expected_state: 预期状态}}], confidence: 0.0}} response client.chat.completions.create( modelMODEL, messages[ {role: system, content: 你是一个专业的规划系统。}, {role: user, content: prompt} ] ) return json.loads(response.choices[0].message.content) if __name__ __main__: goal 在下午3点会议前准备好材料并回复重要邮件 state {location: office, unread_emails: 12, meeting_time: 15:00} actions [ {name: 查看日历, description: 查看今天日程, preconditions: 日历可访问, effects: 知道会议安排}, {name: 扫描邮件, description: 列出未读邮件主题, preconditions: 邮箱已登录, effects: 找出重要邮件}, {name: 准备材料, description: 整理会议文档, preconditions: 知道会议主题, effects: 材料就绪}, ] plan create_plan(goal, state, actions) print(json.dumps(plan, indent2, ensure_asciiFalse))运行后返回的plan是一个有序步骤列表每步带reasoning和expected_state。这套输出可以直接交给下游 Harness 层做任务拆分和调度不需要额外加工。4.2 处理 response_format 不兼容问题原文代码在调用里传了response_format{type: json_object}。TaoToken 兼容通道按上游模型的实际能力转发参数如果你选的模型不支持这个参数SDK 会报类似Unsupported parameter: response_format的错误。处理方式很直接删除response_format这行同时在 system prompt 里补一句「只输出 JSON不要输出 Markdown 代码块」。上面两段代码已经做了这个调整所以你可以直接运行不会踩这个坑。5. 排障Key、模型 ID、Base URL 三件套5.1 401 与 Key 复制如果脚本返回 401先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 控制台重新复制 Key。注意复制时前后不要带空格.env文件里等号两边也不要加空格。Claude Code 的ANTHROPIC_AUTH_TOKEN和 OpenAI client 的api_key必须用同一把否则一个工具能通、另一个工具报错排查起来更费时间。5.2 model not found 与模型广场报错文本里出现model not found或model does not exist时通常是MODEL变量的值写死了。不要照抄官方文档里的模型名也不要凭记忆补一个带日期后缀的 ID。打开模型广场复制当前可用的模型 ID粘贴到.env或settings.json里再重跑一次。5.3 Claude Code 的 settings.json 改了却未生效如果你修改了~/.claude/settings.json但 Claude Code 里仍然是旧配置先确认修改的是用户目录下的settings.json而不是项目里的settings.local.json。另外Claude Code 在启动时读取环境变量改完必须完全退出终端再重新打开在运行中的会话里改不会生效。排查时可以在 Claude Code 对话中输入/status看显示的 API 端点是否已经是 https://taotoken.net/api。6. 跑通之后去控制台核对该次调用6.1 在模型对话里再验证一次 Key配置保存后先到 TaoToken 模型对话 里用同一把 Key 发一条测试消息确认模型 ID 和 Base URL 没填错。对话页面返回正常后再回到终端跑脚本这样可以快速判断问题是出在 Key 还是出在代码。6.2 接着往下做把这次经验变成你自己的 Harness 配置跑通understand_input和create_plan之后建议做两件事。第一到 Coding Plan 看套餐是否覆盖你日常的代码生成量避免项目做到一半被用量卡住。第二Key 的管理入口固定在 控制台 API Keys后续新增模型或轮换密钥都在那里操作。配置细节则可以对照 Claude Code 接入文档 把settings.json的变量逐一核对一遍。个人体会是第一次跑智能体代码最耗时的往往不是算法而是把外部模型通道理顺。TaoToken 的价值不在于替代某一个模型而是让感知、规划这些核心逻辑只依赖一个稳定入口模型想换就换Key 只剩一把环境变量里不再混着七八个平台的凭证。后续你要给 Harness 工程加记忆系统、加工具调用这套统一通道还能继续复用。
返回列表