1. 从一次真实踩坑说起:Trae Agent 到底解决什么问题
Trae Agent 是字节跳动开源的一个基于 LLM 的软件工程 Agent,它把「自然语言指令 → 代码库探索 → 修改文件 → 跑测试 → 输出补丁」这条链路封装成了一个命令行工具。适合谁?适合那些已经用腻了 IDE 插件式补全、想让模型真正动手改代码的开发者,也适合想研究 AI Coding Agent 内部循环机制的同学。
我第一次跑它的时候,卡在了一个很蠢的地方:配置文件里 provider 写的是 anthropic,但环境变量里塞的是 OpenAI 的 Key,结果 CLI 一直报 AuthenticationError,排查了半小时才发现是 provider 和 Key 对不上。这个坑后面会专门讲。
Trae Agent 的核心价值在于它的「工具调用循环」设计。它不像普通的代码补全那样只给你一段建议,而是让 LLM 自己决定:先看哪个文件、跑什么命令、改哪一行、改完怎么验证。整个流程是:LLM 返回一个工具调用 → Agent 执行工具 → 把结果塞回对话 → LLM 再决定下一步。这个循环最多跑 max_steps 次(默认 20),跑完或者模型主动调用 task_done 就结束。
它的工具集不算多但够用:TextEditorTool 负责看文件、建文件、替换文本、插入文本;BashTool 负责跑 shell 命令,而且维护的是一个持久会话,你在第一步 cd 进去的目录,第二步还在;SequentialThinkingTool 是给模型做长链推理用的,官方提示词里明确建议 totalThoughts 至少设 5,复杂问题可以拉到 25;TaskDoneTool 就是收尾信号。
架构上分四层:Agent 层(BaseAgent + TraeAgent)、LLM Client 层(统一 chat 接口,屏蔽 OpenAI 和 Anthropic 的差异)、Tools 层(基类 + 执行器 + 具体工具)、Trajectory 层(把每一步 LLM 请求响应、工具调用结果都记成 JSON)。这个分层的好处是,你想换模型只需要动 LLM Client,想加工具只需要继承 Tool 再注册。
我实测下来,它在「给一个明确的小任务」时表现最稳,比如「写一个斐波那契脚本并跑通」,基本 3 到 5 步就完成。但如果你给的任务太模糊,比如「优化一下这个项目」,它会在探索阶段浪费很多步,最后可能还没到 task_done 就把 20 步用完了。所以用好它的前提是:任务描述要具体,最好带上验收标准。
下面我会从环境准备开始,一步步带你跑通最小闭环,包括怎么用 TaoToken 统一 Key 和 API 通道,避免你在多个 provider 之间来回切换配置。
2. 前置准备:TaoToken 统一 Key 与 API 通道配置
在正式装 Trae Agent 之前,先把模型通道这件事理清楚。Trae Agent 原生支持 OpenAI 和 Anthropic 官方 API,但如果你手上有多个模型的 Key,或者想用一个统一的入口来管理调用,TaoToken 可以帮你把 Base URL 和 Key 收敛成一套配置。这样你在 trae_config.json 里就不用为每个 provider 单独填不同的地址。
TaoToken 的官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。注意 API 地址后面不加 UTM 参数,直接用它作为 Base URL 就行。
你需要先去控制台创建一个 API Key。打开 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,登录后在 API Keys 页面点创建,复制出来的那串就是你的 Key。这个 Key 后面要填到配置文件里,或者通过环境变量传进去。
模型 ID 怎么选?如果你走 OpenAI 兼容通道,常用的有 gpt-4o、gpt-4o-mini;如果走 Anthropic 兼容通道,可以用 claude-sonnet-4-20250514 这类。具体支持哪些模型,可以在模型对话页面先试一下: https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。在那边发一条消息,确认 Key 能用、模型能返回,再回来配 Trae Agent,这样能省掉很多排查时间。
如果你打算长期跑编码任务或者做 Agent 实验,可以看一下 Coding Plan: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。它适合那种每天都要跑很多次 Agent 循环的场景,比按次调用更划算。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面写了不同语言和工具的接入方式,包括 Base URL 怎么填、认证头怎么带。如果你用的是 Claude Code 这类工具,可以参考 https://taotoken.net/claudecode?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 里的说明,思路和 Trae Agent 是相通的:都是把 Base URL 指向统一入口,Key 用同一把。
这里有个关键点:Trae Agent 的配置文件里,api_key 字段填的是你的 TaoToken Key,model 字段填的是模型 ID,而 Base URL 需要在代码或环境变量层面指定。因为 Trae Agent 原生配置里没有直接暴露 base_url 字段,所以你需要通过环境变量 OPENAI_BASE_URL 或 ANTHROPIC_BASE_URL 来覆盖。这一点在后面的配置章节会给出具体写法。
另外提醒一句:不要把 Key 硬编码到会提交到 Git 的文件里。用环境变量或者 .env 文件,并且把 .env 加进 .gitignore。我见过有人直接把 Key 写进 trae_config.json 然后推到公开仓库,结果 Key 被扫走,这种事一次就够疼了。
3. 可复制配置:trae_config.json 与 CLI 最小闭环
这一节给你可以直接复制粘贴的配置片段。先克隆仓库、装依赖,然后写配置文件,最后跑一个任务验证。
安装步骤:
git clone https://github.com/bytedance/trae-agent.git
cd trae-agent
uv sync
如果你没有 uv,可以先装:pip install uv。uv sync 会根据 pyproject.toml 把依赖装到一个虚拟环境里。
接下来创建配置文件 trae_config.json,放在项目根目录。下面这份配置走的是 OpenAI 兼容通道,Base URL 指向 TaoToken:
{
"default_provider": "openai",
"max_steps": 20,
"model_providers": {
"openai": {
"api_key": "你的_TaoToken_Key",
"model": "gpt-4o",
"max_tokens": 128000,
"temperature": 0.5,
"top_p": 1
},
"anthropic": {
"api_key": "你的_TaoToken_Key",
"model": "claude-sonnet-4-20250514",
"max_tokens": 4096,
"temperature": 0.5,
"top_p": 1,
"top_k": 0
}
}
}
注意 default_provider 决定用哪套配置。如果你走 OpenAI 通道,就设成 openai;走 Anthropic 通道就设成 anthropic。两边的 api_key 都可以填同一把 TaoToken Key。
然后设置环境变量,把 Base URL 指过去。Linux/macOS:
export OPENAI_BASE_URL="https://taotoken.net/api"
export OPENAI_API_KEY="你的_TaoToken_Key"
Windows PowerShell:
$env:OPENAI_BASE_URL="https://taotoken.net/api"
$env:OPENAI_API_KEY="你的_TaoToken_Key"
如果你用的是 Anthropic 通道,对应改成:
export ANTHROPIC_BASE_URL="https://taotoken.net/api"
export ANTHROPIC_API_KEY="你的_TaoToken_Key"
配置优先级要记住:命令行参数 > 环境变量 > 配置文件 > 默认值。所以如果你在命令行里传了 --provider 或 --model,会覆盖配置文件里的值。
现在跑一个最小任务:
trae-cli run "创建一个计算斐波那契数列的 Python 脚本,保存为 fib.py,并运行它输出前 10 项"
这条命令会启动 Agent 循环。你会看到它先调用 TextEditorTool 创建 fib.py,然后调用 BashTool 执行 python fib.py,最后检查输出是否符合预期,再调用 task_done。
如果你想进交互模式,可以跑:
trae-cli interactive
然后一行行输入任务,适合调试和观察每一步的工具调用。
查看当前配置:
trae-cli show-config
列出可用工具:
trae-cli tools
这里有个细节:trae-cli 这个命令是 uv sync 之后装到虚拟环境里的。如果你直接敲 trae-cli 提示找不到命令,用 uv run trae-cli run "..." 来跑,或者先 source .venv/bin/activate 激活环境。
配置文件里的 max_tokens 对 OpenAI 通道设的是 128000,这是给大上下文模型用的。如果你用的模型上下文窗口没这么大,调小一点,不然请求可能被拒。temperature 设 0.5 是个折中值,编码任务不需要太发散,但也不能完全确定性,否则遇到需要探索的场景会卡住。
4. 验证请求:一次完整任务的成功结果与轨迹解读
配置写完之后,必须验证一次完整请求,确认 Key、Base URL、模型 ID 三件套都对。我建议用一个「有明确验收标准」的任务来测,这样你能清楚看到 Agent 是否真的完成了闭环。
跑这条命令:
trae-cli run "在当前目录创建一个 hello.py,内容为打印 'hello trae',然后运行它,确认输出包含 hello trae"
正常情况你会看到类似这样的输出流程:
[Step 1] LLM 返回工具调用: text_editor (create)
[Step 1] 工具执行结果: File hello.py created successfully
[Step 2] LLM 返回工具调用: bash (execute)
[Step 2] 工具执行结果: hello trae
[Step 3] LLM 返回工具调用: task_done
[Step 3] 任务完成
如果走到 task_done,说明整条链路通了:LLM 能通过 TaoToken 通道返回工具调用,Agent 能解析并执行,结果能回传,模型能判断任务完成。
轨迹文件默认会写到 trajectory 目录下,是一个 JSON 文件。打开它你能看到每一步的完整记录:发给 LLM 的 messages、LLM 返回的原始响应、工具调用的参数和结果。这个文件在排查问题时非常有用。比如模型返回了一个工具名,但 Agent 说「未知工具」,你就去轨迹里看模型到底返回了什么名字,是不是拼写不一致。
我实测下来,第一次跑通之后,建议再跑一个稍微复杂点的任务,比如:
trae-cli run "创建一个 Python 脚本 add.py,实现两个数相加的函数,并写一个 pytest 测试文件 test_add.py,运行 pytest 确认通过"
这个任务会触发更多工具调用:创建两个文件、跑 pytest、可能还要修测试。你能观察到 Agent 在遇到测试失败时会不会自己回去改代码。如果它改了并且最终测试通过,说明反思机制在工作。
验证模型通道是否真的走了 TaoToken,有个简单办法:去 TaoToken 控制台的用量页面看请求记录。你跑完任务后,那边应该能看到对应的调用次数和模型。如果那边没记录,说明你的 Base URL 没生效,请求可能还是打到了官方地址。
还有一个验证点:模型 ID。如果你在配置里写了一个 TaoToken 不支持的模型名,请求会返回错误。常见的是 model not found 或者 invalid model。这时候去模型对话页面确认一下可用模型列表,换成支持的 ID。
成功跑通一次之后,你就可以把这条命令固化成一个脚本,比如 run_task.sh,里面带上环境变量和 trae-cli run,以后每次测试新任务直接跑脚本就行。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节列几个我遇到过或者社区里高频出现的报错,给你对照排查。
401 AuthenticationError
报错长这样:
openai.AuthenticationError: Error code: 401 - {'error': {'message': 'Invalid API key', 'type': 'invalid_request_error'}}
原因通常是三种:Key 填错了、Key 过期了、或者 Base URL 没生效导致请求打到了官方地址但用的是 TaoToken 的 Key。排查顺序:先 echo $OPENAI_API_KEY 确认环境变量里有值;再 echo $OPENAI_BASE_URL 确认指向 https://taotoken.net/api;然后去 TaoToken 控制台确认 Key 还有效。如果环境变量都对,检查配置文件里的 api_key 是不是覆盖了环境变量——配置优先级里配置文件低于环境变量,但如果你在命令行传了 --api-key,那命令行最高。
local proxy failed / connection refused
httpx.ConnectError: [Errno 111] Connection refused
这种一般是 Base URL 写错了,或者本地网络到不了那个地址。先确认 OPENAI_BASE_URL 没有多余的空格或换行,再确认地址是 https://taotoken.net/api 而不是别的。如果你在公司内网,检查是不是有防火墙拦截。注意:这里不涉及任何代理工具,就是单纯的网络连通性问题,用 curl https://taotoken.net/api 测一下能不能通。
Error reading choices / KeyError: 'choices'
KeyError: 'choices'
这个报错说明返回的 JSON 结构里没有 choices 字段。常见原因是:请求打到了一个不兼容 OpenAI 格式的端点,或者模型名不对导致返回了错误信息但被当成正常响应解析。排查:去轨迹文件里看原始响应体,如果里面是 {"error": ...},那就是请求本身失败了。确认 Base URL 指向的是 OpenAI 兼容通道,模型 ID 在支持列表里。
OAuth / token 相关报错
如果你看到类似 OAuth token expired 或 invalid_grant,说明你用的可能是某种需要 OAuth 的认证方式。Trae Agent 的配置里用的是 API Key 模式,不需要 OAuth。如果你之前配过其他工具的 OAuth 凭据,检查环境变量里有没有残留的 OPENAI_OAUTH_TOKEN 之类的东西,清掉再跑。
工具名不匹配
Unknown tool: text_editor
这种是模型返回的工具名和 Agent 注册的工具名对不上。去轨迹里看模型返回的 tool_calls 里的 name 字段,和 trae-cli tools 列出来的名字对比。如果模型返回的是 text_editor 但注册的是 text_editor_tool,就会报这个。解决办法是在系统提示词里把工具名写清楚,或者检查模型是否支持 function calling。
max_steps 用完但任务没完成
这不是报错,但很常见。Agent 跑了 20 步还没 task_done,直接退出。原因通常是任务太模糊,或者模型在探索阶段绕圈。解决办法:把任务描述写具体,带上验收标准;或者把 max_steps 调大,比如 40。但调大之前先想想是不是任务本身需要拆解。
排查通用思路:先看终端最后几行报错,再去轨迹 JSON 里找对应的原始请求和响应。轨迹文件是你最好的朋友,它记录了完整对话历史,比终端输出详细得多。
6. 从 CLI 到长期编码:把 Trae Agent 接入日常工作流
跑通最小闭环之后,你可以考虑把它接入日常开发流程。几个实际用法:
一是把它当成「自动化小工」。比如每次新建一个 Python 项目,你都要手动建目录、写 pyproject.toml、配 lint、写第一个测试。这些可以用一条 trae-cli run 搞定。任务描述写清楚:「在当前目录初始化一个 Python 项目,包含 pyproject.toml、README.md、src 目录和 tests 目录,用 pytest 作为测试框架」。
二是用它做「代码库问答 + 修改」。给它一个具体 issue 描述,让它去代码库里找相关文件、定位问题、改代码、跑测试。官方提示词里明确要求「先复现 bug 再修复」,所以你在任务描述里最好带上复现步骤,这样它不会跳过验证直接改。
三是结合 Coding Plan 做长期 Agent 实验。如果你要反复跑不同任务、对比不同模型的表现,用统一的 TaoToken 通道可以让你在配置里只改 model 字段就切换模型,不用重新配 Key 和 Base URL。Coding Plan 的入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,适合这种高频调用场景。
如果你用的是 Claude Code 或者类似的 CLI 工具,接入思路是一样的:Base URL 指向 https://taotoken.net/api ,Key 用同一把,模型 ID 按需选。Claude Code 的接入说明在 https://taotoken.net/claudecode?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite ,可以参考它的配置方式,和 Trae Agent 的 trae_config.json 是同一套逻辑。
API Keys 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,你可以给不同工具创建不同的 Key,方便追踪用量和随时吊销。
最后说一个实用技巧:把常用的任务描述存成文本文件,比如 tasks/init_project.txt,然后写个脚本 trae-cli run "$(cat tasks/init_project.txt)"。这样你不用每次手敲长描述,也方便版本管理。任务描述越具体,Agent 跑通的概率越高。我试过把「创建一个 Flask 应用,包含一个 /health 接口返回 {"status":"ok"},并写测试验证」存成文件,每次新项目直接跑,基本一次过。



被折叠的 条评论
为什么被折叠?



