ai-chatbot/lib/product-planning/model-config.ts
Your Name cd44deb8c4
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: add dedicated model for product planning
2026-03-26 17:42:38 +08:00

78 lines
2.6 KiB
TypeScript

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>
): ProductPlanningAiModelConfig {
const raw =
value && typeof value === "object" && !Array.isArray(value)
? (value as Record<string, unknown>)
: {};
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`;
}