
























@@ -58,6 +58,24 @@ vi.mock("openclaw/plugin-sdk/text-runtime", () => ({
5858readStringValue: (v: unknown) => (typeof v === "string" ? v.trim() : undefined),
5959}));
606061+function requirePostJsonCall(index = 0): {
62+url?: string;
63+timeoutMs?: number;
64+body?: Record<string, unknown>;
65+} {
66+const params = (postJsonRequestMock.mock.calls as unknown as Array<[unknown]>)[index]?.[0] as
67+| {
68+url?: string;
69+timeoutMs?: number;
70+body?: Record<string, unknown>;
71+}
72+| undefined;
73+if (!params) {
74+throw new Error(`Expected postJsonRequest call ${index}`);
75+}
76+return params;
77+}
78+6179describe("xai image generation provider", () => {
6280afterEach(() => {
6381resolveApiKeyForProviderMock.mockClear();
@@ -128,26 +146,27 @@ describe("xai image generation provider", () => {
128146},
129147} as any);
130148131-expect(resolveApiKeyForProviderMock).toHaveBeenCalledWith(
132-expect.objectContaining({ provider: "xai" }),
133-);
134-expect(resolveProviderHttpRequestConfigMock).toHaveBeenCalledWith(
135-expect.objectContaining({
136-provider: "xai",
137-capability: "image",
138-baseUrl: "https://custom.x.ai/v1",
139-}),
140-);
141-expect(postJsonRequestMock).toHaveBeenCalledWith(
142-expect.objectContaining({
143-url: expect.stringContaining("/images/generations"),
144-timeoutMs: 180_000,
145-body: expect.objectContaining({
146-aspect_ratio: "2:3",
147-resolution: "2k",
148-}),
149-}),
150-);
149+const authParams = (
150+resolveApiKeyForProviderMock.mock.calls as unknown as Array<[unknown]>
151+)[0]?.[0] as { provider?: string } | undefined;
152+expect(authParams?.provider).toBe("xai");
153+const httpParams = (
154+resolveProviderHttpRequestConfigMock.mock.calls as unknown as Array<[unknown]>
155+)[0]?.[0] as
156+| {
157+provider?: string;
158+capability?: string;
159+baseUrl?: string;
160+}
161+| undefined;
162+expect(httpParams?.provider).toBe("xai");
163+expect(httpParams?.capability).toBe("image");
164+expect(httpParams?.baseUrl).toBe("https://custom.x.ai/v1");
165+const request = requirePostJsonCall();
166+expect(request.url).toContain("/images/generations");
167+expect(request.timeoutMs).toBe(180_000);
168+expect(request.body?.aspect_ratio).toBe("2:3");
169+expect(request.body?.resolution).toBe("2k");
151170});
152171153172it("supports edit with exact user-provided payload format including image object with type image_url", async () => {
@@ -181,20 +200,14 @@ describe("xai image generation provider", () => {
181200cfg: {},
182201} as any);
183202184-expect(postJsonRequestMock).toHaveBeenCalledWith(
185-expect.objectContaining({
186-url: expect.stringContaining("/images/edits"),
187-body: expect.objectContaining({
188-model: "grok-imagine-image-pro",
189-prompt: "Render this as a pencil sketch with detailed shading",
190-image: {
191-url: expect.stringContaining("data:image/png;base64,"),
192-type: "image_url",
193-},
194-response_format: "b64_json",
195-}),
196-}),
197-);
203+const request = requirePostJsonCall();
204+expect(request.url).toContain("/images/edits");
205+expect(request.body?.model).toBe("grok-imagine-image-pro");
206+expect(request.body?.prompt).toBe("Render this as a pencil sketch with detailed shading");
207+const image = request.body?.image as { url?: string; type?: string } | undefined;
208+expect(image?.url).toContain("data:image/png;base64,");
209+expect(image?.type).toBe("image_url");
210+expect(request.body?.response_format).toBe("b64_json");
198211});
199212200213it("uses the plural xAI images payload for multiple edit inputs", async () => {
@@ -224,22 +237,13 @@ describe("xai image generation provider", () => {
224237cfg: {},
225238} as any);
226239227-expect(postJsonRequestMock).toHaveBeenCalledWith(
228-expect.objectContaining({
229-url: expect.stringContaining("/images/edits"),
230-body: expect.objectContaining({
231-images: [
232-{
233-url: expect.stringContaining("data:image/png;base64,"),
234-type: "image_url",
235-},
236-{
237-url: expect.stringContaining("data:image/jpeg;base64,"),
238-type: "image_url",
239-},
240-],
241-}),
242-}),
243-);
240+const request = requirePostJsonCall();
241+expect(request.url).toContain("/images/edits");
242+const images = request.body?.images as Array<{ url?: string; type?: string }> | undefined;
243+expect(images).toHaveLength(2);
244+expect(images?.[0]?.url).toContain("data:image/png;base64,");
245+expect(images?.[0]?.type).toBe("image_url");
246+expect(images?.[1]?.url).toContain("data:image/jpeg;base64,");
247+expect(images?.[1]?.type).toBe("image_url");
244248});
245249});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。