@venturialstd/workflow 0.1.161 → 0.1.163

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.
Files changed (46) hide show
  1. package/dist/modules/chatgpt/actions/chat-completion.action.d.ts +0 -16
  2. package/dist/modules/chatgpt/actions/chat-completion.action.d.ts.map +1 -1
  3. package/dist/modules/chatgpt/actions/chat-completion.action.js +17 -71
  4. package/dist/modules/chatgpt/actions/chat-completion.action.js.map +1 -1
  5. package/dist/modules/chatgpt/actions/chat-purpose.action.d.ts +3 -0
  6. package/dist/modules/chatgpt/actions/chat-purpose.action.d.ts.map +1 -0
  7. package/dist/modules/chatgpt/actions/chat-purpose.action.js +229 -0
  8. package/dist/modules/chatgpt/actions/chat-purpose.action.js.map +1 -0
  9. package/dist/modules/chatgpt/actions/index.d.ts +1 -0
  10. package/dist/modules/chatgpt/actions/index.d.ts.map +1 -1
  11. package/dist/modules/chatgpt/actions/index.js +1 -0
  12. package/dist/modules/chatgpt/actions/index.js.map +1 -1
  13. package/dist/modules/chatgpt/chatgpt-nest.module.d.ts.map +1 -1
  14. package/dist/modules/chatgpt/chatgpt-nest.module.js +2 -0
  15. package/dist/modules/chatgpt/chatgpt-nest.module.js.map +1 -1
  16. package/dist/modules/chatgpt/chatgpt.module.d.ts.map +1 -1
  17. package/dist/modules/chatgpt/chatgpt.module.js +1 -0
  18. package/dist/modules/chatgpt/chatgpt.module.js.map +1 -1
  19. package/dist/modules/chatgpt/services/chat-completion.service.d.ts.map +1 -1
  20. package/dist/modules/chatgpt/services/chat-completion.service.js +15 -43
  21. package/dist/modules/chatgpt/services/chat-completion.service.js.map +1 -1
  22. package/dist/modules/chatgpt/services/chat-purpose.service.d.ts +24 -0
  23. package/dist/modules/chatgpt/services/chat-purpose.service.d.ts.map +1 -0
  24. package/dist/modules/chatgpt/services/chat-purpose.service.js +396 -0
  25. package/dist/modules/chatgpt/services/chat-purpose.service.js.map +1 -0
  26. package/dist/modules/chatgpt/services/index.d.ts +1 -0
  27. package/dist/modules/chatgpt/services/index.d.ts.map +1 -1
  28. package/dist/modules/chatgpt/services/index.js +1 -0
  29. package/dist/modules/chatgpt/services/index.js.map +1 -1
  30. package/dist/modules/chatgpt/types/purpose-memory.types.d.ts +38 -0
  31. package/dist/modules/chatgpt/types/purpose-memory.types.d.ts.map +1 -0
  32. package/dist/modules/chatgpt/types/purpose-memory.types.js +28 -0
  33. package/dist/modules/chatgpt/types/purpose-memory.types.js.map +1 -0
  34. package/dist/modules/chatgpt/utils/purpose-cache-key.util.d.ts +5 -0
  35. package/dist/modules/chatgpt/utils/purpose-cache-key.util.d.ts.map +1 -0
  36. package/dist/modules/chatgpt/utils/purpose-cache-key.util.js +15 -0
  37. package/dist/modules/chatgpt/utils/purpose-cache-key.util.js.map +1 -0
  38. package/dist/modules/chatgpt/utils/purpose-schema.validator.d.ts +2 -0
  39. package/dist/modules/chatgpt/utils/purpose-schema.validator.d.ts.map +1 -0
  40. package/dist/modules/chatgpt/utils/purpose-schema.validator.js +34 -0
  41. package/dist/modules/chatgpt/utils/purpose-schema.validator.js.map +1 -0
  42. package/dist/modules/chatgpt/utils/token-estimate.util.d.ts +7 -0
  43. package/dist/modules/chatgpt/utils/token-estimate.util.d.ts.map +1 -0
  44. package/dist/modules/chatgpt/utils/token-estimate.util.js +20 -0
  45. package/dist/modules/chatgpt/utils/token-estimate.util.js.map +1 -0
  46. package/package.json +3 -2
