Gateway 运维
Claude apps gateway、通用 LLM gateway 协议,以及 Passion8/自定义网关在认证、路由、缓存、模型发现和 spend limits 上的运维注意。
Gateway 运维分两类场景:官方 Claude apps gateway 和通用 LLM gateway。前者面向 Claude apps 的组织级入口,由管理员运行和管理;后者面向 Claude Code 的 ANTHROPIC_BASE_URL,由 Passion8 或自定义网关转发 Anthropic Messages 请求。
官方 Claude apps gateway 的登录入口必须能被用户设备在私网内访问。如果登录页、OIDC 回调或 gateway public URL 只在服务器本机可达,Claude apps 会卡在登录或策略拉取阶段。
协议字段、错误语义、模型发现和缓存验收清单见 Gateway 协议上线清单。用户侧 provider 选择和认证变量见 Provider 认证与云平台接入。
#官方 Claude apps gateway
管理员用 claude binary 自托管 gateway:
claude gateway --config gateway.yaml这个 gateway 运行在 claude binary 中,不需要额外部署一个独立应用框架。运维重点是把身份、策略、数据库、观测和上游模型路由配置清楚,并把登录入口放在 VPN、内网 DNS 或受控反向代理后面。
| 能力 | 运维注意 |
|---|---|
| OIDC | 配置 issuer、client、回调 URL、允许的 group/claim。确认用户设备能访问登录页和回调域名。 |
| Postgres | 用持久化数据库保存 gateway 状态。纳入备份、迁移、连接池和监控。 |
| Managed policies | 在 gateway 或组织策略里集中限制模型、工具、权限和默认配置。不要依赖每个用户手动设置。 |
| Telemetry | 输出请求量、延迟、错误率、模型路由、spend 和策略命中。日志里默认不要记录完整 prompt。 |
| Upstream routing | 按用户、团队、模型、成本或区域把请求路由到 Anthropic、Passion8 或其他上游。 |
| Spend limits | 设置 user/team/project 级预算和时间窗口。超限时返回明确错误,不要静默切到未知模型。 |
#gateway.yaml 示例
下面是运维结构示例,用于说明应覆盖哪些配置域。实际字段名以当前 claude gateway 版本的 schema 为准。
server:
listen: "0.0.0.0:8443"
public_url: "https://claude-gateway.internal.example.com"
auth:
oidc:
issuer_url: "https://idp.internal.example.com"
client_id: "claude-apps-gateway"
client_secret_env: "CLAUDE_GATEWAY_OIDC_CLIENT_SECRET"
allowed_groups:
- "engineering"
- "support"
database:
postgres:
url_env: "CLAUDE_GATEWAY_DATABASE_URL"
policies:
managed:
enabled: true
default_policy: "engineering-default"
telemetry:
otlp:
endpoint: "https://otel.internal.example.com/v1/traces"
headers_env: "CLAUDE_GATEWAY_OTEL_HEADERS"
upstreams:
- name: "anthropic"
type: "anthropic"
base_url: "https://api.anthropic.com"
api_key_env: "ANTHROPIC_API_KEY"
- name: "passion8"
type: "anthropic"
base_url: "https://passion8.cc"
auth_token_env: "PASSION8_API_KEY"
routing:
default_upstream: "anthropic"
rules:
- group: "support"
upstream: "passion8"
models:
- "claude-sonnet-4"
spend_limits:
defaults:
user_daily_usd: 10
team_monthly_usd: 1000
on_exceeded: "deny"把 OIDC secret、Postgres URL、上游 API key 和 telemetry headers 放在环境变量或 secret manager 中。不要把真实密钥写进 gateway.yaml。
#通用 LLM gateway 协议
Claude Code 接入 Passion8 或自定义网关时,客户端仍发送 Anthropic Messages 请求。Base URL 写在 ANTHROPIC_BASE_URL,网关需要提供 Anthropic 兼容路径。
| 项目 | 要求 |
|---|---|
| Base URL | ANTHROPIC_BASE_URL 写到 host 根路径,例如 https://passion8.cc,通常不要带 /v1。 |
| Messages | POST /v1/messages 必须支持。 |
| Token count | POST /v1/messages/count_tokens 可选,缺失时客户端会退回估算或部分功能降级。 |
| Streaming | stream: true 时必须返回 SSE stream,不要被反向代理缓冲成一次性响应。 |
| Headers | 原样转发 anthropic-version 和 anthropic-beta,不要按固定旧版本重写。 |
| Errors | 上游 JSON 错误应保留 status、type、message,便于 Claude Code 判断是否重试或降级。 |
自定义网关如果要校验 body,应使用开放列表而不是只允许最小字段。至少保留这些字段,并对未知 beta 字段采用灰度透传或显式拒绝:
| 字段 | 说明 |
|---|---|
model、max_tokens、messages、system | Messages API 的核心字段。 |
stream | 控制 SSE 流式响应。 |
tools、tool_choice | MCP、内置工具和 deferred tool loading 依赖这些字段。 |
thinking | reasoning/effort 相关能力。 |
metadata、stop_sequences | 业务标记和停止条件。 |
temperature、top_p、top_k | 采样参数。 |
context_management、output_config | Claude Code 的上下文和输出控制能力。 |
cache_control | 可能出现在 system、messages、tools 等嵌套 block 上。 |
#system array 与 attribution
Claude Code 可能把 system 作为 array 发送,并把 attribution block 放在固定位置。gateway 必须保持 block 顺序、类型和嵌套字段:
| 不要做 | 风险 |
|---|---|
把 system array 合并成字符串 | 破坏 attribution 处理、prompt cache key 和 cache_control block。 |
| 在 attribution block 前插入自定义 system | 可能让 attribution 进入实际 prompt,也会改变缓存前缀。 |
| 对 system blocks 排序、去重或重写 | 会导致缓存 miss、策略误判或上游能力异常。 |
| 删除未知 block 字段 | 新版 Claude Code 的 beta 能力可能直接失效。 |
如果网关必须插入组织提示,优先用官方 managed policies 或上游支持的策略机制。必须改写 body 时,至少保留 attribution block 的相对顺序,并把改写行为打到审计日志里。
#模型发现
Claude Code 可以从 gateway 拉取模型列表,用于 /model picker。开启变量:
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1发现请求是:
GET /v1/models?limit=1000运维约束:
| 项目 | 说明 |
|---|---|
| 超时 | 客户端等待时间约 3s。网关慢、跳转或 OIDC 拦截都会导致静默失败。 |
| 缓存文件 | 本机缓存通常在 ~/.claude/cache/gateway-models.json。 |
| 手动模型变量 | 可用 ANTHROPIC_MODEL、ANTHROPIC_DEFAULT_OPUS_MODEL、ANTHROPIC_DEFAULT_SONNET_MODEL、ANTHROPIC_DEFAULT_HAIKU_MODEL、ANTHROPIC_DEFAULT_FABLE_MODEL 固定默认模型。 |
| 能力声明 | 模型出现在列表里不代表支持 tool search、1M context、thinking 或 1h prompt cache。 |
模型列表返回要稳定、轻量、无需交互登录。不要让 /v1/models?limit=1000 返回 HTML 登录页或重定向到 IdP。
#Prompt cache 与 1h TTL
1 小时 prompt cache 不是只靠客户端变量就能保证。自定义 gateway 要满足这些条件才适合透传:
| 条件 | 运维检查 |
|---|---|
| 客户端请求 | API/provider 场景设置 ENABLE_PROMPT_CACHING_1H=1,且未设置 FORCE_PROMPT_CACHING_5M 或 DISABLE_PROMPT_CACHING。 |
| 上游支持 | 实际路由到支持 1h TTL 的模型和 provider。 |
| Header 透传 | anthropic-version、anthropic-beta 不被剥离或降级。 |
| Body 稳定 | 不重写 system array、messages、tools、cache_control 或模型参数。 |
| Usage 返回 | 保留 cache_creation_input_tokens 和 cache_read_input_tokens 等 usage 字段。 |
如果上游不支持 1h TTL,网关应明确降级为 5 分钟策略并在 telemetry 中标记。不要用 body 重写伪造缓存命中,否则成本和延迟都会失真。
#Spend limits
spend limits 应在 gateway 层和上游账号层同时考虑:
| 层级 | 建议 |
|---|---|
| Gateway | 按 user、team、project、model、upstream 设置日/月预算和并发限制。 |
| Upstream | 设置 provider 侧硬限额,防止 gateway bug 或凭证泄露导致无限消费。 |
| 响应 | 超限返回稳定的 402、403 或 429 JSON 错误,包含 limit、window、reset 时间。 |
| 观测 | telemetry 中记录预算消耗、拒绝次数、触发规则和 fallback 行为。 |
不要在用户超限后自动切到更便宜但能力不同的模型,除非策略和 UI 明确告知。静默 fallback 会让调试、成本归因和安全审计都变复杂。
#Server-managed settings 限制
Anthropic server-managed settings 依赖官方账号、组织和服务端策略通道。使用 Passion8 或其他 custom ANTHROPIC_BASE_URL 时,不要假设它会覆盖第三方 provider 场景,也不要依赖它下发自定义 Base URL 或网关 token。
| 场景 | 推荐做法 |
|---|---|
统一设置 ANTHROPIC_BASE_URL | 用 MDM、endpoint-managed settings、系统级 managed settings 或本地模板。 |
| 统一分发 token | 用 apiKeyHelper、secret manager 或短期凭证,不要把 token 放进项目仓库。 |
| 统一限制模型和预算 | 放在 gateway managed policies 和 spend limits 中。 |
| 官方 Claude apps gateway | 通过 gateway 自身的 OIDC、Postgres、managed policies 和 telemetry 管理。 |
#Passion8 / 自定义网关清单
| 检查项 | 说明 |
|---|---|
| Base URL | Claude Code 使用 https://passion8.cc 这类根路径,不要写成 OpenAI 兼容的 /v1 地址。 |
| 认证变量 | Passion8 通常使用 ANTHROPIC_AUTH_TOKEN;不要和旧的 ANTHROPIC_API_KEY 登录状态混在一起排查。 |
| 私网入口 | 官方 apps gateway 登录页、OIDC callback、admin health route 都应在受控网络内可达。 |
| 反向代理 | 关闭 SSE buffering,保留长连接,设置合理 idle timeout。 |
| 字段透传 | headers、system array、tools、cache_control、usage 和 error body 都要原样保留。 |
| 安全审计 | 可以记录 request id、用户、模型、token 和策略命中,默认不要记录完整 prompt/body。 |
#curl 自检
先确认环境变量:
export ANTHROPIC_BASE_URL="https://passion8.cc"
export ANTHROPIC_AUTH_TOKEN="sk-..."
export ANTHROPIC_MODEL="claude-sonnet-4"Messages JSON:
curl -sS "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "'"$ANTHROPIC_MODEL"'",
"max_tokens": 64,
"messages": [
{ "role": "user", "content": "只回答 ok" }
]
}'SSE stream:
curl -N "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "'"$ANTHROPIC_MODEL"'",
"max_tokens": 64,
"stream": true,
"messages": [
{ "role": "user", "content": "stream ok" }
]
}'模型发现,按客户端约束用 3s 自检:
curl -sS --max-time 3 "$ANTHROPIC_BASE_URL/v1/models?limit=1000" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01"可选 token count:
curl -sS "$ANTHROPIC_BASE_URL/v1/messages/count_tokens" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "'"$ANTHROPIC_MODEL"'",
"messages": [
{ "role": "user", "content": "count tokens" }
]
}'自检结果应满足:
| 项目 | 通过标准 |
|---|---|
/v1/messages | 返回 Anthropic Messages JSON,不是 HTML、登录页或代理错误页。 |
| SSE | curl -N 能持续看到 event/data 行,首包不被缓冲。 |
/v1/models?limit=1000 | 3s 内返回模型 JSON 或明确的 401/403 JSON。 |
count_tokens | 支持时返回 token count;不支持时返回明确错误,不要伪造空结果。 |
| Spend limit | 超限时返回稳定 JSON 错误,并能在 telemetry 中查到触发规则。 |
#官方参考
- Claude apps gateway deployment and operations
- Deploy Claude apps gateway on Google Cloud
- Run Claude Code through a gateway
#相关页面
Support / 支持
Need help? / 需要帮助?
接入、计费与模型异常可邮件联系;服务可用性以状态页为准。
For setup, billing, or model issues, email us. Check the status page for uptime.
也可使用右下角微信 / QQ 客服 · WeChat / QQ support is available at the bottom right

