1. websocket
多站点验证multiple sites
  • Default module
    • Sample APIs
      • markdown_请检查图片是否访问正常
      • Find pet by ID
      • Add a new pet to the store
      • Update an existing pet
      • Deletes a pet
      • Finds Pets by status
  • module2
    • markdown2
    • markdown1
    • Pet
      • 无 slug
      • 1slug-a
      • slug-multiple modified
      • Update Pet
    • User
      • Create User
      • Get User
    • Webhooks
      • Order Status Changed Event
      • Payment Succeeded Event
    • Websocket, Socket.IO & more
      • gRPC API
      • Other protocol API example
      • WebSocket example
      • Socket.IO example
      • Webhook example
      • GraphQL example
      • SSE example
      • SOAP example
    • Dashboard
      • Get Dashboard Stats
    • User Management
      • List Users
      • Get User Details
      • Update User Status
    • Order Management
      • List All Orders
      • Force Cancel Order
    • Audit Logs
      • Get Audit Log Details
  • 默认模块
    • 项目管理
      • 修改项目
      • 删除项目
      • 提示词列表查询
      • 分类统计
      • 丢弃ai解析结果
      • 音色列表(支持场景/性别/年龄段筛选)
      • 获取模型选项
      • 创建项目
      • 获取项目详情
      • 项目列表/搜索
      • 获取项目统计
      • 导出剧本Word
      • 预览ai解析内容
      • 应用ai解析内容
    • 测试控制器 - 用于验证跨域配置
      • 测试跨域的GET请求
      • 测试跨域的POST请求
      • 测试OPTIONS预检请求
      • 测试XSS防护
      • 测试XSS防护的GET请求
      • 简单GET测试接口(通过参数传递提示词)
      • 生成图片并保存到本地(测试Base64转换功能)
      • 直接测试Base64转图片功能
      • 测试图片生成并上传到指定路径
      • 测试图片生成并上传到指定路径(包含负面提示词)
      • 测试图片编辑功能
      • 测试图片编辑功能(GET简化版)
      • 测试Banana图片生成功能
      • 测试Banana图片生成功能(GET简化版)
      • 测试Banana API响应解析(调试用)
      • 测试Banana图片编辑功能(带图片输入)
      • 测试火山引擎图生图功能
      • 测试火山引擎图生图功能(GET简化版)
      • 测试火山引擎文生图功能
      • 测试火山引擎文生图功能(GET简化版)
      • 测试火山引擎文生图功能(带负面提示词)
      • 测试Banana图生图功能
      • 测试Banana图生图功能(GET简化版)
      • 测试Banana图生图功能(多张参考图)
      • 测试Banana图生图功能(不同尺寸格式)
      • 测试Banana图生图功能(本地文件)
      • Banana图生图功能综合测试接口
      • 测试Banana所有功能的健康检查
    • 分镜模块控制器
      • 分镜参考生图
      • 获取分镜参考生图支持的图片模型列表
      • 获取可用的LLM模型列表
      • AI帮写提示词接口
      • 根据章节ID查询分镜列表
      • 查询剧集关联的资产列表(按类型分类)
      • 创建分镜(通过AI生成)
      • 新增分镜(手动创建)
      • 修改分镜
      • 删除分镜
      • 更新分镜排序
      • 根据分镜ID查询混合图像列表
      • 根据分镜ID查询视频生成列表
      • 根据分镜ID查询TTS语音生成列表
      • 根据分镜ID查询素材列表
      • 上传分镜图片
      • 上传分镜音频
      • 上传分镜视频
      • 保存混合图像生成草稿(每个分镜仅保留一条草稿,重复保存覆盖旧草稿,不触发生成)
      • 查询某个分镜下最近一条混合图像草稿
      • 保存视频生成草稿(每个分镜仅保留一条草稿,重复保存覆盖旧草稿,不触发生成)
      • 查询某个分镜下最近一条视频草稿
      • 新增分镜素材
      • 删除分镜素材
      • 删除分镜图片生成草稿
      • 设置分镜素材选中状态
      • 删除分镜视频生成草稿
      • 删除TTS语音生成记录
      • 抽取分镜尾帧
      • 根据分镜ID查询其所属剧集的资产列表(按类型分类)
      • 根据分镜ID查询分镜详情(含资产及子资产图片)
      • 根据项目ID查询资产列表
      • 查询章节下每个分镜最近选中的视频素材(含关联的视频生成记录)
      • 查询章节下每个分镜最近选中的图片素材(含通过taskId关联的混合图像生成记录)
      • 根据章节ID导出选中素材压缩包
    • websocket
      • 生成章节分镜
      • 生成章节分镜视频
      • 批量生成章节分镜视频
      • 生成章节分镜图片
    • 云空间模块控制器
      • 上传素材
      • 导入云空间
      • 批量上传素材(支持多文件)
      • 云空间素材列表
      • 批量删除素材
      • 重命名素材
    • 场景模块控制器
      • 查询场景列表
      • 查询某个场景下所有选中图片
      • 查询某个场景下所有选中图片
      • 查询某个图片详情
      • 场景图片设置是否选中
      • 删除图片
      • 查询场景明细
      • 新建场景
      • 编辑场景
      • 上传场景图片
      • 从云空间导入场景图片
      • 上传参考图
      • 自动生成
      • 手动生成
      • 一键生成图片
      • 批量删除场景
      • 查询场景角度资产列表
      • 新建场景资产
      • 编辑场景资产
      • 根据角度表ID查询明细
      • 根据角度表ID查询明细
      • 批量删除场景
      • 图片截图上传
      • 截图处理
      • 图片超分处理
      • 图片增强处理
      • 图片关联到场景或角度
    • 提示词模块控制器
      • 新建提示词模版
      • 上传提示词模版封面
      • 编辑提示词模版
      • 提示词模板列表查询
      • 按模版Id查询模块明细
      • 按模版Id删除提示词模板
      • 切换收藏状态
    • 视频分析控制器
      • 上传视频文件
      • 分析视频
      • 查询任务状态
      • 查询任务列表
    • 用户管理
      • 发送短信验证码
      • 登录(短信验证码/密码)
      • 根据ID获取用户信息
      • 获取当前登录用户信息(需JWT)
    • 章节
      • 分集控制器
        • 根据项目ID查询章节列表(无分页)
        • 根据项目ID分页查询章节列表
        • 根据ID查询章节详情
        • 新增章节
        • 修改章节
        • 删除章节
    • 道具
      • 物品模块控制器
        • 查询物品列表
        • 查询某个 项目下所有道具选中图片
        • 查询某个图片详情
        • 物品图片设置是否选中
        • 删除图片
        • 查询物品明细
        • 新建物品
        • 编辑物品
        • 上传物品图片
        • 从云空间导入物品图片
        • 上传参考图
        • 自动生成
        • 手动生成
        • 一键生成图片
        • 批量删除场景
    • 豆包语音合成控制器
      • 根据场景、性别、年龄段查询音色列表
      • 根据场景、性别、年龄段查询音色列表(GET 方法)
      • 语音合成
      • 根据文本获取推荐音色
      • 快速语音合成(使用默认参数)
    • 生物模块控制器
      • 查询生物列表
      • 查询某个项目下所有生物选中图片
      • 查询某个图片详情
      • 生物图片设置是否选中
      • 删除图片
      • 查询生物明细
      • 新建生物
      • 编辑生物
      • 上传生物图片
      • 从云空间导入生物图片
      • 上传参考图
      • 自动生成
      • 手动生成
      • 一键生成图片
      • 批量删除生物
    • 角色管理
      • 查询角色列表
      • 查询角色下所有已选中图片
      • 查询图片明细
      • 设置角色图片选中状态
      • 删除角色图片
      • 查询角色明细
      • 绑定音色
      • 解除绑定音色
      • 新建角色
      • 编辑角色
      • 上传角色图片
      • 从云空间导入角色图片
      • 批量上传参考图
      • 自动生成角色图片(使用角色描述作为提示词)
      • 手动生成角色图片(自定义提示词/参数)
      • 一键批量生成角色图片
      • 批量删除角色
      • 查询角色造型列表
      • 新建角色造型
      • 编辑角色造型
      • 查询角色造型明细
      • 批量删除角色造型
    • websocket生成剧本
  1. websocket

