在 Obsidian 笔试环境里敲下 gemini login,终端停在「等待授权」,浏览器回调页转半天也回不到命令行——第四部分接入 AI 辅助时卡在这一步的人不少。解法不复杂:把 Gemini CLI 的鉴权方式从账号登录换成 API Key,用 TaoToken 做统一接入通道,Key 到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,Base URL 填 https://taotoken.net/api,末尾不要带 /v1。下面按笔试机的真实情况,把配置文件、验证命令和几个高频报错一次写清楚。
前面三步通常是:装好 Obsidian、建一个本地仓库、装上 Terminal 或 Shell commands 一类的插件。这些都不难,真正让人停住的是第四步——AI 辅助要能跑起来。笔试机和你自己的笔记本不一样,账号、浏览器、网络白名单都不在你手里,所以思路要换:不要去修授权链路,而是把授权这一步整个替换掉。
1. gemini login 卡住时,先看清卡在哪一环
1.1 三种典型的卡法,对应三种不同的死法
第一种是回调打不开。OAuth 流程会在本地起一个监听端口,浏览器授权完要回调到localhost。笔试机上如果这个端口被别的进程占了,或者浏览器根本不在同一台机器上(很多人是终端在虚拟机、浏览器在宿主机),回调就永远等不到。
第二种是账号体系卡住。笔试机的浏览器可能登着别人的账号、学校的企业账号,或者一个早就退出的会话。你想切回自己的账号,又要过手机验证、辅助邮箱验证,人在考场上根本折腾不起。
第三种是最无奈的:终端显示 waiting for authentication,浏览器那边其实什么都没发生。原因是授权回调依赖的那个外部域名不在笔试机的访问白名单里,请求发不出去,看起来就像「网络抖了一下」,实际上它会一直抖下去。
1.2 为什么「换一次网络再试」救不了这一步
这几种卡法看着不一样,根子是同一个:默认登录方式把三个你控制不了的变量绑在了一起——账号、本地回调端口、外部域名可达性。笔试环境的网络策略是提前配好的,你没法临时加白名单;账号也不是说切就切;至于端口冲突,考场上你更不敢随便杀进程。
所以重试的价值很低,它只是把同一条路重新走一遍。真正有效的做法是把鉴权方式从「账号授权」换成「API Key」。链路一下子从三段变成一段:本地进程拿着 Key,向一个固定的 HTTPS 地址发请求,没有浏览器、没有回调、没有账号切换。这就是后面所有配置的出发点。
2. 换鉴权方式前,先把两个地址分清楚
2.1 到官网创建一把 Key,复制下来备用
打开 TaoToken,注册登录后进控制台,创建一把 API Key。创建完立刻复制,页面刷新后通常就不再完整显示了。为了后面配置好写,全文统一把它记作YOUR_API_KEY,你自己填的时候换成真实值。
顺手在同一个站点看一眼模型广场,把要用的模型 ID 记下来。不同时间上架的模型不一样,以页面当时列出的为准,别凭记忆写带日期后缀的 ID,那种十有八九是不存在的。
2.2 官网地址和 Base URL 是两个东西,别混着填
这是最容易出错的地方,单独列个表:
| 用途 | 该填什么 |
|---|---|
| 注册账号、创建 Key、看模型广场、查用量 | https://taotoken.net/?utm_source=taotoken_aicg_blog_end |
| 填进 Gemini CLI 的 Base URL | https://taotoken.net/api |
两条铁律:Base URL 末尾不要加/v1,也不要带任何查询参数。把官网那个带 UTM 的链接复制进配置文件,是另一类高频错误——它不会报「地址不对」,只会给你一个 401。
提示:配置类字段里出现的地址,永远是
https://taotoken.net/api;只有你在浏览器里点开的地址,才需要带 UTM 参数。这两个场景的地址长得像,但用途完全不同。
3. 改 ~/.gemini 下的配置,让 Obsidian 仓库里的 AI 辅助跟着生效
3.1 用 .env 写死 Key 和 Base URL,比 export 稳
Gemini CLI 会读取~/.gemini目录下的配置。笔试机最稳的写法是把 Key 和 Base URL 写进~/.gemini/.env,这样不管是终端里手敲gemini,还是 Obsidian 插件帮你调起来,都能读到:
mkdir -p ~/.gemini cat > ~/.gemini/.env <<'EOF' GEMINI_API_KEY=YOUR_API_KEY GOOGLE_GEMINI_BASE_URL=https://taotoken.net/api EOF chmod 600 ~/.gemini/.env写完新开一个终端会话,别在当前会话里硬试——环境变量是在进程启动时读进去的。
不同版本的 Gemini CLI 变量名可能略有出入,用gemini --help或你本地那份文档确认一次。核心就两条:一把 Key,一个 Base URL,值分别是YOUR_API_KEY和https://taotoken.net/api。
3.2 鉴权模式要从账号切到 API Key
光有 Key 还不够。如果你的版本在~/.gemini/settings.json里管理鉴权方式,要把类型从账号授权切换成 API Key 模式,否则它还是走原来的登录流程:
{ "security": { "auth": { "selectedType": "gemini-api-key" } } }字段名以你本地装的版本为准,改之前先备份原文件。判断有没有切成功,看下次启动gemini时还会不会提示你去浏览器授权——不提示了,就说明走的是 Key 这条路。
3.3 Obsidian 侧怎么把这条命令发出去
Obsidian 本身是笔记软件,不会自己调命令行,第四部分的「AI 辅助」通常靠两种方式接:
一种是 Terminal 插件。在仓库根目录开一个终端会话,然后正常敲gemini。注意插件开的会话未必继承你登录 shell 的全部环境变量,所以前面的.env写法比export更省心。
一种是 Shell commands 插件。把命令写进插件配置,但要注意 Obsidian 是图形界面启动的进程,PATH里可能没有全局 npm 目录,命令会报找不到。稳妥做法是写绝对路径,或者在命令前显式带上变量:
cd ~/vaults/obsidian-bi set -a && . ~/.gemini/.env && set +a gemini -p "只读当前仓库里的 00-笔试须知.md,列出 5 条今天要检查的项,不要修改任何文件"注意:Gemini CLI 在这里的角色是读文件、解释内容、生成文本。让它去连生产库、执行诊断脚本、跑导入导出这类动作,都不在合理范围内。真要做数据库相关的题,让它生成 SQL,你自己在本地 SQL*Plus 里执行,再把报错贴回对话。
3.4 先确认环境变量真的进去了
动手验证之前,花十秒确认两件事:
source ~/.gemini/.env echo "$GEMINI_API_KEY" echo "$GOOGLE_GEMINI_BASE_URL"第二行输出必须是https://taotoken.net/api。如果看到结尾多了/v1,或者看到的是带?utm_source=的那串官网地址,先改回来再往下走——这两种情况后面一定会报 401,而且报错信息不会告诉你原因。
4. 跑一次提问,确认 Obsidian 仓库里的 AI 辅助已经走通
4.1 最小成本的一次提问
先用一句废话问题把链路打通,别一上来就拿复杂任务试:
gemini -p "只回答两个字:收到"能看到正常返回,说明 Key、Base URL、模型这三样都对上了。这一步如果失败,问题一定在配置层,跟 Obsidian 插件没关系,先解决命令行再回到仓库里。
4.2 回到真实的笔试仓库跑一次
命令行通了以后,进到你的仓库目录再跑一次,顺便验证插件会话的环境变量也没问题:
cd ~/vaults/obsidian-bi gemini -p "读一下 README.md 和 00-笔试须知.md,用条目列出我今天最该先做的三件事"如果第一次是在终端里跑的,第二次是在 Obsidian 的 Terminal 插件里跑的,两次都要成功才算真正稳。很多人卡在第二次:终端里好好的,插件里报鉴权失败,原因就是插件会话读不到~/.zshrc里的export,改用~/.gemini/.env就好了。
5. 401 和其它报错:先查 Base URL 有没有多写 /v1
5.1 401 不一定怪 Key,按顺序排查
看到 401,别急着重新创建 Key。按这个顺序查,八成能在前两步解决:
| 排查项 | 怎么查 | 期望结果 |
|---|---|---|
Base URL 是否被写成https://taotoken.net/api/v1 | echo "$GOOGLE_GEMINI_BASE_URL" | 结尾是/api,没有/v1 |
| Key 是否真的写进去了 | echo "$GEMINI_API_KEY" | 是真实 Key,不是YOUR_API_KEY |
| Key 是否被复制污染 | 看~/.gemini/.env内容 | 没有首尾空格、没有换行断开 |
| 有没有把官网链接填进配置 | 看配置文件 | 配置里只有https://taotoken.net/api |
第一条是最常见的:很多工具的文档里 Base URL 是带/v1的,手一抖就顺手加上了。多这一段路径会落到不存在的地址上,返回的就是 401 或 404,看起来特别像 Key 有问题。
5.2 其余几类报错的处理方向
模型不存在的报错:确认模型 ID 是否真的在售。以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 上的模型广场当时列表为准,别用记忆里的名字,也不要自己拼日期后缀。不确定就先把--model参数去掉,用默认模型验证链路。
命令找不到:Obsidian 里通过 Shell commands 调用时报「command not found」,基本都是PATH问题。用which gemini拿到绝对路径,写进插件命令里。
改了配置还是老行为:环境变量是启动时读的,当前会话不会自动刷新。换一个终端会话,或者干脆重启一次 Obsidian。
授权提示仍然出现:说明鉴权模式没切过去,回到settings.json检查那个selectedType字段,顺便确认改的是用户目录下那份配置,而不是项目目录里的。
6. 笔试当天收尾:把这次调用对上账
6.1 确认这次请求确实被记上了
命令行能返回、插件也能返回,说明链路通了,但「通了」和「记上了账」是两回事。用同一把 Key 在 TaoToken 模型对话 里发一条测试消息,然后回 控制台 API Keys 看这条调用有没有出现。出现了,说明 Base URL 和 Key 是配套的,笔试当天不会突然翻车。
如果笔试那几天需要连着跑很多次长文本总结,可以先去 Coding Plan 看一眼套餐够不够用,别等到写到一半才发现额度见底。
6.2 顺手把 Claude Code 那条线也备好
有些笔试题目会要求你在仓库里直接改代码,这时候命令行问答就不够了,得用能读多文件、能改代码的工具。如果你本来就装了 Claude Code,它的环境变量怎么填可以在 Claude Code 接入文档 里对照,Base URL 同样是https://taotoken.net/api,末尾不加/v1。
需要新 Key 的时候,回 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台再建一把就行。把 Key、Base URL、鉴权模式这三样记在备忘录里,下次换机器五分钟能重新配好,比在考场上跟授权页面较劲划算得多。