export const DETAIL_AGENT_LOCAL_MOONSHOT_SETTING_KEY = "canvas_detail_agent_moonshot_config"; // Stable option id: keep the historical value so existing site settings remain valid. export const DETAIL_AGENT_LOCAL_MOONSHOT_OPTION_ID = "__moonshot_kimi_k25_local__"; export const DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL = "https://api.kimi.com/coding/v1"; export const DETAIL_AGENT_LOCAL_MOONSHOT_MODEL_ID = "kimi-for-coding"; export const DETAIL_AGENT_LOCAL_MOONSHOT_DISPLAY_NAME = "Kimi Code 编程套餐"; const LEGACY_MOONSHOT_BASE_URLS = new Set([ "https://api.moonshot.cn/v1", "https://api.moonshot.ai/v1", "https://api.moonshot.cn/v1/chat/completions", "https://api.moonshot.ai/v1/chat/completions", ]); export type DetailAgentLocalMoonshotConfig = { enabled: boolean; providerName: string; baseUrl: string; apiKey: string; modelId: string; displayName: string; }; export function isDetailAgentLocalMoonshotOption(value: unknown) { return String(value || "").trim() === DETAIL_AGENT_LOCAL_MOONSHOT_OPTION_ID; } function normalizeMoonshotModelId(value: unknown) { const modelId = String(value || "").trim(); if ( !modelId || modelId === "kimi-k2.5" || modelId === "kimi-k2.6" || modelId === "kimi-k2.7-code" || modelId === "kimi-k2.7-code-highspeed" ) { return DETAIL_AGENT_LOCAL_MOONSHOT_MODEL_ID; } return modelId; } export function normalizeDetailAgentLocalMoonshotBaseUrl(value: unknown) { const clean = String(value || "") .trim() .replace(/\/+$/, ""); if (!clean || LEGACY_MOONSHOT_BASE_URLS.has(clean)) { return DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL; } if (clean === `${DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL}/chat/completions`) { return DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL; } return clean; } export function isDetailAgentLocalMoonshotBaseUrl(value: unknown) { return ( normalizeDetailAgentLocalMoonshotBaseUrl(value) === DETAIL_AGENT_LOCAL_MOONSHOT_BASE_URL ); } function normalizeMoonshotDisplayName(value: unknown) { const displayName = String(value || "").trim(); if ( !displayName || displayName === "官方 Kimi K2.5" || displayName === "官方 Kimi K2.6" || displayName === "官方 Kimi K2.7 Code Highspeed" || displayName === "Kimi Code 编程套餐 K2.7 Highspeed" ) { return DETAIL_AGENT_LOCAL_MOONSHOT_DISPLAY_NAME; } return displayName; } export function normalizeDetailAgentLocalMoonshotConfig( value: unknown, ): DetailAgentLocalMoonshotConfig { const raw = value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {}; return { enabled: raw.enabled !== false, providerName: String(raw.providerName || "").trim() || "Kimi Code 编程套餐", baseUrl: normalizeDetailAgentLocalMoonshotBaseUrl(raw.baseUrl), apiKey: String(raw.apiKey || "").trim(), modelId: normalizeMoonshotModelId(raw.modelId), displayName: normalizeMoonshotDisplayName(raw.displayName), }; }