1. 为什么 Anaconda 里装完 OpenRouter,Key 反而更乱了
如果你在 Anaconda 环境里跑过 OpenRouter,大概率经历过这个阶段:一开始只想调一个模型,结果项目里慢慢堆了 OpenAI、Claude、Gemini、DeepSeek 好几套 Key,每个 SDK 的初始化方式还不一样。openrouter-env里装完openrouter,另一个环境里又装了openai,.env文件散落在不同目录,改一个 Key 要翻三个文件夹。
这个场景的核心痛点不是「装不上」,而是装完之后多模型调用的入口太分散。OpenRouter 本身是一个聚合层,它把多家模型统一到一个 API 格式下,这已经省了一部分事。但实际项目里,你往往还需要在 OpenRouter 之外保留直连通道,或者团队里有人用 OpenRouter、有人用别的聚合方式,Key 和 base_url 就开始打架。
我试过在一个数据分析项目里同时接三个模型做对比,结果config.toml里写了四组配置,每次换模型都要改代码。后来把 TaoToken 作为统一 Key 和 API 通道接进来,才把这件事收敛成「一个 Key、一个 base_url、多模型名切换」的结构。
这篇要交付的就是这套结构:在 Anaconda 环境下,先完成 OpenRouter SDK 的安装,再用 TaoToken 统一 Key 和通道,给出可复制的config.toml与settings.json骨架,最后用一次真实请求验证多模型调用是否打通。适合已经在用 Anaconda 做本地开发、手里有多个模型 Key、想让配置不再混乱的人。
2. 前置准备:Anaconda 环境与 TaoToken 通道
2.1 创建干净的 conda 环境
Anaconda 最大的好处是环境隔离,所以第一步不是急着装包,而是先建一个专用环境。OpenRouter SDK 要求 Python 3.9 以上,这里用 3.10 比较稳。
打开 Anaconda Prompt,执行:
conda create --name openrouter-env python=3.10 -y conda activate openrouter-env激活成功后,命令行提示符前面会出现(openrouter-env)。这一步别跳过,后面所有 pip 安装都要在这个环境里做,否则包会装到 base 环境,导致「明明装了却 import 不到」。
2.2 安装 OpenRouter SDK 与配置依赖
pip install openrouter python-dotenv tomliopenrouter是官方 SDK,python-dotenv用来读.env,tomli用来解析config.toml(Python 3.11 以下需要它,3.11+ 可用内置tomllib)。如果你在国内网络下 pip 慢,可以临时指定镜像源:
pip install openrouter python-dotenv tomli -i https://pypi.tuna.tsinghua.edu.cn/simple2.3 获取 TaoToken API Key
TaoToken 在这里的角色是统一 Key 与 API 通道。你不需要在代码里分别维护 OpenRouter 的 Key、其他模型的 Key,而是用 TaoToken 的一个 Key 走统一入口,模型名在请求里切换。
获取步骤:
- 打开
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys,登录后创建一个 API Key。 - 复制 Key,形如
sk-开头的一串字符,先存到安全的地方。 - 如果你要确认可用模型列表,可以到
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc查看接入文档里的模型名对照。
注意:Key 只放在
.env或系统环境变量里,不要写进.py文件,也不要提交到 Git。.env要加进.gitignore。
3. 可复制配置:config.toml 与 settings.json 骨架
多模型调用混乱的根源,通常是配置散落在代码各处。解决办法是把「通道配置」和「模型选择」抽出来,放到独立配置文件里。下面给两套骨架,你可以按项目习惯选一套,也可以两套并存:config.toml给 Python 脚本读,settings.json给需要 JSON 配置的工具读。
3.1 config.toml 骨架
在项目根目录新建config.toml:
# config.toml # TaoToken 统一通道配置 [provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" # 从环境变量读取,不写明文 [defaults] model = "gpt-4o-mini" temperature = 0.7 max_tokens = 1024 [models] # 模型别名 -> 实际模型名,方便代码里用短名切换 fast = "gpt-4o-mini" reasoning = "claude-3-5-sonnet" cheap = "deepseek-chat" long_context = "gemini-1.5-pro" [openrouter] # 保留 OpenRouter 直连通道作为备选 enabled = false base_url = "https://openrouter.ai/api/v1" api_key_env = "OPENROUTER_API_KEY"这里的关键设计是[models]段:代码里只写fast、reasoning这样的别名,换模型时改配置文件,不动业务代码。base_url指向 TaoToken 的 API 地址,api_key_env指向环境变量名,避免明文。
3.2 settings.json 骨架
有些工具或框架只认 JSON,那就再放一份settings.json:
{ "provider": { "name": "taotoken", "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY" }, "defaults": { "model": "gpt-4o-mini", "temperature": 0.7, "max_tokens": 1024 }, "models": { "fast": "gpt-4o-mini", "reasoning": "claude-3-5-sonnet", "cheap": "deepseek-chat", "long_context": "gemini-1.5-pro" }, "openrouter": { "enabled": false, "base_url": "https://openrouter.ai/api/v1", "api_key_env": "OPENROUTER_API_KEY" } }两份配置的字段结构保持一致,这样你在 Python 里读 TOML、在别的工具里读 JSON,语义不会错位。
3.3 .env 文件
项目根目录新建.env:
TAOTOKEN_API_KEY=sk-你的TaoToken密钥 OPENROUTER_API_KEY=sk-or-你的OpenRouter密钥.gitignore里加上:
.env config.local.toml4. 验证请求:一次跑通多模型切换
配置写好了,接下来用一段脚本验证「统一 Key + 多模型切换」是否真的通了。这里不依赖 OpenRouter SDK 的特定封装,而是用 OpenAI 兼容的调用方式走 TaoToken 通道,因为 TaoToken 的 API 地址兼容 OpenAI 格式,这样代码更通用。
4.1 编写验证脚本
新建test_multi_model.py:
import os import tomli from dotenv import load_dotenv from openai import OpenAI # 加载 .env load_dotenv() # 读取 config.toml with open("config.toml", "rb") as f: cfg = tomli.load(f) provider = cfg["provider"] api_key = os.getenv(provider["api_key_env"]) if not api_key: raise RuntimeError(f"环境变量 {provider['api_key_env']} 未设置") # 初始化统一客户端 client = OpenAI( api_key=api_key, base_url=provider["base_url"], ) def ask(alias: str, prompt: str) -> str: model_name = cfg["models"][alias] resp = client.chat.completions.create( model=model_name, messages=[{"role": "user", "content": prompt}], temperature=cfg["defaults"]["temperature"], max_tokens=cfg["defaults"]["max_tokens"], ) return resp.choices[0].message.content if __name__ == "__main__": for alias in ["fast", "cheap"]: print(f"--- 模型别名: {alias} ---") print(ask(alias, "用一句话说明什么是向量数据库。")) print()如果你还没装openai包,先补一个:
pip install openai4.2 运行与预期结果
在 Anaconda Prompt 里,确保还在openrouter-env环境,切到项目目录:
cd D:\your_project python test_multi_model.py正常输出会类似:
--- 模型别名: fast --- 向量数据库是一种专门存储和检索高维向量数据的数据库,常用于相似度搜索。 --- 模型别名: cheap --- 向量数据库把文本、图片等转成向量后存储,支持按相似度快速查找。两个别名对应不同模型,但走的是同一个base_url和同一个 Key。这就是「统一 Key 打通多模型调用」的效果:换模型只改config.toml里的[models]映射,代码零改动。
4.3 用模型对话页面做交叉验证
如果你不想写脚本,也可以直接到https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat的模型对话页面,用同一个 Key 对应的账号登录,手动切换模型发一条消息,确认通道本身是通的。脚本报错时,这一步能帮你快速判断是「Key/通道问题」还是「代码问题」。
5. 本篇常见错排查
5.1 ModuleNotFoundError: No module named 'openrouter'
九成是环境没激活。Anaconda 里pip install装到了 base 环境,但运行时用的是openrouter-env。解决:
conda activate openrouter-env pip list | findstr openrouter如果列表里没有,重新在激活状态下装一次。Windows 用findstr,macOS/Linux 用grep。
5.2 401 Unauthorized 或 invalid api key
先确认.env里的变量名和config.toml里api_key_env写的一致。常见错误是.env写TAOTOKEN_KEY,配置里写TAOTOKEN_API_KEY,读出来是None。另外检查 Key 有没有多余空格,复制时容易带上换行。
5.3 base_url 写错导致 404
TaoToken 的 API 地址是https://taotoken.net/api,不要自己拼/v1。有些 OpenAI 兼容客户端会自动补/v1/chat/completions,如果你手动写成https://taotoken.net/api/v1,可能变成/api/v1/v1/...。以接入文档https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc里的说明为准。
5.4 模型名不存在 model not found
config.toml里[models]的值必须是通道支持的模型名。别名fast只是你本地用的短名,真正发出去的是gpt-4o-mini这类实际名称。如果报模型不存在,去文档里核对模型名拼写,注意大小写和连字符。
5.5 TOML 解析报错
Python 3.10 及以下必须装tomli,并且用tomli.load();3.11+ 可以用tomllib.load()。如果你在 3.10 环境里写了import tomllib,会直接ModuleNotFoundError。统一用tomli兼容性最好。
5.6 conda 环境切换后 pip 仍指向旧环境
有时候conda activate后which pip(Windows 用where pip)还指向全局。可以显式用:
python -m pip install openrouter这样保证装进当前环境的 Python 里。
6. 长期编码与 Agent 场景的配置收敛
如果你只是偶尔跑几个脚本,上面的config.toml已经够用。但如果你在做长期编码、Agent 工作流,或者团队协作,Key 和通道的管理还需要再收敛一层。
一个实用做法是把「通道选择」也做成配置项。比如本地开发用 TaoToken 统一通道,CI 环境用另一个 Key,通过环境变量切换:
[provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" [provider.ci] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_CI_KEY"代码里根据os.getenv("APP_ENV")决定读哪一段。这样本地和 CI 共用一套模型别名,只是 Key 不同。
对于需要长期跑编码任务的场景,可以了解 Coding Plan 的额度结构,把高频调用和低频调用分开规划,避免月底额度不够用。入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan,里面有不同档位的说明,按你的实际调用量选。
另外,Anaconda 环境本身也建议定期清理。项目结束后:
conda deactivate conda remove --name openrouter-env --all这样不会在磁盘上堆一堆用不到的虚拟环境。如果同一个项目要长期维护,就把config.toml、settings.json、.env.example一起提交到仓库,.env本身不提交,新人克隆后复制.env.example填自己的 Key 即可。这套结构跑下来,多模型调用的配置就从「散落在代码里」变成了「集中在两个文件里」,换模型、换通道、换环境都只动配置,不动业务逻辑。