Zaimod
快速上手
zaimod 快速接入
获取API接口地址与密钥
API 密钥令牌查询及兑换
软件接入
WorkBuddy 桌面版接入
扣子(Coze)工作流调用 API 教程
RikkaHub 配置教程
Codex 配置API接入教程
Clawdbot 中转站配置教程
OpenClaw 最自定义中转站配置教程
N8N 工作流使用API中转教程
Gemini CLI 中转站配置教程
Claude Code 中转站安装与配置指南
Cherry Studio接入中转站调用MCP
Cherry Studio桌面端API基础配置教程
Dify 添加自定义模型(接入中转站)教程
Cline 配置教程(接入中转站)
aider 中转API配置教程
Cursor 接入中转站配置教程
LobeChat 接入中转站配置教程
ChatBox 接入中转站配置教程
NextChat 接入中转站配置教程
Zotero GPT 插件接入中转站教程
Claude Dev 接入配置教程
沉浸式翻译 接入 GPT 翻译(中转站)
ChatGPT Sidebar 接入配置教程
ChatGPT-on-WeChat 配置教程
GPT Academic(学术优化)配置教程
n8n工作流:本地图片生成视频
opencode 配置教程
CLI 配置
Node.js 环境安装教程
Codex 配置教程
Claude Code 配置
Gemini CLI配置
Antigravity CLI 配置
Grok Build 配置
GLM Claude Code 配置
Kimi Code CLI 配置
CC-Switch配置
CC-Switch 下载安装
CC-Switch 配置 Codex
CC-Switch 配置 Claude Code
CC-Switch 配置 Gemini
CC-Switch 配置 GLM
CC-Switch 配置 Grok Build
EN
# GPT Academic(学术优化)配置教程(接入中转站) > **适用对象**:`binary-husky/gpt_academic`(GitHub 71k+ star,Web 界面版「学术优化」) > **中转站地址**:`https://api.zaimod.com` > **关键一句**:这个项目**没有 base_url 可填**,它靠 `API_URL_REDIRECT` 把**整条 URL 精确替换**——所以填的是**完整端点** `/v1/chat/completions` > **目标**:启动后网页里提问能正常返回,日志里不再出现 OpenAI 官方报错 --- ## 一、先弄清它和其他客户端的根本差别 前面教程里的客户端,界面或配置里总有一个「Base URL / API 地址」空格,你填域名或填到 `/v1`,剩下的它自己拼。 **GPT Academic 没有这个字段。**它的做法是:源码里把 OpenAI 的地址硬编码成常量 ```python openai_endpoint = "https://api.openai.com/v1/chat/completions" ``` 然后启动时读一张**替换表**,如果表里正好有这个字符串,就把整个变量换成你的地址: ```python # request_llms/bridge_all.py if openai_endpoint in API_URL_REDIRECT: openai_endpoint = API_URL_REDIRECT[openai_endpoint] ``` 这带来三个直接后果,也是本篇最容易踩的三个坑: 1. **必须是完整端点**:`https://api.zaimod.com/v1/chat/completions`。只写域名、只写 `/v1`,请求会发到一个不存在的路径。 2. **表里的「键」必须是原样不变的 `https://api.openai.com/v1/chat/completions`**。很多人换域名时把键也一起改了,结果匹配不上,**一段代码都不生效、也不报错**,请求照旧发往官方。 3. **匹配是字符串相等,不是前缀匹配**。少一个 `s`、多一个尾斜杠、写成 `http://`,都等于没配。 所以它属于「**必须填完整端点**」这一类(和沉浸式翻译同派系),不是「填域名」那一类。 --- ## 二、配方:两行生效,但别写进 `config.py` 最小可用配置如下(下文解释每一行为什么这么写): ```python # config_private.py —— 与 config.py 放在同一目录(需自己新建这个文件) API_KEY = "sk-你的中转站令牌" API_URL_REDIRECT = { "https://api.openai.com/v1/chat/completions": "https://api.zaimod.com/v1/chat/completions" } ``` ### 2.1 为什么写 `config_private.py` 而不是 `config.py` 项目的配置读取优先级是固定的: | 优先级 | 来源 | 适合场景 | | ----- | ----------------------- | ------------------------- | | 1(最高) | **环境变量** | Docker 部署 | | 2 | **`config_private.py`** | **本地部署,推荐** | | 3 | `config.py` | 仓库自带,**会被 `git pull` 覆盖** | `config.py` 是**被 git 跟踪的仓库文件**,你在里面改的东西,下次更新代码就冲突或被覆盖。原文说「打开 config 配置文件」但没说改哪个,照做改 `config.py` 的人升级时必然返工一次。 `config_private.py` 只需写你想覆盖的那几项,其余仍走 `config.py` 的默认值。 ### 2.2 为什么两行都写在这一个文件里 `API_KEY` 和 `API_URL_REDIRECT` 分开写在不同文件里也能跑,但**容易出现「Key 是新的、地址是旧的」这种半配状态**——表现是请求打到官方、报 `401 Incorrect API key`,看起来像 Key 错了,其实是地址没生效。放一起,改的时候不容易漏。 --- ## 三、操作步骤 ### 3.1 步骤 1 · 定位项目目录 进入你 clone 下来的 `gpt_academic` 根目录,确认**同目录下同时存在** `config.py` 和 `main.py`: ```text gpt_academic/ ├── config.py ← 模板,只读参考 ├── main.py ← 启动入口 ├── requirements.txt ├── request_llms/ └── shared_utils/ ``` ### 3.2 步骤 2 · 新建 `config_private.py` 在**与 `config.py` 同一层**新建文件,文件名必须完全一致(`config_private.py`,不能写成 `config_private(1).py`、`config-private.py`)。 > 说明:`config_private.py` 不在仓库里,需要自己建。Windows 记事本另存为时注意「保存类型」选「所有文件」,否则会存成 `config_private.py.txt`——这个坑在中文 Windows 上非常常见。 ### 3.3 步骤 3 · 填 Key 打开中转站控制台 →「令牌」→ 新建或复制,粘贴进去: ```python API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ``` 三条注意: - **不要**加 `Bearer ` 前缀,项目自己拼这个头。 - 首尾不要留空格(包括从网页复制时带上的全角空格)。 - 支持**多个 Key 用英文逗号分隔**(`"sk-a,sk-b"`),代码会在多线程插件里轮换使用——免费额度被限流时有用。 ### 3.4 步骤 4 · 填地址替换表 ```python API_URL_REDIRECT = { "https://api.openai.com/v1/chat/completions": "https://api.zaimod.com/v1/chat/completions" } ``` **左边一项一个字都不要改**(它是匹配用的原文),只改右边。写法检查清单: | 检查项 | 正确 | 常见错法 | | --- | ---------------------- | ----------------------------------------------- | | 协议 | `https://` | `http://`(会 301,POST 可能被改写) | | 版本段 | `/v1/chat/completions` | `/v1`、`/chat/completions`、`/v1/chat/completion` | | 尾斜杠 | **不加** | `…/chat/completions/` → 307 重定向 | | 引号 | 英文双引号 | 中文引号「"」→ 语法错误 | 项目其实内置了一个自检:如果**右边**的值不以 `/completions` 结尾,启动时会打一行红色日志并**故意停 5 秒**: ```text [API_URL_REDIRECT] API_URL_REDIRECT填错了。请阅读…项目配置说明。 ``` 看到这行红字就是右边写错了。反过来,**左边写错是没有任何提示的**——这是它最坑的地方。 ### 3.5 步骤 5 · 改默认模型 这一条原文完全没提,但**不改基本跑不通**。`config.py` 里的默认值是: ```python LLM_MODEL = "gpt-3.5-turbo-16k" ``` `gpt-3.5-turbo-16k` 是 2023 年的型号,官方早已下线,中转站通常也只映射常用模型名。不改的话,启动正常、界面正常,一提问就是 `model not found`。 改成中转站**模型列表里真实存在**的名字,例如: ```python LLM_MODEL = "gpt-4o-mini" ``` ⚠️ 规则:**`LLM_MODEL` 必须出现在 `AVAIL_LLM_MODELS` 列表里**(列表可在 `config.py` 第 40 行附近看,`gpt-4o`、`gpt-4o-mini`、`deepseek-chat`、`claude-3-*` 等都在)。不在列表里的模型,下拉框里选不到,也不会被识别。 ### 3.6 步骤 6 · 重启程序 ```bash python main.py ``` **必须重启**:配置在进程启动时读一次并做了 `lru_cache` 缓存,改完文件不重启等于没改(这一点和chatgpt-on-wechat同类)。 启动正常应看到这样的日志(绿色): ```text [API_KEY] 您的 API_KEY 是: sk-xxxxxxxx*** API_KEY 导入成功 ``` --- ## 四、加量:其他端点也能一起走中转 `API_URL_REDIRECT` 的替换表在源码里覆盖了 **11 个端点**,不止 OpenAI 那一条。也就是说,你想让「Claude 模型」「Gemini 模型」也走中转站,加一行就行: ```python API_URL_REDIRECT = { "https://api.openai.com/v1/chat/completions": "https://api.zaimod.com/v1/chat/completions", "https://api.anthropic.com/v1/messages": "https://api.zaimod.com/v1/messages", "https://generativelanguage.googleapis.com/v1beta/models": "https://api.zaimod.com/v1beta/models", } ``` 源码里可替换的原始键(照抄左边即可): | 用途 | 原始键 | | ---------------- | ----------------------------------------------------------- | | OpenAI / Azure 系 | `https://api.openai.com/v1/chat/completions` | | Claude | `https://api.anthropic.com/v1/messages` | | Gemini | `https://generativelanguage.googleapis.com/v1beta/models` | | DeepSeek 官方 | `https://api.deepseek.com/v1/chat/completions` | | xAI Grok | `https://api.x.ai/v1/chat/completions` | | 零一万物 | `https://api.lingyiwanwu.com/v1/chat/completions` | | 火山引擎 | `https://ark.cn-beijing.volces.com/api/v3/chat/completions` | | Ollama(本地) | `http://localhost:11434/api/chat` | | Cohere | `https://api.cohere.ai/v1/chat` | 在中转站实测这三条路径都存在(无令牌时返回 `401 Invalid token`,说明路由正确、只缺鉴权): | 路径 | 返回 | | ------------------------------------------------------ | --------------------- | | `POST /v1/chat/completions` | `401 Invalid token` ✅ | | `POST /v1/messages` | `401 Invalid token` ✅ | | `POST /v1beta/models/gemini-1.5-flash:generateContent` | `401 Invalid token` ✅ | > ⚠️ 但**不建议一上来就配齐**。配了 Claude/Gemini 之后,下拉框里选中的如果是 `claude-3-*`,请求会走 `/v1/messages`——**这条路径的返回格式和 OpenAI 完全不同**,一旦中转站该分组没开通,看到的报错会和「Key 错了」长得很像,排查成本翻倍。先让 OpenAI 那条跑通,再逐个加。 --- ## 五、进阶:用 `one-api-` 前缀接任意模型名 中转站的模型名如果不在 `AVAIL_LLM_MODELS` 的几十个预置里(比如网关自定义的别名),不用改源码,用前缀语法就能接: ```python AVAIL_LLM_MODELS = AVAIL_LLM_MODELS + [ "one-api-gpt-4o(max_token=128000)", "one-api-deepseek-chat(max_token=64000)", ] LLM_MODEL = "one-api-gpt-4o(max_token=128000)" ``` 规则(源码 `bridge_all.py` 里的注释写得很明确): - `one-api-` 是**必需前缀**,它对内复用同一个 `openai_endpoint`——所以**会自动继承你在替换表里配的地址**,不用再配一遍; - 前缀后面是**中转站上的真实模型名**; - `(max_token=数字)` 可省略,不写就用默认值;**写成非整数会报配置错误并跳过该模型**。 加完之后界面下拉框里会出现 `one-api-gpt-4o` 这一项,选中即可。这套机制原本是为「one-api 网关」设计的,对任何 OpenAI 兼容中转站同样适用。 --- ## 六、验收:四步确认它真的走了中转 「启动没报错」不等于「通了」。按顺序做: 1. **看启动日志**:出现绿色 `[API_KEY] … 导入成功`。 2. **看是否有红字**:出现 `API_URL_REDIRECT填错了` → 右边地址写错,回步骤 4。 3. **直接在网页提问**:输入「你好」,能流式返回中文即通。 4. **看中转站控制台**:调用记录里出现一条 `chat/completions`,模型名与你填的一致——**这是唯一能证明「走的是中转站而不是官方」的证据**,比任何界面提示都准。 想脱离 GUI 先单独验令牌,用这条命令(把 Key 换成自己的): ```bash curl https://api.zaimod.com/v1/chat/completions \ -H "Authorization: Bearer sk-你的令牌" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}' ``` 返回 `200` + 一段 JSON(含 `choices`)即令牌与路径都正常;返回 `401 Invalid token` 是令牌问题;返回一整页 HTML 是路径问题。 --- ## 七、常见问题 | 现象 | 原因 | 处理 | | ----------------------------------------- | --------------------------------------- | ------------------------------------------------------ | | 启动日志红字 `API_URL_REDIRECT填错了…` 并卡 5 秒 | 右边地址不以 `/completions` 结尾 | 补全为 `…/v1/chat/completions`,别加尾斜杠 | | 没有任何报错,但请求仍打到官方、报 `401 Incorrect API key` | 替换表的**键**被改动了,匹配不上 | 键必须原样写 `https://api.openai.com/v1/chat/completions` | | `model not found` / 模型不存在 | `LLM_MODEL` 还是 `gpt-3.5-turbo-16k` | 改成中转站模型列表里的名字 | | 下拉框里找不到刚填的模型 | `LLM_MODEL`/模型名不在 `AVAIL_LLM_MODELS` 里 | 加进列表,或用 `one-api-` 前缀 | | 改完配置行为没变化 | 没重启进程 | `Ctrl+C` 后重新 `python main.py` | | 启动报 `KeyError: 'API_URL_REDIRECT'` 之类 | `config_private.py` 写成了 `.txt`,或文件不在根目录 | 检查文件名与位置 | | 启动红字「API_KEY 不满足任何一种已知的密钥格式」 | 项目用正则认 Key(`sk-` + 48/92 位等),你的令牌位数不同 | **只是格式自检,不阻断启动**;介意的话设 `CUSTOM_API_KEY_PATTERN` 用自己的正则 | | Docker 部署改了 `config_private.py` 无效 | 容器里挂载的是环境变量 | 见下方说明 | | 多线程插件报 429 | 中转站限流(`DEFAULT_WORKER_NUM` 默认 8) | 调小到 2–3 | | PDF 翻译/长文总结中途断 | `TIMEOUT_SECONDS` 默认 30 秒,中转站长回答容易超 | 调到 120 或更高 | **Docker 部署的一点提醒**:环境变量优先级最高,会盖过 `config_private.py`。而字典类型的环境变量是用 `eval()` 解析的,意味着你得写**合法的 Python 字面量**: ```yaml environment: - API_URL_REDIRECT={'https://api.openai.com/v1/chat/completions': 'https://api.zaimod.com/v1/chat/completions'} ``` 中文引号、JSON 的 `"` 套 `"`、少个逗号,都会导致 `[ENV_VAR] 环境变量API_URL_REDIRECT加载失败!`。**更稳的做法**是改挂载:把写好的 `config_private.py` 挂进容器根目录,不碰环境变量。 --- ## 八、附录 A · 原文勘误 原文全篇 **200 字符**,内容为:三行标题式说明(打开 config、改配置、重跑程序)+ 一段 3 行代码。逐条: 1. **没说改哪个配置文件**:原文「打开 config 配置文件」,但项目有 `config.py`、`config_private.py`、`config-template`、环境变量四套来源。改 `config.py` 会被 `git pull` 覆盖。已改为优先 `config_private.py` 并给出优先级表。 2. **代码块语言标错**:标成 `js`,实际是 **Python** 的字典字面量。照 JS 思路复制进 `.py`,容易顺手加注释或尾逗号。 3. **没说明「键」不能改**:这是本篇最致命的遗漏。读者按「域名替换」的直觉把键也改成 `api.zaimod.com`,替换表永远匹配不上,**不报错、不提示、请求照旧发官方**。 4. **没说要填完整端点**:只给了示例,没说为什么必须是 `/v1/chat/completions`(不是 `/v1`,也不是域名)。已用源码机制解释。 5. **没提尾斜杠会 307**:`…/completions/` 会被重定向,个别环境下 POST 请求体会被丢弃,表现是「偶发 400」。 6. **没给可用的模型名**:默认 `gpt-3.5-turbo-16k` 已下线,照抄必报模型不存在。已补步骤 5。 7. **没提改完要重启**:配置只在启动时读一次并缓存。 8. **没提 `API_KEY` 要换**:原文只给了 `sk-xxxxxxxxxXXXXX` 占位,读者可能以为随便填。 9. **没提这项设置的安全属性**:项目自己在注释里写着「高危设置」,会把 Key 和对话内容完整交给所填地址。走第三方中转站时这一点尤其要说清。 10. **没提还能改别的端点**:Claude / Gemini / DeepSeek 等 11 条都能一起替换,原文只写了 OpenAI 一条。 11. **没给验收方法**:原文到「重新运行程序」就结束了,没告诉读者怎样才算成功。 12. **标题是关键词堆砌**:`chatgpt GPT Academic 学术优化配置gpt教程` → 改为《GPT Academic(学术优化)配置教程(接入中转站)》。 --- ## 九、附录 B · 地址变更对照 | 项目 | 原地址 | 现地址 | | ---------------- | --------------------------------------------------------- | ------------------------------------------- | | 替换表**值**(原文唯一一处) | `https://api.openlux.ai/v1/chat/completions` | `https://api.zaimod.com/v1/chat/completions` | | 替换表**键** | `https://api.openai.com/v1/chat/completions` | **不变**(这是匹配用的原文,改了就不生效) | | 实际请求地址 | 由替换表决定 | `https://api.zaimod.com/v1/chat/completions` | | Claude 端点(可选) | `https://api.anthropic.com/v1/messages` | `https://api.zaimod.com/v1/messages` | | Gemini 端点(可选) | `https://generativelanguage.googleapis.com/v1beta/models` | `https://api.zaimod.com/v1beta/models` | **迁移提示** - 令牌要在 `api.zaimod.com` 重新生成;旧平台令牌在新域名下返回 `401 Invalid token`。 - 只想改域名时,**别动键、别动路径结构**——这个项目的路径是源码写死的,乱改只会静默失效。 - 判断「到底走没走中转站」,看控制台调用记录最准,不要只看界面能不能聊天(有 Key 的话官方也能聊)。 --- *接口地址:`https://api.zaimod.com`*
上一篇:ChatGPT-on-WeChat 配置教程
{else}上一篇:没有了
下一篇:n8n工作流:本地图片生成视频
{else}下一篇:没有了