




























@@ -16,6 +16,9 @@ const modelCatalogMocks = vi.hoisted(() => ({
1616const modelAuthLabelMocks = vi.hoisted(() => ({
1717resolveModelAuthLabel: vi.fn<(params: unknown) => string | undefined>(() => undefined),
1818}));
19+const modelProviderAuthMocks = vi.hoisted(() => ({
20+authenticatedProviders: new Set(["anthropic", "google", "openai"]),
21+}));
19222023const MODELS_ADD_DEPRECATED_TEXT =
2124"⚠️ /models add is deprecated. Use /models to browse providers and /model to switch models.";
@@ -28,6 +31,13 @@ vi.mock("../../agents/model-auth-label.js", () => ({
2831resolveModelAuthLabel: modelAuthLabelMocks.resolveModelAuthLabel,
2932}));
303334+vi.mock("../../agents/model-provider-auth.js", () => ({
35+createProviderAuthChecker: () => (provider: string) =>
36+modelProviderAuthMocks.authenticatedProviders.has(provider),
37+hasAuthForModelProvider: ({ provider }: { provider: string }) =>
38+modelProviderAuthMocks.authenticatedProviders.has(provider),
39+}));
40+3141const telegramModelsTestPlugin: ChannelPlugin = {
3242 ...createChannelTestPluginBase({
3343id: "telegram",
@@ -93,6 +103,7 @@ beforeEach(() => {
93103]);
94104modelAuthLabelMocks.resolveModelAuthLabel.mockReset();
95105modelAuthLabelMocks.resolveModelAuthLabel.mockReturnValue(undefined);
106+modelProviderAuthMocks.authenticatedProviders = new Set(["anthropic", "google", "openai"]);
96107setActivePluginRegistry(
97108createTestRegistry([
98109 ...textSurfaceModelsTestPlugins,
@@ -170,6 +181,23 @@ describe("handleModelsCommand", () => {
170181expect(result?.reply?.text).not.toContain("Add: /models add");
171182});
172183184+it("hides unauthenticated providers by default and keeps all as explicit browse", async () => {
185+modelProviderAuthMocks.authenticatedProviders = new Set(["anthropic"]);
186+187+const providersResult = await handleModelsCommand(buildParams("/models"), true);
188+expect(providersResult?.reply?.text).toContain("- anthropic (2)");
189+expect(providersResult?.reply?.text).not.toContain("- google");
190+expect(providersResult?.reply?.text).not.toContain("- openai");
191+192+const defaultListResult = await handleModelsCommand(buildParams("/models openai"), true);
193+expect(defaultListResult?.reply?.text).toContain("Unknown provider: openai");
194+195+const allListResult = await handleModelsCommand(buildParams("/models openai all"), true);
196+expect(allListResult?.reply?.text).toContain("Models (openai) — showing 1-2 of 2 (page 1/1)");
197+expect(allListResult?.reply?.text).toContain("- openai/gpt-4.1");
198+expect(allListResult?.reply?.text).toContain("- openai/gpt-4.1-mini");
199+});
200+173201it("hides legacy runtime providers from /models provider lists", async () => {
174202modelCatalogMocks.loadModelCatalog.mockResolvedValueOnce([
175203{ provider: "codex", id: "gpt-5.5", name: "GPT-5.5" },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。