架构总览
组件构成与协议转换设计
组件
┌────────────┐ ┌─────────────────────────────────────┐
│ astra CLI │──▶│ astra-server (.NET, self-contained) │
├────────────┤ │ ┌─────────┐ ┌────────┐ ┌───────┐ │
│ 桌面端 │──▶│ │ Gateway │─▶│ Privacy│─▶│ Billing│ │
│ (Electron) │ │ └─────────┘ └────────┘ └───────┘ │
├────────────┤ │ ┌──────────────────────────────┐ │
│ Web 控制台 │──▶│ │ Admin API + 静态资源 (web/dist)│ │
└────────────┘ │ └──────────────────────────────┘ │
└──────────────┬──────────────────────┘
▼
上游:Anthropic / OpenAI / DeepSeek / …- astra-server — 单文件自包含的 .NET 宿主,网关管道、Admin API 与控制台静态资源都在这一个进程里;
- CLI / 桌面端 — 两种管理入口,读写同一份
~/.astra; - Web 控制台 — Vite + React 构建产物,由服务端直接托管(浏览器打开即用)。
协议转换:hub-and-spoke
Astra 支持四种线协议:OpenAI Chat、OpenAI Responses、Anthropic Messages、Gemini。转换不是两两互译,而是全部先解码到统一中间表示(IR),再从 IR 编码为目标协议:
OpenAI Chat ─┐ ┌─ OpenAI Chat
OpenAI Responses ─┤→ IR → 编码 ─┤ OpenAI Responses
Anthropic ─┤ (统一中间表示) ├─ Anthropic
Gemini ─┘ └─ Gemini新增一种协议只需实现一个 codec,不必为 N×N 的组合写转换器。跨协议无法无损表达的字段在 IR 中有明确文档标注(如部分服务商特有的缓存写入计费粒度)。
数据流
- 客户端请求进入网关端点,按路径识别协议并解码为 IR;
- 解析有效模型(请求模型名 → 系统模型 → 提供商模型映射);
- 隐私护栏按规则处理(警告 / 拦截 / 脱敏 + 响应还原);
- 选择上游提供商与接口(协议一致直连,不一致按「上游协议优先级」转换);
- 发送上游,记录 usage;
- 按三级价格体系逐项计费,写入请求日志与统计。
技术栈
| 部分 | 技术 |
|---|---|
| 服务端 | .NET 10 / ASP.NET Core,SQLite (WAL) + Dapper |
| 网关 | 自研协议编解码 + SSE 流式管道 |
| 控制台 | Vite + React + Tailwind,双语(zh / en) |
| CLI | Node ≥ 18,按平台分发预编译服务端二进制 |
| 桌面端 | Electron 壳 |
Astra Gate