Files
script/ai/.workbuddy/memory/2026-07-08.md
T

3.6 KiB
Raw Blame History

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。