- v0.4.0 feature
看见每一个字节
- 每一次 Gateway 和 MCP 调用都持久化 request / response body
- 落盘前 PII 脱敏;按列 TTL 让「热 body」和「冷元数据」分别衰减
- S3 兼容的 Body 卸载 —— AWS S3、MinIO、Ceph 或内置 RustFS
- 基于布隆过滤器索引的跨行子串搜索
- audit:read_bodies 独立权限控制 Body 查看器
- MCP 下游 SSE —— 客户端可订阅 tools/call 事件时间线
- 按模型路由:Auto / Manual 两种模式 + 拖拽式流量分配条
- 模型级开关 —— 暂停单个模型而不影响整个 Provider
- Pre-call 预算检查直接拒绝已超额请求
- allowed_models 在 Anthropic Messages 与 OpenAI Responses 同样强制
全量请求 / 响应体审计#
ThinkWatch 把自己定位成 AI 流量的「堡垒机」—— 但每行审计只有元数据。Token 数、延迟、成本。用户实际问了什么、模型实际答了什么,没有记录。合规团队没法复盘事故、没法证明「PII X 被发送过」,甚至分不清两个几乎一模一样的请求。
v0.4.0 补齐这段。
gateway_logs新增request_body+response_body(外加字节数与body_capture_status维度);mcp_logs对应新增tool_arguments+tool_result。ZSTD(6) 压缩把冷存储成本压在可控区间;六个动态配置开关(逐字段开关 + 全局body_max_bytes)让运维不重启就能调整范围。缓存命中的响应现在也会写出完整审计行,不再有「黑洞」。按列 TTL + S3 卸载#
「热证据」和「冷元数据」的保留形状完全不同。按列 TTL 让你可以在同一张表里同时保留近 30 天的 body 和数年的 token / 成本行,不必为这种交叉支付 ClickHouse 的代价。
对于超过
body_max_bytes的载荷 —— 200k 上下文 prompt、读取整个文件的 MCP 工具、Base64 图片 —— body 会卸载到 S3 而不是被截断。后端通过六个环境变量配置(S3_ENDPOINT_URL、S3_BUCKET等),可对接 AWS S3、MinIO、Ceph,或 Docker Compose 中内置的 RustFS 容器。对象 key 带日期前缀(bodies/<table>/yyyy/mm/dd/...),便于配置 Bucket 生命周期规则独立老化。Body Viewer 端点透明解引用s3://单元格,控制台完全感知不到卸载存在。布隆过滤器子串搜索#
捕获的 body 列附带
tokenbf_v1(512, 3, 0)索引。审计员查询「哪些会话提到了 API key XYZ」或「哪些工具调用碰过 /etc/passwd」时,不再需要扫描每个 granule —— 布隆过滤器在前置阶段就排除了绝大多数行。索引大小约 50 KB / granule,第一次回答真实合规问题时就回本了。新增独立权限
audit:read_bodies控制 Body Viewer 与底层/api/admin/{gateway,mcp}/logs/{id}/body端点 —— 原始载荷作为「行为意图」的法律证据保留,但读取需要单独授权。MCP 下游流式响应#
tools/call在客户端侧此前只支持缓冲:哪怕上游已经发出 progress 通知,网关也会吞掉时间线,只返回一个 JSON。v0.4.0 基于Accept头协商 —— 包含text/event-stream的客户端会逐事件接收上游响应(notifications/progress、中间块、最终结果)作为独立 SSE 事件下发。仅 JSON 的客户端保留原缓冲形态,向后兼容。审计管线无论哪种姿态都拿到完整事件时间线。按模型路由#
模型路由配置围绕管理员真实的心智模型重新组织:Auto(latency-cost / balanced / latency-only)或 Manual(peer 间拖拽式流量分配条)。优先级 / 分层故障转移概念被移除;替换为 nginx 风格的扁平 peer 集 + 熔断器旁路。每个模型可以覆盖全局策略;仪表盘暴露
routing-projection,让 UI 在你提交前先告诉你「你的手动配置将花费 $X;自动则是 $Y」。三个新端点支撑 UI:
PATCH /api/admin/model-routes/batch-weights—— 拖拽条的提交端点GET /api/admin/models/{id}/routing-projection—— 当前 vs Auto 流量分配 + 预计 $/1M tokensGET /api/admin/models/{id}/route-history—— 60 桶 1 分钟 p50/p95,喂给延迟迷你折线图
决策日志为每个请求记录所选 Provider + 原因 + 任何回退;每行
gateway_logs标记真实的upstream_model,事故复盘不留歧义。Pre-call 预算强制#
预算上限此前只在 Post-flight 触发:月度配额已经为零的失控客户端仍能发出请求,只有事后扣账才会注意到 —— 而那时上游 token 已经被烧掉了。v0.4.0 增加
check_budget生命周期阶段,在上游调用之前运行。「你的配额已耗尽,停止发送」这类稳态场景现在直接被关在门外;既有的跨阈值告警继续覆盖并发突发的竞态。allowed_models 全表面强制#
每个 API 密钥的
allowed_models白名单现在在 OpenAI Chat Completions、Anthropic Messages、OpenAI Responses 上一致强制。同一套强制被接入共享生命周期管线,未来新增表面自动继承 —— 没有任何 API 表面可以绕过模型白名单。引擎内#
新的共享生命周期管线用统一的
Surfacetrait 把 AI 网关与 MCP 网关的请求路径合流。check_limits、check_access、check_budget、record_usage现在作为对称应用的阶段同时存在于两侧,消除了「缓冲、流式、短路」三条分支之间长期存在的漂移。MCP 的proxy.rs与 Gateway 的proxy.rs都被切分为子模块;前端 1667 行的 dashboard 组件也被拆解为更聚焦的子组件。 - v0.3.0 feature
MCP,按用户的方式
- 按用户的上游凭证——每位开发者以自己的身份连接 GitHub、Linear、Slack
- Dynamic Client Registration 一键 OAuth 接入
- MCP Store 双语模板市场(Linear OAuth 模板开箱预置)
- 分步注册向导 + 鉴权模式感知的编辑表单
- 三层上游身份解析(JWT + userinfo + discovery)
- /connections 页面提供逐凭证 Test Connection
- 按用户的工具目录——不同用户根据上游权限看到不同工具集
- MCP 响应缓存按 (user, account_label) 隔离——无跨用户串扰
- 安全评审加固 —— SSRF、缓存隔离、限流、审计
按用户的上游凭证#
MCP 网关不再假装所有用户都是同一个上游服务账号。每位开发者以自己的身份——通过 OAuth 或 PAT——连接 GitHub、Linear、Slack 以及任何启用了 MCP 的服务。上游审计轨迹终于端到端贯通:工单分配给真实的人、GitHub Issue 由实际提交者创建。逐密钥账号覆盖(per-key account override)让同一用户可同时维护多个身份(个人 + 工作 GitHub),并指定某个 API 密钥使用哪一个。
一键 OAuth 接入#
在注册向导中粘贴 MCP 服务器 URL,ThinkWatch 自动与上游 OAuth 服务器完成 Dynamic Client Registration,运行鉴权探测,在安装时收集 OAuth 客户端凭证,并引导你完成授权页面。匿名探测的 401/403 被正确识别为
auth_required(在目录卡片上显示琥珀色状态指示),而不是硬性失败——部分受保护的服务器也能干净地注册。MCP Store#
网关内置双语模板注册表。模板自带合理默认值、所需 OAuth scope,以及面向终端用户的说明。Linear OAuth 模板开箱预置,更多主流服务陆续加入。Display Label 让多次安装的模板区分清晰:个人 GitHub 安装与工作 GitHub 安装显示为独立卡片,而不是两个无法分辨的条目。
分步注册向导#
MCP 服务器注册重构为分步引导式向导,鉴权模式不同呈现不同界面。编辑表单拒绝保存与当前鉴权模式不匹配的字段;工具调用与安装错误以易懂的语言展示并给出可执行的下一步建议,而不是原始 JSON-RPC 错误码。
三层上游身份解析#
当上游 MCP 服务器使用 OAuth 时,ThinkWatch 通过三层策略解析上游用户身份:先解析 JWT,回落到 OAuth userinfo 端点,再回落到 issuer discovery。解析得到的 subject 作为缓存和审计的关键键值,让共用同一个 MCP 服务器的两位用户在下游严格分离。
逐凭证 Test Connection#
/connections页面为每个凭证提供 Test Connection 按钮。在正式提交前先验证你的 OAuth/PAT 是否真的能连上上游服务器;结果是结构化的(auth_ok / auth_required / unreachable / tool_call_ok),不再是单一红绿点——你能精确知道哪一步出了问题。安全加固#
经过一次内部安全评审,MCP 路径新增:探测 URL 的 SSRF 防护;响应缓存按
(user, account_label)隔离,OAuth/PAT 数据绝不跨用户泄露;每一跳网关都启用限流;工具调用边界发出结构化审计;管理员防误操作护栏(粘贴时验证静态 Token、阻止明显错误的凭证组合)。 - v0.2.0 feature
团队、消费管控与可编程 API
- 团队——按业务单元隔离密钥、预算与分析数据
- 限流与预算上限,fail-closed 强制执行,含消费告警
- RBAC v2——自定义角色、权限历史、一键导入/导出
- Token 迁移至 HttpOnly Cookie,XSS 无法再窃取会话
- 完整管理 API,含 OpenAPI 文档与 API 密钥认证
- WebSocket 驱动的实时看板
团队#
用户和 API 密钥现在可以组织到团队中。每个团队拥有独立的分析看板视图、独立的用户列表,以及分配 API 密钥时独立的作用域。结构化的作用域选择器让成员管理一目了然。
消费管控#
全新的限额引擎在每个层级强制执行限流与预算上限——按用户、按 API 密钥、按 Provider、按 MCP 服务器。限额直接内嵌在各编辑对话框的专属面板中,无需跳转到单独的配置页面。当预算耗尽时,网关采用 fail-closed 机制——无静默超支。可设置预算告警阈值,在达到硬性上限前提前预警。流式请求计费准确;支持输入输出 token 价格不对称的模型加权计费。
RBAC v2#
角色系统经过全面重构。内置角色与自定义角色统一到同一张表中。自定义角色可在 CodeMirror 编辑器中完整编辑,支持从现有角色克隆作为起点,并追踪完整的权限变更历史,清楚记录谁在什么时候做了什么修改。角色支持以 JSON 格式导出和导入,便于跨环境保持一致性。角色授权现在感知作用域——在团队层级授予的角色仅在该团队内生效。
安全加固#
访问令牌和刷新令牌已从
localStorage迁移到 HttpOnly Cookie,JavaScript 可见的会话面完全归零。XSS 攻击无法窃取 Token。刷新端点将每个令牌绑定到来源客户端 IP,被盗 Cookie 无法跨网络重放。WebSocket 看板连接现在使用一次性票据,而非长期有效凭证。管理 API#
网关现在开放了以 API 密钥认证的可编程管理接口。完整的 OpenAPI 规范与网关一同部署,可将密钥和用户的生命周期管理集成到自有工具链或 CI 流水线,无需打开控制台操作。
- v0.1.0 release
公开预览
- 多格式 AI API 网关(OpenAI、Anthropic、Gemini、Bedrock)
- MCP 网关,含命名空间隔离与工具级 RBAC
- ClickHouse 驱动的审计日志,支持多通道转发
- 首次运行初始化向导与内置配置指南
ThinkWatch 现已进入公开预览阶段。此次首个标记版本包含双端口架构(网关
:3000,控制台:3001)、虚拟 API 密钥生命周期管理、滑动窗口限流、熔断器,以及统一日志检索。Helm Chart 与 Distroless 容器镜像均已发布,同时支持 Docker Compose 自托管部署。