1. 为什么要在 Windows 上折腾 simple-one-api 和沉浸式翻译
如果你平时看英文文档、追 GitHub issue、读论文,大概率装过沉浸式翻译这类浏览器插件。它默认走的是各家翻译接口,但用久了你会发现两个问题:一是想换成 DeepSeek 这类性价比高的模型时,插件里没有现成选项;二是手里攒了好几个平台的 Key,OpenAI 一个、DeepSeek 一个、讯飞一个,每换一个工具就要重新填一遍,管理起来很乱。
simple-one-api 这个开源项目正好解决第一个问题。它是一个用 Go 写的单可执行文件服务,把 OpenAI 兼容接口、DeepSeek、千帆、讯飞星火、腾讯混元、MiniMax 这些平台的接口统一成一套 OpenAI 格式的 API。你在本地跑起来之后,对外只暴露一个端口、一个统一 Key,任何支持自定义 OpenAI 接口的客户端都能接进来,沉浸式翻译就是其中之一。
这篇内容面向的是 Windows 用户,尤其是刚接触本地服务、看官方 README 有点懵的新手。我会把 simple-one-api 的 Windows 本地部署流程拆成可复制的命令,再演示怎么在沉浸式翻译里新增一个 deepseek-v1 翻译服务,最后用 TaoToken 的统一 Key 通道做一次连通性验证,让你从「服务启动」到「翻译生效」完整跑通一遍。
核心检索词先摆出来:simple-one-api 是一个 OpenAI 接口适配层,能做什么——把多平台大模型 API 统一成一个入口;适合谁——需要在一个客户端里切换多个模型、又不想反复改配置的人。下面进入实操。
2. TaoToken 统一 Key 接入前的准备工作
在动手部署之前,先把「Key 从哪来」这件事理清楚,否则后面配置文件里填什么会卡住。
simple-one-api 的 config.json 里有一个对外统一 Key 的概念,客户端拿这个 Key 访问本地服务,本地服务再拿各个平台真实的 Key 去请求上游。也就是说,你至少需要两类 Key:一类是 simple-one-api 自己生成的「本地统一 Key」,随便设一个字符串就行;另一类是上游模型的真实 Key,比如 DeepSeek 官方给的、或者通过 TaoToken 拿到的统一 Key。
这里我推荐用 TaoToken 的方式接入。原因是它把多个模型的调用收敛到一个 Key 和一套 Base URL 上,你不需要为每个平台单独注册、单独充值、单独记 Key。对于 simple-one-api 这种「一个配置文件管多个模型」的场景,用统一 Key 能少填很多字段,配置也更干净。
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 参数。你需要先去控制台创建一个 API Key,控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建好之后先复制出来,等会儿要填进 config.json。
如果你只是想先验证模型能不能通,可以用模型对话页面快速试一下:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。长期做编码或者跑 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 ,遇到字段不清楚的时候翻一下。
另外,Windows 上要跑 simple-one-api,需要确认两件事:一是装了 Go 环境(如果你选择源码编译),二是 9090 端口没被占用。Go 的安装包去官网下载 msi 一路下一步就行,装完在 PowerShell 里敲go version能看到版本号就说明好了。端口检查可以用netstat -ano | findstr 9090,没输出就说明空闲。
准备工作做完,接下来进入真正的部署环节。
3. simple-one-api 的 Windows 本地部署与 config.json 配置
这一节是全文技术含量最高的部分,我会把 clone、编译、配置、启动四步都写清楚,配置文件片段可以直接复制。
3.1 拉取源码与编译
先建一个工作目录,比如D:\dev\simple-one-api,然后在 PowerShell 里执行:
cd D:\dev git clone https://github.com/fruitbars/simple-one-api.git cd simple-one-api项目是 Go 写的,编译之前确认 Go 环境正常:
go version如果提示找不到命令,说明 Go 没装好或者没加进 PATH,回去检查安装步骤。确认没问题后,在项目根目录执行编译:
go build -o simple-one-api.exe编译成功后目录里会多出一个simple-one-api.exe。如果你不想编译,也可以直接去项目的 Releases 页面下载现成的 exe,效果一样。我试过两种方式,编译出来的体积略小一点,但差别不大。
3.2 config.json 的结构说明
项目根目录有一个config.json,这是整个服务的核心配置。它的外层是服务级设置,内层是各个模型的接入信息。先看外层几个关键字段:
{ "api_key": "sk-local-123456", "load_balancing": "random", "server_port": 9090 }api_key是对外的统一 Key,客户端访问本地服务时填这个,你可以自己改成任意字符串。load_balancing指定多个模型时的选择策略,填random就是随机挑一个。server_port是对外端口,默认 9090,没被占用就别改。
3.3 增加 deepseek-v1 模型配置
接下来是重点:在 models 里增加 DeepSeek 的接入。用 TaoToken 统一 Key 的话,配置片段如下:
{ "models": [ { "name": "deepseek-v1", "model": "deepseek-chat", "type": "openai", "base_url": "https://taotoken.net/api/v1", "api_key": "sk-你的TaoToken密钥" } ] }这里几个字段要对应清楚:name是你在客户端里调用的模型名,也就是沉浸式翻译里要填的那个;model是上游真实模型 ID;type填openai表示走 OpenAI 兼容协议;base_url填 TaoToken 的 API 地址加/v1;api_key填你在控制台创建的那个 Key。
把这段合并进完整的 config.json 后,保存文件。注意 JSON 格式很严格,多一个逗号都会导致启动失败,建议用 VS Code 这类带校验的编辑器改。
3.4 启动服务
配置改完,双击simple-one-api.exe或者在 PowerShell 里执行:
.\simple-one-api.exe看到类似server started on port 9090的输出,就说明服务起来了。这个黑框窗口不要关,关了服务就停了。想后台运行的话,可以用Start-Process -NoNewWindow .\simple-one-api.exe,或者干脆开一个专门的终端窗口挂着。
到这一步,本地服务已经就绪,对外地址是http://localhost:9090/v1,统一 Key 是你在 config.json 里设的那个。
4. 沉浸式翻译新增 deepseek-v1 翻译服务的配置步骤
服务跑起来之后,接下来把它接进沉浸式翻译。整个过程分三步:打开自定义 API 设置、填写接口信息、验证翻译生效。
4.1 打开沉浸式翻译的自定义翻译服务
在浏览器里点开沉浸式翻译的扩展图标,进入设置页面,找到「翻译服务」这一栏。往下翻会看到「自定义 API」或者「添加自定义翻译服务」的入口。不同版本位置略有差异,但关键词都是「自定义」。
点进去之后,界面会让你填几个字段:名称、接口地址、API Key、模型名。这几个字段正好对应我们前面 config.json 里的配置。
4.2 填写接口信息
按下面这样填:
名称可以写deepseek-v1-local,方便自己识别。接口地址填http://localhost:9090/v1/chat/completions,注意这里要带上完整的路径,不能只填到/v1。API Key 填 config.json 里的api_key,比如sk-local-123456。模型名填deepseek-v1,也就是 config.json 里 models 的name字段。
填完之后保存。有些版本的沉浸式翻译会要求你点一下「测试」按钮,如果返回正常就说明连通了。
4.3 设为默认翻译服务并验证
保存后回到翻译服务列表,把刚添加的deepseek-v1-local设为默认。然后随便打开一个英文网页,右键选择「翻译网页」,或者用快捷键触发翻译。如果页面上英文被替换成中文,说明整条链路通了:浏览器 → 本地 simple-one-api → TaoToken → DeepSeek。
如果翻译没反应,先看 simple-one-api 的黑框窗口有没有请求日志输出。有日志说明请求到了本地服务,问题可能出在上游;没日志说明沉浸式翻译没发出去,检查接口地址和端口。
5. 常见报错排查:401、local proxy failed 与 reading choices
部署和接入过程中,最容易卡在几个典型报错上。这一节把真实遇到过的错误和对应解法列出来,对照着查能省不少时间。
5.1 401 Unauthorized
这个报错通常出现在两个位置。一是沉浸式翻译调用本地服务时返回 401,说明你填的 API Key 和 config.json 里的api_key不一致,回去核对一下,注意有没有多余空格。二是 simple-one-api 请求上游时返回 401,说明 config.json 里 models 的api_key填错了,或者 TaoToken 的 Key 已经失效。去控制台重新生成一个,替换进去再重启服务。
5.2 local proxy failed
这个报错一般出现在沉浸式翻译侧,提示本地代理失败。原因通常是 simple-one-api 服务没启动,或者端口被占用后服务实际没起来。先在 PowerShell 里执行netstat -ano | findstr 9090,看端口有没有在监听。如果没有,回到项目目录重新启动 exe,观察黑框里有没有报错。常见的是 config.json 格式错误导致启动中断,用 JSON 校验工具过一遍。
5.3 reading choices 相关报错
如果日志里出现类似reading 'choices'或者cannot read property choices的提示,说明上游返回的结构和预期不符。这种情况多半是base_url或model字段填错了。比如 base_url 少写了/v1,或者 model 填了一个上游不存在的 ID。用 TaoToken 的话,base_url 固定是https://taotoken.net/api/v1,model 填deepseek-chat这类真实 ID,不要填deepseek-v1(那是本地别名)。
5.4 OAuth 与鉴权类问题
如果你在配置过程中看到 OAuth 相关的提示,通常是因为误用了需要 OAuth 流程的接入方式。simple-one-api 走的是 API Key 鉴权,不涉及 OAuth。检查一下是不是把某个需要网页授权的平台配置混进来了。用 TaoToken 统一 Key 的话,全程只需要一个 API Key,不存在 OAuth 环节。
排查的时候有个通用思路:先确认本地服务活着,再确认本地 Key 对得上,最后确认上游 Key 和地址对得上。三层逐一排除,基本都能定位到问题。
6. 从本地服务到统一 Key 的完整闭环
把上面几步串起来,你现在的状态应该是:Windows 上跑着一个 simple-one-api 服务,config.json 里配了 deepseek-v1 指向 TaoToken,沉浸式翻译通过本地端口调用这个模型,网页翻译正常工作。
这套结构的好处是扩展性强。以后想加新模型,比如再加一个gpt-4o-mini,只需要在 config.json 的 models 数组里追加一段,重启服务,沉浸式翻译里换个模型名就行,不用改任何客户端代码。TaoToken 的统一 Key 让上游鉴权也保持单一入口,不用为每个平台单独维护密钥。
如果你后面要做更复杂的编码任务或者跑 Agent,可以看看 Coding Plan 那套方案,接入方式和这里一致,只是使用场景不同。文档里对各个字段有更细的说明,遇到 config.json 里不确定的字段,翻一下 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 基本都能找到答案。
最后留一个实用技巧:config.json 改完之后,建议先备份一份config.json.bak,下次改崩了直接还原,比重头写快得多。服务启动的黑框窗口可以最小化但别关,养成习惯之后,这套本地翻译链路会一直稳定跑着。