fix(media): 音频任务 - 支持异步 Provider 协议与结果校验 (#146)

Closes #146
This commit is contained in:
ddCat
2026-08-05 19:38:04 +08:00
parent cd85a45936
commit 6ae5692849
7 changed files with 346 additions and 20 deletions

View File

@@ -5,6 +5,7 @@ export type ModelProtocol =
| "volcengine-ark-image"
| "volcengine-jimeng-image"
| "openai-audio"
| "async-audio"
| "newapi"
| "newapi-channel-1"
| "newapi-channel-2"
@@ -32,11 +33,28 @@ export const MODEL_PROTOCOLS: ModelProtocolDefinition[] = [
{ value: "volcengine-ark-image", label: "火山方舟图片", capability: "image", create: "POST /api/v3/images/generations", contentType: "application/json", media: "文生图与 image 参考图,不支持蒙版" },
{ value: "volcengine-jimeng-image", label: "即梦官方图片", capability: "image", create: "POST CVSync2AsyncSubmitTask", poll: "POST CVSync2AsyncGetResult", contentType: "application/json + AK/SK 签名", media: "0-14 张参考图,模型标识填写 req_key" },
{ value: "openai-audio", label: "OpenAI Audio", capability: "audio", create: "POST /v1/audio/speech", contentType: "application/json", media: "文本转语音" },
{ value: "async-audio", label: "异步音频任务", capability: "audio", create: "POST /v1/audio/tasks", poll: "GET /v1/audio/tasks/{task_id}", contentType: "application/json", media: "语音、音效与音乐生成" },
{ value: "newapi", label: "OpenAI / NewAPI Videos", capability: "video", create: "POST /v1/videos", poll: "GET /v1/videos/{task_id}", contentType: "multipart/form-data", media: "input_reference[] 参考图" },
{ value: "newapi-channel-1", label: "NewAPI 媒体任务", capability: "video", create: "POST /v1/videos", poll: "GET /v1/videos/{task_id}", contentType: "application/json", media: "图片、视频、音频公网 URL" },
{ value: "newapi-channel-2", label: "NewAPI Video Generations", capability: "video", create: "POST /v1/video/generations", poll: "GET /v1/video/generations/{task_id}", contentType: "application/json", media: "image_urls(首帧、尾帧、其他参考图) / video_urls / audio_urls" },
{
value: "newapi-channel-2",
label: "NewAPI Video Generations",
capability: "video",
create: "POST /v1/video/generations",
poll: "GET /v1/video/generations/{task_id}",
contentType: "application/json",
media: "image_urls(首帧、尾帧、其他参考图) / video_urls / audio_urls",
},
{ value: "xai-video", label: "xAI 官方视频", capability: "video", create: "POST /v1/videos/generations", poll: "GET /v1/videos/{request_id}", contentType: "application/json", media: "单张起始图" },
{ value: "volcengine-ark-video", label: "火山方舟视频", capability: "video", create: "POST /api/v3/contents/generations/tasks", poll: "GET /api/v3/contents/generations/tasks/{task_id}", contentType: "application/json", media: "图片、视频、音频参考素材" },
{
value: "volcengine-ark-video",
label: "火山方舟视频",
capability: "video",
create: "POST /api/v3/contents/generations/tasks",
poll: "GET /api/v3/contents/generations/tasks/{task_id}",
contentType: "application/json",
media: "图片、视频、音频参考素材",
},
{ value: "volcengine-jimeng-video", label: "即梦官方视频", capability: "video", create: "POST CVSync2AsyncSubmitTask", poll: "POST CVSync2AsyncGetResult", contentType: "application/json + AK/SK 签名", media: "文本或一张首帧图,模型标识填写 req_key" },
{ value: "gemini-veo", label: "Gemini Veo", capability: "video", create: "POST /v1beta/models/{model}:predictLongRunning", poll: "GET /v1beta/{operation_name}", contentType: "application/json", media: "文本与单张起始图" },
];
@@ -73,7 +91,7 @@ export function modelProtocolSummary(value?: string) {
}
export function normalizeModelProtocol(value: unknown): ModelProtocol | undefined {
return typeof value === "string" && MODEL_PROTOCOLS.some((item) => item.value === value) ? value as ModelProtocol : undefined;
return typeof value === "string" && MODEL_PROTOCOLS.some((item) => item.value === value) ? (value as ModelProtocol) : undefined;
}
function protocolOptions(capability: ProtocolCapability) {