my-agent-py 的 chat 子命令调大模型,Base URL 改到 TaoToken
1. my-agent-py chat 子命令为什么需要换掉默认 Base URL如果你跟着《把Agent装进CLI》写到第 10 章手里应该已经有一个能跑通命令树、输出规范、退出码稳定的my-agent-py。但真到chat子命令这一步很多人会卡在同一个地方代码里写死了ANTHROPIC_API_KEYSDK 默认往官方地址发请求密钥散落在环境变量、配置文件、甚至某次临时export里换台机器就得重新配一遍。这篇要解决的就是这个接入配置问题把my-agent-py chat的模型调用通道从默认地址切到 TaoToken 提供的 Base URL用一把统一的 Key 管理所有模型调用。TaoToken 在这里的角色很明确——只提供 API Key 和 Base URL 两样东西不替你的 CLI 执行业务逻辑也不管你的工具描述清单长什么样。你的chat子命令怎么组织 prompt、怎么处理流式、怎么把 token 用量写到 stderr这些还是你自己的代码说了算。适合谁看已经写完chat子命令骨架、但被密钥管理和 Base URL 配置卡住的读者或者想让 CLI 的模型调用凭证集中管理、不想在每个子命令里重复读环境变量的人。下面按「先拿 Key、再改代码、最后验证」的顺序走一遍每一步都能直接复制。2. 前置准备从 TaoToken 拿到 Key 和 Base URL在动代码之前先把两样东西准备好。第一样是 API Key第二样是 Base URL。这两样都从 TaoToken 拿注册和创建 Key 的入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 。注册流程不复杂邮箱验证完就能进控制台。进控制台后找 API Keys 页面点创建复制出来的那串就是你的 Key。这里有个习惯建议创建时给 Key 起个能认出来的名字比如my-agent-py-dev以后 Key 多了不至于分不清哪个是哪个。Key 只在创建时完整显示一次复制完先存到安全的地方别直接贴进代码。Base URL 是固定的https://taotoken.net/api。注意两个细节——不带/v1也不加任何查询参数。Anthropic SDK 自己会在 Base URL 后面拼/v1/messages这类路径你手动加上/v1反而会拼成/v1/v1/messages请求直接 404。这一点我在第一次配的时候踩过报错信息还不明显排查了半天。注意Key 属于凭证不要写进代码字面量不要 commit 到 Git也不要在--help输出里打印。配置文件权限设成 0600避免同机器其他用户读到。拿到这两样之后回到你的my-agent-py项目。接下来要改的地方有两处一处是resolve_api_key()的密钥来源链一处是 Anthropic SDK 客户端的初始化。下面分别说。3. 可复制配置改 resolve_api_key 与 SDK Base URL先看密钥来源链。原文 10.3.3 给的resolve_api_key()是按「环境变量 → 配置文件 → 报错提示」的顺序找 Key。这个结构本身没问题我们要做的是把环境变量名和配置字段名从 Anthropic 专用的改成通用的让 TaoToken 的 Key 能填进来。import os import json from pathlib import Path import click def resolve_api_key() - str: # 1. 环境变量优先方便 CI 和临时调用 if key : os.environ.get(TAOTOKEN_API_KEY): return key # 2. 配置文件次之适合本地长期使用 cfg Path.home() / .my-agent / config.json if cfg.exists(): data json.loads(cfg.read_text()) if key : data.get(taotoken_api_key): return key # 3. 都没有就明确报错别让请求带着空 Key 发出去 raise click.UsageError( 未找到 API 密钥。请设置 TAOTOKEN_API_KEY 环境变量 或运行 my-agent-py config set taotoken_api_key value )这里把环境变量名定为TAOTOKEN_API_KEY配置字段定为taotoken_api_key。你也可以保留ANTHROPIC_API_KEY作为兼容项但既然要统一管理建议直接换掉避免两套 Key 混用时分不清哪个生效。然后是 SDK 客户端初始化。Anthropic SDK 支持传base_url参数把 TaoToken 的地址填进去就行import os from anthropic import Anthropic def build_client() - Anthropic: return Anthropic( api_keyresolve_api_key(), base_urlhttps://taotoken.net/api, # 不带 /v1不加 UTM )把chat子命令里的Anthropic(api_keyos.environ[ANTHROPIC_API_KEY])换成build_client()密钥来源和 Base URL 就都统一了。完整改完的chat子命令大概长这样cli.command() click.argument(prompt) click.option(--model, defaultclaude-sonnet-4-5) def chat(prompt, model): 与大模型对话 client build_client() resp client.messages.create( modelmodel, max_tokens1024, messages[{role: user, content: prompt}], ) click.echo(resp.content[0].text)如果你之前写的是流式版本改动只在客户端构造那一行client.messages.stream(...)的调用方式不变。流式和非流式共用同一个build_client()不用维护两份配置。配置文件的写入命令也顺手改一下让config set支持新字段cli.command(config) click.argument(action, typeclick.Choice([set, get])) click.argument(key) click.argument(value, requiredFalse) def config_cmd(action, key, value): 管理 my-agent-py 配置 cfg_dir Path.home() / .my-agent cfg_dir.mkdir(mode0o700, exist_okTrue) cfg cfg_dir / config.json data json.loads(cfg.read_text()) if cfg.exists() else {} if action set: data[key] value cfg.write_text(json.dumps(data, indent2)) cfg.chmod(0o600) # 权限收紧 click.echo(f已写入 {key}) else: click.echo(data.get(key, ))cfg.chmod(0o600)这行别省配置文件里存的是明文 Key权限放开等于把 Key 摊给同机器所有人看。4. 验证请求用 my-agent-py chat 跑通并看 stderr配置改完先设环境变量再跑一次确认请求真的走通了export TAOTOKEN_API_KEY你刚创建的Key my-agent-py chat 用一句话解释什么是 CLI 的退出码契约如果 stdout 打印出模型回复说明 Base URL 和 Key 都生效了。但光看回复还不够我们要确认请求确实走了 TaoToken 而不是别的地址。这时候把 token 用量和延迟写到 stderr 就派上用场了——原文 10.3.3 的注意里提过模型回复走 stdout元数据走 stderr上游解析器读 stdout 只看到内容调试和计量靠 stderr。在chat子命令里加一段元数据输出import sys import time cli.command() click.argument(prompt) click.option(--model, defaultclaude-sonnet-4-5) def chat(prompt, model): 与大模型对话 client build_client() start time.time() resp client.messages.create( modelmodel, max_tokens1024, messages[{role: user, content: prompt}], ) elapsed time.time() - start click.echo(resp.content[0].text) # 元数据走 stderr不污染 stdout print( f[meta] model{resp.model} fin{resp.usage.input_tokens} fout{resp.usage.output_tokens} flatency{elapsed:.2f}s, filesys.stderr, )再跑一次把 stdout 和 stderr 分开看my-agent-py chat 写一个 Python 函数判断字符串是否为回文 2meta.log cat meta.logmeta.log里应该能看到类似[meta] model... in... out... latency...的行。有这行就说明请求完整走通了token 用量和延迟都拿到了。如果 stdout 有回复但 stderr 没有 meta 行检查一下print(..., filesys.stderr)是不是被别的地方重定向了。验证模型本身是否可用也可以直接在模型对话页面发一条测试消息确认 Key 的权限和额度没问题。这一步和 CLI 里的调用是两条独立通道但用的是同一把 Key。5. 本篇常见错排查配 Base URL 这一步报错往往不直观下面几个是我和读者都遇到过的。404 或路径重复最常见的原因是 Base URL 多写了/v1。Anthropic SDK 会在 Base URL 后拼/v1/messages你写https://taotoken.net/api/v1就变成/api/v1/v1/messages。正确写法是https://taotoken.net/api不带/v1。401 未授权Key 没读到或者读到了空字符串。先确认echo $TAOTOKEN_API_KEY有值再确认resolve_api_key()里的环境变量名和export的名字一致。如果用的是配置文件检查~/.my-agent/config.json里字段名是不是taotoken_api_key以及文件权限是不是 0600。请求超时或连接失败检查 Base URL 有没有拼错https://taotoken.net/api这个地址不要加尾部斜杠以外的任何东西。另外确认网络环境能正常访问该地址公司内网如果有出站限制需要让网络管理员放行。stdout 混入元数据如果上游解析器报 JSON 解析失败多半是 meta 行写到了 stdout。检查print的filesys.stderr参数有没有漏。流式模式下尤其要注意click.echo(text, nlFalse)是写 stdout 的meta 行必须单独走 stderr。Key 泄露风险如果git log里出现过 Key立刻去控制台吊销重新创建。已经 commit 的 Key 即使后来删掉历史记录里还在。配置文件权限没设 0600 的补上chmod 600 ~/.my-agent/config.json。提示排障时把--model换成一个确定可用的模型名再试排除模型名写错导致的 400。模型名和 Key 的可用范围有关具体以控制台里能看到的为准。6. 把模型调用通道固定下来到这里my-agent-py chat的模型调用通道就配好了Key 从TAOTOKEN_API_KEY或配置文件读Base URL 指向https://taotoken.net/apistdout 出回复、stderr 出用量和延迟。这套配置的好处是密钥来源集中以后再加summarize、translate之类的子命令直接复用build_client()就行不用每个命令都写一遍 SDK 初始化。如果你打算长期在编码和 Agent 场景里用这套通道可以了解一下 Coding Plan它更适合高频调用和 Agent 工作流。需要管理多把 Key、看调用量的话控制台里的 API Keys 页面能直接创建和吊销。接入过程中如果遇到 SDK 参数问题接入文档里有更细的字段说明。下一步可以做的是把chat子命令的流式输出和--output json模式对齐——流式走 stdout 给人看JSON 模式等完整响应一次性输出meta 始终走 stderr。这样你的 CLI 就同时具备了「给人用」和「给 Agent 调度」两种形态的雏形路径二和路径三也就自然接上了。

