| import type { ContentPart } from "shared/legacy-sdk"; |
| import { cleanSystemTags } from "shared/utils"; |
| import { getMediaTypeFromDataUri } from "./media-utils"; |
|
|
| export const Content = { |
| getText(input: string | ContentPart[]): string { |
| if (typeof input === "string") { |
| return cleanSystemTags(input); |
| } |
| const texts = input.filter((p): p is ContentPart & { type: "text" } => p.type === "text").map((p) => p.text); |
| return cleanSystemTags(texts.join("\n")); |
| }, |
|
|
| getImages(input: string | ContentPart[]): string[] { |
| if (typeof input === "string") { |
| return []; |
| } |
| return input.filter((p): p is ContentPart & { type: "image_url" } => p.type === "image_url").map((p) => p.image_url.url); |
| }, |
|
|
| getVideos(input: string | ContentPart[]): string[] { |
| if (typeof input === "string") { |
| return []; |
| } |
| return input.filter((p): p is ContentPart & { type: "video_url" } => p.type === "video_url").map((p) => p.video_url.url); |
| }, |
|
|
| hasImages(input: string | ContentPart[]): boolean { |
| return Content.getImages(input).length > 0; |
| }, |
|
|
| hasVideos(input: string | ContentPart[]): boolean { |
| return Content.getVideos(input).length > 0; |
| }, |
|
|
| hasMedia(input: string | ContentPart[]): boolean { |
| return Content.hasImages(input) || Content.hasVideos(input); |
| }, |
|
|
| build(text: string, mediaUrls: string[]): ContentPart[] { |
| const parts: ContentPart[] = []; |
| if (text.trim()) { |
| parts.push({ type: "text", text }); |
| } |
| for (const url of mediaUrls) { |
| const mediaType = getMediaTypeFromDataUri(url); |
| if (mediaType === "video") { |
| parts.push({ type: "video_url", video_url: { url } }); |
| } else { |
| parts.push({ type: "image_url", image_url: { url } }); |
| } |
| } |
| return parts; |
| }, |
|
|
| isEmpty(input: string | ContentPart[]): boolean { |
| return !Content.getText(input).trim() && !Content.hasMedia(input); |
| }, |
| }; |
|
|