@@ -4,7 +4,6 @@ import type { ModelProviderConfig } from "../../config/types.models.js";
44import type { OpenClawConfig } from "../../config/types.openclaw.js" ;
55import { formatErrorMessage } from "../../infra/errors.js" ;
66import { createSubsystemLogger } from "../../logging/subsystem.js" ;
7- import { loadPluginManifestRegistry } from "../../plugins/manifest-registry.js" ;
87import {
98 groupPluginDiscoveryProvidersByOrder ,
109 normalizePluginDiscoveryResult ,
@@ -15,11 +14,23 @@ import {
1514 resolveBundledProviderCompatPluginIds ,
1615 resolveOwningPluginIdsForProvider ,
1716} from "../../plugins/providers.js" ;
17+ import type { ProviderPlugin } from "../../plugins/types.js" ;
1818
1919const DISCOVERY_ORDERS = [ "simple" , "profile" , "paired" , "late" ] as const ;
2020const SELF_HOSTED_DISCOVERY_PROVIDER_IDS = new Set ( [ "lmstudio" , "ollama" , "sglang" , "vllm" ] ) ;
2121const log = createSubsystemLogger ( "models/list-provider-catalog" ) ;
2222
23+ function providerMatchesFilter ( params : {
24+ provider : Pick < ProviderPlugin , "id" | "aliases" | "hookAliases" > ;
25+ providerFilter : string ;
26+ } ) : boolean {
27+ return [
28+ params . provider . id ,
29+ ...( params . provider . aliases ?? [ ] ) ,
30+ ...( params . provider . hookAliases ?? [ ] ) ,
31+ ] . some ( ( providerId ) => normalizeProviderId ( providerId ) === params . providerFilter ) ;
32+ }
33+
2334export async function resolveProviderCatalogPluginIdsForFilter ( params : {
2435 cfg : OpenClawConfig ;
2536 env ?: NodeJS . ProcessEnv ;
@@ -51,13 +62,26 @@ export async function hasProviderStaticCatalogForFilter(params: {
5162 env ?: NodeJS . ProcessEnv ;
5263 providerFilter : string ;
5364} ) : Promise < boolean > {
65+ const providerFilter = normalizeProviderId ( params . providerFilter ) ;
66+ if ( ! providerFilter ) {
67+ return false ;
68+ }
5469 const pluginIds = await resolveProviderCatalogPluginIdsForFilter ( params ) ;
5570 if ( ! pluginIds || pluginIds . length === 0 ) {
5671 return false ;
5772 }
58- const pluginIdSet = new Set ( pluginIds ) ;
59- return loadPluginManifestRegistry ( { config : params . cfg , env : params . env } ) . plugins . some (
60- ( plugin ) => pluginIdSet . has ( plugin . id ) && typeof plugin . providerDiscoverySource === "string" ,
73+ const providers = await resolvePluginDiscoveryProviders ( {
74+ config : params . cfg ,
75+ env : params . env ,
76+ onlyPluginIds : pluginIds ,
77+ includeUntrustedWorkspacePlugins : false ,
78+ requireCompleteDiscoveryEntryCoverage : true ,
79+ discoveryEntriesOnly : true ,
80+ } ) ;
81+ return providers . some (
82+ ( provider ) =>
83+ typeof provider . staticCatalog ?. run === "function" &&
84+ providerMatchesFilter ( { provider, providerFilter } ) ,
6185 ) ;
6286}
6387
@@ -71,7 +95,7 @@ function modelFromProviderCatalog(params: {
7195 name : params . model . name || params . model . id ,
7296 provider : params . provider ,
7397 api : params . model . api ?? params . providerConfig . api ?? "openai-responses" ,
74- baseUrl : params . providerConfig . baseUrl ,
98+ baseUrl : params . model . baseUrl ?? params . providerConfig . baseUrl ,
7599 reasoning : params . model . reasoning ,
76100 input : params . model . input ?? [ "text" ] ,
77101 cost : params . model . cost ,
@@ -122,6 +146,7 @@ export async function loadProviderCatalogModelsForList(params: {
122146 onlyPluginIds : scopedPluginIds ,
123147 includeUntrustedWorkspacePlugins : false ,
124148 requireCompleteDiscoveryEntryCoverage : params . staticOnly === true ,
149+ discoveryEntriesOnly : params . staticOnly === true ,
125150 } )
126151 ) . filter (
127152 ( provider ) =>
0 commit comments