Providers 导读

inferrs:本地模型跑 OpenAI 兼容接口,OpenClaw 走通用通道

inferrs 不是专用 provider,而是通过 openai-completions 通用路径接入。先配好 baseUrl 和模型名,最容易踩的坑是 content 必须为字符串,需设置 compat.requiresStringContent: true。

先讲这一页到底在解决什么

inferrs:本地模型跑 OpenAI 兼容接口,OpenClaw 走通用通道

inferrs 不是专用 provider,而是通过 openai-completions 通用路径接入。先配好 baseUrl 和模型名,最容易踩的坑是 content 必须为字符串,需设置 compat.requiresStringContent: true。

原文共 7 节,先看 Start Here 路径:/providers/inferrs 查看官方原文

第一站

🔌 三步接上线:启动、敲门、登记地址

把 inferrs 接进 OpenClaw,最小路线就是这三步。

启动和验活
inferrs serve google/gemma-4-E2B-it \
  --host 127.0.0.1 \
  --port 8080 \
  --device metal

curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/v1/models
启动 inferrs

像先把本地模型服务开起来,告诉它用哪个模型、监听哪个地址和端口。

/health

确认服务真的醒着,不是配置写了但后台没跑。

/v1/models

确认 OpenAI-compatible 模型列表能被读到。

登记到 OpenClaw

然后在配置里新增 provider,把默认模型指向 inferrs/google/gemma-4-E2B-it 这类 model ref。

第二站

🧾 配置里最关键的是 provider entry

这份配置的意思是:OpenClaw 以后看到 inferrs/google/gemma-4-E2B-it,就把请求送到本地 http://127.0.0.1:8080/v1

精简版配置骨架
{
  agents: {
    defaults: {
      model: { primary: "inferrs/google/gemma-4-E2B-it" },
      models: {
        "inferrs/google/gemma-4-E2B-it": {
          alias: "Gemma 4 (inferrs)",
        },
      },
    },
  },
  models: {
    mode: "merge",
    providers: {
      inferrs: {
        baseUrl: "http://127.0.0.1:8080/v1",
        apiKey: "inferrs-local",
        api: "openai-completions",
        models: [{
          id: "google/gemma-4-E2B-it",
          name: "Gemma 4 E2B (inferrs)",
          reasoning: false,
          input: ["text"],
          cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
          contextWindow: 131072,
          maxTokens: 4096,
          compat: { requiresStringContent: true },
        }],
      },
    },
  },
}
📍

baseUrl

本地服务的 OpenAI-compatible /v1 地址。

🔑

apiKey

本地占位 key 也要填,因为这条通用路径按 OpenAI 风格走。

🛤️

api

openai-completions 说明它走的是兼容 Chat Completions 的通用路线。

🧩

compat

本地后端不一定支持所有 OpenAI 形状,兼容开关就是用来收窄格式的。

第三站

⚠️ 两个兼容开关最重要

inferrs 能接通,不代表每种 OpenClaw agent turn 都能顺利跑。遇到格式或工具 schema 问题时,先看这两个开关。

requiresStringContent
compat: {
  requiresStringContent: true,
}

如果报 messages[].content 类型不对,说明后端只想收纯字符串内容。

supportsTools
compat: {
  requiresStringContent: true,
  supportsTools: false,
}

如果小的 direct request 能过,但完整 agent turn 被工具 schema 压垮,可以先禁用工具面。

别套 OpenAI 专属整形

自定义 inferrs base URL 不会注入 OpenAI 原生 reasoning、service tier、Responses store、prompt-cache hints 那些专属处理。

问题可能在上游

如果兼容开关都调了,大 turn 仍然崩,往往是 inferrs 或模型本身限制,不一定是 OpenClaw transport 坏了。

第四站

🧪 排查时同时测两层

直接测 inferrs 和通过 OpenClaw 测,是两件事。前者证明服务能答,后者证明 OpenClaw 这条路线也能跑。

手动 smoke test
curl http://127.0.0.1:8080/v1/chat/completions \
  -H 'content-type: application/json' \
  -d '{"model":"google/gemma-4-E2B-it","messages":[{"role":"user","content":"What is 2 + 2?"}],"stream":false}'

openclaw infer model run \
  --model inferrs/google/gemma-4-E2B-it \
  --prompt "What is 2 + 2? Reply with one short sentence." \
  --json
1

/v1/models 失败

先查服务有没有启动、host/port 是否和配置一致。

2

content 类型失败

compat.requiresStringContent: true

3

OpenClaw agent turn 失败

compat.supportsTools: false,减少工具 schema 压力。

4

大对话仍崩

减轻 prompt 压力,或换更稳的本地后端和模型。

最后总结

🎈 把 inferrs 这页压成一句话

inferrs 在 OpenClaw 里应当先当作“自托管 OpenAI-compatible 后端”来配:服务先跑通,再写 provider entry,最后用 compat 开关处理本地模型的格式和工具限制。