AIGC标识 【开源】Astra Gate:请求发出前在本机拦截密钥、邮箱、内网地址的 AI 网关,支持 11 个客户端一键接管

前言

这一年 AI 编程工具越用越多:Codex、Claude Code、Gemini CLI、OpenCode……每个工具都有自己的配置文件和 Key 管理方式,也只认自己的协议。于是我反复遇到这几件事:

  1. 换一个服务商,就要把 ~/.codex/config.toml、~/.claude/settings.json 挨个改一遍;
  2. 手里有 DeepSeek / Kimi / GLM 的 Key,但 Claude Code 只认 Anthropic 协议,Codex 默认走 OpenAI Responses 协议;
  3. 月底账单出来,说不清钱花在哪个工具、哪个模型上;
  4. 把日志、配置文件丢给模型排查问题时,顺手把数据库连接串和 API Key 也发了出去。

所以我用 .NET 10 写了 Astra Gate:一个跑在本机 127.0.0.1 上的 AI 网关。它夹在客户端和服务商中间,协议转换、计费和隐私检查都在本机完成,数据不出本机。项目以 MIT 协议开源。

概览

它能做什么

能力 说明
协议互转 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 同步价格,手动改过的字段不会被覆盖;控制台还有计费模拟器,方便核对配置。

请求详情:Token 构成与计费明细

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 支持一下,谢谢!

posted on 2026-10-08 10:09  239573049  阅读(9)  评论(0)    收藏  举报