fawney19 1c2a8119c0 feat: delegate 客户端替换为 hyper 原生实现,新增代理管理功能
aether-proxy:
- 用 hyper-util Client + 自定义 InstrumentedConnector 替换 reqwest delegate 客户端
- 支持 HTTP/HTTPS 自动 TLS,ALPN h2 协商,connect/tls 分阶段计时
- ConnectTiming 通过 hyper extensions 传递,上游响应细分 connect_ms/tls_ms/ttfb_ms
- upgrade 命令在非 root 下跳过 systemd restart 并提示手动操作

后端:
- 新增 /admin/proxy-nodes/test-url 接口,支持直接测试代理 URL 连通性
- 新增 /admin/proxy-nodes/hmac-key 接口,获取 HMAC Key 供部署使用
- 提取 _test_proxy_connectivity 公共函数,消除 test_node 中的重复代码
- candidate_resolver 在 extra_data 中输出 needs_conversion/provider_api_format
- stats_aggregator 小时聚合增加 IntegrityError 冲突重试

前端:
- 请求时间线组件展示代理 timing 细分(DNS/连接/TLS/TTFB/上游处理)
- 请求时间线增加格式转换分界标记和 conversion badge
- ProxyNodes 页面新增代理 URL 测试和 HMAC Key 复制功能
- HardwareTooltip 从 Popover 改为 Tooltip 组件
2026-02-11 23:24:59 +08:00
2025-12-10 20:52:44 +08:00
2025-12-10 20:52:44 +08:00
2025-12-19 17:31:15 +08:00

Aether Logo

Aether

开源 AI API 网关
支持 Claude / OpenAI / Gemini 及其 CLI 客户端的统一接入层

简介部署环境变量Q&A


简介

Aether 是一个自托管的 AI API 网关,为团队和个人提供多租户管理、智能负载均衡、成本配额控制和健康监控能力。通过统一的 API 入口,可以无缝对接 Claude、OpenAI、Gemini 等主流 AI 服务及其 CLI 工具。

页面预览

首页 仪表盘
首页 仪表盘
健康监控 用户管理
健康监控 用户管理
提供商管理 使用记录
提供商管理 使用记录
模型详情 关联提供商
模型详情 关联提供商
链路追踪 系统设置
链路追踪 系统设置

部署

Docker Compose推荐预构建镜像

# 1. 克隆代码
git clone https://github.com/fawney19/Aether.git
cd Aether

# 2. 配置环境变量
cp .env.example .env
python generate_keys.py  # 生成密钥, 并将生成的密钥填入 .env

# 3. 部署 / 更新(自动执行数据库迁移)
docker compose pull && docker compose up -d

# 4. 升级前备份
docker compose exec postgres pg_dump -U postgres aether | gzip > backup_$(date +%Y%m%d_%H%M%S).sql.gz

Docker Compose本地构建镜像

# 1. 克隆代码
git clone https://github.com/fawney19/Aether.git
cd Aether

# 2. 配置环境变量
cp .env.example .env
python generate_keys.py  # 生成密钥, 并将生成的密钥填入 .env

# 3. 部署 / 更新(自动构建、启动、迁移)
./deploy.sh

本地开发

# 启动依赖
docker compose -f docker-compose.build.yml up -d postgres redis

# 后端
uv sync
./dev.sh

# 前端
cd frontend && npm install && npm run dev

环境变量

必需配置

变量 说明
DB_PASSWORD PostgreSQL 数据库密码
REDIS_PASSWORD Redis 密码
JWT_SECRET_KEY JWT 签名密钥(使用 generate_keys.py 生成)
ENCRYPTION_KEY API Key 加密密钥(更换后需重新配置 Provider Key
ADMIN_EMAIL 初始管理员邮箱
ADMIN_USERNAME 初始管理员用户名
ADMIN_PASSWORD 初始管理员密码

可选配置

变量 默认值 说明
APP_PORT 8084 应用端口
API_KEY_PREFIX sk API Key 前缀
LOG_LEVEL INFO 日志级别 (DEBUG/INFO/WARNING/ERROR)
GUNICORN_WORKERS 4 Gunicorn 工作进程数
DB_PORT 5432 PostgreSQL 端口
REDIS_PORT 6379 Redis 端口

Q&A

Q: 如何开启/关闭请求体记录?

管理员在 系统设置 中配置日志记录的详细程度:

级别 记录内容
Base 基本请求信息
Headers Base + 请求头
Full Headers + 请求体

Q: 管理员如何给模型配置 1M上下文 / 1H缓存 能力支持?

  1. 模型管理: 给模型设置 1M上下文 / 1H缓存 的能力支持, 并配置好价格
  2. 提供商管理: 给端点添加支持该能力的密钥, 并勾选对应的能力标签

Q: 用户如何使用 1H缓存?

  • 模型级别: 在模型管理中针对指定模型开启 1H缓存策略
  • 密钥级别: 在密钥管理中针对指定密钥使用 1H缓存策略

注意: 若对密钥设置强制 1H缓存, 则该密钥只能使用支持 1H缓存的模型, 匹配提供商Key, 将会导致这个Key无法同时用于Claude Code、Codex、GeminiCLI, 因为更推荐使用模型开启1H缓存.

Q: 如何配置负载均衡?

在管理后台 提供商管理 中切换调度模式:

模式 说明 适用场景
提供商优先 按 Provider 优先级排序, 同优先级内按 Key 优先级排序, 相同优先级哈希分散 优先使用特定供应商
全局 Key 优先 忽略 Provider 层级, 所有 Key 按全局优先级统一排序, 相同优先级哈希分散 跨 Provider 统一调度, 最大化利用所有 Key

Q: 更新出问题如何回滚?

有备份的情况(推荐):

# 1. 停止应用
docker compose stop app

# 2. 恢复数据库(先清空再导入)
docker compose exec -T postgres psql -U postgres -c "DROP DATABASE aether; CREATE DATABASE aether;"
gunzip < backup_xxx.sql.gz | docker compose exec -T postgres psql -U postgres -d aether

# 3. 拉取旧版本镜像并重启
#    方式一:使用具体版本 tag如果有发布版本号
#    将 docker-compose.yml 中 image 从 ghcr.io/fawney19/aether:latest 改为指定版本
#    方式二:使用之前记录的镜像 digest
#    将 image 改为 ghcr.io/fawney19/aether@sha256:xxxxx
docker compose up -d app

可以在升级前通过 docker inspect ghcr.io/fawney19/aether:latest --format '{{index .RepoDigests 0}}' 记录当前镜像 digest方便回滚时使用。

没有备份的情况:

# 1. 用当前容器回退数据库迁移(回退 1 步,按需调整数字)
docker compose exec app alembic downgrade -1

# 2. 查看回退后的版本确认正确
docker compose exec app alembic current

# 3. 切回旧镜像并重启(同上方式修改 docker-compose.yml 中的 image
docker compose up -d app

注意:没有备份的回滚依赖 alembic downgrade如果迁移涉及不可逆的数据变更如删除列可能无法完全恢复数据。因此强烈建议升级前备份。


许可证

本项目采用 Aether 非商业开源许可证。允许个人学习、教育研究、非盈利组织及企业内部非盈利性质的使用;禁止用于盈利目的。商业使用请联系获取商业许可。

联系作者

QQ二维码      QQ群二维码

Star History

Star History Chart

Description
No description provided
Readme 168 MiB
Languages
Python 68.3%
Vue 21.7%
TypeScript 7.3%
Rust 2%
CSS 0.3%
Other 0.2%