refactor: extract generation core service

This commit is contained in:
QiuSW
2026-07-08 21:24:59 +08:00
parent 12717d09e8
commit c98f713762
11 changed files with 438 additions and 160 deletions
+29
View File
@@ -1674,3 +1674,32 @@
- 已知测试环境现象:测试期仍保留 allauth `account.EmailAddress` 条件唯一约束在 MySQL 上不可创建的既有 `models.W036` 警告。
- 决策:T-612 只给旧同步生图接口加硬截止和明确错误码,不引入 gevent,不改变文本生成超时口径;真正解决长耗时与客户端轮询体验仍放到 T-613~T-615。
- 下一步:领取 T-613,抽生成核心 service,为 T-614 生图异步任务化复用同一套审核、计费、上游和退点逻辑。
## 2026-07-08 实施:T-613 抽生成核心 service
- 状态:DONE。
- 代码变更:
- `apps/api/generation.py`:把旧同步生成编排抽成 `GenerationInput`、`PreparedGeneration`、`PrechargedGeneration`、`GenerationResult` 与三段核心函数:`prepare_generation()`、`precharge_generation()`、`execute_precharged_generation()`;旧 `generate_title_response()` / `generate_image_response()` 保留为兼容薄包装。
- `apps/api/generation.py`:`prepare_generation()` 负责 prompt 审核、图片输入处理、别名解析、Provider 选择和计费计算;`precharge_generation()` 只调用 billing 的 `precharge_call()`;`execute_precharged_generation()` 复用已预扣 `CallRecord` 调上游,并通过既有 `mark_call_success()` / `refund_call_points()` 完成成功确认或失败退点。
- `apps/api/storage.py`:`save_generated_image()` 新增 `url_builder` 参数,核心 service 可生成外部 URL 而不依赖 DRF `Request`;保留旧 `request` 参数兼容。
- `apps/api/views.py`:`GenerateImageView` 只把 `request.build_absolute_uri` 作为 URL 构建器传给核心 service,不再把整个 request 传入生成核心。
- `apps/api/tests.py`:新增核心 service 目标测试,覆盖无 DRF request 构建图片 URL,以及已预扣执行阶段上游失败后退点。
- 文档变更:
- `docs/06-tasks.md`:T-613 标记为 DONE,下一个任务为 T-614。
- `docs/04-architecture.md`、`docs/api.md`:同步生成核心 service 的内部阶段与“后续异步 worker 必须复用同一套资金逻辑”的口径。
- `README.md`、`docs/00-ai-start-here.md`、`docs/current-state.md`:同步 Phase 6 当前状态、验证证据和下一步。
- 验证:
- `.\init.ps1`:开工前通过。
- `py -3.12 -m py_compile apps\api\generation.py apps\api\storage.py apps\api\views.py apps\api\tests.py`:通过。
- `py -3.12 manage.py check`:通过,0 issues。
- `py -3.12 manage.py makemigrations --check --dry-run`:通过,No changes detected。
- `py -3.12 manage.py test apps.api.tests.GenerateApiTests.test_generation_core_saves_image_with_url_builder_without_request apps.api.tests.GenerateApiTests.test_precharged_generation_stage_refunds_on_upstream_failure --keepdb --noinput --verbosity 2`:通过,2 tests OK。
- `py -3.12 manage.py test apps.api.tests.GenerateApiTests --keepdb --noinput --verbosity 1`:通过,19 tests OK。
- `.\init.ps1`:收尾验证通过(Python 3.12.3,依赖已满足,`manage.py check` 0 issues,打印启动命令)。
- `git diff --check`:通过,仅 Windows CRLF 提示。
- 测试环境现象:
- 首次运行新增目标测试时,测试库 setup 阶段远程 MySQL `43.128.3.240` 连接超时;`Test-NetConnection 43.128.3.240 -Port 3306` 随后显示 `TcpTestSucceeded=True`,重跑通过。
- 曾尝试 `py -3.12 manage.py test apps.api --keepdb --noinput --verbosity 1`,命令 484 秒超时无断言结果;拆跑非生成 API 测试类时仍在测试库 setup 阶段出现 `OperationalError(2003)`。本轮直接影响的 `GenerateApiTests` 已完整通过。
- 测试期仍保留 allauth `account.EmailAddress` 条件唯一约束在 MySQL 上不可创建的既有 `models.W036` 警告。
- 决策:T-613 不改旧同步接口成功 / 失败响应契约,不新增异步任务表或新路由;只把生成 pipeline 拆成后续 T-614 可复用的准备、预扣、已预扣执行三个阶段。
- 下一步:领取 T-614,新增生图异步提交 / 轮询接口,并复用 T-613 的核心阶段。