ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

把 279 行 Agent 框架的 DeepSeek 配置改到 TaoToken 后,模型随意切

把 279 行 Agent 框架的 DeepSeek 配置改到 TaoToken 后,模型随意切 原文那 279 行 Python Agent 框架里最容易被忽略、换模型时最先爆炸的是 OpenAI client 初始化那几行base_url 写死 DeepSeekmodel 写死 deepseek-chat。想换成 GLM 或通义Key、地址、模型名全得重来agent_loop 之外的接入层反而成了最不稳定的一层。把这层收到 TaoToken情况就变成改一个模型名。先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 YOUR_API_KEY后面 ReAct 循环、messages 累积、tool_calls 解析、工具执行逻辑都不用动。这篇不重讲 ReAct 理论也不重新实现那 279 行。只做一件事把原文里初始化 OpenAI client 时填 DeepSeek 地址和密钥的步骤改成从 TaoToken 拿 Key并用统一兼容地址作为 base_url。改完以后同一套代码想换 GLM、通义、Claude 或其他模型只需要改 model 名。工具调用还是 shell_exec、file_read、file_write、python_exec验证方式也还是跑一个多步任务看它能不能正确写代码、执行代码、把结果追加回上下文。1. 先定位 279 行里被写死的 DeepSeek 配置1.1 原文的 client 初始化和 agent_loop 里的 model原文那套极简 Agent 的结构很清晰CLI REPL 负责收用户输入Agent Loop Core 负责 LLM 推理、工具解析、工具执行和上下文管理Tools Registry 里放着四个工具。真正跟模型厂商绑定的地方其实只有两处。第一处是初始化 OpenAI client。原文走 OpenAI 兼容接口所以写法大概是这种形态指定 api_key指定 base_url。DeepSeek 的兼容端点、密钥都写在这里。第二处是 agent_loop 里的client.chat.completions.create()其中modeldeepseek-chat直接写死。只要这两个位置固定整个 Agent 就只能跑 DeepSeek。这个设计对学习来说没问题。极简实现本来就该把厂商差异暴露出来让你知道 LLM Call 是 Agent 框架里的一层。但一旦你想把同一个 279 行框架拿去对比 GLM、通义或者临时换成别的工具调用能力更强的模型就会发现自己不是在调 Agent而是在做多厂商适配。1.2 换 GLM 时为什么整个文件都要动假设你现在想把deepseek-chat换成 GLM。最直觉的做法是把 base_url 改成 GLM 的兼容地址把 api_key 换成 GLM 的 Key把 model 改成 GLM 的模型 ID。如果 GLM 完全兼容 OpenAI SDK 的chat.completions.create和tools参数那还能跑如果不完全兼容可能还要动请求参数、返回值解析甚至换 SDK。更麻烦的是上下文里的历史记录。agent_loop 会把 assistant 消息、tool_call_id、tool 结果按顺序追加到 messages。如果换厂商后 tool_calls 的返回结构有差异messages 的组装方式就要跟着改。你本来只是想对比模型效果结果半天时间花在接入层排错上。这就是把模型通道收口到统一 API 的价值。TaoToken 在这里不改变 Agent 的思考方式也不替你做上下文工程它只负责让 LLM Call 这一层不再跟某一家厂商死绑。2. ReAct 循环不动只把 LLM Call 的出口换到 TaoToken2.1 messages 累积、tool_calls 解析、工具回填保持原样先把不该动的部分圈出来。原文 agent_loop 的核心逻辑有四个动作把用户消息追加到 messages。调 LLM把 tools schema 传进去。如果返回 tool_calls就逐个解析、执行工具把结果以role: tool追加回 messages。如果某次返回没有 tool_calls就认为任务完成直接返回文本。这四步跟模型来自 DeepSeek、GLM 还是通义没关系。ReAct 的“推理—行动—观察”循环本身就长这样。工具函数里shell_exec 用 subprocess 跑命令file_read 读文件file_write 写文件python_exec 写临时脚本再执行。它们也不需要知道模型通道是谁。所以改造范围应该压到最小只改 client 初始化以及 create 调用里的 model 参数。别为了接统一 API把 messages 结构重写也别把 tool_calls 解析换成另一套。原文那 279 行最值钱的地方就是 Agent Loop 足够干净接入层不应该污染它。2.2 去 TaoToken 创建 YOUR_API_KEY 并确认模型名打开 TaoToken注册并进入控制台创建一个 API Key。这个 Key 就是后面要填进环境变量的YOUR_API_KEY。创建时建议给它一个能认出用途的名字比如agent-279-demo以后在控制台看用量时不容易跟别的项目混在一起。同时确认你要用的模型 ID。不要自己拼模型名也不要把旧文章里的gpt-5、日期后缀之类当成正式配置。以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场当时列表为准。先把模型 ID 记下来等会儿填到.env的AGENT_MODEL里。这一步做完你手里应该有三样东西一把YOUR_API_KEY、一个统一 Base URLhttps://taotoken.net/api、一个从模型广场确认过的模型 ID。3. 改 client 初始化base_url 填 https://taotoken.net/api3.1 Python 文件里的 OpenAI SDK 写法原文初始化 client 时api_key 和 base_url 都指向 DeepSeek。现在把这两处换掉注意 Base URL 末尾不要加/v1直接写https://taotoken.net/api。模型 ID 从环境变量读不要写死在 agent_loop 里。# agent.py import os import json from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) MODEL_ID os.environ.get(AGENT_MODEL, YOUR_MODEL_ID)然后改 agent_loop 里的 create 调用。原来的modeldeepseek-chat改成modelMODEL_ID其余参数保持原样。def agent_loop(user_message: str, messages: list) - str: messages.append({role: user, content: user_message}) tool_schemas [t[schema] for t in TOOLS.values()] for turn in range(1, MAX_TURNS 1): response client.chat.completions.create( modelMODEL_ID, messagesmessages, toolstool_schemas, ) assistant_msg response.choices[0].message messages.append(assistant_msg.model_dump()) if not assistant_msg.tool_calls: return assistant_msg.content or for tool_call in assistant_msg.tool_calls: name tool_call.function.name try: args json.loads(tool_call.function.arguments or {}) except json.JSONDecodeError: args {} tool_entry TOOLS.get(name) if not tool_entry: result f[error] unknown tool: {name} else: result tool_entry[function](**args) messages.append({ role: tool, tool_call_id: tool_call.id, content: str(result), }) return [agent] reached maximum turns, stopping.这段逻辑跟原文同构但接入层已经换了。TaoToken 在这里扮演模型通道的收口点OpenAI SDK 仍然用tools 参数仍然传tool_calls 仍然解析。你不需要在业务代码里判断“现在用的是哪家模型”。3.2 用 .env 隔离 Key 和模型 ID不要把YOUR_API_KEY直接写进 Python 文件。用一个.env管起来本地调试和切换模型都方便。# .env TAOTOKEN_API_KEYYOUR_API_KEY AGENT_MODELYOUR_MODEL_ID跑之前先加载环境变量。可以用python-dotenv也可以在 shell 里 export。注意 Key 从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建不要跟其他平台的 Key 混用。模型 ID 仍然以模型广场当时列表为准。如果你之前把 DeepSeek 的 Key 写在代码里现在把那段删掉。不是把 DeepSeek Key 换成 TaoToken Key 继续硬编码而是让代码只认环境变量。这样以后切模型改.env里的AGENT_MODEL就行。4. 用 shell_exec 和 python_exec 验证工具调用链4.1 跑一个“统计当前目录代码行数”的任务配置改完别急着上复杂任务。先用原文里验证过多步推理的任务统计当前目录下的代码行数和大概 Token 数。这个任务会逼着 Agent 调用工具而不是只回一段文本。启动你的 CLI REPL输入You 统计当前目录下 .py 文件的行数并估算一下这些代码大概多少 token如果接入层正确Agent 会经历类似这样的循环调用shell_exec找.py文件调用shell_exec用wc -l统计行数调用python_exec写一段临时脚本做粗略 token 估算把工具结果追加到 messages再让模型汇总。你不需要在代码里为 TaoToken 写特殊分支。只要client.chat.completions.create正常返回tool_calls能被解析工具结果能回填Agent Loop 就会继续转。shell_exec 和 python_exec 验证通过说明模型通道和工具调用链已经接通。4.2 在 TaoToken 控制台对一下 Token 消耗任务跑完后回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的控制台看一下刚才这几轮调用有没有记上用量。重点看两个东西请求次数是否跟 Agent Loop 的 turn 数大致对应Token 消耗是否随着 messages 累积而增长。这一步很关键。原文提到极简实现缺少可观测性每步做了什么、花了多少 Token、耗时多少都没有记录。现在把模型通道统一到 TaoToken 后至少 Token 计量有了一个统一入口。你可以在控制台里看到这次 Agent 任务到底消耗了多少而不是散落在多个厂商后台。如果控制台没有记录先检查是不是 Key 填错、Base URL 写错或者请求根本没发出去。别急着改 agent_loop接入层的问题优先在接入层查。5. 切 GLM、通义或其他模型时只改 AGENT_MODEL5.1 模型广场是模型 ID 的唯一来源同一套 279 行框架想从 DeepSeek 换到 GLM或者换到通义操作应该只有一步改.env里的AGENT_MODEL。不要改base_url也不要改api_key。Base URL 始终是https://taotoken.net/apiKey 始终是你在 TaoToken 创建的那把。模型 ID 不要凭记忆写。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场看当时列表里可用的模型名复制到AGENT_MODEL。不同模型对tools参数的支持程度可能不同优先选模型广场里标明支持工具调用的模型。5.2 agent_loop 不感知厂商差异的原因为什么改一个模型名就能切因为 agent_loop 只依赖 OpenAI SDK 的通用接口chat.completions.create、tools、tool_calls、role: tool。TaoToken 在中间做兼容通道把不同模型的接入差异收走。你的 Python 代码不需要 import 另一家 SDK也不需要为 GLM 写一套消息格式。这也让对比实验变得简单。比如你想比较两个模型在同一个多步任务上的表现只要复制一份.env改AGENT_MODEL其他代码一行不动。工具集、System Prompt、MAX_TURNS 都保持相同变量只剩模型本身。6. 改完可能遇到的 401、404 和 tool_calls 解析问题6.1 401 与 404先看 Key 和 Base URL最常见的 401 是 Key 没读到。检查.env是否被加载环境变量名是不是TAOTOKEN_API_KEY代码里有没有拼错。还有一种情况是复制 Key 时带了空格或者用了别的平台的 Key。Key 从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建创建后直接粘贴不要手打。404 通常跟 Base URL 有关。填进 OpenAI client 的地址是https://taotoken.net/api末尾不要加/v1。有些示例会在 base_url 后面补/v1但这里不需要。另一个 404 来源是模型 ID 写错。去模型广场确认AGENT_MODEL的值不要自己加日期后缀或版本号。6.2 tool_calls 报错时回查 messages 顺序如果模型返回了tool_calls但下一轮请求报错优先检查 messages 顺序。正确的顺序是assistant 消息带tool_calls紧接着每个tool_call对应一条role: tool的消息并且带上tool_call_id。顺序错了或者漏了某条工具结果很多兼容接口会直接拒绝请求。另外assistant_msg.model_dump()这一步不要省。OpenAI SDK 返回的是对象messages 里需要的是可序列化结构。原文用model_dump()处理换成 TaoToken 后也一样。工具结果尽量转成字符串别把复杂对象直接塞进content。如果模型完全不返回tool_calls只输出一段文本先确认你选的模型是否支持 Function Calling。以模型广场当时列表为准。换一个支持工具调用的模型再跑同一个任务。7. 跑通之后把接入层继续收口在 TaoToken7.1 模型对话、Coding Plan 与控制台 API Keys配置保存后先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息确认模型 ID 和 Base URL 没填错。这个动作能快速区分“代码问题”和“接入配置问题”。如果模型对话正常但 Agent 脚本报错那就回去看 messages 组装和 tool_calls 解析。如果你准备把这个 279 行 Agent 长期跑起来可以打开 Coding Plan 看套餐是否够用。Key 在 控制台 API Keys 创建和管理。调用记录和 Token 消耗也在控制台里对。7.2 可选Claude Code 作为外层执行工具如果你的 Agent 任务经常需要读写项目文件、跑命令行也可以把 Claude Code 当作外层执行工具让它通过 TaoToken 的兼容通道工作。Claude Code 的环境变量对照可以看 接入文档。注意Claude Code 在这里只是执行工具不是要替代你那 279 行 Agent Loop。真正要保留的是原文那套最小循环messages 累积、tool_calls 解析、工具执行、结果回填、上下文继续增长。TaoToken 只把模型接入层收口让你从“换模型等于重写接入代码”变成“换模型等于改一个环境变量”。下一次想试新模型不用再翻 DeepSeek 的 base_url也不用重新申请 Key改完AGENT_MODEL就能跑。
返回列表