跳转至

能力清单

这张表回答三个问题:能做什么、不做什​么、边界在哪。每一行的配置键都能在仓库里找到对应实现,没有「规划中」的条目。

本页描述的是当前版本的实现状态。能力开关默认值见各行的「默认」列。

请求入口

能力状态默认配置位置边界
OpenAI 兼容 Chat Completions可用开model.services.chat(config/router/services.yml)支持流式与非流式
OpenAI 兼容 Embeddings可用开model.services.embedding—
Rerank可用开model.services.rerank—
语音合成 / 语音识别可用开model.services.tts / model.services.stt走 /v1/audio/*
Anthropic Messages 协议可用开由入口路径自动识别与 OpenAI 面并行,客户端各用各的协议
原生面透传(/v1/**)可用开—返回原生 JSON,不包 RouterResponse
控制台面(/api/**、/admin/**)可用开—返回统一 RouterResponse 包裹体

路由与容错

能力状态默认配置位置边界
多实例负载均衡可用开model.services.<type>.instances8 种策略:轮询 / 随机 / 最少连接 / 一致性哈希 / IP 哈希 / 延迟感知 / 会话粘滞
同名实例聚合成候选集可用开实例的 name请求里的 model 字段按实例名匹配;同名即「同一模型的多个副本」
熔断可用开model.circuit-breaker.*状态持久化在库里,重启不清;有半开恢复
失败重试可用开model.services.<type>.retry—
故障转移可用开model.fallback.*—
健康检查可用开model.health-check.*只探端口时可能「健康但不可用」,见下方「已知边界」

限流与配额

能力状态默认配置位置边界
全局限流可用开model.rate-limit三层限流里最外层
服务级限流可用开model.services.<type>.rate-limit—
实例级限流可用开model.services.<type>.instances[i].rate-limit不能用环境变量逐项覆盖(会让整个列表被替换,见 configuration/index.md)
API Key 配额可用开jairouter.quota.*支持日 / 周 / 月窗口与 token 维度
配额超限响应可用——返回 429 不是 401(客户端可据此区分「额度用完」与「认证失败」)

缓存

能力状态默认配置位置边界
响应缓存(精确)可用按配置jairouter.cache.response.*按租户维度隔离
响应缓存(语义近似)可用关jairouter.semantic-cache.*SimHash 近似复用;分 L2 租户内 / L3 公共池两层,L3 需过七条准入
流式响应缓存可用跟随响应缓存同上命中时按 SSE 帧回放
含 PII 的响应不缓存可用开—三个来源任一命中即跳过(请求替换数 / 响应还原数 / 独立探测器)

数据保护

能力状态默认配置位置边界
响应脱敏(单向)可用prod 开sanitization.response.*规则可配,脱敏后不回填
可逆脱敏(PII Vault)可用关jairouter.pii.reversible.*请求侧换占位符、响应侧还原;流式逐块还原,被切开的占位符那一段还原不到
字段级脱敏范围可用全文本jairouter.pii.reversible.json-paths支持 $.a.b 与 $.a[*].b;配错路径会回退全文本(不会漏脱敏)
脱敏访问审计可用开(随可逆脱敏)—只记元数据,不记原值
流式响应护栏可用关jairouter.guard.*正则命中可 REDACT 或 ABORT;不跨 chunk 拼接,敏感串被切开时检测不到
SSRF 防护可用开—出站地址校验,拒绝内网/保留地址

可观测性

能力状态默认配置位置边界
Prometheus 指标可用开management.endpoints.web.exposure.includeprod 只暴露 health,info,prometheus
调用历史可用开jairouter.monitoring.call-history.*有清理任务(02:00)
用量记录可用开jairouter.monitoring.token-usage.*有清理任务(默认 90 天,03:00)
审计日志可用开jairouter.security.audit.*事件类型走枚举,未知类型会被拒绝
链路追踪可用按配置jairouter.tracing.*支持 OTLP / Zipkin / 日志导出
容量类指标可用开—SSE 连接数、出站连接池在途、响应缓存条目数、事件循环延迟、WebSocket 会话数
控制台可用开—Vue 3;概览 / 路由 / 缓存 / 监控 / 配置页

部署与运维

能力状态默认配置位置边界
单 jar 启动可用——java -jar model-router.jar
Docker 镜像可用—Dockerfile / Dockerfile.optimized / Dockerfile.distroless / Dockerfile.jlink三个变体用 jarmode=tools 分层
Kubernetes可用—docs/*/deployment/kubernetes.md提供 Deployment / Service / ConfigMap 示例
数据库可用H2spring.datasource.*支持 H2 与 PostgreSQL;R2DBC 已在 v3.3.6 移除
多副本共享状态可用关jairouter.security.*.redis.enabled(三个开关)未开启且检测到多副本时启动期告警;语义缓存池仍为进程内(见已知边界)
配置热更新部分——配额 / 监控只改内存(重启回退);脱敏与熔断落库;实例配置落库但同步会删 YAML 中不存在的实例

本网关不做什么

不做为什么交给谁
模型推理网关是转发层,不做算力vLLM / Ollama / 云厂商 API
计费与结算计费涉及账单主体、税率、对账,是另一套系统自有计费平台
Prompt 管理与版本控制属于应用层职责,放进网关会让网关变成业务系统应用侧 / Prompt 平台
RAG 与向量库网关只转发 embedding 请求,不存向量向量数据库
训练与微调与网关职责无关训练平台
前端应用脚手架控制台是管理界面,不是终端用户产品业务应用

企业级能力:当前是否在开源版

这一节的作用是把现状摆清楚,供商业化划线时参考。

能力当前在开源版说明
多租户隔离(API Key 维度)是配额、缓存、审计都按 API Key 隔离
租户内二级隔离(user 字段)是语义缓存 L2 用;user 由客户端自报,只用于收窄不用于鉴权
审计留痕是安全审计 + 脱敏访问审计 + 跨租户缓存命中审计
合规脱敏(可逆)是PII Vault + 字段级策略
配额与限流是三层限流 + 多窗口配额
可观测性是Prometheus + 追踪 + 控制台
多副本共享状态是(需开开关)三个 Redis 开关;语义缓存池仍进程内
细粒度 RBAC是53 个权限码 + URL 规则
SSO / OIDC否当前只有用户名密码 + JWT
高可用部署编排否只提供 K8s 示例,不含运维编排
SLA 保障与技术支持否开源项目不承诺 SLA

结论很直接:除 SSO 与运维编排外,企业级能力目前都在开源版里。要让「商业化路径」有落点,需要在这里划一条线 —— 这是产品决策,不是技术决策。

已知边界

这些是实现上刻意接受的取舍,不是缺陷:

  1. 健康检查只探端口时不代表可用 —— check_type: socket_connect 只能证明端口开着;上游返回错误仍可能被判定为健康。
  2. 语义缓存 L2/L3 池是进程内的 —— 多副本时命中率按副本数摊薄,且没有信号说明原因(issue #1002)。
  3. 流式护栏不跨 chunk 拼接 —— 敏感串被切开在两个 chunk 之间时检测不到。
  4. 可逆脱敏在流式下逐块还原 —— 占位符被切开时那一段还原不到,客户端会看到占位符原文(真实值没有出境)。
  5. 流式路径没做 PII 探测 —— 非流式会跳过含 PII 的响应不写缓存,流式这条路径尚未覆盖。
  6. 配额热改不持久化 —— 控制台改了重启回到配置文件的值(只有 QuotaConfigController 把这一边界写进了接口:重启级字段返回 400 + RESTART_REQUIRED)。

相关文档