1. 为什么要在 VSCode 里把 Jupyter Notebook 接到统一通道VSCode 的 Jupyter Notebook 插件本质上是把.ipynb文件在编辑器里跑起来你写一个 cell它把代码发给一个内核kernel内核执行完把结果回传于是你能看到变量监控、图表预览、DataFrame 表格这些交互效果。它比浏览器版 Notebook 顺手的地方在于代码补全、Git diff、调试器、多文件标签页这些编辑器能力全都还在。问题出在“模型调用”这件事上。很多人在 Notebook 里做数据分析、跑 LangChain 链路、调大模型做批处理代码里到处散落着api_key sk-xxx和base_url https://...。换一个模型供应商就得全局搜索替换一遍团队协作时Key 跟着.ipynb一起提交上去风险很大。更麻烦的是Notebook 的内核是独立进程你在终端里export的环境变量内核不一定读得到于是出现“终端能跑、Notebook 报 401”的经典问题。这篇要解决的就是这件事把 VSCode 里 Jupyter Notebook 的模型调用统一收口到一个 Base URL 上也就是 TaoToken 的 API 地址https://taotoken.net/api。收口之后你在 Notebook 里只认一个 Key、一个地址模型名按需切换。适合谁看三类人一是在本地 Notebook 里做 AI 应用原型的开发者二是需要把 Notebook 交给同事复现、又不想泄露 Key 的人三是已经在用 VSCode 写 Python、想顺手把模型调用也管起来的人。核心检索词先摆出来VSCode Jupyter Notebook 插件怎么配置 Base URL、Notebook 内核如何读取统一 API Key、.env与settings.json在 Notebook 场景下的分工。下面从环境准备讲到可复制配置再到重启内核验证请求最后把常见报错逐个拆掉。需要说明的是TaoToken 在这里扮演的是“统一 Key 通道”的角色它兼容 OpenAI 风格的接口协议所以任何用openaiSDK 或requests直接发请求的 Notebook 代码只要把base_url指过去就能用。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 两个别搞混前者是控制台和文档入口后者才是代码里填的 Base URL。2. 前置准备Python 环境、Jupyter 插件与 TaoToken Key2.1 确认 Python 与 Jupyter 内核可用VSCode 的 Notebook 要跑起来底层得有一个能执行代码的 Python 环境。最省事的方式是用 Anaconda它自带jupyter、ipykernel和一堆数据科学库。装完之后在终端里验证python --version jupyter --version如果jupyter命令找不到说明内核组件没装全补一条pip install jupyter notebook ipykernelipykernel是关键VSCode 就是通过它把编辑器和一个 Python 进程连起来的。很多人只装了jupyter没装ipykernel结果 VSCode 里选不到内核右下角一直转圈。2.2 安装 VSCode 的 Python 与 Jupyter 插件打开 VSCodeCtrlShiftX进扩展面板搜索Python安装微软官方的 Python 扩展再搜Jupyter安装 Jupyter 扩展。这两个是配套的Python 扩展负责解释器管理Jupyter 扩展负责 Notebook 的渲染和内核通信。装完后CtrlShiftP打开命令面板输入Python: Create New Blank Jupyter Notebook能新建出一个空的.ipynb就说明插件生效了。右上角会显示当前内核点一下可以切换 Python 环境。2.3 拿到 TaoToken 的 Key 和 Base URL登录 TaoToken 控制台在 API Keys 页面创建一个 Key。这个 Key 就是你在 Notebook 里要用的凭证。地址走 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。创建时给它起个能认出来的名字比如vscode-notebook-dev方便以后按用途吊销。Key 只在创建时完整显示一次复制下来先存到安全的地方。Base URL 固定填https://taotoken.net/api注意结尾不要多加/v1OpenAI SDK 会自己拼路径。这一点后面排错会再提。2.4 为什么不用在 Notebook 里硬编码 Key直接在 cell 里写api_key sk-...是最快的但也是最容易出事的。.ipynb文件本质是 JSONKey 会明文躺在里面一旦提交到 Git 就收不回来了。正确做法是把 Key 放进环境变量或.env文件Notebook 代码只读变量名。下一节就讲怎么让内核读到这些变量。3. 可复制配置settings.json、.env 与 Notebook 调用片段3.1 用 .env 管理 Key避免明文进 Notebook在项目根目录建一个.env文件TAOTOKEN_API_KEYsk-你的真实Key TAOTOKEN_BASE_URLhttps://taotoken.net/api同时建一个.gitignore把.env排除掉.env *.env这样 Key 只存在于本地Notebook 里通过os.getenv读取。团队协作时你提交一份.env.example里面只写变量名不写值同事自己填。3.2 在 settings.json 里配置 Notebook 的默认环境VSCode 的settings.json可以给 Jupyter 扩展设一些默认行为。按CtrlShiftP输入Preferences: Open User Settings (JSON)加入下面这段{ jupyter.notebookFileRoot: ${workspaceFolder}, jupyter.runStartupCommands: [ %load_ext autoreload, %autoreload 2 ], python.terminal.activateEnvironment: true, jupyter.interactiveWindow.textEditor.executeSelection: true }jupyter.notebookFileRoot设成工作区根目录能保证 Notebook 里的相对路径导入不出错。runStartupCommands里的autoreload很实用你改了本地.py模块Notebook 不用重启内核就能加载新代码做 AI 链路调试时省很多时间。如果你想让内核启动时自动加载.env可以再装一个python-dotenv然后在 Notebook 第一个 cell 里显式加载比在 settings 里塞复杂命令更可控。3.3 Notebook 里调用 TaoToken 的完整片段新建一个.ipynb第一个 cell 装依赖如果还没装!pip install openai python-dotenv第二个 cell 加载环境变量并初始化客户端import os from dotenv import load_dotenv from openai import OpenAI load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api), ) print(base_url , client.base_url)第三个 cell 发一次对话请求resp client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是一个简洁的助手。}, {role: user, content: 用一句话说明 Notebook 内核是什么。}, ], temperature0.3, ) print(resp.choices[0].message.content)模型名按你账号里可用的填gpt-4o-mini只是示例。跑通之后你会看到返回的文本直接打印在 cell 下方说明请求已经走 TaoToken 通道出去了。3.4 用 requests 直接发请求的写法如果你不想装openaiSDK用requests也行适合轻量脚本import os import requests from dotenv import load_dotenv load_dotenv() url https://taotoken.net/api/chat/completions headers { Authorization: fBearer {os.getenv(TAOTOKEN_API_KEY)}, Content-Type: application/json, } payload { model: gpt-4o-mini, messages: [{role: user, content: 你好做个连通性测试。}], } r requests.post(url, headersheaders, jsonpayload, timeout30) print(r.status_code) print(r.json()[choices][0][message][content])注意这里的 URL 是https://taotoken.net/api/chat/completions因为requests不会帮你拼路径得写全。而用openaiSDK 时只填https://taotoken.net/apiSDK 自己补/chat/completions。这个区别是新手最容易踩的坑之一。4. 重启内核并验证请求是否走通4.1 重启内核的正确动作改完.env或settings.json后内核不会自动感知。点 Notebook 右上角的内核名称或者按CtrlShiftP输入Jupyter: Restart Kernel把内核重启一遍。重启后所有变量清空需要从头跑 cell。这一步很关键环境变量是在内核进程启动时读取的你不重启os.getenv拿到的还是旧值甚至拿到None。我见过有人改了.env死活不生效最后发现是内核没重启。4.2 验证请求走通的三个信号第一个信号print(client.base_url)输出https://taotoken.net/api/。如果输出的是 OpenAI 官方地址说明.env没加载成功。第二个信号对话请求返回 200且resp.choices[0].message.content有正常文本。如果返回 401往下看排错章节。第三个信号在 TaoToken 控制台的用量日志里能看到这次请求记录。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 进去后按时间排序能看到模型名、token 数和状态码。这一步是“实锤”证明请求确实经过了 TaoToken而不是被本地某个缓存或别的地址接走了。4.3 在 Notebook 里做一次结构化输出验证光返回文本还不够做 AI 应用经常要结构化输出。再跑一个 cell 验证 JSON 模式import json resp client.chat.completions.create( modelgpt-4o-mini, messages[ {role: user, content: 返回一个 JSON包含 name 和 age 两个字段name 是 notebookage 是 1。} ], response_format{type: json_object}, ) data json.loads(resp.choices[0].message.content) print(data[name], data[age])能正常解析出notebook 1说明通道对结构化输出也支持。这一步过了你就可以放心在 Notebook 里搭更复杂的链路比如批量摘要、向量检索、Agent 循环。4.4 把验证逻辑封装成可复用函数每次新建 Notebook 都重写一遍初始化太啰嗦可以封装成一个llm_utils.pyimport os from dotenv import load_dotenv from openai import OpenAI load_dotenv() def get_client(): return OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api), ) def ask(prompt, modelgpt-4o-mini, temperature0.3): client get_client() resp client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], temperaturetemperature, ) return resp.choices[0].message.contentNotebook 里from llm_utils import ask就能用。配合前面autoreload的配置你改llm_utils.py后 Notebook 直接生效不用重启内核。这套组合在调试 prompt 时特别顺手。5. 常见报错排查401、local proxy failed、reading choices、OAuth5.1 401 UnauthorizedKey 没读到或填错最常见的报错长这样openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key}}排查顺序先在 Notebook 里print(os.getenv(TAOTOKEN_API_KEY))如果是None说明.env没加载。检查.env是否在load_dotenv()的工作目录下jupyter.notebookFileRoot设成工作区根目录能避免路径错位。如果打印出来是sk-...但依然 401检查 Key 有没有多余空格或者是不是已经被吊销。还有一种情况Key 是对的但base_url填成了https://taotoken.net/api/v1导致路径拼成/api/v1/chat/completions服务端不认。记住 Base URL 只填到/api。5.2 local proxy failed本地网络层拦截报错类似APIConnectionError: Connection error. local proxy failed这通常不是 TaoToken 的问题而是本地有网络层组件在拦截请求。检查系统里有没有设置HTTP_PROXY/HTTPS_PROXY环境变量Notebook 内核会继承这些变量。在 cell 里跑import os print(os.environ.get(HTTP_PROXY), os.environ.get(HTTPS_PROXY))如果有值且你不需要清掉再重启内核import os os.environ.pop(HTTP_PROXY, None) os.environ.pop(HTTPS_PROXY, None)另外检查 VSCode 的http.proxy设置如果配了一个失效的地址也会导致连接失败。5.3 reading choices响应结构不对报错KeyError: choices或者TypeError: NoneType object is not subscriptable。这通常是因为请求返回的不是标准结构可能是错误响应被当成功响应解析了。先打印完整响应print(r.status_code) print(r.text)如果r.text里是{error: ...}说明请求本身失败了只是你没检查状态码。养成习惯解析choices前先判断resp.choices是否存在。用 SDK 时异常会直接抛出反而更安全用requests时一定要手动检查status_code。5.4 OAuth 相关报错认证方式串了如果你在 Notebook 里看到 OAuth 相关的提示多半是误用了需要交互式登录的客户端或者环境里残留了别的认证配置。TaoToken 走的是 API Key 认证不需要 OAuth 流程。检查你的代码里有没有引入别的 SDK 或配置文件把认证方式覆盖掉了。排查方法在干净的虚拟环境里重装openai和python-dotenv只保留.env里的 Key重新跑一遍最小示例。如果最小示例能通说明是项目里其他配置干扰。5.5 内核选不到或启动失败如果右下角内核列表是空的或者启动时报Kernel died先确认ipykernel装了python -m ipykernel install --user --nametaotoken-env --display-namePython (TaoToken)然后在 VSCode 里选这个内核。--name是内部标识--display-name是你在列表里看到的名字。装完重启 VSCode内核列表里就能选到了。6. 把 Notebook 环境接入统一 Key 通道的后续动作走到这里你的 VSCode Jupyter Notebook 已经能通过 TaoToken 发请求了。Key 在.env里Base URL 在代码里只出现一次换模型只改model参数。这套结构的好处是你以后写任何 AI 相关的 Notebook复制llm_utils.py和.env.example就能开工不用每次重新配。如果你还想在终端里用 Claude Code 或别的编码工具可以走 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它和 Notebook 用的是同一套 Key 体系省得管理多份凭证。想先在网页里试模型效果用模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数细节可以对照查。最后留一个实用习惯每次新建 Notebook第一个 cell 永远先跑连通性检查确认base_url和 Key 都对再往下写业务逻辑。这样出问题时你能立刻定位是环境问题还是代码问题不用在一堆 cell 里翻找。