ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

一天一个开源项目(第33篇):MyCodeAgent - 用 settings.json 骨架配 TaoToken 跑通 Claude Code 风格代码代理

一天一个开源项目(第33篇):MyCodeAgent - 用 settings.json 骨架配 TaoToken 跑通 Claude Code 风格代码代理 1. 为什么我要把 MyCodeAgent 接到 TaoToken 上跑MyCodeAgent 是一个面向学习的 Claude Code 风格代码代理框架用 Function Calling 驱动工具调用内置 LS、Glob、Grep、Read、Write、Edit、Bash 等工具还支持 Skills、Task 子代理和 MCP 扩展。它适合想搞懂「代码代理内部到底怎么运转」的开发者——工具协议怎么定义、上下文怎么压缩、Trace 怎么落盘这些在闭源产品里看不到的东西它都摊开给你看。但真跑起来会遇到一个很实际的问题模型通道怎么配。MyCodeAgent 默认走 OpenAI 兼容接口你得填 API Key、Base URL、模型名。如果每个项目都单独申请一套 Key管理起来很碎换模型时又要改一堆环境变量。我试过把 MyCodeAgent 的模型通道统一收到 TaoToken 上用一份 Key 覆盖多个模型配置只改一个settings.json骨架就能跑通。这篇就聚焦本地配置落地给你一份可复制的settings.json骨架把 TaoToken 作为统一 Key/API 通道接进去然后做一次端到端验证——确认代理能正常发起 Function Calling 工具调用并拿到结果。全程不需要你改 MyCodeAgent 的核心代码只动配置层。适合谁看已经在本地 clone 了 MyCodeAgent、想跑通第一个工具调用链的开发者或者想学 Claude Code 风格代理框架、但卡在模型接入这一步的人。下面从环境准备开始一步步来。2. 前置准备TaoToken 通道与 MyCodeAgent 环境2.1 先拿到 TaoToken 的 Key 和接入地址TaoToken 在这里扮演的角色是「统一模型通道」你用它提供的 Key 和 API 地址就能以 OpenAI 兼容格式调用后端模型。MyCodeAgent 本身支持自定义base_url和api_key所以对接很自然。你需要准备两样东西一个 API Key在 TaoToken 控制台的 API Keys 页面创建形如sk-开头的一串字符。接入地址https://taotoken.net/api这是 OpenAI 兼容的根路径MyCodeAgent 会在后面拼/v1/chat/completions之类的端点。创建 Key 的入口在这里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。建议单独建一个给 MyCodeAgent 用的 Key方便后面按项目排查用量。注意Key 只显示一次创建后立刻复制到本地安全位置。不要写进会提交到 Git 的文件里。2.2 确认 MyCodeAgent 的依赖装好了MyCodeAgent 要求 Python 3.8。如果你还没拉代码先做这一步git clone https://github.com/YYHDBL/MyCodeAgent.git cd MyCodeAgent python -m venv venv source venv/bin/activate # Windows 用 .\venv\Scripts\activate pip install -r requirements.txt依赖里包含openai、pydantic、mcp、anyio、rich、prompt_toolkit。装完后可以用pip list | grep openai确认 openai SDK 在列。MyCodeAgent 的 Function Calling 走的就是这个 SDK 的 tool 调用能力所以版本别太旧。2.3 理解 settings.json 在项目里的位置MyCodeAgent 的配置分两层一层是.env里的环境变量模型、上下文窗口、Trace 开关等另一层是项目根目录的mcp_servers.jsonMCP 工具。而我们要做的settings.json骨架是把「模型通道」这一块单独抽出来让 Key、Base URL、模型名集中管理避免散落在多个.env里。这个骨架不是 MyCodeAgent 原生强制的文件而是我推荐的一种组织方式用一个 JSON 描述「供应商 → 通道 → 模型」的映射再在启动脚本里读它、注入环境变量。这样你换模型时只改 JSON不动代码。3. 可复制的 settings.json 骨架与加载脚本3.1 settings.json 骨架在项目根目录新建settings.json内容如下。把sk-你的Key换成 2.1 里拿到的真实 Key{ default_provider: taotoken, providers: { taotoken: { base_url: https://taotoken.net/api, api_key: sk-你的Key, models: { main: claude-sonnet-4-20250514, light: claude-haiku-4-20250514 } } }, runtime: { temperature: 0.7, context_window: 128000, compression_threshold: 0.8, enable_agent_teams: false, trace_enabled: true, trace_dir: memory/trace } }几个字段说明一下。base_url用 TaoToken 的 API 根路径不带任何查询参数。models.main是主代理用的模型models.light是 Task 子代理用的轻量模型——MyCodeAgent 支持主/轻量模型分离子代理跑轻量模型能省成本。runtime里是上下文和 Trace 相关开关enable_agent_teams先关着等基础链路跑通再开。注意settings.json含明文 Key务必加进.gitignore。可以再建一个settings.example.json提交到仓库把 Key 留空。3.2 加载脚本把 JSON 注入环境变量MyCodeAgent 读的是环境变量所以需要一个加载器把settings.json转成os.environ。在scripts/下新建load_settings.pyimport json import os from pathlib import Path def load_settings(path: str settings.json) - dict: cfg_path Path(path) if not cfg_path.exists(): raise FileNotFoundError(fsettings file not found: {path}) with cfg_path.open(r, encodingutf-8) as f: cfg json.load(f) provider_name cfg[default_provider] provider cfg[providers][provider_name] os.environ[OPENAI_API_KEY] provider[api_key] os.environ[OPENAI_BASE_URL] provider[base_url] os.environ[DEFAULT_MODEL] provider[models][main] os.environ[LIGHT_LLM_MODEL_ID] provider[models][light] os.environ[LIGHT_LLM_API_KEY] provider[api_key] os.environ[LIGHT_LLM_BASE_URL] provider[base_url] runtime cfg.get(runtime, {}) os.environ[TEMPERATURE] str(runtime.get(temperature, 0.7)) os.environ[CONTEXT_WINDOW] str(runtime.get(context_window, 128000)) os.environ[COMPRESSION_THRESHOLD] str(runtime.get(compression_threshold, 0.8)) os.environ[ENABLE_AGENT_TEAMS] str(runtime.get(enable_agent_teams, False)).lower() os.environ[TRACE_ENABLED] str(runtime.get(trace_enabled, True)).lower() os.environ[TRACE_DIR] runtime.get(trace_dir, memory/trace) return cfg if __name__ __main__: cfg load_settings() print(loaded provider:, cfg[default_provider]) print(main model:, os.environ[DEFAULT_MODEL])这个脚本做了三件事读 JSON、把供应商信息写进OPENAI_API_KEY/OPENAI_BASE_URL、把主/轻量模型分别注入。MyCodeAgent 的 openai SDK 客户端会自动读这两个环境变量所以不用改它的初始化代码。3.3 在启动入口挂上加载器打开scripts/chat_test_agent.py在文件最顶部、导入 MyCodeAgent 模块之前加两行from load_settings import load_settings load_settings()顺序很关键必须在 MyCodeAgent 创建 LLM 客户端之前执行否则环境变量还没生效。加完后启动 CLI 时就会自动走 TaoToken 通道。如果你不想改原文件也可以写一个包装脚本scripts/run_with_taotoken.pyfrom load_settings import load_settings load_settings() import runpy runpy.run_path(scripts/chat_test_agent.py, run_name__main__)然后python scripts/run_with_taotoken.py启动。这样原文件保持干净升级时不容易冲突。4. 端到端验证让代理发起一次工具调用4.1 启动并观察通道是否生效先跑加载器自检python scripts/load_settings.py预期输出loaded provider: taotoken main model: claude-sonnet-4-20250514如果这里报FileNotFoundError说明settings.json不在当前工作目录检查你是不是在项目根目录执行。如果 Key 字段是空的检查 JSON 里有没有漏填。接着启动交互式 CLIpython scripts/run_with_taotoken.py启动后你会看到 MyCodeAgent 的 Enhanced CLI UI带工具调用树和 token 统计。如果通道配错通常在这一步就会报 401 或连接错误而不是等到发消息才报——因为初始化时会做一次模型探测。4.2 触发 Function Calling读一个文件在 CLI 里输入一句会触发工具调用的话比如帮我读一下 README.md 的前 20 行然后告诉我这个项目支持哪些内置工具MyCodeAgent 的主代理会走 Function Calling 流程LLM 返回一个tool_calls指定调用Read工具参数是pathREADME.md、limit20。工具执行后返回统一响应结构status/data/text/stats再回传给 LLM 生成最终回答。你要观察三个信号CLI 里出现工具调用树显示Read节点和它的参数。token 统计有数字变化说明请求确实打到了 TaoToken 通道。最终回答里包含 README 的真实内容而不是模型编的。如果这三样都出现说明「TaoToken 通道 → Function Calling → 工具执行 → 结果回传」这条链路是通的。4.3 验证 MCP 调用链基础工具跑通后再验证 MCP。在项目根目录建mcp_servers.json{ mcpServers: { filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, ./] } } }这个 MCP 服务提供文件系统访问工具。重启 CLI 后输入用 MCP 的文件系统工具列出当前目录下的所有 .py 文件主代理会先通过 MCP 客户端拉起npx子进程拿到该服务暴露的工具列表再决定调用哪个。你会在 Trace 里看到 MCP 工具的注册和调用记录。这一步能跑通说明 MyCodeAgent 的 MCP 扩展链路和 TaoToken 通道是兼容的——因为 MCP 工具调用最终也是通过 Function Calling 协议走的。4.4 看 Trace 确认调用链落盘验证完别忘了看 Trace。默认TRACE_ENABLEDtrue、TRACE_DIRmemory/trace跑完一次会话后ls memory/trace/你会看到 JSONL 和 HTML 两种文件。打开 HTML里面是可视化的工具调用树每个节点带耗时、token 数、输入输出。JSONL 适合用脚本做批量分析。这一步是 MyCodeAgent 相比很多 Demo 型项目的优势——行为可追溯出问题能复现。5. 本篇常见错排查5.1 401 Unauthorized 或 invalid api key最常见的原因是 Key 没生效。按顺序查settings.json里api_key是否填了真实值load_settings()是否在创建客户端之前调用环境里有没有旧的OPENAI_API_KEY覆盖了它。可以在加载器里加一行print(os.environ[OPENAI_API_KEY][:8])确认前 8 位对得上。另一个可能是base_url写成了带/v1的完整路径。TaoToken 的根路径是https://taotoken.net/apiopenai SDK 会自己拼/v1/chat/completions你多写一层就 404 或 401。5.2 模型名报 model not foundsettings.json里的模型名必须是 TaoToken 通道支持的标识。如果你不确定有哪些可用去模型对话页面实际发一条消息看它用的模型标识是什么https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。把那里能跑通的模型名填进models.main。5.3 工具调用不触发模型只回文本如果模型只输出自然语言、不返回tool_calls通常是模型本身对 Function Calling 支持不好或者系统提示词里的工具描述没注入。先确认你用的模型支持 tool use再检查 MyCodeAgent 的prompts/目录有没有被正确加载。换一个工具调用能力更强的模型通常能解决。5.4 MCP 服务起不来npx命令找不到说明 Node.js 没装或不在 PATH。MCP 服务是独立子进程和 Python 环境无关需要单独装 Node。另外mcp_servers.json里的args路径要写对相对路径是相对于启动 CLI 时的工作目录不是相对于 JSON 文件。5.5 上下文超限或响应变慢长会话下如果CONTEXT_WINDOW设得比模型实际窗口大会触发截断策略。检查COMPRESSION_THRESHOLD是否合理0.8 表示用到 80% 就开始压缩。工具输出过长时MyCodeAgent 会把超限部分写到tool-output/你可以调TOOL_OUTPUT_MAX_LINES控制阈值。响应变慢往往是历史压缩在跑看 Trace 里的耗时分布能定位。6. 把通道固定下来继续往上搭配置跑通之后建议把settings.json骨架固化到你的开发流程里新项目直接复制这份骨架只改models字段就能换模型。如果你要长期跑编码类任务、或者搭多角色 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 。Key 管理和用量查看在控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。MyCodeAgent 本身还在持续维护AgentTeams 是实验性功能默认关闭。等你把基础工具调用和 MCP 链路跑顺了再把enable_agent_teams打开用TeamCreateTask(modepersistent)试多角色协作。到那一步你就不只是「会用 Agent」而是能读懂它每一步为什么这么走了。
返回列表