Skip to content

Commit b91bc60

Browse files
committed
structure tool output
1 parent e9f6df8 commit b91bc60

File tree

1 file changed

+16
-28
lines changed

1 file changed

+16
-28
lines changed

src/mapping.ts

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import {
4747
type ProviderOptions,
4848
type ReasoningPart,
4949
} from "@ai-sdk/provider-utils";
50+
import { type LanguageModelV2ToolResultOutput } from "@ai-sdk/provider";
5051
import { parse, validate } from "convex-helpers/validators";
5152
import {
5253
extractText,
@@ -296,9 +297,8 @@ export async function serializeStepContent(
296297
} = {};
297298
if ("providerOptions" in part) {
298299
metadata.providerOptions = part.providerOptions as ProviderOptions;
299-
}
300-
if ("providerMetadata" in part) {
301-
metadata.providerMetadata = part.providerMetadata as ProviderMetadata;
300+
} else if ("providerMetadata" in part) {
301+
metadata.providerMetadata = part.providerMetadata;
302302
}
303303
switch (part.type) {
304304
case "text": {
@@ -323,20 +323,27 @@ export async function serializeStepContent(
323323
...metadata,
324324
} satisfies Infer<typeof vToolCallPart>;
325325
}
326-
case "tool-result":
326+
case "tool-result": {
327+
const rawOutput = part.output;
328+
const output: LanguageModelV2ToolResultOutput =
329+
typeof rawOutput === "string"
330+
? { type: "text", value: rawOutput }
331+
: { type: "json", value: part.output ?? null };
332+
327333
return {
328334
...pick(part, [
329335
"type",
330336
"toolCallId",
331337
"toolName",
332-
"output",
333338
"dynamic",
334339
"preliminary",
335340
"providerExecuted",
336341
]),
337342
args: part.input,
343+
output,
338344
...metadata,
339345
} satisfies Infer<typeof vToolResultPart>;
346+
}
340347
case "tool-error":
341348
return {
342349
...pick(part, [
@@ -353,14 +360,14 @@ export async function serializeStepContent(
353360
type: "error-text",
354361
value: part.error.message,
355362
}
356-
: typeof part.error === "object"
363+
: typeof part.error === "string"
357364
? {
358-
type: "error-json",
365+
type: "error-text",
359366
value: part.error,
360367
}
361368
: {
362-
type: "error-text",
363-
value: String(part.error),
369+
type: "error-json",
370+
value: part.error ?? null,
364371
},
365372
...metadata,
366373
} satisfies Infer<typeof vToolResultPart>;
@@ -820,22 +827,3 @@ export function toUIFilePart(
820827
providerMetadata: part.providerOptions,
821828
};
822829
}
823-
824-
// Currently unused
825-
// export function toModelMessages(args: {
826-
// messages?: ModelMessage[] | AIMessageWithoutId[];
827-
// }): ModelMessage[] {
828-
// const messages: ModelMessage[] = [];
829-
// if (args.messages) {
830-
// if (
831-
// args.messages.every(
832-
// (m) => typeof m === "object" && m !== null && "parts" in m,
833-
// )
834-
// ) {
835-
// messages.push(...convertToModelMessages(args.messages));
836-
// } else {
837-
// messages.push(...modelMessageSchema.array().parse(args.messages));
838-
// }
839-
// }
840-
// return messages;
841-
// }

0 commit comments

Comments
 (0)