



















@@ -575,6 +575,57 @@ describe("convertMessagesToInputItems", () => {
575575expect(items[0]).toMatchObject({ type: "message", role: "user", content: "Hello!" });
576576});
577577578+it("uses image_url parts for OpenAI-compatible user images", () => {
579+const msg: FakeMessage = {
580+role: "user",
581+content: [
582+{ type: "text", text: "describe this" },
583+{ type: "image", mimeType: "image/png", data: "AAAA" },
584+],
585+timestamp: 0,
586+};
587+const items = convertMessagesToInputItems(
588+[msg] as Parameters<typeof convertMessagesToInputItems>[0],
589+{ api: "openai-completions", input: ["text", "image"] },
590+);
591+592+expect(items).toEqual([
593+{
594+type: "message",
595+role: "user",
596+content: [
597+{ type: "input_text", text: "describe this" },
598+{ type: "image_url", image_url: { url: "data:image/png;base64,AAAA" } },
599+],
600+},
601+]);
602+});
603+604+it("keeps input_image parts for Responses user images", () => {
605+const msg: FakeMessage = {
606+role: "user",
607+content: [{ type: "image", mimeType: "image/png", data: "AAAA" }],
608+timestamp: 0,
609+};
610+const items = convertMessagesToInputItems(
611+[msg] as Parameters<typeof convertMessagesToInputItems>[0],
612+{ api: "openai-responses", input: ["text", "image"] },
613+);
614+615+expect(items).toEqual([
616+{
617+type: "message",
618+role: "user",
619+content: [
620+{
621+type: "input_image",
622+source: { type: "base64", media_type: "image/png", data: "AAAA" },
623+},
624+],
625+},
626+]);
627+});
628+578629it("converts an assistant text-only message", () => {
579630const items = convertMessagesToInputItems([assistantMsg(["Hi there."])] as Parameters<
580631typeof convertMessagesToInputItems
@@ -855,6 +906,37 @@ describe("convertMessagesToInputItems", () => {
855906});
856907});
857908909+it("preserves OpenAI-compatible tool-result images as follow-up image_url parts", () => {
910+const msg: FakeMessage = {
911+role: "toolResult",
912+toolCallId: "call_1",
913+toolName: "read",
914+content: [{ type: "image", mimeType: "image/png", data: "AAAA" }],
915+isError: false,
916+timestamp: 0,
917+};
918+const items = convertMessagesToInputItems(
919+[msg] as Parameters<typeof convertMessagesToInputItems>[0],
920+{ api: "openai-completions", input: ["text", "image"] },
921+);
922+923+expect(items).toEqual([
924+{
925+type: "function_call_output",
926+call_id: "call_1",
927+output: "(see attached image)",
928+},
929+{
930+type: "message",
931+role: "user",
932+content: [
933+{ type: "input_text", text: "Attached image(s) from tool result:" },
934+{ type: "image_url", image_url: { url: "data:image/png;base64,AAAA" } },
935+],
936+},
937+]);
938+});
939+858940it("drops tool result messages with empty tool call id", () => {
859941const msg = {
860942role: "toolResult" as const,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。