


















@@ -132,6 +132,44 @@ function providerFilterList(): string[] | undefined {
132132 : undefined;
133133}
134134135+function providerListFromExplicitModelFilter(params: {
136+modelFilter: Set<string> | null;
137+providerFilter: Set<string> | null;
138+}): string[] | undefined {
139+if (!params.modelFilter || params.modelFilter.size === 0) {
140+return undefined;
141+}
142+const providers = new Set<string>();
143+for (const raw of params.modelFilter) {
144+const ref = parseExplicitLiveModelRef(raw, params.providerFilter);
145+if (!ref) {
146+return undefined;
147+}
148+providers.add(ref.provider);
149+}
150+return providers.size > 0
151+ ? [...providers].toSorted((left, right) => left.localeCompare(right))
152+ : undefined;
153+}
154+155+function providerScopedModelRegistryProviders(params: {
156+providerList: string[] | undefined;
157+useExplicit: boolean;
158+modelFilter: Set<string> | null;
159+providerFilter: Set<string> | null;
160+}): string[] | undefined {
161+if (params.providerList) {
162+return params.providerList;
163+}
164+if (!params.useExplicit) {
165+return undefined;
166+}
167+return providerListFromExplicitModelFilter({
168+modelFilter: params.modelFilter,
169+providerFilter: params.providerFilter,
170+});
171+}
172+135173function shouldSuppressGatewayLiveOllamaWarnings(): boolean {
136174return PROVIDERS !== null && !PROVIDERS.has("ollama");
137175}
@@ -690,6 +728,41 @@ describe("resolveExplicitLiveModelCandidates", () => {
690728});
691729});
692730731+describe("providerScopedModelRegistryProviders", () => {
732+it("uses explicit provider-qualified model refs without enumerating the full registry", () => {
733+expect(
734+providerScopedModelRegistryProviders({
735+providerList: undefined,
736+useExplicit: true,
737+modelFilter: new Set(["openai/gpt-5.2", "anthropic/claude-sonnet-4-6"]),
738+providerFilter: null,
739+}),
740+).toEqual(["anthropic", "openai"]);
741+});
742+743+it("uses a single provider filter for explicit model-only refs", () => {
744+expect(
745+providerScopedModelRegistryProviders({
746+providerList: undefined,
747+useExplicit: true,
748+modelFilter: new Set(["gpt-5.2"]),
749+providerFilter: new Set(["openai"]),
750+}),
751+).toEqual(["openai"]);
752+});
753+754+it("falls back to the full registry for ambiguous explicit model-only refs", () => {
755+expect(
756+providerScopedModelRegistryProviders({
757+providerList: undefined,
758+useExplicit: true,
759+modelFilter: new Set(["gpt-5.2"]),
760+providerFilter: null,
761+}),
762+).toBeUndefined();
763+});
764+});
765+693766describe("resolveGatewayLiveModelThinkingLevel", () => {
694767it("clamps requested thinking to levels supported by model metadata", () => {
695768expect(
@@ -2551,14 +2624,19 @@ describeLive("gateway live (dev agent, profile keys)", () => {
25512624const useModern = !rawModels || rawModels === "modern" || rawModels === "all";
25522625const useExplicit = Boolean(rawModels) && !useModern;
25532626const filter = useExplicit ? parseFilter(rawModels) : null;
2554-const useProviderScopedBuiltIns = Array.isArray(providerList) && !useExplicit;
2627+const providerScopedModelProviders = providerScopedModelRegistryProviders({
2628+ providerList,
2629+ useExplicit,
2630+modelFilter: filter,
2631+providerFilter: PROVIDERS,
2632+});
25552633let authProfileStore: AuthProfileStore | undefined;
25562634let modelRegistry: LiveModelRegistry;
25572635let all: Array<Model<Api>>;
2558-if (useProviderScopedBuiltIns) {
2636+if (providerScopedModelProviders) {
25592637logProgress("[all-models] loading provider-scoped model refs");
25602638all = await withGatewayLiveSetupTimeout(
2561-loadProviderScopedModels({ agentDir, providerList }),
2639+loadProviderScopedModels({ agentDir, providerList: providerScopedModelProviders }),
25622640"[all-models] load provider-scoped model refs",
25632641);
25642642modelRegistry = createStaticLiveModelRegistry(all);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。