# Coze 工作流运行 API 文档

## 接口说明

执行已发布的工作流。此接口为非流式响应模式，对于支持流式输出的节点，应使用流式响应接口。

## 播课工作流配置信息

- **workflow_id**: `7561161554420482088`
- **space_id**: `7474971491470688296`
- **个人令牌**: 同陪练功能使用的 COZE_API_TOKEN
- **输入参数**: `course_id`（字符串类型）
- **输出结果**: mp3 音频文件 URL

## 基础信息

| 项目 | 内容 |
|------|------|
| 请求方式 | POST |
| 请求地址 | `https://api.coze.cn/v1/workflow/run` |
| 权限 | run（确保个人令牌开通了 run 权限） |
| 超时时间 | 默认 10 分钟，建议控制在 5 分钟以内 |

## 限制说明

| 限制项 | 说明 |
|--------|------|
| 工作流发布状态 | 必须为已发布状态 |
| 请求大小上限 | 20 MB |
| 超时时间 | 未开启异步时为 10 分钟，开启异步后为 24 小时 |

## 请求参数

### Header

| 参数 | 取值 | 说明 |
|------|------|------|
| Authorization | Bearer $Access_Token | Personal Access Token 认证 |
| Content-Type | application/json | 请求正文格式 |

### Body

| 参数 | 类型 | 是否必选 | 说明 |
|------|------|----------|------|
| workflow_id | String | 必选 | 待执行的 Workflow ID |
| parameters | Map | 可选 | 工作流开始节点的输入参数，JSON 格式 |
| bot_id | String | 可选 | 需要关联的智能体 ID |
| app_id | String | 可选 | 关联的扣子应用 ID |
| ext | JSON Map | 可选 | 额外字段（经纬度、user_id 等） |
| is_async | Boolean | 可选 | 是否异步运行（仅付费版可用） |

## 播课工作流请求示例

```json
{
  "workflow_id": "7561161554420482088",
  "parameters": {
    "course_id": "5"
  }
}
```

## 返回参数

| 参数 | 类型 | 说明 |
|------|------|------|
| code | Long | 调用状态码，0 表示成功 |
| data | String | 工作流执行结果，通常为 JSON 序列化字符串 |
| msg | String | 状态信息，失败时包含详细错误信息 |
| execute_id | String | 异步执行的事件 ID |
| debug_url | String | 调试页面 URL（7天有效期） |
| usage | Object | Token 使用情况 |
| detail | Object | 请求详情（包含 logid） |

### Usage 对象

| 参数 | 类型 | 说明 |
|------|------|------|
| input_count | Integer | 输入 Token 数 |
| output_count | Integer | 输出 Token 数 |
| token_count | Integer | Token 总量 |

## 播课工作流返回示例

```json
{
  "code": 0,
  "data": "{\"mp3_url\":\"https://example.com/broadcast/course_5.mp3\"}",
  "debug_url": "https://www.coze.cn/work_flow?execute_id=741364789030728****&space_id=7474971491470688296&workflow_id=7561161554420482088",
  "msg": "",
  "usage": {
    "input_count": 120,
    "token_count": 350,
    "output_count": 230
  }
}
```

## 使用 cozepy SDK 调用示例

### Python SDK（0.2.0版本）

```python
from cozepy import Coze, TokenAuth
from app.core.config import settings
import json

async def generate_broadcast(course_id: int) -> str:
    """调用 Coze 工作流生成播课音频"""
    
    # 初始化 Coze 客户端
    coze = Coze(
        auth=TokenAuth(token=settings.COZE_API_TOKEN),
        base_url=settings.COZE_API_BASE
    )
    
    try:
        # 调用工作流
        result = await coze.workflows.runs.create(
            workflow_id=settings.COZE_BROADCAST_WORKFLOW_ID,
            parameters={"course_id": str(course_id)}
        )
        
        # 解析返回结果
        if result.code == 0:
            data = json.loads(result.data)
            mp3_url = data.get("mp3_url")
            return mp3_url
        else:
            raise Exception(f"工作流执行失败: {result.msg}")
            
    except Exception as e:
        logger.error(f"调用 Coze 工作流失败: {e}")
        raise
```

## 错误处理

### 常见错误码

| code | 说明 | 处理方式 |
|------|------|---------|
| 0 | 成功 | 正常处理 |
| 400 | 参数错误 | 检查 workflow_id 和 parameters |
| 4200 | 工作流未发布 | 确保工作流已发布 |
| 500 | 服务器错误 | 记录 logid 并重试 |
| 6003 | 异步运行需付费版 | 使用同步模式或升级账号 |

### 错误日志记录

```python
logger.error(
    f"Coze工作流执行失败",
    extra={
        "workflow_id": workflow_id,
        "course_id": course_id,
        "logid": result.detail.logid if hasattr(result, 'detail') else None,
        "error_code": result.code,
        "error_msg": result.msg
    }
)
```

## 注意事项

1. **超时配置**：播课音频生成通常需要 10 分钟，建议设置超时时间为 180 秒
2. **Token 认证**：使用 Personal Access Token，与陪练功能共用同一个 token
3. **参数类型**：course_id 需要转换为字符串类型传递
4. **返回解析**：data 字段为 JSON 字符串，需要反序列化后提取 mp3_url
5. **调试支持**：返回的 debug_url 可用于查看工作流执行详情（7天有效期）
6. **异步模式**：免费版不支持异步模式，使用同步调用即可

## 参考链接

- Coze 官方文档：https://www.coze.cn/open/docs/developer_guides/workflow_run
- cozepy SDK 文档：https://github.com/coze-dev/coze-py

---

**文档版本**: v1.0  
**创建日期**: 2025-10-14  
**维护人**: 考培练系统开发团队

