Commit Graph

854 Commits

Author SHA1 Message Date
fawney19
943ca79951 chore(aether-proxy): bump version to 0.1.4 proxy-v0.1.4 2026-02-11 17:29:37 +08:00
fawney19
62c05093a0 fix(docker): 统一 max-requests 默认值为 4000
PR #171 中 max-requests 的 fallback 默认值 (2000) 与 jitter 计算的默认值 (4000) 不一致,统一为 4000
2026-02-11 17:26:22 +08:00
fawney19
d71d4e24be Merge pull request #171 from AAEE86/dev
refactor(docker): 优化 Gunicorn 配置并提升代码可读性
2026-02-11 17:21:19 +08:00
fawney19
37e0785775 fix(frontend): HardwareTooltip 组件健壮性重构
- hardware_info 支持 string/object/null 类型的安全解析
- 用 computed 统一提取展示行,无硬件信息时显示提示文案
- 增加 button 的 title/aria-label 属性
2026-02-11 17:17:53 +08:00
fawney19
0ddeccf698 feat(aether-proxy): delegate gzip body 流式透传替代读取解压
- gzip 压缩请求体直接流式转发给上游,避免全量读取和解压
- 非 gzip 请求保持原有读取逻辑
- 移除 body_read_ms/decompress_ms 指标,新增 passthrough 标记
- 前端 timing 展示兼容旧版字段
- 同步更新 Cargo.lock
2026-02-11 17:17:45 +08:00
AAEE86
875ecca527 refactor(docker): 优化 Gunicorn 配置并提升代码可读性
使 Gunicorn 的 max-requests 参数可通过环境变量 MAX_REQUESTS 配置,
并自动计算 max-requests-jitter (默认为 MAX_REQUESTS 的 1/20),
同时统一规范化 Dockerfile 中多行字符串的缩进格式
2026-02-11 17:14:32 +08:00
RWDai
3a5d687f08 fix: 配置导入导出版本号统一常量管理,移除前端硬编码版本校验 2026-02-11 17:06:06 +08:00
fawney19
257077a59b chore: bump aether-proxy version to 0.1.3 v0.5.10 proxy-v0.1.3 2026-02-11 16:39:07 +08:00
fawney19
9647d95759 feat: delegate 协议改为 header 元数据 + gzip 压缩 body 直传
- delegate wire format 从 JSON body 改为 HTTP headers 传递元数据
  (X-Delegate-Method/Url/Headers),上游请求体 gzip 压缩后直传,
  减少跨国代理传输耗时
- Rust 侧新增 gzip 解压(含 decompression bomb 防护 50MB 上限)
- 升级模块从 GitHub API asset 下载改为公开 release URL 直链,
  GITHUB_TOKEN 变为可选
