# Kie AI Sora-2 API Java集成开发文档 ## 1. 概述 本文档旨在指导开发者如何在Java项目中集成Kie AI Sora-2 API,实现文本到视频的生成功能。Kie AI Sora-2是一个强大的AI视频生成平台,支持通过API调用创建高质量的视频内容。 ## 2. API基础信息 ### 2.1 接口地址 - API前缀:`https://api.kie.ai` - 接口文档:https://kie.ai/zh-CN/sora-2 ### 2.2 认证方式 所有API请求都需要在请求头中添加Authorization: ``` Authorization: Bearer 55fd537f17575b13444221c37aa11f47 ``` ### 2.3 请求格式 - 所有请求使用HTTP POST方法 - 数据传输编码为UTF-8 - 所有数据均为JSON格式(Content-Type: application/json) ## 3. 依赖配置 在Maven项目中,需要添加以下依赖: ```xml com.fasterxml.jackson.core jackson-databind 2.15.2 org.apache.httpcomponents httpclient 4.5.13 ``` ## 4. 接口集成实现 Kie AI集成了Sora-2模型,支持以下功能: 1. 文本生成视频 (sora-2-text-to-video) 2. 图片生成视频 (sora-2-image-to-video) 3. 任务状态查询 (query-task) 4. 去除sora2视频水印任务 (sora-watermark-remover) 5. 创建专业版本文生视频任务(sora-2-pro-text-to-video) 6. 创建专业版本图生视频生成任务(sora-2-pro-image-to-video) ### 4.0 接口列表 | 接口名称 | 请求方式 | 请求地址 | 描述 | |---------------------------|------|-----------------------------------|----------------| | sora-2-text-to-video | POST | /api/v1/jobs/createTask | 创建文生视频任务 | | sora-2-image-to-video | POST | /api/v1/jobs/createTask | 创建图生视频任务 | | sora-2-pro-text-to-video | POST | /api/v1/jobs/createTask | 创建专业版本文生视频任务 | | sora-2-pro-image-to-video | POST | /api/v1/jobs/createTask | 创建专业版本图生视频生成任务 | | sora-watermark-remover | POST | /api/v1/jobs/createTask | 去除sora2视频水印任务 | | Query Task | GET | /api/v1/jobs/recordInfo | 查询任务状态 | ### 4.4 专业版本文生视频 根据接口文档信息实现controller方法sora-2-pro-text-to-video调用接口,返回响应结果数据 #### 4.4.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,如"portrait"、"landscape"、"9:16"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 4.4.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-pro-text-to-video", "state": "success", "param": "{\"model\":\"sora-2-pro-text-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"prompt\":\"A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` ### 4.5 专业版本图生视频 根据接口文档信息实现controller方法sora-2-pro-image-to-video调用接口,返回响应结果数据 #### 4.5.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|---------|----|---------------------------------------------| | prompt | String | 是 | 视频生成的文本描述 | | | aspect_ratio | String | 是 | 视频宽高比,如"portrait"、"landscape"、"9:16"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | image_urls | Array of String | 是 | 图片URL数组 | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 4.5.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-pro-image-to-video", "state": "success", "param": "{\"model\":\"sora-2-pro-image-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"image_urls\":\"https://example.com/image.jpg\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` ### 4.6 去除视频水印 根据接口文档信息实现controller方法sora-watermark-remover调用接口,返回响应结果数据 #### 4.6.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | video_url | String | 是 | 视频URL | #### 4.6.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-watermark-remover", "state": "success", "param": "{\"model\":\"sora-watermark-remover\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"video_url\":\"https://example.com/video.mp4\"}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video-no-watermark.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` ### 4.1 文生视频 (sora-2-text-to-video) 根据接口文档信息实现controller方法sora-2-text-to-video调用接口,返回响应结果数据 #### 4.1.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,如"portrait"、"landscape"、"9:16"、"1:1"等 | | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 4.1.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-text-to-video", "state": "success", "param": "{\"model\":\"sora-2-text-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"prompt\":\"A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` #### 4.1.3 实现说明 文生视频接口通过调用KieAIService的createTextToVideoTask方法实现。该方法会构建包含prompt、aspect_ratio等参数的请求载荷,然后通过HTTP POST请求发送到Kie AI Sora-2 API。 在Controller层,通过@PostMapping注解定义POST请求接口,接收客户端传递的JSON参数。首先验证必要参数prompt是否存在且非空,然后提取可选参数aspect_ratio和remove_watermark。 Service层使用HttpRequestUtils工具类发起带认证头的POST请求,请求地址为`https://api.kie.ai/api/v1/jobs/createTask`。认证头包含API密钥: ``` Authorization: Bearer {API_KEY} ``` 请求成功后,API会返回包含taskId的JSON响应,该taskId可用于后续查询任务状态。 ### 4.2 图生视频 (sora-2-image-to-video) 根据接口文档信息实现controller方法sora-2-image-to-video调用接口,返回响应结果数据 #### 4.2.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,如"portrait"、"landscape"、"9:16"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | image_urls | Array of String | 是 | 图片URL数组 | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 4.2.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-image-to-video", "state": "success", "param": "{\"model\":\"sora-2-image-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"image_urls\":\"https://example.com/image.jpg\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` #### 4.2.3 实现说明 图生视频接口通过调用KieAIService的createImageToVideoTask方法实现。该方法会构建包含image_urls、aspect_ratio等参数的请求载荷,然后通过HTTP POST请求发送到Kie AI Sora-2 API。 在Controller层,通过@PostMapping注解定义POST请求接口,接收客户端传递的JSON参数。首先验证必要参数image_urls是否存在且非空,然后提取可选参数aspect_ratio、n_frames、fps和remove_watermark。 Service层使用HttpRequestUtils工具类发起带认证头的POST请求,请求地址为`https://api.kie.ai/api/v1/jobs/createTask`。认证头包含API密钥: ``` Authorization: Bearer {API_KEY} ``` 请求成功后,API会返回包含taskId的JSON响应,该taskId可用于后续查询任务状态。与文生视频接口类似,但输入参数为图片URL而非文本描述。 ### 4.3 专业版本文生视频 (sora-2-pro-text-to-video) 根据接口文档信息实现controller方法sora-2-pro-text-to-video调用接口,返回响应结果数据 #### 4.3.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,如"portrait"、"landscape"、"9:16"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 4.3.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-pro-text-to-video", "state": "success", "param": "{\"model\":\"sora-2-pro-text-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"prompt\":\"A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` #### 4.3.3 实现说明 专业版本文生视频接口通过调用KieAIService的createProTextToVideoTask方法实现。该方法会构建包含prompt、aspect_ratio、size、style等参数的请求载荷,然后通过HTTP POST请求发送到Kie AI Sora-2 API。 在Controller层,通过@PostMapping注解定义POST请求接口,接收客户端传递的JSON参数。首先验证必要参数prompt是否存在且非空,然后提取可选参数aspect_ratio、n_frames、fps、remove_watermark、size和style。 Service层使用HttpRequestUtils工具类发起带认证头的POST请求,请求地址为`https://api.kie.ai/api/v1/jobs/createTask`。认证头包含API密钥: ``` Authorization: Bearer {API_KEY} ``` 专业版本接口相比普通版本提供了更多参数配置选项,包括视频质量和风格等高级参数,可以生成更高质量和特定风格的视频内容。请求成功后,API会返回包含taskId的JSON响应,该taskId可用于后续查询任务状态。 ### 4.4 专业版本图生视频 (sora-2-pro-image-to-video) 根据接口文档信息实现controller方法sora-2-pro-image-to-video调用接口,返回响应结果数据 #### 4.4.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,如"portrait"、"landscape"、"9:16"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | image_urls | Array of String | 是 | 图片URL数组 | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 4.4.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-pro-image-to-video", "state": "success", "param": "{\"model\":\"sora-2-pro-image-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"image_urls\":\"https://example.com/image.jpg\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` #### 4.4.3 实现说明 专业版本图生视频接口通过调用KieAIService的createProImageToVideoTask方法实现。该方法会构建包含image_urls、aspect_ratio等参数的请求载荷,然后通过HTTP POST请求发送到Kie AI Sora-2 API。 在Controller层,通过@PostMapping注解定义POST请求接口,接收客户端传递的JSON参数。首先验证必要参数image_urls是否存在且非空,然后提取可选参数aspect_ratio、remove_watermark。 Service层使用HttpRequestUtils工具类发起带认证头的POST请求,请求地址为`https://api.kie.ai/api/v1/jobs/createTask`。认证头包含API密钥: ``` Authorization: Bearer {API_KEY} ``` 专业版本接口相比普通版本提供了更多参数配置选项,包括视频质量和风格等高级参数,可以生成更高质量和特定风格的视频内容。请求成功后,API会返回包含taskId的JSON响应,该taskId可用于后续查询任务状态。与专业版本文生视频接口类似,但输入参数为图片URL而非文本描述。 ### 4.5 去除视频水印 (sora-watermark-remover) 根据接口文档信息实现controller方法sora-watermark-remover调用接口,返回响应结果数据 #### 4.5.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | video_url | String | 是 | 视频URL | #### 4.5.2 返回结果数据 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-watermark-remover", "state": "success", "param": "{\"model\":\"sora-watermark-remover\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"video_url\":\"https://example.com/video.mp4\"}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-video-no-watermark.mp4\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` #### 4.5.3 实现说明 去除视频水印接口通过调用KieAIService的removeWatermark方法实现。该方法会构建包含video_url参数的请求载荷,然后通过HTTP POST请求发送到Kie AI Sora-2 API。 在Controller层,通过@PostMapping注解定义POST请求接口,接收客户端传递的JSON参数。首先验证必要参数video_url是否存在且非空。 Service层使用HttpRequestUtils工具类发起带认证头的POST请求,请求地址为`https://api.kie.ai/api/v1/jobs/createTask`。认证头包含API密钥: ``` Authorization: Bearer {API_KEY} ``` 该接口专门用于处理已生成视频的水印去除任务。请求成功后,API会返回包含taskId的JSON响应,该taskId可用于后续查询任务状态。处理完成后,可以通过查询任务状态获取去水印后的视频URL。 ### 4.6 查询任务状态 (query-task) 根据任务ID查询视频生成任务的状态 #### 4.6.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | taskId | String | 是 | 任务ID | #### 4.6.2 返回结果数据 ``` json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-text-to-video", "state": "success", "param": "{\"model\":\"sora-2-text-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"prompt\":\"A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-image.jpg\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` #### 4.6.3 实现说明 查询任务状态接口通过调用KieAIService的getTaskStatus方法实现。该方法会根据任务ID向Kie AI Sora-2 API发送HTTP GET请求,获取任务的当前状态和结果信息。 在Controller层,通过@GetMapping注解定义GET请求接口,路径参数为taskId。首先验证taskId参数是否存在且非空。 Service层使用HttpRequestUtils工具类发起带认证头的GET请求,请求地址为`https://api.kie.ai/api/v1/jobs/recordInfo?taskId={taskId}`。认证头包含API密钥: ``` Authorization: Bearer {API_KEY} ``` API会返回任务的详细状态信息,包括任务ID、模型名称、状态、参数、结果URL、失败信息等。客户端可以通过轮询此接口来获取任务的执行进度和最终结果。状态字段state可能的值包括: - "pending": 任务等待处理 - "processing": 任务正在处理中 - "success": 任务执行成功 - "failed": 任务执行失败 ## 核心组件 ### 1. Service层 (KieAIService) Service层负责与Kie AI Sora-2 API进行实际的HTTP通信,处理业务逻辑并返回结果。 #### 1.1 主要方法 - `createTextToVideoTask(String prompt, String aspectRatio, Integer n_frames, Integer fps, Boolean removeWatermark)`: 创建文本到视频生成任务。该方法接收用户提供的文本描述和其他可选参数,构造API请求载荷,并调用Kie AI Sora-2 API创建文生视频任务,返回任务ID。 - `createImageToVideoTask(String imageUrl, String aspectRatio, Integer n_frames, Integer fps, Boolean removeWatermark)`: 创建图片到视频生成任务。该方法接收用户提供的图片URL和其他可选参数,构造API请求载荷,并调用Kie AI Sora-2 API创建图生视频任务,返回任务ID。 - `getTaskStatus(String taskId)`: 查询任务状态。该方法根据任务ID调用Kie AI Sora-2 API查询视频生成任务的当前状态,并返回详细的状态信息。 - `callback()`: 处理回调通知。该方法接收Kie AI Sora-2 API发送的回调通知,包含任务ID、状态、结果URL等信息。根据任务状态更新本地数据库记录,触发后续处理流程。 - - `removeWatermark(String videoUrl)`: 去除视频水印。该方法接收视频URL,调用Kie AI Sora-2 API的去水印功能,返回处理后的视频URL。 - `createProTextToVideoTask(String prompt, String aspectRatio, Integer n_frames, Integer fps, Boolean removeWatermark)`: 创建专业版本文生视频任务。该方法提供更高级的文生视频生成功能,支持更多参数配置。 - `createProImageToVideoTask(String imageUrl, String aspectRatio, Integer n_frames, Integer fps, Boolean removeWatermark)`: 创建专业版本图生视频生成任务。该方法提供更高级的图生视频生成功能,支持更多参数配置。 #### 1.2 实现细节 Service层使用`HttpRequestUtils`工具类来发起HTTP请求,通过Apache HttpClient库与Kie AI Sora-2 API进行通信。所有请求都包含必要的认证头信息: ``` Authorization: Bearer {API_KEY} ``` #### 1.3 代码示例 ```java @Service public class KieAIService { private static final Logger logger = LoggerFactory.getLogger(KieAIService.class); // API配置 private static final String API_BASE_URL = "https://api.kie.ai"; private static final String API_KEY = "55fd537f17575b13444221c37aa11f47"; /** * 创建文生视频任务 * @param prompt 视频生成的文本描述 * @param aspectRatio 视频宽高比 * @param n_frames 视频时长(秒) * @param fps 视频帧率 * @param removeWatermark 是否移除水印 * @return 任务ID */ public String createTextToVideoTask(String prompt, String aspectRatio, Integer n_frames, Integer fps, Boolean removeWatermark) { try { // 构建API URL String url = API_BASE_URL + "/api/v1/jobs/createTask"; // 构建请求参数 Map input = new HashMap<>(); input.put("prompt", prompt); if (aspectRatio != null) input.put("aspect_ratio", aspectRatio); if (n_frames != null) input.put("n_frames", n_frames); if (fps != null) input.put("fps", fps); if (removeWatermark != null) input.put("remove_watermark", removeWatermark); Map payload = new HashMap<>(); payload.put("model", "sora-2-text-to-video"); payload.put("callBackUrl", "https://your-domain.com/api/callback"); payload.put("input", input); // 转换为JSON字符串 String jsonPayload = JSON.toJSONString(payload); logger.info("创建文生视频任务请求参数: {}", jsonPayload); // 添加Authorization请求头 Map headers = new HashMap<>(); headers.put("Authorization", "Bearer " + API_KEY); // 发起POST请求 String response = postWithHeaders(url, jsonPayload, headers); logger.info("创建文生视频任务响应: {}", response); // 解析响应获取任务ID JSONObject result = JSON.parseObject(response); if (result != null && result.containsKey("data")) { JSONObject data = result.getJSONObject("data"); if (data != null && data.containsKey("taskId")) { return data.getString("taskId"); } } return null; } catch (Exception e) { logger.error("创建文生视频任务失败: {}", e.getMessage(), e); return null; } } /** * 查询任务状态 * @param taskId 任务ID * @return 任务状态信息 */ public String getTaskStatus(String taskId) { try { // 构建API URL String url = API_BASE_URL + "/api/v1/jobs/recordInfo?taskId=" + taskId; // 添加Authorization请求头 Map headers = new HashMap<>(); headers.put("Authorization", "Bearer " + API_KEY); // 发起GET请求 String response = getWithHeaders(url, headers); logger.info("查询任务状态响应: {}", response); return response; } catch (Exception e) { logger.error("查询任务状态失败: {}", e.getMessage(), e); return null; } } /** * 带请求头的POST请求方法 * @param url 请求URL * @param jsonPayload JSON格式的请求参数 * @param headers 请求头 * @return 响应结果 */ private String postWithHeaders(String url, String jsonPayload, Map headers) { return HttpRequestUtils.postWithHeaders(url, jsonPayload, null, headers); } /** * 带请求头的GET请求方法 * @param url 请求URL * @param headers 请求头 * @return 响应结果 */ private String getWithHeaders(String url, Map headers) { return HttpRequestUtils.getWithHeaders(url, null, headers); } } ``` ### 2. Controller层 (KieAI2VideoController) Controller层提供RESTful API接口,接收客户端请求并调用Service层处理业务逻辑。 #### 2.1 接口列表 - `POST /api/kieai/text-to-video`: 创建文本到视频任务。请求体应包含prompt等参数,成功时返回任务ID。 - `POST /api/kieai/image-to-video`: 创建图片到视频任务。请求体应包含image_urls等参数,成功时返回任务ID。 - `GET /api/kieai/task/{taskId}`: 查询任务状态。路径参数taskId为任务ID,成功时返回任务的详细状态信息。 - `POST /api/kieai/watermark-remover`: 去除视频水印。请求体应包含video_url参数,成功时返回处理后的视频URL。 - `POST /api/kieai/pro-text-to-video`: 创建专业版本文生视频任务。提供更多参数配置选项,请求体应包含相应参数。 - `POST /api/kieai/pro-image-to-video`: 创建专业版本图生视频生成任务。提供更多参数配置选项,请求体应包含相应参数。 - `POST /api/kieai/callback`: 处理Kie AI Sora-2 API的回调通知。请求体应包含回调数据,成功时返回确认响应。 #### 2.2 实现细节 Controller层使用Spring Boot框架实现,通过注解定义RESTful接口。所有接口都返回统一的响应格式: ```json { "code": 200, "message": "success", "data": {} } ``` 接口使用Swagger注解进行文档化,支持在Swagger UI中查看和测试API。 #### 2.3 代码示例 ```java @RestController @RequestMapping("/api/kieai") @Tag(name = "Kie AI接口", description = "Kie AI Sora-2 API接口调用") public class KieAI2VideoController { private static final Logger logger = LoggerFactory.getLogger(KieAI2VideoController.class); @Autowired private KieAIService kieAIService; /** * 创建文生视频任务 * @param requestParams 请求参数 * @return 任务ID */ @PostMapping("/text-to-video") @Operation(summary = "创建文生视频任务", description = "通过文本描述创建视频生成任务") @ApiResponses({ @ApiResponse(responseCode = "200", description = "创建成功", content = @Content(schema = @Schema(implementation = String.class))), @ApiResponse(responseCode = "400", description = "参数错误", content = @Content), @ApiResponse(responseCode = "500", description = "创建失败", content = @Content) }) public ResponseResult createTextToVideoTask( @Parameter(description = "请求参数", required = true, schema = @Schema(implementation = JSONObject.class)) @RequestBody Map requestParams) { try { logger.info("创建文生视频任务,参数:{}", requestParams); // 获取必要参数 String prompt = (String) requestParams.get("prompt"); if (prompt == null || prompt.isEmpty()) { return ResponseResult.fail(400, "prompt参数不能为空"); } // 获取可选参数 String aspectRatio = (String) requestParams.get("aspectRatio"); Integer n_frames = (Integer) requestParams.get("n_frames"); Integer fps = (Integer) requestParams.get("fps"); Boolean removeWatermark = (Boolean) requestParams.get("removeWatermark"); // 调用服务创建任务 String taskId = kieAIService.createTextToVideoTask(prompt, aspectRatio, n_frames, fps, removeWatermark); if (taskId != null) { return ResponseResult.success(taskId); } else { return ResponseResult.fail("创建文生视频任务失败"); } } catch (Exception e) { logger.error("创建文生视频任务失败:{}", e.getMessage(), e); return ResponseResult.fail(500, "创建文生视频任务失败:" + e.getMessage()); } } /** * 查询任务状态 * @param taskId 任务ID * @return 任务状态信息 */ @GetMapping("/task/{taskId}") @Operation(summary = "查询任务状态", description = "根据任务ID查询视频生成任务的状态") @ApiResponses({ @ApiResponse(responseCode = "200", description = "查询成功", content = @Content(schema = @Schema(implementation = String.class))), @ApiResponse(responseCode = "400", description = "参数错误", content = @Content), @ApiResponse(responseCode = "500", description = "查询失败", content = @Content) }) public ResponseResult getTaskStatus( @Parameter(description = "任务ID", required = true, example = "task_1234567890") @PathVariable("taskId") String taskId) { try { logger.info("查询任务状态,任务ID:{}", taskId); if (taskId == null || taskId.isEmpty()) { return ResponseResult.fail(400, "taskId参数不能为空"); } // 调用服务查询任务状态 String taskStatus = kieAIService.getTaskStatus(taskId); if (taskStatus != null) { return ResponseResult.success(taskStatus); } else { return ResponseResult.fail("查询任务状态失败"); } } catch (Exception e) { logger.error("查询任务状态失败:{}", e.getMessage(), e); return ResponseResult.fail(500, "查询任务状态失败:" + e.getMessage()); } } } ``` ## 5. Java代码示例 以下是使用Java调用Kie AI Sora-2 API创建视频生成任务的完整示例: ### 5.1 创建视频生成任务 ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.util.HashMap; import java.util.Map; public class KieAIClient { private static final String API_BASE_URL = "https://api.kie.ai"; private static final String API_KEY = "55fd537f17575b13444221c37aa11f47"; public static void main(String[] args) { // 创建文生视频任务 String taskId = createTextToVideoTask( "A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.", "landscape", true ); System.out.println("Task ID: " + taskId); // 查询任务状态 if (taskId != null) { String taskStatus = getTaskStatus(taskId); System.out.println("Task Status: " + taskStatus); } } /** * 创建文生视频任务 * @param prompt 视频生成的文本描述 * @param aspectRatio 视频宽高比 * @param removeWatermark 是否移除水印 * @return 任务ID */ public static String createTextToVideoTask(String prompt, String aspectRatio, Boolean removeWatermark) { try { // 构建API URL String url = API_BASE_URL + "/api/v1/jobs/createTask"; // 构建请求参数 Map input = new HashMap<>(); input.put("prompt", prompt); input.put("aspect_ratio", aspectRatio); if (removeWatermark != null) { input.put("remove_watermark", removeWatermark); } Map payload = new HashMap<>(); payload.put("model", "sora-2-text-to-video"); payload.put("callBackUrl", "https://your-domain.com/api/callback"); payload.put("input", input); // 转换为JSON字符串 String jsonPayload = JSON.toJSONString(payload); // 发起POST请求 String response = postWithHeaders(url, jsonPayload); // 解析响应获取任务ID JSONObject result = JSON.parseObject(response); if (result != null && result.containsKey("data")) { JSONObject data = result.getJSONObject("data"); if (data != null && data.containsKey("taskId")) { return data.getString("taskId"); } } return null; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 创建图片到视频任务 * @param imageUrl 图片URL * @param aspectRatio 视频宽高比 * @param removeWatermark 是否移除水印 * @return 任务ID */ public static String createImageToVideoTask(String imageUrl, String aspectRatio, Boolean removeWatermark) { try { // 构建API URL String url = API_BASE_URL + "/api/v1/jobs/createTask"; // 构建请求参数 Map input = new HashMap<>(); input.put("image_urls", imageUrl); input.put("aspect_ratio", aspectRatio); if (removeWatermark != null) { input.put("remove_watermark", removeWatermark); } Map payload = new HashMap<>(); payload.put("model", "sora-2-image-to-video"); payload.put("callBackUrl", "https://your-domain.com/api/callback"); payload.put("input", input); // 转换为JSON字符串 String jsonPayload = JSON.toJSONString(payload); // 发起POST请求 String response = postWithHeaders(url, jsonPayload); // 解析响应获取任务ID JSONObject result = JSON.parseObject(response); if (result != null && result.containsKey("data")) { JSONObject data = result.getJSONObject("data"); if (data != null && data.containsKey("taskId")) { return data.getString("taskId"); } } return null; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 查询任务状态 * @param taskId 任务ID * @return 任务状态信息 */ public static String getTaskStatus(String taskId) { try { // 构建API URL String url = API_BASE_URL + "/api/v1/jobs/recordInfo?taskId=" + taskId; // 发起GET请求 return getWithHeaders(url); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 带请求头的POST请求方法 * @param url 请求URL * @param jsonPayload JSON格式的请求参数 * @return 响应结果 */ private static String postWithHeaders(String url, String jsonPayload) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpPost httpPost = new HttpPost(url); // 设置请求头 httpPost.setHeader("Content-Type", "application/json"); httpPost.setHeader("Authorization", "Bearer " + API_KEY); // 设置请求体 StringEntity entity = new StringEntity(jsonPayload, "UTF-8"); httpPost.setEntity(entity); // 发送请求并获取响应 HttpResponse response = httpClient.execute(httpPost); HttpEntity responseEntity = response.getEntity(); if (responseEntity != null) { return EntityUtils.toString(responseEntity, "UTF-8"); } return null; } finally { httpClient.close(); } } /** * 带请求头的GET请求方法 * @param url 请求URL * @return 响应结果 */ private static String getWithHeaders(String url) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpGet httpGet = new HttpGet(url); // 设置请求头 httpGet.setHeader("Authorization", "Bearer " + API_KEY); // 发送请求并获取响应 HttpResponse response = httpClient.execute(httpGet); HttpEntity responseEntity = response.getEntity(); if (responseEntity != null) { return EntityUtils.toString(responseEntity, "UTF-8"); } return null; } finally { httpClient.close(); } } } ``` ### 5.2 完整的Maven依赖配置 ```xml org.apache.httpcomponents httpclient 4.5.13 com.alibaba fastjson 1.2.83 org.projectlombok lombok 1.18.24 provided ``` ### 5.3 使用说明 1. 将上述Java代码保存为`KieAIClient.java`文件 2. 确保项目中已添加所需的Maven依赖 3. 替换代码中的API_KEY为您的实际API密钥 4. 编译并运行代码,即可测试文生视频和任务状态查询功能 该示例代码展示了如何使用Java调用Kie AI Sora-2 API的核心功能: - 创建文生视频任务 - 创建图生视频任务 - 查询任务状态 代码中包含了完整的HTTP请求处理逻辑,包括请求头设置、参数构建、响应解析等。您可以根据实际需求修改参数和处理逻辑。 ## 6. 参数说明 ### 6.1 请求参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | model | String | 是 | 模型名称,如"sora-2-text-to-video"、"sora-2-image-to-video"等 | | callBackUrl | String | 否 | 回调地址,任务完成时会向该地址发送通知 | | input | Object | 是 | 输入参数对象 | ### 6.2 input对象参数 #### 6.2.1 文生视频 (sora-2-text-to-video) | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,支持"portrait"(竖屏)、"landscape"(横屏)、"9:16"、"16:9"、"1:1"等 | | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 6.2.2 图生视频 (sora-2-image-to-video) | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,支持"portrait"(竖屏)、"landscape"(横屏)、"square"(方形)、"9:16"、"16:9"、"1:1"等 | | image_urls | Array of String | 是 | 图片URL数组 | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 6.2.3 专业版本文生视频 (sora-2-pro-text-to-video) | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,支持"portrait"(竖屏)、"landscape"(横屏)、"square"(方形)、"9:16"、"16:9"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 6.2.4 专业版本图生视频 (sora-2-pro-image-to-video) | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | prompt | String | 是 | 视频生成的文本描述 | | aspect_ratio | String | 是 | 视频宽高比,支持"portrait"(竖屏)、"landscape"(横屏)、"square"(方形)、"9:16"、"16:9"、"1:1"等 | | n_frames | Integer | 否 | 视频时长(秒) | | size | String | 否 | 视频质量,如"standard"、"high"等 | | image_urls | Array of String | 是 | 图片URL数组 | | remove_watermark | Boolean | 否 | 是否移除水印,默认true | #### 6.2.5 去除视频水印 (sora-watermark-remover) | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | video_url | String | 是 | 视频URL | ### 6.3 参数示例 #### 6.3.1 文生视频参数示例 ```json { "model": "sora-2-text-to-video", "callBackUrl": "https://your-domain.com/api/callback", "input": { "prompt": "A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: \"Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.\" The students listen attentively, some smiling and taking notes.", "aspect_ratio": "landscape", "n_frames": 5, "fps": 24, "remove_watermark": true } } ``` #### 6.3.2 图生视频参数示例 ```json { "model": "sora-2-image-to-video", "callBackUrl": "https://your-domain.com/api/callback", "input": { "image_urls": "https://example.com/image.jpg", "aspect_ratio": "portrait", "n_frames": 5, "fps": 24, "remove_watermark": true } } ``` #### 6.3.3 专业版本文生视频参数示例 ```json { "model": "sora-2-pro-text-to-video", "callBackUrl": "https://your-domain.com/api/callback", "input": { "prompt": "A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: \"Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.\" The students listen attentively, some smiling and taking notes.", "aspect_ratio": "landscape", "n_frames": 5, "fps": 24, "remove_watermark": true, "size": "4k", "style": "realistic" } } ``` #### 6.3.4 专业版本图生视频参数示例 ```json { "model": "sora-2-pro-image-to-video", "callBackUrl": "https://your-domain.com/api/callback", "input": { "image_urls": "https://example.com/image.jpg", "aspect_ratio": "portrait", "n_frames": 5, "fps": 24, "remove_watermark": true, "size": "hd", "style": "anime" } } ``` #### 6.3.5 去除视频水印参数示例 ```json { "model": "sora-watermark-remover", "callBackUrl": "https://your-domain.com/api/callback", "input": { "video_url": "https://example.com/video-with-watermark.mp4" } } ``` #### 6.3.6 callback 回调通知示例 ```json { "code": 200, "data": { "completeTime": 1755599644000, "consumeCredits": 100, "costTime": 8, "createTime": 1755599634000, "model": "sora-2-text-to-video", "param": "{\"callBackUrl\":\"https://your-domain.com/api/callback\",\"model\":\"sora-2-text-to-video\",\"input\":{\"prompt\":\"A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "remainedCredits": 2510330, "resultJson": "{\"resultUrls\":[\"https://example.com/generated-image.jpg\"]}", "state": "success", "taskId": "e989621f54392584b05867f87b160672", "updateTime": 1755599644000 }, "msg": "Playground task completed successfully." } ``` ## 7. 响应格式 ### 7.1 成功响应示例 ```json { "code": 200, "message": "success", "data": { "taskId": "task_12345678", "model": "sora-2-text-to-video", "state": "success", "param": "{\"model\":\"sora-2-text-to-video\",\"callBackUrl\":\"https://your-domain.com/api/callback\",\"input\":{\"prompt\":\"A professor stands at the front of a lively classroom, enthusiastically giving a lecture. On the blackboard behind him are colorful chalk diagrams. With an animated gesture, he declares to the students: “Sora 2 is now available on Kie AI, making it easier than ever to create stunning videos.” The students listen attentively, some smiling and taking notes.\",\"aspect_ratio\":\"landscape\",\"remove_watermark\":true}}", "resultJson": "{\"resultUrls\":[\"https://example.com/generated-image.jpg\"]}", "failCode": "", "failMsg": "", "completeTime": 1698765432000, "createTime": 1698765400000, "updateTime": 1698765432000 } } ``` ### 7.2 错误响应示例 ```json { "code": 400, "message": "Invalid input parameters", "data": null } ``` ## 8. 状态码说明 ### 8.1 HTTP状态码 | 状态码 | 说明 | |--------|------| | 200 | 请求成功 | | 400 | 请求参数错误 | | 401 | 未授权,API密钥无效 | | 403 | 禁止访问 | | 429 | 请求过于频繁,触发限流 | | 500 | 服务器内部错误 | | 503 | 服务不可用 | ### 8.2 任务状态码 | 状态码 | 说明 | |--------|------| | pending | 任务等待处理 | | processing | 任务正在处理中 | | success | 任务执行成功 | | failed | 任务执行失败 | ## 9. 最佳实践 ### 9.1 异常处理 在实际应用中,建议对网络请求进行异常处理,包括超时处理和重试机制: ```java public static String createVideoTaskWithRetry(int maxRetries) { for (int i = 0; i < maxRetries; i++) { try { String taskId = createVideoTask(); if (taskId != null) { return taskId; } } catch (Exception e) { System.err.println("第" + (i+1) + "次尝试失败: " + e.getMessage()); // 等待一段时间后重试 try { Thread.sleep(1000 * (i + 1)); // 递增等待时间 } catch (InterruptedException ie) { Thread.currentThread().interrupt(); break; } } } return null; } ``` ### 9.2 回调处理 建议实现回调接口来处理任务完成的通知: ```java @RestController @RequestMapping("/api/callback") public class KieAICallbackController { @PostMapping public ResponseEntity handleCallback(@RequestBody Map payload) { try { String taskId = (String) payload.get("task_id"); String status = (String) payload.get("status"); String videoUrl = (String) payload.get("video_url"); // 处理任务完成后的逻辑 if ("completed".equals(status)) { // 保存视频URL到数据库 saveVideoUrl(taskId, videoUrl); System.out.println("视频生成完成,任务ID: " + taskId + ", 视频地址: " + videoUrl); } else if ("failed".equals(status)) { // 处理失败情况 System.err.println("视频生成失败,任务ID: " + taskId); } return ResponseEntity.ok("success"); } catch (Exception e) { return ResponseEntity.status(500).body("error"); } } private void saveVideoUrl(String taskId, String videoUrl) { // 实现保存视频URL的逻辑 } } ``` ## 10. 注意事项 1. **API密钥安全**:请妥善保管API密钥,不要在客户端代码中暴露 2. **请求频率限制**:遵守API的请求频率限制,避免被限流 3. **回调地址**:确保回调地址可以被外网访问 4. **错误处理**:合理处理各种异常情况,包括网络异常、API错误等 5. **日志记录**:记录关键操作日志,便于问题排查 ## 11. 常见问题 ### 11.1 如何获取API密钥? 请联系Kie AI官方获取API密钥。 ### 11.2 视频生成需要多长时间? 视频生成时间取决于视频长度和复杂度,通常在几分钟内完成。 ### 11.3 如何处理生成失败的任务? 可以通过查询任务状态接口获取失败原因,并根据需要重新提交任务。 ### 11.4 是否支持批量生成? 支持批量生成,但需要注意API的并发限制。