跳转至

配置 Agent BYOK

BYOK 让 Agent 使用您自己的模型服务。您在 provider.json 中填写服务地址、API Key、模型和推理档位,再把文件内容保存到 etcd。

配置需要两套凭据:etcd 账号用于保存和读取模型配置,模型 API Key 用于调用模型服务。

BYOK 工作时序

sequenceDiagram
    autonumber
    participant Beak
    participant Agent as Agent(含安装)
    participant Etcd as etcd
    participant LLM as 模型服务

    Note over Beak,Agent: 用户填写 etcd 设置并安装 Agent
    Agent->>Beak: 读取已保存的 etcd 设置
    Agent->>Etcd: 读取 Provider 和模型配置
    Agent->>Beak: 同步可选择的模型

    Note over Beak: 用户选择模型并发起任务
    Beak->>Agent: 发送任务
    Agent->>LLM: 调用所选模型
    LLM-->>Agent: 返回响应
    Agent-->>Beak: 返回结果

    Note over Etcd: 用户更新完整 provider.json
    Etcd-->>Agent: 通知配置已更新
    Agent->>Etcd: 获取最新配置
    Agent->>Beak: 同步更新后的模型
    Note over Beak,Agent: 新任务使用新配置,正在执行的任务不受影响

    Note over Beak,Agent: 用户修改 etcd 连接设置后需重新安装<br/>普通升级继续使用当前 BYOK 设置

准备连接信息

开始前,请准备:

  • etcd 地址,以及保存模型配置的 Key。本文使用 obs-agent/byok/providers。
  • 专用 etcd 账号 obs-agent,用于写入模型配置,并供 Agent 读取。
  • 模型服务的 API 根地址、API Key,以及供应商提供的模型 ID、能力和推理档位。

强烈建议新建 obs-agent 账号并设置独立的强密码,不要复用已有账号或密码。只授予它对指定 Key 的读写权限。

以下命令需要已安装 etcdctl。请让 etcd 管理员执行,替换地址和管理员用户名:

使用自建证书时,先设置 ETCDCTL_CACERT;需要客户端证书时,再设置 ETCDCTL_CERT 和 ETCDCTL_KEY,值均为证书或私钥文件路径。

export ETCDCTL_ENDPOINTS='https://<ETCD-HOST>:2379'
etcdctl --user='<ETCD-ADMIN-USER>' user add obs-agent
etcdctl --user='<ETCD-ADMIN-USER>' role add obs-agent-byok
etcdctl --user='<ETCD-ADMIN-USER>' role grant-permission obs-agent-byok readwrite 'obs-agent/byok/providers'
etcdctl --user='<ETCD-ADMIN-USER>' user grant-role obs-agent obs-agent-byok

按提示输入管理员密码;user add 还会要求设置 obs-agent 的新密码。

编写模型配置

创建 provider.json,用下面的示例作为起点。请替换服务地址、API Key 和模型 ID,并按供应商的实际能力填写窗口大小和推理档位。

{
  "schema_version": 1,
  "default_model": {
    "provider_id": "provider-a",
    "model_id": "<MODEL-ID>"
  },
  "providers": [
    {
      "id": "provider-a",
      "name": "My provider",
      "protocol": "openai_chat_completions",
      "base_url": "https://<PROVIDER-HOST>/v1",
      "api_key": "<PROVIDER-API-KEY>",
      "models": [
        {
          "id": "<MODEL-ID>",
          "name": "My model",
          "context_tokens": 524288,
          "input_modalities": ["text"],
          "output_modalities": ["text"],
          "supports_tools": true,
          "supports_json_schema": true,
          "reasoning": {
            "supports_enable": false,
            "supports_disable": false,
            "effort": {
              "status": "available",
              "request_path": ["reasoning_effort"],
              "levels": ["minimal", "balanced", "deep"],
              "default_level": "balanced"
            }
          }
        }
      ]
    }
  ]
}