生成章节分镜图片

Developing
127.0.0.1:8080/api/b2v/websocket

GenerateStoryboardImgHandler 接口文档#

1. 接口概述#

项目说明
接口名称分镜生图(支持图生图 / 文生图)
处理器类com.star.b2v.web.socket.handler.GenerateStoryboardImgHandler
入口方法handle(GenerateStoryboardImgMessage message)
消息类型(messageType)GenerateStoryboardImgMessage
通信协议WebSocket(双向,异步)
执行方式@Async("websocketTaskExecutor") 异步线程池执行
核心依赖StoryBoardImgService.generateImages(自动路由 GPT / Banana / 火山引擎)

业务说明#

接收客户端通过 WebSocket 推送的"分镜生图"任务,根据是否携带参考图自动选择图生图或文生图,调用对应模型(GPT / Banana / 火山引擎豆包)生成图片。生成结果(签名 URL 列表)由本处理器通过 TaskEventPublisher.publishSuccess 推送回客户端;失败则通过 publishFailure 推送错误信息。
本接口不是立即返回结果,而是提交一个异步任务。生成期间客户端可继续其他操作,结果通过同一 WebSocket 连接推送。

模型路由规则#

imageModelId模型Bean 前缀图生图 Bean文生图 Bean
0GPTgptgpt_img2imggpt_text2img
1Bananabananabanana_img2imgbanana_text2img
2火山引擎豆包volcenginevolcengine_img2imgvolcengine_text2img
refImages自动走genWay 落库值
非空图生图(IImg2ImgService)0
空 / null文生图(IText2ImgService)1

