fix: 修复任务3.08代码审查P2问题 (4项) #171

Merged
xiaoxia merged 1 commits from feature/fix-308-p2-issues into develop 2026-07-02 15:11:10 +08:00
Owner

修复内容

P2-1: workflow.py start_clone() 将 mark_processing() 移到音频URL检查之后,无URL时保持pending
P2-2: Celery任务改用 VoiceCloneWorkflowService 公开方法,不再直接操作profile
P2-3: create_voice_clone 和 retry_voice_clone 路由的 Celery 调度失败时均标记profile为failed
P2-4: 由P2-2修复自动解决

测试

57个全部通过(workflow 14 + task 6 + cosyvoice 37)

## 修复内容 P2-1: workflow.py start_clone() 将 mark_processing() 移到音频URL检查之后,无URL时保持pending P2-2: Celery任务改用 VoiceCloneWorkflowService 公开方法,不再直接操作profile P2-3: create_voice_clone 和 retry_voice_clone 路由的 Celery 调度失败时均标记profile为failed P2-4: 由P2-2修复自动解决 ## 测试 57个全部通过(workflow 14 + task 6 + cosyvoice 37)
Author
Owner

代码审查报告:修复任务3.08 P2问题

结论: ⚠️ 有条件通过 — 后端 P2 修复基本到位,但存在范围问题和残留问题

P2 修复验证

原问题 状态 说明
P2-1: 无音频URL卡processing 已修复 mark_processing() 移至 if source_audio_url 分支内
P2-2: Celery绕过WorkflowService ⚠️ 部分修复 结果处理改用了 WorkflowService,但轮询仍调用 workflow.cosyvoice_service._poll_clone_task() 私有方法
P2-3: 调度失败静默吞没 已修复 create/retry 路由均增加了调度失败标记 failed 的逻辑
P2-4: 死代码 已解决 Celery task 现在调用 process_clone_result/failure

P2 残留:Celery task 仍调用私有方法

result = workflow.cosyvoice_service._poll_clone_task(task_id, timeout=300)

建议在 VoiceCloneWorkflowService 上新增公开方法:

def poll_and_process(self, profile_id: str, timeout: float = 300) -> dict:
    profile = self.repository.get(profile_id)
    task_id = (profile.metadata or {}).get("cosyvoice_task_id", "")
    result = self.cosyvoice_service._poll_clone_task(task_id, timeout=timeout)
    self.process_clone_result(profile_id, result["voice_id"])
    return result

Celery task 只需调用 workflow.poll_and_process(profile_id) 即可。

⚠️ 范围问题:混入了前端代码

本 PR 是后端修复,但包含了前端文件变更(voiceClone.ts +8行、VoiceLibrary.tsx +401/-16),与 PR #170(前端任务3.12)存在重叠且冲突。

实测先合并 PR #170 后,本 PR 会在 VoiceLibrary.tsx 产生 merge conflict。

建议:从本 PR 中移除前端文件(git reset HEAD -- apps/web/ + amend),先合并 PR #170 后再合并本 PR。

P3 建议

  • P3-1: retry_clone 与 start_clone 中提交逻辑重复度高,可抽取 _submit_and_process() 私有方法
  • P3-2: VoiceCloneWorkflowError 已定义但从未使用

测试

57 个测试全部通过,test_start_clone_without_audio_url 断言已正确更新。

## 代码审查报告:修复任务3.08 P2问题 **结论**: ⚠️ **有条件通过** — 后端 P2 修复基本到位,但存在范围问题和残留问题 ### P2 修复验证 | 原问题 | 状态 | 说明 | |--------|------|------| | P2-1: 无音频URL卡processing | ✅ 已修复 | mark_processing() 移至 if source_audio_url 分支内 | | P2-2: Celery绕过WorkflowService | ⚠️ 部分修复 | 结果处理改用了 WorkflowService,但轮询仍调用 `workflow.cosyvoice_service._poll_clone_task()` 私有方法 | | P2-3: 调度失败静默吞没 | ✅ 已修复 | create/retry 路由均增加了调度失败标记 failed 的逻辑 | | P2-4: 死代码 | ✅ 已解决 | Celery task 现在调用 process_clone_result/failure | ### P2 残留:Celery task 仍调用私有方法 ```python result = workflow.cosyvoice_service._poll_clone_task(task_id, timeout=300) ``` 建议在 VoiceCloneWorkflowService 上新增公开方法: ```python def poll_and_process(self, profile_id: str, timeout: float = 300) -> dict: profile = self.repository.get(profile_id) task_id = (profile.metadata or {}).get("cosyvoice_task_id", "") result = self.cosyvoice_service._poll_clone_task(task_id, timeout=timeout) self.process_clone_result(profile_id, result["voice_id"]) return result ``` Celery task 只需调用 `workflow.poll_and_process(profile_id)` 即可。 ### ⚠️ 范围问题:混入了前端代码 本 PR 是后端修复,但包含了前端文件变更(voiceClone.ts +8行、VoiceLibrary.tsx +401/-16),与 PR #170(前端任务3.12)存在重叠且冲突。 实测先合并 PR #170 后,本 PR 会在 VoiceLibrary.tsx 产生 merge conflict。 **建议**:从本 PR 中移除前端文件(`git reset HEAD -- apps/web/` + amend),先合并 PR #170 后再合并本 PR。 ### P3 建议 - P3-1: retry_clone 与 start_clone 中提交逻辑重复度高,可抽取 `_submit_and_process()` 私有方法 - P3-2: VoiceCloneWorkflowError 已定义但从未使用 ### 测试 57 个测试全部通过,test_start_clone_without_audio_url 断言已正确更新。
xiaoxia force-pushed feature/fix-308-p2-issues from 07f6af09d6 to 796aeff499 2026-07-02 14:38:52 +08:00 Compare
Author
Owner

