Solidway v0.1.0 已以 AGPL-3.0 发布,源码与 Releases 在 GitHub 上。文档正在按发布版本重写:除「快速开始」与「参考」外,其余页面仍在描述计划中的行为。当前权威说明见仓库内的 docs/getting-started.md 与 docs/architecture.md。
保真转发
转发路径保留什么、改了什么,以及请求如何找到路由。
转发路径只做一件事:把字节从客户端搬到上游,再搬回来,不改它们。这一页把两边都写清楚——哪些原样保留, 以及那份很短的例外清单。
原样到达上游的内容
- 请求体 —— 逐字节保留(下面模型别名的例外除外)。
- 响应体 —— 逐字节保留(反向的模型别名例外除外)。
- 提示词前缀 —— 从不改写,所以上游的 prompt cache 仍然有效。
- 流式帧边界 —— 见流式。
两处必须说清的例外
1. 模型别名。 如果凭据把客户端模型名映射到不同的上游 id,网关会改写请求体的顶层 model,
并把客户端模型名写回响应的顶层 model。请求体其他地方不动;别名与上游 id 相同时,完全不碰请求体。
2. Header 的顺序与大小写不保留。 Header 按值转发,但 HTTP 层用 map 存储:顺序与原始大小写可能被规范化。 依赖原始 Header 字节做签名的上游,不在这条路径的支持范围内。
出站时增加或改变的内容
| 改变 | 原因 |
|---|---|
| 一个凭据 Header 或签名 | 向上游账号鉴权 |
Host |
请求是发给上游的,不是发给网关的 |
| 丢弃 hop-by-hop Header | HTTP/1.1 与 HTTP/2 的要求 |
| 路径替换为渲染后的端点 | 上游路径来自凭据的模板({model}、{action}、project/location 等) |
读取但不改写的内容
- API Key:用于解析路由。
- 模型名:用于别名映射与选号。
- 用量计数:用于记账。
为记账而读取不等于改写:转发出去的字节就是收到的字节。
请求如何找到路由
入站只有四个端点,各属于一个协议族:
| 端点 | 协议族 |
|---|---|
POST /v1/chat/completions |
OpenAI Chat Completions |
POST /v1/responses |
OpenAI Responses |
POST /v1/messages |
Anthropic Messages |
POST /v1/messages/count_tokens |
Anthropic Messages |
请求里的 API Key 解析出路由,路径决定协议族。其他路径返回 404;Key 缺失或未知返回 401,
路由被停用返回 403。网关不在协议族之间翻译——请求以什么方言进来,就以什么方言转发。