import type { OpenClawConfig } from "../config/config.js"; import type { ModelApi } from "../config/types.models.js"; import { buildHuggingfaceModelDefinition, HUGGINGFACE_BASE_URL, HUGGINGFACE_MODEL_CATALOG, } from "../agents/huggingface-models.js"; import { buildQianfanProvider, buildXiaomiProvider, QIANFAN_DEFAULT_MODEL_ID, XIAOMI_DEFAULT_MODEL_ID, } from "../agents/models-config.providers.js"; import { buildSyntheticModelDefinition, SYNTHETIC_BASE_URL, SYNTHETIC_DEFAULT_MODEL_REF, SYNTHETIC_MODEL_CATALOG, } from "../agents/synthetic-models.js"; import { buildTogetherModelDefinition, TOGETHER_BASE_URL, TOGETHER_MODEL_CATALOG, } from "../agents/together-models.js"; import { buildVeniceModelDefinition, VENICE_BASE_URL, VENICE_DEFAULT_MODEL_REF, VENICE_MODEL_CATALOG, } from "../agents/venice-models.js"; import { HUGGINGFACE_DEFAULT_MODEL_REF, OPENROUTER_DEFAULT_MODEL_REF, TOGETHER_DEFAULT_MODEL_REF, XIAOMI_DEFAULT_MODEL_REF, ZAI_DEFAULT_MODEL_REF, XAI_DEFAULT_MODEL_REF, } from "./onboard-auth.credentials.js"; export { applyCloudflareAiGatewayConfig, applyCloudflareAiGatewayProviderConfig, applyVercelAiGatewayConfig, applyVercelAiGatewayProviderConfig, } from "./onboard-auth.config-gateways.js"; export { applyLitellmConfig, applyLitellmProviderConfig, LITELLM_BASE_URL, LITELLM_DEFAULT_MODEL_ID, } from "./onboard-auth.config-litellm.js"; import { applyProviderConfigWithDefaultModel } from "./onboard-auth.config-shared.js"; import { buildZaiModelDefinition, buildMoonshotModelDefinition, buildXaiModelDefinition, QIANFAN_BASE_URL, QIANFAN_DEFAULT_MODEL_REF, KIMI_CODING_MODEL_REF, MOONSHOT_BASE_URL, MOONSHOT_CN_BASE_URL, MOONSHOT_DEFAULT_MODEL_ID, MOONSHOT_DEFAULT_MODEL_REF, ZAI_DEFAULT_MODEL_ID, resolveZaiBaseUrl, XAI_BASE_URL, XAI_DEFAULT_MODEL_ID, } from "./onboard-auth.models.js"; export function applyZaiProviderConfig( cfg: OpenClawConfig, params?: { endpoint?: string; modelId?: string }, ): OpenClawConfig { const modelId = params?.modelId?.trim() || ZAI_DEFAULT_MODEL_ID; const modelRef = `zai/${modelId}`; const models = { ...cfg.agents?.defaults?.models }; models[modelRef] = { ...models[modelRef], alias: models[modelRef]?.alias ?? "GLM", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.zai; const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const defaultModels = [ buildZaiModelDefinition({ id: "glm-5" }), buildZaiModelDefinition({ id: "glm-4.7" }), buildZaiModelDefinition({ id: "glm-4.7-flash" }), buildZaiModelDefinition({ id: "glm-4.7-flashx" }), ]; const mergedModels = [...existingModels]; const seen = new Set(existingModels.map((m) => m.id)); for (const model of defaultModels) { if (!seen.has(model.id)) { mergedModels.push(model); seen.add(model.id); } } const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {}) as Record< string, unknown > as { apiKey?: string }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); const baseUrl = params?.endpoint ? resolveZaiBaseUrl(params.endpoint) : (typeof existingProvider?.baseUrl === "string" ? existingProvider.baseUrl : "") || resolveZaiBaseUrl(); providers.zai = { ...existingProviderRest, baseUrl, api: "openai-completions", ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : defaultModels, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } export function applyZaiConfig( cfg: OpenClawConfig, params?: { endpoint?: string; modelId?: string }, ): OpenClawConfig { const modelId = params?.modelId?.trim() || ZAI_DEFAULT_MODEL_ID; const modelRef = modelId === ZAI_DEFAULT_MODEL_ID ? ZAI_DEFAULT_MODEL_REF : `zai/${modelId}`; const next = applyZaiProviderConfig(cfg, params); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: modelRef, }, }, }, }; } export function applyOpenrouterProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[OPENROUTER_DEFAULT_MODEL_REF] = { ...models[OPENROUTER_DEFAULT_MODEL_REF], alias: models[OPENROUTER_DEFAULT_MODEL_REF]?.alias ?? "OpenRouter", }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, }; } export function applyOpenrouterConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyOpenrouterProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: OPENROUTER_DEFAULT_MODEL_REF, }, }, }, }; } export function applyMoonshotProviderConfig(cfg: OpenClawConfig): OpenClawConfig { return applyMoonshotProviderConfigWithBaseUrl(cfg, MOONSHOT_BASE_URL); } export function applyMoonshotProviderConfigCn(cfg: OpenClawConfig): OpenClawConfig { return applyMoonshotProviderConfigWithBaseUrl(cfg, MOONSHOT_CN_BASE_URL); } function applyMoonshotProviderConfigWithBaseUrl( cfg: OpenClawConfig, baseUrl: string, ): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[MOONSHOT_DEFAULT_MODEL_REF] = { ...models[MOONSHOT_DEFAULT_MODEL_REF], alias: models[MOONSHOT_DEFAULT_MODEL_REF]?.alias ?? "Kimi", }; const defaultModel = buildMoonshotModelDefinition(); return applyProviderConfigWithDefaultModel(cfg, { agentModels: models, providerId: "moonshot", api: "openai-completions", baseUrl, defaultModel, defaultModelId: MOONSHOT_DEFAULT_MODEL_ID, }); } export function applyMoonshotConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyMoonshotProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: MOONSHOT_DEFAULT_MODEL_REF, }, }, }, }; } export function applyMoonshotConfigCn(cfg: OpenClawConfig): OpenClawConfig { const next = applyMoonshotProviderConfigCn(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: MOONSHOT_DEFAULT_MODEL_REF, }, }, }, }; } export function applyKimiCodeProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[KIMI_CODING_MODEL_REF] = { ...models[KIMI_CODING_MODEL_REF], alias: models[KIMI_CODING_MODEL_REF]?.alias ?? "Kimi K2.5", }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, }; } export function applyKimiCodeConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyKimiCodeProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: KIMI_CODING_MODEL_REF, }, }, }, }; } export function applySyntheticProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[SYNTHETIC_DEFAULT_MODEL_REF] = { ...models[SYNTHETIC_DEFAULT_MODEL_REF], alias: models[SYNTHETIC_DEFAULT_MODEL_REF]?.alias ?? "MiniMax M2.1", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.synthetic; const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const syntheticModels = SYNTHETIC_MODEL_CATALOG.map(buildSyntheticModelDefinition); const mergedModels = [ ...existingModels, ...syntheticModels.filter( (model) => !existingModels.some((existing) => existing.id === model.id), ), ]; const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {}) as Record< string, unknown > as { apiKey?: string }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); providers.synthetic = { ...existingProviderRest, baseUrl: SYNTHETIC_BASE_URL, api: "anthropic-messages", ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : syntheticModels, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } export function applySyntheticConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applySyntheticProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: SYNTHETIC_DEFAULT_MODEL_REF, }, }, }, }; } export function applyXiaomiProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[XIAOMI_DEFAULT_MODEL_REF] = { ...models[XIAOMI_DEFAULT_MODEL_REF], alias: models[XIAOMI_DEFAULT_MODEL_REF]?.alias ?? "Xiaomi", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.xiaomi; const defaultProvider = buildXiaomiProvider(); const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const defaultModels = defaultProvider.models ?? []; const hasDefaultModel = existingModels.some((model) => model.id === XIAOMI_DEFAULT_MODEL_ID); const mergedModels = existingModels.length > 0 ? hasDefaultModel ? existingModels : [...existingModels, ...defaultModels] : defaultModels; const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {}) as Record< string, unknown > as { apiKey?: string }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); providers.xiaomi = { ...existingProviderRest, baseUrl: defaultProvider.baseUrl, api: defaultProvider.api, ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : defaultProvider.models, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } export function applyXiaomiConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyXiaomiProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: XIAOMI_DEFAULT_MODEL_REF, }, }, }, }; } /** * Apply Venice provider configuration without changing the default model. * Registers Venice models and sets up the provider, but preserves existing model selection. */ export function applyVeniceProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[VENICE_DEFAULT_MODEL_REF] = { ...models[VENICE_DEFAULT_MODEL_REF], alias: models[VENICE_DEFAULT_MODEL_REF]?.alias ?? "Llama 3.3 70B", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.venice; const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const veniceModels = VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition); const mergedModels = [ ...existingModels, ...veniceModels.filter((model) => !existingModels.some((existing) => existing.id === model.id)), ]; const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {}) as Record< string, unknown > as { apiKey?: string }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); providers.venice = { ...existingProviderRest, baseUrl: VENICE_BASE_URL, api: "openai-completions", ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : veniceModels, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } /** * Apply Venice provider configuration AND set Venice as the default model. * Use this when Venice is the primary provider choice during onboarding. */ export function applyVeniceConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyVeniceProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: VENICE_DEFAULT_MODEL_REF, }, }, }, }; } /** * Apply Together provider configuration without changing the default model. * Registers Together models and sets up the provider, but preserves existing model selection. */ export function applyTogetherProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[TOGETHER_DEFAULT_MODEL_REF] = { ...models[TOGETHER_DEFAULT_MODEL_REF], alias: models[TOGETHER_DEFAULT_MODEL_REF]?.alias ?? "Together AI", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.together; const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const togetherModels = TOGETHER_MODEL_CATALOG.map(buildTogetherModelDefinition); const mergedModels = [ ...existingModels, ...togetherModels.filter( (model) => !existingModels.some((existing) => existing.id === model.id), ), ]; const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {}) as Record< string, unknown > as { apiKey?: string }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); providers.together = { ...existingProviderRest, baseUrl: TOGETHER_BASE_URL, api: "openai-completions", ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : togetherModels, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } /** * Apply Together provider configuration AND set Together as the default model. * Use this when Together is the primary provider choice during onboarding. */ export function applyTogetherConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyTogetherProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: TOGETHER_DEFAULT_MODEL_REF, }, }, }, }; } /** * Apply Hugging Face (Inference Providers) provider configuration without changing the default model. */ export function applyHuggingfaceProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[HUGGINGFACE_DEFAULT_MODEL_REF] = { ...models[HUGGINGFACE_DEFAULT_MODEL_REF], alias: models[HUGGINGFACE_DEFAULT_MODEL_REF]?.alias ?? "Hugging Face", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.huggingface; const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const hfModels = HUGGINGFACE_MODEL_CATALOG.map(buildHuggingfaceModelDefinition); const mergedModels = [ ...existingModels, ...hfModels.filter((model) => !existingModels.some((existing) => existing.id === model.id)), ]; const { apiKey: existingApiKey, ...existingProviderRest } = (existingProvider ?? {}) as Record< string, unknown > as { apiKey?: string }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); providers.huggingface = { ...existingProviderRest, baseUrl: HUGGINGFACE_BASE_URL, api: "openai-completions", ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : hfModels, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } /** * Apply Hugging Face provider configuration AND set Hugging Face as the default model. */ export function applyHuggingfaceConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyHuggingfaceProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: HUGGINGFACE_DEFAULT_MODEL_REF, }, }, }, }; } export function applyXaiProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[XAI_DEFAULT_MODEL_REF] = { ...models[XAI_DEFAULT_MODEL_REF], alias: models[XAI_DEFAULT_MODEL_REF]?.alias ?? "Grok", }; const defaultModel = buildXaiModelDefinition(); return applyProviderConfigWithDefaultModel(cfg, { agentModels: models, providerId: "xai", api: "openai-completions", baseUrl: XAI_BASE_URL, defaultModel, defaultModelId: XAI_DEFAULT_MODEL_ID, }); } export function applyXaiConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyXaiProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: XAI_DEFAULT_MODEL_REF, }, }, }, }; } export function applyAuthProfileConfig( cfg: OpenClawConfig, params: { profileId: string; provider: string; mode: "api_key" | "oauth" | "token"; email?: string; preferProfileFirst?: boolean; }, ): OpenClawConfig { const profiles = { ...cfg.auth?.profiles, [params.profileId]: { provider: params.provider, mode: params.mode, ...(params.email ? { email: params.email } : {}), }, }; // Only maintain `auth.order` when the user explicitly configured it. // Default behavior: no explicit order -> resolveAuthProfileOrder can round-robin by lastUsed. const existingProviderOrder = cfg.auth?.order?.[params.provider]; const preferProfileFirst = params.preferProfileFirst ?? true; const reorderedProviderOrder = existingProviderOrder && preferProfileFirst ? [ params.profileId, ...existingProviderOrder.filter((profileId) => profileId !== params.profileId), ] : existingProviderOrder; const order = existingProviderOrder !== undefined ? { ...cfg.auth?.order, [params.provider]: reorderedProviderOrder?.includes(params.profileId) ? reorderedProviderOrder : [...(reorderedProviderOrder ?? []), params.profileId], } : cfg.auth?.order; return { ...cfg, auth: { ...cfg.auth, profiles, ...(order ? { order } : {}), }, }; } export function applyQianfanProviderConfig(cfg: OpenClawConfig): OpenClawConfig { const models = { ...cfg.agents?.defaults?.models }; models[QIANFAN_DEFAULT_MODEL_REF] = { ...models[QIANFAN_DEFAULT_MODEL_REF], alias: models[QIANFAN_DEFAULT_MODEL_REF]?.alias ?? "QIANFAN", }; const providers = { ...cfg.models?.providers }; const existingProvider = providers.qianfan; const defaultProvider = buildQianfanProvider(); const existingModels = Array.isArray(existingProvider?.models) ? existingProvider.models : []; const defaultModels = defaultProvider.models ?? []; const hasDefaultModel = existingModels.some((model) => model.id === QIANFAN_DEFAULT_MODEL_ID); const mergedModels = existingModels.length > 0 ? hasDefaultModel ? existingModels : [...existingModels, ...defaultModels] : defaultModels; const { apiKey: existingApiKey, baseUrl: existingBaseUrl, api: existingApi, ...existingProviderRest } = (existingProvider ?? {}) as Record as { apiKey?: string; baseUrl?: string; api?: ModelApi; }; const resolvedApiKey = typeof existingApiKey === "string" ? existingApiKey : undefined; const normalizedApiKey = resolvedApiKey?.trim(); providers.qianfan = { ...existingProviderRest, baseUrl: existingBaseUrl ?? QIANFAN_BASE_URL, api: existingApi ?? "openai-completions", ...(normalizedApiKey ? { apiKey: normalizedApiKey } : {}), models: mergedModels.length > 0 ? mergedModels : defaultProvider.models, }; return { ...cfg, agents: { ...cfg.agents, defaults: { ...cfg.agents?.defaults, models, }, }, models: { mode: cfg.models?.mode ?? "merge", providers, }, }; } export function applyQianfanConfig(cfg: OpenClawConfig): OpenClawConfig { const next = applyQianfanProviderConfig(cfg); const existingModel = next.agents?.defaults?.model; return { ...next, agents: { ...next.agents, defaults: { ...next.agents?.defaults, model: { ...(existingModel && "fallbacks" in (existingModel as Record) ? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks, } : undefined), primary: QIANFAN_DEFAULT_MODEL_REF, }, }, }, }; }