@saccolabs/tars 1.31.0 โ 1.32.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/README.md +13 -11
- package/context/skills/create-extension/SKILL.md +2 -2
- package/context/skills/manage-extensions/SKILL.md +3 -3
- package/dist/channels/discord/discord-channel.d.ts +4 -0
- package/dist/channels/discord/discord-channel.js +21 -3
- package/dist/channels/discord/discord-channel.js.map +1 -1
- package/dist/channels/discord/message-formatter.d.ts +1 -1
- package/dist/channels/discord/message-formatter.js +1 -1
- package/dist/cli/commands/quota.js +13 -48
- package/dist/cli/commands/quota.js.map +1 -1
- package/dist/cli/commands/refresh.js +40 -3
- package/dist/cli/commands/refresh.js.map +1 -1
- package/dist/cli/commands/setup.js +192 -467
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +3 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config.d.ts +5 -10
- package/dist/config/config.js +21 -27
- package/dist/config/config.js.map +1 -1
- package/dist/memory/knowledge-store.js +10 -1
- package/dist/memory/knowledge-store.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +0 -3
- package/dist/memory/memory-manager.js +26 -34
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/scripts/debug-cli.js +2 -2
- package/dist/scripts/debug-cli.js.map +1 -1
- package/dist/supervisor/heartbeat-service.js +1 -1
- package/dist/supervisor/heartbeat-service.js.map +1 -1
- package/dist/supervisor/main.js +37 -79
- package/dist/supervisor/main.js.map +1 -1
- package/dist/supervisor/mcp-bridge.d.ts +25 -0
- package/dist/supervisor/mcp-bridge.js +157 -0
- package/dist/supervisor/mcp-bridge.js.map +1 -0
- package/dist/supervisor/session-manager.d.ts +1 -1
- package/dist/supervisor/session-manager.js +1 -1
- package/dist/supervisor/supervisor.d.ts +14 -7
- package/dist/supervisor/supervisor.js +87 -29
- package/dist/supervisor/supervisor.js.map +1 -1
- package/dist/supervisor/{gemini-engine.d.ts โ tars-engine.d.ts} +38 -33
- package/dist/supervisor/tars-engine.js +698 -0
- package/dist/supervisor/tars-engine.js.map +1 -0
- package/dist/tools/get-quota.d.ts +38 -12
- package/dist/tools/get-quota.js +37 -94
- package/dist/tools/get-quota.js.map +1 -1
- package/dist/tools/send-notification.d.ts +32 -7
- package/dist/tools/send-notification.js +31 -37
- package/dist/tools/send-notification.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/utils/brain-audit.js +4 -4
- package/dist/utils/brain-audit.js.map +1 -1
- package/dist/utils/migration-manager.d.ts +4 -0
- package/dist/utils/migration-manager.js +205 -0
- package/dist/utils/migration-manager.js.map +1 -0
- package/extensions/memory/dist/store.js +29 -20
- package/extensions/memory/dist/store.js.map +1 -1
- package/extensions/memory/src/store.ts +33 -23
- package/package.json +4 -3
- package/src/prompts/system.md +3 -14
- package/context/agents/scaffolder.md +0 -22
- package/dist/auth/credential-manager.d.ts +0 -14
- package/dist/auth/credential-manager.js +0 -60
- package/dist/auth/credential-manager.js.map +0 -1
- package/dist/auth/oauth-service.d.ts +0 -24
- package/dist/auth/oauth-service.js +0 -89
- package/dist/auth/oauth-service.js.map +0 -1
- package/dist/auth/workspace-auth-service.d.ts +0 -10
- package/dist/auth/workspace-auth-service.js +0 -78
- package/dist/auth/workspace-auth-service.js.map +0 -1
- package/dist/cli/commands/swarm.d.ts +0 -13
- package/dist/cli/commands/swarm.js +0 -250
- package/dist/cli/commands/swarm.js.map +0 -1
- package/dist/inference/LlamaCppGenerator.d.ts +0 -25
- package/dist/inference/LlamaCppGenerator.js +0 -461
- package/dist/inference/LlamaCppGenerator.js.map +0 -1
- package/dist/scripts/test-local-llamacpp.d.ts +0 -1
- package/dist/scripts/test-local-llamacpp.js +0 -77
- package/dist/scripts/test-local-llamacpp.js.map +0 -1
- package/dist/supervisor/gemini-engine.js +0 -1056
- package/dist/supervisor/gemini-engine.js.map +0 -1
- package/dist/swarm/agent-card.d.ts +0 -14
- package/dist/swarm/agent-card.js +0 -93
- package/dist/swarm/agent-card.js.map +0 -1
- package/dist/swarm/rpc-handler.d.ts +0 -27
- package/dist/swarm/rpc-handler.js +0 -235
- package/dist/swarm/rpc-handler.js.map +0 -1
- package/dist/swarm/swarm-service.d.ts +0 -47
- package/dist/swarm/swarm-service.js +0 -207
- package/dist/swarm/swarm-service.js.map +0 -1
- package/dist/swarm/types.d.ts +0 -109
- package/dist/swarm/types.js +0 -15
- package/dist/swarm/types.js.map +0 -1
- /package/extensions/memory/{gemini-extension.json โ tars-extension.json} +0 -0
- /package/extensions/tasks/{gemini-extension.json โ tars-extension.json} +0 -0
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
import logger from '../utils/logger.js';
|
|
2
|
-
/**
|
|
3
|
-
* LlamaCppGenerator - Implementation of ContentGenerator for local inference backends (llamacpp, etc.)
|
|
4
|
-
* that provide an OpenAI-compatible API.
|
|
5
|
-
*/
|
|
6
|
-
export class LlamaCppGenerator {
|
|
7
|
-
baseUrl;
|
|
8
|
-
constructor(baseUrl = 'http://localhost:8080') {
|
|
9
|
-
this.baseUrl = baseUrl;
|
|
10
|
-
}
|
|
11
|
-
resolveEndpoint() {
|
|
12
|
-
let endpoint = this.baseUrl.replace(/\/$/, '');
|
|
13
|
-
if (!endpoint.endsWith('/chat/completions')) {
|
|
14
|
-
if (!endpoint.endsWith('/v1')) {
|
|
15
|
-
endpoint += '/v1';
|
|
16
|
-
}
|
|
17
|
-
endpoint += '/chat/completions';
|
|
18
|
-
}
|
|
19
|
-
return endpoint;
|
|
20
|
-
}
|
|
21
|
-
async generateContent(request, userPromptId) {
|
|
22
|
-
logger.debug(`[LlamaCppGenerator] Generating content for model: ${request.model}`);
|
|
23
|
-
const openAiRequest = this.mapToOpenAi(request);
|
|
24
|
-
try {
|
|
25
|
-
const response = await fetch(this.resolveEndpoint(), {
|
|
26
|
-
method: 'POST',
|
|
27
|
-
headers: {
|
|
28
|
-
'Content-Type': 'application/json'
|
|
29
|
-
},
|
|
30
|
-
body: JSON.stringify(openAiRequest),
|
|
31
|
-
signal: request.config?.abortSignal
|
|
32
|
-
});
|
|
33
|
-
if (!response.ok) {
|
|
34
|
-
const error = await response.text();
|
|
35
|
-
throw new Error(`Local inference failed: ${response.status} ${error}`);
|
|
36
|
-
}
|
|
37
|
-
const data = (await response.json());
|
|
38
|
-
return this.mapFromOpenAi(data);
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
logger.error(`[LlamaCppGenerator] API Error: ${error.message}`);
|
|
42
|
-
throw error;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
async generateContentStream(request, userPromptId) {
|
|
46
|
-
const openAiRequest = {
|
|
47
|
-
...this.mapToOpenAi(request),
|
|
48
|
-
stream: true,
|
|
49
|
-
stream_options: { include_usage: true }
|
|
50
|
-
};
|
|
51
|
-
const self = this;
|
|
52
|
-
async function* streamGenerator() {
|
|
53
|
-
const pendingToolCalls = new Map();
|
|
54
|
-
const streamState = { isThinking: false };
|
|
55
|
-
// OpenAI SSE protocol sends usage in a separate final chunk with choices=[]
|
|
56
|
-
// and no finishReason. Gemini's turn.js only yields a Finished event when
|
|
57
|
-
// finishReason is present, so we must defer usage and attach it to the
|
|
58
|
-
// finishReason chunk. This variable accumulates the latest usage seen.
|
|
59
|
-
let deferredUsage = null;
|
|
60
|
-
try {
|
|
61
|
-
const response = await fetch(self.resolveEndpoint(), {
|
|
62
|
-
method: 'POST',
|
|
63
|
-
headers: {
|
|
64
|
-
'Content-Type': 'application/json'
|
|
65
|
-
},
|
|
66
|
-
body: JSON.stringify(openAiRequest),
|
|
67
|
-
signal: request.config?.abortSignal
|
|
68
|
-
});
|
|
69
|
-
if (!response.ok) {
|
|
70
|
-
const error = await response.text();
|
|
71
|
-
throw new Error(`Local inference failed: ${response.status} ${error}`);
|
|
72
|
-
}
|
|
73
|
-
if (!response.body) {
|
|
74
|
-
throw new Error('Response body is empty');
|
|
75
|
-
}
|
|
76
|
-
const reader = response.body.getReader();
|
|
77
|
-
const decoder = new TextDecoder();
|
|
78
|
-
let buffer = '';
|
|
79
|
-
while (true) {
|
|
80
|
-
const { done, value } = await reader.read();
|
|
81
|
-
if (done)
|
|
82
|
-
break;
|
|
83
|
-
buffer += decoder.decode(value, { stream: true });
|
|
84
|
-
const lines = buffer.split('\n');
|
|
85
|
-
buffer = lines.pop() || '';
|
|
86
|
-
for (const line of lines) {
|
|
87
|
-
const cleanLine = line.trim();
|
|
88
|
-
if (!cleanLine || cleanLine === 'data: [DONE]')
|
|
89
|
-
continue;
|
|
90
|
-
if (cleanLine.startsWith('data: ')) {
|
|
91
|
-
try {
|
|
92
|
-
const data = JSON.parse(cleanLine.slice(6));
|
|
93
|
-
const choice = data.choices && data.choices[0];
|
|
94
|
-
// Capture usage from any chunk that carries it (including
|
|
95
|
-
// the usage-only final chunk with choices=[]).
|
|
96
|
-
if (data.usage || data.timings) {
|
|
97
|
-
deferredUsage = {
|
|
98
|
-
prompt_tokens: data.usage?.prompt_tokens ?? data.timings?.prompt_n,
|
|
99
|
-
completion_tokens: data.usage?.completion_tokens ??
|
|
100
|
-
data.timings?.predicted_n,
|
|
101
|
-
total_tokens: data.usage?.total_tokens
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
// 1. Aggregate partial tool calls from OpenAI stream format
|
|
105
|
-
if (choice && choice.delta && choice.delta.tool_calls) {
|
|
106
|
-
for (const tc of choice.delta.tool_calls) {
|
|
107
|
-
let pending = pendingToolCalls.get(tc.index);
|
|
108
|
-
if (!pending) {
|
|
109
|
-
pending = {
|
|
110
|
-
id: tc.id || '',
|
|
111
|
-
name: tc.function?.name || '',
|
|
112
|
-
arguments: ''
|
|
113
|
-
};
|
|
114
|
-
pendingToolCalls.set(tc.index, pending);
|
|
115
|
-
}
|
|
116
|
-
if (tc.id) {
|
|
117
|
-
pending.id = tc.id;
|
|
118
|
-
}
|
|
119
|
-
if (tc.function?.arguments) {
|
|
120
|
-
pending.arguments += tc.function.arguments;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// Strip partial tool calls so we don't accidentally parse/yield them yet
|
|
124
|
-
delete choice.delta.tool_calls;
|
|
125
|
-
}
|
|
126
|
-
// 2. When the turn finishes, inject fully assembled tool calls
|
|
127
|
-
// AND attach any deferred usage so it reaches turn.js Finished event
|
|
128
|
-
if (choice && choice.finish_reason) {
|
|
129
|
-
if (pendingToolCalls.size > 0) {
|
|
130
|
-
const assembled = Array.from(pendingToolCalls.entries()).map(([_, tc]) => ({
|
|
131
|
-
id: tc.id,
|
|
132
|
-
index: _,
|
|
133
|
-
function: {
|
|
134
|
-
name: tc.name,
|
|
135
|
-
arguments: tc.arguments
|
|
136
|
-
}
|
|
137
|
-
}));
|
|
138
|
-
choice.delta.tool_calls = assembled;
|
|
139
|
-
pendingToolCalls.clear();
|
|
140
|
-
}
|
|
141
|
-
// Inject deferred usage into this finishReason chunk
|
|
142
|
-
if (deferredUsage && !data.usage) {
|
|
143
|
-
data.usage = deferredUsage;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const mapped = self.mapFromOpenAiStream(data, streamState);
|
|
147
|
-
if (mapped) {
|
|
148
|
-
yield mapped;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
catch (e) {
|
|
152
|
-
// Ignore unparseable SSE lines
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// Cleanup in case stream ended without finish_reason
|
|
158
|
-
if (pendingToolCalls.size > 0) {
|
|
159
|
-
const finalData = {
|
|
160
|
-
choices: [
|
|
161
|
-
{
|
|
162
|
-
delta: {
|
|
163
|
-
tool_calls: Array.from(pendingToolCalls.entries()).map(([_, tc]) => ({
|
|
164
|
-
function: { name: tc.name, arguments: tc.arguments }
|
|
165
|
-
}))
|
|
166
|
-
},
|
|
167
|
-
finish_reason: 'tool_calls'
|
|
168
|
-
}
|
|
169
|
-
],
|
|
170
|
-
usage: deferredUsage || undefined
|
|
171
|
-
};
|
|
172
|
-
const mapped = self.mapFromOpenAiStream(finalData, streamState);
|
|
173
|
-
if (mapped)
|
|
174
|
-
yield mapped;
|
|
175
|
-
pendingToolCalls.clear();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
catch (error) {
|
|
179
|
-
logger.error(`[LlamaCppGenerator] Stream Error: ${error.message}`);
|
|
180
|
-
throw error;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return streamGenerator();
|
|
184
|
-
}
|
|
185
|
-
async countTokens(request) {
|
|
186
|
-
// Simple character-based estimation if local backend doesn't support token counting
|
|
187
|
-
let text = '';
|
|
188
|
-
if (typeof request.contents === 'string') {
|
|
189
|
-
text = request.contents;
|
|
190
|
-
}
|
|
191
|
-
else if (Array.isArray(request.contents)) {
|
|
192
|
-
text = request.contents
|
|
193
|
-
.map((c) => c.parts?.map((p) => p.text || '').join(''))
|
|
194
|
-
.join('');
|
|
195
|
-
}
|
|
196
|
-
return {
|
|
197
|
-
totalTokens: Math.ceil(text.length / 4)
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
async embedContent(request) {
|
|
201
|
-
throw new Error('Embeddings not yet supported for LlamaCppGenerator');
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Maps Gemini parameters to OpenAI Chat Completion format.
|
|
205
|
-
*/
|
|
206
|
-
mapToOpenAi(request) {
|
|
207
|
-
const contents = Array.isArray(request.contents)
|
|
208
|
-
? request.contents
|
|
209
|
-
: [{ role: 'user', parts: [{ text: request.contents }] }];
|
|
210
|
-
const messages = contents.flatMap((content) => {
|
|
211
|
-
const role = content.role === 'model' ? 'assistant' : content.role || 'user';
|
|
212
|
-
// Map parts to content
|
|
213
|
-
let messageContent;
|
|
214
|
-
const hasImages = content.parts?.some((p) => p.inlineData);
|
|
215
|
-
if (hasImages) {
|
|
216
|
-
messageContent = content.parts
|
|
217
|
-
?.map((p) => {
|
|
218
|
-
if (p.text) {
|
|
219
|
-
return { type: 'text', text: p.text };
|
|
220
|
-
}
|
|
221
|
-
if (p.inlineData) {
|
|
222
|
-
return {
|
|
223
|
-
type: 'image_url',
|
|
224
|
-
image_url: {
|
|
225
|
-
url: `data:${p.inlineData.mimeType};base64,${p.inlineData.data}`
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
})
|
|
230
|
-
.filter(Boolean);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
const textParts = content.parts?.filter((p) => p.text).map((p) => p.text);
|
|
234
|
-
if (textParts && textParts.length > 0) {
|
|
235
|
-
messageContent = textParts.join('\n');
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Handle tool calls/responses
|
|
239
|
-
const toolCalls = content.parts
|
|
240
|
-
?.filter((p) => p.functionCall)
|
|
241
|
-
.map((p) => ({
|
|
242
|
-
id: p.functionCall?.id ||
|
|
243
|
-
p.callId ||
|
|
244
|
-
'call_' + Math.random().toString(36).slice(2),
|
|
245
|
-
type: 'function',
|
|
246
|
-
function: {
|
|
247
|
-
name: p.functionCall.name,
|
|
248
|
-
arguments: JSON.stringify(p.functionCall.args)
|
|
249
|
-
}
|
|
250
|
-
}));
|
|
251
|
-
const toolOutputs = content.parts
|
|
252
|
-
?.filter((p) => p.functionResponse)
|
|
253
|
-
.map((p) => ({
|
|
254
|
-
tool_call_id: p.functionResponse?.id || p.callId || p.id,
|
|
255
|
-
role: 'tool',
|
|
256
|
-
name: p.functionResponse.name,
|
|
257
|
-
content: JSON.stringify(p.functionResponse.response)
|
|
258
|
-
}));
|
|
259
|
-
if (toolOutputs && toolOutputs.length > 0) {
|
|
260
|
-
return toolOutputs;
|
|
261
|
-
}
|
|
262
|
-
return [
|
|
263
|
-
{
|
|
264
|
-
role,
|
|
265
|
-
content: messageContent,
|
|
266
|
-
...(toolCalls && toolCalls.length > 0 ? { tool_calls: toolCalls } : {})
|
|
267
|
-
}
|
|
268
|
-
];
|
|
269
|
-
});
|
|
270
|
-
// Add system instruction if present
|
|
271
|
-
if (request.config?.systemInstruction) {
|
|
272
|
-
const sysInstr = typeof request.config.systemInstruction === 'string'
|
|
273
|
-
? request.config.systemInstruction
|
|
274
|
-
: request.config.systemInstruction.parts?.[0]?.text;
|
|
275
|
-
if (sysInstr) {
|
|
276
|
-
messages.unshift({ role: 'system', content: sysInstr });
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
// Map tools
|
|
280
|
-
const tools = request.config?.tools?.flatMap((t) => t.functionDeclarations?.map((fd) => ({
|
|
281
|
-
type: 'function',
|
|
282
|
-
function: {
|
|
283
|
-
name: fd.name,
|
|
284
|
-
description: fd.description,
|
|
285
|
-
parameters: fd.parameters
|
|
286
|
-
}
|
|
287
|
-
})));
|
|
288
|
-
return {
|
|
289
|
-
model: request.model,
|
|
290
|
-
messages,
|
|
291
|
-
tools: tools && tools.length > 0 ? tools : undefined,
|
|
292
|
-
temperature: request.config?.temperature ?? 0.7,
|
|
293
|
-
max_tokens: request.config?.maxOutputTokens
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Maps OpenAI response to Gemini GenerateContentResponse format.
|
|
298
|
-
*/
|
|
299
|
-
mapFromOpenAi(data) {
|
|
300
|
-
const choice = data.choices[0];
|
|
301
|
-
const message = choice.message;
|
|
302
|
-
const parts = [];
|
|
303
|
-
if (message.content) {
|
|
304
|
-
parts.push({ text: message.content });
|
|
305
|
-
}
|
|
306
|
-
if (message.tool_calls) {
|
|
307
|
-
for (const tc of message.tool_calls) {
|
|
308
|
-
parts.push({
|
|
309
|
-
functionCall: {
|
|
310
|
-
name: tc.function.name,
|
|
311
|
-
args: JSON.parse(tc.function.arguments)
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
const functionCalls = parts.filter((p) => p.functionCall).map((p) => p.functionCall);
|
|
317
|
-
return {
|
|
318
|
-
functionCalls: functionCalls.length > 0 ? functionCalls : undefined,
|
|
319
|
-
candidates: [
|
|
320
|
-
{
|
|
321
|
-
content: {
|
|
322
|
-
role: 'model',
|
|
323
|
-
parts
|
|
324
|
-
},
|
|
325
|
-
finishReason: this.mapFinishReason(choice.finish_reason || choice.finishReason)
|
|
326
|
-
}
|
|
327
|
-
],
|
|
328
|
-
usageMetadata: {
|
|
329
|
-
promptTokenCount: data.usage?.prompt_tokens,
|
|
330
|
-
candidatesTokenCount: data.usage?.completion_tokens,
|
|
331
|
-
totalTokenCount: data.usage?.total_tokens
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
mapFromOpenAiStream(data, state) {
|
|
336
|
-
const choice = data.choices && data.choices.length > 0 ? data.choices[0] : null;
|
|
337
|
-
// If no choice and no usage info, skip
|
|
338
|
-
if (!choice && !data.usage && !data.timings)
|
|
339
|
-
return null;
|
|
340
|
-
const delta = choice?.delta || {};
|
|
341
|
-
const parts = [];
|
|
342
|
-
if (delta.reasoning_content || delta.thinking) {
|
|
343
|
-
// Processing reasoning content without noisy per-token logging
|
|
344
|
-
}
|
|
345
|
-
if (delta.content) {
|
|
346
|
-
let textSnippet = delta.content;
|
|
347
|
-
if (state.isThinking) {
|
|
348
|
-
const endTagIndex = textSnippet.indexOf('</think>');
|
|
349
|
-
if (endTagIndex !== -1) {
|
|
350
|
-
state.isThinking = false;
|
|
351
|
-
textSnippet = textSnippet.substring(endTagIndex + 8);
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
textSnippet = '';
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
const startTagIndex = textSnippet.indexOf('<think>');
|
|
359
|
-
if (startTagIndex !== -1) {
|
|
360
|
-
state.isThinking = true;
|
|
361
|
-
// Check if it ends in the same snippet
|
|
362
|
-
const endTagIndex = textSnippet.indexOf('</think>');
|
|
363
|
-
if (endTagIndex !== -1) {
|
|
364
|
-
state.isThinking = false;
|
|
365
|
-
textSnippet =
|
|
366
|
-
textSnippet.substring(0, startTagIndex) +
|
|
367
|
-
textSnippet.substring(endTagIndex + 8);
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
textSnippet = textSnippet.substring(0, startTagIndex);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
if (textSnippet) {
|
|
375
|
-
parts.push({ text: textSnippet });
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
if (delta.tool_calls) {
|
|
379
|
-
for (const tc of delta.tool_calls) {
|
|
380
|
-
if (tc.function) {
|
|
381
|
-
try {
|
|
382
|
-
const parsedArgs = tc.function.arguments
|
|
383
|
-
? JSON.parse(tc.function.arguments)
|
|
384
|
-
: {};
|
|
385
|
-
parts.push({
|
|
386
|
-
functionCall: {
|
|
387
|
-
name: tc.function.name,
|
|
388
|
-
args: parsedArgs,
|
|
389
|
-
id: tc.id
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
catch (err) {
|
|
394
|
-
logger.warn(`Invalid tool call JSON arguments format: ${tc.function.arguments}`);
|
|
395
|
-
parts.push({
|
|
396
|
-
functionCall: {
|
|
397
|
-
name: tc.function.name || 'unknown_tool',
|
|
398
|
-
args: {
|
|
399
|
-
_error: 'Invalid JSON format generated',
|
|
400
|
-
raw: tc.function.arguments
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
if (parts.length === 0 &&
|
|
409
|
-
(!choice || !choice.finish_reason) &&
|
|
410
|
-
!data.usage &&
|
|
411
|
-
!data.timings) {
|
|
412
|
-
return null; // Don't yield empty chunks unless it carries the finish_reason or telemetry
|
|
413
|
-
}
|
|
414
|
-
const functionCalls = parts.filter((p) => p.functionCall).map((p) => p.functionCall);
|
|
415
|
-
const promptTokens = data.usage?.prompt_tokens || data.timings?.prompt_n;
|
|
416
|
-
const completionTokens = data.usage?.completion_tokens || data.timings?.predicted_n;
|
|
417
|
-
const totalTokens = promptTokens !== undefined && completionTokens !== undefined
|
|
418
|
-
? promptTokens + completionTokens
|
|
419
|
-
: data.usage?.total_tokens;
|
|
420
|
-
return {
|
|
421
|
-
functionCalls: functionCalls.length > 0 ? functionCalls : undefined,
|
|
422
|
-
candidates: choice
|
|
423
|
-
? [
|
|
424
|
-
{
|
|
425
|
-
content: {
|
|
426
|
-
role: 'model',
|
|
427
|
-
parts
|
|
428
|
-
},
|
|
429
|
-
finishReason: this.mapFinishReason(choice.finish_reason || choice.finishReason)
|
|
430
|
-
}
|
|
431
|
-
]
|
|
432
|
-
: [],
|
|
433
|
-
usageMetadata: promptTokens !== undefined || completionTokens !== undefined
|
|
434
|
-
? {
|
|
435
|
-
promptTokenCount: promptTokens,
|
|
436
|
-
candidatesTokenCount: completionTokens,
|
|
437
|
-
totalTokenCount: totalTokens
|
|
438
|
-
}
|
|
439
|
-
: undefined
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
mapFinishReason(reason) {
|
|
443
|
-
if (!reason) {
|
|
444
|
-
return undefined; // Must return undefined for incomplete stream chunks, not 'OTHER'!
|
|
445
|
-
}
|
|
446
|
-
switch (reason) {
|
|
447
|
-
case 'stop':
|
|
448
|
-
return 'STOP';
|
|
449
|
-
case 'length':
|
|
450
|
-
return 'MAX_TOKENS';
|
|
451
|
-
case 'tool_calls':
|
|
452
|
-
return 'STOP'; // Gemini uses STOP for tool calls often
|
|
453
|
-
case 'content_filter':
|
|
454
|
-
return 'SAFETY';
|
|
455
|
-
default:
|
|
456
|
-
return 'OTHER';
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
// cleanup verbose logs trigger
|
|
461
|
-
//# sourceMappingURL=LlamaCppGenerator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LlamaCppGenerator.js","sourceRoot":"","sources":["../../src/inference/LlamaCppGenerator.ts"],"names":[],"mappings":"AAYA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACG;IAA7B,YAA6B,UAAkB,uBAAuB;QAAzC,YAAO,GAAP,OAAO,CAAkC;IAAG,CAAC;IAElE,eAAe;QACnB,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,QAAQ,IAAI,KAAK,CAAC;YACtB,CAAC;YACD,QAAQ,IAAI,mBAAmB,CAAC;QACpC,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,eAAe,CACjB,OAAkC,EAClC,YAAoB;QAEpB,MAAM,CAAC,KAAK,CAAC,qDAAqD,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAEnF,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;gBACjD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;iBACrC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;gBACnC,MAAM,EAAG,OAAO,CAAC,MAAc,EAAE,WAAW;aAC/C,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;YAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,qBAAqB,CACvB,OAAkC,EAClC,YAAoB;QAEpB,MAAM,aAAa,GAAG;YAClB,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAC5B,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;SAC1C,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC;QAElB,KAAK,SAAS,CAAC,CAAC,eAAe;YAC3B,MAAM,gBAAgB,GAClB,IAAI,GAAG,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;YAE1C,4EAA4E;YAC5E,0EAA0E;YAC1E,uEAAuE;YACvE,uEAAuE;YACvE,IAAI,aAAa,GAIN,IAAI,CAAC;YAEhB,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;oBACjD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACL,cAAc,EAAE,kBAAkB;qBACrC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;oBACnC,MAAM,EAAG,OAAO,CAAC,MAAc,EAAE,WAAW;iBAC/C,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC9C,CAAC;gBAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;gBAClC,IAAI,MAAM,GAAG,EAAE,CAAC;gBAEhB,OAAO,IAAI,EAAE,CAAC;oBACV,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI;wBAAE,MAAM;oBAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC9B,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,cAAc;4BAAE,SAAS;wBACzD,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACjC,IAAI,CAAC;gCACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gCAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gCAE/C,0DAA0D;gCAC1D,+CAA+C;gCAC/C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oCAC7B,aAAa,GAAG;wCACZ,aAAa,EACT,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ;wCACvD,iBAAiB,EACb,IAAI,CAAC,KAAK,EAAE,iBAAiB;4CAC7B,IAAI,CAAC,OAAO,EAAE,WAAW;wCAC7B,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY;qCACzC,CAAC;gCACN,CAAC;gCAED,4DAA4D;gCAC5D,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oCACpD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;wCACvC,IAAI,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;wCAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;4CACX,OAAO,GAAG;gDACN,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE;gDACf,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;gDAC7B,SAAS,EAAE,EAAE;6CAChB,CAAC;4CACF,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;wCAC5C,CAAC;wCACD,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;4CACR,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;wCACvB,CAAC;wCACD,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;4CACzB,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;wCAC/C,CAAC;oCACL,CAAC;oCACD,yEAAyE;oCACzE,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gCACnC,CAAC;gCAED,+DAA+D;gCAC/D,wEAAwE;gCACxE,IAAI,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oCACjC,IAAI,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;wCAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CACxB,gBAAgB,CAAC,OAAO,EAAE,CAC7B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;4CAChB,EAAE,EAAE,EAAE,CAAC,EAAE;4CACT,KAAK,EAAE,CAAC;4CACR,QAAQ,EAAE;gDACN,IAAI,EAAE,EAAE,CAAC,IAAI;gDACb,SAAS,EAAE,EAAE,CAAC,SAAS;6CAC1B;yCACJ,CAAC,CAAC,CAAC;wCACJ,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;wCAEpC,gBAAgB,CAAC,KAAK,EAAE,CAAC;oCAC7B,CAAC;oCAED,qDAAqD;oCACrD,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;wCAC/B,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC;oCAC/B,CAAC;gCACL,CAAC;gCAED,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gCAC3D,IAAI,MAAM,EAAE,CAAC;oCACT,MAAM,MAAM,CAAC;gCACjB,CAAC;4BACL,CAAC;4BAAC,OAAO,CAAM,EAAE,CAAC;gCACd,+BAA+B;4BACnC,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;gBAED,qDAAqD;gBACrD,IAAI,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,SAAS,GAAG;wBACd,OAAO,EAAE;4BACL;gCACI,KAAK,EAAE;oCACH,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAClD,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;wCACV,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE;qCACvD,CAAC,CACL;iCACJ;gCACD,aAAa,EAAE,YAAY;6BAC9B;yBACJ;wBACD,KAAK,EAAE,aAAa,IAAI,SAAS;qBACpC,CAAC;oBACF,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;oBAChE,IAAI,MAAM;wBAAE,MAAM,MAAM,CAAC;oBACzB,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC7B,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;QAED,OAAO,eAAe,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAA8B;QAC5C,oFAAoF;QACpF,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,GAAI,OAAO,CAAC,QAAsB;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBACtD,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,OAAO;YACH,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1C,CAAC;IACN,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA+B;QAC9C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAkC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,CAAC,CAAC,OAAO,CAAC,QAAQ;YAClB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAI,QAAsB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAS,EAAE;YAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;YAE7E,uBAAuB;YACvB,IAAI,cAAmB,CAAC;YAExB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAE3D,IAAI,SAAS,EAAE,CAAC;gBACZ,cAAc,GAAG,OAAO,CAAC,KAAK;oBAC1B,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACR,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;wBACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC1C,CAAC;oBACD,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;wBACf,OAAO;4BACH,IAAI,EAAE,WAAW;4BACjB,SAAS,EAAE;gCACP,GAAG,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,QAAQ,WAAW,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE;6BACnE;yBACJ,CAAC;oBACN,CAAC;gBACL,CAAC,CAAC;qBACD,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1E,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,CAAC;YACL,CAAC;YAED,8BAA8B;YAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK;gBAC3B,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;iBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACT,EAAE,EACG,CAAC,CAAC,YAAoB,EAAE,EAAE;oBAC1B,CAAS,CAAC,MAAM;oBACjB,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjD,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACN,IAAI,EAAE,CAAC,CAAC,YAAa,CAAC,IAAI;oBAC1B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAa,CAAC,IAAI,CAAC;iBAClD;aACJ,CAAC,CAAC,CAAC;YAER,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK;gBAC7B,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACT,YAAY,EACP,CAAC,CAAC,gBAAwB,EAAE,EAAE,IAAK,CAAS,CAAC,MAAM,IAAK,CAAS,CAAC,EAAE;gBACzE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,CAAC,CAAC,gBAAiB,CAAC,IAAI;gBAC9B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAiB,CAAC,QAAQ,CAAC;aACxD,CAAC,CAAC,CAAC;YAER,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,WAAW,CAAC;YACvB,CAAC;YAED,OAAO;gBACH;oBACI,IAAI;oBACJ,OAAO,EAAE,cAAc;oBACvB,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1E;aACJ,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,IAAI,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;YACpC,MAAM,QAAQ,GACV,OAAO,OAAO,CAAC,MAAM,CAAC,iBAAiB,KAAK,QAAQ;gBAChD,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB;gBAClC,CAAC,CAAE,OAAO,CAAC,MAAM,CAAC,iBAAyB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAErE,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,CAAC;QACL,CAAC;QAED,YAAY;QACZ,MAAM,KAAK,GAAI,OAAO,CAAC,MAAM,EAAE,KAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3D,CAAC,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACN,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,UAAU,EAAE,EAAE,CAAC,UAAU;aAC5B;SACJ,CAAC,CAAC,CACN,CAAC;QAEF,OAAO;YACH,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ;YACR,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACpD,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;YAC/C,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe;SAC9C,CAAC;IACN,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAAS;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE/B,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC;oBACP,YAAY,EAAE;wBACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;wBACtB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;qBAC1C;iBACG,CAAC,CAAC;YACd,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAErF,OAAO;YACH,aAAa,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACnE,UAAU,EAAE;gBACR;oBACI,OAAO,EAAE;wBACL,IAAI,EAAE,OAAO;wBACb,KAAK;qBACR;oBACD,YAAY,EAAE,IAAI,CAAC,eAAe,CAC9B,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,CACvC;iBACX;aACJ;YACD,aAAa,EAAE;gBACX,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa;gBAC3C,oBAAoB,EAAE,IAAI,CAAC,KAAK,EAAE,iBAAiB;gBACnD,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY;aAC5C;SACuB,CAAC;IACjC,CAAC;IAEO,mBAAmB,CACvB,IAAS,EACT,KAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEhF,uCAAuC;QACvC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEzD,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC5C,+DAA+D;QACnE,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;YAEhC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACpD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;oBACrB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;oBACzB,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACJ,WAAW,GAAG,EAAE,CAAC;gBACrB,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrD,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;oBACvB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;oBACxB,uCAAuC;oBACvC,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACpD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;wBACrB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;wBACzB,WAAW;4BACP,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC;gCACvC,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;oBAC/C,CAAC;yBAAM,CAAC;wBACJ,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;oBAC1D,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBAChC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;oBACd,IAAI,CAAC;wBACD,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS;4BACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;4BACnC,CAAC,CAAC,EAAE,CAAC;wBACT,KAAK,CAAC,IAAI,CAAC;4BACP,YAAY,EAAE;gCACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;gCACtB,IAAI,EAAE,UAAU;gCAChB,EAAE,EAAE,EAAE,CAAC,EAAE;6BACZ;yBACG,CAAC,CAAC;oBACd,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAChB,MAAM,CAAC,IAAI,CACP,4CAA4C,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,CACtE,CAAC;wBACF,KAAK,CAAC,IAAI,CAAC;4BACP,YAAY,EAAE;gCACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,cAAc;gCACxC,IAAI,EAAE;oCACF,MAAM,EAAE,+BAA+B;oCACvC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS;iCAC7B;6BACJ;yBACG,CAAC,CAAC;oBACd,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,IACI,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YAClC,CAAC,IAAI,CAAC,KAAK;YACX,CAAC,IAAI,CAAC,OAAO,EACf,CAAC;YACC,OAAO,IAAI,CAAC,CAAC,4EAA4E;QAC7F,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAErF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzE,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,EAAE,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QACpF,MAAM,WAAW,GACb,YAAY,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS;YACxD,CAAC,CAAC,YAAY,GAAG,gBAAgB;YACjC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;QAEnC,OAAO;YACH,aAAa,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACnE,UAAU,EAAE,MAAM;gBACd,CAAC,CAAC;oBACI;wBACI,OAAO,EAAE;4BACL,IAAI,EAAE,OAAO;4BACb,KAAK;yBACR;wBACD,YAAY,EAAE,IAAI,CAAC,eAAe,CAC9B,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,CACvC;qBACX;iBACJ;gBACH,CAAC,CAAC,EAAE;YACR,aAAa,EACT,YAAY,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS;gBACxD,CAAC,CAAC;oBACI,gBAAgB,EAAE,YAAY;oBAC9B,oBAAoB,EAAE,gBAAgB;oBACtC,eAAe,EAAE,WAAW;iBAC/B;gBACH,CAAC,CAAC,SAAS;SACK,CAAC;IACjC,CAAC;IAEO,eAAe,CAAC,MAAiC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,SAAS,CAAC,CAAC,mEAAmE;QACzF,CAAC;QAED,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,QAAQ;gBACT,OAAO,YAAY,CAAC;YACxB,KAAK,YAAY;gBACb,OAAO,MAAM,CAAC,CAAC,wCAAwC;YAC3D,KAAK,gBAAgB;gBACjB,OAAO,QAAQ,CAAC;YACpB;gBACI,OAAO,OAAO,CAAC;QACvB,CAAC;IACL,CAAC;CACJ;AACD,+BAA+B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { Config } from '../config/config.js';
|
|
2
|
-
import { GeminiEngine } from '../supervisor/gemini-engine.js';
|
|
3
|
-
/**
|
|
4
|
-
* End-to-End Integration Harness for Local Llama.cpp + Gemini Core SDK
|
|
5
|
-
*
|
|
6
|
-
* Objectives:
|
|
7
|
-
* 1. Test local initialization bypassing the Gemini Core ClassifierStrategy.
|
|
8
|
-
* 2. Connect to the local backend dynamically at 'http://stark:8086'.
|
|
9
|
-
* 3. Validate tool-call stream aggregation and successful `undefined` mappings.
|
|
10
|
-
*/
|
|
11
|
-
async function runIntegrationTest() {
|
|
12
|
-
console.log('๐งช Starting Local LlamaCpp Integration Test...\n');
|
|
13
|
-
// 1. Manually build exactly the environment we want to test
|
|
14
|
-
process.env.INFERENCE_BACKEND = 'llamacpp';
|
|
15
|
-
process.env.LOCAL_INFERENCE_URL = 'http://stark:8086';
|
|
16
|
-
process.env.DEBUG = '*';
|
|
17
|
-
// CRITICAL DECOUPLING:
|
|
18
|
-
// We override 'auto' with a concrete model alias to intentionally
|
|
19
|
-
// force `@google/gemini-cli-core`'s OverrideStrategy to skip the ClassifierStrategy
|
|
20
|
-
process.env.GEMINI_MODEL = 'gemini-3.1-pro-preview';
|
|
21
|
-
process.env.GEMINI_API_KEY = 'dummy_llama_key_to_bypass_sdk_auth';
|
|
22
|
-
const config = Config.getInstance();
|
|
23
|
-
// Validate config correctly mapped our intentions
|
|
24
|
-
console.log('๐ Config Verification:');
|
|
25
|
-
console.log(` - Backend: ${config.inferenceBackend}`);
|
|
26
|
-
console.log(` - Model: ${config.geminiModel} (Must NOT be 'auto' for bypass)`);
|
|
27
|
-
console.log(` - URL: ${process.env.LOCAL_INFERENCE_URL}\n`);
|
|
28
|
-
const engine = new GeminiEngine(config);
|
|
29
|
-
// Mock the Discord Channel for Notification Tools
|
|
30
|
-
engine.setChannelManager({
|
|
31
|
-
config: config,
|
|
32
|
-
notify: async (content) => {
|
|
33
|
-
console.log(`\n\n๐ข [MOCK DISCORD NOTIFICATION TOOL FIRED] -> ${content}\n\n`);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
console.log('๐ Initializing Gemini Engine...');
|
|
37
|
-
// We pass a mock session string to mimic the new preservation fix
|
|
38
|
-
await engine.initialize('mock-integration-uuid-1234');
|
|
39
|
-
// The test prompt intentionally asks the agent to use a specific tool
|
|
40
|
-
const prompt = process.argv[2] ||
|
|
41
|
-
`You must strictly use the send_notification tool to broadcast the exact message "Test Notification". Do not say anything else.`;
|
|
42
|
-
console.log(`\n๐ฃ๏ธ Prompt: "${prompt}"\n`);
|
|
43
|
-
console.log('--------------------------------------------------');
|
|
44
|
-
let chunkCount = 0;
|
|
45
|
-
try {
|
|
46
|
-
await engine.run(prompt, (event) => {
|
|
47
|
-
console.log(`\n\n=== EVENT ===\n`, JSON.stringify(event, null, 2));
|
|
48
|
-
switch (event.type) {
|
|
49
|
-
case 'text':
|
|
50
|
-
process.stdout.write(event.content || '');
|
|
51
|
-
chunkCount++;
|
|
52
|
-
break;
|
|
53
|
-
case 'tool_call':
|
|
54
|
-
console.log(`\n\n๐ ๏ธ -> TOOL REQUESTED: ${event.toolName}`);
|
|
55
|
-
console.log(`๐ฅ -> ARGUMENTS: ${JSON.stringify(event.toolArgs)}`);
|
|
56
|
-
break;
|
|
57
|
-
case 'tool_response':
|
|
58
|
-
console.log(`\nโ
-> TOOL COMPLETED: ${event.toolName}`);
|
|
59
|
-
break;
|
|
60
|
-
case 'done':
|
|
61
|
-
console.log(`\n\n๐ -> TURN FINISHED (Reason: ${'none'})`);
|
|
62
|
-
console.log(`๐ -> Chunks Streamed: ${chunkCount}`);
|
|
63
|
-
break;
|
|
64
|
-
default:
|
|
65
|
-
console.log(`\n[Unhandled Event]: `, event);
|
|
66
|
-
}
|
|
67
|
-
}, 'mock-integration-uuid-1234');
|
|
68
|
-
console.log('--------------------------------------------------');
|
|
69
|
-
console.log('โ
Integration Test Complete.');
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
console.error('\nโ Error during execution:');
|
|
73
|
-
console.error(error);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
runIntegrationTest().catch(console.dir);
|
|
77
|
-
//# sourceMappingURL=test-local-llamacpp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-local-llamacpp.js","sourceRoot":"","sources":["../../src/scripts/test-local-llamacpp.ts"],"names":[],"mappings":"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"}
|