ARTICLE DETAIL

资讯详情

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

Claude Code学习:从 QueryEngine 到 Agent 的 CLI 配置实战

Claude Code学习:从 QueryEngine 到 Agent 的 CLI 配置实战 1. 为什么我要把 Claude Code 的 CLI 拆开来看Claude Code 是 Anthropic 推出的命令行 AI 编程工具它能在终端里直接读写文件、执行命令、跑测试、改代码适合想把 Agent 真正接进日常开发流程的人。但很多人第一次用的时候只把它当成一个会调工具的聊天框结果发现它要么乱改文件要么在长任务里突然变傻。问题不在模型而在于没理解它内部的 QueryEngine 是怎么组织一次 Agent 运行的。我一开始也踩过这个坑给它一个重构这个模块的任务它读了两三个文件就开始瞎猜改完还跑不起来。后来去翻 Claude Code 的源码结构才明白它的能力不是模型 工具这么简单而是一整套闭环main.tsx 做前期预热QueryEngine 负责整个会话的状态编排submitMessage() 才是真正的一次 agent runprompt 是分层装配的工具集是可裁剪的上下文是先保留结构再压缩的。这篇就聚焦 CLI 场景把 QueryEngine 与 Agent 的 prompt 组织方式讲清楚然后给你一份可复制的 settings.json 配置骨架再走一遍 TaoToken 统一 Key/API 通道的接入最后用 CLI 动作验证一次完整的 Agent 调用链路。目标很明确让你跑通一次而不是看完一堆概念。2. 先把 TaoToken 的通道准备好Claude Code 默认走 Anthropic 官方通道但国内直连经常不稳而且多项目切换 Key 很烦。我的做法是用 TaoToken 做统一入口一个 Key 管所有模型调用Claude Code、Cursor、各种 CLI 都指向同一个 API 地址省得每个工具单独配。TaoToken 的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。注意 API 地址不要加 UTM 参数否则部分客户端会把它当成路径的一部分。接入分三步第一步登录后在控制台创建 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 进去之后找到 API Keys 页面新建一个 Key复制出来先存好后面配置要用。第二步确认你要用的模型名。Claude Code 场景下主要用 claude 系列具体型号在模型对话页面能看到 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你只是先验证通道通不通可以直接在模型对话里发一句话试试。第三步把 Key 和 API 地址写进 Claude Code 的配置。Claude Code 读的是环境变量和 settings.json下面直接给骨架。注意API Key 不要提交到 git也不要写进项目里的 settings.json 后推到远端。用环境变量或者用户级配置目录。3. 可复制的 settings.json 配置骨架Claude Code 的配置分两层用户级在~/.claude/settings.json项目级在项目根目录的.claude/settings.json。项目级会覆盖用户级但环境变量优先级最高。我一般把 Key 放环境变量把行为配置放 settings.json。先看环境变量写进~/.zshrc或~/.bashrcexport ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的TaoToken密钥 export ANTHROPIC_MODELclaude-sonnet-4-20250514改完执行source ~/.zshrc让它生效。这里ANTHROPIC_BASE_URL指向 TaoToken 的 API 基址Claude Code 会把请求发到这里由 TaoToken 转发到对应模型。然后是用户级~/.claude/settings.json骨架{ model: claude-sonnet-4-20250514, permissions: { allow: [ Read, Glob, Grep ], ask: [ Bash(git status), Bash(git diff:*), Bash(npm test:*) ], deny: [ Bash(rm -rf:*), Bash(curl:*), Read(./.env) ] }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api } }这份骨架里几个关键点值得说清楚。permissions.allow是自动放行的工具读文件、搜文件这类只读操作放这里Agent 不用每次问你。permissions.ask是需要确认的比如 git 操作、跑测试这些有副作用让 Agent 先问一句更安全。permissions.deny是硬拦截rm -rf、读.env这种直接禁掉防止 Agent 在长任务里手滑。项目级.claude/settings.json可以只放项目相关的{ permissions: { allow: [ Bash(npm run lint), Bash(npm run build) ] } }这样团队里每个人拉下来都能用同一套权限规则但 Key 还是各自的。提示如果你想让 Agent 在项目里更懂行在项目根目录放一个CLAUDE.md把项目结构、构建命令、代码规范写进去。Claude Code 会把它注入上下文相当于给 Agent 一份项目说明书。4. 从 QueryEngine 看 Agent 的 prompt 是怎么装配的配置只是入口真正决定 Agent 表现的是 QueryEngine 怎么组织一次运行。理解这一层你才知道为什么有时候它很聪明有时候又很蠢。QueryEngine 不是把工具借给模型这么简单它负责整个闭环编排。一次会话里它保留 history_memory、tools、skills 这些状态submitMessage()才是真正的一次 agent run。也就是说Agent 不是一次请求而是贯穿整个会话任务的工作流。你在 CLI 里敲一句话背后是 QueryEngine 拿着预热好的状态跑了一轮闭环。prompt 这块Claude Code 不是一大段厉害的话而是分层装配的。system prompt 由环境信息、语言风格、角色约束动态拼出来还允许用户追加或覆盖。tool 的 prompt 单独描述每个工具怎么用、参数怎么填、什么时候调用。多 Agent 协作时还会给 teammate 附加专属说明。这种分层的好处是改一层不影响其他层运行时按状态拼装而不是把所有东西塞进一个字符串。工具集也是可裁剪的。tools.ts里有 file_tools、bash_tools、web_tools 等但模型看到的工具集不一定等于代码里存在的工具集。Claude Code 会根据任务挑选工具你也能通过权限配置裁剪。这就是为什么permissions.deny能起作用——被 deny 的工具根本不会出现在模型可见的工具集里。上下文处理更值得学。它先保留原结构再压缩再处理。工具返回的是一大段终端信息如果不先裁剪后面的压缩就会被低价值大文本拖累。所谓保留结构是不把不同来源、不同性质的信息抹平成一坨自然语言而是保留各自的边界、类型和可操作形态。宁可丢弃连续的文本细节也要保住信息的类型边界、任务状态机和关键引用的骨架。这正是它能支撑长时间、多文件、多步工程任务而不至于在接近上下文窗口时突然变傻的根本原因。文件操作在 Claude Code 里是默认运行时的核心组件不是附加功能。读和写是不同操作有不同的考虑。修改时强调可解释、可展示、可控制。Bash 工具则让结果真正落地但 Shell 能力太强所以需要约束——这就是权限系统存在的意义。5. CLI 验证跑通一次完整 Agent 调用配置好了接下来验证。打开终端进入一个测试项目目录执行claude第一次启动会提示你确认一些设置按提示走完。进入交互界面后先做一个最小验证确认通道通不通claude -p 用一句话说明当前目录是什么项目-p是 print 模式跑完直接输出结果不进入交互。如果返回了合理描述说明 TaoToken 通道和模型都通了。接着验证 Agent 闭环。给它一个需要多步的任务claude -p 读取 package.json找出所有 dependencies然后检查 node_modules 里是否都已安装最后输出缺失的包名这个任务会触发 Read、Glob、Bash 等多个工具QueryEngine 会编排整个流程。如果权限配置里Bash(npm ls:*)在 ask 列表它会先问你如果在 allow 列表直接跑。观察它的执行过程你能看到工具调用是串起来的不是单次请求。再验证一次带文件修改的任务claude -p 在 src/utils 下新建一个 formatDate.js导出一个把时间戳格式化为 YYYY-MM-DD 的函数然后写一个对应的测试文件跑完后检查文件是否真的创建了内容是否符合预期。这一步能验证文件操作能力和上下文保持能力。如果你想验证多轮会话里的状态保持进入交互模式claude然后连续输入 记住这个项目用的是 ES Module不是 CommonJS 现在帮我在 src 下新建一个 index.js导出一个 hello 函数第二句它应该会用export而不是module.exports说明 history_memory 起作用了。提示验证阶段建议先用小项目别一上来就在生产仓库跑。Agent 的权限配置再严也架不住任务描述本身有歧义。6. 本篇常见错排查报错一ANTHROPIC_BASE_URL不生效请求还是打到官方。检查环境变量是否在启动 claude 的同一个 shell 里 export 了。如果你用 IDE 内置终端可能读的是另一套 profile。用echo $ANTHROPIC_BASE_URL确认。报错二401 或 invalid api key。多半是 Key 复制时带了空格或者用了已删除的 Key。去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新生成一个注意 API 地址结尾不要带斜杠。报错三模型名不对返回 model not found。Claude Code 的模型名要和 TaoToken 支持的名称一致。去模型对话页面确认可用型号别自己拼。报错四Agent 一直问权限任务跑不下去。说明permissions.allow太窄。把只读操作和常用构建命令加进 allow把危险操作留在 deny。别图省事全放 allowrm -rf这种一旦放行长任务里真会出事。报错五长任务跑到一半开始胡说。这是上下文压缩的正常表现不是 bug。缓解办法是任务拆小或者在CLAUDE.md里写清楚关键约束让压缩时优先保留这些结构信息。报错六settings.json 改了没反应。Claude Code 只在启动时读配置改完要重启。项目级配置还要确认文件路径是.claude/settings.json不是.claude.json。7. 接下来怎么继续深入跑通一次 Agent 调用只是起点。如果你打算把 Claude Code 长期用在编码和 Agent 工作流里建议去了解一下 Coding Plan它更适合高频、长会话的场景 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面把各种客户端的配置方式都列了遇到接入问题先翻这里。我自己的习惯是新项目先放一个CLAUDE.md把构建命令和目录约定写清楚权限配置从最小 allow 开始跑几次任务后按实际需要加长任务拆成多个-p调用比一次塞一个大任务稳得多。QueryEngine 的闭环能力很强但前提是你给它的上下文和权限边界是清晰的。
返回列表