Deep Seek R1本地化部署:用python代码调用模型并接入TaoToken统一API通道

发布时间:2026/9/27 13:28:11
Deep Seek R1本地化部署:用python代码调用模型并接入TaoToken统一API通道 1. 本地跑通 Deep Seek R1 之后为什么还要接统一 API 通道Deep Seek R1 本地化部署这件事很多人卡在“跑起来”就停了。模型确实能在本地推理服务里出结果但真正写业务代码时会发现一个尴尬本地一个地址、云端一个地址、不同厂商又是不同 Key每换一个模型就要改一遍base_url和鉴权逻辑。Deep Seek R1 本地化部署 Python 调用模型这条链路如果只停在本地多模型切换的成本会随着项目变大而指数上升。这篇面向的是已经用 Ollama 或类似推理服务把 Deep Seek R1 跑起来、手里有本地http://localhost:11434/v1这类端点的开发者。目标很具体用 Python 脚本调用本地模型同时把请求接入 TaoToken 统一 API 通道让本地模型和远端模型共用一套 Key、一套调用代码。适合谁适合正在做多模型对比、Agent 原型、或者想把本地推理当兜底、远端当主力的开发者。我试过把本地和远端混在一个客户端里管理最省事的做法不是写两套代码而是让两者都走 OpenAI 兼容协议用配置区分。下面从环境准备到连通性验证一步步给可复制的代码和配置。2. TaoToken 前置统一 Key 与 API 通道准备TaoToken 在这里的角色是统一入口。你不需要为每个模型单独记地址和密钥而是拿一个 Key通过它的 API 通道去调用不同模型。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意这个地址后面不加 UTM 参数直接作为base_url使用。操作顺序建议这样先注册并登录进控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后复制那串sk-开头的 Key先存到环境变量里别硬编码进脚本。注意本地推理服务通常不需要真实 Key填sk-no-key-required就能跑但接入 TaoToken 时必须用真实 Key两者要分开配置别混在一个变量里。如果你还想先确认模型名和可用性可以打开模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 看一眼当前支持的模型标识避免脚本里写错模型名导致 404。3. 可复制配置config.toml 骨架与 Python 调用代码先建一个config.toml把本地和远端两套端点分开管理。这样切换时只改配置不动代码。# config.toml [local] base_url http://localhost:11434/v1 api_key sk-no-key-required model deepseek-r1:7b [taotoken] base_url https://taotoken.net/api api_key sk-你的真实Key model deepseek-r1 [request] temperature 0.7 max_tokens 2048 timeout 60读取配置用 Python 3.11 自带的tomllib不用额外装包。下面这段脚本同时支持本地和 TaoToken 两个通道通过命令行参数切换。# call_r1.py import tomllib import argparse from openai import OpenAI def load_config(pathconfig.toml): with open(path, rb) as f: return tomllib.load(f) def build_client(cfg, channel): section cfg[channel] return OpenAI( base_urlsection[base_url], api_keysection[api_key], timeoutcfg[request][timeout], ), section[model] def chat(client, model, prompt, temperature, max_tokens): resp client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], temperaturetemperature, max_tokensmax_tokens, streamFalse, ) return resp.choices[0].message.content if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--channel, choices[local, taotoken], defaultlocal) parser.add_argument(--prompt, default用一句话解释什么是张量并行) args parser.parse_args() cfg load_config() client, model build_client(cfg, args.channel) answer chat( client, model, args.prompt, cfg[request][temperature], cfg[request][max_tokens], ) print(f[{args.channel}] {model}\n{answer})关键点在于build_client只认base_url和api_key本地和 TaoToken 的差异被配置吸收掉了。你换模型、换通道命令行加个--channel就行。4. 验证请求本地与 TaoToken 双通道连通性测试先确认本地推理服务在跑。Ollama 默认监听 11434用 curl 探一下模型列表curl http://localhost:11434/v1/models返回里有deepseek-r1:7b之类的 id 就说明本地通了。然后跑本地通道python call_r1.py --channel local --prompt 你好做个自我介绍预期输出是模型的一段回复前面带[local] deepseek-r1:7b。如果这一步就报连接错误先别急着改脚本去查推理服务进程。再验证 TaoToken 通道python call_r1.py --channel taotoken --prompt 你好做个自我介绍成功时输出[taotoken] deepseek-r1加回复内容。这一步能过说明 Key、基址、模型名三者都对上了。如果返回 401是 Key 问题返回 404多半是模型名写错回模型对话页核对一下标识。流式输出也可以顺手验一下把streamFalse改成True遍历chunk.choices[0].delta.content拼接即可逻辑和本地完全一致因为协议是同一套。5. 本篇常见报错排查清单Connection refused本地推理服务没启动或者端口不是 11434。先curl探活再确认base_url里的端口和实际监听一致。Ollama 换过端口的话配置里要同步改。401 UnauthorizedTaoTokenKey 没填、填错、或者复制时带了空格。重新去 API Keys 页复制一次注意别把sk-前缀漏掉。环境变量方式读取时确认变量名没拼错。404 model not found模型标识写错。本地模型名要和ollama list输出一致TaoToken 侧要和模型页展示的标识一致。大小写、冒号、版本号都算数。Read timed outmax_tokens设太大或网络抖动。把timeout调到 120max_tokens先降到 1024 试。本地大模型首次加载慢第一次请求超时很常见第二次通常就正常。返回内容为空检查messages结构必须是[{role: user, content: ...}]。另外temperature设成 0 时部分模型输出会变短不一定是 bug。中文乱码终端编码问题不是模型问题。Windows 下把终端切到 UTF-8或者把结果写文件再查看。6. 多模型统一管理的下一步本地 Deep Seek R1 跑通、TaoToken 通道验证通过之后你的调用代码其实已经和具体模型解耦了。接下来做多模型对比只需要在配置里加 section脚本里循环build_client即可。长期做编码或 Agent 的话可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 把额度集中管理接入细节和参数说明看接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Claude Code 相关配置在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite 有单独说明。一个实用技巧把config.toml里的api_key换成从环境变量读取脚本里用os.environ.get(TAOTOKEN_KEY)兜底这样配置文件可以进版本库而不泄露密钥。本地和远端混用时建议给本地通道加一个健康检查函数请求前先探活避免推理服务挂了还傻等超时。