Skip to content

refactor: 按策略拆分上游请求准备与多协议非流式格式化 - #16

Merged
hawklithm merged 1 commit into
mainfrom
refactor/upstream-request-pipeline
Oct 22, 2026
Merged

hawklithm merged 1 commit into
mainfrom
refactor/upstream-request-pipeline

Conversation

@hawklithm

Copy link
Copy Markdown
Owner

目的

在不修改业务逻辑与对外协议契约的前提下,对代理的上游请求准备与非流式响应格式化进行职责分离。避免对高风险 SSE/DSML 状态机做大改,采用能够独立验证的渐进式重构。

依赖 PR #15 的 role_compat.py,故本 PR 暂以 fix/domestic-developer-role-compat 为基线,仅显示结构性改动;待 #15 合并后可将本 PR 的 base 改为 main。

设计模式及重构内容

  1. Builder + 组合策略(upstream_request.py)

    • ChatRequestPreparer 负责构建上游 URL、规范化请求、保留客户端 stream 选项、添加认证与 SSE Headers;
    • DomesticDeveloperRolePolicy 负责国内站 developer → system 兼容;
    • InternationalConversationHeaderPolicy 负责国际站会话标识 Headers;
    • 按原有顺序执行:tool_choice 规范化 → 网关角色适配 → 可选脱敏 → 上游流式参数 → Headers → 网关会话 Headers。
    • 保留原始 codebuddy.ai URL 匹配逻辑、异常降级与诊断事件,不趁重构修改网关判定契约。
  2. Strategy / Registry(protocol_response.py)

    • 将旧 convert_nonstream 中的 OpenAI、Anthropic、Responses 结构转换拆为独立格式化策略;
    • 保留 convert_nonstream 旧调用入口,保留 ID 生成、工具参数 JSON 解析/失败退化、模型来源、usage、stop_reason 和未知协议原样返回等契约。
  3. Controller 瘦身(__main__.py)

    • 不变更 HTTP 路由、鉴权、上游连接重试、流式预检、SSE/DSML 解析、错误状态透传及签到接口。
    • 仅将部分准备步骤和非流式格式化下沉到独立可测试的服务/策略。
  4. 测试和文档

    • 新增 test_upstream_request_pipeline.py、test_protocol_response_strategies.py 的精确行为测试;
    • 将国际站 Header 原本检查源码字符串的测试改为实际验证构建出的请求 Headers;
    • 设计说明:docs/refactor-request-response-boundaries.md。

验证

  • 相关协议/签到/网关专项:71 passed。
  • 全量 pytest:232 passed, 1 skipped, 1 failed,唯一失败仍为先前已知的 Windows NTFS/POSIX 0600 权限断言,与本次代码重构无关。
  • 排除该既有环境断言:232 passed, 1 skipped, 1 deselected。
  • compileall 通过,Git whitespace 检查通过,无新运行时依赖。

审查提示

本 PR 只做有限的“请求准备 + 非流式输出”结构重构,不宣称全面完成项目的架构改造。后续如果要进一步拆分模型目录、长生命周期 Session 或 SSE 状态机,应先补充针对它们的 characterization / 契约测试,分别提交。

此 PR 尚未合并,也没有重启本机正在运行的代理。

@hawklithm
hawklithm changed the base branch from fix/domestic-developer-role-compat to main October 22, 2026 16:23
@hawklithm
hawklithm merged commit eca6f70 into main Oct 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant