@downcity/agent 1.1.263 → 1.1.265
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/core-engine/CoreEngineRunner.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.js +0 -2
- package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
- package/bin/executor/messages/SessionMessageCodec.d.ts +0 -12
- package/bin/executor/messages/SessionMessageCodec.d.ts.map +1 -1
- package/bin/executor/messages/SessionMessageCodec.js +0 -16
- package/bin/executor/messages/SessionMessageCodec.js.map +1 -1
- package/bin/session/SessionTitle.d.ts.map +1 -1
- package/bin/session/SessionTitle.js +6 -2
- package/bin/session/SessionTitle.js.map +1 -1
- package/bin/session/SessionTurn.d.ts.map +1 -1
- package/bin/session/SessionTurn.js +3 -0
- package/bin/session/SessionTurn.js.map +1 -1
- package/bin/session/messages/SessionAssistantMessageWriter.d.ts +8 -1
- package/bin/session/messages/SessionAssistantMessageWriter.d.ts.map +1 -1
- package/bin/session/messages/SessionAssistantMessageWriter.js +98 -9
- package/bin/session/messages/SessionAssistantMessageWriter.js.map +1 -1
- package/bin/session/messages/SessionJsonValue.d.ts +10 -0
- package/bin/session/messages/SessionJsonValue.d.ts.map +1 -1
- package/bin/session/messages/SessionJsonValue.js +30 -0
- package/bin/session/messages/SessionJsonValue.js.map +1 -1
- package/bin/session/messages/SessionMessageCodec.d.ts.map +1 -1
- package/bin/session/messages/SessionMessageCodec.js +30 -1
- package/bin/session/messages/SessionMessageCodec.js.map +1 -1
- package/bin/types/session/SessionMessage.d.ts +7 -0
- package/bin/types/session/SessionMessage.d.ts.map +1 -1
- package/package.json +4 -3
- package/scripts/city-model-tool-loop.test.mjs +13 -0
- package/scripts/core-engine-context-compaction.test.mjs +4 -0
- package/scripts/openai-responses-continuation.test.mjs +48 -0
- package/scripts/session-messages.test.mjs +171 -1
- package/src/executor/core-engine/CoreEngineRunner.ts +0 -2
- package/src/executor/messages/SessionMessageCodec.ts +0 -21
- package/src/session/SessionTitle.ts +6 -2
- package/src/session/SessionTurn.ts +2 -0
- package/src/session/messages/SessionAssistantMessageWriter.ts +118 -10
- package/src/session/messages/SessionJsonValue.ts +30 -0
- package/src/session/messages/SessionMessageCodec.ts +37 -1
- package/src/types/session/SessionMessage.ts +7 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -20,4 +20,34 @@ export function to_session_json_value(input) {
|
|
|
20
20
|
return String(input);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* 把 AI SDK Provider metadata 规整为可持久化快照。
|
|
25
|
+
*
|
|
26
|
+
* 关键点(中文)
|
|
27
|
+
* - ProviderMetadata 顶层是 provider ID 到 JSON 对象的映射。
|
|
28
|
+
* - 新 metadata 代表完整快照,不在这里猜测 Provider 的字段合并语义。
|
|
29
|
+
* - 非法 metadata 返回 undefined,由调用方保留已经持久化的旧快照。
|
|
30
|
+
*/
|
|
31
|
+
export function to_session_provider_metadata(input) {
|
|
32
|
+
if (!is_plain_object(input))
|
|
33
|
+
return undefined;
|
|
34
|
+
try {
|
|
35
|
+
const value = JSON.parse(JSON.stringify(input));
|
|
36
|
+
if (!is_plain_object(value))
|
|
37
|
+
return undefined;
|
|
38
|
+
if (!Object.values(value).every(is_plain_object))
|
|
39
|
+
return undefined;
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** 判断未知值是否为普通对象。 */
|
|
47
|
+
function is_plain_object(input) {
|
|
48
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
49
|
+
return false;
|
|
50
|
+
const prototype = Object.getPrototypeOf(input);
|
|
51
|
+
return prototype === Object.prototype || prototype === null;
|
|
52
|
+
}
|
|
23
53
|
//# sourceMappingURL=SessionJsonValue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionJsonValue.js","sourceRoot":"","sources":["../../../src/session/messages/SessionJsonValue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"SessionJsonValue.js","sourceRoot":"","sources":["../../../src/session/messages/SessionJsonValue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,+BAA+B;AAC/B,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAc,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAc;IAEd,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAY,CAAC;QAC3D,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;YAAE,OAAO,SAAS,CAAC;QACnE,OAAO,KAAyB,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMessageCodec.d.ts","sourceRoot":"","sources":["../../../src/session/messages/SessionMessageCodec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionMessageCodec.d.ts","sourceRoot":"","sources":["../../../src/session/messages/SessionMessageCodec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAKpC,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EAEd,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,sBAAsB,EAEtB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,uDAAuD;AACvD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACzC,eAAe,EAAE,CAyBnB;AAED,qDAAqD;AACrD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,GACtB,sBAAsB,GAAG,IAAI,CAmC/B;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3C,sBAAsB,EAAE,CAgC1B;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3C,2BAA2B,EAAE,CA0E/B;AAED,oCAAoC;AACpC,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GAClD,MAAM,CAMR"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - action/error 不转换为模型消息。
|
|
7
7
|
* - part_id 只服务 Session Message identity,不传入模型协议。
|
|
8
8
|
*/
|
|
9
|
-
import { to_session_json_value } from "../../session/messages/SessionJsonValue.js";
|
|
9
|
+
import { to_session_json_value, to_session_provider_metadata, } from "../../session/messages/SessionJsonValue.js";
|
|
10
10
|
/** 把 canonical Session 历史快照投影为内部 UIMessage records。 */
|
|
11
11
|
export function to_executor_history(session_id, snapshot) {
|
|
12
12
|
const records = [];
|
|
@@ -136,6 +136,8 @@ export function from_ui_assistant_parts(parts) {
|
|
|
136
136
|
}
|
|
137
137
|
if (type === "dynamic-tool" || type.startsWith("tool-")) {
|
|
138
138
|
const state = String(candidate.state || "");
|
|
139
|
+
const call_provider_metadata = to_session_provider_metadata(candidate.callProviderMetadata);
|
|
140
|
+
const result_provider_metadata = to_session_provider_metadata(candidate.resultProviderMetadata);
|
|
139
141
|
return [{
|
|
140
142
|
part_id: String(candidate.toolCallId || `tool:${index + 1}`),
|
|
141
143
|
sequence: index + 1,
|
|
@@ -162,6 +164,15 @@ export function from_ui_assistant_parts(parts) {
|
|
|
162
164
|
? { output: to_session_json_value(candidate.output) }
|
|
163
165
|
: {}),
|
|
164
166
|
...(candidate.errorText ? { error: String(candidate.errorText) } : {}),
|
|
167
|
+
...(call_provider_metadata !== undefined
|
|
168
|
+
? { call_provider_metadata }
|
|
169
|
+
: {}),
|
|
170
|
+
...(result_provider_metadata !== undefined
|
|
171
|
+
? { result_provider_metadata }
|
|
172
|
+
: {}),
|
|
173
|
+
...(typeof candidate.providerExecuted === "boolean"
|
|
174
|
+
? { provider_executed: candidate.providerExecuted }
|
|
175
|
+
: {}),
|
|
165
176
|
}];
|
|
166
177
|
}
|
|
167
178
|
return [];
|
|
@@ -218,6 +229,14 @@ function to_ui_assistant_parts(parts) {
|
|
|
218
229
|
throw new Error(`Unsupported Assistant part: ${part.type}`);
|
|
219
230
|
}
|
|
220
231
|
const input = part.input ?? parse_json(part.input_text);
|
|
232
|
+
const call_provider_fields = {
|
|
233
|
+
...(part.call_provider_metadata !== undefined
|
|
234
|
+
? { callProviderMetadata: part.call_provider_metadata }
|
|
235
|
+
: {}),
|
|
236
|
+
...(part.provider_executed !== undefined
|
|
237
|
+
? { providerExecuted: part.provider_executed }
|
|
238
|
+
: {}),
|
|
239
|
+
};
|
|
221
240
|
if (part.state === "completed") {
|
|
222
241
|
return {
|
|
223
242
|
type: "dynamic-tool",
|
|
@@ -226,6 +245,10 @@ function to_ui_assistant_parts(parts) {
|
|
|
226
245
|
state: "output-available",
|
|
227
246
|
input,
|
|
228
247
|
output: part.output,
|
|
248
|
+
...call_provider_fields,
|
|
249
|
+
...(part.result_provider_metadata !== undefined
|
|
250
|
+
? { resultProviderMetadata: part.result_provider_metadata }
|
|
251
|
+
: {}),
|
|
229
252
|
};
|
|
230
253
|
}
|
|
231
254
|
if (part.state === "failed") {
|
|
@@ -236,6 +259,10 @@ function to_ui_assistant_parts(parts) {
|
|
|
236
259
|
state: "output-error",
|
|
237
260
|
input,
|
|
238
261
|
errorText: part.error || "Tool failed",
|
|
262
|
+
...call_provider_fields,
|
|
263
|
+
...(part.result_provider_metadata !== undefined
|
|
264
|
+
? { resultProviderMetadata: part.result_provider_metadata }
|
|
265
|
+
: {}),
|
|
239
266
|
};
|
|
240
267
|
}
|
|
241
268
|
if (part.state === "approval-required") {
|
|
@@ -246,6 +273,7 @@ function to_ui_assistant_parts(parts) {
|
|
|
246
273
|
state: "approval-requested",
|
|
247
274
|
input,
|
|
248
275
|
approval: { id: part.approval?.approval_id || `approval:${part.tool_call_id}` },
|
|
276
|
+
...call_provider_fields,
|
|
249
277
|
};
|
|
250
278
|
}
|
|
251
279
|
return {
|
|
@@ -254,6 +282,7 @@ function to_ui_assistant_parts(parts) {
|
|
|
254
282
|
toolCallId: part.tool_call_id,
|
|
255
283
|
state: part.state === "input-streaming" ? "input-streaming" : "input-available",
|
|
256
284
|
input,
|
|
285
|
+
...call_provider_fields,
|
|
257
286
|
};
|
|
258
287
|
});
|
|
259
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMessageCodec.js","sourceRoot":"","sources":["../../../src/session/messages/SessionMessageCodec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"SessionMessageCodec.js","sourceRoot":"","sources":["../../../src/session/messages/SessionMessageCodec.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Session 只维护一条由 sequence 排序的消息序列;assistant 的 text、reasoning、tool、file
|
|
5
5
|
* 均为内部 part,不提升为顶层消息。
|
|
6
6
|
*/
|
|
7
|
+
import type { ProviderMetadata } from "ai";
|
|
7
8
|
import type { JsonObject, JsonValue } from "../../types/common/Json.js";
|
|
8
9
|
import type { SessionApproval } from "../../types/session/SessionApproval.js";
|
|
9
10
|
/** Message 默认展示范围。 */
|
|
@@ -119,6 +120,12 @@ export interface SessionAssistantToolPart {
|
|
|
119
120
|
output?: JsonValue;
|
|
120
121
|
/** 工具失败信息。 */
|
|
121
122
|
error?: string;
|
|
123
|
+
/** 工具调用阶段由 AI SDK Provider 返回的可序列化 metadata。 */
|
|
124
|
+
call_provider_metadata?: ProviderMetadata;
|
|
125
|
+
/** 工具结果阶段由 AI SDK Provider 返回的可序列化 metadata。 */
|
|
126
|
+
result_provider_metadata?: ProviderMetadata;
|
|
127
|
+
/** 当前工具是否由模型 Provider 直接执行。 */
|
|
128
|
+
provider_executed?: boolean;
|
|
122
129
|
/** 当前 Tool 等待或已经处理过的完整审批快照。 */
|
|
123
130
|
approval?: SessionApproval;
|
|
124
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMessage.d.ts","sourceRoot":"","sources":["../../../src/types/session/SessionMessage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionMessage.d.ts","sourceRoot":"","sources":["../../../src/types/session/SessionMessage.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.265",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Downcity Agent 运行时 — 单 Agent 执行壳与本机 RPC 能力",
|
|
6
6
|
"main": "./bin/index.js",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@downcity/shell": "^0.1.
|
|
16
|
-
"@downcity/type": "0.1.
|
|
15
|
+
"@downcity/shell": "^0.1.121",
|
|
16
|
+
"@downcity/type": "0.1.151",
|
|
17
17
|
"ai": "^6.0.193",
|
|
18
18
|
"commander": "^15.0.0",
|
|
19
19
|
"dotenv": "^17.4.2",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"zod": "^4.4.3"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
+
"@ai-sdk/openai": "^3.0.67",
|
|
30
31
|
"@types/fs-extra": "^11.0.4",
|
|
31
32
|
"@types/js-yaml": "^4.0.9",
|
|
32
33
|
"@types/node": "^25.9.1",
|
|
@@ -43,6 +43,7 @@ function create_tool_call_stream() {
|
|
|
43
43
|
toolCallId: "call_1",
|
|
44
44
|
toolName: "ping",
|
|
45
45
|
input,
|
|
46
|
+
providerMetadata: { openai: { itemId: "fc_1" } },
|
|
46
47
|
});
|
|
47
48
|
controller.enqueue({
|
|
48
49
|
type: "finish",
|
|
@@ -154,6 +155,8 @@ test("CityModel uses direct LanguageModel path and sends tool result back", asyn
|
|
|
154
155
|
assert.equal(result.success, true);
|
|
155
156
|
assert.equal(tool_executed, true);
|
|
156
157
|
assert.equal(model_requests.length, 2);
|
|
158
|
+
assert.equal(model_requests[0].providerOptions, undefined);
|
|
159
|
+
assert.equal(model_requests[1].providerOptions, undefined);
|
|
157
160
|
const plugin_call_tool = model_requests[0].tools.find((item) => item.name === "plugin_call");
|
|
158
161
|
assert.ok(plugin_call_tool);
|
|
159
162
|
assert.equal(plugin_call_tool.inputSchema.type, "object");
|
|
@@ -165,6 +168,12 @@ test("CityModel uses direct LanguageModel path and sends tool result back", asyn
|
|
|
165
168
|
assert.match(serialized_second_prompt, /call_1/);
|
|
166
169
|
assert.match(serialized_second_prompt, /echoed/);
|
|
167
170
|
assert.match(serialized_second_prompt, /hello/);
|
|
171
|
+
const restored_tool_call = model_requests[1].prompt
|
|
172
|
+
.flatMap((message) => Array.isArray(message.content) ? message.content : [])
|
|
173
|
+
.find((part) => part.type === "tool-call" && part.toolCallId === "call_1");
|
|
174
|
+
assert.deepEqual(restored_tool_call.providerOptions, {
|
|
175
|
+
openai: { itemId: "fc_1" },
|
|
176
|
+
});
|
|
168
177
|
|
|
169
178
|
const result_file = result.assistantMessage.parts.find((part) => part.type === "file");
|
|
170
179
|
assert.deepEqual(result_file, {
|
|
@@ -175,6 +184,10 @@ test("CityModel uses direct LanguageModel path and sends tool result back", asyn
|
|
|
175
184
|
});
|
|
176
185
|
const session_messages = await session.messages({ include_internal: true });
|
|
177
186
|
const persisted_assistant = session_messages.items.find((message) => message.type === "assistant");
|
|
187
|
+
const persisted_tool = persisted_assistant.parts.find((part) => part.type === "tool");
|
|
188
|
+
assert.deepEqual(persisted_tool.call_provider_metadata, {
|
|
189
|
+
openai: { itemId: "fc_1" },
|
|
190
|
+
});
|
|
178
191
|
const persisted_file = persisted_assistant.parts.find((part) => part.type === "file");
|
|
179
192
|
assert.equal(persisted_file.media_type, "image/png");
|
|
180
193
|
assert.equal(persisted_file.url, ".downcity/resources/tool-output.png");
|
|
@@ -288,6 +288,7 @@ test("deep compact 删除 reasoning,并完整保留最新并行 tool transacti
|
|
|
288
288
|
toolCallId: "call-a",
|
|
289
289
|
toolName: "tool_a",
|
|
290
290
|
input: { value: "a" },
|
|
291
|
+
providerOptions: { openai: { itemId: "fc_a" } },
|
|
291
292
|
},
|
|
292
293
|
{
|
|
293
294
|
type: "tool-call",
|
|
@@ -305,6 +306,7 @@ test("deep compact 删除 reasoning,并完整保留最新并行 tool transacti
|
|
|
305
306
|
toolCallId: "call-a",
|
|
306
307
|
toolName: "tool_a",
|
|
307
308
|
output: { type: "text", value: large_output },
|
|
309
|
+
providerOptions: { openai: { resultId: "result_a" } },
|
|
308
310
|
},
|
|
309
311
|
{
|
|
310
312
|
type: "tool-result",
|
|
@@ -341,6 +343,8 @@ test("deep compact 删除 reasoning,并完整保留最新并行 tool transacti
|
|
|
341
343
|
assert.equal(active_tool_text.join("\n").includes("old-call"), false);
|
|
342
344
|
assert.deepEqual([...tool_call_ids].sort(), ["call-a", "call-b"]);
|
|
343
345
|
assert.deepEqual([...tool_result_ids].sort(), ["call-a", "call-b"]);
|
|
346
|
+
assert.equal(serialized.includes('"itemId":"fc_a"'), true);
|
|
347
|
+
assert.equal(serialized.includes('"resultId":"result_a"'), true);
|
|
344
348
|
});
|
|
345
349
|
|
|
346
350
|
test("单条 assistant 含大量 parts 时也会在消息内部折叠", () => {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 验证 AI SDK OpenAI Responses 使用持久化 itemId 生成 HTTP item_reference。
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
8
|
+
import { convertToModelMessages } from "ai";
|
|
9
|
+
|
|
10
|
+
test("OpenAI Responses 默认 store 策略使用 item_reference continuation", async () => {
|
|
11
|
+
let request_body;
|
|
12
|
+
const openai = createOpenAI({
|
|
13
|
+
apiKey: "test-api-key",
|
|
14
|
+
fetch: async (_url, init) => {
|
|
15
|
+
request_body = JSON.parse(String(init.body));
|
|
16
|
+
throw new Error("request captured");
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const messages = await convertToModelMessages([{
|
|
20
|
+
role: "assistant",
|
|
21
|
+
parts: [{
|
|
22
|
+
type: "dynamic-tool",
|
|
23
|
+
toolName: "lookup",
|
|
24
|
+
toolCallId: "call_1",
|
|
25
|
+
state: "output-available",
|
|
26
|
+
input: { q: "x" },
|
|
27
|
+
output: "ok",
|
|
28
|
+
callProviderMetadata: { openai: { itemId: "fc_1" } },
|
|
29
|
+
}],
|
|
30
|
+
}]);
|
|
31
|
+
|
|
32
|
+
await assert.rejects(
|
|
33
|
+
openai.responses("gpt-5").doGenerate({ prompt: messages }),
|
|
34
|
+
/request captured/,
|
|
35
|
+
);
|
|
36
|
+
assert.deepEqual(request_body.input, [
|
|
37
|
+
{ type: "item_reference", id: "fc_1" },
|
|
38
|
+
{
|
|
39
|
+
type: "function_call_output",
|
|
40
|
+
call_id: "call_1",
|
|
41
|
+
output: "ok",
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
assert.equal(
|
|
45
|
+
request_body.input.some((item) => item.type === "function_call"),
|
|
46
|
+
false,
|
|
47
|
+
);
|
|
48
|
+
});
|
|
@@ -12,7 +12,12 @@ import { JsonlSessionMessageStore } from "../bin/session/messages/JsonlSessionMe
|
|
|
12
12
|
import { SessionMessages } from "../bin/session/SessionMessages.js";
|
|
13
13
|
import { SessionApprovalBroker } from "../bin/session/approval/SessionApprovalBroker.js";
|
|
14
14
|
import { compose_session_compaction } from "../bin/session/messages/SessionMessageCompaction.js";
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
from_ui_assistant_parts,
|
|
17
|
+
to_executor_history,
|
|
18
|
+
to_executor_ui_message,
|
|
19
|
+
} from "../bin/session/messages/SessionMessageCodec.js";
|
|
20
|
+
import { convertToModelMessages } from "ai";
|
|
16
21
|
import { MockLanguageModelV3 } from "ai/test";
|
|
17
22
|
|
|
18
23
|
/** 可暂停一次 Assistant 草稿写入,用于稳定复现并发写入顺序。 */
|
|
@@ -218,6 +223,171 @@ test("Tool Runtime 在文本中间保持输入、审批和输出的确定顺序"
|
|
|
218
223
|
);
|
|
219
224
|
});
|
|
220
225
|
|
|
226
|
+
test("Streaming Tool Provider metadata 在输入和输出状态间完整保留", async () => {
|
|
227
|
+
const { recorder, file_path } = await create_recorder("tool-provider-metadata-test");
|
|
228
|
+
const writer = await recorder.open_assistant_message({
|
|
229
|
+
turn_id: "turn-provider-metadata",
|
|
230
|
+
segment_index: 1,
|
|
231
|
+
});
|
|
232
|
+
await writer.apply_chunk({
|
|
233
|
+
type: "tool-input-start",
|
|
234
|
+
toolCallId: "call_1",
|
|
235
|
+
toolName: "lookup",
|
|
236
|
+
providerMetadata: { openai: { itemId: "fc_start" } },
|
|
237
|
+
});
|
|
238
|
+
await writer.prepare_tool_input({
|
|
239
|
+
tool_call_id: "call_1",
|
|
240
|
+
tool_name: "lookup",
|
|
241
|
+
input: { q: "x" },
|
|
242
|
+
});
|
|
243
|
+
await writer.apply_chunk({
|
|
244
|
+
type: "tool-input-available",
|
|
245
|
+
toolCallId: "call_1",
|
|
246
|
+
toolName: "lookup",
|
|
247
|
+
input: { q: "x" },
|
|
248
|
+
providerExecuted: true,
|
|
249
|
+
providerMetadata: { openai: { itemId: "fc_1" } },
|
|
250
|
+
});
|
|
251
|
+
await writer.apply_chunk({
|
|
252
|
+
type: "tool-output-available",
|
|
253
|
+
toolCallId: "call_1",
|
|
254
|
+
output: "ok",
|
|
255
|
+
providerExecuted: true,
|
|
256
|
+
providerMetadata: { openai: { resultId: "result_1" } },
|
|
257
|
+
});
|
|
258
|
+
await writer.reconcile_final_tool_part({
|
|
259
|
+
part_id: "call_1",
|
|
260
|
+
sequence: 1,
|
|
261
|
+
type: "tool",
|
|
262
|
+
tool_call_id: "call_1",
|
|
263
|
+
tool_name: "lookup",
|
|
264
|
+
state: "completed",
|
|
265
|
+
input: { q: "x" },
|
|
266
|
+
output: "ok",
|
|
267
|
+
provider_executed: true,
|
|
268
|
+
call_provider_metadata: { openai: { itemId: "fc_final" } },
|
|
269
|
+
});
|
|
270
|
+
await writer.complete();
|
|
271
|
+
|
|
272
|
+
const assistant = (await read_jsonl(file_path))[0];
|
|
273
|
+
const tool_part = assistant.parts.find((part) => part.type === "tool");
|
|
274
|
+
assert.deepEqual(tool_part.call_provider_metadata, {
|
|
275
|
+
openai: { itemId: "fc_final" },
|
|
276
|
+
});
|
|
277
|
+
assert.deepEqual(tool_part.result_provider_metadata, {
|
|
278
|
+
openai: { resultId: "result_1" },
|
|
279
|
+
});
|
|
280
|
+
assert.equal(tool_part.provider_executed, true);
|
|
281
|
+
assert.equal(tool_part.state, "completed");
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test("UI Tool Provider metadata 经 Session roundtrip 后恢复为 ModelMessage providerOptions", async () => {
|
|
285
|
+
const parts = from_ui_assistant_parts([{
|
|
286
|
+
type: "dynamic-tool",
|
|
287
|
+
toolName: "lookup",
|
|
288
|
+
toolCallId: "call_1",
|
|
289
|
+
state: "output-available",
|
|
290
|
+
input: { q: "x" },
|
|
291
|
+
output: "ok",
|
|
292
|
+
providerExecuted: false,
|
|
293
|
+
callProviderMetadata: { openai: { itemId: "fc_1" } },
|
|
294
|
+
resultProviderMetadata: { openai: { resultId: "result_1" } },
|
|
295
|
+
}]);
|
|
296
|
+
assert.deepEqual(parts[0].call_provider_metadata, {
|
|
297
|
+
openai: { itemId: "fc_1" },
|
|
298
|
+
});
|
|
299
|
+
assert.deepEqual(parts[0].result_provider_metadata, {
|
|
300
|
+
openai: { resultId: "result_1" },
|
|
301
|
+
});
|
|
302
|
+
assert.equal(parts[0].provider_executed, false);
|
|
303
|
+
|
|
304
|
+
const restored = to_executor_ui_message({
|
|
305
|
+
message_id: "assistant_1",
|
|
306
|
+
session_id: "session_1",
|
|
307
|
+
turn_id: "turn_1",
|
|
308
|
+
sequence: 1,
|
|
309
|
+
revision: 1,
|
|
310
|
+
visibility: "visible",
|
|
311
|
+
created_at: 1,
|
|
312
|
+
updated_at: 1,
|
|
313
|
+
type: "assistant",
|
|
314
|
+
kind: "normal",
|
|
315
|
+
segment_index: 1,
|
|
316
|
+
status: "completed",
|
|
317
|
+
parts,
|
|
318
|
+
});
|
|
319
|
+
assert.deepEqual(restored.parts[0].callProviderMetadata, {
|
|
320
|
+
openai: { itemId: "fc_1" },
|
|
321
|
+
});
|
|
322
|
+
assert.deepEqual(restored.parts[0].resultProviderMetadata, {
|
|
323
|
+
openai: { resultId: "result_1" },
|
|
324
|
+
});
|
|
325
|
+
assert.equal(restored.parts[0].providerExecuted, false);
|
|
326
|
+
|
|
327
|
+
const model_messages = await convertToModelMessages([restored]);
|
|
328
|
+
const model_parts = model_messages.flatMap((message) =>
|
|
329
|
+
Array.isArray(message.content) ? message.content : []
|
|
330
|
+
);
|
|
331
|
+
const tool_call = model_parts.find((part) => part.type === "tool-call");
|
|
332
|
+
const tool_result = model_parts.find((part) => part.type === "tool-result");
|
|
333
|
+
assert.equal(tool_call.toolCallId, "call_1");
|
|
334
|
+
assert.deepEqual(tool_call.providerOptions, {
|
|
335
|
+
openai: { itemId: "fc_1" },
|
|
336
|
+
});
|
|
337
|
+
assert.deepEqual(tool_result.providerOptions, {
|
|
338
|
+
openai: { itemId: "fc_1" },
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
const typed_parts = from_ui_assistant_parts([{
|
|
342
|
+
type: "tool-lookup",
|
|
343
|
+
toolCallId: "call_2",
|
|
344
|
+
state: "input-available",
|
|
345
|
+
input: { q: "typed" },
|
|
346
|
+
providerExecuted: true,
|
|
347
|
+
callProviderMetadata: { openai: { itemId: "fc_2" } },
|
|
348
|
+
}]);
|
|
349
|
+
assert.equal(typed_parts[0].tool_name, "lookup");
|
|
350
|
+
assert.equal(typed_parts[0].provider_executed, true);
|
|
351
|
+
assert.deepEqual(typed_parts[0].call_provider_metadata, {
|
|
352
|
+
openai: { itemId: "fc_2" },
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
const provider_executed = to_executor_ui_message({
|
|
356
|
+
message_id: "assistant_2",
|
|
357
|
+
session_id: "session_1",
|
|
358
|
+
turn_id: "turn_1",
|
|
359
|
+
sequence: 2,
|
|
360
|
+
revision: 1,
|
|
361
|
+
visibility: "visible",
|
|
362
|
+
created_at: 2,
|
|
363
|
+
updated_at: 2,
|
|
364
|
+
type: "assistant",
|
|
365
|
+
kind: "normal",
|
|
366
|
+
segment_index: 2,
|
|
367
|
+
status: "completed",
|
|
368
|
+
parts: from_ui_assistant_parts([{
|
|
369
|
+
type: "dynamic-tool",
|
|
370
|
+
toolName: "provider_lookup",
|
|
371
|
+
toolCallId: "call_3",
|
|
372
|
+
state: "output-available",
|
|
373
|
+
input: { q: "provider" },
|
|
374
|
+
output: "provider result",
|
|
375
|
+
providerExecuted: true,
|
|
376
|
+
callProviderMetadata: { openai: { itemId: "fc_3" } },
|
|
377
|
+
resultProviderMetadata: { openai: { resultId: "result_3" } },
|
|
378
|
+
}]),
|
|
379
|
+
});
|
|
380
|
+
const provider_model_messages = await convertToModelMessages([
|
|
381
|
+
provider_executed,
|
|
382
|
+
]);
|
|
383
|
+
const provider_result = provider_model_messages
|
|
384
|
+
.flatMap((message) => Array.isArray(message.content) ? message.content : [])
|
|
385
|
+
.find((part) => part.type === "tool-result");
|
|
386
|
+
assert.deepEqual(provider_result.providerOptions, {
|
|
387
|
+
openai: { resultId: "result_3" },
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
|
|
221
391
|
test("Approval Broker 只接受已经准备完整输入的 Tool", async () => {
|
|
222
392
|
const { recorder, events } = await create_recorder("tool-ready-barrier-test");
|
|
223
393
|
const approval_broker = new SessionApprovalBroker({
|
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
type StepResult,
|
|
15
15
|
type Tool,
|
|
16
16
|
} from "ai";
|
|
17
|
-
import { buildOpenAIResponsesProviderOptions } from "@executor/messages/SessionMessageCodec.js";
|
|
18
17
|
import { logAssistantMessageNow } from "@executor/messages/SessionMessageLog.js";
|
|
19
18
|
import {
|
|
20
19
|
MAX_INCOMPLETE_RESPONSE_RECOVERIES,
|
|
@@ -307,7 +306,6 @@ export class CoreEngineRunner {
|
|
|
307
306
|
messages: message_state.modelMessages,
|
|
308
307
|
tools,
|
|
309
308
|
abortSignal: input.run_context.abortSignal,
|
|
310
|
-
providerOptions: buildOpenAIResponsesProviderOptions(),
|
|
311
309
|
onError: async ({ error }) => {
|
|
312
310
|
last_observed_stream_error = error;
|
|
313
311
|
await this.logger.log("error", "[agent] stream.error", {
|
|
@@ -113,24 +113,3 @@ export async function toModelMessages(
|
|
|
113
113
|
ignoreIncompleteToolCalls: true,
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* 构建 OpenAI Responses providerOptions。
|
|
119
|
-
*
|
|
120
|
-
* 关键点(中文)
|
|
121
|
-
* - 用途:集中声明 provider 级运行选项,避免在主流程内硬编码。
|
|
122
|
-
* - 当前策略:`store=false`,不在 provider 侧持久化响应。
|
|
123
|
-
*/
|
|
124
|
-
export function buildOpenAIResponsesProviderOptions(): {
|
|
125
|
-
openai: {
|
|
126
|
-
store: boolean;
|
|
127
|
-
};
|
|
128
|
-
} {
|
|
129
|
-
// 返回固定 provider 参数对象。
|
|
130
|
-
return {
|
|
131
|
-
openai: {
|
|
132
|
-
// 禁用 provider 侧存储。
|
|
133
|
-
store: false,
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
}
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { streamText, type LanguageModel } from "ai";
|
|
11
|
-
import { buildOpenAIResponsesProviderOptions } from "@executor/messages/SessionMessageCodec.js";
|
|
12
11
|
import type { SessionHistoryMetaV1 } from "@/executor/types/SessionHistoryMeta.js";
|
|
13
12
|
import type { SessionRecordV1 } from "@/executor/types/SessionRecords.js";
|
|
14
13
|
import { is_session_message_record } from "@/executor/types/SessionRecords.js";
|
|
@@ -216,7 +215,12 @@ async function generateSessionTitle(input: {
|
|
|
216
215
|
"",
|
|
217
216
|
input.firstUserText,
|
|
218
217
|
].join("\n"),
|
|
219
|
-
|
|
218
|
+
// 标题生成是一次性调用,不参与 Responses continuation。
|
|
219
|
+
providerOptions: {
|
|
220
|
+
openai: {
|
|
221
|
+
store: false,
|
|
222
|
+
},
|
|
223
|
+
},
|
|
220
224
|
onError: ({ error }) => {
|
|
221
225
|
observedStreamError = error;
|
|
222
226
|
},
|
|
@@ -522,6 +522,8 @@ export class SessionTurn {
|
|
|
522
522
|
for (const part of final_assistant_parts) {
|
|
523
523
|
if (part.type === "file") {
|
|
524
524
|
await final_assistant_writer.append_file_part(part);
|
|
525
|
+
} else if (part.type === "tool") {
|
|
526
|
+
await final_assistant_writer.reconcile_final_tool_part(part);
|
|
525
527
|
}
|
|
526
528
|
}
|
|
527
529
|
if (input.abort_signal?.aborted) {
|