- 前端适配新 timing 字段,展示压缩率与 wire_size/body_size
- CI release notes 改用 generate_release_notes 自动生成
2026-02-11 16:34:18 +08:00
fawney19
2436ce45a2 chore: bump aether-proxy version to 0.1.2 proxy-v0.1.2 v0.5.9 2026-02-11 15:35:28 +08:00
fawney19
2a2a4b817e feat: 代理 timing 细分指标与前端展示优化
- aether-proxy 新增 auth_ms/body_read_ms/body_parse_ms/body_size 计时字段
- 链路追踪面板代理耗时改为分阶段展示,密钥和代理信息改为堆叠布局
- 硬件信息从 Tooltip 改为 Popover,新增 FD Limit 展示
- 新增区域代码格式化工具函数,统一显示区域中文名称
2026-02-11 15:33:01 +08:00
fawney19
d51234f202 fix(frontend): 链路追踪打开时自动选中进行中的尝试而非最后一个未执行的 2026-02-11 13:35:02 +08:00
fawney19
7abe7f1a87 chore: 更新 README 链接与清理 generate_keys 冗余输出
- 修正 aether-proxy README 中 Releases 为完整 URL,优化描述文案
- 移除 generate_keys.py 中不再需要的 hmac_key 配置提示
2026-02-11 13:24:28 +08:00
fawney19
2849a9bce5 fix(frontend): 密钥列表分页控件固定在底部 2026-02-11 12:57:52 +08:00
fawney19
2aee8b8c2c Merge pull request #169 from AAEE86/master
feat: 调度器根据上游配额自动跳过已耗尽的 Key (Kiro/Codex/Antigravity)
2026-02-11 12:55:52 +08:00
AAEE86
e77c28b89b feat: 调度器根据上游配额自动跳过已耗尽的 Key (Kiro/Codex/Antigravity)
在 _check_key_availability 末尾增加 _is_key_quota_exhausted 检查,读取 ProviderAPIKey.upstream_metadata 中各 Provider 的配额信息,配额耗尽时跳过该 Key 并返回可读的跳过原因。同时修正同函数内 logger 调用为 loguru {} 占位符风格。
2026-02-11 12:53:40 +08:00
fawney19
ed3f208dda feat(aether-proxy): 网络层全面优化与代理耗时追踪
aether-proxy:
- 新增 20+ 可配置参数:Aether API/delegate/CONNECT 各阶段超时、连接池、TCP keepalive/nodelay
- AetherClient 支持指数退避重试(可配置次数/延迟)和 HTTP/2
- 新增 DNS 缓存(TTL + 容量限制)避免重复解析
- 新增并发连接数限制(Semaphore,默认基于硬件估算)
- CONNECT 隧道增加建连超时和升级超时
- TLS 增加握手超时、会话缓存(session ticket + memory cache)、ALPN 协商
- 新增 ProxyMetrics 收集请求计数和延迟,通过心跳上报
- delegate 响应注入 X-Proxy-Timing 头(dns_ms/upstream_ms/total_ms)

后端:
- StreamContext 和 handler 提取 X-Proxy-Timing 写入 proxy_info 追踪数据

前端:
- 请求时间线展示代理分阶段耗时(DNS/上游)
- Endpoint 添加按钮改为文字按钮样式
2026-02-11 11:30:29 +08:00
fawney19
68f5e7e502 fix(frontend): 链路追踪打开时自动选中有效状态的节点
修复 Provider 组状态提升逻辑,之前仅在 success 时更新组状态,
导致组内有 streaming/failed 等状态的 key 时组仍显示为 available,
自动选择逻辑无法识别有效节点。引入状态优先级机制正确提升组状态,
并扩大 fallback 有效状态范围,避免默认选中未执行的节点。
2026-02-11 10:06:59 +08:00
fawney19
11b0026995 feat: OAuth 重复账号失效时允许覆盖更新,优化前端分页与刷新体验
- OAuth 去重逻辑改为:已失效的重复账号自动覆盖更新而非拒绝,
  适用于单个导入、批量导入、Kiro 导入等所有入口
- 新增 _update_existing_oauth_key 函数统一处理覆盖更新逻辑
- useSmartPagination 新增 fixedHeight 属性防止翻页时容器高度跳动
- ProviderDetailDrawer OAuth 刷新后仅重载 keys 数据避免整表刷新
2026-02-11 10:01:28 +08:00
fawney19
5cfae4f8f0 Merge pull request #168 from AAEE86/master
refactor(frontend): 优化模型/提供商组件的数据刷新逻辑
2026-02-11 09:20:35 +08:00
fawney19
bda03d187e refactor: 统一代理配置优先级链(key>provider>系统默认)并复用 HTTP 连接池
- 引入 resolve_proxy_param / build_proxy_client_kwargs 工具函数,统一
  httpx 客户端的代理+SSL+超时配置,替换各模块中零散的 get_ssl_context() 调用
- 所有涉及上游请求的模块(provider_query, usage replay, endpoint check,
  model fetch, OAuth, Vertex Auth, Gemini Files/Video 等)改用
  resolve_effective_proxy 按 key > provider > 系统默认优先级解析代理
- 流式请求改用 HTTPClientPool.get_upstream_client 复用连接池,移除各处
  http_client.aclose() 避免关闭共享客户端
