Files
ttstd-infinite-canvas/backend/internal/service/service_workflow_results.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
}