























@@ -2,6 +2,7 @@
22// do not pull heavyweight runtime graphs at activation time.
3344import { ensureStaticModelAllowlistEntry } from "../agents/model-allowlist-entry.js";
5+import { normalizeConfiguredProviderCatalogModelId } from "../agents/model-ref-shared.js";
56import { findNormalizedProviderKey } from "../agents/provider-id.js";
67import {
78normalizeAgentModelMapForConfig,
@@ -68,6 +69,40 @@ type ProviderModelMergeState = {
6869existingModels: ModelDefinitionConfig[];
6970};
707172+function normalizeProviderModelForConfig(
73+providerId: string,
74+model: ModelDefinitionConfig,
75+): ModelDefinitionConfig {
76+const id = normalizeConfiguredProviderCatalogModelId(providerId, model.id);
77+return id === model.id ? model : { ...model, id };
78+}
79+80+function normalizeProviderModelsForConfig(
81+providerId: string,
82+models: ModelDefinitionConfig[],
83+): ModelDefinitionConfig[] {
84+let mutated = false;
85+const next: ModelDefinitionConfig[] = [];
86+const seenById = new Map<string, number>();
87+88+for (const model of models) {
89+const normalized = normalizeProviderModelForConfig(providerId, model);
90+if (normalized !== model) {
91+mutated = true;
92+}
93+const existingIndex = seenById.get(normalized.id);
94+if (existingIndex !== undefined) {
95+mutated = true;
96+next[existingIndex] = { ...normalized, ...next[existingIndex] };
97+continue;
98+}
99+seenById.set(normalized.id, next.length);
100+next.push(normalized);
101+}
102+103+return mutated ? next : models;
104+}
105+71106function resolveProviderModelMergeState(
72107cfg: OpenClawConfig,
73108providerId: string,
@@ -79,12 +114,18 @@ function resolveProviderModelMergeState(
79114 ? (providers[existingProviderKey] as ModelProviderConfig | undefined)
80115 : undefined;
81116const existingModels: ModelDefinitionConfig[] = Array.isArray(existingProvider?.models)
82- ? existingProvider.models
117+ ? normalizeProviderModelsForConfig(providerId, existingProvider.models)
83118 : [];
84119if (existingProviderKey && existingProviderKey !== providerId) {
85120delete providers[existingProviderKey];
86121}
87-return { providers, existingProvider, existingModels };
122+return {
123+ providers,
124+existingProvider: existingProvider
125+ ? { ...existingProvider, models: existingModels }
126+ : existingProvider,
127+ existingModels,
128+};
88129}
8913090131function buildProviderConfig(params: {
@@ -120,12 +161,14 @@ function applyProviderConfigWithMergedModels(
120161fallbackModels: ModelDefinitionConfig[];
121162},
122163): OpenClawConfig {
164+const mergedModels = normalizeProviderModelsForConfig(params.providerId, params.mergedModels);
165+const fallbackModels = normalizeProviderModelsForConfig(params.providerId, params.fallbackModels);
123166params.providerState.providers[params.providerId] = buildProviderConfig({
124167existingProvider: params.providerState.existingProvider,
125168api: params.api,
126169baseUrl: params.baseUrl,
127-mergedModels: params.mergedModels,
128-fallbackModels: params.fallbackModels,
170+ mergedModels,
171+ fallbackModels,
129172});
130173return applyOnboardAuthAgentModelsAndProviders(cfg, {
131174agentModels: params.agentModels,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。