| package templates |
|
|
| import ( |
| "bytes" |
| "text/template" |
|
|
| "github.com/Masterminds/sprig/v3" |
| ) |
|
|
| type MultiModalOptions struct { |
| TotalImages int |
| TotalAudios int |
| TotalVideos int |
|
|
| ImagesInMessage int |
| AudiosInMessage int |
| VideosInMessage int |
| } |
|
|
| type MultimodalContent struct { |
| ID int |
| } |
|
|
| |
| |
| const DefaultMultiModalTemplate = "{{ range .Audio }}<__media__>{{end}}{{ range .Images }}<__media__>{{end}}{{ range .Video }}[vid-{{.ID}}]{{end}}{{.Text}}" |
|
|
| func TemplateMultiModal(templateString string, opts MultiModalOptions, text string) (string, error) { |
| if templateString == "" { |
| templateString = DefaultMultiModalTemplate |
| } |
|
|
| |
| tmpl, err := template.New("template").Funcs(sprig.FuncMap()).Parse(templateString) |
| if err != nil { |
| return "", err |
| } |
|
|
| videos := []MultimodalContent{} |
| for i := 0; i < opts.VideosInMessage; i++ { |
| videos = append(videos, MultimodalContent{ID: i + (opts.TotalVideos - opts.VideosInMessage)}) |
| } |
|
|
| audios := []MultimodalContent{} |
| for i := 0; i < opts.AudiosInMessage; i++ { |
| audios = append(audios, MultimodalContent{ID: i + (opts.TotalAudios - opts.AudiosInMessage)}) |
| } |
|
|
| images := []MultimodalContent{} |
| for i := 0; i < opts.ImagesInMessage; i++ { |
| images = append(images, MultimodalContent{ID: i + (opts.TotalImages - opts.ImagesInMessage)}) |
| } |
|
|
| result := bytes.NewBuffer(nil) |
| |
| err = tmpl.Execute(result, struct { |
| Audio []MultimodalContent |
| Images []MultimodalContent |
| Video []MultimodalContent |
| Text string |
| }{ |
| Audio: audios, |
| Images: images, |
| Video: videos, |
| Text: text, |
| }) |
| return result.String(), err |
| } |
|
|