🔍 代码审查结果(v2 复审)

结论: 通过,可合并

P2 修复验证

问题 状态 说明
P2-1: 无 URL 卡 processing 已修复 mark_processing() 在 if source_audio_url 内
P2-2: Celery 调私有方法 已彻底修复 poll_and_process_clone() → poll_clone_task() 公开方法链
P2-3: 调度失败静默吞没 已修复 create/retry 路由均标记 failed
P2-4: 死代码 已解决 由 P2-2 修复自动解决

v1 → v2 关键改进

  • CosyVoiceService 新增公开方法 poll_clone_task()
  • WorkflowService 新增 poll_and_process_clone(),Celery 零私有方法访问
  • 前端文件已全部移除(仅 6 个后端文件)
  • 新增 4 个 TestPollAndProcessClone 测试用例

P3 建议

  • P3-1: poll_and_process_clone 中 poll 成功但 process_result 失败时 profile 可能状态不一致
  • P3-2: VoiceCloneWorkflowError 已导入但未显式使用

61 个测试全部通过。建议合并

## 🔍 代码审查结果(v2 复审) **结论**: ✅ **通过,可合并** ### P2 修复验证 | 问题 | 状态 | 说明 | |------|------|------| | P2-1: 无 URL 卡 processing | ✅ 已修复 | mark_processing() 在 if source_audio_url 内 | | P2-2: Celery 调私有方法 | ✅ **已彻底修复** | poll_and_process_clone() → poll_clone_task() 公开方法链 | | P2-3: 调度失败静默吞没 | ✅ 已修复 | create/retry 路由均标记 failed | | P2-4: 死代码 | ✅ 已解决 | 由 P2-2 修复自动解决 | ### v1 → v2 关键改进 - CosyVoiceService 新增公开方法 `poll_clone_task()` - WorkflowService 新增 `poll_and_process_clone()`,Celery 零私有方法访问 - 前端文件已全部移除(仅 6 个后端文件) - 新增 4 个 `TestPollAndProcessClone` 测试用例 ### P3 建议 - P3-1: poll_and_process_clone 中 poll 成功但 process_result 失败时 profile 可能状态不一致 - P3-2: VoiceCloneWorkflowError 已导入但未显式使用 61 个测试全部通过。**建议合并**。
xiaoxia merged commit a2797c2594 into develop 2026-07-02 15:11:10 +08:00
Author
Owner

🔍 任务 3.09 — CosyVoice 后端整体代码审计

审计范围: PR #161-171 完整后端栈 (10文件+4 domain+3 test+ports)

结论: ⚠️ 有条件通过 (0P0/1P1/4P2/5P3)

P1

  • P1-1: TTS POST /synthesize 只创建 pending 记录,无执行器触发合成(如阶段性设计请加 TODO)

P2

  • P2-2: Celery Session 泄漏 — SessionLocal() 异常时 finally 会 UnboundLocalError
  • P2-3: 统一配音列表 count_by_user() 冗余调用两次
  • P2-4: voice_clone_profile_id 字段从未填充
  • P2-1: Celery 重试语义缺注释

架构 ★★★★☆

Hexagonal 分层清晰,状态机严谨,CosyVoiceService 健壮(重试+超时+异常分层),API Key 不硬编码不泄露

测试: 60个

Service 37个★5 / Workflow 18个★4 / Task 5个★4 / Routes+UseCases+Domain 0个

报告: /docs/audit/task309-audit-report.md

## 🔍 任务 3.09 — CosyVoice 后端整体代码审计 **审计范围**: PR #161-171 完整后端栈 (10文件+4 domain+3 test+ports) **结论: ⚠️ 有条件通过** (0P0/1P1/4P2/5P3) ### P1 - **P1-1**: TTS `POST /synthesize` 只创建 pending 记录,无执行器触发合成(如阶段性设计请加 TODO) ### P2 - **P2-2**: Celery Session 泄漏 — `SessionLocal()` 异常时 finally 会 UnboundLocalError - **P2-3**: 统一配音列表 `count_by_user()` 冗余调用两次 - **P2-4**: `voice_clone_profile_id` 字段从未填充 - **P2-1**: Celery 重试语义缺注释 ### 架构 ★★★★☆ Hexagonal 分层清晰,状态机严谨,CosyVoiceService 健壮(重试+超时+异常分层),API Key 不硬编码不泄露 ### 测试: 60个 Service 37个★5 / Workflow 18个★4 / Task 5个★4 / Routes+UseCases+Domain 0个 报告: `/docs/audit/task309-audit-report.md`
Sign in to join this conversation.