Files
team-api/relay/constant/task.go
T

160 lines
6.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package constant
import "strings"
// TaskPlatform 异步任务平台类型
type TaskPlatform string
const (
TaskPlatformSora TaskPlatform = "sora"
TaskPlatformKling TaskPlatform = "kling"
TaskPlatformSuno TaskPlatform = "suno"
TaskPlatformMidjourney TaskPlatform = "midjourney"
TaskPlatformVolcengine TaskPlatform = "volcengine"
TaskPlatformAli TaskPlatform = "ali"
TaskPlatformGemini TaskPlatform = "gemini"
TaskPlatformMiniMax TaskPlatform = "minimax"
// TaskPlatformSyncImage 同步图片厂商异步化专用平台标记。
// 注意:故意不加入 ProviderTypeToTaskPlatform —— 它由 sync_image worker 池执行,
// 无上游任务 ID 可轮询,polling 轮询分支需跳过它。
TaskPlatformSyncImage TaskPlatform = "sync_image"
)
// TaskAction 异步任务动作类型
type TaskAction string
const (
TaskActionGenerate TaskAction = "generate" // 视频生成
TaskActionMusic TaskAction = "music" // 音乐生成
TaskActionLyrics TaskAction = "lyrics" // 歌词生成
// Midjourney 动作
TaskActionImagine TaskAction = "imagine"
TaskActionDescribe TaskAction = "describe"
TaskActionBlend TaskAction = "blend"
TaskActionUpscale TaskAction = "upscale"
TaskActionVariation TaskAction = "variation"
TaskActionReroll TaskAction = "reroll"
TaskActionInpaint TaskAction = "inpaint"
TaskActionModal TaskAction = "modal"
TaskActionZoom TaskAction = "zoom"
TaskActionCustomZoom TaskAction = "custom_zoom"
TaskActionShorten TaskAction = "shorten"
TaskActionHighVariation TaskAction = "high_variation"
TaskActionLowVariation TaskAction = "low_variation"
TaskActionPan TaskAction = "pan"
TaskActionSwapFace TaskAction = "swap_face"
TaskActionUpload TaskAction = "upload"
TaskActionVideo TaskAction = "video"
TaskActionEdits TaskAction = "edits"
)
// MjActions 合法的 Midjourney 动作集合
var MjActions = map[TaskAction]bool{
TaskActionImagine: true, TaskActionDescribe: true, TaskActionBlend: true,
TaskActionUpscale: true, TaskActionVariation: true, TaskActionReroll: true,
TaskActionInpaint: true, TaskActionModal: true, TaskActionZoom: true,
TaskActionCustomZoom: true, TaskActionShorten: true,
TaskActionHighVariation: true, TaskActionLowVariation: true,
TaskActionPan: true, TaskActionSwapFace: true, TaskActionUpload: true,
TaskActionVideo: true, TaskActionEdits: true,
}
// TaskStatus 异步任务状态
type TaskStatus string
const (
TaskStatusNotStart TaskStatus = "NOT_START"
TaskStatusSubmitted TaskStatus = "SUBMITTED"
TaskStatusQueued TaskStatus = "QUEUED"
TaskStatusInProgress TaskStatus = "IN_PROGRESS"
TaskStatusSuccess TaskStatus = "SUCCESS"
TaskStatusFailure TaskStatus = "FAILURE"
)
// IsTerminal 判断任务状态是否为终态
func (s TaskStatus) IsTerminal() bool {
return s == TaskStatusSuccess || s == TaskStatusFailure
}
// ProviderTypeToTaskPlatform 将供应商类型映射到异步任务平台
func ProviderTypeToTaskPlatform(p ProviderType) (TaskPlatform, bool) {
switch p {
case ProviderSora:
return TaskPlatformSora, true
case ProviderKling:
return TaskPlatformKling, true
case ProviderSuno:
return TaskPlatformSuno, true
case ProviderMidjourney:
return TaskPlatformMidjourney, true
case ProviderVolcengine:
return TaskPlatformVolcengine, true
case ProviderAli:
return TaskPlatformAli, true
case ProviderGemini:
return TaskPlatformGemini, true
case ProviderMiniMax:
return TaskPlatformMiniMax, true
default:
return "", false
}
}
// IsAsyncImageModel 判断某 provider + 模型的图片生成(RelayModeImagesGenerations)是否为
// 异步任务式(提交拿 task_id → 轮询取图)。此类模型的同步 /v1/images/generations 端点无法
// 一次性返回,必须走 /v1/images/generations/async 提交 + 轮询。
//
// 这是「图片必须走异步」的唯一判定源:同步端点拦截 gate(relay_handler)与租户模型列表的
// async_image 标记都调用它,保证在线体验示例与后端实际行为一致。
//
// 目前仅阿里云 DashScope 图片模型分两族:
// - 异步族(wanx*、qwen-image、qwen-image-plus、flux* 等):text2image/image-synthesis + 轮询
// - 同步 multimodal 族(qwen-image-2.x 系列):multimodal-generation/generation,一次性同步返回
//
// 故对 Ali 默认异步,qwen-image-2.x 系列除外。其他 provider 图片均为同步(含 Gemini Imagen)。
func IsAsyncImageModel(p ProviderType, model string) bool {
if p != ProviderAli {
return false
}
return !IsAliSyncMultimodalImageModel(model)
}
// IsAliSyncMultimodalImageModel 判断是否为阿里云 DashScope「multimodal messages」协议图片模型。
// 这类模型走同步 /api/v1/services/aigc/multimodal-generation/generation 端点,请求体为
// input.messages 格式、响应从 output.choices[].message.content[].image 取图;不走旧版
// text2image/image-synthesis(input.prompt)端点。本项目对它们统一用同步 multimodal 处理
// (同步端点直出 / 异步端点交 sync_image worker 池同步执行)。目前包含:
// - qwen-image-2.x 系列(qwen-image-2.0 / qwen-image-2.0-pro 等)
// - z-image 系列(z-image-turbo 等)
// - 万相新版协议图片模型:wan2.6-t2i、wan2.7-image / wan2.7-image-pro
//
// 注意:万相旧版图片模型(wan2.5-t2i-preview、wan2.2-t2i-*、wanx2.x-t2i-*)走旧版
// image-synthesis(input.prompt)异步协议,不在此列,由 taskchannel 的 buildImageRequest 处理。
//
// 该判定是「Ali multimodal 图片」的唯一真相源——同步端点拦截 gate、canPassThrough、
// isMultimodalImageMode、异步端点 worker 池路由、租户模型列表 async_image 标记均调用它,
// 改这一处即全链路生效。
func IsAliSyncMultimodalImageModel(model string) bool {
m := strings.ToLower(model)
return strings.HasPrefix(m, "qwen-image-2") ||
strings.HasPrefix(m, "z-image") ||
strings.HasPrefix(m, "wan2.6-t2i") ||
strings.HasPrefix(m, "wan2.7-image")
}
// RelayModeToTaskAction 将 RelayMode 映射到异步任务动作
func RelayModeToTaskAction(mode RelayMode) (TaskAction, bool) {
switch mode {
case RelayModeVideoGenerations:
return TaskActionGenerate, true
case RelayModeSunoSubmit:
return TaskActionMusic, true
case RelayModeMjSubmit:
return TaskActionImagine, true // 默认 imagine,具体由 URL action 覆盖
default:
return "", false
}
}