























1+// Mock OpenAI Config tests cover shared E2E mock model config helpers.
2+import { describe, expect, it } from "vitest";
3+import {
4+applyMockOpenAiModelConfig,
5+parseMockOpenAiPort,
6+} from "../../scripts/e2e/lib/fixtures/mock-openai-config.mjs";
7+8+type MockConfig = {
9+agents: {
10+defaults: {
11+imageGenerationModel?: unknown;
12+imageModel?: unknown;
13+model?: unknown;
14+models: Record<string, unknown>;
15+};
16+list: Array<{
17+id: string;
18+model: { primary: string };
19+models: Record<string, { agentRuntime?: unknown; params: Record<string, unknown> }>;
20+}>;
21+};
22+models: {
23+providers: {
24+openai: {
25+api?: string;
26+apiKey?: unknown;
27+baseUrl?: string;
28+models?: unknown[];
29+request: Record<string, unknown>;
30+};
31+};
32+};
33+plugins?: unknown;
34+};
35+36+describe("scripts/e2e/lib/fixtures/mock-openai-config.mjs", () => {
37+it("parses strict TCP port values", () => {
38+expect(parseMockOpenAiPort("18080")).toBe(18080);
39+expect(parseMockOpenAiPort(443)).toBe(443);
40+41+for (const value of [undefined, "", "0", "65536", "1e3", "18080tcp"]) {
42+expect(() => parseMockOpenAiPort(value, "test mock port")).toThrow(
43+/test mock port must be a TCP port from 1 to 65535/u,
44+);
45+}
46+});
47+48+it("writes mock OpenAI provider and agent defaults", () => {
49+const cfg: MockConfig = {
50+agents: {
51+defaults: {
52+models: {
53+"openai/gpt-5.4": { params: { preserved: true } },
54+},
55+},
56+list: [
57+{
58+id: "release-agent",
59+model: { primary: "openai/gpt-5.4" },
60+models: {
61+"openai/gpt-5.5": {
62+params: { existing: true },
63+},
64+},
65+},
66+],
67+},
68+models: {
69+providers: {
70+openai: {
71+request: { timeoutMs: 10_000 },
72+},
73+},
74+},
75+};
76+77+applyMockOpenAiModelConfig(cfg, {
78+includeImageDefaults: true,
79+mockPort: "18181",
80+modelRef: "openai/gpt-5.5",
81+});
82+83+expect(cfg.models.providers.openai).toMatchObject({
84+api: "openai-responses",
85+apiKey: { source: "env", provider: "default", id: "OPENAI_API_KEY" },
86+baseUrl: "http://127.0.0.1:18181/v1",
87+request: { allowPrivateNetwork: true, timeoutMs: 10_000 },
88+});
89+expect(cfg.models.providers.openai.models).toEqual([
90+expect.objectContaining({
91+id: "gpt-5.5",
92+api: "openai-responses",
93+input: ["text", "image"],
94+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
95+}),
96+]);
97+expect(cfg.agents.defaults).toMatchObject({
98+imageGenerationModel: { primary: "openai/gpt-image-1", timeoutMs: 30_000 },
99+imageModel: { primary: "openai/gpt-5.5", timeoutMs: 30_000 },
100+model: { primary: "openai/gpt-5.5" },
101+models: {
102+"openai/gpt-5.4": { params: { preserved: true } },
103+"openai/gpt-5.5": {
104+agentRuntime: { id: "openclaw" },
105+params: { transport: "sse", openaiWsWarmup: false },
106+},
107+},
108+});
109+expect(cfg.agents.list[0]).toMatchObject({
110+model: { primary: "openai/gpt-5.5" },
111+models: {
112+"openai/gpt-5.5": {
113+params: { existing: true, transport: "sse", openaiWsWarmup: false },
114+},
115+},
116+});
117+expect(cfg.plugins).toEqual({ enabled: true });
118+});
119+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。