@downcity/agent 1.1.168 → 1.1.170
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/executor/messages/SessionAttachmentMapper.d.ts +10 -0
- package/bin/executor/messages/SessionAttachmentMapper.d.ts.map +1 -1
- package/bin/executor/messages/SessionAttachmentMapper.js +49 -0
- package/bin/executor/messages/SessionAttachmentMapper.js.map +1 -1
- package/bin/session/services/SessionStateService.d.ts.map +1 -1
- package/bin/session/services/SessionStateService.js +3 -2
- package/bin/session/services/SessionStateService.js.map +1 -1
- package/package.json +3 -3
- package/scripts/assistant-file-resource.test.mjs +59 -0
- package/src/executor/messages/SessionAttachmentMapper.ts +61 -0
- package/src/session/services/SessionStateService.ts +6 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -7,7 +7,17 @@
|
|
|
7
7
|
* - 当前只为图片与 PDF 注入 file part,保持多模态模型可直接消费。
|
|
8
8
|
* - 历史中的相对路径与旧版 `file://` 会在喂给模型前临时 hydrate。
|
|
9
9
|
*/
|
|
10
|
+
import type { SessionUserMessagePart } from "../../types/sdk/AgentSessionPrompt.js";
|
|
10
11
|
import type { SessionMessageV1 } from "../../executor/types/SessionMessages.js";
|
|
12
|
+
/**
|
|
13
|
+
* 在用户 prompt 入库前,将本地图片 file part 转成 data URL。
|
|
14
|
+
*
|
|
15
|
+
* 关键点(中文)
|
|
16
|
+
* - 只处理调用侧直接传入的图片 file part。
|
|
17
|
+
* - 已经是 data URL 或远程 URL 的附件保持原样。
|
|
18
|
+
* - 本地文件读取失败时直接报错,避免模型请求拿到不可访问的本地路径。
|
|
19
|
+
*/
|
|
20
|
+
export declare function hydrateUserPromptFileParts(parts: SessionUserMessagePart[], project_root?: string): Promise<SessionUserMessagePart[]>;
|
|
11
21
|
/**
|
|
12
22
|
* 将历史中的资源 file part 临时转换为模型可消费的 data URL。
|
|
13
23
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionAttachmentMapper.d.ts","sourceRoot":"","sources":["../../../src/executor/messages/SessionAttachmentMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionAttachmentMapper.d.ts","sourceRoot":"","sources":["../../../src/executor/messages/SessionAttachmentMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AA+G5E;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,sBAAsB,EAAE,EAC/B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAsBnC;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2B7B;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsF7B"}
|
|
@@ -99,6 +99,55 @@ async function hydrateFileUrlPart(part, projectRoot) {
|
|
|
99
99
|
return part;
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
+
async function hydrateFileUrlPartStrict(part, project_root) {
|
|
103
|
+
const url = String(part.url || "").trim();
|
|
104
|
+
const file_path = resolveHydratableFilePath(project_root, url);
|
|
105
|
+
if (!file_path)
|
|
106
|
+
return part;
|
|
107
|
+
try {
|
|
108
|
+
const buffer = await fs.readFile(file_path);
|
|
109
|
+
const media_type = String(part.mediaType || "").trim() ||
|
|
110
|
+
guessAttachmentMediaTypeFromPath(file_path) ||
|
|
111
|
+
"application/octet-stream";
|
|
112
|
+
return {
|
|
113
|
+
...part,
|
|
114
|
+
mediaType: media_type,
|
|
115
|
+
url: buildDataUrl(media_type, buffer),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
120
|
+
throw new Error(`读取本地附件失败:${file_path}。${message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 在用户 prompt 入库前,将本地图片 file part 转成 data URL。
|
|
125
|
+
*
|
|
126
|
+
* 关键点(中文)
|
|
127
|
+
* - 只处理调用侧直接传入的图片 file part。
|
|
128
|
+
* - 已经是 data URL 或远程 URL 的附件保持原样。
|
|
129
|
+
* - 本地文件读取失败时直接报错,避免模型请求拿到不可访问的本地路径。
|
|
130
|
+
*/
|
|
131
|
+
export async function hydrateUserPromptFileParts(parts, project_root) {
|
|
132
|
+
if (!Array.isArray(parts) || parts.length === 0)
|
|
133
|
+
return [];
|
|
134
|
+
const out = [];
|
|
135
|
+
for (const part of parts) {
|
|
136
|
+
if (!isFileUIPart(part)) {
|
|
137
|
+
out.push(part);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const file_part = part;
|
|
141
|
+
const media_type = String(file_part.mediaType || "").trim();
|
|
142
|
+
if (!media_type.startsWith("image/")) {
|
|
143
|
+
out.push(part);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const next_part = await hydrateFileUrlPartStrict(file_part, project_root);
|
|
147
|
+
out.push(next_part);
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
102
151
|
/**
|
|
103
152
|
* 将历史中的资源 file part 临时转换为模型可消费的 data URL。
|
|
104
153
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionAttachmentMapper.js","sourceRoot":"","sources":["../../../src/executor/messages/SessionAttachmentMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,YAAY,GAEb,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionAttachmentMapper.js","sourceRoot":"","sources":["../../../src/executor/messages/SessionAttachmentMapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionStateService.d.ts","sourceRoot":"","sources":["../../../src/session/services/SessionStateService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"SessionStateService.d.ts","sourceRoot":"","sources":["../../../src/session/services/SessionStateService.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import { inferAgentModelLabel, normalizeAgentModel, } from "../../model/CityMode
|
|
|
10
10
|
import { patchSessionModelLabel, readSessionMetadata, resolveSystemTimezone, touchSessionMetadata, writeSessionMetadata, } from "../../session/index.js";
|
|
11
11
|
import { ensureSessionTitle } from "../../session/SessionTitle.js";
|
|
12
12
|
import { persistSdkAssistantResult } from "../../session/storage/Persistence.js";
|
|
13
|
+
import { hydrateUserPromptFileParts } from "../../executor/messages/SessionAttachmentMapper.js";
|
|
13
14
|
import { generateId } from "../../utils/Id.js";
|
|
14
15
|
/**
|
|
15
16
|
* 本地 Session 状态与持久化服务。
|
|
@@ -225,8 +226,8 @@ export class SessionStateService {
|
|
|
225
226
|
await this.touch_metadata();
|
|
226
227
|
return message;
|
|
227
228
|
}
|
|
228
|
-
// query 是 parts
|
|
229
|
-
const parts = Array.isArray(query) ? query : [];
|
|
229
|
+
// query 是 parts 数组,先把本地图片附件转换为模型可消费的 data URL。
|
|
230
|
+
const parts = await hydrateUserPromptFileParts(Array.isArray(query) ? query : [], this.project_root);
|
|
230
231
|
const message = {
|
|
231
232
|
id: `u:${this.session_id}:${generateId()}`,
|
|
232
233
|
role: "user",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionStateService.js","sourceRoot":"","sources":["../../../src/session/services/SessionStateService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionStateService.js","sourceRoot":"","sources":["../../../src/session/services/SessionStateService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@downcity/agent",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.170",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Downcity Agent 运行时 — 单 Agent 执行壳与本机 RPC 能力",
|
|
6
6
|
"main": "./bin/index.js",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@ai-sdk/openai-compatible": "^2.0.48",
|
|
20
|
-
"@downcity/shell": "^0.1.
|
|
21
|
-
"@downcity/type": "0.1.
|
|
20
|
+
"@downcity/shell": "^0.1.43",
|
|
21
|
+
"@downcity/type": "0.1.76",
|
|
22
22
|
"ai": "^6.0.193",
|
|
23
23
|
"commander": "^15.0.0",
|
|
24
24
|
"dotenv": "^17.4.2",
|
|
@@ -16,6 +16,7 @@ import { pathToFileURL } from "node:url";
|
|
|
16
16
|
|
|
17
17
|
import { materializeAssistantFileParts } from "../bin/executor/messages/AssistantFileResource.js";
|
|
18
18
|
import {
|
|
19
|
+
hydrateUserPromptFileParts,
|
|
19
20
|
hydrateFileUrlPartsForModel,
|
|
20
21
|
injectFilePartsFromAttachments,
|
|
21
22
|
} from "../bin/executor/messages/SessionAttachmentMapper.js";
|
|
@@ -169,6 +170,64 @@ test("hydrateFileUrlPartsForModel converts relative resource paths back to data
|
|
|
169
170
|
assert.match(materialized[0].url, /^\.downcity\/resources\//);
|
|
170
171
|
});
|
|
171
172
|
|
|
173
|
+
test("hydrateUserPromptFileParts converts local image paths to data URLs before persistence", async () => {
|
|
174
|
+
const project_root = await fs.mkdtemp(
|
|
175
|
+
path.join(os.tmpdir(), "downcity-agent-user-prompt-image-"),
|
|
176
|
+
);
|
|
177
|
+
const bytes = Buffer.from("user-prompt-image-bytes", "utf8");
|
|
178
|
+
const image_path = path.join(project_root, "image.png");
|
|
179
|
+
await fs.writeFile(image_path, bytes);
|
|
180
|
+
|
|
181
|
+
const parts = await hydrateUserPromptFileParts(
|
|
182
|
+
[
|
|
183
|
+
{
|
|
184
|
+
type: "text",
|
|
185
|
+
text: "这张图写了啥",
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: "file",
|
|
189
|
+
mediaType: "image/png",
|
|
190
|
+
filename: "image.png",
|
|
191
|
+
url: image_path,
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
project_root,
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
assert.equal(parts[0]?.type, "text");
|
|
198
|
+
assert.equal(parts[1]?.type, "file");
|
|
199
|
+
assert.equal(parts[1]?.mediaType, "image/png");
|
|
200
|
+
assert.equal(
|
|
201
|
+
parts[1]?.url,
|
|
202
|
+
`data:image/png;base64,${bytes.toString("base64")}`,
|
|
203
|
+
);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("hydrateUserPromptFileParts keeps existing data URLs and non-image files unchanged", async () => {
|
|
207
|
+
const data_url = "data:image/png;base64,already-base64";
|
|
208
|
+
const pdf_url = "/tmp/input.pdf";
|
|
209
|
+
const parts = await hydrateUserPromptFileParts(
|
|
210
|
+
[
|
|
211
|
+
{
|
|
212
|
+
type: "file",
|
|
213
|
+
mediaType: "image/png",
|
|
214
|
+
filename: "image.png",
|
|
215
|
+
url: data_url,
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
type: "file",
|
|
219
|
+
mediaType: "application/pdf",
|
|
220
|
+
filename: "input.pdf",
|
|
221
|
+
url: pdf_url,
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
process.cwd(),
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
assert.equal(parts[0]?.url, data_url);
|
|
228
|
+
assert.equal(parts[1]?.url, pdf_url);
|
|
229
|
+
});
|
|
230
|
+
|
|
172
231
|
test("hydrateFileUrlPartsForModel keeps old file URLs compatible", async () => {
|
|
173
232
|
const project_root = await fs.mkdtemp(
|
|
174
233
|
path.join(os.tmpdir(), "downcity-agent-assistant-file-url-"),
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
isTextUIPart,
|
|
17
17
|
type FileUIPart,
|
|
18
18
|
} from "ai";
|
|
19
|
+
import type { SessionUserMessagePart } from "@/types/sdk/AgentSessionPrompt.js";
|
|
19
20
|
import type { SessionMessageV1 } from "@/executor/types/SessionMessages.js";
|
|
20
21
|
import { parseChatMessageMarkup } from "@/executor/messages/ChatMessageMarkup.js";
|
|
21
22
|
|
|
@@ -102,6 +103,66 @@ async function hydrateFileUrlPart(
|
|
|
102
103
|
}
|
|
103
104
|
}
|
|
104
105
|
|
|
106
|
+
async function hydrateFileUrlPartStrict(
|
|
107
|
+
part: FileUIPart,
|
|
108
|
+
project_root?: string,
|
|
109
|
+
): Promise<FileUIPart> {
|
|
110
|
+
const url = String(part.url || "").trim();
|
|
111
|
+
const file_path = resolveHydratableFilePath(project_root, url);
|
|
112
|
+
if (!file_path) return part;
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
const buffer = await fs.readFile(file_path);
|
|
116
|
+
const media_type =
|
|
117
|
+
String(part.mediaType || "").trim() ||
|
|
118
|
+
guessAttachmentMediaTypeFromPath(file_path) ||
|
|
119
|
+
"application/octet-stream";
|
|
120
|
+
return {
|
|
121
|
+
...part,
|
|
122
|
+
mediaType: media_type,
|
|
123
|
+
url: buildDataUrl(media_type, buffer),
|
|
124
|
+
};
|
|
125
|
+
} catch (error) {
|
|
126
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
127
|
+
throw new Error(`读取本地附件失败:${file_path}。${message}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 在用户 prompt 入库前,将本地图片 file part 转成 data URL。
|
|
133
|
+
*
|
|
134
|
+
* 关键点(中文)
|
|
135
|
+
* - 只处理调用侧直接传入的图片 file part。
|
|
136
|
+
* - 已经是 data URL 或远程 URL 的附件保持原样。
|
|
137
|
+
* - 本地文件读取失败时直接报错,避免模型请求拿到不可访问的本地路径。
|
|
138
|
+
*/
|
|
139
|
+
export async function hydrateUserPromptFileParts(
|
|
140
|
+
parts: SessionUserMessagePart[],
|
|
141
|
+
project_root?: string,
|
|
142
|
+
): Promise<SessionUserMessagePart[]> {
|
|
143
|
+
if (!Array.isArray(parts) || parts.length === 0) return [];
|
|
144
|
+
|
|
145
|
+
const out: SessionUserMessagePart[] = [];
|
|
146
|
+
for (const part of parts) {
|
|
147
|
+
if (!isFileUIPart(part as FileUIPart)) {
|
|
148
|
+
out.push(part);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const file_part = part as FileUIPart;
|
|
153
|
+
const media_type = String(file_part.mediaType || "").trim();
|
|
154
|
+
if (!media_type.startsWith("image/")) {
|
|
155
|
+
out.push(part);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const next_part = await hydrateFileUrlPartStrict(file_part, project_root);
|
|
160
|
+
out.push(next_part as SessionUserMessagePart);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
|
|
105
166
|
/**
|
|
106
167
|
* 将历史中的资源 file part 临时转换为模型可消费的 data URL。
|
|
107
168
|
*
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from "@/session/index.js";
|
|
21
21
|
import { ensureSessionTitle } from "@/session/SessionTitle.js";
|
|
22
22
|
import { persistSdkAssistantResult } from "@/session/storage/Persistence.js";
|
|
23
|
+
import { hydrateUserPromptFileParts } from "@executor/messages/SessionAttachmentMapper.js";
|
|
23
24
|
import type { Executor } from "@executor/Executor.js";
|
|
24
25
|
import type { JsonlSessionHistoryStore } from "@/executor/store/history/jsonl/JsonlSessionHistoryStore.js";
|
|
25
26
|
import type {
|
|
@@ -324,8 +325,11 @@ export class SessionStateService {
|
|
|
324
325
|
return message;
|
|
325
326
|
}
|
|
326
327
|
|
|
327
|
-
// query 是 parts
|
|
328
|
-
const parts =
|
|
328
|
+
// query 是 parts 数组,先把本地图片附件转换为模型可消费的 data URL。
|
|
329
|
+
const parts = await hydrateUserPromptFileParts(
|
|
330
|
+
Array.isArray(query) ? query : [],
|
|
331
|
+
this.project_root,
|
|
332
|
+
);
|
|
329
333
|
const message: SessionUserMessageV1 = {
|
|
330
334
|
id: `u:${this.session_id}:${generateId()}`,
|
|
331
335
|
role: "user",
|