- StreamProcessor._cleanup 不再关闭池中客户端,仅清理响应上下文
- 前端 EndpointFormDialog 增加 body_rules 帮助说明 Popover
- Mock handler 补充 OAuth 字段、endpoint extras 及新增 mock 路由
2026-02-11 03:16:53 +08:00
AAEE86
0fa15604dc refactor(frontend): 优化模型/提供商组件的数据刷新逻辑
- ModelDetailDrawer: 移除 handleMappingsUpdate 中冗余的 refreshRoutingData 调用,路由刷新改由 @refresh 事件统一处理
- ModelMappingsTab: saveMappings 成功后始终 emit update 和 refresh 事件,确保数据一致性
- BatchAssignModelsDialog: 为批量添加/导入操作增加 try-catch 错误处理,部分操作失败时仍通知父组件刷新
- ProviderDetailDrawer: 移除 modelsTabRef 直接调用子组件 reload 的模式,统一通过 emit('refresh') 由父组件协调刷新
2026-02-11 03:09:26 +08:00
fawney19
cd0acf1e6b fix: OAuth 账号去重改用 user_id 替代 account_id,避免同 team 成员误判重复 2026-02-11 01:13:01 +08:00
fawney19
9e183a2033 Merge pull request #167 from AAEE86/dev
feat: Codex/Kiro 配额自动刷新增加 5 分钟过期检查
2026-02-11 01:10:19 +08:00
AAEE86
76e8e48400 fix(frontend): 移除 Dashboard onMounted 中重复的 daily-stats 请求
TimeRangePicker 初始化时已通过 watch immediate 触发数据加载,
无需在 onMounted 中重复调用 loadDailyStats()
2026-02-11 01:03:09 +08:00
fawney19
3d6d4a48a5 feat: body_rules 支持 condition 条件触发
为每条 body_rule 新增可选 condition 字段,支持 eq/neq/gt/lt/gte/lte/
starts_with/ends_with/contains/matches/exists/not_exists/in/type_is
共 14 种操作符,规则仅在条件满足时执行。

后端: 新增 _evaluate_condition 条件评估器与 _validate_condition 校验逻辑
前端: EndpointFormDialog 增加条件编辑行(IF 面板)与 Filter 按钮切换
测试: 新增 TestConditionalBodyRules 覆盖全部操作符及链式触发场景
2026-02-11 00:50:08 +08:00
AAEE86
5d0240e675 fix(frontend): TimeRangePicker 防止重复触发 update:modelValue
- 添加 lastEmittedValue 记录上次 emit 的值
- 提取 buildEmitValue 构建 emit 数据
- 使用 getValueKey 比较核心字段,忽略 timezone 等动态值
- 外部设置值时同步更新 lastEmittedValue 避免回环触发
2026-02-11 00:37:15 +08:00
AAEE86
cabaa9f1df refactor(frontend): 统一 routing 数据加载,消除子组件重复请求
将 Model 和 Provider 详情抽屉中的 routing/mapping 数据加载逻辑
从各子组件(RoutingTab、ModelMappingsTab、ModelsTab、ModelMappingTab)
提升到父组件统一管理,通过 props 向下传递数据,避免多个子组件独立发起相同的 API 请求,提升页面加载性能。
2026-02-10 23:47:47 +08:00
AAEE86
347bd3345c feat: Codex/Kiro 配额自动刷新增加 5 分钟过期检查
- Codex: 新增 Token 即将过期检查 + 配额数据过期检查
- Kiro: 新增配额数据过期检查
- 三个 OAuth Provider 的自动刷新逻辑现在完全一致
2026-02-10 21:12:31 +08:00
fawney19
262bc6e1f7 feat: body_rules set 操作支持 {{$original}} 占位符引用原值
后端 request_builder 新增递归检测与解析逻辑,完全匹配时保留原始类型,
部分匹配时转为字符串拼接。前端 EndpointFormDialog 增加 sentinel 替换
机制,使含占位符的值能通过 JSON 校验,并在提交时还原为 {{$original}}。
2026-02-10 21:01:45 +08:00
fawney19
e06152b58b Merge pull request #166 from AAEE86/dev
fix: Claude SSE 流式输出补充 event 类型行
2026-02-10 18:56:21 +08:00
AAEE86
d8addec077 fix: Claude SSE 流式输出补充 event 类型行 2026-02-10 18:42:50 +08:00
fawney19
5456596b29 style: 优先级管理弹窗间距与样式微调 2026-02-10 18:32:51 +08:00
fawney19
8949ad6d9e feat: 动态 block 索引分配、OAuth 自动启停联动与 Antigravity 签名注入增强
- Gemini/OpenAI normalizer 改为按实际出现顺序延迟分配 thinking/text block 索引
- OAuth 失效标记时自动停用 Key,清除/刷新成功时自动启用
- Antigravity thought signature 注入支持 tool-specific 签名优先,再回退 session 级签名
- Claude normalizer 对非字符串 thinking block 降级为 UnknownBlock
- Gemini normalizer 反序列化时为 Antigravity 目标补充 signature
- signature_cache _prune 增加超限驱逐
- model/provider 包 __init__ 改为惰性导入避免循环依赖
- build_antigravity_url 复制 query_params 防止修改调用方原始字典
- upstream_fetcher build_all_format_configs 兼容非 EndpointFetchConfig 对象
- Antigravity HTTP 状态判定扩展与 Gemini endpoint check 支持 v1internal
- 新增 thought signature 注入与 signature cache 驱逐测试

