


















@@ -0,0 +1,79 @@
1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+3+const mocks = vi.hoisted(() => ({
4+discoverAuthStorage: vi.fn(() => ({ mocked: true })),
5+discoverModels: vi.fn(() => ({ find: vi.fn(() => null) })),
6+applyProviderResolvedModelCompatWithPlugins: vi.fn(() => {
7+throw new Error("compat hook should not run during skipPiDiscovery");
8+}),
9+applyProviderResolvedTransportWithPlugin: vi.fn(() => {
10+throw new Error("transport hook should not run during skipPiDiscovery");
11+}),
12+buildProviderUnknownModelHintWithPlugin: vi.fn(() => undefined),
13+normalizeProviderResolvedModelWithPlugin: vi.fn(() => undefined),
14+normalizeProviderTransportWithPlugin: vi.fn(() => {
15+throw new Error("transport normalization hook should not run during skipPiDiscovery");
16+}),
17+prepareProviderDynamicModel: vi.fn(async () => undefined),
18+runProviderDynamicModel: vi.fn(
19+({ context }: { context: { provider: string; modelId: string } }) => ({
20+id: context.modelId,
21+name: context.modelId,
22+provider: context.provider,
23+api: "ollama",
24+baseUrl: "http://127.0.0.1:11434",
25+reasoning: false,
26+input: ["text"],
27+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
28+contextWindow: 8192,
29+maxTokens: 1024,
30+}),
31+),
32+shouldPreferProviderRuntimeResolvedModel: vi.fn(() => false),
33+}));
34+35+vi.mock("../pi-model-discovery.js", () => ({
36+discoverAuthStorage: mocks.discoverAuthStorage,
37+discoverModels: mocks.discoverModels,
38+}));
39+40+vi.mock("../../plugins/provider-runtime.js", () => ({
41+applyProviderResolvedModelCompatWithPlugins: mocks.applyProviderResolvedModelCompatWithPlugins,
42+applyProviderResolvedTransportWithPlugin: mocks.applyProviderResolvedTransportWithPlugin,
43+buildProviderUnknownModelHintWithPlugin: mocks.buildProviderUnknownModelHintWithPlugin,
44+normalizeProviderResolvedModelWithPlugin: mocks.normalizeProviderResolvedModelWithPlugin,
45+normalizeProviderTransportWithPlugin: mocks.normalizeProviderTransportWithPlugin,
46+prepareProviderDynamicModel: mocks.prepareProviderDynamicModel,
47+runProviderDynamicModel: mocks.runProviderDynamicModel,
48+shouldPreferProviderRuntimeResolvedModel: mocks.shouldPreferProviderRuntimeResolvedModel,
49+}));
50+51+let resolveModelAsync: typeof import("./model.js").resolveModelAsync;
52+53+beforeEach(async () => {
54+vi.clearAllMocks();
55+({ resolveModelAsync } = await import("./model.js"));
56+});
57+58+describe("resolveModelAsync skipPiDiscovery runtime hooks", () => {
59+it("uses only target-provider dynamic hooks", async () => {
60+const result = await resolveModelAsync("ollama", "llama3.2:latest", "/tmp/agent", undefined, {
61+skipPiDiscovery: true,
62+});
63+64+expect(result.error).toBeUndefined();
65+expect(result.model).toMatchObject({
66+provider: "ollama",
67+id: "llama3.2:latest",
68+api: "ollama",
69+});
70+expect(mocks.discoverAuthStorage).not.toHaveBeenCalled();
71+expect(mocks.discoverModels).not.toHaveBeenCalled();
72+expect(mocks.prepareProviderDynamicModel).toHaveBeenCalledTimes(1);
73+expect(mocks.runProviderDynamicModel).toHaveBeenCalledTimes(1);
74+expect(mocks.normalizeProviderResolvedModelWithPlugin).toHaveBeenCalledTimes(1);
75+expect(mocks.applyProviderResolvedModelCompatWithPlugins).not.toHaveBeenCalled();
76+expect(mocks.applyProviderResolvedTransportWithPlugin).not.toHaveBeenCalled();
77+expect(mocks.normalizeProviderTransportWithPlugin).not.toHaveBeenCalled();
78+});
79+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。