2. 调用链路#

客户端 WebSocket 文本消息
        │
        ▼
ApiWebSocketHandler.handleTextMessage           ← 解析 payload,按 messageType 路由
        │  (messageType = "GenerateStoryboardImgMessage")
        ▼
MessageMappingFactory.getHandler(GenerateStoryboardImgMessage.class)
        │
        ▼
MsgHandlerAspect.around                          ← @Around 切面,@Order(1)
        │  1. 解析 taskId = "{userId}_{clientId}"
        │  2. 查重(同 msgType + 同 msg 内容 + INIT 状态)→ 重复则返回"任务正在处理中"
        │  3. 落库 aisp_websocket_task,回写 dataTaskId
        │  4. point.proceed()
        ▼
GenerateStoryboardImgHandler.handle              ← @Async 异步执行
        │  1. toParam(message) 校验 + 转 GenerateMixedimage
        │  2. storyBoardImgService.generateImages(param)
        │     ├─ resolvePrompt(模板变量合成)
        │     ├─ 落库 aisp_generate_mixedimage(status=1 进行中)
        │     ├─ 单张同步 / 多张 CompletableFuture 并发
        │     ├─ 上传 COS,更新记录(status=2 成功,result_urls=签名URL)
        │     └─ 落库 aisp_storyboard_material
        │  3. publishSuccess(message, eventPublisher, resultUrls)
        ▼
客户端收到结果推送(签名图片URL列表)

3. WebSocket 连接#

连接地址:ws(s)://<host>/ws?userId={userId}
userId 必填,用于会话路由
连接成功:服务端推送 CONNECT_SUCCESS
心跳:客户端发送 ping,服务端回复 {"pong":"pong"}
消息格式:JSON 文本帧

4. 请求消息(客户端 → 服务端)#

4.1 报文结构#

外层为 SocketMessage 基础字段 + GenerateStoryboardImgMessage 业务字段混合平铺。
字段类型必填说明
messageTypeString是固定值:GenerateStoryboardImgMessage(路由用)
taskIdString是格式:{userId}_{clientId},如 1001_abc123;用于切面解析 userId/clientId 并落库
sessionIdString否服务端按连接自动回填,客户端不要传
msgTypeString否服务端回填,客户端不要传
dataTaskIdLong否切面落库后回写,客户端不要传

4.2 业务字段(GenerateStoryboardImgMessage)#

字段类型必填默认值枚举值说明
taskIdString是--业务唯一任务标识(与外层 taskId 同值)
storyboardIdInteger是--所属分镜 ID
projectIdInteger是--项目 ID,用于生成 COS 存储路径 storyboard/{projectId}/pic
imageModelIdByte是-0-GPT
1-Banana
2-火山引擎豆包
图像模型 ID
refImagesString否--参考图 URL,多个以分号 ; 分隔;空→文生图,非空→图生图
genWayByte否服务端自动判定0-图生图
1-文生图
生成方式;服务端按 refImages 是否为空覆盖
promptString否""-生成提示词;有模板时作为 basePrompt 追加在末尾
promptTemplateIdInteger否null-提示词模板 ID;为 null 时直接使用 prompt
promptParamsString(JSON)否null-模板变量 JSON 字符串,解析为 List<VariableVo>,详见第 6 节
amountInteger否1-生成数量;>1 时并发,=1 时同步
aspectRatioString否-16:9
9:16
4:3
3:4
1:1
画面比例
resolutionString否-480p
720p
1080p
分辨率(对应模型 size 参数)
consumeAmountInteger否--消耗积分(仅落库)

