





















@@ -1,128 +1,7 @@
1-import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry";
2-import { beforeEach, describe, expect, it, vi } from "vitest";
1+import { fileURLToPath } from "node:url";
2+import { describeVllmProviderDiscoveryContract } from "openclaw/plugin-sdk/provider-test-contracts";
334-const buildVllmProviderMock = vi.hoisted(() => vi.fn());
5-type DiscoverOpenAICompatibleSelfHostedProviderParams = {
6-buildProvider: (args: { apiKey?: string }) => Promise<Record<string, unknown>>;
7-ctx: {
8-resolveProviderApiKey: () => {
9-apiKey?: string;
10-};
11-resolveProviderAuth: () => {
12-discoveryApiKey?: string;
13-};
14-};
15-providerId: string;
16-};
17-const discoverOpenAICompatibleSelfHostedProviderMock = vi.hoisted(() =>
18-vi.fn(async (params: DiscoverOpenAICompatibleSelfHostedProviderParams) => ({
19-provider: {
20- ...(await params.buildProvider({
21-apiKey: params.ctx.resolveProviderAuth().discoveryApiKey,
22-})),
23-apiKey: params.ctx.resolveProviderApiKey().apiKey,
24-},
25-})),
26-);
27-28-vi.mock("./api.js", () => ({
29-VLLM_DEFAULT_API_KEY_ENV_VAR: "VLLM_API_KEY",
30-VLLM_DEFAULT_BASE_URL: "http://127.0.0.1:8000/v1",
31-VLLM_MODEL_PLACEHOLDER: "meta-llama/Meta-Llama-3-8B-Instruct",
32-VLLM_PROVIDER_LABEL: "vLLM",
33-buildVllmProvider: (...args: unknown[]) => buildVllmProviderMock(...args),
34-}));
35-36-vi.mock("openclaw/plugin-sdk/provider-setup", () => ({
37-discoverOpenAICompatibleSelfHostedProvider: (
38-params: DiscoverOpenAICompatibleSelfHostedProviderParams,
39-) => discoverOpenAICompatibleSelfHostedProviderMock(params),
40-}));
41-42-type ProviderDiscoveryRun = (ctx: {
43-config: Record<string, unknown>;
44-env: NodeJS.ProcessEnv;
45-resolveProviderApiKey: () => {
46-apiKey: string | undefined;
47-discoveryApiKey?: string;
48-};
49-resolveProviderAuth: () => {
50-apiKey: string | undefined;
51-discoveryApiKey?: string;
52-mode: "api_key" | "oauth" | "token" | "none";
53-source: "env" | "profile" | "none";
54-};
55-}) => Promise<unknown>;
56-57-type RegisteredVllmProvider = {
58-id: string;
59-catalog?: {
60-order?: string;
61-run: ProviderDiscoveryRun;
62-};
63-};
64-65-describe("vllm provider discovery contract", () => {
66-beforeEach(() => {
67-buildVllmProviderMock.mockReset();
68-discoverOpenAICompatibleSelfHostedProviderMock.mockClear();
69-});
70-71-it("keeps self-hosted discovery provider-owned", async () => {
72-const { default: plugin } = await import("./index.js");
73-let provider: RegisteredVllmProvider | undefined;
74-plugin.register({
75-registerProvider: (registeredProvider) => {
76-provider = registeredProvider as RegisteredVllmProvider;
77-},
78-} as OpenClawPluginApi);
79-expect(provider?.id).toBe("vllm");
80-expect(provider?.catalog?.order).toBe("late");
81-const catalog = provider?.catalog;
82-if (!catalog) {
83-throw new Error("expected vllm provider catalog hook");
84-}
85-86-buildVllmProviderMock.mockResolvedValueOnce({
87-baseUrl: "http://127.0.0.1:8000/v1",
88-api: "openai-completions",
89-models: [{ id: "meta-llama/Meta-Llama-3-8B-Instruct", name: "Meta Llama 3" }],
90-});
91-92-await expect(
93-catalog.run({
94-config: {},
95-env: {
96-VLLM_API_KEY: "env-vllm-key",
97-} as NodeJS.ProcessEnv,
98-resolveProviderApiKey: () => ({
99-apiKey: "VLLM_API_KEY",
100-discoveryApiKey: "env-vllm-key",
101-}),
102-resolveProviderAuth: () => ({
103-apiKey: "VLLM_API_KEY",
104-discoveryApiKey: "env-vllm-key",
105-mode: "api_key",
106-source: "env",
107-}),
108-}),
109-).resolves.toEqual({
110-provider: {
111-baseUrl: "http://127.0.0.1:8000/v1",
112-api: "openai-completions",
113-apiKey: "VLLM_API_KEY",
114-models: [{ id: "meta-llama/Meta-Llama-3-8B-Instruct", name: "Meta Llama 3" }],
115-},
116-});
117-expect(buildVllmProviderMock).toHaveBeenCalledWith({
118-apiKey: "env-vllm-key",
119-});
120-expect(discoverOpenAICompatibleSelfHostedProviderMock).toHaveBeenCalledTimes(1);
121-const [discoveryParams] = discoverOpenAICompatibleSelfHostedProviderMock.mock.calls.at(0) ?? [];
122-if (discoveryParams === undefined) {
123-throw new Error("expected discovery parameters");
124-}
125-expect(discoveryParams.providerId).toBe("vllm");
126-expect(discoveryParams.buildProvider).toBeTypeOf("function");
127-});
4+describeVllmProviderDiscoveryContract({
5+load: () => import("./index.js"),
6+apiModuleId: fileURLToPath(new URL("./api.js", import.meta.url)),
1287});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。