1. WSL 里跑 ForgeCode 的真实场景与资源取舍
ForgeCode 是一个终端里的 AI 编码代理,跑在命令行里,能读文件、改代码、执行命令。它和 opencode 属于同一类工具,但资源占用明显更小,在 terminal bench 这类终端任务评测里得分也不低。如果你的机器内存不宽裕,或者你习惯在 WSL 里做开发,ForgeCode 是个值得试的选择。
我这次的目标很明确:在 WSL(Ubuntu 22.04)里把 ForgeCode 装起来,并且把它的两类模型端点——AnthropicCompatible 和 OpenAICompatible——统一指向 TaoToken 的 API 通道。这样做的原因是,ForgeCode 本身通过 LiteLLM 做模型路由,而 LiteLLM 支持自定义 base_url,只要把端点地址和 Key 换掉,就能让所有请求走同一个入口,不用在多个供应商之间来回切配置。
适合谁看:已经在 WSL 里做开发、想找一个轻量终端编码代理的人;手里有 TaoToken 的 Key、想把 Claude 系和 OpenAI 系模型统一管理的人;以及第一次配 LiteLLM、被 base_url 和 model 名绕晕的人。
整个流程分四步:依赖检查、安装 ForgeCode、配置 LiteLLM 的两类端点、用 curl 验证请求真的走通了。每一步我都会给出可复制的命令和配置片段,你照着改路径和 Key 就能用。
先说清楚一个概念,避免后面混淆。ForgeCode 自己不直接发请求,它把模型调用交给 LiteLLM。LiteLLM 是一个代理层,对外暴露一个 OpenAI 兼容的接口,对内可以路由到不同供应商。所以我们要改的其实是 LiteLLM 的配置,让它把 AnthropicCompatible 和 OpenAICompatible 两类请求都转发到 TaoToken。理解这一点,后面的配置就顺了。
WSL 环境有个坑要先提醒:字体。ForgeCode 的终端界面依赖 Nerd Font 图标,如果字体没装对,界面会显示一堆方块。Windows 下要装字体,WSL 里的终端也要选同一个字体,两边保持一致。这个后面安装章节会细说。
2. TaoToken 前置准备与 LiteLLM 安装要点
在动 ForgeCode 之前,先把 TaoToken 这边的准备工作做完。你需要一个可用的 API Key,以及确认要用的模型 ID。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 参数,配置里填的就是这个干净地址。
拿 Key 的路径:进控制台,找到 API Keys 页面,新建一个 Key 并复制保存。这个 Key 后面会同时用在 AnthropicCompatible 和 OpenAICompatible 两类配置里,所以只需要一个。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
模型 ID 这块要注意:TaoToken 的模型命名和官方可能不完全一样,配置前先在模型对话页面确认一下你要用的模型标识。模型对话入口是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。你可以在这里发一条测试消息,确认模型可用,同时记下模型 ID 的准确写法。
接下来装 LiteLLM。LiteLLM 有两种用法:一种是作为 Python 库直接调用,一种是作为代理服务(proxy)跑起来。ForgeCode 需要的是代理模式,因为要暴露一个 HTTP 端点给 ForgeCode 调用。安装命令:
pip install 'litellm[proxy]'如果你用 pipx 管理命令行工具,也可以:
pipx install 'litellm[proxy]'装完后验证一下版本:
litellm --version能打印出版本号就说明装好了。这里有个常见问题:WSL 里默认的 Python 可能是 3.10 以下,LiteLLM 新版本要求 3.9+,建议用 3.11。如果版本太低,先升级 Python 或者用 conda 建一个虚拟环境。
LiteLLM 的配置文件默认放在当前工作目录,文件名通常叫config.yaml。我们后面会在这个文件里写两类端点的配置。配置文件的位置你可以自己定,启动时用--config指定路径就行。
还有一点:LiteLLM proxy 默认监听 4000 端口。如果你 WSL 里 4000 被占了,启动时会报端口冲突,换一个端口即可,比如 4001。这个端口号后面 ForgeCode 的配置里要对应上。
3. 可复制的 LiteLLM 配置:两类端点统一指向 TaoToken
这一节是核心。我们要在config.yaml里同时配好 AnthropicCompatible 和 OpenAICompatible 两类端点,让它们都走 TaoToken。
先解释一下这两类的区别。AnthropicCompatible 指的是请求格式遵循 Anthropic Messages API 的规范,OpenAICompatible 指的是遵循 OpenAI Chat Completions 的规范。LiteLLM 会根据模型名前缀或者 provider 字段来决定用哪种格式转发。我们要做的是:不管哪类,base_url 都指向 TaoToken,api_key 都用同一个。
下面是一份可直接复制的config.yaml:
model_list: - model_name: claude-sonnet litellm_params: model: anthropic/claude-sonnet-4-20250514 api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY litellm_settings: drop_params: true general_settings: master_key: sk-your-local-master-key逐段说明。model_list里每一项是一个模型映射。model_name是 ForgeCode 那边调用的名字,你可以自定义,比如claude-sonnet。litellm_params.model是 LiteLLM 内部识别的模型标识,前缀anthropic/或openai/决定用哪种请求格式。api_base统一填https://taotoken.net/api。api_key这里用了环境变量引用,避免把 Key 写死在文件里。
litellm_settings.drop_params: true这个很关键。不同供应商对参数的支持不一样,比如某些模型不接受temperature或top_p,开了 drop_params 后 LiteLLM 会自动丢弃不支持的参数,避免请求报错。这个在跨供应商场景下几乎是必开的。
general_settings.master_key是 LiteLLM proxy 自己的访问密钥,ForgeCode 调用本地 proxy 时要用它。这个和 TaoToken 的 Key 是两回事,别搞混。你可以随便设一个,比如sk-local-123。
设置环境变量:
export TAOTOKEN_API_KEY="你的TaoToken Key"如果你想让这个变量持久化,写进~/.bashrc或~/.zshrc:
echo 'export TAOTOKEN_API_KEY="你的TaoToken Key"' >> ~/.bashrc source ~/.bashrc启动 LiteLLM proxy:
litellm --config ./config.yaml --port 4000看到类似Uvicorn running on http://0.0.0.0:4000的输出就说明起来了。注意这里监听的是 4000 端口,和配置文件里 ForgeCode 要填的地址对应。
如果你用的是 TOML 格式的配置(有些工具链偏好 TOML),等价写法是这样:
[[model_list]] model_name = "claude-sonnet" [model_list.litellm_params] model = "anthropic/claude-sonnet-4-20250514" api_base = "https://taotoken.net/api" api_key = "os.environ/TAOTOKEN_API_KEY" [[model_list]] model_name = "gpt-4o" [model_list.litellm_params] model = "openai/gpt-4o" api_base = "https://taotoken.net/api" api_key = "os.environ/TAOTOKEN_API_KEY" [litellm_settings] drop_params = true两种格式选一种就行,LiteLLM 都支持。我个人习惯 YAML,因为文档示例多,复制改起来快。
配置写完后,ForgeCode 那边要填的 Base URL 是http://localhost:4000/v1,Key 填general_settings.master_key那个值,Model ID 填model_name,比如claude-sonnet。这三件套(Base URL + Key + Model ID)在 ForgeCode 的配置界面或配置文件里都要对应上,缺一个都跑不通。
4. 验证请求:curl 打通与 ForgeCode 首次运行
配置写完不能直接信,先用 curl 验证 LiteLLM proxy 能不能正常转发到 TaoToken。这一步能帮你把配置问题和 ForgeCode 问题分开。
先测 OpenAICompatible 端点:
curl http://localhost:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-local-123" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "说一句你好"}] }'注意这里的Authorization用的是 LiteLLM 的 master_key,不是 TaoToken 的 Key。如果返回里有choices字段和正常的文本内容,说明 OpenAICompatible 这条路通了。
再测 AnthropicCompatible 端点。LiteLLM 对 Anthropic 格式的请求也做了兼容,可以用/v1/messages:
curl http://localhost:4000/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: sk-local-123" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet", "max_tokens": 100, "messages": [{"role": "user", "content": "说一句你好"}] }'如果返回里有content数组和文本块,说明 AnthropicCompatible 也通了。两条都通,就证明 LiteLLM 的配置没问题,请求确实经统一 Key 和 API 通道正常返回了。
接下来装 ForgeCode。按官方文档的步骤来,先搞定字体。Windows 下安装 Nerd Font(比如 JetBrainsMono Nerd Font),然后在 WSL 的终端里选择同一个字体。如果字体没装对,ForgeCode 界面会显示方块,不影响功能但看着难受。
安装 ForgeCode 本体。如果 git 连接顺畅,直接按文档命令装。如果 git 连不上,可以手工下载安装包,然后找个 AI 代码工具帮你改 sh 脚本里的路径。这里有个坑:依赖的bat和fd要从 git 下载最新版,不要用 apt 安装,apt 里的版本太旧,ForgeCode 可能不认。
装完后启动 ForgeCode,在配置里填:
- Base URL:
http://localhost:4000/v1 - API Key:
sk-local-123(你的 master_key) - Model:
claude-sonnet或gpt-4o
保存后发一条测试消息,比如「列出当前目录的文件」。如果 ForgeCode 能正常返回结果,说明整条链路打通了:ForgeCode → LiteLLM proxy → TaoToken → 模型 → 返回。
实测下来,第一次跑通后,后面切换模型只需要改 ForgeCode 里的 Model 字段,LiteLLM 那边不用动。这就是统一端点的好处。
5. 常见报错排查:401、local proxy failed 与 choices 缺失
配置过程中最容易撞的几个错,我按真实报错信息列出来,对照着查。
401 Unauthorized。这个最常见,分两种。一种是 curl 测 LiteLLM 时报 401,说明Authorization头里的 master_key 和配置文件里的general_settings.master_key不一致,检查两边是否一样。另一种是 LiteLLM 转发到 TaoToken 时报 401,说明TAOTOKEN_API_KEY环境变量没生效或者 Key 本身无效。用echo $TAOTOKEN_API_KEY确认变量有值,再去 TaoToken 控制台确认 Key 状态正常。
local proxy failed / connection refused。ForgeCode 报这个,通常是 LiteLLM proxy 没起来,或者端口不对。先确认litellm --config ./config.yaml --port 4000还在运行,然后curl http://localhost:4000/health看有没有响应。如果 WSL 里 4000 被占,换端口后 ForgeCode 的 Base URL 也要同步改。
返回里没有 choices 字段。这个说明请求发出去了,但响应格式不对。常见原因是model名写错了,LiteLLM 找不到对应映射。检查 ForgeCode 里填的 Model ID 是否和config.yaml里的model_name完全一致,大小写敏感。另一个原因是drop_params没开,某些参数被供应商拒绝,开了之后能过滤掉不支持的参数。
OAuth 相关报错。如果你在 ForgeCode 里看到 OAuth 或 token 刷新的提示,说明它可能尝试走官方登录流程。这时候要确认 ForgeCode 的配置里用的是自定义 Base URL 模式,而不是官方账号登录模式。把认证方式切成 API Key,填 LiteLLM 的 master_key。
模型名不识别。TaoToken 的模型 ID 和官方可能不同,比如官方叫claude-sonnet-4-20250514,TaoToken 那边可能用别的写法。去模型对话页面确认准确 ID,然后同步改config.yaml里的litellm_params.model。
排查顺序建议:先 curl 测 LiteLLM 本地端点,通了再测 ForgeCode。这样能把问题定位在 LiteLLM 配置层还是 ForgeCode 层。每次改完配置记得重启 LiteLLM proxy,配置不会热加载。
6. 长期编码与 Agent 场景的接入建议
ForgeCode 跑通后,如果你打算长期用它做编码或者跑 Agent 任务,有几个点值得注意。
第一,LiteLLM 的配置可以扩展成多模型池。比如你同时配claude-sonnet、gpt-4o、deepseek几个model_name,ForgeCode 里按任务切换。复杂重构用 Claude 系,快速补全用轻量模型,成本和质量能平衡。配置里加一项就是多一个模型,不用改代码。
第二,drop_params: true建议一直开着。跨供应商场景下,参数兼容问题很烦,开着它能省很多排查时间。代价是某些参数会被静默丢弃,如果你依赖特定参数,测试时留意一下。
第三,Key 管理。TaoToken 的 Key 放在环境变量里,LiteLLM 的 master_key 可以每个项目设不同的值,方便区分调用来源。不要把 Key 写进 git 仓库,用.env或者环境变量。
第四,如果你要跑长时间 Agent 任务,建议用 Coding Plan 这类按量方案,成本更可控。入口是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各类端点的详细参数说明,配置遇到不确定的地方可以对照查。
第五,WSL 里的网络稳定性。如果遇到请求超时,先确认 WSL 的 DNS 和网络模式正常。WSL2 默认走 NAT,一般没问题,但如果公司网络有特殊限制,可能需要调整。这个和工具本身无关,属于环境问题。
最后说个实用技巧:把 LiteLLM 的启动命令写成一个脚本,比如start-litellm.sh,里面包含环境变量导出和启动命令。每次开机跑一下脚本,省得手动敲。脚本内容:
#!/bin/bash export TAOTOKEN_API_KEY="你的Key" litellm --config ~/forgecode/config.yaml --port 4000给脚本加执行权限chmod +x start-litellm.sh,以后./start-litellm.sh就能起来。ForgeCode 那边配置一次,之后直接用。
整套流程走下来,核心就是把 LiteLLM 当成一个统一网关,ForgeCode 只认本地端点,背后走哪家模型由 LiteLLM 决定。这样换模型、换供应商都不用动 ForgeCode,维护成本低很多。