

























@@ -1,7 +1,90 @@
1-import { fileURLToPath } from "node:url";
2-import { describeVllmProviderDiscoveryContract } from "../../test/helpers/plugins/provider-discovery-contract.js";
1+import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry";
2+import { beforeEach, describe, expect, it, vi } from "vitest";
334-describeVllmProviderDiscoveryContract({
5-load: () => import("./index.js"),
6-apiModuleId: fileURLToPath(new URL("./api.js", import.meta.url)),
4+const buildVllmProviderMock = vi.hoisted(() => vi.fn());
5+6+vi.mock("./api.js", () => ({
7+VLLM_DEFAULT_API_KEY_ENV_VAR: "VLLM_API_KEY",
8+VLLM_DEFAULT_BASE_URL: "http://127.0.0.1:8000/v1",
9+VLLM_MODEL_PLACEHOLDER: "meta-llama/Meta-Llama-3-8B-Instruct",
10+VLLM_PROVIDER_LABEL: "vLLM",
11+buildVllmProvider: (...args: unknown[]) => buildVllmProviderMock(...args),
12+}));
13+14+type ProviderDiscoveryRun = (ctx: {
15+config: Record<string, unknown>;
16+env: NodeJS.ProcessEnv;
17+resolveProviderApiKey: () => {
18+apiKey: string | undefined;
19+discoveryApiKey?: string;
20+};
21+resolveProviderAuth: () => {
22+apiKey: string | undefined;
23+discoveryApiKey?: string;
24+mode: "api_key" | "oauth" | "token" | "none";
25+source: "env" | "profile" | "none";
26+};
27+}) => Promise<unknown>;
28+29+type RegisteredVllmProvider = {
30+id: string;
31+discovery?: {
32+order?: string;
33+run: ProviderDiscoveryRun;
34+};
35+};
36+37+describe("vllm provider discovery contract", () => {
38+beforeEach(() => {
39+buildVllmProviderMock.mockReset();
40+});
41+42+it("keeps self-hosted discovery provider-owned", async () => {
43+const { default: plugin } = await import("./index.js");
44+let provider: RegisteredVllmProvider | undefined;
45+plugin.register({
46+registerProvider: (registeredProvider) => {
47+provider = registeredProvider as RegisteredVllmProvider;
48+},
49+} as OpenClawPluginApi);
50+expect(provider?.id).toBe("vllm");
51+expect(provider?.discovery?.order).toBe("late");
52+const discovery = provider?.discovery;
53+expect(discovery).toBeDefined();
54+55+buildVllmProviderMock.mockResolvedValueOnce({
56+baseUrl: "http://127.0.0.1:8000/v1",
57+api: "openai-completions",
58+models: [{ id: "meta-llama/Meta-Llama-3-8B-Instruct", name: "Meta Llama 3" }],
59+});
60+61+await expect(
62+discovery!.run({
63+config: {},
64+env: {
65+VLLM_API_KEY: "env-vllm-key",
66+} as NodeJS.ProcessEnv,
67+resolveProviderApiKey: () => ({
68+apiKey: "VLLM_API_KEY",
69+discoveryApiKey: "env-vllm-key",
70+}),
71+resolveProviderAuth: () => ({
72+apiKey: "VLLM_API_KEY",
73+discoveryApiKey: "env-vllm-key",
74+mode: "api_key",
75+source: "env",
76+}),
77+}),
78+).resolves.toEqual({
79+provider: {
80+baseUrl: "http://127.0.0.1:8000/v1",
81+api: "openai-completions",
82+apiKey: "VLLM_API_KEY",
83+models: [{ id: "meta-llama/Meta-Llama-3-8B-Instruct", name: "Meta Llama 3" }],
84+},
85+});
86+expect(buildVllmProviderMock).toHaveBeenCalledWith({
87+apiKey: "env-vllm-key",
88+});
89+});
790});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。