fix: 支持视频音频的参考图模式,资产管理模块初步上线
This commit is contained in:
parent
bb35045ff2
commit
e7ccd3638c
|
|
@ -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<ContentItem> 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<ContentItem> buildTextAndFirstFrame(String text, String firstUrl) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue