OpenClaw Baseten Provider 插件实战:接入 Inkling 与 Baseten 托管模型 API
【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw
本篇围绕 OpenClaw 官方的 Baseten Provider 插件展开:先讲清它"是什么、装什么、配什么",再结合插件源码剖析模型目录的实时发现与离线回退机制、按模型定制的 thinking(推理力度)控制实现,以及流式请求载荷的补丁逻辑。读完后你可以独立完成@openclaw/baseten-provider的安装与配置,并理解它如何在"认证发现成功/失败"两种状态下保持模型选择可用。
插件定位与基本属性
插件的 README(extensions/baseten/README.md)一句话定义了它的身份:Official OpenClaw provider plugin for Baseten Model APIs, including Thinking Machines Lab's Inkling—— 即把 Baseten 托管的 OpenAI 兼容 Model APIs(含 Thinking Machines Lab 的 Inkling 模型)作为一个标准 provider 接入 OpenClaw。
结合插件清单 openclaw.plugin.json 与 package.json,关键属性如下:
| 属性 | 值 |
|---|---|
| Provider id | baseten |
| npm 包名 | @openclaw/baseten-provider |
| 安装来源 | npm 或 ClawHub(clawhub:@openclaw/baseten-provider),默认走 npm |
| 认证环境变量 | BASETEN_API_KEY |
| Onboarding 选项 | --auth-choice baseten-api-key |
| 直接 CLI 参数 | --baseten-api-key <key> |
| API 协议 | OpenAI 兼容(openai-completions),支持流式 usage 上报 |
| Base URL | https://inference.baseten.co/v1 |
| 默认模型 | thinkingmachines/inkling(完整 ref:baseten/thinkingmachines/inkling) |
| 插件激活 | activation.onStartup: false、enabledByDefault: true,即默认启用但不随网关启动即加载 |
| 版本约束 | 当前包版本2026.9.3,要求宿主minHostVersion: >=2026.7.2、pluginApi: >=2026.9.3 |
从源码结构看,插件入口 index.ts 通过defineSingleProviderPluginEntry组装了四个核心部件:catalog(模型目录)、resolveDynamicModel(未知模型的动态解析)、wrapStreamFn(请求载荷补丁)、resolveThinkingProfile(thinking 等级),以及由buildProviderReplayFamilyHooks生成的历史回放钩子(family: "openai-compatible",dropReasoningFromHistory: false),分别对应后文的几个小节。
安装插件
README 给出的安装方式就是全部核心操作:
openclaw plugins install @openclaw/baseten-provider openclaw gateway restart安装后必须重启 gateway 才会加载新插件。插件的自动加载配置在清单的activation字段中:onStartup: false意味着它不会在网关启动瞬间强制加载,而是按 provider 需求惰性激活;enabledByDefault: true保证安装后无需额外开关。
认证与 Onboarding
Baseten 的 Basic 计划无月费,Model API 调用按用量计费;在 Baseten 控制台的 API key 设置页(app.baseten.co/settings/api_keys)创建密钥后即可接入。OpenClaw 提供了三种等价的认证配置路径(详见 docs/providers/baseten.md):
# 方式一:交互式 onboarding openclaw onboard --auth-choice baseten-api-key # 方式二:非交互式,直接传入密钥 openclaw onboard --non-interactive --accept-risk --skip-health \ --auth-choice baseten-api-key \ --baseten-api-key "$BASETEN_API_KEY" # 方式三:仅设置环境变量 export BASETEN_API_KEY=...Onboarding 的行为由 onboard.ts 实现。它基于createModelCatalogPresetAppliers构造了两个应用函数:
applyBasetenConfig:写入 Baseten provider 完整预设 ——providerId: "baseten"、api: "openai-completions"、baseUrl: https://inference.baseten.co/v1、完整静态模型目录,并注册别名Inkling指向默认模型 ref;applyBasetenSetupConfig:认证应用路径,只有当用户显式配置了models.mode: "replace"时才附带内置目录,否则不复制目录到配置(因为 replace 模式禁用了隐式发现,需要目录兜底)。
换言之,onboarding 只保存连接设置,不会把生成的模型目录灌进你的配置,已有的 model 行保持不变——后续模型列表以实时发现结果为准。
模型目录:实时发现与离线回退
这是插件设计中最有含金量的一环,核心逻辑在 index.ts 的catalog.run:
- 先通过
ctx.resolveProviderAuth("baseten")解析apiKey与discoveryApiKey; - 无可用密钥:返回
buildStaticBasetenProvider()静态目录(离线模式); - 有可用密钥:调用
buildOpenAICompatibleLiveProviderCatalog,以discoveryMode: "strict"请求 Baseten 的GET /v1/models,发现超时10_000ms、结果 TTL5 * 60 * 1000ms(5 分钟缓存),并用projectBasetenLiveModels把返回行投影成 OpenClaw 模型行。
投影规则定义在 models.ts 的projectLiveModel中,值得逐条理解:
- 丢弃
object !== "model"或缺少id的行;按id去重; context_length/max_completion_tokens用readPositiveInteger校验(必须是安全整数且 > 0),无效时回退到静态目录值,再回退到默认值DEFAULT_CONTEXT_WINDOW = 128_000、DEFAULT_MAX_TOKENS = 8_192;pricing.prompt/pricing.completion/pricing.input_cache_read经readPerTokenPrice换算成每百万 token 价格(* 1_000_000并保留 9 位小数),取不到时回退静态目录价;- 若响应带
supported_features数组,则据vision决定输入模态(["text","image"]或["text"])、据reasoning/reasoning_effort决定推理能力标记;否则沿用静态目录的 fallback 值。
这意味着:Baseten 独立于 OpenClaw 发布节奏增删改模型时,插件会刷新模型 id、上下文/输出上限、输入模态与计价,同时保留模型级的传输策略(applyLiveReasoningEffortCompat只调整supportsReasoningEffort相关字段)。
当前清单中内置的静态回退目录(openclaw.plugin.json 的modelCatalog.providers.baseten.models)包含 9 个模型:
| 模型 id | 名称 | 输入 | 上下文 | 最大输出 | 推理 |
|---|---|---|---|---|---|
deepseek-ai/DeepSeek-V4-Pro | DeepSeek V4 Pro | text | 262k | 262k | ✓ |
zai-org/GLM-4.7 | GLM 4.7 | text | 200k | 200k | ✓ |
zai-org/GLM-5.2 | GLM 5.2 | text | 524k | 262k | ✓ |
zai-org/GLM-5.2-Fast | GLM 5.2 Fast | text | 524k | 262k | ✓ |
thinkingmachines/inkling | Inkling | text, image | 1.048M | 32k | ✓ |
moonshotai/Kimi-K2.6 | Kimi K2.6 | text, image | 262k | 262k | ✓ |
moonshotai/Kimi-K2.7-Code | Kimi K2.7 Code | text, image | 262k | 262k | ✓ |
nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B | Nemotron Ultra | text | 202k | 202k | ✓ |
openai/gpt-oss-120b | GPT OSS 120B | text | 128k | 128k | ✓ |
官方文档 docs/providers/baseten.md 的"Bundled fallback catalog"表格还列出了zai-org/GLM-5、zai-org/GLM-5.1、moonshotai/Kimi-K2.5、nvidia/Nemotron-120B-A12B等历史版本条目,说明静态目录随版本演进会有增减;以认证后实时目录为权威。
此外还有一个前向兼容设计:resolveBasetenDynamicModel(models.ts)允许使用尚不在内置目录中的模型 id—— 只要 id 不在静态目录里,就按openai-completions+ Baseten Base URL 构造一个默认 128k/8192 的兜底定义,配合isModernModelRef: () => true直接放行。
验证目录是否生效:
openclaw models list --provider baseten有可用认证时,插件会请求GET /v1/models并列出账户启用的全部模型;无认证则停留在离线回退目录。
Thinking(推理力度)的模型级映射
Baseten 上的模型对"思考开关"的接口并不统一,插件在 models.ts 中按模型 id 分了三类:
- Chat-template 思考模型(
CHAT_TEMPLATE_THINKING_MODEL_IDS):GLM-4.7 / GLM-5.2 / GLM-5.2-Fast、Kimi K2.6 / K2.7-Code、Nemotron-3-Ultra —— 通过 Baseten 的chat_template_args.enable_thinking控制,默认关闭; - GLM 5.2 系:额外暴露
none / high / max三档,其中adaptive映射到max; - 完整 reasoning_effort 模型(DeepSeek-V4-Pro、GPT OSS 120B):支持
none到max全档位;而默认模型Inkling支持none / minimal / low / medium / high / xhigh(无max,adaptive映射到xhigh)。
用户可见的 thinking 等级由 thinking.ts 的resolveBasetenThinkingProfile决定:GLM 5.2 系返回off / high / max三档 profile(默认off),其余 chat-template 思考模型返回二值 profile{ off, low(显示为 "on") }(默认off),其他模型返回undefined(即走 OpenClaw 默认 reasoning_effort 通道)。
请求侧的落地逻辑在 stream.ts 的createBasetenThinkingWrapper,它用createPayloadPatchStreamWrapper在发出请求前打补丁:
- 仅对
provider === "baseten"且api === "openai-completions"的模型生效; - DeepSeek V4 特例:其推理默认开启,只有显式
off才移除必要的回放元数据,因此统一走normalizeOpenAICompatibleReasoningReplay(stripAssistantMessagesOnly: true、replaceNullReasoningContent: true); - 其他 chat-template 思考模型:在不覆盖调用方已有参数的前提下,把
enable_thinking: thinkingLevel !== "off"合并进payload.chat_template_args。
配置示例
对 Inkling 的日常使用,最简配置只需指定主模型:
{ agents: { defaults: { model: { primary: "baseten/thinkingmachines/inkling" }, }, }, }会话内切换模型可用/model baseten/thinkingmachines/inkling -s。Inkling 支持文本+图像输入、工具调用、结构化工具 schema、可配置推理力度,上下文窗口 1.048M token、最大输出 32k token。
若要显式固定 provider(例如锁定 Base URL 或密钥来源),可参考 docs/providers/baseten.md 的 Manual config 写法:
{ env: { vars: { BASETEN_API_KEY: "..." } }, agents: { defaults: { model: { primary: "baseten/thinkingmachines/inkling" }, }, }, models: { mode: "merge", providers: { baseten: { baseUrl: "https://inference.baseten.co/v1", apiKey: "${BASETEN_API_KEY}", api: "openai-completions", models: [ { id: "thinkingmachines/inkling", name: "Inkling", reasoning: true, input: ["text", "image"], contextWindow: 1048000, maxTokens: 32000, }, ], }, }, }, }注意两点适用前提:其一,models.mode: "replace"会禁用隐式发现,此时 onboarding 会自动附带内置静态目录兜底;其二,若 gateway 以守护进程方式运行(launchd、systemd、Docker),必须保证BASETEN_API_KEY对该进程可见—— 仅在交互 shell 中 export 的密钥对已运行的受管服务不可见。
相关源码与文档索引
| 内容 | 路径 |
|---|---|
| 插件 README(安装入口) | extensions/baseten/README.md |
| 插件清单(provider 声明、静态目录、认证选项) | extensions/baseten/openclaw.plugin.json |
| 插件入口(catalog 组装、动态模型解析) | extensions/baseten/index.ts |
| 模型目录、投影与兼容元数据 | extensions/baseten/models.ts |
| thinking 等级 profile | extensions/baseten/thinking.ts |
| 请求载荷补丁(enable_thinking / 推理回放) | extensions/baseten/stream.ts |
| Onboarding 配置应用 | extensions/baseten/onboard.ts |
| 包元信息(版本、分发渠道、宿主约束) | extensions/baseten/package.json |
| 官方配置文档(步骤、模型表、手工配置) | docs/providers/baseten.md |
| 插件参考页(自动生成) | docs/plugins/reference/baseten.md |
【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考