Compare commits

...
13 Commits
Author SHA1 Message Date
chaos b6fc113cdb perf: 多维度性能优化 (审计24项, 实施7项)
优化内容:
1. [HIGH] _maybe_trim_context 快速跳过: body<100KB 直接返回, 省去 json.loads+token估算
   - 99% 的小请求从 ~0.01ms 降到 0ms (零开销)
2. [HIGH] token估算用预编译正则替代逐字符扫描
   - 190K字符: 9.2ms → 6.0ms (35% faster)
3. [HIGH] 移除调试dump代码: >200KB请求同步写文件是热路径阻塞I/O
4. [HIGH] 提取公共函数: _dynamic_timeout() + _build_upstream_headers() + _upstream_request_with_retry()
   - proxy()和anthropic_messages()的401/429/504重试+超时+header逻辑去重 (-131行)
5. [MEDIUM] cache.get() 无锁快速路径: 先无锁检查token+expiry, 仅过期时加锁
6. [MEDIUM] SSE buffer用list+join替代字符串拼接: 5x faster, 避免O(n²)风险
7. [MEDIUM] 连接池扩大到96 (threads*1.5): 避免retry并发耗尽

基准测试: _maybe_trim_context(大请求) 110ms→71ms (36% faster)
功能测试: 全部通过
2026-07-22 15:35:57 +08:00
chaos 61bda8db75 feat: 添加 Anthropic /v1/messages 接口适配层
- anthropic_request_to_openai(): Anthropic 请求转 OpenAI 格式
  - system 提取到 messages 首条
  - content blocks 展开 (text/tool_use/tool_result)
  - tools 格式转换 (input_schema → parameters)
  - max_tokens/temperature/stop_sequences 等参数映射

- openai_response_to_anthropic(): OpenAI 响应转 Anthropic 格式
  - content 数组构建 (text/tool_use)
  - stop_reason 映射 (stop→end_turn, tool_calls→tool_use, length→max_tokens)
  - usage 字段映射 (input_tokens/output_tokens)

- openai_stream_to_anthropic_stream(): 流式 SSE 转换生成器
  - message_start/content_block_start/content_block_delta/content_block_stop
  - message_delta/message_stop 事件序列
  - 支持 text_delta 和 input_json_delta
  - 正确的 block index 分配

- /v1/messages 路由: 复用现有 token 获取/超时/重试逻辑
  - 非流式: 请求转换→上游转发→响应转换
  - 流式: 请求转换→上游流式转发→SSE 事件转换

测试通过: 非流式/流式文本、system prompt、tool_use、tool_result 多轮对话
2026-07-22 14:35:39 +08:00
chaos b98010591e feat: 添加自动上下文截断功能 (基于 LiteLLM trim_messages 方案)
- 新增 token 估算函数 (_estimate_tokens, _estimate_messages_tokens)
- 新增滑动窗口截断 (_trim_messages): 保留 system/tool 消息, 从最旧对话消息开始丢弃
- 新增单条消息中间截断 (_shorten_message_content): 保留头尾, 迭代逼近目标 token 数
- 新增 _maybe_trim_context: 集成到代理逻辑, 请求体超限时自动截断
- 截断目标: 上游 192K token 限制的 73.5% (~141K), 留出响应空间
- 测试验证: 202K token 请求自动截断至 125K, 上游返回 200
2026-07-22 10:26:35 +08:00
chaos dcf9b33fe9 feat: 添加 glm-5.2 模型到可用模型列表 2026-07-22 09:00:29 +08:00
chaos bdec3a6cb0 refactor(ai): 优化华为网关连接池配置与 Token 缓存查找逻辑 2026-07-08 17:24:31 +08:00
chaos af92152524 refactor(ai): 重构华为网关并修复长文本对话压缩逻辑 2026-07-08 17:14:07 +08:00
chaos 34eb36623c fix: auto_compact压缩后用摘要+用户问题重新请求模型,而非直接返回摘要 2026-07-08 17:00:42 +08:00
chaos 0ffbf20f6b fix: compact内部401刷新Token重试+清空黑名单防锁死 2026-07-08 16:51:33 +08:00
chaos 2b073f2e3f fix: content=None 导致 TypeError + /v1/models 本地返回 2026-07-08 16:27:35 +08:00
chaos 29d6fac6cc fix: 401 黑名单锁死 - 新Token也401时清空黑名单避免27分钟不可用 2026-07-08 15:50:57 +08:00
chaos 5899032aee fix: compact 504 超时修复
- 降低 auto_compact 阈值: 1.2MB → 350KB (426KB 请求也会导致上游 504)
- 预截断: compact 前每条消息限制 500 字, 大幅减少 token 数
- 降低批次大小: 800KB → 350KB 每批
- 429 限流自动重试: 最多 2 次, 递增等待 (5s, 10s)
- 504 超时自动重试: 1 次, 降级为 auto_compact
- compact 内部 429/504 重试: 最多 3 次
- 全局请求日志: before_request 捕获所有请求
2026-07-08 15:12:29 +08:00
chaos 368ffbe66c fix: 透明分批压缩 - /v1路由 + 超限自动compact无需客户端感知
关键改动:
1. /v1/<path> 路由: 与 /v2 相同代理逻辑,兼容标准OpenAI客户端
2. auto_compact(): chat/completions超限时自动分批压缩,返回标准OpenAI格式
   - 客户端完全无感知,不需要调用特殊端点
   - 支持stream=true(SSE)和stream=false
   - X-Auto-Compact响应头标识自动压缩发生
