【开源】Astra Gate:请求发出前在本机拦截密钥、邮箱、内网地址的 AI 网关,支持 11 个客户端一键接管
前言
这一年 AI 编程工具越用越多:Codex、Claude Code、Gemini CLI、OpenCode……每个工具都有自己的配置文件和 Key 管理方式,也只认自己的协议。于是我反复遇到这几件事:
- 换一个服务商,就要把
~/.codex/config.toml、~/.claude/settings.json挨个改一遍; - 手里有 DeepSeek / Kimi / GLM 的 Key,但 Claude Code 只认 Anthropic 协议,Codex 默认走 OpenAI Responses 协议;
- 月底账单出来,说不清钱花在哪个工具、哪个模型上;
- 把日志、配置文件丢给模型排查问题时,顺手把数据库连接串和 API Key 也发了出去。
所以我用 .NET 10 写了 Astra Gate:一个跑在本机 127.0.0.1 上的 AI 网关。它夹在客户端和服务商中间,协议转换、计费和隐私检查都在本机完成,数据不出本机。项目以 MIT 协议开源。
- GitHub:https://github.com/239573049/Astra-Gate
- 官网 / 文档:https://astra-gate.si/

它能做什么
| 能力 | 说明 |
|---|---|
| 协议互转 | OpenAI Chat、OpenAI Responses、Anthropic Messages、Gemini 四种协议任意互转,客户端和上游用不同协议也能对接 |
| 客户端接管 | Codex、Claude Code、Gemini CLI、OpenCode、Claude Desktop、Grok Build、Pi、Hermes Agent、MiniMax Code、Copilot CLI、VS Code Copilot,一键接管,随时原样还原 |
| 服务商模板 | 20+ 模板:OpenAI / Anthropic / Gemini / xAI / DeepSeek / Kimi / GLM / Qwen / MiniMax / 火山方舟 / OpenRouter / 硅基流动 / Ollama / LM Studio,也支持任意兼容接口 |
| 用量与计费 | 每条请求的输入、输出、缓存读写、推理 Token 和费用逐条记录,按客户端、模型、时间汇总 |
| 隐私护栏 | 请求发出前检测密钥、私钥、JWT、邮箱、手机号、内网地址、连接串等,可选择警告、拦截或脱敏 |
| 多种入口 | CLI(astra)、Web 控制台(中英双语)、桌面端(托盘常驻),支持 macOS / Windows / Linux 的 x64 和 arm64 |
三步上手
# 1. 安装(需要 Node.js >= 18,会按平台自动下载服务端二进制,不需要装 .NET 运行时)
npm install -g @aidotnet/astra-gate
# 2. 后台启动并打开控制台(默认 127.0.0.1:17321)
astra start --open
# 3. 接管客户端(也可以在控制台「客户端」页一键启用)
astra client enable codex
不想装 Node 的话,可以从下载页下载桌面安装包(dmg / exe / AppImage),服务端已经内置。

