Skip to content

Commit e87f856

Browse files
committed
perf(gateway): normalize model id and propagate config context to eliminate stale policy registry warnings
1 parent 7275304 commit e87f856

6 files changed

Lines changed: 54 additions & 7 deletions

File tree

src/agents/embedded-agent-runner/model.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ function findConfiguredAgentModelParams(params: {
484484
cfg?: OpenClawConfig;
485485
provider: string;
486486
modelId: string;
487+
workspaceDir?: string;
487488
}): Record<string, unknown> | undefined {
488489
const configuredModels = params.cfg?.agents?.defaults?.models;
489490
if (!configuredModels) {
@@ -501,7 +502,10 @@ function findConfiguredAgentModelParams(params: {
501502
}
502503

503504
const normalizedProvider = normalizeProviderId(params.provider);
504-
const normalizedModelId = normalizeStaticProviderModelId(normalizedProvider, params.modelId)
505+
const normalizedModelId = normalizeStaticProviderModelId(normalizedProvider, params.modelId, {
506+
config: params.cfg,
507+
workspaceDir: params.workspaceDir,
508+
})
505509
.trim()
506510
.toLowerCase();
507511
for (const [rawKey, entry] of Object.entries(configuredModels)) {
@@ -513,8 +517,12 @@ function findConfiguredAgentModelParams(params: {
513517
const candidateModelId = rawKey.slice(slashIndex + 1);
514518
if (
515519
normalizeProviderId(candidateProvider) === normalizedProvider &&
516-
normalizeStaticProviderModelId(normalizedProvider, candidateModelId).trim().toLowerCase() ===
517-
normalizedModelId
520+
normalizeStaticProviderModelId(normalizedProvider, candidateModelId, {
521+
config: params.cfg,
522+
workspaceDir: params.workspaceDir,
523+
})
524+
.trim()
525+
.toLowerCase() === normalizedModelId
518526
) {
519527
return readModelParams(entry.params);
520528
}
@@ -529,6 +537,7 @@ function mergeConfiguredRuntimeModelParams(params: {
529537
discoveredParams?: unknown;
530538
providerParams?: unknown;
531539
configuredParams?: unknown;
540+
workspaceDir?: string;
532541
}): Record<string, unknown> | undefined {
533542
return mergeModelParams(
534543
readModelParams(params.discoveredParams),
@@ -537,6 +546,7 @@ function mergeConfiguredRuntimeModelParams(params: {
537546
cfg: params.cfg,
538547
provider: params.provider,
539548
modelId: params.modelId,
549+
workspaceDir: params.workspaceDir,
540550
}),
541551
readModelParams(params.configuredParams),
542552
);
@@ -558,6 +568,7 @@ function applyConfiguredProviderOverrides(params: {
558568
cfg: params.cfg,
559569
provider: params.provider,
560570
modelId,
571+
workspaceDir: params.workspaceDir,
561572
});
562573
if (!providerConfig) {
563574
const resolvedParams = mergeModelParams(
@@ -756,6 +767,7 @@ function resolveExplicitModelWithRegistry(params: {
756767
modelId,
757768
providerParams: providerConfig?.params,
758769
configuredParams: inlineMatch.params,
770+
workspaceDir,
759771
});
760772
return {
761773
kind: "resolved",
@@ -825,6 +837,7 @@ function resolveExplicitModelWithRegistry(params: {
825837
modelId,
826838
providerParams: providerConfig?.params,
827839
configuredParams: fallbackInlineMatch.params,
840+
workspaceDir,
828841
});
829842
return {
830843
kind: "resolved",
@@ -933,6 +946,7 @@ function resolveConfiguredFallbackModel(params: {
933946
modelId,
934947
providerParams: providerConfig?.params,
935948
configuredParams: configuredModel?.params,
949+
workspaceDir,
936950
});
937951
if (!hasConfiguredFallbackSurface({ providerConfig, configuredModel, modelId })) {
938952
return undefined;
@@ -1125,7 +1139,10 @@ function normalizeProviderModelRef(params: {
11251139
});
11261140
return {
11271141
provider,
1128-
model: normalizeStaticProviderModelId(normalizeProviderId(provider), params.modelId),
1142+
model: normalizeStaticProviderModelId(normalizeProviderId(provider), params.modelId, {
1143+
config: params.cfg,
1144+
workspaceDir: params.workspaceDir,
1145+
}),
11291146
};
11301147
}
11311148

src/agents/model-ref-shared.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { OpenClawConfig } from "../config/types.openclaw.js";
12
import { normalizeGooglePreviewModelId } from "../plugin-sdk/provider-model-id-normalize.js";
23
import { normalizeProviderModelIdWithManifest } from "../plugins/manifest-model-id-normalization.js";
34
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
@@ -12,6 +13,9 @@ type StaticModelRef = {
1213
export type ProviderModelIdNormalizationOptions = {
1314
allowManifestNormalization?: boolean;
1415
manifestPlugins?: readonly Pick<PluginManifestRecord, "modelIdNormalization">[];
16+
config?: OpenClawConfig;
17+
env?: NodeJS.ProcessEnv;
18+
workspaceDir?: string;
1519
};
1620

1721
export function modelKey(provider: string, model: string): string {
@@ -43,6 +47,9 @@ export function normalizeStaticProviderModelId(
4347
normalizeProviderModelIdWithManifest({
4448
provider: normalizedProvider,
4549
plugins: options.manifestPlugins,
50+
config: options.config,
51+
env: options.env,
52+
workspaceDir: options.workspaceDir,
4653
context: {
4754
provider: normalizedProvider,
4855
modelId: model,

src/agents/model-selection-normalize.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { OpenClawConfig } from "../config/types.openclaw.js";
12
import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
23
import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js";
34
import { modelKey as sharedModelKey, normalizeStaticProviderModelId } from "./model-ref-shared.js";
@@ -16,6 +17,7 @@ export type ModelRef = {
1617

1718
export type ModelManifestNormalizationContext = {
1819
manifestPlugins?: readonly Pick<PluginManifestRecord, "modelIdNormalization">[];
20+
config?: OpenClawConfig;
1921
};
2022

2123
export function modelKey(provider: string, model: string) {
@@ -51,6 +53,7 @@ function normalizeProviderModelId(
5153
const staticModelId = normalizeStaticProviderModelId(provider, model, {
5254
allowManifestNormalization: options?.allowManifestNormalization,
5355
manifestPlugins: options?.manifestPlugins,
56+
config: options?.config,
5457
});
5558
if (options?.allowPluginNormalization === false) {
5659
return staticModelId;

src/agents/model-selection-shared.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ export function inferUniqueProviderFromConfiguredModels(
192192
const parsed = parseModelRef(ref, DEFAULT_PROVIDER, {
193193
allowManifestNormalization: params.allowManifestNormalization,
194194
allowPluginNormalization: false,
195+
config: params.cfg,
195196
manifestPlugins: params.manifestPlugins,
196197
});
197198
if (!parsed) {
@@ -220,6 +221,7 @@ export function inferUniqueProviderFromConfiguredModels(
220221
const normalizedModelId = normalizeConfiguredProviderCatalogModelId(providerId, modelId, {
221222
allowManifestNormalization: params.allowManifestNormalization,
222223
manifestPlugins: params.manifestPlugins,
224+
config: params.cfg,
223225
});
224226
if (
225227
modelId === model ||
@@ -310,6 +312,7 @@ function resolveConfiguredOpenRouterCompatFreeRef(
310312
allowManifestNormalization: params.allowManifestNormalization,
311313
allowPluginNormalization: params.allowPluginNormalization,
312314
manifestPlugins: params.manifestPlugins,
315+
config: params.cfg,
313316
});
314317
if (parsed && isConcreteOpenRouterFreeModelRef(parsed)) {
315318
return parsed;
@@ -329,6 +332,7 @@ function resolveConfiguredOpenRouterCompatFreeRef(
329332
allowManifestNormalization: params.allowManifestNormalization,
330333
allowPluginNormalization: params.allowPluginNormalization,
331334
manifestPlugins: params.manifestPlugins,
335+
config: params.cfg,
332336
});
333337
}
334338

@@ -350,6 +354,7 @@ export function resolveConfiguredOpenRouterCompatAlias(
350354
allowManifestNormalization: params.allowManifestNormalization,
351355
allowPluginNormalization: params.allowPluginNormalization,
352356
manifestPlugins: params.manifestPlugins,
357+
config: params.cfg,
353358
});
354359
}
355360
if (normalized !== OPENROUTER_COMPAT_FREE_ALIAS || !params.cfg) {
@@ -361,6 +366,7 @@ export function resolveConfiguredOpenRouterCompatAlias(
361366
allowManifestNormalization: params.allowManifestNormalization,
362367
allowPluginNormalization: params.allowPluginNormalization,
363368
manifestPlugins: params.manifestPlugins,
369+
config: params.cfg,
364370
});
365371
}
366372

@@ -380,6 +386,7 @@ function parseModelRefWithCompatAlias(
380386
allowManifestNormalization: params.allowManifestNormalization,
381387
allowPluginNormalization: params.allowPluginNormalization,
382388
manifestPlugins: params.manifestPlugins,
389+
config: params.cfg,
383390
})
384391
);
385392
}
@@ -423,10 +430,12 @@ function resolveExactConfiguredProviderRef(
423430
normalizeStaticProviderModelId(provider, modelRaw.trim(), {
424431
allowManifestNormalization: params.allowManifestNormalization,
425432
manifestPlugins: params.manifestPlugins,
433+
config: params.cfg,
426434
}),
427435
{
428436
allowManifestNormalization: params.allowManifestNormalization,
429437
manifestPlugins: params.manifestPlugins,
438+
config: params.cfg,
430439
},
431440
),
432441
};
@@ -1167,7 +1176,10 @@ export function buildConfiguredModelCatalog(params: {
11671176
for (const model of provider.models) {
11681177
const rawId = normalizeOptionalString(model?.id) ?? "";
11691178
const id = rawId
1170-
? normalizeConfiguredProviderCatalogModelId(providerId, rawId, { manifestPlugins })
1179+
? normalizeConfiguredProviderCatalogModelId(providerId, rawId, {
1180+
manifestPlugins,
1181+
config: params.cfg,
1182+
})
11711183
: "";
11721184
if (!id) {
11731185
continue;
@@ -1325,6 +1337,7 @@ export function resolveAllowedModelSelection(
13251337
allowManifestNormalization: params.allowManifestNormalization,
13261338
allowPluginNormalization: params.allowPluginNormalization,
13271339
manifestPlugins: params.manifestPlugins,
1340+
config: params.config,
13281341
});
13291342
if (
13301343
params.allowAny ||
@@ -1340,6 +1353,7 @@ export function resolveAllowedModelSelection(
13401353
allowManifestNormalization: params.allowManifestNormalization,
13411354
allowPluginNormalization: params.allowPluginNormalization,
13421355
manifestPlugins: params.manifestPlugins,
1356+
config: params.config,
13431357
});
13441358
}
13451359

@@ -1424,6 +1438,7 @@ export function createModelVisibilityPolicyWithFallbacks(
14241438
allowManifestNormalization: params.allowManifestNormalization,
14251439
allowPluginNormalization: params.allowPluginNormalization,
14261440
manifestPlugins: params.manifestPlugins,
1441+
config: params.cfg,
14271442
}),
14281443
visibleCatalog: ({ catalog, defaultVisibleCatalog, view }) => {
14291444
if (view === "all") {

src/config/defaults.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,10 @@ export function applyModelDefaults(
179179
const nextModels = models.map((model) => {
180180
const raw = model as ModelDefinitionLike;
181181
let modelMutated = false;
182-
const id = normalizeConfiguredProviderCatalogModelId(providerId, raw.id);
182+
const id = normalizeConfiguredProviderCatalogModelId(providerId, raw.id, {
183+
manifestPlugins: options.manifestRegistry?.plugins,
184+
config: cfg,
185+
});
183186
if (id !== raw.id) {
184187
modelMutated = true;
185188
}

src/config/io.write-prepare.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,9 @@ function normalizeModelProviderCatalogRefsForWrite(config: unknown): unknown {
436436
if (!trimmed) {
437437
return model;
438438
}
439-
const id = normalizeConfiguredProviderCatalogModelId(provider, trimmed);
439+
const id = normalizeConfiguredProviderCatalogModelId(provider, trimmed, {
440+
config: coerceConfig(config),
441+
});
440442
if (id === model.id) {
441443
return model;
442444
}

0 commit comments

Comments
 (0)