66 lines
3.5 KiB
Go
66 lines
3.5 KiB
Go
package service
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"infinite-canvas/backend/internal/model"
|
|
)
|
|
|
|
func buildAgentResult(task model.Task) (map[string]any, []map[string]any) {
|
|
title := strings.TrimSpace(task.Prompt)
|
|
if len([]rune(title)) > 28 {
|
|
title = string([]rune(title)[:28]) + "..."
|
|
}
|
|
result := map[string]any{
|
|
"taskId": task.ID,
|
|
"operation": task.Operation,
|
|
"provider": defaultString(task.Provider, "internal-agent"),
|
|
"model": defaultString(task.Model, "workflow-router"),
|
|
"plan": []map[string]any{
|
|
{"kind": "script", "title": "创意脚本", "content": task.Prompt},
|
|
{"kind": "scene", "title": "主场景", "content": "根据用户输入拆解为可生成的视频场景。"},
|
|
{"kind": "shot", "title": "镜头 1", "content": "建立画面、主体、风格和运镜。"},
|
|
{"kind": "final", "title": "成片", "content": "等待视频生成 Provider 回填成片结果。"},
|
|
},
|
|
}
|
|
ops := []map[string]any{
|
|
nodeOp("script-"+task.ID, "text", "剧本 · "+title, 0, 0, "script", task.Prompt),
|
|
nodeOp("scene-"+task.ID, "text", "场景 · 主场景", 380, 0, "scene", "主场景设定、角色关系、视觉风格。"),
|
|
nodeOpWithMetadata("shot-"+task.ID, "video", "分镜 · 镜头 1", 760, 0, map[string]any{"workflowKind": "shot", "status": "idle", "generationMode": "video", "prompt": task.Prompt, "composerContent": task.Prompt, "videoEditOperation": "text_to_video"}),
|
|
nodeOp("final-"+task.ID, "video", "成片 · 待生成", 1140, 0, "final", ""),
|
|
connectOp("script-"+task.ID, "scene-"+task.ID),
|
|
connectOp("scene-"+task.ID, "shot-"+task.ID),
|
|
connectOp("shot-"+task.ID, "final-"+task.ID),
|
|
}
|
|
return result, ops
|
|
}
|
|
|
|
func buildVideoWorkflowResult(task model.Task) (map[string]any, []map[string]any) {
|
|
title := strings.TrimSpace(task.Prompt)
|
|
if len([]rune(title)) > 28 {
|
|
title = string([]rune(title)[:28]) + "..."
|
|
}
|
|
operation := defaultString(task.Operation, strings.TrimPrefix(task.Type, "video_"))
|
|
result := map[string]any{
|
|
"taskId": task.ID,
|
|
"operation": operation,
|
|
"provider": defaultString(task.Provider, "internal-agent"),
|
|
"model": defaultString(task.Model, "workflow-router"),
|
|
"plan": []map[string]any{
|
|
{"kind": "reference_set", "title": "参考素材组", "content": "收集原视频、参考图、参考音频和版本样片。"},
|
|
{"kind": "shot", "title": "编辑镜头", "content": task.Prompt},
|
|
{"kind": "final", "title": "结果版本", "content": "等待 provider 生成或人工确认后回填版本结果。"},
|
|
},
|
|
}
|
|
ops := []map[string]any{
|
|
nodeOp("video-brief-"+task.ID, "text", "编辑需求 · "+title, 0, 0, "script", task.Prompt),
|
|
nodeOpWithMetadata("video-ref-"+task.ID, "text", "参考素材组", 380, 0, map[string]any{"workflowKind": "reference_set", "status": "idle", "content": "原片、参考图、参考音频、风格板或历史版本。", "videoEditOperation": operation}),
|
|
nodeOpWithMetadata("video-shot-"+task.ID, "video", "视频任务 · "+operation, 760, 0, map[string]any{"workflowKind": "shot", "status": "idle", "generationMode": "video", "prompt": task.Prompt, "composerContent": task.Prompt, "videoEditOperation": operation}),
|
|
nodeOpWithMetadata("video-result-"+task.ID, "video", "结果版本 · 待回填", 1140, 0, map[string]any{"workflowKind": "final", "status": "idle", "videoEditOperation": operation, "versionLabel": "v1"}),
|
|
connectOp("video-brief-"+task.ID, "video-ref-"+task.ID),
|
|
connectOp("video-ref-"+task.ID, "video-shot-"+task.ID),
|
|
connectOp("video-shot-"+task.ID, "video-result-"+task.ID),
|
|
}
|
|
return result, ops
|
|
}
|