设计拆解
下面挑几处我认为值得说的设计。
1. 协议转换:统一中间表示,不做两两互译
四种协议如果两两互译,需要 4×3 = 12 个转换器,每加一种协议,工作量就成倍增加。Astra 的做法是让所有协议都先解码成一份统一中间表示(IR),再从 IR 编码成目标协议:
客户端请求 JSON ──DecodeRequest──▶ UnifiedRequest ──EncodeRequest──▶ 上游请求 JSON
上游 JSON / SSE ──IResponseDecoder──▶ UnifiedStreamEvent* ──IResponseEncoder──▶ 客户端 JSON / SSE
每种协议只实现一个 IProtocolCodec,集中注册在一处。几个细节:
- 非流式响应也走事件流:先转成同一套
UnifiedStreamEvent,再由编码器聚合,所以流式和非流式只需要写一套逻辑; - 同协议直通:客户端和上游协议一致时请求原样转发,但解码器仍会并行运行,用来统计 usage、首 Token 时间和结束原因;
- 有损映射写进文档:比如 Anthropic 的 thinking 签名、Responses 的加密推理内容,只对产生它的协议有效,换成别的协议时会丢弃签名、保留文本。这类取舍都写在
Ir.cs的注释里,并有黄金样例测试覆盖。
内容块用 C# 的 record 建模,一目了然:
public abstract record ContentPart;
public sealed record TextPart(string Text) : ContentPart;
public sealed record ToolCallPart(string Id, string Name, string ArgumentsJson) : ContentPart;
public sealed record ToolResultPart(string CallId, string? Name,
IReadOnlyList<ContentPart> Content, bool IsError = false) : ContentPart;
public sealed record ReasoningPart(string? Text, string? Signature = null,
string? EncryptedContent = null, ApiProtocol? Origin = null, string? Id = null) : ContentPart;
有了这层 IR,Claude Code 也可以直接用 DeepSeek、Kimi、GLM,Codex 也可以接 Anthropic 协议的上游。
2. 客户端接管:改别人的配置文件,必须能完整还原
接管客户端,本质上就是改用户的 ~/.codex、~/.claude 等配置文件。这件事出错的代价很高,所以定了几条规则:
- 按配置项记录原值:只记录被改动的那几个 keyPath 的原始值,不整份覆盖文件;
- 备份分两层:第一次修改前的备份永久保留,之后再保留最近 20 份滚动备份;
- 还原时检测漂移:如果用户在接管后又手动改过某个值,还原时会跳过它,不覆盖用户自己的改动;
- 提供离线兜底:
astra-server restore-all是离线子命令,服务起不来也能把配置全部还原;astra uninstall会先还原,再停止服务。
单元测试全部使用伪造的 HOME 目录,不会碰开发者本机的真实配置。
3. 计费:金额用整数存,价格分三级
- 金额以纳美元整数(1 美元 = 1e9)存进 SQLite,从根上避免浮点误差;单价以十进制字符串保存在价格 JSON 里;
- 价格分三级:提供商自定义价 > 提供商价格表 × 倍率 > 官方默认价。倍率是给中转站准备的,比如按官方价 ×1.1 计费;
- 模型目录可以从 models.dev 同步价格,手动改过的字段不会被覆盖;控制台还有计费模拟器,方便核对配置。

4. 隐私护栏:原值不入库,脱敏后自动还原
隐私检查在请求离开本机之前执行,支持三种动作:
- 仅警告:放行请求,但记录命中;
- 拦截:直接拒绝请求,不发给上游;
- 脱敏:把原值替换成
[EMAIL_1]这样的占位符再发给上游,响应回来时自动换回原值,客户端感觉不到。
原值只保存在本次请求的内存里,日志中只有遮罩后的片段(如 john••••om)。除了内置类别,还可以写自定义正则,并在「试用检测」里先验证效果。建议先开「只检测不处理」观察几天,再逐步收紧规则。

5. 本地服务也要考虑安全
只监听回环地址,不等于就安全了:
- 防 DNS 重绑定:校验 Host 是否在回环地址白名单内,防止恶意网页借 DNS 重绑定访问本机接口;
- 修改类接口要求自定义请求头:所有修改类的
/api调用都必须带X-Astra-Admin: 1,跨站表单无法伪造; - 监听非回环地址时启用会话登录;
- 密钥加密存储:服务商 Key 和本地客户端密钥都用 ASP.NET Core DataProtection 加密,接口只返回掩码,日志里不出现明文。
6. 分发:一个单文件,npm 和桌面端共用
- 服务端以单文件自包含方式发布(开启 ReadyToRun),每个平台、每种架构单独打成 npm 包(
@aidotnet/server-*)。CLI 通过optionalDependencies只安装当前平台需要的那个,用户机器上不需要 .NET 运行时; - 控制台(React + Vite)的构建产物由服务端直接托管,打开浏览器就能用;桌面端(Electron)复用同一份前端;
- 自动更新的流程是「下载到暂存区 → sha256 校验 → 切换 → 重启」,失败会自动回滚,并且永远不会原地替换正在运行的二进制。
技术栈
| 部分 | 技术 |
|---|---|
| 服务端 | .NET 10 / ASP.NET Core、SQLite(WAL)+ Dapper |
| 网关 | 自研协议编解码 + SSE 流式管道 |
| 控制台 | React + Vite + Tailwind,中英双语 |
| CLI | Node / TypeScript |
| 桌面端 | Electron |
最后
项目刚公开发布(v0.2.2),肯定还有不少粗糙的地方。已知限制:Windows / Linux 安装包暂时不支持应用内自动更新;Windows 安装程序还没签名,首次运行可能弹出 SmartScreen 提示。
如果你也在多个 AI 编程工具之间来回切换,欢迎试用。也欢迎在评论区或 GitHub 提 Issue 和 PR,告诉我你想接管的客户端或想加的服务商模板。觉得有用的话,点个 Star 支持一下,谢谢!
- GitHub:https://github.com/239573049/Astra-Gate
- 官网 / 文档:https://astra-gate.si/
浙公网安备 33010602011771号