feat(#674): 接入豆包大模型 Phase 1 - 智能标题生成 + 统一AI服务层 #752

Merged
xiaoxia merged 1 commits from feat/doubao-ai-integration-phase1 into develop 2026-07-23 13:17:39 +08:00
Owner

变更说明

#674 接入豆包大模型 Phase 1 完成。

功能清单

1. 统一 AI 服务层 (apps/api/app/services/ai_service.py)

  • DoubaoAIClient 封装豆包 OpenAI 兼容接口
  • 支持自动重试(默认2次)+ 超时控制
  • 未配置 API Key 时 is_available 返回 false

2. 智能标题生成

  • 三种风格:爆款(viral) / 情感(emotional) / 信息(informative)
  • 生成数量:3-10个可调
  • 支持 JSON数组 / 编号列表 / markdown 等多种返回格式解析
  • 降级机制:无API Key 或调用失败时自动回退本地规则生成

3. API 接口 (/api/v1/ai/)

  • POST /ai/titles/generate — 生成智能标题
  • GET /ai/titles/styles — 获取支持的风格列表

4. 配置项

  • DOUBAO_API_KEY — 豆包API密钥(空=降级模式)
  • DOUBAO_MODEL — 模型ID,默认 doubao-seed-1-6-250615
  • DOUBAO_BASE_URL — 方舟平台地址
  • DOUBAO_TIMEOUT — 超时时间,默认30s
  • DOUBAO_MAX_RETRIES — 重试次数,默认2次

测试

  • 24个单元测试,覆盖客户端可用性、标题解析(8种格式)、降级生成、API成功/失败/不可解析路径、参数边界、风格定义

后续 Phase

  • Phase 2: 智能素材匹配(语义匹配)
  • Phase 3: AI推荐片段编排(替换现有stub)
## 变更说明 #674 接入豆包大模型 Phase 1 完成。 ## 功能清单 ### 1. 统一 AI 服务层 (`apps/api/app/services/ai_service.py`) - `DoubaoAIClient` 封装豆包 OpenAI 兼容接口 - 支持自动重试(默认2次)+ 超时控制 - 未配置 API Key 时 `is_available` 返回 false ### 2. 智能标题生成 - 三种风格:爆款(viral) / 情感(emotional) / 信息(informative) - 生成数量:3-10个可调 - 支持 JSON数组 / 编号列表 / markdown 等多种返回格式解析 - **降级机制**:无API Key 或调用失败时自动回退本地规则生成 ### 3. API 接口 (`/api/v1/ai/`) - `POST /ai/titles/generate` — 生成智能标题 - `GET /ai/titles/styles` — 获取支持的风格列表 ### 4. 配置项 - `DOUBAO_API_KEY` — 豆包API密钥(空=降级模式) - `DOUBAO_MODEL` — 模型ID,默认 doubao-seed-1-6-250615 - `DOUBAO_BASE_URL` — 方舟平台地址 - `DOUBAO_TIMEOUT` — 超时时间,默认30s - `DOUBAO_MAX_RETRIES` — 重试次数,默认2次 ## 测试 - 24个单元测试,覆盖客户端可用性、标题解析(8种格式)、降级生成、API成功/失败/不可解析路径、参数边界、风格定义 ## 后续 Phase - Phase 2: 智能素材匹配(语义匹配) - Phase 3: AI推荐片段编排(替换现有stub)
xiaoxia added 1 commit 2026-07-23 11:39:58 +08:00
feat(#674): 接入豆包大模型 Phase 1 - 智能标题生成 + 统一AI服务层
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 43s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 10s
AI Code Review / AI Code Review (pull_request) Successful in 2m18s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m48s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 19s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 27s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 29s
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m0s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m2s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m20s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m23s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m50s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 4m54s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 11m55s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 11s
3d23b94c6e
- 新增 DoubaoAIClient 封装豆包 OpenAI 兼容接口,支持重试
- 新增智能标题生成,支持 viral/emotional/informative 三种风格
- 无 API Key 或调用失败时自动降级为本地规则生成
- 新增 /api/v1/ai/titles/generate 和 /styles 两个接口
- 24个单元测试覆盖客户端、解析、降级、边界等场景
- 配置项:DOUBAO_API_KEY/MODEL/BASE_URL/TIMEOUT/MAX_RETRIES
Collaborator

代码审查结果 - PR #752

⚠️ 问题(2个需要修改)

  1. apps/api/app/services/ai_service.py 第97行:HTTP客户端使用不当,存在性能隐患。

    • 原因:直接使用 httpx.post 便捷函数发起请求,每次调用都会创建一个新的连接,无法复用连接池。在高并发场景下,会导致频繁建立TCP连接,增加延迟和资源消耗,甚至可能触发文件描述符耗尽。
    • 建议:应使用 httpx.Client() (同步) 或 httpx.AsyncClient() (异步) 作为上下文管理器或单例,以利用连接池。
  2. apps/api/app/services/ai_service.py 第317-339行:存在未使用的死代码。

    • 原因:定义了 AIService 类和 get_ai_service 单例获取函数,但在 routes/ai.py 中实际调用的是模块级函数 generate_smart_titles,并未使用该类。这增加了代码维护成本,容易引起误导。
    • 建议:若暂不使用面向对象封装,建议删除 AIService 类及 get_ai_service 函数,保持代码简洁。

💡 建议(2个可选)

  1. apps/api/app/services/ai_service.py 第193行:模块导入位置不规范。

    • 内容:在 _parse_titles_from_response 函数内部进行了 import re。虽然 Python 会缓存导入,但将标准库导入放在函数内部不符合 Python 编码规范(PEP 8),应移至文件顶部。
  2. apps/api/app/services/ai_service.py 第317行:变量定义顺序存在潜在风险。

    • 内容get_ai_service 函数定义在第317行,但其引用的全局变量 _ai_service 定义在第326行。虽然 Python 运行时能通过(因为函数体不立即执行),但违反了“先定义后使用”的直观原则,若在模块加载期间有特殊调用可能引发 NameError。建议调整顺序,将变量定义移至函数之前。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 03:43:11 | 模型:

## 代码审查结果 - PR #752 ### ⚠️ 问题(2个需要修改) 1. **apps/api/app/services/ai_service.py 第97行**:HTTP客户端使用不当,存在性能隐患。 - **原因**:直接使用 `httpx.post` 便捷函数发起请求,每次调用都会创建一个新的连接,无法复用连接池。在高并发场景下,会导致频繁建立TCP连接,增加延迟和资源消耗,甚至可能触发文件描述符耗尽。 - **建议**:应使用 `httpx.Client()` (同步) 或 `httpx.AsyncClient()` (异步) 作为上下文管理器或单例,以利用连接池。 2. **apps/api/app/services/ai_service.py 第317-339行**:存在未使用的死代码。 - **原因**:定义了 `AIService` 类和 `get_ai_service` 单例获取函数,但在 `routes/ai.py` 中实际调用的是模块级函数 `generate_smart_titles`,并未使用该类。这增加了代码维护成本,容易引起误导。 - **建议**:若暂不使用面向对象封装,建议删除 `AIService` 类及 `get_ai_service` 函数,保持代码简洁。 ### 💡 建议(2个可选) 1. **apps/api/app/services/ai_service.py 第193行**:模块导入位置不规范。 - **内容**:在 `_parse_titles_from_response` 函数内部进行了 `import re`。虽然 Python 会缓存导入,但将标准库导入放在函数内部不符合 Python 编码规范(PEP 8),应移至文件顶部。 2. **apps/api/app/services/ai_service.py 第317行**:变量定义顺序存在潜在风险。 - **内容**:`get_ai_service` 函数定义在第317行,但其引用的全局变量 `_ai_service` 定义在第326行。虽然 Python 运行时能通过(因为函数体不立即执行),但违反了“先定义后使用”的直观原则,若在模块加载期间有特殊调用可能引发 `NameError`。建议调整顺序,将变量定义移至函数之前。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 03:43:11 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit ad3e2f4834 into develop 2026-07-23 13:17:39 +08:00
xiaoxia deleted branch feat/doubao-ai-integration-phase1 2026-07-23 13:17:39 +08:00

🗑️ 预览环境已清理

PR #752 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #752 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.