Skip to content

OpenViking 网关管理 API ​

管理 API 用来查看权限、配置上游和上下文配置、签发网关密钥、读取用量和日志。所有路径都以 /gateway/admin/ 开头,由网关直接提供:网关在 OpenViking Server 内运行时,访问 Server 的端口(默认 1933);独立运行时,访问网关自己的端口(默认 1935)。示例中的 SERVER_URL 指这个地址本身,不带路径,例如 http://127.0.0.1:1933。

模型客户端不调用这组接口。它们用网关密钥访问 /gateway/v1/*、/gateway/api/v3/* 或 /gateway/api/compatible/v1/*,见OpenViking 网关。

凭证和账号范围 ​

每个管理请求都要带 OpenViking API 密钥,放在 X-API-Key 或 Authorization: Bearer 中。网关向 OpenViking 确认这把密钥属于哪个账号、哪个用户、什么角色,确认结果最多缓存 30 秒。本地 dev 模式不需要密钥,调用方固定为 root 身份 default/default。网关不支持 trusted 认证。

上游和上下文配置(API 中叫 policies)属于账号,同一账号的用户共用。请求默认作用于调用方所在的账号;root 可以用 query 参数 account_id 指定其他账号,admin 和 user 只能访问自己的账号。

部署者可以另外设置网关管理密钥(配置方法见网关管理密钥)。设置之后,修改上游和上下文配置的请求必须在 X-OpenViking-Gateway-Management-Key 中带上它,OpenViking 的 admin 和 root 也不例外。请求带了管理密钥但值不对时,网关直接返回 401 management_key_invalid,不会降级成只读请求。

操作未设置管理密钥已设置管理密钥
读取上游和上下文配置本账号的任何用户本账号的任何用户;单独持有管理密钥也可以,并能指定任意账号
创建、修改或删除上游和上下文配置;测试上游本账号的任何用户只有带正确管理密钥的请求
导入 OpenViking 的模型配置嵌入部署中的 root(包括本地 dev)只有带正确管理密钥的请求,且只限嵌入部署
签发、读取、吊销网关密钥,重置保存user 只能操作自己的密钥;admin 操作本账号;root 操作所选账号同左,管理密钥不增加任何权限
读取日志和概览user 只看自己的;admin 和 root 看整个账号同左,始终需要 OpenViking 身份
删除某个用户的网关数据本账号的 admin,或 root同左
删除整个账号的网关数据root同左

管理密钥可以不带 OpenViking API 密钥单独使用,适合自动化脚本:它能读写上游和上下文配置、调用 /access,用 account_id 指定账号(省略时为 default)。签发密钥、读取日志和概览始终需要 OpenViking 身份;两种凭证同时提供,也不会让这些操作获得更高的权限。设置、更换或去掉管理密钥都不影响已签发的网关密钥。

只读视图不返回上游的 API Key、请求头的值和请求头名称,只保留 has_api_key 和 auth_mode。

权限与发现 ​

方法路径返回
GET/gateway/admin/access调用方的权限:managed、can_write_objects、can_import_vlm、can_issue_for_others、role、account_id、user_id、warnings
GET/gateway/admin/overview调用方可见的最近 10,000 条日志汇总:用量、缓存命中、召回、保存异常、OpenViking 状态和日志保留期
GET/gateway/admin/logs调用方可见的最新日志,以 JSON 数组返回,最新的在前;limit 默认 200,取值 1–1000。字段见日志记录。
GET/gateway/admin/guides客户端接入地址 base_url,以及 public_url_configured;base_url 是 public_url 加 /gateway,未设置 public_url 时取请求的来源地址加 /gateway
GET/gateway/admin/tools调用方能用的 OpenViking 工具:名称、描述和 annotations,用调用方自己的 OpenViking 密钥读取(OpenViking 拒绝 root 访问 /mcp,所以 root 改用本账号已签发网关密钥对应的 OpenViking 密钥,没有时返回上次读到的目录)

Studio 只根据 /access 决定显示哪些按钮,自己写的管理工具也应这样做。独立网关连接公共 OpenViking 服务且没有设置管理密钥时,warnings 中会出现 public_openviking_without_management_key。它只是告警,不限制任何操作。

bash
curl "$SERVER_URL/gateway/admin/access" \
  -H "X-API-Key: $OPENVIKING_API_KEY"
json
{
  "managed": true,
  "can_write_objects": false,
  "can_import_vlm": false,
  "can_issue_for_others": true,
  "role": "admin",
  "account_id": "team",
  "user_id": "alice",
  "warnings": []
}

OpenViking 拒绝 API 密钥时,返回 401 openviking_http_401。

日志记录 ​

日志只记元数据,不含消息内容。发往模型服务商的请求结束时写一条记录;对话的保存状态变化时也写一条(kind 为 capture)。网关在请求到达服务商之前就拒绝的,不记日志。除 time 外,字段都是可选的,不适用时省略。

字段含义
time记录写入时间,Unix 时间戳(秒)
request_id网关为请求分配的 ID
kinduser、continuation、auxiliary、subagent、count、passthrough 或 capture,见请求日志
model客户端发送的模型名
status服务商返回的 HTTP 状态码
upstream_id、credential_id处理请求的上游,以及发出请求的网关密钥
session、protocol对话及其协议,重置保存时要用
degradation异常代码,见降级请求的异常
recall_reason、recall_count、recall_ms记忆检索的结果代码、补充的条数和检索耗时,见没有补充记忆
replay_hits原样放回记忆的历史消息数
capture_status、capture_reason、capture_retry_at保存状态(active、disabled、retrying 或 paused)、原因,以及下次重试时间(Unix 时间戳,秒),见保存状态
tool_skip_reason请求没有拿到 OpenViking 工具的原因,见什么时候不提供工具
tool_stop_reason工具 Token 预算用完、后续调用被拒绝时为 token_budget,见上限
compaction_failed压缩失败的原因(still_over_threshold 时摘要已保留),见长对话超出上下文长度
context_tokens、context_window估算的上下文大小,以及用来比较的上下文窗口
input_tokens、output_tokens、cached_tokens、cache_write_tokens本次请求所有服务商调用(含 OpenViking 工具轮次)的 token 用量合计。input_tokens 已包含缓存命中和缓存写入的 token。
duration_ms从把请求发给服务商到回复结束的耗时

以 first_upstream_ 和 hidden_upstream_ 开头的字段把 token 用量拆成首次服务商调用和 OpenViking 工具轮次两部分,首次调用缓存命中率按前者计算。

/overview 由这些记录汇总而来。除用量和缓存数据外,还返回 degradations(异常代码 → 次数)、capture_issues(正在重试或已暂停保存的对话数)、cache_alerts、openviking(OpenViking 的 status,降级时另有 reason)和 log_retention_days。

上游和上下文配置 ​

方法路径说明
GET/gateway/admin/upstreams列出上游
GET/gateway/admin/upstreams/{identifier}读取单个上游
PUT/gateway/admin/upstreams/{identifier}创建或替换上游
DELETE/gateway/admin/upstreams/{identifier}删除没有密钥在用的上游
POST/gateway/admin/upstreams/{identifier}/test测试上游连接或模型
POST/gateway/admin/upstreams/import-vlm导入 OpenViking 的模型配置
GET/gateway/admin/policies列出上下文配置
GET/gateway/admin/policies/{identifier}读取单个上下文配置
PUT/gateway/admin/policies/{identifier}创建或替换上下文配置
DELETE/gateway/admin/policies/{identifier}删除没有密钥在用的上下文配置

ID 由调用方指定。PUT 提交完整对象,未知字段会导致校验失败。各字段的含义、默认值和取值范围见配置参考。

上游的 api_key 和 headers 只写不读:

  • base_url 不变时,api_key 留空或省略就保留已存的密钥;省略 headers 保留全部已存请求头;提交 headers 对象则替换整个集合,其中值为空的项沿用这个名称已存的值。
  • 修改 base_url 会清除已存的 API Key 和全部请求头值。 新地址需要的凭证要随这次请求重新提交,这样已存的密钥不会被发往另一个地址。
  • 可编辑视图返回 has_api_key 和 header_names,不返回值。
bash
curl -X PUT "$SERVER_URL/gateway/admin/upstreams/openai?account_id=team" \
  -H "X-OpenViking-Gateway-Management-Key: $GATEWAY_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"OpenAI","protocol":"chat","base_url":"https://api.openai.com/v1","api_key":"<provider-key>"}'

删除仍有网关密钥在用的对象,返回 409 in_use 和 key_count。先吊销这些密钥;只是想让请求立即停止发往某个上游,可以停用它而不删除。

上游测试 ​

POST /gateway/admin/upstreams/{identifier}/test 支持两种模式:空请求体 {} 通过 GET /v1/models 检查连接;{"model":"<模型名>"} 使用已存的凭证和请求头发送一次很小的非流式生成请求。模型名会先经过上游的别名映射。模型请求使用已配置的 Chat Completions、Responses 或 Anthropic Messages 接口;关闭路径拼接时,也会遵循配置的完整接口 URL。上游允许 OpenViking 工具时,请求会带上当前账号的 OpenViking 工具,并按默认上下文配置筛选;工具目录暂时不可用时,降级为不带工具继续测试。模型测试不设置 reasoning effort,由模型使用默认值。

响应包含 {ok, kind, status, reason, url},其中 kind 为 connection 或 model。测试失败时还会在 response 中返回完整的上游 HTTP 响应,包括 http_version、status、reason、headers、body 和可选的 truncated 标记。响应体最多 16 KiB;没有收到响应时不含 status。超时时间取已配置上游超时与 60 秒中的较小值。两种测试都需要写权限;模型测试会真实请求服务商并可能产生少量费用。

Anthropic 测试同时在 x-api-key 和 Authorization: Bearer 中发送密钥;上游请求头未设置 anthropic-version 时,默认使用 2023-06-01。Chat Completions 和 Responses 测试只发送 Bearer 鉴权。key_header 不是 authorization,或者 base_url 含 {api_key} 时,按凭证中的规则发送;返回的 url 保留 {api_key} 占位符。

两种测试对服务商响应的判断不同:

测试服务商的响应reasonok
连接上游是完整请求地址(append_endpoint_path 为 false),没有模型列表。网关不发请求,请改用模型测试。exact_endpoint_untestablefalse
模型Coding Plan 上游尚未授权网关使用。网关不发请求。coding_plan_blockedfalse
两者没有可用的 API Key:没有保存,或者上游要求每个客户端自带。网关不发请求。upstream_key_missingfalse
连接2xx,响应是带 data 列表的 JSON 对象passedtrue
连接其他 2xx:不是合法 JSON、响应体超过 16 KiB、没有 data 列表,或带 error 字段upstream_key_rejectedfalse
连接404 或 405:服务商不提供模型列表,API Key 未经验证models_unavailabletrue
连接429:地址有响应,但 API Key 未经验证rate_limitedtrue
模型2xx,响应符合已配置的模型协议passedtrue
模型其他 2xx:不是合法 JSON、响应体超过 16 KiB,或不符合已配置的协议invalid_responsefalse
模型429rate_limitedfalse
模型404 或 405model_request_rejectedfalse
两者400 或 422model_request_rejectedfalse
两者401 或 403upstream_key_rejectedfalse
两者网络错误、超时、重定向、5xx 或其他状态码upstream_unavailablefalse

连接测试返回 passed,说明地址可达,已存凭证也有效。models_unavailable 和 rate_limited 只能说明地址可达,Studio 显示为中性色的 连接可用;要验证 API Key,请再做一次模型测试。Coding Plan 授权只拦截模型测试,未授权的 Coding Plan 上游照样可以做连接测试。模型测试通过说明所选模型完成了本次请求,不代表其他模型也可用,也不会授权使用 Coding Plan。

导入 VLM 配置 ​

POST /gateway/admin/upstreams/import-vlm 把 OpenViking Server 的 VLM 凭证导入为所选账号的上游,只在嵌入部署中可用;独立网关返回 404 vlm_import_unavailable。

每个导入的上游 ID 固定为 vlm-<credential id>,重复导入不会产生重复的上游。再次导入时,来自服务端的字段(base_url、api_key、headers、protocol、vendor、coding_plan、append_endpoint_path、key_header)按服务端配置刷新,其他字段保留在网关里改过的值,包括 name、enabled、priority、models、aliases、context_windows 和 allow_coding_plan。路径中含 coding 或 plan 段的上游会被标为 Coding Plan,在设置 allow_coding_plan 之前归入 needs_confirmation。

json
{
  "imported": [{"id": "vlm-default", "name": "default"}],
  "needs_confirmation": [{"id": "vlm-coding", "name": "coding"}],
  "skipped": [{"id": "vlm-codex", "reason": "openai_codex"}]
}
跳过原因 reason说明
openai_codexCodex OAuth 令牌会定期刷新,网关无法长期使用。
litellm_no_api_baseLiteLLM 凭证没有 api_base。在 OpenViking 配置中补上后重新导入。
litellm_unsupported_routeLiteLLM 路由不使用 OpenAI Chat Completions API,例如 gemini/、bedrock/ 或 vertex_ai/。请手动把这个服务商添加为上游。
invalid_configuration凭证构不成有效的上游,例如 base URL 无效。

网关密钥 ​

方法路径说明
GET/gateway/admin/keys列出调用方可见的密钥,不含密钥本身
GET/gateway/admin/keys/{identifier}读取单个可见密钥
POST/gateway/admin/keys签发密钥,响应中的 key 是唯一一次返回的完整密钥
DELETE/gateway/admin/keys/{identifier}吊销密钥,保留用户数据
POST/gateway/admin/keys/{identifier}/capture/reset让一段对话重新开始保存
DELETE/gateway/admin/users/{user_id}/dataadmin 或 root:吊销该用户的全部密钥,删除其对话状态和日志
DELETE/gateway/admin/account/dataroot:删除账号的全部网关对象、密钥、对话状态和日志

签发请求体:

字段必填说明
name是显示名称。
policy_id是使用的上下文配置。
upstream_ids是可用的上游,至少一个。
models否允许的模型名(客户端发送的名称,包括别名);空列表表示不限。
user_id否密钥归属的 OpenViking 用户,默认是调用方自己。root 不是账号里的用户,必须指定用户(或提供 openviking_key)。user 只能填自己。
openviking_key否该用户的 OpenViking API 密钥。通常不用填,见下文。

网关需要拿到目标用户的 OpenViking API 密钥,之后以这个用户的身份检索和保存记忆:

  • 给自己签发时,直接使用调用方的密钥(user 或 admin)。
  • admin 或 root 给别人签发时,网关用调用方的凭证向 OpenViking 读取该用户的密钥。OpenViking 只保存密钥哈希时读不出来,返回 409 user_key_unreadable,这时要在 openviking_key 中提供该用户的密钥。
  • 网关会向 OpenViking 核实这把密钥:它必须属于所选账号;提供了 user_id 时,还必须属于这个用户。
  • root API 密钥不能绑定到网关密钥,本地 dev 的 default/default 例外。
bash
curl -X POST "$SERVER_URL/gateway/admin/keys?account_id=team" \
  -H "X-API-Key: $OPENVIKING_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Alice laptop","user_id":"alice","policy_id":"default","upstream_ids":["openai"]}'
json
{
  "id": "3f9c…",
  "name": "Alice laptop",
  "user_id": "alice",
  "policy_id": "default",
  "upstream_ids": ["openai"],
  "models": [],
  "prefix": "ovgw_Xk2pQ7a",
  "created_at": 1760000000.0,
  "revision": 1,
  "key": "ovgw_Xk2pQ7a…"
}

立即保存响应中的 key,网关只保留它的哈希。GET 返回同样的字段,但没有 key。网关密钥不能修改,没有对应的 PUT;要换上下文配置、上游、模型或用户,就签发新密钥,再吊销旧的。

用户的 OpenViking API 密钥重新生成或用户被删除后,绑定它的网关密钥会失效并被删除,用户数据保留,见网关密钥。

重置保存。 请求体为 {"session":"<会话请求头的值或日志中的 session>","protocol":"chat"},protocol 取 chat、anthropic 或 responses。成功返回 {"status":"ready","message":"…"},网关会在这段对话的下一个请求里,把完整历史写入一个新的 OpenViking 会话。找不到这段对话时返回 404 not_found。

删除数据。 两个删除接口会清掉网关里尚未保存的对话内容和日志,不影响已经存入 OpenViking 的会话和记忆。保留期和其他删除途径见安全与数据。

错误 ​

管理接口的错误响应带稳定的顶层 reason,以及一句简短的英文说明 detail;部分错误另有附加字段,例如:

json
{"reason": "in_use", "detail": "Gateway keys still use this object; revoke them first.", "key_count": 2}

请按 reason 判断,不要匹配 detail 文本。服务端没有开启网关时,这组路径不存在,返回 404;Studio 把这种情况显示为 not_enabled。

HTTPreason含义和处理
401management_key_invalid管理密钥不正确。向部署者确认当前的管理密钥,或者见忘记网关管理密钥。
403management_key_required已设置管理密钥,修改上游或上下文配置时必须带上它。
401openviking_http_401OpenViking 拒绝了 API 密钥。换用当前有效的密钥。
401openviking_identity_missingOpenViking 没有返回这把密钥对应的用户。
403trusted_mode_unsupportedOpenViking 使用 trusted 认证。改用 api_key 认证。
403other_account密钥或请求的账号不在调用方的权限范围内。
403forbidden操作超出调用方的角色或用户范围。
403root_key_not_allowedroot API 密钥不能绑定到网关密钥。改用某个用户的 API 密钥。
409user_key_unreadableOpenViking 只保存了该用户密钥的哈希。在 openviking_key 中提供该用户的密钥。
409in_use还有 key_count 个网关密钥在用这个对象。
400unknown_user、unknown_policy、unknown_upstream指定的用户、上下文配置或上游不存在。
400user_requiredroot 签发密钥时没有提供 user_id 或 openviking_key。指定密钥归属的用户。
404not_found对象不存在,或者调用方看不到它。
422invalid_configuration请求体或 Base URL 不合法。错误信息不会回显提交的凭证。
403vlm_import_forbidden调用方没有导入权限,以 /access 的 can_import_vlm 为准。
404vlm_import_unavailable独立网关读不到服务端的模型配置,请手动添加上游。
503openviking_unavailable、openviking_unreachable网关连不上 OpenViking。检查 OpenViking 是否运行;独立网关还要检查 openviking_url(gateway.conf 或 OPENVIKING_GATEWAY_OPENVIKING_URL)。
503openviking_version_mismatch仅独立网关:OpenViking Server 低于要求的版本,响应中的 required_version 给出最低版本。

OpenViking 返回的其他 HTTP 错误记为 openviking_http_<status>;网关自身的通用 HTTP 错误记为 gateway_http_<status>,例如对不支持的方法返回 405 gateway_http_405。

模型客户端收到的 401 不属于管理 API。原因可能是网关密钥缺失、错误或已吊销,也可能是它绑定的 OpenViking 密钥已经失效,排查方法见客户端收到网关返回的错误。

Open source under the AGPL-3.0 License. Font licenses