setIsPromptHovered(true)}
- onMouseLeave={() => setIsPromptHovered(false)}
- onClick={() => {
- if (!prompt) return;
- navigator.clipboard.writeText(prompt).catch(() => {});
- toast.success("Prompt copied");
- }}
- >
- {promptLoading ? (
-
-
-
- Loading prompt...
-
+ <>
+ {/* Prompt */}
+
+
+ Prompt
+
+
setIsPromptHovered(true)}
+ onMouseLeave={() => setIsPromptHovered(false)}
+ onClick={() => {
+ if (!prompt) return;
+ navigator.clipboard.writeText(prompt).catch(() => {});
+ toast.success("Prompt copied");
+ }}
+ >
+ {promptLoading ? (
+
+
+
+ Loading prompt...
+
+
+ ) : (
+ prompt || (
+
No prompt
+ )
+ )}
+
+
+ {!promptLoading && (
+
- ) : (
- prompt || (
-
No prompt
- )
)}
- {!promptLoading && (
-
-
-
-
Copy prompt
+ {/* Context Images */}
+ {contextImages && contextImages.length > 0 && (
+
+
+ Reference Images
+
+
+ {contextImages.map((contextImage, index) => {
+ const thumbnailUrl = contextImage.media_links
+ .maybe_thumbnail_template
+ ? contextImage.media_links.maybe_thumbnail_template.replace(
+ "{WIDTH}",
+ "128"
+ )
+ : contextImage.media_links.cdn_url;
+
+ const fullSizeUrl = contextImage.media_links
+ .maybe_thumbnail_template
+ ? contextImage.media_links.maybe_thumbnail_template.replace(
+ "{WIDTH}",
+ "512"
+ )
+ : contextImage.media_links.cdn_url;
+
+ return (
+ // Hover preview
+
+
+

+
+ {contextImage.semantic && (
+
+ {contextImage.semantic}
+
+ )}
+
+ }
+ position="top"
+ delay={300}
+ closeOnClick={true}
+ >
+
{
+ window.open(
+ contextImage.media_links.cdn_url,
+ "_blank"
+ );
+ }}
+ >
+
+

+
+
+
+ );
+ })}
)}
-
+
+ {/* Generation Details */}
+ {(generationProvider || modelType) && (
+
+
+ Generation Details
+
+
+ {modelType && (
+
+
+ Model
+
+
+ {getModelCreatorIcon(modelType)}
+
+ {getModelDisplayName(modelType)}
+
+
+
+ )}
+ {generationProvider && (
+
+
+ Provider
+
+
+ {getProviderDisplayName(generationProvider)}
+
+
+ )}
+
+
+ )}
+ >
)}
+
{additionalInfo}
diff --git a/frontend/libs/model-list/src/index.ts b/frontend/libs/model-list/src/index.ts
index 0214fc4184..94eea6b676 100644
--- a/frontend/libs/model-list/src/index.ts
+++ b/frontend/libs/model-list/src/index.ts
@@ -4,3 +4,4 @@ export * from "./lib/ModelCreator.js";
export * from "./lib/ImageModels.js";
export * from "./lib/VideoModels.js";
export * from "./lib/ModelCreatorIcons.js";
+export * from "./lib/ModelTypeMapping.js";
diff --git a/frontend/libs/model-list/src/lib/ModelCreator.ts b/frontend/libs/model-list/src/lib/ModelCreator.ts
index 4e4bfd4f22..d7139e9fd9 100644
--- a/frontend/libs/model-list/src/lib/ModelCreator.ts
+++ b/frontend/libs/model-list/src/lib/ModelCreator.ts
@@ -1,4 +1,3 @@
-
export enum ModelCreator {
BlackForestLabs = "BlackForestLabs",
Bytedance = "Bytedance",
@@ -9,4 +8,6 @@ export enum ModelCreator {
OpenAi = "OpenAi",
Runway = "Runway",
Stability = "Stability",
+ Tencent = "Tencent",
+ Recraft = "Recraft",
}
diff --git a/frontend/libs/model-list/src/lib/ModelCreatorIcons.ts b/frontend/libs/model-list/src/lib/ModelCreatorIcons.ts
index 7982a43817..53738b40c2 100644
--- a/frontend/libs/model-list/src/lib/ModelCreatorIcons.ts
+++ b/frontend/libs/model-list/src/lib/ModelCreatorIcons.ts
@@ -9,6 +9,8 @@ export const CREATOR_ICON_PATHS: Partial
> = {
[ModelCreator.OpenAi]: "/resources/images/services/openai.svg",
[ModelCreator.Bytedance]: "/resources/images/services/bytedance.svg",
[ModelCreator.Google]: "/resources/images/services/google.svg",
+ [ModelCreator.Recraft]: "/resources/images/services/recraft.svg",
+ [ModelCreator.Tencent]: "/resources/images/services/tencent.svg",
};
export const getCreatorIconPath = (creator: ModelCreator): string | undefined =>
diff --git a/frontend/libs/model-list/src/lib/ModelTypeMapping.ts b/frontend/libs/model-list/src/lib/ModelTypeMapping.ts
new file mode 100644
index 0000000000..a100bfcedc
--- /dev/null
+++ b/frontend/libs/model-list/src/lib/ModelTypeMapping.ts
@@ -0,0 +1,94 @@
+import React from "react";
+import { ModelCreator } from "./ModelCreator.js";
+import { getCreatorIcon } from "./ModelCreatorIcons.js";
+
+// Map from model type strings to ModelCreator enum values
+export const MODEL_TYPE_TO_CREATOR: Record = {
+ flux_1_dev: ModelCreator.BlackForestLabs,
+ flux_1_schnell: ModelCreator.BlackForestLabs,
+ flux_pro_1p1: ModelCreator.BlackForestLabs,
+ flux_pro_1p1_ultra: ModelCreator.BlackForestLabs,
+ gpt_image_1: ModelCreator.OpenAi,
+ kling_1p6_pro: ModelCreator.Kling,
+ kling_2p1_pro: ModelCreator.Kling,
+ kling_2p1_master: ModelCreator.Kling,
+ seedance_1p0_lite: ModelCreator.Bytedance,
+ veo_2: ModelCreator.Google,
+ recraft_3: ModelCreator.Recraft,
+ hunyuan_3d: ModelCreator.Tencent,
+};
+
+// Get creator icon for a model type
+export const getModelCreatorIcon = (
+ modelType: string
+): React.ReactNode | null => {
+ const creator = MODEL_TYPE_TO_CREATOR[modelType];
+ if (!creator) return null;
+ return getCreatorIcon(creator, "h-4 w-4 invert");
+};
+
+// Get creator name for display
+export const getModelCreatorName = (modelType: string): string | null => {
+ const creator = MODEL_TYPE_TO_CREATOR[modelType];
+
+ // Convert enum value to display name
+ switch (creator) {
+ case ModelCreator.BlackForestLabs:
+ return "Black Forest Labs";
+ case ModelCreator.OpenAi:
+ return "OpenAI";
+ case ModelCreator.Kling:
+ return "Kling AI";
+ case ModelCreator.Bytedance:
+ return "ByteDance";
+ case ModelCreator.Google:
+ return "Google";
+ case ModelCreator.Midjourney:
+ return "Midjourney";
+ case ModelCreator.Stability:
+ return "Stability AI";
+ case ModelCreator.Runway:
+ return "Runway";
+ case ModelCreator.Hailuo:
+ return "Hailuo";
+ case ModelCreator.Recraft:
+ return "Recraft";
+ case ModelCreator.Tencent:
+ return "Tencent";
+ default:
+ return creator;
+ }
+};
+
+// Convert model type string to human-readable display name
+export const getModelDisplayName = (modelType: string): string => {
+ const displayNames: Record = {
+ flux_1_dev: "Flux 1 Dev",
+ flux_1_schnell: "Flux 1 Schnell",
+ flux_pro_1p1: "Flux Pro 1.1",
+ flux_pro_1p1_ultra: "Flux Pro 1.1 Ultra",
+ gpt_image_1: "GPT Image 1",
+ kling_1p6_pro: "Kling 1.6 Pro",
+ kling_2p1_pro: "Kling 2.1 Pro",
+ kling_2p1_master: "Kling 2.1 Master",
+ seedance_1p0_lite: "Seedance 1.0 Lite",
+ veo_2: "Veo 2",
+ recraft_3: "Recraft 3",
+ hunyuan_3d_2p0: "Hunyuan 3D 2.0",
+ hunyuan_3d_2p1: "Hunyuan 3D 2.1",
+ hunyuan_3d: "Hunyuan 3D",
+ };
+
+ return displayNames[modelType] || modelType;
+};
+
+// Convert provider string to human-readable display name
+export const getProviderDisplayName = (provider: string): string => {
+ const displayNames: Record = {
+ artcraft: "ArtCraft",
+ fal: "FAL",
+ sora: "Sora",
+ };
+
+ return displayNames[provider] || provider;
+};