@@ -11,6 +11,7 @@ import {
1111} from "../agents/auth-profiles.js" ;
1212import { updateAuthProfileStoreWithLock } from "../agents/auth-profiles/store.js" ;
1313import { resolveMemorySearchConfig } from "../agents/memory-search.js" ;
14+ import { findModelInCatalog } from "../agents/model-catalog-lookup.js" ;
1415import { loadModelCatalog } from "../agents/model-catalog.js" ;
1516import {
1617 completeWithPreparedSimpleCompletionModel ,
@@ -558,6 +559,24 @@ function resolveModelRefOverride(raw: string | undefined): { provider?: string;
558559 } ;
559560}
560561
562+ function shouldCanonicalizeModelRunRef (
563+ model : string | undefined ,
564+ ref : { provider ?: string ; model ?: string } ,
565+ ) : ref is { provider : string ; model : string } {
566+ return Boolean ( model && model !== model . toLowerCase ( ) && ref . provider && ref . model ) ;
567+ }
568+
569+ async function canonicalizeModelRunRef ( raw : string | undefined , cfg : OpenClawConfig ) {
570+ const model = normalizeStringifiedOptionalString ( raw ) ;
571+ const ref = resolveModelRefOverride ( model ) ;
572+ if ( ! shouldCanonicalizeModelRunRef ( model , ref ) ) {
573+ return model ;
574+ }
575+ const catalog = await loadModelCatalog ( { config : cfg } ) ;
576+ const entry = findModelInCatalog ( catalog , ref . provider , ref . model ) ;
577+ return entry ? `${ entry . provider } /${ entry . id } ` : model ;
578+ }
579+
561580function requireProviderModelOverride (
562581 raw : string | undefined ,
563582) : { provider : string ; model : string } | undefined {
@@ -644,11 +663,12 @@ async function runModelRun(params: {
644663 } ) ) ,
645664 ]
646665 : params . prompt ;
666+ const model = await canonicalizeModelRunRef ( params . model , cfg ) ;
647667 if ( params . transport === "local" ) {
648668 const prepared = await prepareSimpleCompletionModelForAgent ( {
649669 cfg,
650670 agentId,
651- modelRef : params . model ,
671+ modelRef : model ,
652672 allowMissingApiKeyModes : [ "aws-sdk" ] ,
653673 skipPiDiscovery : true ,
654674 } ) ;
@@ -721,10 +741,10 @@ async function runModelRun(params: {
721741 } satisfies CapabilityEnvelope ;
722742 }
723743
724- const { provider, model } = resolveModelRefOverride ( params . model ) ;
744+ const { provider, model : modelId } = resolveModelRefOverride ( model ) ;
725745 // Provider/model overrides require trusted-operator scope. Use the backend
726746 // shared-secret lane so local gateway smokes do not depend on paired CLI device scopes.
727- const hasModelOverride = Boolean ( provider || model ) ;
747+ const hasModelOverride = Boolean ( provider || modelId ) ;
728748 const response : {
729749 result ?: {
730750 payloads ?: Array < { text ?: string ; mediaUrl ?: string | null ; mediaUrls ?: string [ ] } > ;
@@ -751,7 +771,7 @@ async function runModelRun(params: {
751771 } ) )
752772 : undefined ,
753773 provider,
754- model,
774+ model : modelId ,
755775 modelRun : true ,
756776 promptMode : "none" ,
757777 cleanupBundleMcpOnRunEnd : true ,
0 commit comments