6 changed files with 130 additions and 16 deletions
@ -0,0 +1,101 @@ |
|||||
|
import type { LLMModelType, NodeType, SelectedModel, WorkflowNodeData } from "@/types"; |
||||
|
import type { ProviderModel } from "@/lib/providers/types"; |
||||
|
import { isPopiProviderMode, POPI_PROVIDER_ID } from "@/lib/providerMode"; |
||||
|
import { useModelStore, type PopiModelKind } from "@/store/modelStore"; |
||||
|
import { loadNodeDefaults } from "@/store/utils/localStorage"; |
||||
|
import { |
||||
|
POPISERVER_DEFAULT_AUDIO_MODEL_ID, |
||||
|
POPISERVER_DEFAULT_IMAGE_MODEL_ID, |
||||
|
POPISERVER_DEFAULT_LLM_MODEL_ID, |
||||
|
POPISERVER_DEFAULT_VIDEO_MODEL_ID, |
||||
|
} from "@/store/utils/defaultImageModel"; |
||||
|
|
||||
|
type GenerationNodeType = "nanoBanana" | "generateVideo" | "generateAudio" | "llmGenerate"; |
||||
|
|
||||
|
function getKindForNodeType(type: NodeType): PopiModelKind | null { |
||||
|
if (type === "nanoBanana") return "image"; |
||||
|
if (type === "generateVideo") return "video"; |
||||
|
if (type === "generateAudio") return "audio"; |
||||
|
if (type === "llmGenerate") return "llm"; |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
function getConfiguredPopiModelId(type: GenerationNodeType): string | null { |
||||
|
const defaults = loadNodeDefaults(); |
||||
|
if (type === "nanoBanana") { |
||||
|
const model = defaults.generateImage?.selectedModel; |
||||
|
return model?.provider === POPI_PROVIDER_ID && model.modelId ? model.modelId : null; |
||||
|
} |
||||
|
if (type === "generateVideo") { |
||||
|
const model = defaults.generateVideo?.selectedModel; |
||||
|
return model?.provider === POPI_PROVIDER_ID && model.modelId ? model.modelId : null; |
||||
|
} |
||||
|
if (type === "generateAudio") { |
||||
|
const model = defaults.generateAudio?.selectedModel; |
||||
|
return model?.provider === POPI_PROVIDER_ID && model.modelId ? model.modelId : null; |
||||
|
} |
||||
|
const llm = defaults.llm; |
||||
|
return llm?.provider === POPI_PROVIDER_ID && llm.model ? llm.model : null; |
||||
|
} |
||||
|
|
||||
|
function getCodeDefaultPopiModelId(type: GenerationNodeType): string { |
||||
|
if (type === "nanoBanana") return POPISERVER_DEFAULT_IMAGE_MODEL_ID; |
||||
|
if (type === "generateVideo") return POPISERVER_DEFAULT_VIDEO_MODEL_ID; |
||||
|
if (type === "generateAudio") return POPISERVER_DEFAULT_AUDIO_MODEL_ID; |
||||
|
return POPISERVER_DEFAULT_LLM_MODEL_ID; |
||||
|
} |
||||
|
|
||||
|
function matchesConfiguredModel(model: ProviderModel, configuredModelId: string): boolean { |
||||
|
return ( |
||||
|
model.id === configuredModelId || |
||||
|
String(model.metadata?.aiModelId ?? "") === configuredModelId || |
||||
|
String(model.metadata?.aiModelCode ?? "") === configuredModelId || |
||||
|
String(model.metadata?.aiModelCodeAlias ?? "") === configuredModelId |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
function providerModelToSelectedModel(model: ProviderModel): SelectedModel { |
||||
|
return { |
||||
|
provider: model.provider, |
||||
|
modelId: model.id, |
||||
|
displayName: model.name, |
||||
|
capabilities: model.capabilities, |
||||
|
metadata: model.metadata, |
||||
|
pricing: model.pricing |
||||
|
? { |
||||
|
type: model.pricing.type, |
||||
|
amount: model.pricing.amount, |
||||
|
variants: model.pricing.variants, |
||||
|
} |
||||
|
: undefined, |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
export async function buildDefaultGenerationNodeData( |
||||
|
type: NodeType |
||||
|
): Promise<Partial<WorkflowNodeData> | undefined> { |
||||
|
if (!isPopiProviderMode()) return undefined; |
||||
|
|
||||
|
const kind = getKindForNodeType(type); |
||||
|
if (!kind || kind === "3d") return undefined; |
||||
|
|
||||
|
const generationType = type as GenerationNodeType; |
||||
|
await useModelStore.getState().initializePopiModels(); |
||||
|
|
||||
|
const models = useModelStore.getState().byKind[kind]; |
||||
|
if (models.length === 0) return undefined; |
||||
|
|
||||
|
const preferredModelId = getConfiguredPopiModelId(generationType) ?? getCodeDefaultPopiModelId(generationType); |
||||
|
const model = models.find((item) => matchesConfiguredModel(item, preferredModelId)) ?? models[0]; |
||||
|
const selectedModel = providerModelToSelectedModel(model); |
||||
|
|
||||
|
if (generationType === "llmGenerate") { |
||||
|
return { |
||||
|
provider: POPI_PROVIDER_ID, |
||||
|
model: selectedModel.modelId as LLMModelType, |
||||
|
selectedModel, |
||||
|
} as Partial<WorkflowNodeData>; |
||||
|
} |
||||
|
|
||||
|
return { selectedModel } as Partial<WorkflowNodeData>; |
||||
|
} |
||||
Loading…
Reference in new issue