psadk 1.3.6 → 1.4.1
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/CHANGELOG.md +52 -0
- package/README.md +150 -0
- package/build/main/lib/PSAI.d.ts +8 -1
- package/build/main/lib/PSAI.js +128 -75
- package/build/main/lib/PSAgent.js +77 -60
- package/build/main/lib/PSAgentConfig.d.ts +3 -0
- package/build/main/lib/PSAgentLogger.js +12 -9
- package/build/main/lib/PSAgentTask.js +4 -1
- package/build/main/lib/PSAgentTool.js +12 -2
- package/build/main/lib/agent-core/agent-loop.d.ts +23 -0
- package/build/main/lib/agent-core/agent-loop.js +479 -0
- package/build/main/lib/agent-core/agent.d.ts +124 -0
- package/build/main/lib/agent-core/agent.js +402 -0
- package/build/main/lib/agent-core/harness/agent-harness.d.ts +84 -0
- package/build/main/lib/agent-core/harness/agent-harness.js +728 -0
- package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
- package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +243 -0
- package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
- package/build/main/lib/agent-core/harness/compaction/compaction.js +616 -0
- package/build/main/lib/agent-core/harness/compaction/utils.d.ts +37 -0
- package/build/main/lib/agent-core/harness/compaction/utils.js +153 -0
- package/build/main/lib/agent-core/harness/env/nodejs.d.ts +43 -0
- package/build/main/lib/agent-core/harness/env/nodejs.js +348 -0
- package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -0
- package/build/main/lib/agent-core/harness/execution-env.js +3 -0
- package/build/main/lib/agent-core/harness/messages.d.ts +50 -0
- package/build/main/lib/agent-core/harness/messages.js +102 -0
- package/build/main/lib/agent-core/harness/prompt-templates.d.ts +44 -0
- package/build/main/lib/agent-core/harness/prompt-templates.js +200 -0
- package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
- package/build/main/lib/agent-core/harness/session/repo/jsonl.js +92 -0
- package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
- package/build/main/lib/agent-core/harness/session/repo/memory.js +42 -0
- package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
- package/build/main/lib/agent-core/harness/session/repo/shared.js +31 -0
- package/build/main/lib/agent-core/harness/session/session.d.ts +31 -0
- package/build/main/lib/agent-core/harness/session/session.js +196 -0
- package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
- package/build/main/lib/agent-core/harness/session/storage/jsonl.js +170 -0
- package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
- package/build/main/lib/agent-core/harness/session/storage/memory.js +90 -0
- package/build/main/lib/agent-core/harness/skills.d.ts +40 -0
- package/build/main/lib/agent-core/harness/skills.js +259 -0
- package/build/main/lib/agent-core/harness/system-prompt.d.ts +2 -0
- package/build/main/lib/agent-core/harness/system-prompt.js +30 -0
- package/build/main/lib/agent-core/harness/types.d.ts +524 -0
- package/build/main/lib/agent-core/harness/types.js +16 -0
- package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
- package/build/main/lib/agent-core/harness/utils/shell-output.js +97 -0
- package/build/main/lib/agent-core/harness/utils/truncate.d.ts +69 -0
- package/build/main/lib/agent-core/harness/utils/truncate.js +205 -0
- package/build/main/lib/agent-core/index.d.ts +19 -0
- package/build/main/lib/agent-core/index.js +25 -0
- package/build/main/lib/agent-core/package.json +3 -0
- package/build/main/lib/agent-core/proxy.d.ts +68 -0
- package/build/main/lib/agent-core/proxy.js +278 -0
- package/build/main/lib/agent-core/types.d.ts +385 -0
- package/build/main/lib/agent-core/types.js +2 -0
- package/build/main/lib/skills/constants.js +6 -4
- package/build/main/lib/skills/skillParser.js +2 -2
- package/build/main/lib/skills/utils.js +8 -10
- package/build/main/lib/tools/BraveWebSearchTool.js +4 -3
- package/build/main/lib/tools/PSArtifactTool.js +3 -3
- package/build/main/lib/tools/PSClarifyTool.js +3 -2
- package/build/main/lib/tools/PSCommandLineTool.js +8 -7
- package/build/main/lib/tools/PSMemoryTool.js +9 -7
- package/build/main/lib/tools/PSReadFileTool.js +3 -3
- package/build/main/lib/tools/PSSkillTool.js +6 -4
- package/build/main/lib/tools/PSSubAgentTool.js +4 -5
- package/build/main/lib/tools/PSWriteFileTool.js +3 -3
- package/build/main/lib/tools/TodoTool.js +8 -4
- package/build/main/lib/utils/helpers.js +2 -13
- package/build/module/lib/PSAI.d.ts +8 -1
- package/build/module/lib/PSAI.js +115 -81
- package/build/module/lib/PSAgentConfig.d.ts +3 -0
- package/build/module/lib/agent-core/agent-loop.d.ts +23 -0
- package/build/module/lib/agent-core/agent-loop.js +479 -0
- package/build/module/lib/agent-core/agent.d.ts +124 -0
- package/build/module/lib/agent-core/agent.js +402 -0
- package/build/module/lib/agent-core/harness/agent-harness.d.ts +84 -0
- package/build/module/lib/agent-core/harness/agent-harness.js +728 -0
- package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
- package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +243 -0
- package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
- package/build/module/lib/agent-core/harness/compaction/compaction.js +616 -0
- package/build/module/lib/agent-core/harness/compaction/utils.d.ts +37 -0
- package/build/module/lib/agent-core/harness/compaction/utils.js +153 -0
- package/build/module/lib/agent-core/harness/env/nodejs.d.ts +43 -0
- package/build/module/lib/agent-core/harness/env/nodejs.js +348 -0
- package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -0
- package/build/module/lib/agent-core/harness/execution-env.js +3 -0
- package/build/module/lib/agent-core/harness/messages.d.ts +50 -0
- package/build/module/lib/agent-core/harness/messages.js +102 -0
- package/build/module/lib/agent-core/harness/prompt-templates.d.ts +44 -0
- package/build/module/lib/agent-core/harness/prompt-templates.js +200 -0
- package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
- package/build/module/lib/agent-core/harness/session/repo/jsonl.js +92 -0
- package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
- package/build/module/lib/agent-core/harness/session/repo/memory.js +42 -0
- package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
- package/build/module/lib/agent-core/harness/session/repo/shared.js +31 -0
- package/build/module/lib/agent-core/harness/session/session.d.ts +31 -0
- package/build/module/lib/agent-core/harness/session/session.js +196 -0
- package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
- package/build/module/lib/agent-core/harness/session/storage/jsonl.js +170 -0
- package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
- package/build/module/lib/agent-core/harness/session/storage/memory.js +90 -0
- package/build/module/lib/agent-core/harness/skills.d.ts +40 -0
- package/build/module/lib/agent-core/harness/skills.js +259 -0
- package/build/module/lib/agent-core/harness/system-prompt.d.ts +2 -0
- package/build/module/lib/agent-core/harness/system-prompt.js +30 -0
- package/build/module/lib/agent-core/harness/types.d.ts +524 -0
- package/build/module/lib/agent-core/harness/types.js +16 -0
- package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
- package/build/module/lib/agent-core/harness/utils/shell-output.js +97 -0
- package/build/module/lib/agent-core/harness/utils/truncate.d.ts +69 -0
- package/build/module/lib/agent-core/harness/utils/truncate.js +205 -0
- package/build/module/lib/agent-core/index.d.ts +19 -0
- package/build/module/lib/agent-core/index.js +25 -0
- package/build/module/lib/agent-core/proxy.d.ts +68 -0
- package/build/module/lib/agent-core/proxy.js +278 -0
- package/build/module/lib/agent-core/types.d.ts +385 -0
- package/build/module/lib/agent-core/types.js +2 -0
- package/build/module/lib/tools/PSSkillTool.js +1 -1
- package/package.json +20 -3
package/build/module/lib/PSAI.js
CHANGED
|
@@ -21,6 +21,14 @@ const existingToken = {
|
|
|
21
21
|
expires: new Date(0),
|
|
22
22
|
service_expires: new Date(0),
|
|
23
23
|
};
|
|
24
|
+
function updateExistingToken(accessToken, refreshToken) {
|
|
25
|
+
const accessPayload = jwt_1.JwtUtils.decode(accessToken);
|
|
26
|
+
const refreshPayload = jwt_1.JwtUtils.decode(refreshToken);
|
|
27
|
+
existingToken.service_token = accessToken;
|
|
28
|
+
existingToken.refresh_token = refreshToken;
|
|
29
|
+
existingToken.expires = new Date(refreshPayload?.exp * 1000);
|
|
30
|
+
existingToken.service_expires = new Date(accessPayload?.exp * 1000);
|
|
31
|
+
}
|
|
24
32
|
// export default class AIHelper implements EmbeddingsInterface{
|
|
25
33
|
class PSAI {
|
|
26
34
|
token;
|
|
@@ -28,10 +36,12 @@ class PSAI {
|
|
|
28
36
|
baseUrl;
|
|
29
37
|
log;
|
|
30
38
|
clientid;
|
|
31
|
-
|
|
39
|
+
appToken;
|
|
40
|
+
constructor(token, baseUrl, log, appToken) {
|
|
32
41
|
this.token = token;
|
|
33
42
|
this.baseUrl = baseUrl || process.env.PS_API_URL || '';
|
|
34
43
|
this.clientid = process.env.PS_CLIENT_ID || '';
|
|
44
|
+
this.appToken = appToken;
|
|
35
45
|
this.dimensions = 1536; // default to 1536 dimensions (for text-embedding-3-small)
|
|
36
46
|
this.log = log || new PSAgentLogger_1.PSAgentLogger({ prefix: 'PSAI' });
|
|
37
47
|
}
|
|
@@ -56,6 +66,9 @@ class PSAI {
|
|
|
56
66
|
'Content-Type': 'application/json',
|
|
57
67
|
Authorization: `Bearer ${this.token}`,
|
|
58
68
|
'x-client-id': this.clientid || '',
|
|
69
|
+
...(this.appToken
|
|
70
|
+
? { 'X-App-Authorization': `Bearer ${this.appToken}` }
|
|
71
|
+
: {}),
|
|
59
72
|
},
|
|
60
73
|
body: JSON.stringify({
|
|
61
74
|
input: text,
|
|
@@ -77,6 +90,9 @@ class PSAI {
|
|
|
77
90
|
'Content-Type': 'application/json',
|
|
78
91
|
Authorization: `Bearer ${this.token}`,
|
|
79
92
|
'x-client-id': this.clientid || '',
|
|
93
|
+
...(this.appToken
|
|
94
|
+
? { 'X-App-Authorization': `Bearer ${this.appToken}` }
|
|
95
|
+
: {}),
|
|
80
96
|
},
|
|
81
97
|
body: JSON.stringify({
|
|
82
98
|
input: text,
|
|
@@ -92,38 +108,81 @@ class PSAI {
|
|
|
92
108
|
return data.data.map((item) => item.embedding);
|
|
93
109
|
}
|
|
94
110
|
async getModels() {
|
|
95
|
-
const
|
|
111
|
+
const response = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, '/models'), {
|
|
96
112
|
headers: {
|
|
97
113
|
Authorization: `Bearer ${this.token}`,
|
|
114
|
+
...(this.appToken
|
|
115
|
+
? { 'X-App-Authorization': `Bearer ${this.appToken}` }
|
|
116
|
+
: {}),
|
|
98
117
|
},
|
|
99
118
|
});
|
|
100
|
-
if (!
|
|
101
|
-
this.log.error(`Failed to fetch LLM models: ${
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
this.log.error(`Failed to fetch LLM models: ${response.status} ${response.statusText}`);
|
|
102
121
|
}
|
|
103
|
-
const { data: models } = (await
|
|
122
|
+
const { data: models } = (await response.json());
|
|
104
123
|
return models;
|
|
105
124
|
}
|
|
125
|
+
prepareMessages(prompt, systemmsg, llm_config) {
|
|
126
|
+
const messages = [];
|
|
127
|
+
const enableCaching = llm_config?.enable_prompt_caching ?? false;
|
|
128
|
+
const cacheSystemPrompt = llm_config?.cache_system_prompt ?? true;
|
|
129
|
+
if (enableCaching && cacheSystemPrompt) {
|
|
130
|
+
messages.push({
|
|
131
|
+
role: 'system',
|
|
132
|
+
content: [
|
|
133
|
+
{
|
|
134
|
+
type: 'text',
|
|
135
|
+
text: systemmsg,
|
|
136
|
+
cache_control: { type: 'ephemeral' },
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
messages.push({ role: 'system', content: systemmsg });
|
|
143
|
+
}
|
|
144
|
+
messages.push({ role: 'user', content: prompt });
|
|
145
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
146
|
+
const { enable_prompt_caching, cache_system_prompt, ...apiConfig } = llm_config || {};
|
|
147
|
+
return { messages, apiConfig };
|
|
148
|
+
}
|
|
149
|
+
buildRequest(model, prompt, systemmsg, llm_config, stream) {
|
|
150
|
+
// TO-DO : this condition is a temporary workaround until all models support the /responses endpoint. We can remove this once all models are supported.
|
|
151
|
+
if (model.includes('codex')) {
|
|
152
|
+
const { max_tokens, temperature, top_p } = llm_config ?? {};
|
|
153
|
+
return {
|
|
154
|
+
endpoint: '/responses',
|
|
155
|
+
body: JSON.stringify({
|
|
156
|
+
model,
|
|
157
|
+
input: prompt,
|
|
158
|
+
instructions: systemmsg,
|
|
159
|
+
stream,
|
|
160
|
+
...(max_tokens !== undefined && { max_output_tokens: max_tokens }),
|
|
161
|
+
...(temperature !== undefined && { temperature }),
|
|
162
|
+
...(top_p !== undefined && { top_p }),
|
|
163
|
+
}),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const { messages, apiConfig } = this.prepareMessages(prompt, systemmsg, llm_config);
|
|
167
|
+
return {
|
|
168
|
+
endpoint: '/chat/completions',
|
|
169
|
+
body: JSON.stringify({ model, messages, stream, ...apiConfig }),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
106
172
|
async llm(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config) {
|
|
107
173
|
const log = this.log;
|
|
108
174
|
try {
|
|
109
|
-
const
|
|
175
|
+
const { endpoint, body } = this.buildRequest(model, prompt, systemmsg, llm_config, false);
|
|
176
|
+
const res = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, endpoint), {
|
|
110
177
|
method: 'POST',
|
|
111
178
|
headers: {
|
|
112
179
|
'Content-Type': 'application/json',
|
|
113
180
|
Authorization: `Bearer ${this.token}`,
|
|
181
|
+
...(this.appToken
|
|
182
|
+
? { 'X-App-Authorization': `Bearer ${this.appToken}` }
|
|
183
|
+
: {}),
|
|
114
184
|
},
|
|
115
|
-
body
|
|
116
|
-
model,
|
|
117
|
-
messages: [
|
|
118
|
-
{ role: 'system', content: systemmsg },
|
|
119
|
-
{ role: 'user', content: prompt },
|
|
120
|
-
],
|
|
121
|
-
...(llm_config || {}),
|
|
122
|
-
prompt_cache_key: model.includes('gpt-5')
|
|
123
|
-
? `cache_${model}_${Buffer.from(prompt).toString('base64')}`
|
|
124
|
-
: undefined,
|
|
125
|
-
prompt_cache_retention: model.includes('gpt-5') ? '24h' : undefined,
|
|
126
|
-
}),
|
|
185
|
+
body,
|
|
127
186
|
retries: 3,
|
|
128
187
|
retryOn: function (attempt, error, response) {
|
|
129
188
|
// retry on any network error, or 4xx or 5xx status codes
|
|
@@ -159,21 +218,17 @@ class PSAI {
|
|
|
159
218
|
async llmStream(prompt, model = 'o3-mini', systemmsg = 'You are a helpful assistant. Answer as concisely as possible.', llm_config) {
|
|
160
219
|
const log = this.log;
|
|
161
220
|
try {
|
|
162
|
-
const
|
|
221
|
+
const { endpoint, body } = this.buildRequest(model, prompt, systemmsg, llm_config, true);
|
|
222
|
+
const res = await fetch(apiEndpoints_1.API_ENDPOINTS.LLM_SERVICE(this.baseUrl, endpoint), {
|
|
163
223
|
method: 'POST',
|
|
164
224
|
headers: {
|
|
165
225
|
'Content-Type': 'application/json',
|
|
166
226
|
Authorization: `Bearer ${this.token}`,
|
|
227
|
+
...(this.appToken
|
|
228
|
+
? { 'X-App-Authorization': `Bearer ${this.appToken}` }
|
|
229
|
+
: {}),
|
|
167
230
|
},
|
|
168
|
-
body
|
|
169
|
-
model,
|
|
170
|
-
messages: [
|
|
171
|
-
{ role: 'system', content: systemmsg },
|
|
172
|
-
{ role: 'user', content: prompt },
|
|
173
|
-
],
|
|
174
|
-
stream: true,
|
|
175
|
-
...(llm_config || {}),
|
|
176
|
-
}),
|
|
231
|
+
body,
|
|
177
232
|
retries: 3,
|
|
178
233
|
retryOn: function (attempt, error, response) {
|
|
179
234
|
// retry on any network error, or 4xx or 5xx status codes
|
|
@@ -217,53 +272,39 @@ class PSAI {
|
|
|
217
272
|
throw new Error('Missing required environment variables for service token retrieval');
|
|
218
273
|
}
|
|
219
274
|
const currentTime = new Date();
|
|
220
|
-
|
|
221
|
-
if (existingToken &&
|
|
222
|
-
existingToken.
|
|
223
|
-
existingToken.service_expires.getTime() >
|
|
224
|
-
currentTime.getTime() + 20 * 60000) {
|
|
275
|
+
const twentyMinutesFromNow = currentTime.getTime() + 20 * 60000;
|
|
276
|
+
if (existingToken.service_token &&
|
|
277
|
+
existingToken.service_expires.getTime() > twentyMinutesFromNow) {
|
|
225
278
|
return existingToken.service_token;
|
|
226
279
|
}
|
|
227
|
-
const
|
|
228
|
-
if (existingToken
|
|
280
|
+
const basicAuthToken = Buffer.from(`${clientid}:${clientsecret}`).toString('base64');
|
|
281
|
+
if (existingToken.expires > currentTime) {
|
|
229
282
|
dlog.debug(`Found existing refresh token: ${existingToken.refresh_token}`);
|
|
230
|
-
const
|
|
283
|
+
const response = await fetch(apiEndpoints_1.API_ENDPOINTS.AUTH_SERVICE(baseurl, '/refreshtoken', '?client=machine'), {
|
|
231
284
|
headers: {
|
|
232
|
-
Authorization: `Basic ${
|
|
285
|
+
Authorization: `Basic ${basicAuthToken}`,
|
|
233
286
|
'app-key': appkey || '',
|
|
234
287
|
rt: existingToken.refresh_token || '',
|
|
235
288
|
},
|
|
236
289
|
});
|
|
237
|
-
if (
|
|
238
|
-
const { accessToken, refreshToken } = (await
|
|
239
|
-
|
|
240
|
-
const rpayload = jwt_1.JwtUtils.decode(refreshToken);
|
|
241
|
-
existingToken.service_token = accessToken;
|
|
242
|
-
existingToken.refresh_token = refreshToken;
|
|
243
|
-
existingToken.expires = new Date(rpayload?.exp * 1000);
|
|
244
|
-
existingToken.service_expires = new Date(spayload?.exp * 1000);
|
|
290
|
+
if (response.ok) {
|
|
291
|
+
const { accessToken, refreshToken } = (await response.json());
|
|
292
|
+
updateExistingToken(accessToken, refreshToken);
|
|
245
293
|
dlog.debug(`Refreshed service token: expires at ${existingToken.service_expires}`);
|
|
246
294
|
return accessToken;
|
|
247
295
|
}
|
|
248
|
-
|
|
249
|
-
dlog.debug(`Failed to refresh service token, status: ${tres.status}`);
|
|
250
|
-
}
|
|
296
|
+
dlog.debug(`Failed to refresh service token, status: ${response.status}`);
|
|
251
297
|
}
|
|
252
|
-
const
|
|
298
|
+
const response = await fetch(apiEndpoints_1.API_ENDPOINTS.AUTH_SERVICE(baseurl, '/login', '?client=machine&source=custom'), {
|
|
253
299
|
headers: {
|
|
254
|
-
Authorization: `Basic ${
|
|
300
|
+
Authorization: `Basic ${basicAuthToken}`,
|
|
255
301
|
'app-key': appkey || '',
|
|
256
302
|
},
|
|
257
303
|
});
|
|
258
|
-
const { serviceToken, refreshToken } = (await
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
dlog.debug(`
|
|
262
|
-
dlog.debug(`refresh token expires: ${JSON.stringify(new Date(rpayload?.exp * 1000))}`);
|
|
263
|
-
existingToken.service_token = serviceToken;
|
|
264
|
-
existingToken.refresh_token = refreshToken;
|
|
265
|
-
existingToken.expires = new Date(rpayload?.exp * 1000);
|
|
266
|
-
existingToken.service_expires = new Date(spayload?.exp * 1000);
|
|
304
|
+
const { serviceToken, refreshToken } = (await response.json());
|
|
305
|
+
updateExistingToken(serviceToken, refreshToken);
|
|
306
|
+
dlog.debug(`service token expires: ${existingToken.service_expires}`);
|
|
307
|
+
dlog.debug(`refresh token expires: ${existingToken.expires}`);
|
|
267
308
|
return serviceToken;
|
|
268
309
|
}
|
|
269
310
|
/**
|
|
@@ -311,18 +352,18 @@ class PSAI {
|
|
|
311
352
|
.send('Authentication successful! You can close this window.');
|
|
312
353
|
});
|
|
313
354
|
router.get('/login', async (_req, res) => {
|
|
314
|
-
const
|
|
315
|
-
const loginUrl = `${baseurl}/api/v2/auth/login?client=desktop&redirect_url=${
|
|
316
|
-
const
|
|
355
|
+
const redirectUrl = encodeURIComponent('http://localhost:3133/callback');
|
|
356
|
+
const loginUrl = `${baseurl}/api/v2/auth/login?client=desktop&redirect_url=${redirectUrl}`;
|
|
357
|
+
const loginResponse = await fetch(loginUrl, {
|
|
317
358
|
headers: { 'app-key': appkey || '' },
|
|
318
359
|
});
|
|
319
|
-
if (
|
|
320
|
-
dlog.error(`Failed to initiate login: ${
|
|
321
|
-
callBackError = `Failed to initiate login: ${
|
|
360
|
+
if (loginResponse.status >= 400) {
|
|
361
|
+
dlog.error(`Failed to initiate login: ${loginResponse.status} ${loginResponse.statusText}`);
|
|
362
|
+
callBackError = `Failed to initiate login: ${loginResponse.status} ${loginResponse.statusText}`;
|
|
322
363
|
isCallbackFinished = true;
|
|
323
364
|
return res.status(500).send('Failed to initiate login');
|
|
324
365
|
}
|
|
325
|
-
const data =
|
|
366
|
+
const data = loginResponse.body;
|
|
326
367
|
if (!data) {
|
|
327
368
|
dlog.error('No response body from login initiation');
|
|
328
369
|
callBackError = 'No response body from login initiation';
|
|
@@ -331,14 +372,14 @@ class PSAI {
|
|
|
331
372
|
}
|
|
332
373
|
const reader = data.getReader();
|
|
333
374
|
const decoder = new TextDecoder('utf-8');
|
|
334
|
-
let
|
|
375
|
+
let responseText = '';
|
|
335
376
|
while (true) {
|
|
336
377
|
const { done, value } = await reader.read();
|
|
337
378
|
if (done)
|
|
338
379
|
break;
|
|
339
|
-
|
|
380
|
+
responseText += decoder.decode(value);
|
|
340
381
|
}
|
|
341
|
-
if (!
|
|
382
|
+
if (!responseText) {
|
|
342
383
|
dlog.error('Empty response body from login initiation');
|
|
343
384
|
callBackError = 'Empty response body from login initiation';
|
|
344
385
|
isCallbackFinished = true;
|
|
@@ -347,7 +388,7 @@ class PSAI {
|
|
|
347
388
|
.send('Empty response body from login initiation');
|
|
348
389
|
}
|
|
349
390
|
dlog.debug('Redirecting to authentication provider');
|
|
350
|
-
return res.redirect(
|
|
391
|
+
return res.redirect(responseText);
|
|
351
392
|
});
|
|
352
393
|
app.use('', router);
|
|
353
394
|
app
|
|
@@ -421,12 +462,11 @@ class PSAI {
|
|
|
421
462
|
const model = req.params.modelid || 'o3-mini';
|
|
422
463
|
try {
|
|
423
464
|
let apiurl = baseapiurl || process.env.PS_API_URL;
|
|
424
|
-
//remove trailing slash
|
|
425
465
|
if (apiurl?.endsWith('/')) {
|
|
426
466
|
apiurl = apiurl.slice(0, -1);
|
|
427
467
|
}
|
|
428
468
|
log.debug(`Proxying ${model} to ${apiurl}`);
|
|
429
|
-
const
|
|
469
|
+
const proxyResponse = await fetch(`${apiurl}/api/v1/llm/chat/completions`, {
|
|
430
470
|
method: 'POST',
|
|
431
471
|
mode: 'no-cors',
|
|
432
472
|
headers: callheaders,
|
|
@@ -435,20 +475,14 @@ class PSAI {
|
|
|
435
475
|
...req.body,
|
|
436
476
|
}),
|
|
437
477
|
});
|
|
438
|
-
|
|
439
|
-
// const data = await lres.json();
|
|
440
|
-
// log.error(`LLM proxy error: ${lres.status} ${lres.statusText}`, data);
|
|
441
|
-
// return res.status(lres.status).json(data);
|
|
442
|
-
// }
|
|
443
|
-
//pipe the lres response to res
|
|
444
|
-
const data = lres.body;
|
|
478
|
+
const data = proxyResponse.body;
|
|
445
479
|
if (!data) {
|
|
446
480
|
log.error('No response body from LLM proxy');
|
|
447
481
|
return res
|
|
448
482
|
.status(500)
|
|
449
483
|
.json({ error: 'No response body from LLM proxy' });
|
|
450
484
|
}
|
|
451
|
-
res.status(
|
|
485
|
+
res.status(proxyResponse.status);
|
|
452
486
|
const reader = data.getReader();
|
|
453
487
|
const decoder = new TextDecoder('utf-8');
|
|
454
488
|
while (true) {
|
|
@@ -470,4 +504,4 @@ class PSAI {
|
|
|
470
504
|
}
|
|
471
505
|
}
|
|
472
506
|
exports.PSAI = PSAI;
|
|
473
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvUFNBSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsb0VBQW9FO0FBQ3BFLHVFQUF1RTtBQUN2RSxzREFBcUQ7QUFDckQsOERBQXFDO0FBRXJDLG1EQUErRDtBQUMvRCwrQkFBK0M7QUFDL0MsdURBQXFEO0FBQ3JELHNFQUE4QztBQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZDLE1BQU0sSUFBSSxHQUFHLElBQUEscUJBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUVsQyxNQUFNLGFBQWEsR0FLZjtJQUNGLGFBQWEsRUFBRSxJQUFJO0lBQ25CLGFBQWEsRUFBRSxJQUFJO0lBQ25CLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEIsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztDQUM3QixDQUFDO0FBRUYsZ0VBQWdFO0FBQ2hFLE1BQWEsSUFBSTtJQUNFLEtBQUssQ0FBUztJQUN2QixVQUFVLENBQVM7SUFDVixPQUFPLENBQVM7SUFDaEIsR0FBRyxDQUFnQjtJQUNuQixRQUFRLENBQVU7SUFFbkMsWUFBWSxLQUFhLEVBQUUsT0FBZ0IsRUFBRSxHQUFtQjtRQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQywwREFBMEQ7UUFDbEYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFH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
|
|
507
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUFNBSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvUFNBSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsb0VBQW9FO0FBQ3BFLHVFQUF1RTtBQUN2RSxzREFBcUQ7QUFDckQsOERBQXFDO0FBRXJDLG1EQUErRDtBQUMvRCwrQkFBK0M7QUFDL0MsdURBQXFEO0FBQ3JELHNFQUE4QztBQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZDLE1BQU0sSUFBSSxHQUFHLElBQUEscUJBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUVsQyxNQUFNLGFBQWEsR0FLZjtJQUNGLGFBQWEsRUFBRSxJQUFJO0lBQ25CLGFBQWEsRUFBRSxJQUFJO0lBQ25CLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEIsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztDQUM3QixDQUFDO0FBRUYsU0FBUyxtQkFBbUIsQ0FBQyxXQUFtQixFQUFFLFlBQW9CO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLGNBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFpQixDQUFDO0lBQ25FLE1BQU0sY0FBYyxHQUFHLGNBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFpQixDQUFDO0lBQ3JFLGFBQWEsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBQzFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO0lBQzNDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3RCxhQUFhLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELGdFQUFnRTtB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
|
|
@@ -17,6 +17,9 @@ export interface PSAgentConfig {
|
|
|
17
17
|
temperature?: number;
|
|
18
18
|
top_p?: number;
|
|
19
19
|
verbosity?: 'low' | 'medium' | 'high';
|
|
20
|
+
enable_prompt_caching?: boolean;
|
|
21
|
+
cache_system_prompt?: boolean;
|
|
22
|
+
cache_breakpoints?: number[];
|
|
20
23
|
} & Record<string, any>;
|
|
21
24
|
input_schema?: z.core.JSONSchema.BaseSchema;
|
|
22
25
|
output_schema?: z.core.JSONSchema.BaseSchema;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent loop that works with AgentMessage throughout.
|
|
3
|
+
* Transforms to Message[] only at the LLM call boundary.
|
|
4
|
+
*/
|
|
5
|
+
import { EventStream } from "@earendil-works/pi-ai";
|
|
6
|
+
import type { AgentContext, AgentEvent, AgentLoopConfig, AgentMessage, StreamFn } from "./types.js";
|
|
7
|
+
export type AgentEventSink = (event: AgentEvent) => Promise<void> | void;
|
|
8
|
+
/**
|
|
9
|
+
* Start an agent loop with a new prompt message.
|
|
10
|
+
* The prompt is added to the context and events are emitted for it.
|
|
11
|
+
*/
|
|
12
|
+
export declare function agentLoop(prompts: AgentMessage[], context: AgentContext, config: AgentLoopConfig, signal?: AbortSignal, streamFn?: StreamFn): EventStream<AgentEvent, AgentMessage[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Continue an agent loop from the current context without adding a new message.
|
|
15
|
+
* Used for retries - context already has user message or tool results.
|
|
16
|
+
*
|
|
17
|
+
* **Important:** The last message in context must convert to a `user` or `toolResult` message
|
|
18
|
+
* via `convertToLlm`. If it doesn't, the LLM provider will reject the request.
|
|
19
|
+
* This cannot be validated here since `convertToLlm` is only called once per turn.
|
|
20
|
+
*/
|
|
21
|
+
export declare function agentLoopContinue(context: AgentContext, config: AgentLoopConfig, signal?: AbortSignal, streamFn?: StreamFn): EventStream<AgentEvent, AgentMessage[]>;
|
|
22
|
+
export declare function runAgentLoop(prompts: AgentMessage[], context: AgentContext, config: AgentLoopConfig, emit: AgentEventSink, signal?: AbortSignal, streamFn?: StreamFn): Promise<AgentMessage[]>;
|
|
23
|
+
export declare function runAgentLoopContinue(context: AgentContext, config: AgentLoopConfig, emit: AgentEventSink, signal?: AbortSignal, streamFn?: StreamFn): Promise<AgentMessage[]>;
|