























@@ -279,14 +279,175 @@ beforeEach(() => {
279279280280describe("modelsListCommand forward-compat", () => {
281281describe("configured rows", () => {
282-it("keeps configured provider filters on the registry-free row path", async () => {
282+it("returns manifest catalog rows for provider filters without --all", async () => {
283+mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
284+mocks.loadStaticManifestCatalogRowsForList.mockReturnValueOnce([
285+{
286+provider: "moonshot",
287+id: "kimi-k2.6",
288+ref: "moonshot/kimi-k2.6",
289+mergeKey: "moonshot::kimi-k2.6",
290+name: "Kimi K2.6",
291+source: "manifest",
292+input: ["text", "image"],
293+reasoning: false,
294+status: "available",
295+baseUrl: "https://api.moonshot.ai/v1",
296+contextWindow: 262_144,
297+},
298+]);
299+const runtime = createRuntime();
300+301+await modelsListCommand({ json: true, provider: "moonshot" }, runtime as never);
302+303+expect(mocks.loadModelRegistry).not.toHaveBeenCalled();
304+expect(runtime.log).not.toHaveBeenCalledWith("No models found.");
305+expect(lastPrintedRows<{ key: string }>()).toEqual([
306+expect.objectContaining({ key: "moonshot/kimi-k2.6" }),
307+]);
308+});
309+310+it("keeps catalog metadata when provider-filtered configured entries overlap", async () => {
311+mocks.resolveConfiguredEntries.mockReturnValueOnce({
312+entries: [
313+{
314+key: "moonshot/kimi-k2.6",
315+ref: { provider: "moonshot", model: "kimi-k2.6" },
316+tags: new Set(["configured"]),
317+aliases: [],
318+},
319+],
320+});
321+mocks.loadStaticManifestCatalogRowsForList.mockReturnValueOnce([
322+{
323+provider: "moonshot",
324+id: "kimi-k2.6",
325+ref: "moonshot/kimi-k2.6",
326+mergeKey: "moonshot::kimi-k2.6",
327+name: "Kimi K2.6",
328+source: "manifest",
329+input: ["text", "image"],
330+reasoning: false,
331+status: "available",
332+baseUrl: "https://api.moonshot.ai/v1",
333+contextWindow: 262_144,
334+},
335+]);
336+const runtime = createRuntime();
337+338+await modelsListCommand({ json: true, provider: "moonshot" }, runtime as never);
339+340+expect(mocks.loadModelRegistry).not.toHaveBeenCalled();
341+expect(lastPrintedRows<{ key: string; name: string; tags: string[] }>()).toEqual([
342+expect.objectContaining({
343+key: "moonshot/kimi-k2.6",
344+name: "Kimi K2.6",
345+tags: ["configured"],
346+}),
347+]);
348+});
349+350+it("falls back to registry rows for unknown provider filters without --all", async () => {
351+mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
352+mocks.loadModelRegistry.mockResolvedValueOnce({
353+models: [
354+{
355+provider: "google",
356+id: "gemini-2.5-pro",
357+name: "Gemini 2.5 Pro",
358+api: "google-gemini",
359+baseUrl: "https://generativelanguage.googleapis.com/v1beta",
360+input: ["text", "image"],
361+contextWindow: 1_048_576,
362+maxTokens: 65_536,
363+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
364+},
365+],
366+availableKeys: undefined,
367+registry: {
368+getAll: () => [
369+{
370+provider: "google",
371+id: "gemini-2.5-pro",
372+name: "Gemini 2.5 Pro",
373+api: "google-gemini",
374+baseUrl: "https://generativelanguage.googleapis.com/v1beta",
375+input: ["text", "image"],
376+contextWindow: 1_048_576,
377+maxTokens: 65_536,
378+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
379+},
380+],
381+},
382+});
383+const runtime = createRuntime();
384+385+await modelsListCommand({ json: true, provider: "google" }, runtime as never);
386+387+expect(mocks.loadModelRegistry).toHaveBeenCalled();
388+expect(runtime.log).not.toHaveBeenCalledWith("No models found.");
389+expect(lastPrintedRows<{ key: string }>()).toEqual([
390+expect.objectContaining({ key: "google/gemini-2.5-pro" }),
391+]);
392+});
393+394+it("uses provider static catalog rows for provider filters without --all", async () => {
395+mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
396+mocks.hasProviderStaticCatalogForFilter.mockResolvedValueOnce(true);
397+mocks.loadProviderCatalogModelsForList.mockResolvedValueOnce([
398+{
399+provider: "google",
400+id: "gemini-2.5-pro",
401+name: "gemini-2.5-pro",
402+api: "google-gemini",
403+baseUrl: "https://generativelanguage.googleapis.com/v1beta",
404+input: ["text", "image"],
405+contextWindow: 1_048_576,
406+maxTokens: 65_536,
407+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
408+},
409+]);
410+const runtime = createRuntime();
411+412+await modelsListCommand({ json: true, provider: "google" }, runtime as never);
413+414+expect(mocks.loadModelRegistry).not.toHaveBeenCalled();
415+expect(mocks.loadProviderCatalogModelsForList).toHaveBeenCalledWith(
416+expect.objectContaining({
417+providerFilter: "google",
418+staticOnly: true,
419+}),
420+);
421+expect(lastPrintedRows<{ key: string }>()).toEqual([
422+expect.objectContaining({ key: "google/gemini-2.5-pro" }),
423+]);
424+});
425+426+it("uses provider-index catalog rows for provider filters without --all", async () => {
427+mocks.resolveConfiguredEntries.mockReturnValueOnce({ entries: [] });
428+mocks.loadProviderIndexCatalogRowsForList.mockReturnValueOnce([
429+{
430+provider: "moonshot",
431+id: "kimi-k2.6",
432+ref: "moonshot/kimi-k2.6",
433+mergeKey: "moonshot::kimi-k2.6",
434+name: "Kimi K2.6",
435+source: "provider-index",
436+input: ["text", "image"],
437+reasoning: false,
438+status: "available",
439+baseUrl: "https://api.moonshot.ai/v1",
440+contextWindow: 262_144,
441+},
442+]);
283443const runtime = createRuntime();
284444285445await modelsListCommand({ json: true, provider: "moonshot" }, runtime as never);
286446287447expect(mocks.loadModelRegistry).not.toHaveBeenCalled();
288-expect(mocks.printModelTable).not.toHaveBeenCalled();
289-expect(runtime.log).toHaveBeenCalledWith("No models found.");
448+expect(lastPrintedRows<{ key: string }>()).toEqual([
449+expect.objectContaining({ key: "moonshot/kimi-k2.6" }),
450+]);
290451});
291452292453it("includes configured provider model rows for provider-filtered lists", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。