☰
VSCode插件 优雅地使用Jupyter Notebook:把Base URL改到TaoToken
2026/10/1 14:40:09 网站建设 项目流程

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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,两个别搞混:前者是控制台和文档入口,后者才是代码里填的 Base URL。

2. 前置准备:Python 环境、Jupyter 插件与 TaoToken Key

2.1 确认 Python 与 Jupyter 内核可用

VSCode 的 Notebook 要跑起来,底层得有一个能执行代码的 Python 环境。最省事的方式是用 Anaconda,它自带jupyter、ipykernel和一堆数据科学库。装完之后在终端里验证:

python --version jupyter --version

如果jupyter命令找不到,说明内核组件没装全,补一条:

pip install jupyter notebook ipykernel

ipykernel是关键,VSCode 就是通过它把编辑器和一个 Python 进程连起来的。很多人只装了jupyter没装ipykernel,结果 VSCode 里选不到内核,右下角一直转圈。

2.2 安装 VSCode 的 Python 与 Jupyter 插件

打开 VSCode,Ctrl+Shift+X进扩展面板,搜索Python,安装微软官方的 Python 扩展;再搜Jupyter,安装 Jupyter 扩展。这两个是配套的,Python 扩展负责解释器管理,Jupyter 扩展负责 Notebook 的渲染和内核通信。

装完后Ctrl+Shift+P打开命令面板,输入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_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。

创建时给它起个能认出来的名字,比如vscode-notebook-dev,方便以后按用途吊销。Key 只在创建时完整显示一次,复制下来先存到安全的地方。

Base URL 固定填https://taotoken.net/api,注意结尾不要多加/v1,OpenAI SDK 会自己拼路径。这一点后面排错会再提。

2.4 为什么不用在 Notebook 里硬编码 Key

直接在 cell 里写api_key = "sk-..."是最快的,但也是最容易出事的。.ipynb文件本质是 JSON,Key 会明文躺在里面,一旦提交到 Git 就收不回来了。正确做法是把 Key 放进环境变量或.env文件,Notebook 代码只读变量名。下一节就讲怎么让内核读到这些变量。

3. 可复制配置:settings.json、.env 与 Notebook 调用片段

3.1 用 .env 管理 Key,避免明文进 Notebook

在项目根目录建一个.env文件:

TAOTOKEN_API_KEY=sk-你的真实Key TAOTOKEN_BASE_URL=https://taotoken.net/api

同时建一个.gitignore,把.env排除掉:

.env *.env

这样 Key 只存在于本地,Notebook 里通过os.getenv读取。团队协作时,你提交一份.env.example,里面只写变量名不写值,同事自己填。

3.2 在 settings.json 里配置 Notebook 的默认环境

VSCode 的settings.json可以给 Jupyter 扩展设一些默认行为。按Ctrl+Shift+P输入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_key=os.getenv("TAOTOKEN_API_KEY"), base_url=os.getenv("TAOTOKEN_BASE_URL", "https://taotoken.net/api"), ) print("base_url =", client.base_url)

第三个 cell 发一次对话请求:

resp = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "你是一个简洁的助手。"}, {"role": "user", "content": "用一句话说明 Notebook 内核是什么。"}, ], temperature=0.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": f"Bearer {os.getenv('TAOTOKEN_API_KEY')}", "Content-Type": "application/json", } payload = { "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "你好,做个连通性测试。"}], } r = requests.post(url, headers=headers, json=payload, timeout=30) print(r.status_code) print(r.json()["choices"][0]["message"]["content"])

注意这里的 URL 是https://taotoken.net/api/chat/completions,因为requests不会帮你拼路径,得写全。而用openaiSDK 时只填https://taotoken.net/api,SDK 自己补/chat/completions。这个区别是新手最容易踩的坑之一。

4. 重启内核并验证请求是否走通

4.1 重启内核的正确动作

改完.env或settings.json后,内核不会自动感知。点 Notebook 右上角的内核名称,或者按Ctrl+Shift+P输入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_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,进去后按时间排序,能看到模型名、token 数和状态码。这一步是“实锤”,证明请求确实经过了 TaoToken,而不是被本地某个缓存或别的地址接走了。

4.3 在 Notebook 里做一次结构化输出验证

光返回文本还不够,做 AI 应用经常要结构化输出。再跑一个 cell 验证 JSON 模式:

import json resp = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "user", "content": "返回一个 JSON,包含 name 和 age 两个字段,name 是 'notebook',age 是 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.py:

import os from dotenv import load_dotenv from openai import OpenAI load_dotenv() def get_client(): return OpenAI( api_key=os.getenv("TAOTOKEN_API_KEY"), base_url=os.getenv("TAOTOKEN_BASE_URL", "https://taotoken.net/api"), ) def ask(prompt, model="gpt-4o-mini", temperature=0.3): client = get_client() resp = client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}], temperature=temperature, ) return resp.choices[0].message.content

Notebook 里from llm_utils import ask就能用。配合前面autoreload的配置,你改llm_utils.py后 Notebook 直接生效,不用重启内核。这套组合在调试 prompt 时特别顺手。

5. 常见报错排查:401、local proxy failed、reading choices、OAuth

5.1 401 Unauthorized:Key 没读到或填错

最常见的报错长这样:

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 --name=taotoken-env --display-name="Python (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_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,它和 Notebook 用的是同一套 Key 体系,省得管理多份凭证。想先在网页里试模型效果,用模型对话页面:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到参数细节可以对照查。

最后留一个实用习惯:每次新建 Notebook,第一个 cell 永远先跑连通性检查,确认base_url和 Key 都对,再往下写业务逻辑。这样出问题时你能立刻定位是环境问题还是代码问题,不用在一堆 cell 里翻找。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询