From e7ccd3638cacf9264a9a5e022fc6bcceb82937d1 Mon Sep 17 00:00:00 2001 From: old burden Date: Wed, 1 Apr 2026 10:30:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=9F=B3=E9=A2=91=E7=9A=84=E5=8F=82=E8=80=83=E5=9B=BE=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E8=B5=84=E4=BA=A7=E7=AE=A1=E7=90=86=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=88=9D=E6=AD=A5=E4=B8=8A=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/api/PortalVideoController.java | 64 +++++++++++++++++-- .../java/com/ruoyi/ai/domain/ContentItem.java | 6 ++ 2 files changed, 63 insertions(+), 7 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java index 90def38..7795619 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java @@ -271,14 +271,16 @@ public class PortalVideoController extends BaseController { contentList = new ArrayList<>(request.getContent()); ContentItem head = contentList.get(0); if (head == null || !"text".equals(head.getType()) || StringUtils.isEmpty(head.getText())) { - return AjaxResult.error("请输入视频描述文本(首条须为 type=text,可含 [图n] 占位)"); + return AjaxResult.error("请输入视频描述文本(首条须为 type=text,可含 [图片n]/[视频n]/[音频n] 占位)"); } - // 保留 text + 合法 reference_image;允许“只有 text 没有参考图” + // 保留 text + 合法 reference_*(图/音/视频);允许“只有 text 没有参考素材” List filtered = new ArrayList<>(); filtered.add(head); for (int i = 1; i < contentList.size(); i++) { ContentItem it = contentList.get(i); - if (isReferenceImageContentItem(it)) { + if (isReferenceImageContentItem(it) + || isReferenceAudioContentItem(it) + || isReferenceVideoContentItem(it)) { filtered.add(it); } } @@ -286,8 +288,8 @@ public class PortalVideoController extends BaseController { String firstRef = contentList.stream() .skip(1) - .filter(PortalVideoController::isReferenceImageContentItem) - .map(it -> it.getImageUrl().getUrl()) + .map(PortalVideoController::firstReferenceUrlFromItem) + .filter(StringUtils::isNotEmpty) .findFirst() .orElse(null); // 无参考图也允许,仅 text 提示词 @@ -320,6 +322,27 @@ public class PortalVideoController extends BaseController { return submitOrderAndCreate(request, "image-reference", body); } + private static String firstReferenceUrlFromItem(ContentItem item) { + if (isReferenceImageContentItem(item)) { + return item.getImageUrl().getUrl(); + } + if (isReferenceVideoContentItem(item)) { + return item.getVideoUrl().getUrl(); + } + if (isReferenceAudioContentItem(item)) { + return item.getAudioUrl().getUrl(); + } + return null; + } + + private static boolean isValidReferenceAssetOrHttpUrl(String raw) { + if (StringUtils.isEmpty(raw)) { + return false; + } + String url = raw.trim().toLowerCase(); + return url.startsWith("http://") || url.startsWith("https://") || url.startsWith("asset://"); + } + private static boolean isReferenceImageContentItem(ContentItem item) { if (item == null || !"image_url".equals(item.getType())) { return false; @@ -331,8 +354,35 @@ public class PortalVideoController extends BaseController { if (iu == null || StringUtils.isEmpty(iu.getUrl())) { return false; } - String url = iu.getUrl().trim().toLowerCase(); - return url.startsWith("http://") || url.startsWith("https://"); + return isValidReferenceAssetOrHttpUrl(iu.getUrl()); + } + + private static boolean isReferenceVideoContentItem(ContentItem item) { + if (item == null || !"video_url".equals(item.getType())) { + return false; + } + if (!"reference_video".equals(item.getRole())) { + return false; + } + ImageUrl vu = item.getVideoUrl(); + if (vu == null || StringUtils.isEmpty(vu.getUrl())) { + return false; + } + return isValidReferenceAssetOrHttpUrl(vu.getUrl()); + } + + private static boolean isReferenceAudioContentItem(ContentItem item) { + if (item == null || !"audio_url".equals(item.getType())) { + return false; + } + if (!"reference_audio".equals(item.getRole())) { + return false; + } + ImageUrl au = item.getAudioUrl(); + if (au == null || StringUtils.isEmpty(au.getUrl())) { + return false; + } + return isValidReferenceAssetOrHttpUrl(au.getUrl()); } private List buildTextAndFirstFrame(String text, String firstUrl) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/ai/domain/ContentItem.java b/ruoyi-system/src/main/java/com/ruoyi/ai/domain/ContentItem.java index e0630d5..97ce2c6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/ai/domain/ContentItem.java +++ b/ruoyi-system/src/main/java/com/ruoyi/ai/domain/ContentItem.java @@ -15,6 +15,12 @@ public class ContentItem { @JsonProperty("image_url") private ImageUrl imageUrl; + @JsonProperty("video_url") + private ImageUrl videoUrl; + + @JsonProperty("audio_url") + private ImageUrl audioUrl; + @JsonProperty("role") private String role; }