4.3 请求示例#

示例 1:图生图(单张,无模板)#

{
  "messageType": "GenerateStoryboardImgMessage",
  "taskId": "1001_abc123",
  "storyboardId": 88,
  "projectId": 12,
  "imageModelId": 2,
  "refImages": "https://cos.example.com/assets/ref1.jpg;https://cos.example.com/assets/ref2.jpg",
  "prompt": "镜头缓缓推进,雨夜街景",
  "amount": 1,
  "aspectRatio": "16:9",
  "resolution": "720p"
}

示例 2:文生图(多张并发,含模板变量)#

{
  "messageType": "GenerateStoryboardImgMessage",
  "taskId": "1001_def456",
  "storyboardId": 89,
  "projectId": 12,
  "imageModelId": 0,
  "prompt": "角色A(台词):你终于来了",
  "promptTemplateId": 12,
  "promptParams": "[{\"varName\":\"{{scene}}\",\"possibleValues\":\"雨夜街景\"},{\"varName\":\"{{camera}}\",\"possibleValues\":\"近景\"}]",
  "amount": 4,
  "aspectRatio": "9:16",
  "resolution": "1080p",
  "consumeAmount": 10
}
注:refImages 缺省或为空字符串时自动走文生图。

5. 响应消息(服务端 → 客户端)#

均通过同一 WebSocket 连接推送,由 AjaxResult 构造。

5.1 最终成功#

由 GenerateStoryboardImgHandler.handle 调用 TaskEventPublisher.publishSuccess(message, eventPublisher, resultUrls) 推送,data 为签名图片 URL 列表:
{
  "code": "200",
  "msgType": "GenerateStoryboardImgMessage",
  "taskId": "1001_abc123",
  "data": [
    "https://cos.example.com/storyboard/12/pic/2026/08/14/aaa.jpg?sign=xxx",
    "https://cos.example.com/storyboard/12/pic/2026/08/14/bbb.jpg?sign=xxx"
  ],
  "timestamp": 1690000000000
}

5.2 最终失败#

由 handle catch 异常后调用 TaskEventPublisher.publishFailure:
{
  "code": "500",
  "msgType": "GenerateStoryboardImgMessage",
  "taskId": "1001_abc123",
  "msg": "分镜生图失败: <错误详情>",
  "timestamp": 1690000000000
}

5.3 任务重复(防重拦截,不执行 handler)#

由 MsgHandlerAspect 直接推送:
{
  "code": "500",
  "msgType": "GenerateStoryboardImgMessage",
  "taskId": "1001_abc123",
  "msg": "任务正在处理中",
  "timestamp": 1690000000000
}

5.4 taskId 格式错误(切面校验失败)#

{
  "code": "500",
  "msg": "taskId格式错误!",
  "timestamp": 1690000000000
}

5.5 参数校验失败(handler 内 toParam 抛 ServiceException)#

走 5.2 失败路径,msg 为具体校验错误,如:
"分镜ID不能为空"
"项目ID不能为空"
"模型ID不能为空"

6. promptParams 字段专项说明#

6.1 数据形态#

项说明
外层类型String(在主 JSON 中是一个字符串值,不是 JSON 数组)
内层结构解析后为 List<VariableVo>,即 JSON 数组
反序列化框架Jackson(JsonUtil.fromJsonList)
仅使用字段varName、possibleValues
触发条件仅当 promptTemplateId 不为空 且对应模板存在时才生效

6.2 内层 VariableVo 字段#

字段类型必填说明
varNameString是变量名,必须含双花括号,如 "{{scene}}";代码自动去除 {{ }}
possibleValuesString是变量取值,多候选值用 / 分隔(如 "近景/远景"),整体作为该变量的值

6.3 服务端合成规则#

最终 prompt 按以下顺序拼接(来自 TemplateServiceImpl.getTemplatePrompt):
{模板content};{varName去花括号}:{possibleValues};...;{message.prompt}
示例:
模板 id=12 的 content = " cinematic style "
promptParams = [{varName:"{{scene}}",possibleValues:"雨夜街景"},{varName:"{{camera}}",possibleValues:"近景"}]
message.prompt = "角色A(台词):你终于来了"
合成结果:
 cinematic style ;scene:雨夜街景;camera:近景;角色A(台词):你终于来了

6.4 promptParams 常见写法#

