@downcity/agent 1.1.11 → 1.1.13
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/index.d.ts +3 -3
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +2 -2
- package/bin/index.js.map +1 -1
- package/bin/runtime/AgentRuntime.d.ts +2 -2
- package/bin/runtime/AgentRuntime.d.ts.map +1 -1
- package/bin/runtime/AgentRuntime.js +7 -12
- package/bin/runtime/AgentRuntime.js.map +1 -1
- package/bin/runtime/AgentRuntimeTypes.d.ts +3 -3
- package/bin/runtime/AgentRuntimeTypes.d.ts.map +1 -1
- package/bin/sdk/Agent.d.ts +13 -8
- package/bin/sdk/Agent.d.ts.map +1 -1
- package/bin/sdk/Agent.js +62 -18
- package/bin/sdk/Agent.js.map +1 -1
- package/bin/sdk/AgentSdkTypes.d.ts +95 -0
- package/bin/sdk/AgentSdkTypes.d.ts.map +1 -1
- package/bin/sdk/RemoteAgent.d.ts +3 -3
- package/bin/sdk/RemoteAgent.d.ts.map +1 -1
- package/bin/sdk/RemoteAgent.js +5 -2
- package/bin/sdk/RemoteAgent.js.map +1 -1
- package/bin/sdk/Session.d.ts +21 -19
- package/bin/sdk/Session.d.ts.map +1 -1
- package/bin/sdk/Session.js +79 -69
- package/bin/sdk/Session.js.map +1 -1
- package/bin/sdk/SessionMetadata.d.ts +7 -3
- package/bin/sdk/SessionMetadata.d.ts.map +1 -1
- package/bin/sdk/SessionMetadata.js +21 -5
- package/bin/sdk/SessionMetadata.js.map +1 -1
- package/bin/sdk/SessionPersistence.d.ts +6 -6
- package/bin/sdk/SessionPersistence.d.ts.map +1 -1
- package/bin/sdk/SessionPersistence.js +7 -7
- package/bin/sdk/SessionPersistence.js.map +1 -1
- package/bin/sdk/SessionServicePort.d.ts +5 -5
- package/bin/sdk/SessionServicePort.d.ts.map +1 -1
- package/bin/sdk/SessionServicePort.js +9 -9
- package/bin/sdk/SessionServicePort.js.map +1 -1
- package/bin/sdk/SessionSystemBuilder.d.ts +106 -0
- package/bin/sdk/SessionSystemBuilder.d.ts.map +1 -0
- package/bin/sdk/SessionSystemBuilder.js +150 -0
- package/bin/sdk/SessionSystemBuilder.js.map +1 -0
- package/bin/service/builtins/chat/runtime/ChatSession.d.ts +27 -8
- package/bin/service/builtins/chat/runtime/ChatSession.d.ts.map +1 -1
- package/bin/service/builtins/chat/runtime/ChatSession.js +9 -4
- package/bin/service/builtins/chat/runtime/ChatSession.js.map +1 -1
- package/bin/service/builtins/task/runtime/Runner.d.ts +1 -1
- package/bin/service/builtins/task/runtime/Runner.js +1 -1
- package/bin/service/builtins/task/runtime/TaskRunnerSession.d.ts +2 -2
- package/bin/service/builtins/task/runtime/TaskRunnerSession.js +4 -4
- package/bin/service/builtins/task/runtime/TaskRunnerSession.js.map +1 -1
- package/bin/service/builtins/task/runtime/TaskRunnerTypes.d.ts +1 -1
- package/bin/session/{Session.d.ts → Executor.d.ts} +54 -17
- package/bin/session/Executor.d.ts.map +1 -0
- package/bin/session/{Session.js → Executor.js} +60 -23
- package/bin/session/Executor.js.map +1 -0
- package/bin/session/composer/SessionComposer.d.ts +1 -1
- package/bin/session/composer/SessionComposer.js +1 -1
- package/bin/session/composer/compaction/SessionCompactionComposer.d.ts +2 -2
- package/bin/session/composer/execution/LocalSessionExecutionComposer.d.ts +1 -1
- package/bin/session/composer/execution/LocalSessionExecutionComposer.js +1 -1
- package/bin/session/composer/execution/SessionExecutionComposer.d.ts +1 -1
- package/bin/session/composer/history/SessionHistoryComposer.d.ts +1 -1
- package/bin/session/composer/system/SessionSystemComposer.d.ts +1 -1
- package/bin/session/composer/system/SessionSystemComposer.js +1 -1
- package/bin/session/executors/local/{LocalSessionCore.d.ts → Runner.d.ts} +10 -10
- package/bin/session/executors/local/Runner.d.ts.map +1 -0
- package/bin/session/executors/local/{LocalSessionCore.js → Runner.js} +11 -11
- package/bin/session/executors/local/Runner.js.map +1 -0
- package/bin/session/executors/local/SessionExecutionError.d.ts +1 -1
- package/bin/session/executors/local/SessionExecutionError.js +1 -1
- package/bin/session/executors/local/SessionLoopDecision.d.ts +3 -3
- package/bin/session/executors/local/SessionLoopDecision.js +3 -3
- package/bin/session/executors/local/SessionModelMessageState.d.ts +2 -2
- package/bin/session/executors/local/SessionModelMessageState.js +2 -2
- package/bin/session/executors/local/SessionSignals.d.ts +3 -3
- package/bin/session/executors/local/SessionSignals.js +3 -3
- package/bin/session/executors/local/SessionToolLoopRunner.d.ts +1 -1
- package/bin/session/executors/local/SessionToolLoopRunner.js +2 -2
- package/bin/session/executors/local/SessionToolLoopRunner.js.map +1 -1
- package/bin/session/types/SessionHistoryMeta.d.ts +2 -0
- package/bin/session/types/SessionHistoryMeta.d.ts.map +1 -1
- package/bin/session/types/SessionLoop.d.ts +1 -1
- package/bin/session/types/SessionLoop.js +1 -1
- package/bin/session/types/SessionRun.d.ts +2 -2
- package/bin/session/types/SessionRun.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +6 -2
- package/src/runtime/AgentRuntime.ts +7 -17
- package/src/runtime/AgentRuntimeTypes.ts +3 -3
- package/src/sdk/Agent.ts +75 -23
- package/src/sdk/AgentSdkTypes.ts +113 -0
- package/src/sdk/RemoteAgent.ts +10 -4
- package/src/sdk/Session.ts +100 -85
- package/src/sdk/SessionMetadata.ts +23 -5
- package/src/sdk/SessionPersistence.ts +13 -13
- package/src/sdk/SessionServicePort.ts +13 -13
- package/src/sdk/SessionSystemBuilder.ts +261 -0
- package/src/service/builtins/chat/runtime/ChatSession.ts +37 -13
- package/src/service/builtins/task/runtime/Runner.ts +1 -1
- package/src/service/builtins/task/runtime/TaskRunnerSession.ts +4 -4
- package/src/service/builtins/task/runtime/TaskRunnerTypes.ts +1 -1
- package/src/session/{Session.ts → Executor.ts} +96 -26
- package/src/session/composer/SessionComposer.ts +1 -1
- package/src/session/composer/compaction/SessionCompactionComposer.ts +2 -2
- package/src/session/composer/execution/LocalSessionExecutionComposer.ts +1 -1
- package/src/session/composer/execution/SessionExecutionComposer.ts +1 -1
- package/src/session/composer/history/SessionHistoryComposer.ts +1 -1
- package/src/session/composer/system/SessionSystemComposer.ts +1 -1
- package/src/session/executors/local/{LocalSessionCore.ts → Runner.ts} +13 -13
- package/src/session/executors/local/SessionExecutionError.ts +1 -1
- package/src/session/executors/local/SessionLoopDecision.ts +3 -3
- package/src/session/executors/local/SessionModelMessageState.ts +2 -2
- package/src/session/executors/local/SessionSignals.ts +3 -3
- package/src/session/executors/local/SessionToolLoopRunner.ts +2 -2
- package/src/session/types/SessionHistoryMeta.ts +2 -0
- package/src/session/types/SessionLoop.ts +1 -1
- package/src/session/types/SessionRun.ts +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/sdk/SdkSessionSystemComposer.d.ts +0 -73
- package/bin/sdk/SdkSessionSystemComposer.d.ts.map +0 -1
- package/bin/sdk/SdkSessionSystemComposer.js +0 -96
- package/bin/sdk/SdkSessionSystemComposer.js.map +0 -1
- package/bin/session/Session.d.ts.map +0 -1
- package/bin/session/Session.js.map +0 -1
- package/bin/session/executors/local/LocalSessionCore.d.ts.map +0 -1
- package/bin/session/executors/local/LocalSessionCore.js.map +0 -1
- package/bin/session/executors/local/LocalSessionExecutor.d.ts +0 -61
- package/bin/session/executors/local/LocalSessionExecutor.d.ts.map +0 -1
- package/bin/session/executors/local/LocalSessionExecutor.js +0 -36
- package/bin/session/executors/local/LocalSessionExecutor.js.map +0 -1
- package/src/sdk/SdkSessionSystemComposer.ts +0 -173
- package/src/session/executors/local/LocalSessionExecutor.ts +0 -89
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Session 默认 system composer。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 面向 `Agent` SDK 的本地会话执行场景。
|
|
6
|
+
* - 注入调用方显式传入的静态 instruction、显式注入 service system 与显式注册 plugin system。
|
|
7
|
+
* - SDK 不在 system 中注入动态变量;动态上下文应由调用方放入 user message。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { SessionSystemComposer } from "@session/composer/system/SessionSystemComposer.js";
|
|
11
|
+
import { getSessionRunScope } from "@session/SessionRunScope.js";
|
|
12
|
+
import type { SessionSystemMessage } from "@/session/types/SessionPrompts.js";
|
|
13
|
+
import type {
|
|
14
|
+
AgentSessionSystemBlock,
|
|
15
|
+
AgentSessionSystemSessionInfo,
|
|
16
|
+
} from "@/sdk/AgentSdkTypes.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 解析 SDK session system blocks 的输入。
|
|
20
|
+
*/
|
|
21
|
+
export interface BuildSessionSystemBlocksParams {
|
|
22
|
+
/**
|
|
23
|
+
* 当前 agent 的稳定标识。
|
|
24
|
+
*/
|
|
25
|
+
agentId: string;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 当前 agent 绑定的项目根目录。
|
|
29
|
+
*/
|
|
30
|
+
projectRoot: string;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 当前 sessionId。
|
|
34
|
+
*/
|
|
35
|
+
sessionId: string;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 当前 session 首次创建时间(ms)。
|
|
39
|
+
*/
|
|
40
|
+
createdAt: number;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 当前 session 初始化时解析到的系统时区。
|
|
44
|
+
*/
|
|
45
|
+
timezone: string;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 读取当前 SDK 调用方传入的 instruction system blocks。
|
|
49
|
+
*/
|
|
50
|
+
getInstructionSystemBlocks: () => AgentSessionSystemBlock[];
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 读取当前显式注入 service 的 system blocks。
|
|
54
|
+
*/
|
|
55
|
+
getServiceSystemBlocks: () => Promise<AgentSessionSystemBlock[]>;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 读取当前显式注册 plugin 的 system blocks。
|
|
59
|
+
*/
|
|
60
|
+
getPluginSystemBlocks: () => Promise<AgentSessionSystemBlock[]>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type SessionSystemBuilderOptions = {
|
|
64
|
+
/**
|
|
65
|
+
* 当前 agent 的稳定标识。
|
|
66
|
+
*/
|
|
67
|
+
agentId: string;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 当前 agent 绑定的项目根目录。
|
|
71
|
+
*/
|
|
72
|
+
projectRoot: string;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 读取当前 session 首次创建时间(ms)。
|
|
76
|
+
*/
|
|
77
|
+
getSessionCreatedAt: () => number;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 读取当前 session 初始化时解析到的系统时区。
|
|
81
|
+
*/
|
|
82
|
+
getSessionTimezone: () => string;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 读取当前 SDK 调用方传入的 instruction system blocks。
|
|
86
|
+
*/
|
|
87
|
+
getInstructionSystemBlocks: () => AgentSessionSystemBlock[];
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 读取当前显式注册 plugin 的 system blocks。
|
|
91
|
+
*/
|
|
92
|
+
getPluginSystemBlocks: () => Promise<AgentSessionSystemBlock[]>;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 读取当前显式注入 service 的 system blocks。
|
|
96
|
+
*/
|
|
97
|
+
getServiceSystemBlocks: () => Promise<AgentSessionSystemBlock[]>;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
function normalizeSystemBlocks(
|
|
101
|
+
blocks: AgentSessionSystemBlock[],
|
|
102
|
+
): AgentSessionSystemBlock[] {
|
|
103
|
+
if (!Array.isArray(blocks)) return [];
|
|
104
|
+
return blocks
|
|
105
|
+
.map((block) => {
|
|
106
|
+
const content = String(block?.content || "").trim();
|
|
107
|
+
if (!content) return null;
|
|
108
|
+
const source = block.source;
|
|
109
|
+
if (
|
|
110
|
+
source !== "core" &&
|
|
111
|
+
source !== "instruction" &&
|
|
112
|
+
source !== "service" &&
|
|
113
|
+
source !== "plugin" &&
|
|
114
|
+
source !== "session"
|
|
115
|
+
) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
source,
|
|
120
|
+
name: String(block.name || source).trim() || source,
|
|
121
|
+
content,
|
|
122
|
+
} satisfies AgentSessionSystemBlock;
|
|
123
|
+
})
|
|
124
|
+
.filter((block): block is AgentSessionSystemBlock => Boolean(block));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function createSessionInfo(
|
|
128
|
+
params: Pick<
|
|
129
|
+
BuildSessionSystemBlocksParams,
|
|
130
|
+
"agentId" | "sessionId" | "projectRoot" | "createdAt" | "timezone"
|
|
131
|
+
>,
|
|
132
|
+
): AgentSessionSystemSessionInfo {
|
|
133
|
+
const createdAt = Number.isFinite(params.createdAt) ? params.createdAt : 0;
|
|
134
|
+
return {
|
|
135
|
+
agentId: String(params.agentId || "").trim(),
|
|
136
|
+
sessionId: String(params.sessionId || "").trim(),
|
|
137
|
+
projectRoot: String(params.projectRoot || "").trim(),
|
|
138
|
+
createdAt: new Date(createdAt).toISOString(),
|
|
139
|
+
timezone: String(params.timezone || "").trim() || "UTC",
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function createSessionSystemBlock(
|
|
144
|
+
session: AgentSessionSystemSessionInfo,
|
|
145
|
+
): AgentSessionSystemBlock {
|
|
146
|
+
const content = [
|
|
147
|
+
"当前会话上下文:",
|
|
148
|
+
`你正在服务 agent "${session.agentId}" 的 session "${session.sessionId}"。`,
|
|
149
|
+
`当前项目根目录是 "${session.projectRoot}"。`,
|
|
150
|
+
`本会话创建于 ${session.createdAt},参考时区是 ${session.timezone}。`,
|
|
151
|
+
"这个创建时间是当前会话的稳定参考时间,不代表每轮运行时的当前时间。",
|
|
152
|
+
"如果用户消息中提供了新的当前时间、相对时间或其他动态上下文,应优先使用用户消息中的动态信息。",
|
|
153
|
+
].join("\n");
|
|
154
|
+
return {
|
|
155
|
+
source: "session",
|
|
156
|
+
name: "context",
|
|
157
|
+
content,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 解析 SDK session 当前生效的 system blocks。
|
|
163
|
+
*/
|
|
164
|
+
export async function buildSessionSystemBlocks(
|
|
165
|
+
params: BuildSessionSystemBlocksParams,
|
|
166
|
+
): Promise<AgentSessionSystemBlock[]> {
|
|
167
|
+
const agentId = String(params.agentId || "").trim();
|
|
168
|
+
const projectRoot = String(params.projectRoot || "").trim();
|
|
169
|
+
const sessionId = String(params.sessionId || "").trim();
|
|
170
|
+
const createdAt = Number(params.createdAt || 0);
|
|
171
|
+
const timezone = String(params.timezone || "").trim();
|
|
172
|
+
if (!agentId) {
|
|
173
|
+
throw new Error("buildSessionSystemBlocks requires a non-empty agentId");
|
|
174
|
+
}
|
|
175
|
+
if (!projectRoot) {
|
|
176
|
+
throw new Error("buildSessionSystemBlocks requires a non-empty projectRoot");
|
|
177
|
+
}
|
|
178
|
+
if (!sessionId) {
|
|
179
|
+
throw new Error("buildSessionSystemBlocks requires a non-empty sessionId");
|
|
180
|
+
}
|
|
181
|
+
if (!Number.isFinite(createdAt) || createdAt <= 0) {
|
|
182
|
+
throw new Error("buildSessionSystemBlocks requires a valid createdAt");
|
|
183
|
+
}
|
|
184
|
+
if (!timezone) {
|
|
185
|
+
throw new Error("buildSessionSystemBlocks requires a non-empty timezone");
|
|
186
|
+
}
|
|
187
|
+
return [
|
|
188
|
+
...normalizeSystemBlocks(params.getInstructionSystemBlocks()),
|
|
189
|
+
...normalizeSystemBlocks(await params.getServiceSystemBlocks()),
|
|
190
|
+
...normalizeSystemBlocks(await params.getPluginSystemBlocks()),
|
|
191
|
+
// session block 放在最后,尽量保留前缀 system blocks 的跨 session 缓存命中。
|
|
192
|
+
createSessionSystemBlock(
|
|
193
|
+
createSessionInfo({ agentId, projectRoot, sessionId, createdAt, timezone }),
|
|
194
|
+
),
|
|
195
|
+
];
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* 解析 SDK session 当前生效的 system messages。
|
|
200
|
+
*/
|
|
201
|
+
export async function buildSessionSystemMessages(
|
|
202
|
+
params: BuildSessionSystemBlocksParams,
|
|
203
|
+
): Promise<SessionSystemMessage[]> {
|
|
204
|
+
const blocks = await buildSessionSystemBlocks(params);
|
|
205
|
+
return blocks.map((block) => ({
|
|
206
|
+
role: "system" as const,
|
|
207
|
+
content: block.content,
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* SDK Session system composer 实现。
|
|
213
|
+
*/
|
|
214
|
+
export class SessionSystemBuilder extends SessionSystemComposer {
|
|
215
|
+
readonly name = "sdk_prompt_system";
|
|
216
|
+
|
|
217
|
+
private readonly agentId: string;
|
|
218
|
+
private readonly projectRoot: string;
|
|
219
|
+
private readonly getSessionCreatedAt: SessionSystemBuilderOptions["getSessionCreatedAt"];
|
|
220
|
+
private readonly getSessionTimezone: SessionSystemBuilderOptions["getSessionTimezone"];
|
|
221
|
+
private readonly getInstructionSystemBlocks: SessionSystemBuilderOptions["getInstructionSystemBlocks"];
|
|
222
|
+
private readonly getServiceSystemBlocks: SessionSystemBuilderOptions["getServiceSystemBlocks"];
|
|
223
|
+
private readonly getPluginSystemBlocks: SessionSystemBuilderOptions["getPluginSystemBlocks"];
|
|
224
|
+
|
|
225
|
+
constructor(options: SessionSystemBuilderOptions) {
|
|
226
|
+
super();
|
|
227
|
+
this.agentId = String(options.agentId || "").trim();
|
|
228
|
+
this.projectRoot = String(options.projectRoot || "").trim();
|
|
229
|
+
this.getSessionCreatedAt = options.getSessionCreatedAt;
|
|
230
|
+
this.getSessionTimezone = options.getSessionTimezone;
|
|
231
|
+
this.getInstructionSystemBlocks = options.getInstructionSystemBlocks;
|
|
232
|
+
this.getServiceSystemBlocks = options.getServiceSystemBlocks;
|
|
233
|
+
this.getPluginSystemBlocks = options.getPluginSystemBlocks;
|
|
234
|
+
if (!this.agentId) {
|
|
235
|
+
throw new Error("SessionSystemBuilder requires a non-empty agentId");
|
|
236
|
+
}
|
|
237
|
+
if (!this.projectRoot) {
|
|
238
|
+
throw new Error("SessionSystemBuilder requires a non-empty projectRoot");
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* 解析本轮 SDK session system messages。
|
|
244
|
+
*/
|
|
245
|
+
async resolve() {
|
|
246
|
+
const sessionId = String(getSessionRunScope()?.sessionId || "").trim();
|
|
247
|
+
if (!sessionId) {
|
|
248
|
+
throw new Error("SessionSystemBuilder.resolve requires a non-empty sessionId");
|
|
249
|
+
}
|
|
250
|
+
return await buildSessionSystemMessages({
|
|
251
|
+
agentId: this.agentId,
|
|
252
|
+
projectRoot: this.projectRoot,
|
|
253
|
+
sessionId,
|
|
254
|
+
createdAt: this.getSessionCreatedAt(),
|
|
255
|
+
timezone: this.getSessionTimezone(),
|
|
256
|
+
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
257
|
+
getServiceSystemBlocks: this.getServiceSystemBlocks,
|
|
258
|
+
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ChatSession:chat 专用
|
|
2
|
+
* ChatSession:chat 专用 Executor 实现。
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
5
|
* - ChatSession 在实例化时持有自己的 execution composer 实例。
|
|
@@ -7,10 +7,13 @@
|
|
|
7
7
|
* - 外层仍只调用标准 `run(...)`;chat 语义由 ChatSession 内部收敛。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import type { LanguageModel, Tool } from "ai";
|
|
11
|
+
import { Executor } from "@session/Executor.js";
|
|
11
12
|
import type { SessionHistoryComposer } from "@session/composer/history/SessionHistoryComposer.js";
|
|
13
|
+
import type { SessionCompactionComposer } from "@session/composer/compaction/SessionCompactionComposer.js";
|
|
14
|
+
import type { SessionSystemComposer } from "@session/composer/system/SessionSystemComposer.js";
|
|
12
15
|
import type { ChatSessionExecutionComposer } from "@/service/builtins/chat/runtime/ChatSessionExecutionComposer.js";
|
|
13
|
-
import type {
|
|
16
|
+
import type { Logger } from "@/utils/logger/Logger.js";
|
|
14
17
|
import type { SessionAssistantStepCallback } from "@/session/types/SessionRun.js";
|
|
15
18
|
import type { SessionRunResult } from "@/session/types/SessionRun.js";
|
|
16
19
|
import type { ChatSessionTurnState } from "@/service/builtins/chat/runtime/ChatSessionTypes.js";
|
|
@@ -27,17 +30,34 @@ type ChatSessionOptions = {
|
|
|
27
30
|
historyComposer: SessionHistoryComposer;
|
|
28
31
|
|
|
29
32
|
/**
|
|
30
|
-
*
|
|
33
|
+
* 读取当前 session 使用的模型实例。
|
|
31
34
|
*/
|
|
32
|
-
|
|
35
|
+
getModel: () => LanguageModel | undefined;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 统一日志器。
|
|
39
|
+
*/
|
|
40
|
+
logger: Logger;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 当前 session 对应的 compaction Composer。
|
|
44
|
+
*/
|
|
45
|
+
compactionComposer: SessionCompactionComposer;
|
|
33
46
|
|
|
34
47
|
/**
|
|
35
|
-
*
|
|
48
|
+
* 当前 session 对应的 system Composer。
|
|
36
49
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
systemComposer: SessionSystemComposer;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 获取当前可用工具集合。
|
|
54
|
+
*/
|
|
55
|
+
getTools: () => Record<string, Tool>;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 当前 session 绑定的 chat execution composer。
|
|
59
|
+
*/
|
|
60
|
+
executionComposer: ChatSessionExecutionComposer;
|
|
41
61
|
|
|
42
62
|
/**
|
|
43
63
|
* session 更新后的异步回调。
|
|
@@ -48,7 +68,7 @@ type ChatSessionOptions = {
|
|
|
48
68
|
/**
|
|
49
69
|
* Chat 专用 Session。
|
|
50
70
|
*/
|
|
51
|
-
export class ChatSession extends
|
|
71
|
+
export class ChatSession extends Executor {
|
|
52
72
|
/**
|
|
53
73
|
* ChatSession 持有的 composer 实例。
|
|
54
74
|
*/
|
|
@@ -61,8 +81,12 @@ export class ChatSession extends Session {
|
|
|
61
81
|
super({
|
|
62
82
|
sessionId: options.sessionId,
|
|
63
83
|
historyComposer: options.historyComposer,
|
|
64
|
-
|
|
65
|
-
|
|
84
|
+
getModel: options.getModel,
|
|
85
|
+
logger: options.logger,
|
|
86
|
+
compactionComposer: options.compactionComposer,
|
|
87
|
+
systemComposer: options.systemComposer,
|
|
88
|
+
getTools: options.getTools,
|
|
89
|
+
executionComposer,
|
|
66
90
|
...(options.runAfterSessionUpdated
|
|
67
91
|
? { runAfterSessionUpdated: options.runAfterSessionUpdated }
|
|
68
92
|
: {}),
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* TaskRunnerSession:task runner 的 session 装配模块。
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
|
-
* - 负责构建 task 专用
|
|
5
|
+
* - 负责构建 task 专用 Runner / JsonlSessionHistoryComposer 运行时。
|
|
6
6
|
* - 负责把每轮 user/assistant 消息写入 run 目录对应的 messages.jsonl。
|
|
7
7
|
* - 这些能力与任务编排逻辑解耦后,Runner 主流程会更聚焦于状态流转。
|
|
8
8
|
* - 当前只有 api 执行模式。
|
|
@@ -12,7 +12,7 @@ import path from "node:path";
|
|
|
12
12
|
import type { AgentContext } from "@/runtime/AgentContextTypes.js";
|
|
13
13
|
import type { SessionRunResult } from "@/session/types/SessionRun.js";
|
|
14
14
|
import type { TaskSessionRuntimePort } from "@/service/builtins/task/runtime/TaskRunnerTypes.js";
|
|
15
|
-
import {
|
|
15
|
+
import { Runner } from "@session/executors/local/Runner.js";
|
|
16
16
|
import { drainDeferredPersistedUserMessages } from "@session/SessionRunScope.js";
|
|
17
17
|
import { JsonlSessionHistoryComposer } from "@session/composer/history/jsonl/JsonlSessionHistoryComposer.js";
|
|
18
18
|
import { JsonlSessionCompactionComposer } from "@session/composer/compaction/jsonl/JsonlSessionCompactionComposer.js";
|
|
@@ -54,7 +54,7 @@ export async function appendTaskRoundUserMessage(params: {
|
|
|
54
54
|
* 构建 task 专用 Session 运行时(独立于普通 Session 实例缓存)。
|
|
55
55
|
*
|
|
56
56
|
* 关键点(中文)
|
|
57
|
-
* - 使用
|
|
57
|
+
* - 使用 Runner 执行,模型来自 context.session.model(agent 级模型)。
|
|
58
58
|
*/
|
|
59
59
|
export function createTaskSessionRuntimePort(params: {
|
|
60
60
|
context: AgentContext;
|
|
@@ -132,7 +132,7 @@ export function createTaskSessionRuntimePort(params: {
|
|
|
132
132
|
sessionId: key,
|
|
133
133
|
getTools: () => shellTools,
|
|
134
134
|
});
|
|
135
|
-
const created = new
|
|
135
|
+
const created = new Runner({
|
|
136
136
|
model: context.session.model,
|
|
137
137
|
logger: context.logger,
|
|
138
138
|
historyComposer,
|
|
@@ -170,7 +170,7 @@ export type ScriptExecutionResult = {
|
|
|
170
170
|
* task 运行专用的 session runtime 端口。
|
|
171
171
|
*
|
|
172
172
|
* 关键点(中文)
|
|
173
|
-
* - task runner 不直接依赖具体 `
|
|
173
|
+
* - task runner 不直接依赖具体 SDK `Session` 实现。
|
|
174
174
|
* - 这里暴露的是 task 场景最小可用端口:执行器 + history Composer。
|
|
175
175
|
*/
|
|
176
176
|
export type TaskSessionRuntimePort = {
|
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Executor:单个 session 的执行编排器。
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
5
|
+
* - SDK 对外对象叫 `Session`,这里是内部执行层。
|
|
6
|
+
* - 一个 Executor 只对应一个固定的 `sessionId`。
|
|
7
|
+
* - 负责 history 写入、run scope、executing 状态与本地 Runner 的懒创建。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import type { LanguageModel, Tool } from "ai";
|
|
10
11
|
import { SessionHistoryWriter } from "@session/composer/history/SessionHistoryWriter.js";
|
|
11
12
|
import type { SessionHistoryComposer } from "@session/composer/history/SessionHistoryComposer.js";
|
|
12
13
|
import { withSessionRunScope } from "@session/SessionRunScope.js";
|
|
13
14
|
import type { SessionRunScope } from "@session/SessionRunScope.js";
|
|
14
15
|
import { buildSessionStepEventMessages } from "@session/messages/SessionStepEventMapper.js";
|
|
16
|
+
import { JsonlSessionCompactionComposer } from "@session/composer/compaction/jsonl/JsonlSessionCompactionComposer.js";
|
|
17
|
+
import { LocalSessionExecutionComposer } from "@session/composer/execution/LocalSessionExecutionComposer.js";
|
|
18
|
+
import type { SessionCompactionComposer } from "@session/composer/compaction/SessionCompactionComposer.js";
|
|
19
|
+
import type { SessionExecutionComposer } from "@session/composer/execution/SessionExecutionComposer.js";
|
|
20
|
+
import type { SessionSystemComposer } from "@session/composer/system/SessionSystemComposer.js";
|
|
21
|
+
import { Runner } from "@session/executors/local/Runner.js";
|
|
22
|
+
import type { Logger } from "@/utils/logger/Logger.js";
|
|
15
23
|
import type { JsonObject } from "@/types/common/Json.js";
|
|
16
24
|
import type { SessionMessageV1 } from "@/session/types/SessionMessages.js";
|
|
17
25
|
import type { SessionExecutor } from "@/session/types/SessionExecutor.js";
|
|
18
26
|
import type { SessionRunResult } from "@/session/types/SessionRun.js";
|
|
19
27
|
|
|
20
|
-
type
|
|
28
|
+
type ExecutorOptions = {
|
|
21
29
|
/**
|
|
22
30
|
* 当前会话 ID。
|
|
23
31
|
*/
|
|
@@ -29,9 +37,34 @@ type SessionOptions = {
|
|
|
29
37
|
historyComposer: SessionHistoryComposer;
|
|
30
38
|
|
|
31
39
|
/**
|
|
32
|
-
*
|
|
40
|
+
* 读取当前 session 使用的模型实例。
|
|
33
41
|
*/
|
|
34
|
-
|
|
42
|
+
getModel: () => LanguageModel | undefined;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 统一日志器。
|
|
46
|
+
*/
|
|
47
|
+
logger: Logger;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 当前 session 对应的 compaction Composer。
|
|
51
|
+
*/
|
|
52
|
+
compactionComposer?: SessionCompactionComposer;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 当前 session 对应的 system Composer。
|
|
56
|
+
*/
|
|
57
|
+
systemComposer: SessionSystemComposer;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 获取当前可用工具集合。
|
|
61
|
+
*/
|
|
62
|
+
getTools: () => Record<string, Tool>;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 可选自定义 execution Composer。
|
|
66
|
+
*/
|
|
67
|
+
executionComposer?: SessionExecutionComposer;
|
|
35
68
|
|
|
36
69
|
/**
|
|
37
70
|
* session 更新后的异步回调。
|
|
@@ -40,30 +73,41 @@ type SessionOptions = {
|
|
|
40
73
|
};
|
|
41
74
|
|
|
42
75
|
/**
|
|
43
|
-
*
|
|
76
|
+
* Executor 单实例实现。
|
|
44
77
|
*/
|
|
45
|
-
export class
|
|
78
|
+
export class Executor implements SessionExecutor {
|
|
46
79
|
/**
|
|
47
80
|
* 当前 session 标识。
|
|
48
81
|
*/
|
|
49
82
|
readonly sessionId: string;
|
|
50
83
|
|
|
51
84
|
private readonly historyComposer: SessionHistoryComposer;
|
|
52
|
-
private readonly
|
|
85
|
+
private readonly getModel: ExecutorOptions["getModel"];
|
|
86
|
+
private readonly logger: Logger;
|
|
87
|
+
private readonly compactionComposer: SessionCompactionComposer;
|
|
88
|
+
private readonly systemComposer: SessionSystemComposer;
|
|
89
|
+
private readonly getTools: ExecutorOptions["getTools"];
|
|
90
|
+
private readonly runnerExecutionComposer?: SessionExecutionComposer;
|
|
53
91
|
private readonly historyWriter: SessionHistoryWriter;
|
|
54
92
|
|
|
55
|
-
private
|
|
93
|
+
private runner: Runner | null = null;
|
|
56
94
|
private executing = false;
|
|
57
95
|
|
|
58
|
-
constructor(options:
|
|
96
|
+
constructor(options: ExecutorOptions) {
|
|
59
97
|
const sessionId = String(options.sessionId || "").trim();
|
|
60
98
|
if (!sessionId) {
|
|
61
|
-
throw new Error("
|
|
99
|
+
throw new Error("Executor requires a non-empty sessionId");
|
|
62
100
|
}
|
|
63
101
|
|
|
64
102
|
this.sessionId = sessionId;
|
|
65
103
|
this.historyComposer = options.historyComposer;
|
|
66
|
-
this.
|
|
104
|
+
this.getModel = options.getModel;
|
|
105
|
+
this.logger = options.logger;
|
|
106
|
+
this.compactionComposer =
|
|
107
|
+
options.compactionComposer || new JsonlSessionCompactionComposer();
|
|
108
|
+
this.systemComposer = options.systemComposer;
|
|
109
|
+
this.getTools = options.getTools;
|
|
110
|
+
this.runnerExecutionComposer = options.executionComposer;
|
|
67
111
|
this.historyWriter = new SessionHistoryWriter({
|
|
68
112
|
sessionId,
|
|
69
113
|
getHistoryComposer: () => this.getHistoryComposer(),
|
|
@@ -86,26 +130,52 @@ export class Session {
|
|
|
86
130
|
}
|
|
87
131
|
|
|
88
132
|
/**
|
|
89
|
-
* 获取当前 session
|
|
133
|
+
* 获取当前 session 的执行端口。
|
|
134
|
+
*
|
|
135
|
+
* 关键点(中文)
|
|
136
|
+
* - 兼容 runtime/service 端口语义:Executor 自己就是执行端口。
|
|
90
137
|
*/
|
|
91
138
|
getExecutor(): SessionExecutor {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
139
|
+
return this;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 获取或创建当前本地 Runner。
|
|
144
|
+
*/
|
|
145
|
+
private getRunner(): Runner {
|
|
146
|
+
if (this.runner) return this.runner;
|
|
147
|
+
const model = this.getModel();
|
|
148
|
+
if (!model) {
|
|
149
|
+
throw new Error(
|
|
150
|
+
`Executor for session "${this.sessionId}" requires a configured model`,
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
const created = new Runner({
|
|
154
|
+
model,
|
|
155
|
+
logger: this.logger,
|
|
156
|
+
historyComposer: this.getHistoryComposer(),
|
|
157
|
+
compactionComposer: this.compactionComposer,
|
|
158
|
+
systemComposer: this.systemComposer,
|
|
159
|
+
executionComposer:
|
|
160
|
+
this.runnerExecutionComposer ||
|
|
161
|
+
new LocalSessionExecutionComposer({
|
|
162
|
+
sessionId: this.sessionId,
|
|
163
|
+
getTools: this.getTools,
|
|
164
|
+
}),
|
|
165
|
+
});
|
|
166
|
+
this.runner = created;
|
|
95
167
|
return created;
|
|
96
168
|
}
|
|
97
169
|
|
|
98
170
|
/**
|
|
99
|
-
* 清理当前 session
|
|
171
|
+
* 清理当前 session 的 Runner 缓存。
|
|
100
172
|
*
|
|
101
173
|
* 关键点(中文)
|
|
102
|
-
* - 这里只清
|
|
103
|
-
* - history 是事实源,不应随着
|
|
174
|
+
* - 这里只清 Runner,不清 history Composer。
|
|
175
|
+
* - history 是事实源,不应随着 Runner 一起丢失。
|
|
104
176
|
*/
|
|
105
177
|
clearExecutor(): void {
|
|
106
|
-
|
|
107
|
-
this.executor = null;
|
|
108
|
-
|
|
178
|
+
this.runner = null;
|
|
109
179
|
}
|
|
110
180
|
|
|
111
181
|
/**
|
|
@@ -153,7 +223,7 @@ export class Session {
|
|
|
153
223
|
if (this.executing) {
|
|
154
224
|
// 关键点(中文):同一个 Session 实例只允许一个活跃 run,
|
|
155
225
|
// 否则 step 回调、scope 与执行器状态都会互相污染。
|
|
156
|
-
throw new Error("
|
|
226
|
+
throw new Error("Executor.run does not support concurrent execution");
|
|
157
227
|
}
|
|
158
228
|
const query = String(params.query || "").trim();
|
|
159
229
|
const sessionRunScope: Omit<SessionRunScope, "sessionId"> = {
|
|
@@ -206,7 +276,7 @@ export class Session {
|
|
|
206
276
|
...sessionRunScope,
|
|
207
277
|
onAssistantStepCallback: wrappedOnAssistantStepCallback,
|
|
208
278
|
},
|
|
209
|
-
() => this.
|
|
279
|
+
() => this.getRunner().run({ query }),
|
|
210
280
|
);
|
|
211
281
|
if (persistedAssistantStepCount <= 0) return result;
|
|
212
282
|
|
|
@@ -30,7 +30,7 @@ export type SessionCompactionInput = {
|
|
|
30
30
|
system: SystemModelMessage[];
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* 当前重试次数(由
|
|
33
|
+
* 当前重试次数(由 Runner 递增)。
|
|
34
34
|
*/
|
|
35
35
|
retryCount: number;
|
|
36
36
|
};
|
|
@@ -57,7 +57,7 @@ export abstract class SessionCompactionComposer extends SessionComposer {
|
|
|
57
57
|
*
|
|
58
58
|
* 关键点(中文)
|
|
59
59
|
* - 由 compaction Composer 实现侧维护错误识别策略。
|
|
60
|
-
* -
|
|
60
|
+
* - Runner 不感知具体错误文案,只按该布尔结果决定是否重试。
|
|
61
61
|
*/
|
|
62
62
|
abstract shouldCompactOnError(error: unknown): boolean;
|
|
63
63
|
|
|
@@ -65,7 +65,7 @@ export abstract class SessionExecutionComposer extends SessionComposer {
|
|
|
65
65
|
* 构造 fallback assistant 消息。
|
|
66
66
|
*
|
|
67
67
|
* 关键点(中文)
|
|
68
|
-
* - fallback 消息构造由 execution Composer 内部实现,
|
|
68
|
+
* - fallback 消息构造由 execution Composer 内部实现,Runner 不直接依赖 history Composer。
|
|
69
69
|
*/
|
|
70
70
|
abstract buildFallbackAssistantMessage(text: string): SessionMessageV1;
|
|
71
71
|
}
|