





















@@ -49,7 +49,8 @@ const mocks = vi.hoisted(() => {
4949loadModelRegistry: vi.fn(),
5050loadModelCatalog: vi.fn(),
5151loadProviderCatalogModelsForList: vi.fn(),
52-loadManifestCatalogRowsForList: vi.fn(),
52+loadStaticManifestCatalogRowsForList: vi.fn(),
53+loadSupplementalManifestCatalogRowsForList: vi.fn(),
5354loadProviderIndexCatalogRowsForList: vi.fn(),
5455hasProviderStaticCatalogForFilter: vi.fn(),
5556resolveConfiguredEntries: vi.fn(),
@@ -78,7 +79,8 @@ function resetMocks() {
7879});
7980mocks.loadModelCatalog.mockResolvedValue([]);
8081mocks.loadProviderCatalogModelsForList.mockResolvedValue([]);
81-mocks.loadManifestCatalogRowsForList.mockReturnValue([]);
82+mocks.loadStaticManifestCatalogRowsForList.mockReturnValue([]);
83+mocks.loadSupplementalManifestCatalogRowsForList.mockReturnValue([]);
8284mocks.loadProviderIndexCatalogRowsForList.mockReturnValue([]);
8385mocks.hasProviderStaticCatalogForFilter.mockResolvedValue(false);
8486mocks.resolveConfiguredEntries.mockReturnValue({
@@ -143,7 +145,8 @@ function installModelsListCommandForwardCompatMocks() {
143145}));
144146145147vi.doMock("./list.manifest-catalog.js", () => ({
146-loadManifestCatalogRowsForList: mocks.loadManifestCatalogRowsForList,
148+loadStaticManifestCatalogRowsForList: mocks.loadStaticManifestCatalogRowsForList,
149+loadSupplementalManifestCatalogRowsForList: mocks.loadSupplementalManifestCatalogRowsForList,
147150}));
148151149152vi.doMock("./list.provider-index-catalog.js", () => ({
@@ -525,7 +528,7 @@ describe("modelsListCommand forward-compat", () => {
525528526529it("uses manifest catalog rows before provider runtime catalog rows", async () => {
527530mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
528-mocks.loadManifestCatalogRowsForList.mockReturnValueOnce([
531+mocks.loadStaticManifestCatalogRowsForList.mockReturnValueOnce([
529532{
530533provider: "moonshot",
531534id: "kimi-k2.6",
@@ -555,6 +558,72 @@ describe("modelsListCommand forward-compat", () => {
555558]);
556559});
557560561+it("keeps refreshable manifest catalog rows on the registry-backed provider path", async () => {
562+mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
563+mocks.loadSupplementalManifestCatalogRowsForList.mockReturnValueOnce([
564+{
565+provider: "openai",
566+id: "gpt-5.5-pro",
567+ref: "openai/gpt-5.5-pro",
568+mergeKey: "openai::gpt-5.5-pro",
569+name: "gpt-5.5-pro",
570+source: "manifest",
571+input: ["text", "image"],
572+reasoning: true,
573+status: "available",
574+baseUrl: "https://api.openai.com/v1",
575+contextWindow: 1_000_000,
576+},
577+]);
578+mocks.loadModelRegistry.mockResolvedValueOnce({
579+models: [
580+{
581+provider: "openai",
582+id: "gpt-5.4",
583+name: "GPT-5.4",
584+api: "openai-responses",
585+baseUrl: "https://api.openai.com/v1",
586+input: ["text", "image"],
587+contextWindow: 1_050_000,
588+maxTokens: 128_000,
589+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
590+},
591+],
592+availableKeys: new Set(),
593+registry: {
594+getAll: () => [],
595+},
596+});
597+mocks.resolveModelWithRegistry.mockImplementation(
598+({ provider, modelId }: { provider: string; modelId: string }) =>
599+provider === "openai" && modelId === "gpt-5.4"
600+ ? {
601+ provider,
602+id: modelId,
603+name: "GPT-5.4",
604+api: "openai-responses",
605+baseUrl: "https://api.openai.com/v1",
606+input: ["text", "image"],
607+contextWindow: 1_050_000,
608+maxTokens: 128_000,
609+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
610+}
611+ : undefined,
612+);
613+const runtime = createRuntime();
614+615+await modelsListCommand({ all: true, provider: "openai", json: true }, runtime as never);
616+617+expect(mocks.loadModelRegistry).toHaveBeenCalledWith(mocks.resolvedConfig, {
618+providerFilter: "openai",
619+normalizeModels: true,
620+});
621+expect(lastPrintedRows<{ key: string }>()).toEqual([
622+expect.objectContaining({ key: "openai/gpt-5.4" }),
623+expect.objectContaining({ key: "openai/gpt-5.5-pro" }),
624+]);
625+});
626+558627it("uses provider index preview rows when an installable provider is not installed", async () => {
559628mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
560629mocks.loadProviderIndexCatalogRowsForList.mockReturnValueOnce([
@@ -596,7 +665,7 @@ describe("modelsListCommand forward-compat", () => {
596665getAll: () => [{ ...OPENAI_CODEX_MODEL }],
597666},
598667});
599-mocks.loadManifestCatalogRowsForList.mockReturnValueOnce([
668+mocks.loadSupplementalManifestCatalogRowsForList.mockReturnValueOnce([
600669{
601670provider: "moonshot",
602671id: "kimi-k2.6",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。