Closes #165

Co-authored-by: AAEE86 <ppk0227@hotmail.com>
2026-02-10 17:53:04 +08:00
fawney19
0bb17a1502 chore: Docker 基础镜像从 Python 3.14 降级到 3.13 2026-02-10 17:41:36 +08:00
fawney19
0c52341dec feat: TTFB 追踪记录与前端展示 + 缓存调度器代码整理
- CLI handler 记录上游请求 TTFB 并注入 proxy_info
- 前端请求时间线展示 TTFB 耗时
- 调度器提升局部 import 到模块顶部,提取 _affinity_hash/_merge_restriction_sets 辅助方法
- 修复缓存亲和性写入的缩进层级
- Python 版本回退至 3.13
2026-02-10 17:37:53 +08:00
fawney19
4276e7835c refactor: 自适应 RPM 从边界记忆改为多次观察确认 + 置信度衰减
将自适应 RPM 限制算法从"单次 429 即设限"重构为基于置信度的学习机制:

- 收到 429 时仅记录观察(本地 RPM + 上游 header 限制值),不立即设限
- 有 header 的观察需 2 次一致确认,无 header 需 3 次一致确认
- confidence 随时间自然衰减,确保限制永远不会固化
- confidence 低于阈值时停止本地 RPM 限制,429 直接透传客户端
- 统一 get_effective_limit 入口,消除多处重复的限制获取逻辑
- Admin API 增加置信度、观察数量等诊断字段
2026-02-10 14:58:15 +08:00
fawney19
fc1ad44346 feat: Antigravity 上游模型按 tier 排序逐个获取与前端单 Key 查询
- 后端 Antigravity Provider 获取上游模型改为按 tier/可用性排序后逐个尝试,成功即停止
- 新增 Provider 级别缓存避免重复请求
- 前端编辑 Key 允许模型时改为传入当前 Key ID 查询对应可用模型
2026-02-10 11:24:22 +08:00
fawney19
91cf93d133 fix: Antigravity function_call/function_response 驼峰转换与 thinking budget 非正值过滤
Close #161
v0.5.8
2026-02-10 10:34:28 +08:00
fawney19
457de0919a Merge pull request #163 from AAEE86/master
fix: Antigravity 跨格式转换链 tool call ID 完整传递
2026-02-10 10:27:43 +08:00
AAEE86
d4fd3518bf fix: Antigravity Claude tool ID 匹配与 thinking budget 输出约束
- 重构 _inject_claude_tool_ids_request 采用两遍扫描算法:
  * 第一遍收集所有 functionCall 的 ID(按 name 分组)
  * 第二遍为 functionResponse 从对应队列中取出匹配的 ID
  * 解决多工具调用场景下 ID 匹配错乱问题

- 增强 _process_thinking_budget 确保 maxOutputTokens > thinkingBudget:
  * 新增 OUTPUT_OVERHEAD/OUTPUT_OVERHEAD_IMAGE 常量(对齐 AM)
  * 自动调整 maxOutputTokens 为 budget + overhead
  * 超过 MODEL_MAX_OUTPUT_LIMIT 时减少 budget 而非超限
