export const PRODUCT_PLANNING_AI_MODEL_CONFIG_KEY = "product_planning_ai_model_config"; export const PRODUCT_PLANNING_AI_MODEL_DEFAULT_BASE_URL = "http://103.118.245.6:6081"; export const PRODUCT_PLANNING_AI_MODEL_DEFAULT_MODEL_ID = "Qwen3-VL-4B-Instruct"; export type ProductPlanningAiModelConfig = { enabled: boolean; providerName: string; baseUrl: string; apiKey: string; modelId: string; displayName: string; }; function normalizeUrl(value: unknown, fallback: string) { const normalized = String(value || "").trim().replace(/\/+$/, ""); const normalizedFallback = String(fallback || "").trim().replace(/\/+$/, ""); return normalized || normalizedFallback; } function normalizeSecret(value: unknown, fallback = "") { const normalized = String(value || "").trim(); const normalizedFallback = String(fallback || "").trim(); return normalized || normalizedFallback; } export function defaultProductPlanningAiModelConfig(): ProductPlanningAiModelConfig { return { enabled: false, providerName: "Product Planning Qwen3-VL", baseUrl: PRODUCT_PLANNING_AI_MODEL_DEFAULT_BASE_URL, apiKey: "", modelId: PRODUCT_PLANNING_AI_MODEL_DEFAULT_MODEL_ID, displayName: "商品策划专用 Qwen3-VL", }; } export function normalizeProductPlanningAiModelConfig( value: unknown, fallback?: Partial ): ProductPlanningAiModelConfig { const raw = value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {}; return { enabled: raw.enabled === true, providerName: normalizeSecret( raw.providerName, fallback?.providerName || defaultProductPlanningAiModelConfig().providerName ) || defaultProductPlanningAiModelConfig().providerName, baseUrl: normalizeUrl( raw.baseUrl, fallback?.baseUrl || PRODUCT_PLANNING_AI_MODEL_DEFAULT_BASE_URL ), apiKey: normalizeSecret(raw.apiKey, fallback?.apiKey || ""), modelId: normalizeSecret( raw.modelId, fallback?.modelId || PRODUCT_PLANNING_AI_MODEL_DEFAULT_MODEL_ID ) || PRODUCT_PLANNING_AI_MODEL_DEFAULT_MODEL_ID, displayName: normalizeSecret( raw.displayName, fallback?.displayName || defaultProductPlanningAiModelConfig().displayName ) || defaultProductPlanningAiModelConfig().displayName, }; } export function toProductPlanningOpenAIBaseUrl(baseUrl: string) { const normalized = normalizeUrl(baseUrl, PRODUCT_PLANNING_AI_MODEL_DEFAULT_BASE_URL); if (/\/v1$/i.test(normalized)) { return normalized; } return `${normalized}/v1`; }