TravelContentCreator/docs/API_INTEGRATION.md

444 lines
8.3 KiB
Markdown
Raw Normal View History

# AIGC 服务接口对接文档
> 本文档供 Java 后端对接 Python AIGC 服务使用
---
## 概述
### 服务地址
```
POST http://aigc-service:8080/aigc/execute
```
### 通用请求结构
```json
{
"engine": "引擎名称",
"params": { ... },
"async_mode": false,
"task_id": null,
"callback_url": null
}
```
### 通用响应结构
```json
{
"success": true,
"task_id": "xxx",
"status": "completed",
"data": { ... },
"error": null,
"error_code": null
}
```
---
## 引擎列表
| 引擎 | engine 值 | 说明 |
|-----|----------|------|
| 选题生成 | `topic_generate` | 生成营销选题 |
| 内容生成 | `content_generate` | 生成小红书文案 |
| 海报生成 | `poster_generate` | 生成海报图片 |
---
## 1. 选题生成 `topic_generate`
### 请求示例
```json
{
"engine": "topic_generate",
"params": {
"num_topics": 5,
"month": "2025-01",
"scenic_spot": {
"id": 1,
"name": "天津冒险湾",
"description": "天津最大的水上乐园...",
"address": "天津市滨海新区...",
"highlights": ["水上项目", "亲子设施"]
},
"product": {
"id": 10,
"name": "家庭套票",
"price": 299,
"original_price": 399,
"package_info": "含2大1小门票+午餐",
"usage_rules": "需提前1天预约"
},
"style": {
"id": 1,
"name": "攻略风",
"prompt_key": "gonglue"
},
"audience": {
"id": 1,
"name": "亲子向",
"prompt_key": "qinzi"
}
}
}
```
### 参数说明
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| num_topics | int | 否 | 生成选题数量,默认 5 |
| month | string | 否 | 目标月份,如 "2025-01" |
| scenic_spot | object | 是 | 景区完整对象 |
| product | object | 是 | 产品完整对象 |
| style | object | 否 | 风格对象 |
| audience | object | 否 | 受众对象 |
### 响应示例
```json
{
"success": true,
"data": {
"topics": [
{
"index": 1,
"date": "2025-01-15",
"title": "寒假遛娃好去处",
"logic": "寒假期间亲子出游需求旺盛",
"scenic_spot": "天津冒险湾",
"product": "家庭套票",
"style": "攻略风",
"audience": "亲子向"
}
],
"count": 5
}
}
```
---
## 2. 内容生成 `content_generate`
### 请求示例
```json
{
"engine": "content_generate",
"params": {
"topic": {
"index": 1,
"date": "2025-01-15",
"title": "寒假遛娃好去处",
"logic": "寒假期间亲子出游需求旺盛"
},
"scenic_spot": {
"id": 1,
"name": "天津冒险湾",
"description": "天津最大的水上乐园...",
"address": "天津市滨海新区...",
"highlights": ["水上项目", "亲子设施"],
"traffic_info": "地铁9号线直达"
},
"product": {
"id": 10,
"name": "家庭套票",
"price": 299,
"original_price": 399,
"package_info": "含2大1小门票+午餐"
},
"style": {
"id": 1,
"name": "攻略风",
"prompt_key": "gonglue"
},
"audience": {
"id": 1,
"name": "亲子向",
"prompt_key": "qinzi"
},
"need_judge": true
}
}
```
### 参数说明
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| topic | object | 是 | 选题对象(上一步输出) |
| scenic_spot | object | 是 | 景区完整对象 |
| product | object | 是 | 产品完整对象 |
| style | object | 否 | 风格对象 |
| audience | object | 否 | 受众对象 |
| need_judge | bool | 否 | 是否需要内容审核,默认 true |
### 响应示例
```json
{
"success": true,
"data": {
"content": {
"title": "🎢寒假遛娃|天津冒险湾超全攻略",
"content": "终于找到一个能让娃玩一整天的地方...",
"tag": "#天津旅游 #亲子游 #周末去哪儿玩"
},
"judge_result": {
"passed": true,
"score": 85,
"suggestions": []
}
}
}
```
---
## 3. 海报生成 `poster_generate`
### 请求示例
```json
{
"engine": "poster_generate",
"params": {
"template_id": "poster-template-1",
"poster_content": {
"title": "寒假特惠",
"subtitle": "天津冒险湾家庭套票",
"slogan": "一票畅玩全场",
"price_text": "¥299起",
"highlights": ["水上乐园", "亲子设施", "美食套餐"],
"cta": "立即抢购"
},
"image_urls": [
"https://oss.example.com/images/scenic1.jpg",
"https://oss.example.com/images/scenic2.jpg"
],
"scenic_spot": {
"id": 1,
"name": "天津冒险湾"
},
"product": {
"id": 10,
"name": "家庭套票"
}
}
}
```
### 参数说明
| 参数 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| template_id | string | 是 | 海报模板 ID |
| poster_content | object | 否 | 海报文案内容 |
| image_urls | array | 推荐 | 图片 URL 列表 |
| image_paths | array | 备选 | 本地图片路径 |
| scenic_spot | object | 否 | 景区对象 |
| product | object | 否 | 产品对象 |
### 图片传输方式
**推荐使用 `image_urls`**
```json
{
"image_urls": [
"https://oss.example.com/images/1.jpg",
"https://oss.example.com/images/2.jpg"
]
}
```
Python 端会自动下载图片并处理。
### 响应示例
```json
{
"success": true,
"data": {
"poster_url": "https://oss.example.com/posters/result.png",
"poster_base64": "data:image/png;base64,...",
"template_id": "poster-template-1"
}
}
```
---
## 对象结构定义
### scenic_spot 景区对象
```json
{
"id": 1,
"name": "景区名称",
"description": "景区描述",
"address": "详细地址",
"traffic_info": "交通信息",
"highlights": ["亮点1", "亮点2"],
"opening_hours": "营业时间",
"tips": "游玩贴士"
}
```
### product 产品对象
```json
{
"id": 10,
"name": "产品名称",
"price": 299,
"original_price": 399,
"package_info": "套餐内容",
"usage_rules": "使用规则",
"valid_period": "有效期",
"stock": 100
}
```
### style 风格对象
```json
{
"id": 1,
"name": "攻略风",
"prompt_key": "gonglue"
}
```
可选值:
- `gonglue` - 攻略风
- `tuijian` - 极力推荐风
### audience 受众对象
```json
{
"id": 1,
"name": "亲子向",
"prompt_key": "qinzi"
}
```
可选值:
- `qinzi` - 亲子向
- `zhoubianyou` - 周边游
- `gaoshe` - 高奢酒店
---
## 错误处理
### 错误响应格式
```json
{
"success": false,
"error": "错误描述",
"error_code": "ERROR_CODE",
"data": null
}
```
### 常见错误码
| 错误码 | 说明 | 处理建议 |
|-------|------|---------|
| VALIDATION_ERROR | 参数验证失败 | 检查必填参数 |
| ENGINE_NOT_FOUND | 引擎不存在 | 检查 engine 值 |
| AI_RATE_LIMIT | AI 服务限流 | 稍后重试 |
| AI_CONTENT_FILTER | 内容被过滤 | 调整输入内容 |
| NETWORK_ERROR | 网络错误 | 检查服务连接 |
---
## Prompt 查询接口
### 列出所有 Prompt
```
GET /prompt/v2/list
```
响应:
```json
{
"prompts": ["topic_generate", "content_generate", "content_judge", "poster_generate", "integration"],
"count": 5
}
```
### 获取 Prompt 详情
```
GET /prompt/v2/{name}?version=latest
```
### 列出 Prompt 版本
```
GET /prompt/v2/{name}/versions
```
### 渲染 Prompt
```
POST /prompt/v2/render
```
请求:
```json
{
"name": "content_generate",
"version": "latest",
"context": {
"style_content": "...",
"demand_content": "...",
"topic": { ... }
}
}
```
---
## 迁移指南
### 从旧接口迁移
| 旧参数 | 新参数 | 说明 |
|-------|-------|------|
| ppid | 移除 | 不再使用 |
| sid | scenic_spot.id | 改为完整对象 |
| pid | product.id | 改为完整对象 |
| images_base64 | image_urls | 推荐使用 URL |
### 关键变化
1. **不再使用 ppid**Java 端需要预先解析 ppid传递完整对象
2. **图片使用 URL**:推荐传递 OSS URLPython 端自动下载
3. **风格/受众使用 prompt_key**:用于匹配 Prompt 模板
---
## 联调检查清单
- [ ] 确认服务地址可访问
- [ ] 确认 scenic_spot 对象包含必要字段
- [ ] 确认 product 对象包含必要字段
- [ ] 确认 style.prompt_key 值正确
- [ ] 确认 audience.prompt_key 值正确
- [ ] 确认图片 URL 可公网访问
- [ ] 测试选题生成接口
- [ ] 测试内容生成接口
- [ ] 测试海报生成接口