Files
ttstd-infinite-canvas/backend/internal/canvas/capability/builtin.go

80 lines
3.9 KiB
Go

package capability
const (
maxAgentNodeTitleRunes = 240
maxAgentNodeContentRunes = 16000
)
func BuiltinRegistry() *Registry {
registry, err := NewRegistry([]Descriptor{
{
Type: "text", Version: "1", Label: "文本", DefaultWidth: 340, DefaultHeight: 240,
InputKind: "text", Connection: ConnectionPolicy{CanSource: true}, CanUpdate: true,
SummaryFields: []string{"content"}, DetailFields: []string{"content"},
PatchFields: editableNodeFields("metadata.content", "正文", "节点正文"),
CreateMetadata: func(content string) map[string]any {
return map[string]any{"content": content, "status": "idle", "fontSize": float64(14)}
},
},
{
Type: "markdown", Version: "1", Label: "Markdown", DefaultWidth: 420, DefaultHeight: 320,
InputKind: "text", Connection: ConnectionPolicy{CanSource: true}, CanUpdate: true,
SummaryFields: []string{"content"}, DetailFields: []string{"content"},
PatchFields: editableNodeFields("metadata.content", "Markdown 正文", "Markdown 正文"),
},
generatedMediaDescriptor("image", "2", "图片", 720, 405, "image", ConnectionPolicy{
CanSource: true, CanTarget: true, CanReference: true, AcceptedInputKinds: []string{"text", "image"},
}),
generatedMediaDescriptor("video", "2", "视频", 720, 405, "video", ConnectionPolicy{
CanSource: true, CanTarget: true, CanReference: true, AcceptedInputKinds: []string{"text", "image", "video", "audio"},
}),
generatedMediaDescriptor("audio", "2", "音频", 340, 120, "audio", ConnectionPolicy{
CanSource: true, CanTarget: true, CanReference: true, MaxInputCount: 1, AcceptedInputKinds: []string{"text"},
}),
{
Type: "frame", Version: "1", Label: "背板", DefaultWidth: 760, DefaultHeight: 520,
SummaryFields: []string{"label"}, DetailFields: []string{"label"},
CreateMetadata: func(string) map[string]any {
return map[string]any{"frame": map[string]any{"collapsed": false, "expandedWidth": float64(760), "expandedHeight": float64(520)}}
},
},
{
Type: "script", Version: "1", Label: "分镜脚本", DefaultWidth: 920, DefaultHeight: 360,
SummaryFields: []string{"storyboard"}, DetailFields: []string{"storyboard"}, ProjectionKind: "storyboard", ProjectionField: "storyboard",
CreateMetadata: func(string) map[string]any {
return map[string]any{"status": "idle", "workflowKind": "script", "storyboard": map[string]any{"rows": []any{}, "visibleColumns": []any{"shotNumber", "durationSeconds", "videoMotionPrompt", "dialogue", "assets"}, "referenceNodeIds": []any{}}}
},
},
})
if err != nil {
panic(err)
}
return registry
}
func generatedMediaDescriptor(nodeType, version, label string, width, height float64, generationMode string, connection ConnectionPolicy) Descriptor {
return Descriptor{
Type: nodeType, Version: version, Label: label, DefaultWidth: width, DefaultHeight: height,
InputKind: nodeType, GenerationMode: generationMode, Connection: connection, CanUpdate: true,
SummaryFields: []string{"prompt", "composerContent", "assetTags", "referenceNodeIds"},
DetailFields: []string{"prompt", "composerContent", "assetTags", "referenceNodeIds"},
PatchFields: editableNodeFields("metadata.composerContent", "下一版提示词", "下次生成使用的提示词草稿;不覆盖已提交提示词或媒体结果"),
CreateMetadata: generatedMetadata,
}
}
func editableNodeFields(contentPath, contentLabel, contentDescription string) map[string]PatchField {
return map[string]PatchField{
"title": {
Path: "title", Kind: patchKindString, Label: "节点名称", Order: 10, Description: "节点标题", MaxRunes: maxAgentNodeTitleRunes,
},
"content": {
Path: contentPath, Kind: patchKindString, Label: contentLabel, Order: 20, Description: contentDescription, MaxRunes: maxAgentNodeContentRunes,
},
}
}
func generatedMetadata(prompt string) map[string]any {
return map[string]any{"content": "", "prompt": prompt, "composerContent": prompt, "status": "idle"}
}