相关新闻

网络安全面试经验越看越乱?让 Codex 走 TaoToken 通道按 360 知识库目录排查

网络安全面试经验越看越乱?让 Codex 走 TaoToken 通道按 360 知识库目录排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 0:05:43 阅读更多 →
AWS创业加速器申请条件全解析:产品、技术、团队与发展逻辑

AWS创业加速器申请条件全解析:产品、技术、团队与发展逻辑

1. 先搞清楚AWS创业加速器到底在筛什么很多AI方向的创业者一听到“AWS创业加速器”这几个字,第一反应就是“是不是要有很强的技术团队才能进”。我前后帮三个团队走过这套申请流程,也跟几位参与过评审的朋友聊过,实际情况跟大多数人想的不太一…

2026/9/22 0:05:43 阅读更多 →
Vulkan光线追踪实现与动态渲染优化

Vulkan光线追踪实现与动态渲染优化

1. 光线追踪技术概述与Vulkan实现路径光线追踪作为近年来图形学领域的重大突破,正在彻底改变实时渲染的技术格局。与传统光栅化渲染相比,光线追踪通过模拟光线在场景中的物理传播行为,能够实现更加真实的阴影、反射和全局光照效果。在Vulkan生…

2026/9/22 0:05:43 阅读更多 →

最新新闻