示例中的推理字段和档位用于说明填写方法,请以模型供应商的说明为准。增加服务时,在 providers 中增加一项;增加模型时,在对应服务的 models 中增加一项。

填写服务和默认模型

字段 如何填写
schema_version 保持 1。
default_model 指定默认服务的 provider_id 和默认模型的 model_id,两者必须存在于下方配置中。
providers 保存全部模型服务,每次更新都提供完整列表。
id 为服务取一个唯一且稳定的标识,例如 provider-a。
name 菜单中显示的服务名称。
protocol 保持 openai_chat_completions,并确认供应商支持这种接口。
base_url 供应商提供的 API 根地址,例如 https://example.com/v1,不包含末尾的 /chat/completions。
api_key 该模型服务的 API Key。服务无需认证时填 ""。
models 该服务下可用的模型列表。

服务 id 和模型 id 区分大小写。修改展示名称时,保留原有 id,方便已有任务继续识别模型。

填写模型能力

字段 如何填写
id 供应商接受的模型 ID,与默认模型中的 model_id 对应。
name 菜单中显示的模型名称。
context_tokens 按供应商公布的上下文窗口填写。Agent 默认需要至少 262144 tokens,不要虚报窗口大小。
input_modalities 填 ["text"];模型支持图片时可加 "image"。
output_modalities 填 ["text"]。
supports_tools 模型必须支持工具调用,填 true。
supports_json_schema 支持 JSON Schema 填 true;仅支持 JSON Object 填 false。模型至少需要支持 JSON 输出。
reasoning 按下一节填写,即使没有推理档位也需要保留。

请使用有效 JSON,不添加 JSON 语法不支持的注释或重复字段。您可以增加 comment、owner 等备注字段,Agent 会忽略不认识的字段。

设置模型的推理档位

每个模型分别设置推理字段和档位。字段名、档位值及大小写均按供应商原值填写,菜单会显示您配置的档位。

字段 如何填写
supports_enable、supports_disable 模型能独立开启或关闭推理时,分别填 true;否则填 false。
enable_request_path 支持开关时,填写供应商的布尔开关字段,例如 ["enable_thinking"]。
effort.status 有可选档位填 available,没有则填 unavailable。
effort.request_path 填写供应商的推理档位字段;例如 ["reasoning_effort"],嵌套字段可填 ["reasoning", "effort"]。没有档位时省略。
effort.levels 按希望展示的顺序列出供应商支持的原生值。没有档位时填 []。
effort.default_level 默认档位,必须是 levels 中的一个值。没有档位时填 null。

例如,供应商使用 reasoning.effort,支持 Quick 和 Careful,可以填写:

{
  "supports_enable": false,
  "supports_disable": false,
  "effort": {
    "status": "available",
    "request_path": ["reasoning", "effort"],
    "levels": ["Quick", "Careful"],
    "default_level": "Careful"
  }
}

将这段内容替换到模型的 reasoning 中。您选择 Quick 时,Agent 就使用 Quick;未选择时使用 Careful。切换模型后,使用目标模型自己的档位。

模型没有可选档位,也不能独立开关推理时,填写:

{
  "supports_enable": false,
  "supports_disable": false,
  "effort": {
    "status": "unavailable",
    "levels": [],
    "default_level": null
  }
}

把模型配置保存到 etcd

在 provider.json 所在位置打开 Bash,替换 etcd 地址,执行以下命令。输入刚创建的 obs-agent 密码:

export ETCDCTL_ENDPOINTS='https://<ETCD-HOST>:2379'
read -r -s -p 'obs-agent password: ' ETCDCTL_PASSWORD
printf '\n'
export ETCDCTL_PASSWORD
ETCDCTL_USER='obs-agent' etcdctl put 'obs-agent/byok/providers' < provider.json
unset ETCDCTL_PASSWORD

看到 OK 即表示写入成功。首次写入会创建该 Key,后续写入会替换完整内容;每次更新都请保留其他服务和模型。使用证书连接时,沿用上一节的证书设置。

准备 Agent 的连接配置

