

























@@ -57,11 +57,6 @@ async function collectDoneMessage(
5757return doneMessage!;
5858}
595960-function extractFirstToolCallId(message: AssistantLikeMessage): string | undefined {
61-const toolCall = message.content.find((block) => block.type === "toolCall");
62-return toolCall?.id;
63-}
64-6560describeLive("xai live", () => {
6661it("returns assistant text for Grok 4.3", async () => {
6762await runXaiLiveCase("complete", async () => {
@@ -83,7 +78,7 @@ describeLive("xai live", () => {
8378});
8479}, 30_000);
858086-it("applies xAI tool wrappers on live tool calls", async () => {
81+it("sends wrapped xAI tool payloads live", async () => {
8782await runXaiLiveCase("tool-call", async () => {
8883const model = resolveLiveXaiModel();
8984expect(model).toBeDefined();
@@ -96,54 +91,39 @@ describeLive("xai live", () => {
9691parameters: Type.Object({}, { additionalProperties: false }),
9792};
989399-const prompts = [
100-"Call the tool `noop` with {}. Do not write any other text.",
101-"IMPORTANT: Call the tool `noop` with {} and respond only with the tool call.",
102-"Return only a tool call for `noop` with {}.",
103-];
104-105-let doneMessage: AssistantLikeMessage | undefined;
10694let capturedPayload: Record<string, unknown> | undefined;
107-108-for (const prompt of prompts) {
109-capturedPayload = undefined;
110-const stream = agent.streamFn(
111-model,
112-{
113-messages: createSingleUserPromptMessage(prompt),
114-tools: [noopTool],
115-},
116-{
117-apiKey: XAI_KEY,
118-maxTokens: 128,
119-reasoning: "medium",
120-onPayload: (payload) => {
121-capturedPayload = payload as Record<string, unknown>;
122-},
95+const stream = agent.streamFn(
96+model,
97+{
98+messages: createSingleUserPromptMessage(
99+"Call the tool `noop` with {} if needed, then finish.",
100+),
101+tools: [noopTool],
102+},
103+{
104+apiKey: XAI_KEY,
105+maxTokens: 128,
106+reasoning: "medium",
107+onPayload: (payload) => {
108+capturedPayload = payload as Record<string, unknown>;
123109},
124-);
125-126-doneMessage = await collectDoneMessage(
127-stream as AsyncIterable<{ type: string; message?: AssistantLikeMessage }>,
128-);
129-if (extractFirstToolCallId(doneMessage)) {
130-break;
131-}
132-}
110+},
111+);
133112113+const doneMessage = await collectDoneMessage(
114+stream as AsyncIterable<{ type: string; message?: AssistantLikeMessage }>,
115+);
134116expect(doneMessage).toBeDefined();
135-expect(extractFirstToolCallId(doneMessage!)).toBeDefined();
136-if (capturedPayload && Object.hasOwn(capturedPayload, "tool_stream")) {
137-expect(capturedPayload.tool_stream).toBe(true);
138-}
117+expect(capturedPayload).toBeDefined();
118+expect(capturedPayload?.tool_stream).toBe(true);
139119140120const payloadTools = Array.isArray(capturedPayload?.tools)
141121 ? (capturedPayload.tools as Array<Record<string, unknown>>)
142122 : [];
123+expect(payloadTools.length).toBeGreaterThan(0);
143124const firstFunction = payloadTools[0]?.function;
144-if (firstFunction && typeof firstFunction === "object") {
145-expect([undefined, false]).toContain((firstFunction as Record<string, unknown>).strict);
146-}
125+expect(firstFunction && typeof firstFunction === "object").toBe(true);
126+expect([undefined, false]).toContain((firstFunction as Record<string, unknown>).strict);
147127});
148128}, 90_000);
149129此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。