"use client"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import type { CatalogModel, EmbeddingCapabilities } from "./SettingsContext"; import { nativeSelectClass, selectOptionClass } from "./shared"; const CUSTOM_DIM_SENTINEL = "__custom__"; const AUTO_DIM_SENTINEL = ""; function parseSupportedCsv(csv: string | undefined): number[] { if (!csv) return []; return csv .split(",") .map((s) => s.trim()) .filter(Boolean) .map((s) => Number(s)) .filter((n) => Number.isFinite(n) && n > 0); } function sourceBadge( source: string | undefined, t: (key: string) => string, ): { label: string; tone: "muted" | "ok" | "warn" } | null { if (source === "detected") { return { label: t("Source: detected from API probe"), tone: "ok" }; } return null; } export function DimensionField({ activeModel, activeBinding, capabilities, embeddingDefaultDim, inputClass, onChangeDimension, }: { activeModel: CatalogModel; activeBinding?: string; capabilities: EmbeddingCapabilities | null; embeddingDefaultDim: (binding?: string) => string; inputClass: string; onChangeDimension: (value: string) => void; }) { const { t } = useTranslation(); const fallback = embeddingDefaultDim(activeBinding); const rawValue = activeModel.dimension ?? ""; const isEmpty = rawValue === ""; const currentNum = isEmpty ? NaN : Number(rawValue); const liveSupported = capabilities?.supported_dimensions; const cachedSupported = parseSupportedCsv(activeModel.supported_dimensions); const supported = liveSupported && liveSupported.length > 0 ? liveSupported : cachedSupported; const supportsVariable = capabilities?.supports_variable_dimensions ?? supported.length > 1; const useDropdown = supported.length > 1 && supportsVariable; const currentInList = Number.isFinite(currentNum) && supported.includes(currentNum); const [customRequested, setCustomRequested] = useState(false); const customMode = customRequested || (useDropdown && !isEmpty && !currentInList); const detected = capabilities?.detected_dim; const showDetectedBadge = typeof detected === "number" && detected > 0 && detected !== currentNum && !isEmpty; const sourceInfo = sourceBadge(capabilities?.active_dim_source, t); const disabled = activeModel.send_dimensions === false; const handleSelect = (value: string) => { if (value === CUSTOM_DIM_SENTINEL) { setCustomRequested(true); return; } setCustomRequested(false); onChangeDimension(value); }; const dropdownValue = isEmpty ? AUTO_DIM_SENTINEL : currentInList ? String(currentNum) : CUSTOM_DIM_SENTINEL; return (
{useDropdown && !customMode ? ( ) : ( onChangeDimension(e.target.value)} disabled={disabled} inputMode="numeric" /> )} {useDropdown && customMode && ( )} {sourceInfo && (
{sourceInfo.label}
)} {showDetectedBadge && (
{t("Detected")}: {detected}d
)}
); }