填写连接 JSON

安装或重新安装 Agent 时,使用以下连接信息,填写同一个 etcd 账号 obs-agent:

在 Web 的 Agent 创建页或「运行与部署」页面填写并保存这些设置,再复制安装命令到目标机器执行。安装会自动读取已保存的设置,您无需在命令后追加 BYOK 内容。重新安装同一个 Agent 时也会复用这些设置。

{
  "schema_version": 1,
  "endpoints": ["https://<ETCD-HOST>:2379"],
  "user": "obs-agent",
  "password": "<OBS-AGENT-ETCD-PASSWORD>",
  "key": "obs-agent/byok/providers",
  "request_timeout": "10s"
}

替换所有尖括号占位值。key 必须与授权和写入时的 Key 完全一致;多个 etcd 地址分别填入 endpoints。连接账号和密码不能用模型 API Key 代替。

request_timeout 默认为 10s,需要时可调整,例如 15s。

使用自建 CA 时,在连接配置中增加 tls.ca_pem,填写完整证书内容。需要双向 TLS 时,再成对填写 tls.cert_pem 和 tls.client_key_pem。这些字段填写 PEM 内容,换行用 JSON 的 \n 表示,例如:

{
  "tls": {
    "ca_pem": "-----BEGIN CERTIFICATE-----\n<CA-CONTENT>\n-----END CERTIFICATE-----\n"
  }
}

把所需的 tls 字段加入完整连接配置;系统已信任 etcd 证书时无需填写。

查看连接配置保存位置

Agent 将连接配置保存在工作路径下的 .beak/private/byok.etcd.json。Linux 标准安装的位置为:

/var/lib/obs-agent/work/.beak/private/byok.etcd.json

使用自定义工作路径时,在该路径下查找 .beak/private/byok.etcd.json。

选择和更新模型

在 obscli 的 Task 中输入 /model,选择服务、模型及推理档位。菜单显示配置中的服务名称和模型名称,并用 服务ID/模型ID 区分同名模型;也可直接输入 /model provider-a/model-a <effort>。详细操作见 obscli 模型选择。

修改模型、API Key 或推理档位后,将完整 provider.json 再次写入同一个 etcd Key。Agent 会订阅这个 Key,并在收到变更通知后读取和校验新内容。校验成功后,新任务使用新配置;正在执行的任务继续使用原配置。轮换 API Key 时,请为已有任务留出完成时间。

撤下模型时,从对应的 models 中移除它;如果它是默认模型,同时指定新的默认模型。已有任务选择的模型被撤下后,后续执行使用默认模型。

更换 etcd 地址、账号、密码、Key 或证书时,在 Agent 的「运行与部署」页面更新并保存设置,然后重新执行安装命令。保存后,正在运行的 Agent 仍使用原配置;普通升级也不会应用这些修改。

切回 AIHub 模型

如需切回 AIHub 模型,在 Agent 的「运行与部署」页面选择「官方模型」,保存安装配置,然后复制新的安装命令重新安装 Agent。该命令会清除原来保存的 BYOK 设置。

仅清空启动参数、删除 etcd 中的模型配置或停止 etcd 服务,都不会切回 AIHub 模型。

遇到问题时检查

现象 检查方法
无法读取模型配置 核对 etcd 地址、obs-agent 账号、密码、证书和 Key 权限,确认授权、写入与 Agent 连接配置中的 Key 一致。
配置被拒绝 检查 JSON 格式、必填字段、默认模型,以及供应商实际支持的模型能力。
更新后仍看到旧模型 等待下一次更新,确认 Agent 在线,并在新任务中查看模型列表。
推理参数被拒绝 按供应商说明核对字段名、档位值和大小写。
模型调用失败 根据显示的供应商错误检查 API 地址、Key、模型 ID、账户额度或权限。

模型配置和连接配置均包含凭据,请妥善保管。提交问题时提供错误信息,并移除密码和 API Key。

文档评价

文档内容是否对您有帮助?