psadk 1.4.1 → 1.4.3
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/build/main/index.d.ts +1 -0
- package/build/main/index.js +2 -1
- package/build/main/lib/PSAI.d.ts +11 -2
- package/build/main/lib/PSAI.js +145 -28
- package/build/main/lib/agent-core/agent-loop.d.ts +2 -2
- package/build/main/lib/agent-core/agent-loop.js +69 -65
- package/build/main/lib/agent-core/agent.d.ts +8 -8
- package/build/main/lib/agent-core/agent.js +61 -44
- package/build/main/lib/agent-core/harness/agent-harness.d.ts +4 -4
- package/build/main/lib/agent-core/harness/agent-harness.js +156 -112
- package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +5 -5
- package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +31 -28
- package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +5 -5
- package/build/main/lib/agent-core/harness/compaction/compaction.js +99 -78
- package/build/main/lib/agent-core/harness/compaction/utils.d.ts +2 -2
- package/build/main/lib/agent-core/harness/compaction/utils.js +30 -30
- package/build/main/lib/agent-core/harness/env/nodejs.d.ts +1 -1
- package/build/main/lib/agent-core/harness/env/nodejs.js +80 -75
- package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -3
- package/build/main/lib/agent-core/harness/execution-env.js +3 -3
- package/build/main/lib/agent-core/harness/messages.d.ts +7 -7
- package/build/main/lib/agent-core/harness/messages.js +36 -22
- package/build/main/lib/agent-core/harness/prompt-templates.d.ts +2 -2
- package/build/main/lib/agent-core/harness/prompt-templates.js +31 -27
- package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +2 -2
- package/build/main/lib/agent-core/harness/session/repo/jsonl.js +17 -11
- package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +2 -2
- package/build/main/lib/agent-core/harness/session/repo/memory.js +8 -4
- package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +3 -3
- package/build/main/lib/agent-core/harness/session/repo/shared.js +5 -5
- package/build/main/lib/agent-core/harness/session/session.d.ts +3 -3
- package/build/main/lib/agent-core/harness/session/session.js +26 -23
- package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +2 -2
- package/build/main/lib/agent-core/harness/session/storage/jsonl.js +11 -11
- package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +2 -2
- package/build/main/lib/agent-core/harness/session/storage/memory.js +10 -6
- package/build/main/lib/agent-core/harness/skills.d.ts +2 -2
- package/build/main/lib/agent-core/harness/skills.js +55 -48
- package/build/main/lib/agent-core/harness/system-prompt.d.ts +1 -1
- package/build/main/lib/agent-core/harness/system-prompt.js +16 -16
- package/build/main/lib/agent-core/harness/types.d.ts +43 -43
- package/build/main/lib/agent-core/harness/types.js +2 -2
- package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +2 -2
- package/build/main/lib/agent-core/harness/utils/shell-output.js +18 -14
- package/build/main/lib/agent-core/harness/utils/truncate.d.ts +1 -1
- package/build/main/lib/agent-core/harness/utils/truncate.js +27 -24
- package/build/main/lib/agent-core/index.d.ts +19 -19
- package/build/main/lib/agent-core/index.js +20 -20
- package/build/main/lib/agent-core/proxy.d.ts +18 -18
- package/build/main/lib/agent-core/proxy.js +77 -61
- package/build/main/lib/agent-core/types.d.ts +16 -16
- package/build/main/lib/tools/PSRetrievalTool.d.ts +127 -0
- package/build/main/lib/tools/PSRetrievalTool.js +172 -0
- package/build/main/lib/utils/helpers.d.ts +34 -0
- package/build/main/lib/utils/helpers.js +280 -1
- package/build/module/index.d.ts +1 -0
- package/build/module/index.js +2 -1
- package/build/module/lib/PSAI.d.ts +11 -2
- package/build/module/lib/PSAI.js +145 -28
- package/build/module/lib/agent-core/agent-loop.d.ts +2 -2
- package/build/module/lib/agent-core/agent-loop.js +69 -65
- package/build/module/lib/agent-core/agent.d.ts +8 -8
- package/build/module/lib/agent-core/agent.js +61 -44
- package/build/module/lib/agent-core/harness/agent-harness.d.ts +4 -4
- package/build/module/lib/agent-core/harness/agent-harness.js +156 -112
- package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +5 -5
- package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +31 -28
- package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +5 -5
- package/build/module/lib/agent-core/harness/compaction/compaction.js +99 -78
- package/build/module/lib/agent-core/harness/compaction/utils.d.ts +2 -2
- package/build/module/lib/agent-core/harness/compaction/utils.js +30 -30
- package/build/module/lib/agent-core/harness/env/nodejs.d.ts +1 -1
- package/build/module/lib/agent-core/harness/env/nodejs.js +80 -75
- package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -3
- package/build/module/lib/agent-core/harness/execution-env.js +3 -3
- package/build/module/lib/agent-core/harness/messages.d.ts +7 -7
- package/build/module/lib/agent-core/harness/messages.js +36 -22
- package/build/module/lib/agent-core/harness/prompt-templates.d.ts +2 -2
- package/build/module/lib/agent-core/harness/prompt-templates.js +31 -27
- package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +2 -2
- package/build/module/lib/agent-core/harness/session/repo/jsonl.js +17 -11
- package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +2 -2
- package/build/module/lib/agent-core/harness/session/repo/memory.js +8 -4
- package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +3 -3
- package/build/module/lib/agent-core/harness/session/repo/shared.js +5 -5
- package/build/module/lib/agent-core/harness/session/session.d.ts +3 -3
- package/build/module/lib/agent-core/harness/session/session.js +26 -23
- package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +2 -2
- package/build/module/lib/agent-core/harness/session/storage/jsonl.js +11 -11
- package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +2 -2
- package/build/module/lib/agent-core/harness/session/storage/memory.js +10 -6
- package/build/module/lib/agent-core/harness/skills.d.ts +2 -2
- package/build/module/lib/agent-core/harness/skills.js +55 -48
- package/build/module/lib/agent-core/harness/system-prompt.d.ts +1 -1
- package/build/module/lib/agent-core/harness/system-prompt.js +16 -16
- package/build/module/lib/agent-core/harness/types.d.ts +43 -43
- package/build/module/lib/agent-core/harness/types.js +2 -2
- package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +2 -2
- package/build/module/lib/agent-core/harness/utils/shell-output.js +18 -14
- package/build/module/lib/agent-core/harness/utils/truncate.d.ts +1 -1
- package/build/module/lib/agent-core/harness/utils/truncate.js +27 -24
- package/build/module/lib/agent-core/index.d.ts +19 -19
- package/build/module/lib/agent-core/index.js +20 -20
- package/build/module/lib/agent-core/proxy.d.ts +18 -18
- package/build/module/lib/agent-core/proxy.js +77 -61
- package/build/module/lib/agent-core/types.d.ts +16 -16
- package/build/module/lib/tools/PSRetrievalTool.d.ts +127 -0
- package/build/module/lib/tools/PSRetrievalTool.js +172 -0
- package/build/module/lib/utils/helpers.d.ts +34 -0
- package/build/module/lib/utils/helpers.js +280 -1
- package/package.json +1 -1
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
* The server manages auth and proxies requests to LLM providers.
|
|
4
4
|
*/
|
|
5
5
|
// Internal import for JSON parsing utility
|
|
6
|
-
import { EventStream, parseStreamingJson, } from
|
|
6
|
+
import { EventStream, parseStreamingJson, } from '@earendil-works/pi-ai';
|
|
7
7
|
// Create stream class matching ProxyMessageEventStream
|
|
8
8
|
class ProxyMessageEventStream extends EventStream {
|
|
9
9
|
constructor() {
|
|
10
|
-
super((event) => event.type ===
|
|
11
|
-
if (event.type ===
|
|
10
|
+
super((event) => event.type === 'done' || event.type === 'error', (event) => {
|
|
11
|
+
if (event.type === 'done')
|
|
12
12
|
return event.message;
|
|
13
|
-
if (event.type ===
|
|
13
|
+
if (event.type === 'error')
|
|
14
14
|
return event.error;
|
|
15
|
-
throw new Error(
|
|
15
|
+
throw new Error('Unexpected event type');
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -54,8 +54,8 @@ export function streamProxy(model, context, options) {
|
|
|
54
54
|
(async () => {
|
|
55
55
|
// Initialize the partial message that we'll build up from events
|
|
56
56
|
const partial = {
|
|
57
|
-
role:
|
|
58
|
-
stopReason:
|
|
57
|
+
role: 'assistant',
|
|
58
|
+
stopReason: 'stop',
|
|
59
59
|
content: [],
|
|
60
60
|
api: model.api,
|
|
61
61
|
provider: model.provider,
|
|
@@ -73,18 +73,18 @@ export function streamProxy(model, context, options) {
|
|
|
73
73
|
let reader;
|
|
74
74
|
const abortHandler = () => {
|
|
75
75
|
if (reader) {
|
|
76
|
-
reader.cancel(
|
|
76
|
+
reader.cancel('Request aborted by user').catch(() => { });
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
79
|
if (options.signal) {
|
|
80
|
-
options.signal.addEventListener(
|
|
80
|
+
options.signal.addEventListener('abort', abortHandler);
|
|
81
81
|
}
|
|
82
82
|
try {
|
|
83
83
|
const response = await fetch(`${options.proxyUrl}/api/stream`, {
|
|
84
|
-
method:
|
|
84
|
+
method: 'POST',
|
|
85
85
|
headers: {
|
|
86
86
|
Authorization: `Bearer ${options.authToken}`,
|
|
87
|
-
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
88
|
},
|
|
89
89
|
body: JSON.stringify({
|
|
90
90
|
model,
|
|
@@ -108,19 +108,19 @@ export function streamProxy(model, context, options) {
|
|
|
108
108
|
}
|
|
109
109
|
reader = response.body.getReader();
|
|
110
110
|
const decoder = new TextDecoder();
|
|
111
|
-
let buffer =
|
|
111
|
+
let buffer = '';
|
|
112
112
|
while (true) {
|
|
113
113
|
const { done, value } = await reader.read();
|
|
114
114
|
if (done)
|
|
115
115
|
break;
|
|
116
116
|
if (options.signal?.aborted) {
|
|
117
|
-
throw new Error(
|
|
117
|
+
throw new Error('Request aborted by user');
|
|
118
118
|
}
|
|
119
119
|
buffer += decoder.decode(value, { stream: true });
|
|
120
|
-
const lines = buffer.split(
|
|
121
|
-
buffer = lines.pop() ||
|
|
120
|
+
const lines = buffer.split('\n');
|
|
121
|
+
buffer = lines.pop() || '';
|
|
122
122
|
for (const line of lines) {
|
|
123
|
-
if (line.startsWith(
|
|
123
|
+
if (line.startsWith('data: ')) {
|
|
124
124
|
const data = line.slice(6).trim();
|
|
125
125
|
if (data) {
|
|
126
126
|
const proxyEvent = JSON.parse(data);
|
|
@@ -133,17 +133,17 @@ export function streamProxy(model, context, options) {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
if (options.signal?.aborted) {
|
|
136
|
-
throw new Error(
|
|
136
|
+
throw new Error('Request aborted by user');
|
|
137
137
|
}
|
|
138
138
|
stream.end();
|
|
139
139
|
}
|
|
140
140
|
catch (error) {
|
|
141
141
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
142
|
-
const reason = options.signal?.aborted ?
|
|
142
|
+
const reason = options.signal?.aborted ? 'aborted' : 'error';
|
|
143
143
|
partial.stopReason = reason;
|
|
144
144
|
partial.errorMessage = errorMessage;
|
|
145
145
|
stream.push({
|
|
146
|
-
type:
|
|
146
|
+
type: 'error',
|
|
147
147
|
reason,
|
|
148
148
|
error: partial,
|
|
149
149
|
});
|
|
@@ -151,7 +151,7 @@ export function streamProxy(model, context, options) {
|
|
|
151
151
|
}
|
|
152
152
|
finally {
|
|
153
153
|
if (options.signal) {
|
|
154
|
-
options.signal.removeEventListener(
|
|
154
|
+
options.signal.removeEventListener('abort', abortHandler);
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
})();
|
|
@@ -162,96 +162,112 @@ export function streamProxy(model, context, options) {
|
|
|
162
162
|
*/
|
|
163
163
|
function processProxyEvent(proxyEvent, partial) {
|
|
164
164
|
switch (proxyEvent.type) {
|
|
165
|
-
case
|
|
166
|
-
return { type:
|
|
167
|
-
case
|
|
168
|
-
partial.content[proxyEvent.contentIndex] = { type:
|
|
169
|
-
return {
|
|
170
|
-
|
|
165
|
+
case 'start':
|
|
166
|
+
return { type: 'start', partial };
|
|
167
|
+
case 'text_start':
|
|
168
|
+
partial.content[proxyEvent.contentIndex] = { type: 'text', text: '' };
|
|
169
|
+
return {
|
|
170
|
+
type: 'text_start',
|
|
171
|
+
contentIndex: proxyEvent.contentIndex,
|
|
172
|
+
partial,
|
|
173
|
+
};
|
|
174
|
+
case 'text_delta': {
|
|
171
175
|
const content = partial.content[proxyEvent.contentIndex];
|
|
172
|
-
if (content?.type ===
|
|
176
|
+
if (content?.type === 'text') {
|
|
173
177
|
content.text += proxyEvent.delta;
|
|
174
178
|
return {
|
|
175
|
-
type:
|
|
179
|
+
type: 'text_delta',
|
|
176
180
|
contentIndex: proxyEvent.contentIndex,
|
|
177
181
|
delta: proxyEvent.delta,
|
|
178
182
|
partial,
|
|
179
183
|
};
|
|
180
184
|
}
|
|
181
|
-
throw new Error(
|
|
185
|
+
throw new Error('Received text_delta for non-text content');
|
|
182
186
|
}
|
|
183
|
-
case
|
|
187
|
+
case 'text_end': {
|
|
184
188
|
const content = partial.content[proxyEvent.contentIndex];
|
|
185
|
-
if (content?.type ===
|
|
189
|
+
if (content?.type === 'text') {
|
|
186
190
|
content.textSignature = proxyEvent.contentSignature;
|
|
187
191
|
return {
|
|
188
|
-
type:
|
|
192
|
+
type: 'text_end',
|
|
189
193
|
contentIndex: proxyEvent.contentIndex,
|
|
190
194
|
content: content.text,
|
|
191
195
|
partial,
|
|
192
196
|
};
|
|
193
197
|
}
|
|
194
|
-
throw new Error(
|
|
198
|
+
throw new Error('Received text_end for non-text content');
|
|
195
199
|
}
|
|
196
|
-
case
|
|
197
|
-
partial.content[proxyEvent.contentIndex] = {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
+
case 'thinking_start':
|
|
201
|
+
partial.content[proxyEvent.contentIndex] = {
|
|
202
|
+
type: 'thinking',
|
|
203
|
+
thinking: '',
|
|
204
|
+
};
|
|
205
|
+
return {
|
|
206
|
+
type: 'thinking_start',
|
|
207
|
+
contentIndex: proxyEvent.contentIndex,
|
|
208
|
+
partial,
|
|
209
|
+
};
|
|
210
|
+
case 'thinking_delta': {
|
|
200
211
|
const content = partial.content[proxyEvent.contentIndex];
|
|
201
|
-
if (content?.type ===
|
|
212
|
+
if (content?.type === 'thinking') {
|
|
202
213
|
content.thinking += proxyEvent.delta;
|
|
203
214
|
return {
|
|
204
|
-
type:
|
|
215
|
+
type: 'thinking_delta',
|
|
205
216
|
contentIndex: proxyEvent.contentIndex,
|
|
206
217
|
delta: proxyEvent.delta,
|
|
207
218
|
partial,
|
|
208
219
|
};
|
|
209
220
|
}
|
|
210
|
-
throw new Error(
|
|
221
|
+
throw new Error('Received thinking_delta for non-thinking content');
|
|
211
222
|
}
|
|
212
|
-
case
|
|
223
|
+
case 'thinking_end': {
|
|
213
224
|
const content = partial.content[proxyEvent.contentIndex];
|
|
214
|
-
if (content?.type ===
|
|
225
|
+
if (content?.type === 'thinking') {
|
|
215
226
|
content.thinkingSignature = proxyEvent.contentSignature;
|
|
216
227
|
return {
|
|
217
|
-
type:
|
|
228
|
+
type: 'thinking_end',
|
|
218
229
|
contentIndex: proxyEvent.contentIndex,
|
|
219
230
|
content: content.thinking,
|
|
220
231
|
partial,
|
|
221
232
|
};
|
|
222
233
|
}
|
|
223
|
-
throw new Error(
|
|
234
|
+
throw new Error('Received thinking_end for non-thinking content');
|
|
224
235
|
}
|
|
225
|
-
case
|
|
236
|
+
case 'toolcall_start':
|
|
226
237
|
partial.content[proxyEvent.contentIndex] = {
|
|
227
|
-
type:
|
|
238
|
+
type: 'toolCall',
|
|
228
239
|
id: proxyEvent.id,
|
|
229
240
|
name: proxyEvent.toolName,
|
|
230
241
|
arguments: {},
|
|
231
|
-
partialJson:
|
|
242
|
+
partialJson: '',
|
|
243
|
+
};
|
|
244
|
+
return {
|
|
245
|
+
type: 'toolcall_start',
|
|
246
|
+
contentIndex: proxyEvent.contentIndex,
|
|
247
|
+
partial,
|
|
232
248
|
};
|
|
233
|
-
|
|
234
|
-
case "toolcall_delta": {
|
|
249
|
+
case 'toolcall_delta': {
|
|
235
250
|
const content = partial.content[proxyEvent.contentIndex];
|
|
236
|
-
if (content?.type ===
|
|
251
|
+
if (content?.type === 'toolCall') {
|
|
237
252
|
content.partialJson += proxyEvent.delta;
|
|
238
|
-
content.arguments =
|
|
253
|
+
content.arguments =
|
|
254
|
+
parseStreamingJson(content.partialJson) || {};
|
|
239
255
|
partial.content[proxyEvent.contentIndex] = { ...content }; // Trigger reactivity
|
|
240
256
|
return {
|
|
241
|
-
type:
|
|
257
|
+
type: 'toolcall_delta',
|
|
242
258
|
contentIndex: proxyEvent.contentIndex,
|
|
243
259
|
delta: proxyEvent.delta,
|
|
244
260
|
partial,
|
|
245
261
|
};
|
|
246
262
|
}
|
|
247
|
-
throw new Error(
|
|
263
|
+
throw new Error('Received toolcall_delta for non-toolCall content');
|
|
248
264
|
}
|
|
249
|
-
case
|
|
265
|
+
case 'toolcall_end': {
|
|
250
266
|
const content = partial.content[proxyEvent.contentIndex];
|
|
251
|
-
if (content?.type ===
|
|
267
|
+
if (content?.type === 'toolCall') {
|
|
252
268
|
delete content.partialJson;
|
|
253
269
|
return {
|
|
254
|
-
type:
|
|
270
|
+
type: 'toolcall_end',
|
|
255
271
|
contentIndex: proxyEvent.contentIndex,
|
|
256
272
|
toolCall: content,
|
|
257
273
|
partial,
|
|
@@ -259,15 +275,15 @@ function processProxyEvent(proxyEvent, partial) {
|
|
|
259
275
|
}
|
|
260
276
|
return undefined;
|
|
261
277
|
}
|
|
262
|
-
case
|
|
278
|
+
case 'done':
|
|
263
279
|
partial.stopReason = proxyEvent.reason;
|
|
264
280
|
partial.usage = proxyEvent.usage;
|
|
265
|
-
return { type:
|
|
266
|
-
case
|
|
281
|
+
return { type: 'done', reason: proxyEvent.reason, message: partial };
|
|
282
|
+
case 'error':
|
|
267
283
|
partial.stopReason = proxyEvent.reason;
|
|
268
284
|
partial.errorMessage = proxyEvent.errorMessage;
|
|
269
285
|
partial.usage = proxyEvent.usage;
|
|
270
|
-
return { type:
|
|
286
|
+
return { type: 'error', reason: proxyEvent.reason, error: partial };
|
|
271
287
|
default: {
|
|
272
288
|
void proxyEvent;
|
|
273
289
|
console.warn(`Unhandled proxy event type: ${proxyEvent.type}`);
|
|
@@ -275,4 +291,4 @@ function processProxyEvent(proxyEvent, partial) {
|
|
|
275
291
|
}
|
|
276
292
|
}
|
|
277
293
|
}
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMkNBQTJDO0FBQzNDLE9BQU8sRUFJTixXQUFXLEVBRVgsa0JBQWtCLEdBSWxCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsdURBQXVEO0FBQ3ZELE1BQU0sdUJBQXdCLFNBQVEsV0FBb0Q7SUFDekY7UUFDQyxLQUFLLENBQ0osQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUMxRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2hELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUFFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUNELENBQUM7SUFDSCxDQUFDO0NBQ0Q7QUFtREQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsd0JBQXdCLENBQUMsT0FBMkI7SUFDNUQsT0FBTztRQUNOLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7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
|
|
294
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FnZW50LWNvcmUvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMkNBQTJDO0FBQzNDLE9BQU8sRUFJTCxXQUFXLEVBRVgsa0JBQWtCLEdBSW5CLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsdURBQXVEO0FBQ3ZELE1BQU0sdUJBQXdCLFNBQVEsV0FHckM7SUFDQztRQUNFLEtBQUssQ0FDSCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQzFELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXdERDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FDL0IsT0FBMkI7SUFFM0IsT0FBTztRQUNMLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AssistantMessage, AssistantMessageEvent, ImageContent, Message, Model, SimpleStreamOptions, streamSimple, TextContent, Tool, ToolResultMessage } from
|
|
2
|
-
import type { Static, TSchema } from
|
|
1
|
+
import type { AssistantMessage, AssistantMessageEvent, ImageContent, Message, Model, SimpleStreamOptions, streamSimple, TextContent, Tool, ToolResultMessage } from '@earendil-works/pi-ai';
|
|
2
|
+
import type { Static, TSchema } from 'typebox';
|
|
3
3
|
/**
|
|
4
4
|
* Stream function used by the agent loop.
|
|
5
5
|
*
|
|
@@ -18,10 +18,10 @@ export type StreamFn = (...args: Parameters<typeof streamSimple>) => ReturnType<
|
|
|
18
18
|
* `tool_execution_end` is emitted in tool completion order after each tool is finalized,
|
|
19
19
|
* while tool-result message artifacts are emitted later in assistant source order.
|
|
20
20
|
*/
|
|
21
|
-
export type ToolExecutionMode =
|
|
21
|
+
export type ToolExecutionMode = 'sequential' | 'parallel';
|
|
22
22
|
/** A single tool call content block emitted by an assistant message. */
|
|
23
|
-
export type AgentToolCall = Extract<AssistantMessage[
|
|
24
|
-
type:
|
|
23
|
+
export type AgentToolCall = Extract<AssistantMessage['content'][number], {
|
|
24
|
+
type: 'toolCall';
|
|
25
25
|
}>;
|
|
26
26
|
/**
|
|
27
27
|
* Result returned from `beforeToolCall`.
|
|
@@ -239,7 +239,7 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
|
|
|
239
239
|
* Note: "xhigh" is only supported by selected model families. Use model thinking-level metadata
|
|
240
240
|
* from @earendil-works/pi-ai to detect support for a concrete model.
|
|
241
241
|
*/
|
|
242
|
-
export type ThinkingLevel =
|
|
242
|
+
export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
243
243
|
/**
|
|
244
244
|
* Extensible interface for custom app messages.
|
|
245
245
|
* Apps can extend via declaration merging:
|
|
@@ -345,39 +345,39 @@ export interface AgentContext {
|
|
|
345
345
|
* idle only after those listeners finish.
|
|
346
346
|
*/
|
|
347
347
|
export type AgentEvent = {
|
|
348
|
-
type:
|
|
348
|
+
type: 'agent_start';
|
|
349
349
|
} | {
|
|
350
|
-
type:
|
|
350
|
+
type: 'agent_end';
|
|
351
351
|
messages: AgentMessage[];
|
|
352
352
|
} | {
|
|
353
|
-
type:
|
|
353
|
+
type: 'turn_start';
|
|
354
354
|
} | {
|
|
355
|
-
type:
|
|
355
|
+
type: 'turn_end';
|
|
356
356
|
message: AgentMessage;
|
|
357
357
|
toolResults: ToolResultMessage[];
|
|
358
358
|
} | {
|
|
359
|
-
type:
|
|
359
|
+
type: 'message_start';
|
|
360
360
|
message: AgentMessage;
|
|
361
361
|
} | {
|
|
362
|
-
type:
|
|
362
|
+
type: 'message_update';
|
|
363
363
|
message: AgentMessage;
|
|
364
364
|
assistantMessageEvent: AssistantMessageEvent;
|
|
365
365
|
} | {
|
|
366
|
-
type:
|
|
366
|
+
type: 'message_end';
|
|
367
367
|
message: AgentMessage;
|
|
368
368
|
} | {
|
|
369
|
-
type:
|
|
369
|
+
type: 'tool_execution_start';
|
|
370
370
|
toolCallId: string;
|
|
371
371
|
toolName: string;
|
|
372
372
|
args: any;
|
|
373
373
|
} | {
|
|
374
|
-
type:
|
|
374
|
+
type: 'tool_execution_update';
|
|
375
375
|
toolCallId: string;
|
|
376
376
|
toolName: string;
|
|
377
377
|
args: any;
|
|
378
378
|
partialResult: any;
|
|
379
379
|
} | {
|
|
380
|
-
type:
|
|
380
|
+
type: 'tool_execution_end';
|
|
381
381
|
toolCallId: string;
|
|
382
382
|
toolName: string;
|
|
383
383
|
result: any;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { IStreamLogger } from '../PSAgentLogger';
|
|
2
|
+
import { PSAgentTool } from '../PSAgentTool';
|
|
3
|
+
/**
|
|
4
|
+
* Minimum shape for an embedding entity. Consumers extend this with
|
|
5
|
+
* their own fields (metadata, source, timestamps, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export interface IEmbeddingEntity {
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Anything that can turn text into a vector.
|
|
12
|
+
*
|
|
13
|
+
* `PSAI` satisfies this interface out of the box, but consumers can
|
|
14
|
+
* provide their own OpenAI client, Cohere SDK, local model wrapper, etc.
|
|
15
|
+
*/
|
|
16
|
+
export interface IEmbeddingProvider {
|
|
17
|
+
embedQuery(text: string): Promise<number[]>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A single search result returned by the repository.
|
|
21
|
+
*/
|
|
22
|
+
export interface IEmbeddingSearchResult<T extends IEmbeddingEntity> {
|
|
23
|
+
/** The matched entity. */
|
|
24
|
+
entity: T;
|
|
25
|
+
/** Similarity score in the range [0, 1] where 1 is an exact match. */
|
|
26
|
+
similarity: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Storage-agnostic repository interface for similarity search.
|
|
30
|
+
*
|
|
31
|
+
* Consumers implement this for their own stack — TypeORM + pgvector,
|
|
32
|
+
* Prisma, Pinecone, Weaviate, in-memory, etc.
|
|
33
|
+
*/
|
|
34
|
+
export interface IEmbeddingRepository<T extends IEmbeddingEntity> {
|
|
35
|
+
/**
|
|
36
|
+
* Find the `limit` most similar entities to `queryEmbedding`.
|
|
37
|
+
*
|
|
38
|
+
* Implementations must return results ordered by similarity descending
|
|
39
|
+
* and clamp similarity values to [0, 1].
|
|
40
|
+
*/
|
|
41
|
+
findSimilar(queryEmbedding: number[], limit: number): Promise<Array<IEmbeddingSearchResult<T>>>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Configuration for PSRetrievalTool.
|
|
45
|
+
*/
|
|
46
|
+
export interface PSRetrievalToolOptions<T extends IEmbeddingEntity = IEmbeddingEntity> {
|
|
47
|
+
/** Repository that performs the actual similarity search. */
|
|
48
|
+
repository: IEmbeddingRepository<T>;
|
|
49
|
+
/** Provider that converts text queries into embedding vectors. */
|
|
50
|
+
embeddingProvider: IEmbeddingProvider;
|
|
51
|
+
/** Default number of results to return (1–20, default: 5). */
|
|
52
|
+
topK?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Override the default tool name (`search_knowledge_base`).
|
|
55
|
+
* Useful when an agent has multiple retrieval tools (docs, tickets, FAQ).
|
|
56
|
+
*/
|
|
57
|
+
name?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Override the default tool description.
|
|
60
|
+
*/
|
|
61
|
+
description?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Custom result formatter. Receives each entity, its similarity score
|
|
64
|
+
* (0–1), and its 0-based index. Returns a markdown string for that result.
|
|
65
|
+
*
|
|
66
|
+
* When omitted, the default formatter renders content in a code block
|
|
67
|
+
* with a similarity percentage header.
|
|
68
|
+
*/
|
|
69
|
+
formatResult?: (entity: T, similarity: number, index: number) => string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* PSRetrievalTool — A tool for semantic similarity search over embedded
|
|
73
|
+
* documents.
|
|
74
|
+
*
|
|
75
|
+
* The tool is storage-agnostic: consumers provide an {@link IEmbeddingRepository}
|
|
76
|
+
* implementation for their own database/vector store, and an
|
|
77
|
+
* {@link IEmbeddingProvider} for embedding queries.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* // Basic usage (PSAI implements IEmbeddingProvider)
|
|
82
|
+
* const tool = new PSRetrievalTool({
|
|
83
|
+
* repository: myEmbeddingRepo,
|
|
84
|
+
* embeddingProvider: psai,
|
|
85
|
+
* });
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* // Multiple retrieval tools with custom names
|
|
91
|
+
* const docsTool = new PSRetrievalTool({
|
|
92
|
+
* repository: docsRepo,
|
|
93
|
+
* embeddingProvider: psai,
|
|
94
|
+
* name: 'search_docs',
|
|
95
|
+
* description: 'Search the documentation knowledge base.',
|
|
96
|
+
* });
|
|
97
|
+
*
|
|
98
|
+
* const ticketsTool = new PSRetrievalTool({
|
|
99
|
+
* repository: ticketsRepo,
|
|
100
|
+
* embeddingProvider: psai,
|
|
101
|
+
* name: 'search_tickets',
|
|
102
|
+
* description: 'Search past support tickets.',
|
|
103
|
+
* });
|
|
104
|
+
* ```
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* // Custom result formatting
|
|
109
|
+
* const tool = new PSRetrievalTool({
|
|
110
|
+
* repository: myRepo,
|
|
111
|
+
* embeddingProvider: psai,
|
|
112
|
+
* formatResult: (entity, similarity, index) => {
|
|
113
|
+
* const meta = (entity as any).metadata || {};
|
|
114
|
+
* return `**${index + 1}.** [${(similarity * 100).toFixed(0)}%] ${meta.title ?? 'Untitled'}\n${entity.content}\n`;
|
|
115
|
+
* },
|
|
116
|
+
* });
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare class PSRetrievalTool<T extends IEmbeddingEntity = IEmbeddingEntity> extends PSAgentTool {
|
|
120
|
+
static readonly toolName = "search_knowledge_base";
|
|
121
|
+
private repository;
|
|
122
|
+
private embeddingProvider;
|
|
123
|
+
private topK;
|
|
124
|
+
private formatResult;
|
|
125
|
+
constructor(options: PSRetrievalToolOptions<T>);
|
|
126
|
+
run(input: Record<string, any>, log?: IStreamLogger): Promise<Record<string, any>>;
|
|
127
|
+
}
|