@@ -0,0 +1,24 @@
1
+ import { ChatGptChatService } from '@venturialstd/chatgpt';
2
+ import { CacheService } from '@venturialstd/core';
3
+ import { IWorkflowActionService, WorkflowActionContext } from '../../types';
4
+ export declare class ChatGptPurposeService implements IWorkflowActionService {
5
+ private readonly chatGptChatService;
6
+ private readonly cacheService;
7
+ constructor(chatGptChatService: ChatGptChatService, cacheService: CacheService);
8
+ perform(inputs: Record<string, unknown>, context: WorkflowActionContext): Promise<Record<string, unknown>>;
9
+ private buildSystemPrompt;
10
+ private parseStructuredResponse;
11
+ private validateCompleteShape;
12
+ private extractAssistantContent;
13
+ private isValidMemory;
14
+ private normalizeMemoryToContent;
15
+ private validateOutputAgainstSchema;
16
+ private safeParseJson;
17
+ private ensureString;
18
+ private buildMetricsFromMemory;
19
+ private buildFailedOutput;
20
+ private isJsonSchema;
21
+ private truncateToTokenBudget;
22
+ private summarizeOldestMessages;
23
+ }
24
+ //# sourceMappingURL=chat-purpose.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-purpose.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/chatgpt/services/chat-purpose.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAe,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA2B5E,qBACa,qBAAsB,YAAW,sBAAsB;IAEhE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY;IAGvC,OAAO,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAgOnC,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,qBAAqB;IAkC7B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,qBAAqB;YAaf,uBAAuB;CAsDtC"}
@@ -0,0 +1,396 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ChatGptPurposeService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const chatgpt_1 = require("@venturialstd/chatgpt");
15
+ const core_1 = require("@venturialstd/core");
16
+ const purpose_memory_types_1 = require("../types/purpose-memory.types");
17
+ const purpose_cache_key_util_1 = require("../utils/purpose-cache-key.util");
18
+ const purpose_schema_validator_1 = require("../utils/purpose-schema.validator");
19
+ const token_estimate_util_1 = require("../utils/token-estimate.util");
20
+ const VALID_STATUSES = [
21
+ purpose_memory_types_1.PURPOSE_STATUS.IN_PROGRESS,
22
+ purpose_memory_types_1.PURPOSE_STATUS.COMPLETED,
23
+ purpose_memory_types_1.PURPOSE_STATUS.FAILED,
24
+ ];
25
+ function isValidStatus(s) {
26
+ return typeof s === 'string' && VALID_STATUSES.includes(s);
27
+ }
28
+ let ChatGptPurposeService = class ChatGptPurposeService {
29
+ chatGptChatService;
30
+ cacheService;
31
+ constructor(chatGptChatService, cacheService) {
32
+ this.chatGptChatService = chatGptChatService;
33
+ this.cacheService = cacheService;
34
+ }
35
+ async perform(inputs, context) {
36
+ const apiKey = context.credentials?.apiKey;
37
+ const baseUrl = context.credentials?.baseUrl || 'https://api.openai.com/v1';
38
+ if (!apiKey) {
39
+ return this.buildFailedOutput('OpenAI API key is required in credentials', null, inputs, context);
40
+ }
41
+ const enableMemoryPersistence = inputs.enableMemoryPersistence === true;
42
+ const memoryKeyInput = this.ensureString(inputs.memoryKey).trim();
43
+ const userIdInput = this.ensureString(inputs.userId).trim();
44
+ const purposeNameInput = this.ensureString(inputs.purposeName).trim();
45
+ if (enableMemoryPersistence) {
46
+ if (!memoryKeyInput) {
47
+ return this.buildFailedOutput('Memory key is required when memory persistence is enabled and must not be empty', null, inputs, context);
48
+ }
49
+ const workflowId = context.workflowId?.trim();
50
+ if (!workflowId) {
51
+ return this.buildFailedOutput('workflowId is required in context for Redis key (workflow:workflowId:...) when memory persistence is enabled', null, inputs, context);
52
+ }
53
+ }
54
+ const memoryKey = enableMemoryPersistence
55
+ ? (0, purpose_cache_key_util_1.buildPurposeCacheKey)(context.workflowId, memoryKeyInput, {
56
+ userId: userIdInput || undefined,
57
+ purposeName: purposeNameInput || undefined,
58
+ })
59
+ : '';
60
+ const incomingMessage = this.ensureString(inputs.incomingUserMessage);
61
+ const systemPrompt = this.ensureString(inputs.systemPrompt)?.trim() || '';
62
+ const memoryTimeMinutes = Math.max(1, Math.min(43200, Number(inputs.memoryTimePersistenceMinutes) || 60));
63
+ const ttlSeconds = memoryTimeMinutes * 60;
64
+ const expectedOutputSchemaJson = inputs.expectedOutputSchema;
65
+ const expectedOutputSchema = typeof expectedOutputSchemaJson === 'string'
66
+ ? this.safeParseJson(expectedOutputSchemaJson)
67
+ : expectedOutputSchemaJson;
68
+ let memory = null;
69
+ if (enableMemoryPersistence && memoryKey) {
70
+ const raw = await this.cacheService.get(memoryKey);
71
+ if (raw && this.isValidMemory(raw)) {
72
+ memory = this.normalizeMemoryToContent(raw);
73
+ }
74
+ }
75
+ if (!memory) {
76
+ const now = Date.now();
77
+ memory = {
78
+ messages: [],
79
+ status: purpose_memory_types_1.PURPOSE_STATUS.IN_PROGRESS,
80
+ collectedData: {},
81
+ updatedAt: now,
82
+ startedAt: now,
83
+ };
84
+ }
85
+ if (incomingMessage !== '') {
86
+ memory.messages.push({ role: 'user', content: incomingMessage });
87
+ }
88
+ const maxContextTokens = Math.max(1000, Math.min(120000, Number(inputs.maxContextTokens) || purpose_memory_types_1.DEFAULT_MAX_CONTEXT_TOKENS));
89
+ const enableSummarization = inputs.enableConversationSummarization !== false;
90
+ const summarizationTrigger = Math.max(6, Math.min(50, Number(inputs.summarizationTriggerMessageCount) || purpose_memory_types_1.DEFAULT_SUMMARIZATION_TRIGGER_MESSAGE_COUNT));
91
+ if (enableSummarization && memory.messages.length >= summarizationTrigger) {
92
+ memory = await this.summarizeOldestMessages(memory, summarizationTrigger, {
93
+ apiKey,
94
+ baseUrl,
95
+ model: inputs.model || 'gpt-4o',
96
+ });
97
+ }
98
+ const systemContent = this.buildSystemPrompt(systemPrompt, expectedOutputSchema, memory.collectedData);
99
+ const systemTokens = (0, token_estimate_util_1.estimateTokens)(systemContent);
100
+ memory.messages = this.truncateToTokenBudget(memory.messages, maxContextTokens - systemTokens - 256, purpose_memory_types_1.DEFAULT_MAX_MEMORY_MESSAGES);
101
+ const apiMessages = [{ role: 'system', content: systemContent }];
102
+ for (const m of memory.messages) {
103
+ const role = m.role === 'system' ? 'user' : m.role;
104
+ apiMessages.push({ role: role, content: m.content });
105
+ }
106
+ const model = inputs.model || 'gpt-4o';
107
+ const temperature = Math.max(0, Math.min(2, Number(inputs.temperature) || 0.3));
108
+ const maxTokens = Math.max(100, Math.min(4000, Number(inputs.maxTokens) || 2000));
109
+ let completionContent;
110
+ try {
111
+ const completionOptions = {
112
+ model,
113
+ temperature,
114
+ maxTokens,
115
+ store: false,
116
+ apiKey,
117
+ baseUrl,
118
+ responseFormatJson: true,
119
+ };
120
+ const completion = await this.chatGptChatService.createChatCompletion(completionOptions, apiMessages);
121
+ completionContent = completion.choices[0]?.message?.content?.trim() || '';
122
+ }
123
+ catch (err) {
124
+ const message = err instanceof Error ? err.message : 'Unknown error calling model';
125
+ return this.buildFailedOutput(message, memoryKey, inputs, context);
126
+ }
127
+ if (!completionContent) {
128
+ return this.buildFailedOutput('Model returned empty response', memoryKey, inputs, context);
129
+ }
130
+ const parsed = this.parseStructuredResponse(completionContent);
131
+ if (!parsed) {
132
+ return this.buildFailedOutput('Invalid JSON or missing result from model', memoryKey, inputs, context);
133
+ }
134
+ const shapeError = this.validateCompleteShape(parsed);
135
+ if (shapeError) {
136
+ return this.buildFailedOutput(shapeError, memoryKey, inputs, context, this.buildMetricsFromMemory(memory), memory.collectedData);
137
+ }
138
+ const status = parsed.result.status;
139
+ const output = parsed.result.output;
140
+ if (status === purpose_memory_types_1.PURPOSE_STATUS.COMPLETED && expectedOutputSchema && typeof expectedOutputSchema === 'object') {
141
+ const schemaObj = expectedOutputSchema;
142
+ const schemaError = this.isJsonSchema(schemaObj) ?
143
+ (0, purpose_schema_validator_1.validateWithJsonSchema)(output, schemaObj)
144
+ : this.validateOutputAgainstSchema(output, schemaObj);
145
+ if (schemaError) {
146
+ return this.buildFailedOutput(`Output schema mismatch: ${schemaError}`, memoryKey, inputs, context, this.buildMetricsFromMemory(memory), memory.collectedData);
147
+ }
148
+ }
149
+ const assistantContent = this.extractAssistantContent(parsed);
150
+ if (assistantContent === null) {
151
+ return this.buildFailedOutput('Model must return non-empty messages array with at least one assistant content', memoryKey, inputs, context, this.buildMetricsFromMemory(memory), memory.collectedData);
152
+ }
153
+ memory.messages.push({ role: 'assistant', content: assistantContent });
154
+ if (memory.messages.length > purpose_memory_types_1.DEFAULT_MAX_MEMORY_MESSAGES) {
155
+ memory.messages = memory.messages.slice(-purpose_memory_types_1.DEFAULT_MAX_MEMORY_MESSAGES);
156
+ }
157
+ memory.status = status;
158
+ memory.collectedData = { ...memory.collectedData, ...output };
159
+ memory.updatedAt = Date.now();
160
+ if (enableMemoryPersistence && memoryKey) {
161
+ await this.cacheService.set(memoryKey, memory, undefined, ttlSeconds);
162
+ }
163
+ const startedAt = memory.startedAt ?? memory.updatedAt;
164
+ const metrics = {
165
+ conversationDurationMs: Math.max(0, memory.updatedAt - startedAt),
166
+ messageCount: memory.messages.length,
167
+ completed: status === purpose_memory_types_1.PURPOSE_STATUS.COMPLETED,
168
+ ...(status === purpose_memory_types_1.PURPOSE_STATUS.COMPLETED && { completedAt: memory.updatedAt }),
169
+ };
170
+ return {
171
+ messages: memory.messages.map((m) => ({ role: m.role, content: m.content })),
172
+ result: {
173
+ status,
174
+ output: status === purpose_memory_types_1.PURPOSE_STATUS.COMPLETED ? output : { ...memory.collectedData },
175
+ },
176
+ memoryKey: memoryKey || undefined,
177
+ collectedData: memory.collectedData,
178
+ lastAssistantMessage: assistantContent,
179
+ metrics,
180
+ };
181
+ }
182
+ buildSystemPrompt(userSystemPrompt, expectedOutputSchema, collectedData) {
183
+ const parts = [];
184
+ if (userSystemPrompt) {
185
+ parts.push(userSystemPrompt);
186
+ }
187
+ if (Object.keys(collectedData).length > 0) {
188
+ parts.push('\nAlready collected data (merge new fields into this; do not repeat):', JSON.stringify(collectedData, null, 2));
189
+ }
190
+ if (expectedOutputSchema != null && typeof expectedOutputSchema === 'object') {
191
+ parts.push('\nExpected output schema (when you set status to COMPLETED, "output" must match this shape):', JSON.stringify(expectedOutputSchema, null, 2));
192
+ }
193
+ parts.push('\n\n' + purpose_memory_types_1.PURPOSE_RESPONSE_SCHEMA_INSTRUCTION);
194
+ return parts.join('\n');
195
+ }
196
+ parseStructuredResponse(raw) {
197
+ const cleaned = raw.replace(/^```json\s*/i, '').replace(/\s*```\s*$/i, '').trim();
198
+ const parsed = this.safeParseJson(cleaned);
199
+ if (!parsed || typeof parsed !== 'object')
200
+ return null;
201
+ const result = parsed.result;
202
+ if (!result || typeof result !== 'object')
203
+ return null;
204
+ const status = result.status;
205
+ const output = result.output;
206
+ if (output !== null && typeof output === 'object' && !Array.isArray(output)) {
207
+ return {
208
+ messages: parsed.messages,
209
+ result: { status, output: output },
210
+ };
211
+ }
212
+ return null;
213
+ }
214
+ validateCompleteShape(parsed) {
215
+ if (!parsed.result || typeof parsed.result !== 'object') {
216
+ return 'Missing or invalid result';
217
+ }
218
+ if (!isValidStatus(parsed.result.status)) {
219
+ return `Invalid status: ${parsed.result.status}`;
220
+ }
221
+ const output = parsed.result.output;
222
+ if (output === null || output === undefined) {
223
+ return 'result.output must be an object, not null or undefined';
224
+ }
225
+ if (typeof output !== 'object' || Array.isArray(output)) {
226
+ return 'result.output must be a plain object';
227
+ }
228
+ if (!Array.isArray(parsed.messages) || parsed.messages.length === 0) {
229
+ return 'messages must be a non-empty array';
230
+ }
231
+ for (let i = 0; i < parsed.messages.length; i++) {
232
+ const m = parsed.messages[i];
233
+ if (!m || typeof m !== 'object') {
234
+ return `messages[${i}] must be an object with role and content`;
235
+ }
236
+ if (typeof m.role !== 'string') {
237
+ return `messages[${i}].role must be a string`;
238
+ }
239
+ const content = m.content;
240
+ if (typeof content !== 'string' || content.trim() === '') {
241
+ return `messages[${i}].content must be a non-empty string`;
242
+ }
243
+ }
244
+ return null;
245
+ }
246
+ extractAssistantContent(parsed) {
247
+ const messages = parsed.messages;
248
+ if (!Array.isArray(messages) || messages.length === 0)
249
+ return null;
250
+ const last = messages[messages.length - 1];
251
+ if (!last || typeof last !== 'object')
252
+ return null;
253
+ const content = last.content;
254
+ if (typeof content !== 'string' || content.trim() === '')
255
+ return null;
256
+ return content.trim();
257
+ }
258
+ isValidMemory(raw) {
259
+ if (!raw || typeof raw !== 'object')
260
+ return false;
261
+ const o = raw;
262
+ if (!Array.isArray(o.messages))
263
+ return false;
264
+ if (!VALID_STATUSES.includes(o.status))
265
+ return false;
266
+ if (typeof o.collectedData !== 'object' || o.collectedData === null)
267
+ return false;
268
+ if (typeof o.updatedAt !== 'number')
269
+ return false;
270
+ return true;
271
+ }
272
+ normalizeMemoryToContent(raw) {
273
+ return {
274
+ ...raw,
275
+ messages: raw.messages.map((m) => {
276
+ const msg = m;
277
+ const content = typeof msg.content === 'string' ? msg.content : msg.message ?? '';
278
+ return { role: m.role, content };
279
+ }),
280
+ };
281
+ }
282
+ validateOutputAgainstSchema(output, schema) {
283
+ if (schema.properties && typeof schema.properties === 'object') {
284
+ const required = schema.required || [];
285
+ for (const key of required) {
286
+ if (!(key in output)) {
287
+ return `Missing required field: ${key}`;
288
+ }
289
+ }
290
+ }
291
+ return null;
292
+ }
293
+ safeParseJson(value) {
294
+ try {
295
+ return JSON.parse(value);
296
+ }
297
+ catch {
298
+ return undefined;
299
+ }
300
+ }
301
+ ensureString(v) {
302
+ if (v == null)
303
+ return '';
304
+ if (typeof v === 'string')
305
+ return v;
306
+ return String(v);
307
+ }
308
+ buildMetricsFromMemory(memory) {
309
+ const startedAt = memory.startedAt ?? memory.updatedAt;
310
+ return {
311
+ conversationDurationMs: Math.max(0, memory.updatedAt - startedAt),
312
+ messageCount: memory.messages.length,
313
+ completed: false,
314
+ };
315
+ }
316
+ buildFailedOutput(errorMessage, memoryKey, inputs, context, metrics, collectedData) {
317
+ const status = purpose_memory_types_1.PURPOSE_STATUS.FAILED;
318
+ const output = collectedData && Object.keys(collectedData).length > 0 ? { ...collectedData } : {};
319
+ return {
320
+ messages: [],
321
+ result: { status, output },
322
+ memoryKey: memoryKey ?? undefined,
323
+ collectedData: output,
324
+ lastAssistantMessage: '',
325
+ metrics: {
326
+ conversationDurationMs: 0,
327
+ messageCount: 0,
328
+ completed: false,
329
+ ...metrics,
330
+ },
331
+ error: true,
332
+ errorMessage,
333
+ };
334
+ }
335
+ isJsonSchema(schema) {
336
+ return (typeof schema.type === 'string' ||
337
+ typeof schema.$schema === 'string' ||
338
+ (typeof schema.properties === 'object' && schema.properties !== null));
339
+ }
340
+ truncateToTokenBudget(messages, maxTokens, maxMessages) {
341
+ let out = messages.length > maxMessages ? messages.slice(-maxMessages) : [...messages];
342
+ while (out.length > 0 && (0, token_estimate_util_1.estimateMessagesTokens)(out) > maxTokens) {
343
+ out = out.slice(1);
344
+ }
345
+ return out;
346
+ }
347
+ async summarizeOldestMessages(memory, triggerCount, options) {
348
+ const toSummarizeCount = Math.min(triggerCount, Math.floor(memory.messages.length / 2));
349
+ if (toSummarizeCount < 2)
350
+ return memory;
351
+ const toSummarize = memory.messages.slice(0, toSummarizeCount);
352
+ const rest = memory.messages.slice(toSummarizeCount);
353
+ const conversationText = toSummarize
354
+ .map((m) => `${m.role}: ${m.content}`)
355
+ .join('\n');
356
+ const summaryPrompt = [
357
+ {
358
+ role: 'system',
359
+ content: 'Summarize the following conversation in 2-4 short sentences. Preserve key facts, collected data, and user answers. Output only the summary, no preamble.',
360
+ },
361
+ { role: 'user', content: conversationText },
362
+ ];
363
+ try {
364
+ const completionOptions = {
365
+ model: options.model,
366
+ temperature: 0.2,
367
+ maxTokens: 300,
368
+ store: false,
369
+ apiKey: options.apiKey,
370
+ baseUrl: options.baseUrl,
371
+ responseFormatJson: false,
372
+ };
373
+ const completion = await this.chatGptChatService.createChatCompletion(completionOptions, summaryPrompt);
374
+ const summary = completion.choices[0]?.message?.content?.trim() || '[Conversation summary unavailable]';
375
+ const summaryMessage = {
376
+ role: 'assistant',
377
+ content: `[Previous conversation summary]: ${summary}`,
378
+ };
379
+ return {
380
+ ...memory,
381
+ messages: [summaryMessage, ...rest],
382
+ updatedAt: Date.now(),
383
+ };
384
+ }
385
+ catch {
386
+ return memory;
387
+ }
388
+ }
389
+ };
390
+ exports.ChatGptPurposeService = ChatGptPurposeService;
391
+ exports.ChatGptPurposeService = ChatGptPurposeService = __decorate([
392
+ (0, common_1.Injectable)(),
393
+ __metadata("design:paramtypes", [chatgpt_1.ChatGptChatService,
394
+ core_1.CacheService])
395
+ ], ChatGptPurposeService);
396
+ //# sourceMappingURL=chat-purpose.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-purpose.service.js","sourceRoot":"","sources":["../../../../src/modules/chatgpt/services/chat-purpose.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,mDAAwE;AACxE,6CAAkD;AAGlD,wEAWuC;AACvC,4EAAuE;AACvE,gFAA2E;AAC3E,sEAAsF;AAEtF,MAAM,cAAc,GAAoB;IACtC,qCAAc,CAAC,WAAW;IAC1B,qCAAc,CAAC,SAAS;IACxB,qCAAc,CAAC,MAAM;CACtB,CAAC;AAEF,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAkB,CAAC,CAAC;AAC9E,CAAC;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAEb;IACA;IAFnB,YACmB,kBAAsC,EACtC,YAA0B;QAD1B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,iBAAY,GAAZ,YAAY,CAAc;IAC1C,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,MAA+B,EAC/B,OAA8B;QAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,MAAgB,CAAC;QACrD,MAAM,OAAO,GAAI,OAAO,CAAC,WAAW,EAAE,OAAkB,IAAI,2BAA2B,CAAC;QACxF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,iBAAiB,CAAC,2CAA2C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,KAAK,IAAI,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAEtE,IAAI,uBAAuB,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC,iBAAiB,CAC3B,iFAAiF,EACjF,IAAI,EACJ,MAAM,EACN,OAAO,CACR,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,iBAAiB,CAC3B,8GAA8G,EAC9G,IAAI,EACJ,MAAM,EACN,OAAO,CACR,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,uBAAuB;YACvC,CAAC,CAAC,IAAA,6CAAoB,EAAC,OAAO,CAAC,UAAW,EAAE,cAAc,EAAE;gBACxD,MAAM,EAAE,WAAW,IAAI,SAAS;gBAChC,WAAW,EAAE,gBAAgB,IAAI,SAAS;aAC3C,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC1E,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1G,MAAM,UAAU,GAAG,iBAAiB,GAAG,EAAE,CAAC;QAC1C,MAAM,wBAAwB,GAAG,MAAM,CAAC,oBAAmD,CAAC;QAC5F,MAAM,oBAAoB,GACxB,OAAO,wBAAwB,KAAK,QAAQ;YAC1C,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC;YAC9C,CAAC,CAAC,wBAAwB,CAAC;QAG/B,IAAI,MAAM,GAAqC,IAAI,CAAC;QACpD,IAAI,uBAAuB,IAAI,SAAS,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAmC,SAAS,CAAC,CAAC;YACrF,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG;gBACP,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,qCAAc,CAAC,WAAW;gBAClC,aAAa,EAAE,EAAE;gBACjB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC;QACJ,CAAC;QAGD,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,iDAA0B,CAAC,CAAC,CAAC;QACzH,MAAM,mBAAmB,GAAG,MAAM,CAAC,+BAA+B,KAAK,KAAK,CAAC;QAC7E,MAAM,oBAAoB,GACxB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,IAAI,kEAA2C,CAAC,CAAC,CAAC;QAG5H,IAAI,mBAAmB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;YAC1E,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,EAAE;gBACxE,MAAM;gBACN,OAAO;gBACP,KAAK,EAAG,MAAM,CAAC,KAAgB,IAAI,QAAQ;aAC5C,CAAC,CAAC;QACL,CAAC;QAGD,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,oBAAoB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACvG,MAAM,YAAY,GAAG,IAAA,oCAAc,EAAC,aAAa,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAC1C,MAAM,CAAC,QAAQ,EACf,gBAAgB,GAAG,YAAY,GAAG,GAAG,EACrC,kDAA2B,CAC5B,CAAC;QAGF,MAAM,WAAW,GAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QAEhF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAA4B,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,KAAK,GAAI,MAAM,CAAC,KAAgB,IAAI,QAAQ,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAElF,IAAI,iBAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG;gBACxB,KAAK;gBACL,WAAW;gBACX,SAAS;gBACT,KAAK,EAAE,KAAK;gBACZ,MAAM;gBACN,OAAO;gBACP,kBAAkB,EAAE,IAAI;aACzB,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CACnE,iBAA8E,EAC9E,WAAW,CACZ,CAAC;YACF,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YACnF,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC,+BAA+B,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7F,CAAC;QAGD,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,iBAAiB,CAAC,2CAA2C,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,iBAAiB,CAC3B,UAAU,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EACnC,MAAM,CAAC,aAAa,CACrB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAuB,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAGpC,IAAI,MAAM,KAAK,qCAAc,CAAC,SAAS,IAAI,oBAAoB,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE,CAAC;YAC5G,MAAM,SAAS,GAAG,oBAA+C,CAAC;YAClE,MAAM,WAAW,GACf,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC5B,IAAA,iDAAsB,EAAC,MAAM,EAAE,SAAS,CAAC;gBAC3C,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,iBAAiB,CAC3B,2BAA2B,WAAW,EAAE,EACxC,SAAS,EACT,MAAM,EACN,OAAO,EACP,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EACnC,MAAM,CAAC,aAAa,CACrB,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,iBAAiB,CAC3B,gFAAgF,EAChF,SAAS,EACT,MAAM,EACN,OAAO,EACP,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EACnC,MAAM,CAAC,aAAa,CACrB,CAAC;QACJ,CAAC;QAGD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACvE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,kDAA2B,EAAE,CAAC;YACzD,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,kDAA2B,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAEvB,MAAM,CAAC,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;QAC9D,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE9B,IAAI,uBAAuB,IAAI,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACxE,CAAC;QAGD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;QACvD,MAAM,OAAO,GAAmB;YAC9B,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YACjE,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YACpC,SAAS,EAAE,MAAM,KAAK,qCAAc,CAAC,SAAS;YAC9C,GAAG,CAAC,MAAM,KAAK,qCAAc,CAAC,SAAS,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;SAC9E,CAAC;QAGF,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,MAAM,EAAE;gBACN,MAAM;gBACN,MAAM,EAAE,MAAM,KAAK,qCAAc,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,EAAE;aACnF;YACD,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,oBAAoB,EAAE,gBAAgB;YACtC,OAAO;SACR,CAAC;IACJ,CAAC;IAEO,iBAAiB,CACvB,gBAAwB,EACxB,oBAA6B,EAC7B,aAAsC;QAEtC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,gBAAgB,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CACR,uEAAuE,EACvE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CACvC,CAAC;QACJ,CAAC;QACD,IAAI,oBAAoB,IAAI,IAAI,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE,CAAC;YAC7E,KAAK,CAAC,IAAI,CACR,8FAA8F,EAC9F,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,CAC9C,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,0DAAmC,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,uBAAuB,CAAC,GAAW;QACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,MAAM,GAAI,MAAkC,CAAC,MAAM,CAAC;QAC1D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,MAAM,GAAI,MAAkC,CAAC,MAAM,CAAC;QAC1D,MAAM,MAAM,GAAI,MAAkC,CAAC,MAAM,CAAC;QAC1D,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5E,OAAO;gBACL,QAAQ,EAAG,MAAkC,CAAC,QAAiD;gBAC/F,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAiC,EAAE;aACjC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAGO,qBAAqB,CAAC,MAAiC;QAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxD,OAAO,2BAA2B,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO,mBAAmB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,wDAAwD,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,OAAO,sCAAsC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,oCAAoC,CAAC;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,YAAY,CAAC,2CAA2C,CAAC;YAClE,CAAC;YACD,IAAI,OAAQ,CAAwB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,YAAY,CAAC,yBAAyB,CAAC;YAChD,CAAC;YACD,MAAM,OAAO,GAAI,CAA2B,CAAC,OAAO,CAAC;YACrD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzD,OAAO,YAAY,CAAC,sCAAsC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAGO,uBAAuB,CAAC,MAAiC;QAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnD,MAAM,OAAO,GAAI,IAA6B,CAAC,OAAO,CAAC;QACvD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QACtE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAEO,aAAa,CAAC,GAAY;QAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,CAAC,GAAG,GAA8B,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAuB,CAAC;YAAE,OAAO,KAAK,CAAC;QACtE,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAClF,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAGO,wBAAwB,CAAC,GAA8B;QAC7D,OAAO;YACL,GAAG,GAAG;YACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/B,MAAM,GAAG,GAAG,CAAyD,CAAC;gBACtE,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClF,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACnC,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IAEO,2BAA2B,CACjC,MAA+B,EAC/B,MAA+B;QAE/B,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAI,MAAM,CAAC,QAAiC,IAAI,EAAE,CAAC;YACjE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;oBACrB,OAAO,2BAA2B,GAAG,EAAE,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,CAAU;QAC7B,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAEO,sBAAsB,CAAC,MAAiC;QAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;QACvD,OAAO;YACL,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YACjE,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YACpC,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAEO,iBAAiB,CACvB,YAAoB,EACpB,SAAwB,EACxB,MAA+B,EAC/B,OAA8B,EAC9B,OAAiC,EACjC,aAAuC;QAEvC,MAAM,MAAM,GAAG,qCAAc,CAAC,MAAM,CAAC;QACrC,MAAM,MAAM,GAAG,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;YAC1B,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,aAAa,EAAE,MAAM;YACrB,oBAAoB,EAAE,EAAE;YACxB,OAAO,EAAE;gBACP,sBAAsB,EAAE,CAAC;gBACzB,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,KAAK;gBAChB,GAAG,OAAO;aACO;YACnB,KAAK,EAAE,IAAI;YACX,YAAY;SACb,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,MAA+B;QAClD,OAAO,CACL,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAClC,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CACtE,CAAC;IACJ,CAAC;IAGO,qBAAqB,CAC3B,QAAsC,EACtC,SAAiB,EACjB,WAAmB;QAEnB,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvF,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,IAAA,4CAAsB,EAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC;YACjE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAGO,KAAK,CAAC,uBAAuB,CACnC,MAAiC,EACjC,YAAoB,EACpB,OAA2D;QAE3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,gBAAgB,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QAExC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAG,WAAW;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACrC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,aAAa,GAAkB;YACnC;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EACL,0JAA0J;aAC7J;YACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE;SAC5C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,GAAG;gBACd,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,kBAAkB,EAAE,KAAK;aAC1B,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CACnE,iBAA8E,EAC9E,aAAa,CACd,CAAC;YACF,MAAM,OAAO,GACX,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,oCAAoC,CAAC;YAE1F,MAAM,cAAc,GAA+B;gBACjD,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,oCAAoC,OAAO,EAAE;aACvD,CAAC;YAEF,OAAO;gBACL,GAAG,MAAM;gBACT,QAAQ,EAAE,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;CACF,CAAA;AAneY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAG4B,4BAAkB;QACxB,mBAAY;GAHlC,qBAAqB,CAmejC"}
@@ -1,4 +1,5 @@
1
1
  export * from './chat-completion.service';