2026-02-10 05:12:21 +08:00
fawney19
f9adf5938e feat: 请求记录 cURL 导出与回放功能
- 后端新增 /{usage_id}/curl 接口,重建完整 cURL 命令(含明文 API Key)
- 后端新增 /{usage_id}/replay 接口,支持向原始或指定提供商回放请求
- 回放支持 OAuth/Vertex AI/API Key 多种认证方式和跨格式请求体转换
- 前端新增 ReplayDialog 组件,支持选择目标提供商/Key 并查看响应
- RequestDetailDrawer 添加回放按钮和 cURL 复制按钮
- 调整 Tab 内容区布局,表头栏与内容区融为一体
2026-02-10 03:07:49 +08:00
AAEE86
5d36fd7f99 fix: Antigravity 跨格式转换链 tool call ID 完整传递
修复通过 Antigravity 适配器发送请求到 Claude 模型时 tool_use 块缺少必需 id 字段的问题。

根本原因:在跨格式转换链 (Gemini → Internal → Claude/Gemini) 中,
functionCall 和 functionResponse 的 id 字段没有被正确传递。

修复内容:
- internal.py: ToolResultBlock 增加 tool_name 字段,区分工具名称和 call id
- gemini.py: 读取/输出 functionCall 和 functionResponse 时保留 id 字段
- gemini.py: 流式响应中正确传递 tool_id
- envelope.py: 同时支持 camelCase/snake_case 两种命名风格
2026-02-10 02:50:45 +08:00
fawney19
9f5dd6f658 feat: 跨格式 thinking/reasoning 透传与 Antigravity 适配器增强
- 内部表示层新增 ThinkingBlock,统一 Claude thinking / Gemini thought / OpenAI reasoning_content
- Claude/Gemini/OpenAI/OpenAI CLI normalizer 全面支持 thinking 内容的解析、流式处理和跨格式转换
- schema_utils 重写为完整的 JSON Schema 清洗逻辑($ref 展开、allOf 合并、anyOf 折叠、白名单过滤)
- Antigravity envelope 新增模型别名映射、Google Search 注入、thoughtSignature 注入、图像生成配置解析

Close #161
2026-02-10 02:05:35 +08:00
fawney19
de40bd4705 fix: Claude API 模型列表查询兼容 Bearer Token 认证
第三方代理可能使用 Bearer Token 而非 x-api-key 认证,
在请求头中同时发送两种认证方式以提高兼容性。
2026-02-10 01:01:05 +08:00
AAEE86
6c5c41e8ea fix: 修复 Antigravity beta 参数和 Kiro 403 状态处理
- Antigravity: 移除 v1internal 请求中不支持的 beta 查询参数
- Kiro: 将 403 状态码统一视为账户异常,而非仅检测特定关键词
2026-02-10 00:54:43 +08:00
AAEE86
bd9c264375 fix: 修复 Antigravity 反代 systemInstruction oneof 冲突
当客户端发送 snake_case 格式的 system_instruction 字段时,
_inject_system_instruction 函数会额外设置 camelCase 格式的
systemInstruction,导致 Gemini API 报错 oneof 字段冲突。

现在在注入前先统一 snake_case 到 camelCase,确保只有一个字段存在
2026-02-10 00:09:14 +08:00
fawney19
1d625916ff refactor: 模块管理支持内置工具展示
将邮件配置、IP 安全、审计日志等系统功能从固定菜单移至模块管理页面,以内置工具形式统一展示
v0.5.7
2026-02-09 22:52:46 +08:00
fawney19
80d65ad2e4 fix: Claude CLI 模型列表使用正确的 Bearer 认证方式 2026-02-09 22:45:21 +08:00
fawney19
b11e9de6a7 feat: 全局模型新增活跃 Provider 数量统计
- 后端优化查询,使用条件聚合同时获取总 Provider 数和活跃数
- 前端展示格式改为「活跃数/总数」,便于了解可用 Provider 情况
2026-02-09 22:26:30 +08:00