蓝绿厂是指什么手机?3个代码案例搞定性能优化痛点

蓝绿厂是指什么手机?3个代码案例搞定性能优化痛点

蓝绿厂是指什么手机?3个代码案例搞定性能优化痛点 你复制来的代码跑不通,报错信息一片红,完全不知道从哪调起?别慌,这不是你代码写得烂,而是没掌握 性能优化…

2026/9/22 0:45:11 阅读更多 →
手写实现千手罗汉:3步搞定面试高频考点

手写实现千手罗汉:3步搞定面试高频考点

手写实现千手罗汉:3步搞定面试高频考点 面试被问“千手罗汉”原理答不上来,太尴尬了。很多候选人只背概念,手写实现时卡壳。面试官看的是代码功底,不是死记硬背。 考点梳理:别把千手罗汉想太玄乎…

2026/9/22 0:45:11 阅读更多 →
逍遥模拟器源码拆解:从入门到精通的底层逻辑

逍遥模拟器源码拆解:从入门到精通的底层逻辑

逍遥模拟器源码拆解:从入门到精通的底层逻辑 面试被问“进程间通信怎么保证原子性”时,你卡壳了。 面试官追问:“那在模拟环境里,Android 进程和宿主机进程的数据同步怎么做的?” 你支支吾吾,只能说出…

2026/9/22 0:45:11 阅读更多 →
3个戴明盟图解原理技巧,告别只会背书的尴尬

3个戴明盟图解原理技巧,告别只会背书的尴尬

3个戴明盟图解原理技巧,告别只会背书的尴尬 刚拿到证书的朋友,是不是经常陷入一种怪圈?戴明盟图解原理看了一百遍,PPT上的箭头画得再漂亮,一到面试官面前问“这个流程在实际项目中怎么落地”,脑子就一片空白。很多人觉得这是理论太深,其实不然,这…

2026/9/22 0:45:11 阅读更多 →
图解原理:blcs 配置避坑,3 招搞定环境卡死

图解原理:blcs 配置避坑,3 招搞定环境卡死

图解原理:blcs 配置避坑,3 招搞定环境卡死 配置环境就卡半天?别急,这锅不全是你的。很多刚接触 blcs 的同行,尤其是从前端转后端,或者像我们这种平时搬砖搞建筑的,一遇到依赖冲突和版本不匹配,心态容易崩。其实 blcs…

2026/9/22 0:45:11 阅读更多 →
3个后端踩坑实录:手写实现校验哪个邮箱好用

3个后端踩坑实录:手写实现校验哪个邮箱好用

3个后端踩坑实录:手写实现校验哪个邮箱好用 刚学会 Python 或 Java 的语法,是不是感觉自己也行了? 结果一动手写个用户注册模块,对着需求文档里的“哪个邮箱好用”发愣,不知道该怎么下手。…

2026/9/22 0:44:10 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →