11import React from "react" ;
2- import { Code , FileSliders , Image } from "lucide-react" ;
2+ import { Atom , Code , FileText , Film , Image , Music } from "lucide-react" ;
33import { OperatorI } from "./operator.model" ;
44import { formatDateTime } from "@/utils/unit.ts" ;
55
@@ -11,17 +11,73 @@ const getOperatorVisual = (
1111 const inputs = ( op ?. inputs || "" ) . toLowerCase ( ) ;
1212 const outputs = ( op ?. outputs || "" ) . toLowerCase ( ) ;
1313
14+ // 后端固定的分类 ID,兼容 categories 传 UUID 的情况
15+ const CATEGORY_IDS = {
16+ text : "d8a5df7a-52a9-42c2-83c4-01062e60f597" ,
17+ image : "de36b61c-9e8a-4422-8c31-d30585c7100f" ,
18+ audio : "42dd9392-73e4-458c-81ff-41751ada47b5" ,
19+ video : "a233d584-73c8-4188-ad5d-8f7c8dda9c27" ,
20+ } as const ;
21+
22+ const hasCategoryId = ( key : keyof typeof CATEGORY_IDS ) =>
23+ ( op ?. categories || [ ] ) . some ( ( c ) => c === CATEGORY_IDS [ key ] ) ;
24+
25+ const isMultimodal =
26+ [ "multimodal" , "multi" , "多模态" ] . some ( ( k ) =>
27+ type . includes ( k )
28+ ) ||
29+ categories . some ( ( c ) => c . includes ( "multimodal" ) || c . includes ( "多模态" ) ) ||
30+ inputs . includes ( "multimodal" ) ||
31+ outputs . includes ( "multimodal" ) ;
32+
33+ const isVideoOp =
34+ [ "video" , "视频" ] . includes ( type ) ||
35+ categories . some ( ( c ) => c . includes ( "video" ) || c . includes ( "视频" ) ) ||
36+ inputs . includes ( "video" ) ||
37+ outputs . includes ( "video" ) ||
38+ hasCategoryId ( "video" ) ;
39+
40+ const isAudioOp =
41+ [ "audio" , "音频" ] . includes ( type ) ||
42+ categories . some ( ( c ) => c . includes ( "audio" ) || c . includes ( "音频" ) ) ||
43+ inputs . includes ( "audio" ) ||
44+ outputs . includes ( "audio" ) ||
45+ hasCategoryId ( "audio" ) ;
46+
1447 const isImageOp =
1548 [ "image" , "图像" , "图像类" ] . includes ( type ) ||
1649 categories . some ( ( c ) => c . includes ( "image" ) || c . includes ( "图像" ) ) ||
1750 inputs . includes ( "image" ) ||
18- outputs . includes ( "image" ) ;
51+ outputs . includes ( "image" ) ||
52+ hasCategoryId ( "image" ) ;
1953
2054 const isTextOp =
2155 [ "text" , "文本" , "文本类" ] . includes ( type ) ||
2256 categories . some ( ( c ) => c . includes ( "text" ) || c . includes ( "文本" ) ) ||
2357 inputs . includes ( "text" ) ||
24- outputs . includes ( "text" ) ;
58+ outputs . includes ( "text" ) ||
59+ hasCategoryId ( "text" ) ;
60+
61+ if ( isMultimodal ) {
62+ return {
63+ icon : < Atom className = "w-full h-full" /> ,
64+ iconColor : "#F472B6" ,
65+ } ;
66+ }
67+
68+ if ( isVideoOp ) {
69+ return {
70+ icon : < Film className = "w-full h-full" /> ,
71+ iconColor : "#22D3EE" ,
72+ } ;
73+ }
74+
75+ if ( isAudioOp ) {
76+ return {
77+ icon : < Music className = "w-full h-full" /> ,
78+ iconColor : "#F59E0B" ,
79+ } ;
80+ }
2581
2682 if ( isImageOp ) {
2783 return {
@@ -32,7 +88,7 @@ const getOperatorVisual = (
3288
3389 if ( isTextOp ) {
3490 return {
35- icon : < FileSliders className = "w-full h-full" /> ,
91+ icon : < FileText className = "w-full h-full" /> ,
3692 iconColor : "#A78BFA" , // 文本算子背景色
3793 } ;
3894 }
0 commit comments