























@@ -1,4 +1,4 @@
1-import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
1+import { mkdtemp, rm, writeFile } from "node:fs/promises";
22import os from "node:os";
33import path from "node:path";
44import { importFreshModule } from "openclaw/plugin-sdk/test-fixtures";
@@ -971,164 +971,6 @@ describe("runPreparedReply media-only handling", () => {
971971expect(call.followupRun.imageOrder).toEqual(["inline"]);
972972});
973973974-it("persists staged relative media paths as workspace-backed paths", async () => {
975-const tmpDir = await mkdtemp(path.join(os.tmpdir(), "openclaw-followup-image-"));
976-cleanupPaths.push(tmpDir);
977-const relativeImagePath = "media/inbound/inbound.png";
978-const imagePath = path.join(tmpDir, relativeImagePath);
979-await mkdir(path.dirname(imagePath), { recursive: true });
980-await writeFile(
981-imagePath,
982-Buffer.from(
983-"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+/p9sAAAAASUVORK5CYII=",
984-"base64",
985-),
986-);
987-988-const result = await runPreparedReply(
989-baseParams({
990-ctx: {
991-Body: "describe this",
992-RawBody: "describe this",
993-CommandBody: "describe this",
994-MediaPaths: [relativeImagePath],
995-MediaTypes: ["image/png"],
996-MediaWorkspaceDir: tmpDir,
997-OriginatingChannel: "telegram",
998-OriginatingTo: "42",
999-ChatType: "direct",
1000-},
1001-sessionCtx: {
1002-Body: "describe this",
1003-BodyStripped: "describe this",
1004-Provider: "telegram",
1005-OriginatingChannel: "telegram",
1006-OriginatingTo: "42",
1007-ChatType: "direct",
1008-MediaPaths: [relativeImagePath],
1009-MediaTypes: ["image/png"],
1010-MediaWorkspaceDir: tmpDir,
1011-},
1012-}),
1013-);
1014-1015-expect(result).toEqual({ text: "ok" });
1016-const call = requireRunReplyAgentCall();
1017-expect(call.followupRun.userTurnTranscriptRecorder?.message).toMatchObject({
1018-role: "user",
1019-content: "describe this",
1020-MediaPath: imagePath,
1021-MediaPaths: [imagePath],
1022-MediaType: "image/png",
1023-MediaTypes: ["image/png"],
1024-});
1025-});
1026-1027-it("persists clean media captions instead of model-only media notes", async () => {
1028-const tmpDir = await mkdtemp(path.join(os.tmpdir(), "openclaw-followup-image-"));
1029-cleanupPaths.push(tmpDir);
1030-const imagePath = path.join(tmpDir, "inbound.png");
1031-await writeFile(
1032-imagePath,
1033-Buffer.from(
1034-"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+/p9sAAAAASUVORK5CYII=",
1035-"base64",
1036-),
1037-);
1038-1039-await runPreparedReply(
1040-baseParams({
1041-ctx: {
1042-Body: "What is in this image?",
1043-RawBody: "What is in this image?",
1044-CommandBody: "What is in this image?",
1045-MediaPaths: [imagePath],
1046-MediaTypes: ["image/png"],
1047-MediaWorkspaceDir: tmpDir,
1048-OriginatingChannel: "telegram",
1049-OriginatingTo: "42",
1050-ChatType: "direct",
1051-},
1052-sessionCtx: {
1053-Body: "[media attached: media://inbound/a.png (image/png)]\nTo send an image back, prefer the message tool (media/path/filePath).\nWhat is in this image?",
1054-BodyStripped:
1055-"[media attached: media://inbound/a.png (image/png)]\nTo send an image back, prefer the message tool (media/path/filePath).\nWhat is in this image?",
1056-Provider: "telegram",
1057-OriginatingChannel: "telegram",
1058-OriginatingTo: "42",
1059-ChatType: "direct",
1060-MediaPaths: [imagePath],
1061-MediaTypes: ["image/png"],
1062-MediaWorkspaceDir: tmpDir,
1063-},
1064-}),
1065-);
1066-1067-const call = requireRunReplyAgentCall();
1068-expect(call.followupRun.userTurnTranscriptRecorder?.message).toMatchObject({
1069-role: "user",
1070-content: "What is in this image?",
1071-MediaPath: imagePath,
1072-MediaPaths: [imagePath],
1073-MediaType: "image/png",
1074-MediaTypes: ["image/png"],
1075-});
1076-const persistedContent = call.followupRun.userTurnTranscriptRecorder?.message?.content;
1077-expect(persistedContent).toBe("What is in this image?");
1078-expect(persistedContent).not.toContain("media attached");
1079-expect(persistedContent).not.toContain("message tool");
1080-});
1081-1082-it("uses a media-only transcript label for exact media placeholders", async () => {
1083-const tmpDir = await mkdtemp(path.join(os.tmpdir(), "openclaw-followup-image-"));
1084-cleanupPaths.push(tmpDir);
1085-const imagePath = path.join(tmpDir, "inbound.png");
1086-await writeFile(
1087-imagePath,
1088-Buffer.from(
1089-"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+/p9sAAAAASUVORK5CYII=",
1090-"base64",
1091-),
1092-);
1093-1094-await runPreparedReply(
1095-baseParams({
1096-ctx: {
1097-Body: "<media:image>",
1098-RawBody: "<media:image>",
1099-CommandBody: "<media:image>",
1100-MediaPaths: [imagePath],
1101-MediaTypes: ["image/png"],
1102-MediaWorkspaceDir: tmpDir,
1103-OriginatingChannel: "telegram",
1104-OriginatingTo: "42",
1105-ChatType: "direct",
1106-},
1107-sessionCtx: {
1108-Body: "<media:image>",
1109-BodyStripped: "<media:image>",
1110-Provider: "telegram",
1111-OriginatingChannel: "telegram",
1112-OriginatingTo: "42",
1113-ChatType: "direct",
1114-MediaPaths: [imagePath],
1115-MediaTypes: ["image/png"],
1116-MediaWorkspaceDir: tmpDir,
1117-},
1118-}),
1119-);
1120-1121-const call = requireRunReplyAgentCall();
1122-expect(call.followupRun.userTurnTranscriptRecorder?.message).toMatchObject({
1123-role: "user",
1124-content: "[User sent media without caption]",
1125-MediaPath: imagePath,
1126-MediaPaths: [imagePath],
1127-MediaType: "image/png",
1128-MediaTypes: ["image/png"],
1129-});
1130-});
1131-1132974it("does not copy prior session media onto text-only followups", async () => {
1133975await runPreparedReply(
1134976baseParams({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。