2
+ export * from './chat-purpose.service';
2
3
  export * from './create-embedding.service';
3
4
  export * from './generate-image.service';
4
5
  export * from './speech-to-text.service';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/chatgpt/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/chatgpt/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC"}
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./chat-completion.service"), exports);
18
+ __exportStar(require("./chat-purpose.service"), exports);
18
19
  __exportStar(require("./create-embedding.service"), exports);
19
20
  __exportStar(require("./generate-image.service"), exports);
20
21
  __exportStar(require("./speech-to-text.service"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chatgpt/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,6DAA2C;AAC3C,2DAAyC;AACzC,2DAAyC;AACzC,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/chatgpt/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,yDAAuC;AACvC,6DAA2C;AAC3C,2DAAyC;AACzC,2DAAyC;AACzC,2DAAyC"}
@@ -0,0 +1,38 @@
1
+ export declare const PURPOSE_STATUS: {
2
+ readonly IN_PROGRESS: "IN_PROGRESS";
3
+ readonly COMPLETED: "COMPLETED";
4
+ readonly FAILED: "FAILED";
5
+ };
6
+ export type PurposeStatus = (typeof PURPOSE_STATUS)[keyof typeof PURPOSE_STATUS];
7
+ export interface PurposeConversationMessage {
8
+ role: 'user' | 'assistant' | 'system';
9
+ content: string;
10
+ }
11
+ export interface PurposeConversationMemory {
12
+ messages: PurposeConversationMessage[];
13
+ status: PurposeStatus;
14
+ collectedData: Record<string, unknown>;
15
+ updatedAt: number;
16
+ startedAt?: number;
17
+ }
18
+ export interface PurposeMetrics {
19
+ conversationDurationMs: number;
20
+ messageCount: number;
21
+ completed: boolean;
22
+ completedAt?: number;
23
+ }
24
+ export declare const DEFAULT_MAX_MEMORY_MESSAGES = 30;
25
+ export declare const DEFAULT_MAX_CONTEXT_TOKENS = 6000;
26
+ export declare const DEFAULT_SUMMARIZATION_TRIGGER_MESSAGE_COUNT = 14;
27
+ export interface PurposeStructuredResponse {
28
+ messages: Array<{
29
+ role: string;
30
+ content: string;
31
+ }>;
32
+ result: {
33
+ status: PurposeStatus;
34
+ output: Record<string, unknown>;
35
+ };
36
+ }
37
+ export declare const PURPOSE_RESPONSE_SCHEMA_INSTRUCTION: string;
38
+ //# sourceMappingURL=purpose-memory.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose-memory.types.d.ts","sourceRoot":"","sources":["../../../../src/modules/chatgpt/types/purpose-memory.types.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,cAAc;IAE7B,sBAAsB,EAAE,MAAM,CAAC;IAE/B,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,OAAO,CAAC;IAEnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,eAAO,MAAM,2CAA2C,KAAK,CAAC;AAG9D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,EAAE;QACN,MAAM,EAAE,aAAa,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;CACH;AAED,eAAO,MAAM,mCAAmC,QAexC,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PURPOSE_RESPONSE_SCHEMA_INSTRUCTION = exports.DEFAULT_SUMMARIZATION_TRIGGER_MESSAGE_COUNT = exports.DEFAULT_MAX_CONTEXT_TOKENS = exports.DEFAULT_MAX_MEMORY_MESSAGES = exports.PURPOSE_STATUS = void 0;
4
+ exports.PURPOSE_STATUS = {
5
+ IN_PROGRESS: 'IN_PROGRESS',
6
+ COMPLETED: 'COMPLETED',
7
+ FAILED: 'FAILED',
8
+ };
9
+ exports.DEFAULT_MAX_MEMORY_MESSAGES = 30;
10
+ exports.DEFAULT_MAX_CONTEXT_TOKENS = 6000;
11
+ exports.DEFAULT_SUMMARIZATION_TRIGGER_MESSAGE_COUNT = 14;
12
+ exports.PURPOSE_RESPONSE_SCHEMA_INSTRUCTION = `
13
+ You must respond with a valid JSON object only, no other text. Use this exact structure (strict contract):
14
+ {
15
+ "messages": [{"role": "assistant", "content": "your reply to the user here"}],
16
+ "result": {
17
+ "status": "IN_PROGRESS" | "COMPLETED" | "FAILED",
18
+ "output": {}
19
+ }
20
+ }
21
+ - "messages": MUST be a non-empty array. Include at least one assistant message with "role": "assistant" and "content": your reply (non-empty string).
22
+ - "result.output": MUST always be an object. Use {} for IN_PROGRESS or FAILED; use the full collected data object for COMPLETED.
23
+ - status IN_PROGRESS: continue the conversation; output can be {} or partial collected data.
24
+ - status COMPLETED: you have all required data; set "output" to the complete collected data object matching the expected schema.
25
+ - status FAILED: abort; "output" can be {} or {"reason": "..."}.
26
+ - When status is COMPLETED, "output" must match the expected output schema provided in the system prompt.
27
+ `.trim();
28
+ //# sourceMappingURL=purpose-memory.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose-memory.types.js","sourceRoot":"","sources":["../../../../src/modules/chatgpt/types/purpose-memory.types.ts"],"names":[],"mappings":";;;AAKa,QAAA,cAAc,GAAG;IAC5B,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;CACR,CAAC;AA8BE,QAAA,2BAA2B,GAAG,EAAE,CAAC;AAEjC,QAAA,0BAA0B,GAAG,IAAI,CAAC;AAElC,QAAA,2CAA2C,GAAG,EAAE,CAAC;AAWjD,QAAA,mCAAmC,GAAG;;;;;;;;;;;;;;;CAelD,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function buildPurposeCacheKey(workflowId: string, memoryKey: string, options?: {
2
+ userId?: string;
3
+ purposeName?: string;
4
+ }): string;
5
+ //# sourceMappingURL=purpose-cache-key.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose-cache-key.util.d.ts","sourceRoot":"","sources":["../../../../src/modules/chatgpt/utils/purpose-cache-key.util.ts"],"names":[],"mappings":"AAQA,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAClD,MAAM,CAQR"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildPurposeCacheKey = buildPurposeCacheKey;
4
+ function buildPurposeCacheKey(workflowId, memoryKey, options) {
5
+ const parts = ['workflow', workflowId];
6
+ const userId = options?.userId?.trim();
7
+ const purposeName = options?.purposeName?.trim();
8
+ if (userId)
9
+ parts.push(userId);
10
+ if (purposeName)
11
+ parts.push(purposeName);
12
+ parts.push(memoryKey);
13
+ return parts.join(':');
14
+ }
15
+ //# sourceMappingURL=purpose-cache-key.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose-cache-key.util.js","sourceRoot":"","sources":["../../../../src/modules/chatgpt/utils/purpose-cache-key.util.ts"],"names":[],"mappings":";;AAQA,oDAYC;AAZD,SAAgB,oBAAoB,CAClC,UAAkB,EAClB,SAAiB,EACjB,OAAmD;IAEnD,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateWithJsonSchema(data: unknown, schema: Record<string, unknown>): string | null;
2
+ //# sourceMappingURL=purpose-schema.validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose-schema.validator.d.ts","sourceRoot":"","sources":["../../../../src/modules/chatgpt/utils/purpose-schema.validator.ts"],"names":[],"mappings":"AASA,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,GAAG,IAAI,CAcf"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateWithJsonSchema = validateWithJsonSchema;
7
+ const ajv_1 = __importDefault(require("ajv"));
8
+ const ajv = new ajv_1.default({ allErrors: true, strict: false });
9
+ function validateWithJsonSchema(data, schema) {
10
+ if (schema == null || typeof schema !== 'object')
11
+ return null;
12
+ try {
13
+ const normalized = normalizeSchema(schema);
14
+ const validate = ajv.compile(normalized);
15
+ const valid = validate(data);
16
+ if (valid)
17
+ return null;
18
+ const errors = validate.errors;
19
+ if (!errors || errors.length === 0)
20
+ return 'Validation failed';
21
+ return errors.map((e) => `${e.instancePath || '/'} ${e.message}`).join('; ');
22
+ }
23
+ catch (err) {
24
+ return err instanceof Error ? err.message : 'Schema validation error';
25
+ }
26
+ }
27
+ function normalizeSchema(schema) {
28
+ const out = { ...schema };
29
+ if (!out.type && (out.properties || out.required)) {
30
+ out.type = 'object';
31
+ }
32
+ return out;
33
+ }
34
+ //# sourceMappingURL=purpose-schema.validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purpose-schema.validator.js","sourceRoot":"","sources":["../../../../src/modules/chatgpt/utils/purpose-schema.validator.ts"],"names":[],"mappings":";;;;;AASA,wDAiBC;AA1BD,8CAAsB;AAEtB,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAOxD,SAAgB,sBAAsB,CACpC,IAAa,EACb,MAA+B;IAE/B,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,mBAAmB,CAAC;QAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B;IACtD,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function estimateTokens(text: string): number;
2
+ export declare function estimateMessagesTokens(messages: Array<{
3
+ role?: string;
4
+ content?: string;
5
+ message?: string;
6
+ }>): number;
7
+ //# sourceMappingURL=token-estimate.util.d.ts.map