"promptParams": "[{\"varName\":\"{{scene}}\",\"possibleValues\":\"雨夜街景\"},{\"varName\":\"{{camera}}\",\"possibleValues\":\"近景/特写\"}]"

7. 数据落库#

表触发点关键字段
aisp_websocket_taskMsgHandlerAspect(任务创建)msgType、msg、userId、clientId、delFlag=INIT
aisp_generate_mixedimageStoryBoardImgService.generateImagestaskId、storyboardId、refImages、prompt、imageModelId、genWay、status、result_urls(签名URL) 等
aisp_storyboard_materialStoryBoardImgService.saveStoryboardMaterialsstoryboardId、materialId(=生图记录ID)、materialType="image"、material_url(cosKey 原始值)、sortOrder

aisp_generate_mixedimage.status 状态流转#

值含义设置时机
1进行中生图开始时
2成功全部生成完成,result_urls 写入签名 URL
3失败异常时,error_msg 写入错误信息

8. 异常与错误码#

场景触发位置行为
taskId 不含 _ 或解析失败MsgHandlerAspect推送 taskId格式错误!,不执行 handler
同任务重复提交(INIT 状态)MsgHandlerAspect推送 任务正在处理中,不执行 handler
storyboardId / projectId / imageModelId 为空GenerateStoryboardImgHandler.toParam抛 ServiceException,走失败推送
模型 ID 不支持(非 0/1/2)StoryBoardImgService.resolveModelName抛 ServiceException,走失败推送
对应模型缺图生图/文生图 BeanStoryBoardImgService抛 ServiceException,走失败推送
全部生图返回空StoryBoardImgService抛 ServiceException("图片生成失败:未返回任何结果"),走失败推送
单张部分失败(amount>1)StoryBoardImgServicef.getNow(null) 过滤,仅保留成功的;若全失败导致 cosKeys 为空,则抛异常

9. 对接 Checklist(前端易踩坑点)#

1.
⚠️ messageType 必须严格等于 "GenerateStoryboardImgMessage"(大小写敏感)。
2.
⚠️ taskId 必须含 _,格式 {userId}_{clientId},否则被切面拦截。
3.
⚠️ refImages 是分号分隔的字符串,不是数组;空值/缺省走文生图,非空走图生图。
4.
⚠️ promptParams 必须是字符串(内层 JSON 数组转义后的字符串),不是 JSON 数组本身。
5.
⚠️ varName 必须含 {{ }}(如 "{{scene}}"),否则无法与模板占位符对齐。
6.
⚠️ 同 msgType + msg内容 + INIT状态 的任务会被判重,调试时改 clientId 或修改任一字段以避开。
7.
⚠️ genWay 传了也会被服务端按 refImages 是否为空覆盖,前端可不传。
8.
⚠️ 成功路径无 ack,前端只能监听 5.1 形式的最终结果消息或 5.2 的失败消息。
9.
⚠️ amount > 1 时多张并发生成,返回的 URL 列表顺序不保证与请求顺序对应;部分失败时只返回成功的。
10.
⚠️ 返回的 data 是已签名的 COS 预签名 URL,有时效性,前端如需长期存储应立即下载或记录到业务表。

10. 相关代码位置#

角色路径
Handlerb2v-web/src/main/java/com/star/b2v/web/socket/handler/GenerateStoryboardImgHandler.java
消息体b2v-api/src/main/java/com/star/b2v/api/message/GenerateStoryboardImgMessage.java
消息基类b2v-api/src/main/java/com/star/b2v/api/message/SocketMessage.java
处理器接口b2v-web/src/main/java/com/star/b2v/web/socket/handler/MessageHandler.java
业务实现b2v-core/src/main/java/com/star/b2v/core/service/img/StoryBoardImgService.java
事件发布b2v-api/src/main/java/com/star/b2v/api/service/ws/TaskEventPublisher.java
切面b2v-web/src/main/java/com/star/b2v/web/socket/aspect/MsgHandlerAspect.java
WS 入口b2v-web/src/main/java/com/star/b2v/web/socket/websocket/ApiWebSocketHandler.java
路由工厂b2v-web/src/main/java/com/star/b2v/web/socket/websocket/MessageMappingFactory.java
模型查询接口GET /storyboard/img-models(返回 {0:"GPT", 1:"Banana", 2:"火山引擎豆包"})

Request

Query Params

Header Params

Cookie Params

Modified at 2026-10-24 04:39:07
Previous
批量生成章节分镜视频
Next
上传素材
Built with