|
|
|
@ -1,12 +1,32 @@ |
|
|
|
import { create } from "zustand"; |
|
|
|
import type { ModelInput, ModelParameter, ProviderModel, ModelCapability } from "@/lib/providers/types"; |
|
|
|
import { |
|
|
|
POPI_VIDEO_SUBTYPE_ENHANCE, |
|
|
|
POPI_VIDEO_SUBTYPE_ERASE_SUBTITLE, |
|
|
|
POPI_VIDEO_SUBTYPE_ERASE_SUBTITLE_PRO, |
|
|
|
POPI_VIDEO_SUBTYPE_FIRST_LAST_FRAME, |
|
|
|
POPI_VIDEO_SUBTYPE_IMAGE_TO_VIDEO, |
|
|
|
POPI_VIDEO_SUBTYPE_OMNI_REFERENCE, |
|
|
|
} from "@/constants/generationTask"; |
|
|
|
import { |
|
|
|
getPopiCapabilitiesForKind, |
|
|
|
getPopiKindForSubType, |
|
|
|
type PopiModelMediaKind, |
|
|
|
} from "@/utils/popiModelClassification"; |
|
|
|
|
|
|
|
export type PopiModelKind = "image" | "video" | "audio" | "3d" | "llm" | "multiAngle" | "highDefinition" | "outpainting" | "inpainting"; |
|
|
|
export type PopiModelKind = |
|
|
|
| "image" |
|
|
|
| "video" |
|
|
|
| "audio" |
|
|
|
| "3d" |
|
|
|
| "llm" |
|
|
|
| "multiAngle" |
|
|
|
| "highDefinition" |
|
|
|
| "outpainting" |
|
|
|
| "inpainting" |
|
|
|
| "videoEnhance" |
|
|
|
| "videoSmartErase" |
|
|
|
| "videoBoxErase"; |
|
|
|
export type PopiModelExtensionFields = Record<string, unknown> | unknown[]; |
|
|
|
|
|
|
|
interface ModelListState { |
|
|
|
@ -55,6 +75,9 @@ const emptyByKind: Record<PopiModelKind, ProviderModel[]> = { |
|
|
|
highDefinition: [], |
|
|
|
outpainting: [], |
|
|
|
inpainting: [], |
|
|
|
videoEnhance: [], |
|
|
|
videoSmartErase: [], |
|
|
|
videoBoxErase: [], |
|
|
|
}; |
|
|
|
|
|
|
|
let popiModelsRequest: Promise<ProviderModel[]> | null = null; |
|
|
|
@ -78,10 +101,18 @@ function hasPopiKind(model: ProviderModel, kind: PopiModelMediaKind): boolean { |
|
|
|
return hasCapability(model, getPopiCapabilitiesForKind(kind)); |
|
|
|
} |
|
|
|
|
|
|
|
function hasAnySubType(model: ProviderModel, subTypes: number[]): boolean { |
|
|
|
return getMetadataSubTypes(model).some((subType) => subTypes.includes(subType)); |
|
|
|
} |
|
|
|
|
|
|
|
function groupPopiModels(models: ProviderModel[]): Record<PopiModelKind, ProviderModel[]> { |
|
|
|
return { |
|
|
|
image: models.filter((model) => getMetadataSubTypes(model).some((subType) => subType === 102 || subType === 103)), |
|
|
|
video: models.filter((model) => getMetadataSubTypes(model).some((subType) => subType === 202 || subType === 203 || subType === 204)), |
|
|
|
video: models.filter((model) => hasAnySubType(model, [ |
|
|
|
POPI_VIDEO_SUBTYPE_IMAGE_TO_VIDEO, |
|
|
|
POPI_VIDEO_SUBTYPE_OMNI_REFERENCE, |
|
|
|
POPI_VIDEO_SUBTYPE_FIRST_LAST_FRAME, |
|
|
|
])), |
|
|
|
audio: models.filter((model) => hasPopiKind(model, "audio")), |
|
|
|
"3d": models.filter((model) => hasCapability(model, ["text-to-3d", "image-to-3d"])), |
|
|
|
llm: models.filter((model) => hasPopiKind(model, "llm") || Number(model.metadata?.type) === 5), |
|
|
|
@ -89,6 +120,9 @@ function groupPopiModels(models: ProviderModel[]): Record<PopiModelKind, Provide |
|
|
|
highDefinition: models.filter((model) => getMetadataSubTypes(model).includes(107)), |
|
|
|
outpainting: models.filter((model) => getMetadataSubTypes(model).includes(112)), |
|
|
|
inpainting: models.filter((model) => getMetadataSubTypes(model).includes(110)), |
|
|
|
videoEnhance: models.filter((model) => hasAnySubType(model, [POPI_VIDEO_SUBTYPE_ENHANCE])), |
|
|
|
videoSmartErase: models.filter((model) => hasAnySubType(model, [POPI_VIDEO_SUBTYPE_ERASE_SUBTITLE])), |
|
|
|
videoBoxErase: models.filter((model) => hasAnySubType(model, [POPI_VIDEO_SUBTYPE_ERASE_SUBTITLE_PRO])), |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|