























@@ -1,6 +1,8 @@
11import type { StreamFn } from "@mariozechner/pi-agent-core";
22import type { Api, Context, Model } from "@mariozechner/pi-ai";
3+import { streamSimpleOpenAIResponses } from "@mariozechner/pi-ai/openai-responses";
34import { describe, expect, it } from "vitest";
5+import { applyXaiRuntimeModelCompat } from "./runtime-model-compat.js";
46import {
57createXaiFastModeWrapper,
68createXaiToolPayloadCompatibilityWrapper,
@@ -65,6 +67,44 @@ function runXaiToolPayloadWrapper(params: {
6567);
6668}
676970+async function captureXaiResponsesPayloadWithThinking(): Promise<Record<string, unknown>> {
71+const model = applyXaiRuntimeModelCompat({
72+api: "openai-responses",
73+provider: "xai",
74+id: "grok-4.3",
75+baseUrl: "https://api.x.ai/v1",
76+reasoning: true,
77+input: ["text", "image"],
78+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
79+contextWindow: 1_000_000,
80+maxTokens: 64_000,
81+} as Model<"openai-responses">);
82+83+const payloadPromise = new Promise<Record<string, unknown>>((resolve, reject) => {
84+const timeout = setTimeout(
85+() => reject(new Error("provider payload callback was not invoked")),
86+1_000,
87+);
88+const stream = streamSimpleOpenAIResponses(
89+model,
90+{ messages: [{ role: "user", content: "hello", timestamp: 0 }] },
91+{
92+apiKey: "test-api-key",
93+cacheRetention: "none",
94+reasoning: "low",
95+onPayload: (payload) => {
96+clearTimeout(timeout);
97+resolve(structuredClone(payload as Record<string, unknown>));
98+throw new Error("stop after payload capture");
99+},
100+},
101+);
102+void stream.result();
103+});
104+105+return await payloadPromise;
106+}
107+68108describe("xai stream wrappers", () => {
69109it("rewrites supported Grok models to fast variants when fast mode is enabled", () => {
70110expect(captureWrappedModelId({ modelId: "grok-3", fastMode: true })).toBe("grok-3-fast");
@@ -139,6 +179,13 @@ describe("xai stream wrappers", () => {
139179expect(payload).not.toHaveProperty("reasoning_effort");
140180});
141181182+it("marks native xAI Responses thinking efforts unsupported before pi-ai builds payloads", async () => {
183+const payload = await captureXaiResponsesPayloadWithThinking();
184+185+expect(payload).not.toHaveProperty("reasoning");
186+expect(payload).not.toHaveProperty("include");
187+});
188+142189it("moves image-bearing tool results out of function_call_output payloads", () => {
143190const payload: Record<string, unknown> = {
144191input: [
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。