3. 非chat/completions超限仍返回413清晰错误
4. 修复compact SSE与Waitress的direct_passthrough兼容问题
2026-07-08 14:21:38 +08:00
chaos 85ea33eb4e fix: 解决 compact 命令断连问题 - 请求体超限413清晰错误 + /v2/compact分批压缩端点
根因: APIG请求体限制~1.25MB, 超限后JSON截断导致'model id缺失'400错误→客户端断连

修复:
1. 请求体超限校验: 返回413 + content_too_large清晰错误(而非上游的'model id缺失')
2. /v2/compact端点: 超长对话自动分批发送压缩,每批<800KB,最后合并总结
3. 动态超时: 根据请求体大小自动调整(60s→180s→300s)
4. 修复响应头转发: 剥离Content-Encoding避免客户端解压失败
5. 禁用flask-compress(与Waitress SSE兼容问题)
2026-07-08 14:06:21 +08:00
3 changed files with 970 additions and 99 deletions

No files matched your search

+1
View File
@@ -0,0 +1 @@
__pycache__/
+30
View File
@@ -0,0 +1,30 @@
# 2026-07-08 工作日志
## huawei_gateway.py 代码评审
- 用户要求审查 `C:\Developer\workspace\script\ai\huawei_gateway.py`(华为云 Token 动态网关),评估方法合理性、优化空间、长文本对话解决方案。
- 配套的 `hwaishell.sh` 内嵌了一个旧版网关(无 compact 逻辑),独立 py 文件是新版(含 auto_compact / compact_endpoint)。
- 核心结论:
- 设计合理处:Token 多级 fallback、指纹黑名单、RLock、连接池、SSE direct_passthrough、动态超时。
- P0 安全问题:内存扫描窃取他进程凭证;/set_token 无鉴权;token 明文落盘且无 0600 权限。
- 架构问题:auto_compact 与 compact_endpoint ~200 行重复;if False 死代码;私有属性被外部直接访问;compact 同步阻塞 worker 易并发塌方。
- **长文本对话最致命缺陷**:auto_compact 把压缩摘要当最终回答返回客户端,用户问问题却收到对话总结。正确做法应是"摘要替换早期历史 + 保留近期 N 轮 + 用户最新问题 → 重新请求模型拿真正回答"。
- 已用 show_widget 输出两张图:当前架构问题标注、长文本流程对比(当前错误 vs 推荐正确)。
- 未改代码,仅给分析 + 重构方案,待用户确认是否要落地重构。
## huawei_gateway.py 最佳修复方案落地
- 用户要求"给我最佳的修复方案",已实施完整重构(原文件备份为 huawei_gateway.py.bak)。
- 落地的修复(语法已通过 py_compile 验证):
1. **长文本对话核心修复**:新增 `compact_and_answer()`,用"摘要替换+继续对话"滑动窗口替代旧 auto_compact。压缩早期历史 → 重组 [system+摘要+近期N轮+用户问题] → 重新请求模型 → 透传真正回答给客户端(流式/非流式都正确处理)。旧逻辑把摘要当回答返回导致对话断裂的缺陷已消除。
2. **消除重复代码**:auto_compact 与 compact_endpoint ~200 行重复逻辑合并为 `compact_and_answer` + `compress_history`,两个端点共用。
3. **统一重试 `_request_with_retry`**:401(黑名单刷新)/429(退避)/504(退避) 逻辑统一,proxy 与 compact 共用,返回 (resp, final_token)。
4. **摘要缓存**:`_summary_cache` 按早期消息内容 hash 缓存,TTL 10min,GC 线程定期清理。相同对话历史不重复压缩。
5. **compact 并发限流**:`_compact_semaphore = Semaphore(4)`,防止 32 worker 全被 compact 占满塌方;超限返回 503 compact_busy。
6. **TokenCache 公开方法**:新增 `expires_in()`/`blacklist_size()`/`clear_blacklist()`/`fingerprint()`,不再外部访问 `_expires_at`/`_blacklist` 私有属性;`clear_blacklist` 加锁解决竞态。
7. **内存扫描优化**:`scan_pid_mem` 函数级 open /proc/pid/mem 一次(避免每段重复 open);重叠窗口 SCAN_OVERLAP=128 防 token 跨 chunk 边界漏匹配;`find_token_in_memory` 命中即停 + cancel 其余 future。
8. **/set_token 鉴权**:新增 `GATEWAY_ADMIN_KEY` 环境变量校验(X-Admin-Key header),为空则跳过但日志警告;持久化文件 `os.chmod(0o600)`。
9. **清理死代码**:删除 `if False and _compress_available` 分支;删除未使用的 gzip import。
10. **token 估算改进**:新增 `_estimate_tokens()`(中文1.5字/token、英文4字/token),替代不准确的 body_size//4。
11. **路由注释**:v1→v2 上游映射行为显式注释。
- 配套部署脚本 `hwaishell.sh` 内嵌的是旧版网关,尚未同步更新(若要部署新版需手动替换或后续同步)。
- 配置项:KEEP_RECENT_MSGS=6, SAFE_BATCH_BYTES=350KB, SUMMARY_CACHE_TTL=600s, COMPACT_CONCURRENCY=4。
+939 -99
View File
File diff suppressed because it is too large. Load diff