@mate-academy/llm-gateway 6.1.0 → 6.2.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/dist/LLMService.constants.d.ts +291 -1
- package/dist/LLMService.constants.js +2 -1
- package/dist/LLMService.constants.js.map +1 -1
- package/dist/LLMService.typedefs.d.ts +9 -0
- package/dist/LLMService.typedefs.js.map +1 -1
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.d.ts +12 -7
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js +232 -64
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js.map +1 -1
- package/dist/providers/LLMAPI/LLMAPI.constants.d.ts +293 -4
- package/dist/providers/LLMAPI/LLMAPI.constants.js +3 -3
- package/dist/providers/LLMAPI/LLMAPI.constants.js.map +1 -1
- package/dist/providers/LLMAPI/LLMAPI.entity.d.ts +6 -0
- package/dist/providers/LLMAPI/LLMAPI.entity.js +48 -0
- package/dist/providers/LLMAPI/LLMAPI.entity.js.map +1 -0
- package/dist/providers/LLMAPI/LLMAPI.typedefs.js.map +1 -1
- package/dist/providers/LLMAPI/index.d.ts +1 -0
- package/dist/providers/LLMAPI/index.js +1 -0
- package/dist/providers/LLMAPI/index.js.map +1 -1
- package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.d.ts +37 -0
- package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js +500 -0
- package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js.map +1 -0
- package/dist/providers/LLMAPI/services/LLMAPICompletion.service.d.ts +2 -1
- package/dist/providers/LLMAPI/services/LLMAPICompletion.service.js +23 -13
- package/dist/providers/LLMAPI/services/LLMAPICompletion.service.js.map +1 -1
- package/dist/providers/LLMAPI/services/index.d.ts +1 -0
- package/dist/providers/LLMAPI/services/index.js +1 -0
- package/dist/providers/LLMAPI/services/index.js.map +1 -1
- package/dist/providers/LLMAPI/utilities/LLMAPIJsonFixer.js +2 -4
- package/dist/providers/LLMAPI/utilities/LLMAPIJsonFixer.js.map +1 -1
- package/dist/providers/LLMAPI/utilities/index.d.ts +2 -0
- package/dist/providers/LLMAPI/utilities/index.js +5 -1
- package/dist/providers/LLMAPI/utilities/index.js.map +1 -1
- package/dist/providers/LLMAPI/utilities/parseXmlToolCalls.d.ts +7 -0
- package/dist/providers/LLMAPI/utilities/parseXmlToolCalls.js +35 -0
- package/dist/providers/LLMAPI/utilities/parseXmlToolCalls.js.map +1 -0
- package/dist/providers/LLMAPI/utilities/stripThinkingTags.d.ts +1 -0
- package/dist/providers/LLMAPI/utilities/stripThinkingTags.js +7 -0
- package/dist/providers/LLMAPI/utilities/stripThinkingTags.js.map +1 -0
- package/dist/providers/OpenAI/services/OpenAIAssistance.service.d.ts +12 -7
- package/dist/providers/OpenAI/services/OpenAIAssistance.service.js +180 -67
- package/dist/providers/OpenAI/services/OpenAIAssistance.service.js.map +1 -1
- package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.d.ts +2 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.js +60 -76
- package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.js.map +1 -1
- package/dist/services/LLMAssistanceService.abstract.d.ts +8 -6
- package/dist/services/LLMAssistanceService.abstract.js +20 -0
- package/dist/services/LLMAssistanceService.abstract.js.map +1 -1
- package/dist/services/chatState/CompletionsChatState.d.ts +19 -0
- package/dist/services/chatState/CompletionsChatState.js +80 -0
- package/dist/services/chatState/CompletionsChatState.js.map +1 -0
- package/dist/services/chatState/index.d.ts +1 -0
- package/dist/services/chatState/index.js +6 -0
- package/dist/services/chatState/index.js.map +1 -0
- package/dist/services/fileStorage/FileStorageToolExecutor.d.ts +15 -0
- package/dist/services/fileStorage/FileStorageToolExecutor.js +172 -0
- package/dist/services/fileStorage/FileStorageToolExecutor.js.map +1 -0
- package/dist/services/fileStorage/InMemoryFileStorage.d.ts +20 -0
- package/dist/services/fileStorage/InMemoryFileStorage.js +67 -0
- package/dist/services/fileStorage/InMemoryFileStorage.js.map +1 -0
- package/dist/services/fileStorage/fileStorageTools.d.ts +26 -0
- package/dist/services/fileStorage/fileStorageTools.js +68 -0
- package/dist/services/fileStorage/fileStorageTools.js.map +1 -0
- package/dist/services/fileStorage/index.d.ts +4 -0
- package/dist/services/fileStorage/index.js +11 -0
- package/dist/services/fileStorage/index.js.map +1 -0
- package/dist/utilities/index.d.ts +1 -0
- package/dist/utilities/index.js +1 -0
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/tools/LLMTool.d.ts +10 -0
- package/dist/utilities/tools/LLMTool.js +10 -0
- package/dist/utilities/tools/LLMTool.js.map +1 -0
- package/dist/utilities/tools/index.d.ts +1 -0
- package/dist/utilities/tools/index.js +6 -0
- package/dist/utilities/tools/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -24,32 +24,17 @@ class OpenAICompatibleCompletionService extends services_1.LLMCompletionService
|
|
|
24
24
|
return countTokensFn(allContents);
|
|
25
25
|
}
|
|
26
26
|
async sendTextMessage(options) {
|
|
27
|
-
const { model,
|
|
27
|
+
const { model, abortSignal, reporterContext, } = options;
|
|
28
28
|
const writeMetrics = this.reporter?.initWriter(reporterContext);
|
|
29
29
|
try {
|
|
30
30
|
abortSignal?.throwIfAborted();
|
|
31
|
-
const
|
|
32
|
-
const combinedMessages = await OpenAI_entity_1.OpenAIEntity
|
|
33
|
-
.combineMessagesWithLimit({
|
|
34
|
-
history,
|
|
35
|
-
message,
|
|
36
|
-
model,
|
|
37
|
-
countTokensFn,
|
|
38
|
-
instance: this.instance,
|
|
39
|
-
logger: this.logger,
|
|
40
|
-
});
|
|
41
|
-
const chatCompletionMessageParam = OpenAI_entity_1.OpenAIEntity
|
|
42
|
-
.getChatCompletionMessageParam(combinedMessages, this.logger);
|
|
43
|
-
const systemMessage = instructions
|
|
44
|
-
? [{ role: 'system', content: instructions }]
|
|
45
|
-
: [];
|
|
31
|
+
const { systemMessage, chatMessages, } = await this.prepareCompletionMessages(options);
|
|
46
32
|
abortSignal?.throwIfAborted();
|
|
47
|
-
const completion = await this.instance.chat.completions
|
|
48
|
-
.create({
|
|
33
|
+
const completion = await this.instance.chat.completions.create({
|
|
49
34
|
model: model.name,
|
|
50
35
|
messages: [
|
|
51
36
|
...systemMessage,
|
|
52
|
-
...
|
|
37
|
+
...chatMessages,
|
|
53
38
|
],
|
|
54
39
|
n: 1,
|
|
55
40
|
...model.config,
|
|
@@ -57,22 +42,11 @@ class OpenAICompatibleCompletionService extends services_1.LLMCompletionService
|
|
|
57
42
|
signal: abortSignal,
|
|
58
43
|
});
|
|
59
44
|
abortSignal?.throwIfAborted();
|
|
60
|
-
const
|
|
61
|
-
const cachedTokens = completion.usage?.prompt_tokens_details
|
|
62
|
-
?.cached_tokens ?? 0;
|
|
63
|
-
const regularInputTokens = promptTokens - cachedTokens;
|
|
64
|
-
const outputTokens = completion.usage?.completion_tokens ?? 0;
|
|
65
|
-
const reasoningTokens = completion.usage?.completion_tokens_details
|
|
66
|
-
?.reasoning_tokens ?? 0;
|
|
45
|
+
const usage = this.extractUsageFromCompletion(completion);
|
|
67
46
|
await this.writeSuccessMetrics({
|
|
68
47
|
method: this.getMethodName(this.sendTextMessage),
|
|
69
48
|
model,
|
|
70
|
-
usage
|
|
71
|
-
inputTextTokens: regularInputTokens,
|
|
72
|
-
inputCachedTextTokens: cachedTokens,
|
|
73
|
-
outputTextTokens: outputTokens,
|
|
74
|
-
outputReasoningTokens: reasoningTokens,
|
|
75
|
-
},
|
|
49
|
+
usage,
|
|
76
50
|
writeMetrics,
|
|
77
51
|
});
|
|
78
52
|
return {
|
|
@@ -86,43 +60,31 @@ class OpenAICompatibleCompletionService extends services_1.LLMCompletionService
|
|
|
86
60
|
isAborted: abortSignal?.aborted,
|
|
87
61
|
writeMetrics,
|
|
88
62
|
});
|
|
89
|
-
this.logger
|
|
90
|
-
?.child(this.getMethodName(this.sendTextMessage))
|
|
63
|
+
this.logger?.child(this.getMethodName(this.sendTextMessage))
|
|
91
64
|
.error('Error sending text message', {
|
|
92
65
|
error: (0, serializeError_1.serializeError)(error),
|
|
93
66
|
options,
|
|
94
67
|
});
|
|
95
|
-
return {
|
|
68
|
+
return {
|
|
69
|
+
error: error instanceof Error
|
|
70
|
+
? error
|
|
71
|
+
: new Error(String(error)),
|
|
72
|
+
};
|
|
96
73
|
}
|
|
97
74
|
}
|
|
98
75
|
async sendStructuredMessage(options) {
|
|
99
|
-
const { model,
|
|
76
|
+
const { model, abortSignal, schema, reporterContext, } = options;
|
|
100
77
|
const writeMetrics = this.reporter?.initWriter(reporterContext);
|
|
101
78
|
try {
|
|
102
79
|
abortSignal?.throwIfAborted();
|
|
103
|
-
const
|
|
104
|
-
const combinedMessages = await OpenAI_entity_1.OpenAIEntity
|
|
105
|
-
.combineMessagesWithLimit({
|
|
106
|
-
history,
|
|
107
|
-
message,
|
|
108
|
-
model,
|
|
109
|
-
countTokensFn,
|
|
110
|
-
instance: this.instance,
|
|
111
|
-
logger: this.logger,
|
|
112
|
-
});
|
|
113
|
-
const chatCompletionMessageParam = OpenAI_entity_1.OpenAIEntity
|
|
114
|
-
.getChatCompletionMessageParam(combinedMessages, this.logger);
|
|
115
|
-
const systemMessage = instructions
|
|
116
|
-
? [{ role: 'system', content: instructions }]
|
|
117
|
-
: [];
|
|
80
|
+
const { systemMessage, chatMessages, } = await this.prepareCompletionMessages(options);
|
|
118
81
|
abortSignal?.throwIfAborted();
|
|
119
82
|
const jsonSchema = schema._toProviderSchema(this.provider);
|
|
120
|
-
const completion = await this.instance.chat.completions
|
|
121
|
-
.create({
|
|
83
|
+
const completion = await this.instance.chat.completions.create({
|
|
122
84
|
model: model.name,
|
|
123
85
|
messages: [
|
|
124
86
|
...systemMessage,
|
|
125
|
-
...
|
|
87
|
+
...chatMessages,
|
|
126
88
|
],
|
|
127
89
|
n: 1,
|
|
128
90
|
...model.config,
|
|
@@ -145,22 +107,11 @@ class OpenAICompatibleCompletionService extends services_1.LLMCompletionService
|
|
|
145
107
|
try {
|
|
146
108
|
const parsed = JSON.parse(content);
|
|
147
109
|
const validation = schema._parse(parsed);
|
|
148
|
-
const
|
|
149
|
-
const cachedTokens = completion.usage?.prompt_tokens_details
|
|
150
|
-
?.cached_tokens ?? 0;
|
|
151
|
-
const regularInputTokens = promptTokens - cachedTokens;
|
|
152
|
-
const outputTokens = completion.usage?.completion_tokens ?? 0;
|
|
153
|
-
const reasoningTokens = completion.usage?.completion_tokens_details
|
|
154
|
-
?.reasoning_tokens ?? 0;
|
|
110
|
+
const usage = this.extractUsageFromCompletion(completion);
|
|
155
111
|
await this.writeSuccessMetrics({
|
|
156
112
|
method: this.getMethodName(this.sendStructuredMessage),
|
|
157
113
|
model,
|
|
158
|
-
usage
|
|
159
|
-
inputTextTokens: regularInputTokens,
|
|
160
|
-
inputCachedTextTokens: cachedTokens,
|
|
161
|
-
outputTextTokens: outputTokens,
|
|
162
|
-
outputReasoningTokens: reasoningTokens,
|
|
163
|
-
},
|
|
114
|
+
usage,
|
|
164
115
|
writeMetrics,
|
|
165
116
|
});
|
|
166
117
|
return {
|
|
@@ -170,11 +121,11 @@ class OpenAICompatibleCompletionService extends services_1.LLMCompletionService
|
|
|
170
121
|
};
|
|
171
122
|
}
|
|
172
123
|
catch (parseError) {
|
|
173
|
-
this.logger
|
|
174
|
-
?.child(this.getMethodName(this.sendStructuredMessage))
|
|
175
|
-
.warn('Failed to parse JSON response', {
|
|
124
|
+
this.logger?.child(this.getMethodName(this.sendStructuredMessage)).warn('Failed to parse JSON response', {
|
|
176
125
|
content,
|
|
177
|
-
parseError: parseError
|
|
126
|
+
parseError: parseError instanceof Error
|
|
127
|
+
? parseError.message
|
|
128
|
+
: String(parseError),
|
|
178
129
|
});
|
|
179
130
|
throw parseError;
|
|
180
131
|
}
|
|
@@ -186,19 +137,52 @@ class OpenAICompatibleCompletionService extends services_1.LLMCompletionService
|
|
|
186
137
|
isAborted: abortSignal?.aborted,
|
|
187
138
|
writeMetrics,
|
|
188
139
|
});
|
|
189
|
-
this.logger
|
|
190
|
-
?.child(this.getMethodName(this.sendStructuredMessage))
|
|
191
|
-
.error('Error sending structured message', {
|
|
140
|
+
this.logger?.child(this.getMethodName(this.sendStructuredMessage)).error('Error sending structured message', {
|
|
192
141
|
error: (0, serializeError_1.serializeError)(error),
|
|
193
142
|
options,
|
|
194
143
|
});
|
|
195
144
|
return {
|
|
196
145
|
text: '',
|
|
197
|
-
error
|
|
198
|
-
|
|
146
|
+
error: error instanceof Error
|
|
147
|
+
? error
|
|
148
|
+
: new Error(String(error)),
|
|
149
|
+
parseError: `Failed to get structured response`
|
|
150
|
+
+ ` from ${this.provider}`,
|
|
199
151
|
};
|
|
200
152
|
}
|
|
201
153
|
}
|
|
154
|
+
async prepareCompletionMessages(options) {
|
|
155
|
+
const { message, history = [], instructions, model, } = options;
|
|
156
|
+
const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
|
|
157
|
+
const combinedMessages = await OpenAI_entity_1.OpenAIEntity.combineMessagesWithLimit({
|
|
158
|
+
history,
|
|
159
|
+
message,
|
|
160
|
+
model,
|
|
161
|
+
countTokensFn,
|
|
162
|
+
instance: this.instance,
|
|
163
|
+
logger: this.logger,
|
|
164
|
+
});
|
|
165
|
+
const chatMessages = OpenAI_entity_1.OpenAIEntity
|
|
166
|
+
.getChatCompletionMessageParam(combinedMessages, this.logger);
|
|
167
|
+
const systemMessage = instructions
|
|
168
|
+
? [{ role: 'system', content: instructions }]
|
|
169
|
+
: [];
|
|
170
|
+
return { systemMessage, chatMessages };
|
|
171
|
+
}
|
|
172
|
+
extractUsageFromCompletion(completion) {
|
|
173
|
+
const promptTokens = completion.usage?.prompt_tokens ?? 0;
|
|
174
|
+
const cachedTokens = completion.usage?.prompt_tokens_details
|
|
175
|
+
?.cached_tokens ?? 0;
|
|
176
|
+
const outputTokens = completion.usage?.completion_tokens ?? 0;
|
|
177
|
+
const reasoningTokens = completion.usage?.completion_tokens_details
|
|
178
|
+
?.reasoning_tokens ?? 0;
|
|
179
|
+
return {
|
|
180
|
+
inputTextTokens: promptTokens - cachedTokens,
|
|
181
|
+
inputCachedTextTokens: cachedTokens,
|
|
182
|
+
outputTextTokens: outputTokens,
|
|
183
|
+
outputReasoningTokens: reasoningTokens,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
202
186
|
}
|
|
203
187
|
exports.OpenAICompatibleCompletionService = OpenAICompatibleCompletionService;
|
|
204
188
|
//# sourceMappingURL=OpenAICompatibleCompletion.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAICompatibleCompletion.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleCompletion.service.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAehC,+DAA4D;AAC5D,yCAAkD;AAClD,oEAAgE;
|
|
1
|
+
{"version":3,"file":"OpenAICompatibleCompletion.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleCompletion.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { type LLMAssistanceOptions, type LLMAssistanceResult, type LLMAssistanceMessage, type LLMCreateChatOptions, type LLMCreateChatResult, type LLMCreateFileStorageOptions, type LLMCreateFileStorageResult, type LLMInstanceOptions, type LLMModel, type LLMProviders, LLMPurposes, type LLMUploadFileOptions, type LLMUploadFileResult, type LLMStructuredResult, type LLMUploadedFile } from '../LLMService.typedefs';
|
|
1
|
+
import { type LLMAssistanceOptions, type LLMAssistanceResult, type LLMAssistanceMessage, type LLMToolDefinition, type LLMCreateChatOptions, type LLMCreateChatResult, type LLMCreateFileStorageOptions, type LLMCreateFileStorageResult, type LLMInstanceOptions, type LLMModel, type LLMProviders, LLMPurposes, type LLMUploadFileOptions, type LLMUploadFileResult, type LLMStructuredResult, type LLMUploadedFile } from '../LLMService.typedefs';
|
|
2
2
|
import { type LLMLoggerInterface } from '../utilities/logger';
|
|
3
3
|
import { type LLMReporterInterface } from '../utilities/reporter';
|
|
4
4
|
import { LLMBaseService } from '../services';
|
|
5
5
|
import { type LLMSchemaInterface, type InferSchema } from '../utilities/schema';
|
|
6
6
|
export declare abstract class LLMAssistanceService<Provider extends LLMProviders, Reporter extends LLMReporterInterface<any> | undefined> extends LLMBaseService<LLMPurposes.Assistance, Provider, Reporter> {
|
|
7
7
|
constructor(provider: Provider, logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[Provider]);
|
|
8
|
+
protected validateToolDefinitions(tools: LLMToolDefinition[]): void;
|
|
8
9
|
abstract uploadFile(options: LLMUploadFileOptions<Reporter>): Promise<LLMUploadFileResult>;
|
|
9
10
|
abstract getFile(path: string): Promise<LLMUploadedFile | null>;
|
|
10
11
|
abstract deleteFile(fileId: string): Promise<void>;
|
|
@@ -12,12 +13,13 @@ export declare abstract class LLMAssistanceService<Provider extends LLMProviders
|
|
|
12
13
|
abstract deleteFileStorage(fileStorageId: string): Promise<void>;
|
|
13
14
|
abstract createChat(options: LLMCreateChatOptions<Provider, Reporter>): Promise<LLMCreateChatResult>;
|
|
14
15
|
abstract deleteChat(chatId: string): Promise<void>;
|
|
15
|
-
|
|
16
|
+
assistInChat<Schema extends LLMSchemaInterface>(options: LLMAssistanceOptions<Provider, Reporter> & {
|
|
16
17
|
schema: Schema;
|
|
17
18
|
}): Promise<LLMStructuredResult<InferSchema<Schema>>>;
|
|
18
|
-
|
|
19
|
-
abstract
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
assistInChat(options: LLMAssistanceOptions<Provider, Reporter>): Promise<LLMAssistanceResult>;
|
|
20
|
+
protected abstract assistInChatText(options: LLMAssistanceOptions<Provider, Reporter>): Promise<LLMAssistanceResult>;
|
|
21
|
+
protected abstract assistInChatStructured(options: LLMAssistanceOptions<Provider, Reporter> & {
|
|
22
|
+
schema: LLMSchemaInterface;
|
|
23
|
+
}): Promise<LLMStructuredResult>;
|
|
22
24
|
abstract countTokens(messages: LLMAssistanceMessage[], model: LLMModel<Provider>): Promise<number>;
|
|
23
25
|
}
|
|
@@ -7,6 +7,26 @@ class LLMAssistanceService extends services_1.LLMBaseService {
|
|
|
7
7
|
constructor(provider, logger, reporter, options) {
|
|
8
8
|
super(provider, 'AssistanceService', LLMService_typedefs_1.LLMPurposes.Assistance, logger, reporter, options);
|
|
9
9
|
}
|
|
10
|
+
validateToolDefinitions(tools) {
|
|
11
|
+
const namePattern = /^[a-zA-Z0-9_-]+$/;
|
|
12
|
+
const names = new Set();
|
|
13
|
+
for (const tool of tools) {
|
|
14
|
+
if (!namePattern.test(tool.name)) {
|
|
15
|
+
throw new Error(`Invalid tool name "${tool.name}":`
|
|
16
|
+
+ ' must match [a-zA-Z0-9_-]+');
|
|
17
|
+
}
|
|
18
|
+
if (names.has(tool.name)) {
|
|
19
|
+
throw new Error(`Duplicate tool name "${tool.name}"`);
|
|
20
|
+
}
|
|
21
|
+
names.add(tool.name);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
assistInChat(options) {
|
|
25
|
+
if (options.schema) {
|
|
26
|
+
return this.assistInChatStructured(options);
|
|
27
|
+
}
|
|
28
|
+
return this.assistInChatText(options);
|
|
29
|
+
}
|
|
10
30
|
}
|
|
11
31
|
exports.LLMAssistanceService = LLMAssistanceService;
|
|
12
32
|
//# sourceMappingURL=LLMAssistanceService.abstract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LLMAssistanceService.abstract.js","sourceRoot":"","sources":["../../src/services/LLMAssistanceService.abstract.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"LLMAssistanceService.abstract.js","sourceRoot":"","sources":["../../src/services/LLMAssistanceService.abstract.ts"],"names":[],"mappings":";;;AAAA,+DAiB+B;AAG/B,yCAA4C;AAG5C,MAAsB,oBAGpB,SAAQ,yBAIP;IACD,YACE,QAAkB,EAClB,MAAsC,EACtC,QAAkB,EAClB,OAAsC;QAEtC,KAAK,CACH,QAAQ,EACR,mBAAmB,EACnB,iCAAW,CAAC,UAAU,EACtB,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;IACJ,CAAC;IAES,uBAAuB,CAC/B,KAA0B;QAE1B,MAAM,WAAW,GAAG,kBAAkB,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,IAAI;sBACjC,4BAA4B,CAC/B,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,CAAC,IAAI,GAAG,CACrC,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAuCD,YAAY,CACV,OACmC;QAEnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,sBAAsB,CAChC,OACkC,CACnC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CAeF;AAhHD,oDAgHC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ChatCompletionMessageParam, ChatCompletionMessageToolCall } from 'openai/resources/chat';
|
|
2
|
+
import type { ChatCompletionContentPart } from 'openai/resources/chat';
|
|
3
|
+
interface ChatStateEntry {
|
|
4
|
+
instructions: string | undefined;
|
|
5
|
+
storageId: string | undefined;
|
|
6
|
+
messages: ChatCompletionMessageParam[];
|
|
7
|
+
}
|
|
8
|
+
export declare class CompletionsChatState {
|
|
9
|
+
private chats;
|
|
10
|
+
createChat(chatId: string, instructions?: string, storageId?: string, history?: ChatCompletionMessageParam[]): void;
|
|
11
|
+
getChat(chatId: string): ChatStateEntry | null;
|
|
12
|
+
appendUserMessage(chatId: string, content: ChatCompletionContentPart[]): void;
|
|
13
|
+
appendAssistantMessage(chatId: string, content: string): void;
|
|
14
|
+
appendToolCallMessages(chatId: string, toolCalls: ChatCompletionMessageToolCall[]): void;
|
|
15
|
+
appendToolResult(chatId: string, toolCallId: string, content: string): void;
|
|
16
|
+
getMessages(chatId: string): ChatCompletionMessageParam[];
|
|
17
|
+
deleteChat(chatId: string): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompletionsChatState = void 0;
|
|
4
|
+
class CompletionsChatState {
|
|
5
|
+
chats = new Map();
|
|
6
|
+
createChat(chatId, instructions, storageId, history) {
|
|
7
|
+
const messages = [];
|
|
8
|
+
if (instructions) {
|
|
9
|
+
messages.push({
|
|
10
|
+
role: 'system',
|
|
11
|
+
content: instructions,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
if (history) {
|
|
15
|
+
messages.push(...history);
|
|
16
|
+
}
|
|
17
|
+
this.chats.set(chatId, {
|
|
18
|
+
instructions,
|
|
19
|
+
storageId,
|
|
20
|
+
messages,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
getChat(chatId) {
|
|
24
|
+
return this.chats.get(chatId) ?? null;
|
|
25
|
+
}
|
|
26
|
+
appendUserMessage(chatId, content) {
|
|
27
|
+
const chat = this.chats.get(chatId);
|
|
28
|
+
if (!chat) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
chat.messages.push({
|
|
32
|
+
role: 'user',
|
|
33
|
+
content,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
appendAssistantMessage(chatId, content) {
|
|
37
|
+
const chat = this.chats.get(chatId);
|
|
38
|
+
if (!chat) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
chat.messages.push({
|
|
42
|
+
role: 'assistant',
|
|
43
|
+
content,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
appendToolCallMessages(chatId, toolCalls) {
|
|
47
|
+
const chat = this.chats.get(chatId);
|
|
48
|
+
if (!chat) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
chat.messages.push({
|
|
52
|
+
role: 'assistant',
|
|
53
|
+
content: null,
|
|
54
|
+
tool_calls: toolCalls,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
appendToolResult(chatId, toolCallId, content) {
|
|
58
|
+
const chat = this.chats.get(chatId);
|
|
59
|
+
if (!chat) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
chat.messages.push({
|
|
63
|
+
role: 'tool',
|
|
64
|
+
tool_call_id: toolCallId,
|
|
65
|
+
content,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getMessages(chatId) {
|
|
69
|
+
const chat = this.chats.get(chatId);
|
|
70
|
+
if (!chat) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return chat.messages;
|
|
74
|
+
}
|
|
75
|
+
deleteChat(chatId) {
|
|
76
|
+
this.chats.delete(chatId);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.CompletionsChatState = CompletionsChatState;
|
|
80
|
+
//# sourceMappingURL=CompletionsChatState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompletionsChatState.js","sourceRoot":"","sources":["../../../src/services/chatState/CompletionsChatState.ts"],"names":[],"mappings":";;;AAYA,MAAa,oBAAoB;IACvB,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,UAAU,CACR,MAAc,EACd,YAAqB,EACrB,SAAkB,EAClB,OAAsC;QAEtC,MAAM,QAAQ,GAAiC,EAAE,CAAC;QAElD,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACrB,YAAY;YACZ,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,iBAAiB,CACf,MAAc,EACd,OAAoC;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,MAAM;YACZ,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB,CACpB,MAAc,EACd,OAAe;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB,CACpB,MAAc,EACd,SAA0C;QAE1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CACd,MAAc,EACd,UAAkB,EAClB,OAAe;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,UAAU;YACxB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;CACF;AAjHD,oDAiHC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CompletionsChatState } from './CompletionsChatState';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompletionsChatState = void 0;
|
|
4
|
+
var CompletionsChatState_1 = require("./CompletionsChatState");
|
|
5
|
+
Object.defineProperty(exports, "CompletionsChatState", { enumerable: true, get: function () { return CompletionsChatState_1.CompletionsChatState; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/chatState/index.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type InMemoryFileStorage } from './InMemoryFileStorage';
|
|
2
|
+
export declare class FileStorageToolExecutor {
|
|
3
|
+
private storage;
|
|
4
|
+
constructor(storage: InMemoryFileStorage);
|
|
5
|
+
execute(storageId: string, toolName: string, rawArguments: string): string;
|
|
6
|
+
private listFiles;
|
|
7
|
+
private searchFiles;
|
|
8
|
+
private mergeContextRanges;
|
|
9
|
+
private readFile;
|
|
10
|
+
private readFileLines;
|
|
11
|
+
private resolveLineRange;
|
|
12
|
+
private findFileByPath;
|
|
13
|
+
private fileNotFoundMessage;
|
|
14
|
+
private formatLinesWithNumbers;
|
|
15
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileStorageToolExecutor = void 0;
|
|
4
|
+
const fileStorageTools_1 = require("./fileStorageTools");
|
|
5
|
+
const MAX_OUTPUT_LENGTH = 50_000;
|
|
6
|
+
class FileStorageToolExecutor {
|
|
7
|
+
storage;
|
|
8
|
+
constructor(storage) {
|
|
9
|
+
this.storage = storage;
|
|
10
|
+
}
|
|
11
|
+
execute(storageId, toolName, rawArguments) {
|
|
12
|
+
switch (toolName) {
|
|
13
|
+
case fileStorageTools_1.FileStorageToolName.ListFiles:
|
|
14
|
+
return this.listFiles(storageId);
|
|
15
|
+
case fileStorageTools_1.FileStorageToolName.SearchFiles:
|
|
16
|
+
return this.searchFiles(storageId, JSON.parse(rawArguments));
|
|
17
|
+
case fileStorageTools_1.FileStorageToolName.ReadFile:
|
|
18
|
+
return this.readFile(storageId, JSON.parse(rawArguments));
|
|
19
|
+
case fileStorageTools_1.FileStorageToolName.ReadFileLines:
|
|
20
|
+
return this.readFileLines(storageId, JSON.parse(rawArguments));
|
|
21
|
+
default:
|
|
22
|
+
return `Unknown tool: '${toolName}'`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
listFiles(storageId) {
|
|
26
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
27
|
+
if (files.length === 0) {
|
|
28
|
+
return 'No files in storage.';
|
|
29
|
+
}
|
|
30
|
+
return files
|
|
31
|
+
.map((file) => {
|
|
32
|
+
const lineCount = file.content.split('\n').length;
|
|
33
|
+
return `${file.name} (${file.path}) - ${lineCount} lines`;
|
|
34
|
+
})
|
|
35
|
+
.join('\n');
|
|
36
|
+
}
|
|
37
|
+
searchFiles(storageId, arguments_) {
|
|
38
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
39
|
+
const contextLines = arguments_.context_lines ?? 3;
|
|
40
|
+
const lowerQuery = arguments_.query.toLowerCase();
|
|
41
|
+
const filteredFiles = arguments_.path
|
|
42
|
+
? files.filter((file) => file.path.includes(arguments_.path))
|
|
43
|
+
: files;
|
|
44
|
+
const results = [];
|
|
45
|
+
for (const file of filteredFiles) {
|
|
46
|
+
if (!file.content.toLowerCase().includes(lowerQuery)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const lines = file.content.split('\n');
|
|
50
|
+
const matchingLineIndices = [];
|
|
51
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
52
|
+
if (lines[lineIndex].toLowerCase().includes(lowerQuery)) {
|
|
53
|
+
matchingLineIndices.push(lineIndex);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (matchingLineIndices.length === 0) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const ranges = this.mergeContextRanges(matchingLineIndices, contextLines, lines.length);
|
|
60
|
+
for (const range of ranges) {
|
|
61
|
+
for (let lineIndex = range.start; lineIndex <= range.end; lineIndex++) {
|
|
62
|
+
results.push(`${file.path}:${lineIndex + 1}: ${lines[lineIndex]}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (results.length === 0) {
|
|
67
|
+
return `No matches found for '${arguments_.query}'`;
|
|
68
|
+
}
|
|
69
|
+
const output = results.join('\n');
|
|
70
|
+
if (output.length > MAX_OUTPUT_LENGTH) {
|
|
71
|
+
return output.slice(0, MAX_OUTPUT_LENGTH)
|
|
72
|
+
+ '\n... (output truncated)';
|
|
73
|
+
}
|
|
74
|
+
return output;
|
|
75
|
+
}
|
|
76
|
+
mergeContextRanges(matchingIndices, contextLines, totalLines) {
|
|
77
|
+
const ranges = [];
|
|
78
|
+
for (const matchIndex of matchingIndices) {
|
|
79
|
+
const start = Math.max(0, matchIndex - contextLines);
|
|
80
|
+
const end = Math.min(totalLines - 1, matchIndex + contextLines);
|
|
81
|
+
const lastRange = ranges[ranges.length - 1];
|
|
82
|
+
if (lastRange && start <= lastRange.end + 1) {
|
|
83
|
+
lastRange.end = end;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
ranges.push({ start, end });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return ranges;
|
|
90
|
+
}
|
|
91
|
+
readFile(storageId, arguments_) {
|
|
92
|
+
const file = this.findFileByPath(storageId, arguments_.path);
|
|
93
|
+
if (!file) {
|
|
94
|
+
return this.fileNotFoundMessage(storageId, arguments_.path);
|
|
95
|
+
}
|
|
96
|
+
const lines = file.content.split('\n');
|
|
97
|
+
return this.formatLinesWithNumbers(lines, 1);
|
|
98
|
+
}
|
|
99
|
+
readFileLines(storageId, arguments_) {
|
|
100
|
+
const file = this.findFileByPath(storageId, arguments_.path);
|
|
101
|
+
if (!file) {
|
|
102
|
+
return this.fileNotFoundMessage(storageId, arguments_.path);
|
|
103
|
+
}
|
|
104
|
+
const lines = file.content.split('\n');
|
|
105
|
+
const { startIndex, endIndex } = this.resolveLineRange(lines.length, arguments_.start_line, arguments_.end_line);
|
|
106
|
+
const selectedLines = lines.slice(startIndex, endIndex);
|
|
107
|
+
return this.formatLinesWithNumbers(selectedLines, startIndex + 1);
|
|
108
|
+
}
|
|
109
|
+
resolveLineRange(totalLines, startLine, endLine) {
|
|
110
|
+
if (startLine !== undefined && endLine !== undefined) {
|
|
111
|
+
return {
|
|
112
|
+
startIndex: Math.max(0, startLine - 1),
|
|
113
|
+
endIndex: Math.min(totalLines, endLine),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (startLine !== undefined) {
|
|
117
|
+
return {
|
|
118
|
+
startIndex: Math.max(0, startLine - 1),
|
|
119
|
+
endIndex: totalLines,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (endLine !== undefined && endLine < 0) {
|
|
123
|
+
return {
|
|
124
|
+
startIndex: Math.max(0, totalLines + endLine),
|
|
125
|
+
endIndex: totalLines,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (endLine !== undefined) {
|
|
129
|
+
return {
|
|
130
|
+
startIndex: 0,
|
|
131
|
+
endIndex: Math.min(totalLines, endLine),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
startIndex: 0,
|
|
136
|
+
endIndex: totalLines,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
findFileByPath(storageId, path) {
|
|
140
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
141
|
+
const exactMatch = files.find((file) => file.path === path);
|
|
142
|
+
if (exactMatch) {
|
|
143
|
+
return exactMatch;
|
|
144
|
+
}
|
|
145
|
+
const endsWithMatch = files.find((file) => file.path.endsWith(path));
|
|
146
|
+
if (endsWithMatch) {
|
|
147
|
+
return endsWithMatch;
|
|
148
|
+
}
|
|
149
|
+
const includesMatch = files.find((file) => file.path.includes(path));
|
|
150
|
+
return includesMatch ?? null;
|
|
151
|
+
}
|
|
152
|
+
fileNotFoundMessage(storageId, path) {
|
|
153
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
154
|
+
const availablePaths = files
|
|
155
|
+
.map((file) => file.path)
|
|
156
|
+
.join(', ');
|
|
157
|
+
return `File not found: '${path}'. Available files: ${availablePaths}`;
|
|
158
|
+
}
|
|
159
|
+
formatLinesWithNumbers(lines, startLineNumber) {
|
|
160
|
+
const lastLineNumber = startLineNumber + lines.length - 1;
|
|
161
|
+
const maxWidth = String(lastLineNumber).length;
|
|
162
|
+
return lines
|
|
163
|
+
.map((line, index) => {
|
|
164
|
+
const lineNumber = String(startLineNumber + index)
|
|
165
|
+
.padStart(maxWidth, ' ');
|
|
166
|
+
return `${lineNumber}: ${line}`;
|
|
167
|
+
})
|
|
168
|
+
.join('\n');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.FileStorageToolExecutor = FileStorageToolExecutor;
|
|
172
|
+
//# sourceMappingURL=FileStorageToolExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileStorageToolExecutor.js","sourceRoot":"","sources":["../../../src/services/fileStorage/FileStorageToolExecutor.ts"],"names":[],"mappings":"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"}
|