不墨 Router

发布于 2026 年 10 月 23 日 星期五

DeepSeek V4.1 API 接 OpenAI SDK:Python 与 Node.js 示例

用 OpenAI SDK 调用 DeepSeek V4.1 Flash,给出 Router 与官方直连的地址、模型 ID、Python 和 Node.js 代码,以及流式输出与常见错误排查。

DeepSeek V4.1 API 接 OpenAI SDK:Python 与 Node.js 示例

DeepSeek V4.1 Flash 可以用 OpenAI SDK 调用。走不墨 Router 时,三个关键值是 https://router.bumo.cc/v1、Router 的 API Key、deepseek/deepseek-flash。 使用 chat.completions.create 发请求即可;Python 写 base_url,Node.js 写 baseURL。

核验日期:2026-10-23。模型展示名与 API ID 不同:DeepSeek 官方将 deepseek-flash 指向 V4.1-Flash-1017;Router 的公开列表提供 deepseek/deepseek-flash。不要自行填写 deepseek-v4.1。映射来源:DeepSeek 首次调用文档、Router 模型列表。

Python:安装、设置 Key、运行

先在 不墨 Router 获取自己的 API Key,再在本地终端执行。以下环境变量写法适用于 macOS / Linux shell;Key 放在运行环境里,不写进源码。

python -m pip install openai
export BUMO_API_KEY="替换为你的RouterKey"

保存为 demo.py:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["BUMO_API_KEY"],
    base_url="https://router.bumo.cc/v1",
    timeout=120.0,
    max_retries=0,
)
response = client.chat.completions.create(
    model="deepseek/deepseek-flash",
    messages=[{"role": "user", "content": "用一句话解释什么是 API 网关。"}],
    max_tokens=2048,
)
print(response.choices[0].message.content)
print(response.usage)

运行 python demo.py。初次验证暂时关闭 SDK 自动重试,便于看清原始错误;正式接入时再按业务设置退避和重试。这个示例使用模型默认思考设置,max_tokens 太小可能只得到截断结果,不能把空的最终正文直接判成接口坏了。

Node.js:同样的请求

在项目目录安装依赖:

npm install openai
export BUMO_API_KEY="替换为你的RouterKey"

保存为 demo.mjs,用 node demo.mjs 执行。.mjs 让 Node 按 ES module 解释,不需要为了一个示例修改整个项目的模块配置。

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.BUMO_API_KEY,
  baseURL: "https://router.bumo.cc/v1",
  timeout: 120_000,
  maxRetries: 0,
});
const response = await client.chat.completions.create({
  model: "deepseek/deepseek-flash",
  messages: [{ role: "user", content: "用一句话解释什么是 API 网关。" }],
  max_tokens: 2048,
});
console.log(response.choices[0].message.content);
console.log(response.usage);

两段代码调用的都是 Chat Completions。使用 OpenAI SDK 不代表请求发给 OpenAI,也不代表所有 OpenAI 专属参数都能原样传给其他模型。SDK 接口结构可查 OpenAI Python 文档 和 JavaScript 文档。

想逐字显示:改成流式输出

在 Python 示例中,保留 client 初始化,把请求和打印部分替换为:

stream = client.chat.completions.create(
    model="deepseek/deepseek-flash",
    messages=[{"role": "user", "content": "用一句话解释什么是 API 网关。"}],
    max_tokens=2048,
    stream=True,
)
for chunk in stream:
    if chunk.choices:
        text = chunk.choices[0].delta.content
        if text:
            print(text, end="", flush=True)
print()

思考模型可能先生成推理内容,最终正文尚未到达时 content 会为空;以上循环只展示最终正文,不把空片段当作错误。流式中途断开时,不要盲目把重发结果接在旧正文后面,否则会出现重复答案。

换成 DeepSeek 官方直连,改哪三处

配置 Router DeepSeek 官方
Base URL https://router.bumo.cc/v1 https://api.deepseek.com
API Key Router 账号创建的 Key DeepSeek 开放平台创建的 Key
模型 ID deepseek/deepseek-flash deepseek-flash

官方直连时,Python 初始化的 Key 改读 DEEPSEEK_API_KEY,base_url 改为表内官方地址,同时把请求里的 model 改为 deepseek-flash;Node.js 对应改 apiKey、baseURL 和 model。原厂 Key 与 Router Key 不能交叉使用。两边账号余额也不互通。

官方 URL 的写法来自 DeepSeek 接入文档。如果只用 DeepSeek,直连少一层依赖;希望同一套调用代码切到 Kimi / GLM,可以保留 Router 地址和 Key,再从模型列表复制新 ID,并核对新模型的参数能力。

先定位错误,再改配置

现象 优先检查
401 / 鉴权失败 Key 是否属于当前 Base URL,是否完整、有效
404 / 模型不存在 ID 是否出现在 /v1/models;URL 是否错误拼成 /v1/v1 或包含了完整 /chat/completions 路径
余额或额度错误 对应渠道的钱包余额、Key 配额;充值到另一平台没有用
429 限流信息,减少并发并退避,避免立即无限重试
400 / 参数不支持 先只保留模型、消息和基础参数,再逐项加回工具或结构化输出设置
正文为空或截断 finish_reason、输出上限和推理用量;不能仅凭 content 判断

验证范围: 本文核对了实时模型列表与官方 SDK / 接入文档,并对代码做了语法与本地模拟响应检查;没有使用真实计费 Key 发起推理,也没有验证工具调用、多模态或高并发。示例不是“生产全链路实测通过”的承诺。复制后先跑一条短请求,在 Router 用量记录里确认返回和计费,再接入业务。

下一步

到不墨 Router 获取 API Key,然后按上面的安装、设置、运行三步完成首次调用。

工作流、排错与预算