@memberjunction/query-gen 3.4.0 → 4.1.0
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/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +54 -0
- package/README.md +30 -2
- package/dist/cli/commands/export.js +35 -65
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +114 -115
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/validate.js +40 -70
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/config.d.ts +1 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +8 -7
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +11 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/core/EntityGrouper.d.ts +5 -2
- package/dist/core/EntityGrouper.d.ts.map +1 -1
- package/dist/core/EntityGrouper.js +94 -39
- package/dist/core/EntityGrouper.js.map +1 -1
- package/dist/core/MetadataExporter.d.ts +2 -2
- package/dist/core/MetadataExporter.js +9 -36
- package/dist/core/MetadataExporter.js.map +1 -1
- package/dist/core/QueryDatabaseWriter.d.ts +1 -1
- package/dist/core/QueryDatabaseWriter.js +8 -12
- package/dist/core/QueryDatabaseWriter.js.map +1 -1
- package/dist/core/QueryFixer.d.ts +2 -2
- package/dist/core/QueryFixer.js +11 -17
- package/dist/core/QueryFixer.js.map +1 -1
- package/dist/core/QueryRefiner.d.ts +3 -3
- package/dist/core/QueryRefiner.js +22 -29
- package/dist/core/QueryRefiner.js.map +1 -1
- package/dist/core/QueryTester.d.ts +2 -2
- package/dist/core/QueryTester.js +11 -44
- package/dist/core/QueryTester.js.map +1 -1
- package/dist/core/QueryWriter.d.ts +2 -2
- package/dist/core/QueryWriter.js +12 -18
- package/dist/core/QueryWriter.js.map +1 -1
- package/dist/core/QuestionGenerator.d.ts +2 -2
- package/dist/core/QuestionGenerator.js +16 -22
- package/dist/core/QuestionGenerator.js.map +1 -1
- package/dist/data/schema.js +1 -2
- package/dist/data/schema.js.map +1 -1
- package/dist/index.d.ts +18 -18
- package/dist/index.js +18 -59
- package/dist/index.js.map +1 -1
- package/dist/prompts/PromptNames.js +5 -8
- package/dist/prompts/PromptNames.js.map +1 -1
- package/dist/utils/category-builder.d.ts +2 -2
- package/dist/utils/category-builder.js +2 -7
- package/dist/utils/category-builder.js.map +1 -1
- package/dist/utils/entity-helpers.d.ts +1 -1
- package/dist/utils/entity-helpers.js +7 -17
- package/dist/utils/entity-helpers.js.map +1 -1
- package/dist/utils/error-handlers.js +3 -9
- package/dist/utils/error-handlers.js.map +1 -1
- package/dist/utils/graph-helpers.js +3 -9
- package/dist/utils/graph-helpers.js.map +1 -1
- package/dist/utils/prompt-helpers.d.ts +1 -1
- package/dist/utils/prompt-helpers.js +8 -12
- package/dist/utils/prompt-helpers.js.map +1 -1
- package/dist/utils/user-helpers.js +3 -7
- package/dist/utils/user-helpers.js.map +1 -1
- package/dist/vectors/EmbeddingService.d.ts +1 -1
- package/dist/vectors/EmbeddingService.js +3 -8
- package/dist/vectors/EmbeddingService.js.map +1 -1
- package/dist/vectors/SimilaritySearch.d.ts +1 -1
- package/dist/vectors/SimilaritySearch.js +19 -20
- package/dist/vectors/SimilaritySearch.js.map +1 -1
- package/package.json +24 -17
- package/src/__tests__/golden-queries-loader.test.js +181 -0
- package/src/cli/commands/generate.ts +52 -21
- package/src/cli/config.ts +10 -2
- package/src/cli/index.ts +4 -1
- package/src/core/EntityGrouper.ts +75 -11
- package/src/core/QueryTester.ts +1 -1
- package/tsconfig.json +5 -35
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* of the SQL template during the Save() operation.
|
|
7
7
|
*/
|
|
8
8
|
import { UserInfo } from '@memberjunction/core';
|
|
9
|
-
import { ValidatedQuery, WriteResult } from '../data/schema';
|
|
9
|
+
import { ValidatedQuery, WriteResult } from '../data/schema.js';
|
|
10
10
|
/**
|
|
11
11
|
* QueryDatabaseWriter class
|
|
12
12
|
* Writes validated queries directly to the database
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* QueryDatabaseWriter - Write validated queries directly to the database
|
|
4
3
|
*
|
|
@@ -6,17 +5,15 @@
|
|
|
6
5
|
* are automatically extracted by QueryEntity.server.ts using AI analysis
|
|
7
6
|
* of the SQL template during the Save() operation.
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const core_1 = require("@memberjunction/core");
|
|
12
|
-
const error_handlers_1 = require("../utils/error-handlers");
|
|
8
|
+
import { Metadata, RunView } from '@memberjunction/core';
|
|
9
|
+
import { extractErrorMessage } from '../utils/error-handlers.js';
|
|
13
10
|
/**
|
|
14
11
|
* QueryDatabaseWriter class
|
|
15
12
|
* Writes validated queries directly to the database
|
|
16
13
|
*/
|
|
17
|
-
class QueryDatabaseWriter {
|
|
18
|
-
categoryCache = new Map();
|
|
14
|
+
export class QueryDatabaseWriter {
|
|
19
15
|
constructor() {
|
|
16
|
+
this.categoryCache = new Map();
|
|
20
17
|
// No config needed - category info comes from ValidatedQuery
|
|
21
18
|
}
|
|
22
19
|
/**
|
|
@@ -33,7 +30,7 @@ class QueryDatabaseWriter {
|
|
|
33
30
|
* @returns Write result with success status and per-query results
|
|
34
31
|
*/
|
|
35
32
|
async writeQueriesToDatabase(validatedQueries, contextUser) {
|
|
36
|
-
const md = new
|
|
33
|
+
const md = new Metadata();
|
|
37
34
|
const results = [];
|
|
38
35
|
// Process each query
|
|
39
36
|
for (const vq of validatedQueries) {
|
|
@@ -64,7 +61,7 @@ class QueryDatabaseWriter {
|
|
|
64
61
|
results.push(`✓ ${query.Name} (ID: ${query.ID}) - AI extraction queued`);
|
|
65
62
|
}
|
|
66
63
|
catch (error) {
|
|
67
|
-
results.push(`✗ ${vq.businessQuestion.userQuestion}: ${
|
|
64
|
+
results.push(`✗ ${vq.businessQuestion.userQuestion}: ${extractErrorMessage(error, 'Database Write')}`);
|
|
68
65
|
}
|
|
69
66
|
}
|
|
70
67
|
return {
|
|
@@ -112,7 +109,7 @@ class QueryDatabaseWriter {
|
|
|
112
109
|
* @returns Category ID
|
|
113
110
|
*/
|
|
114
111
|
async findOrCreateCategory(categoryName, parentCategoryId, description, contextUser) {
|
|
115
|
-
const rv = new
|
|
112
|
+
const rv = new RunView();
|
|
116
113
|
// Build filter to match both name and parent
|
|
117
114
|
let filter = `Name='${categoryName.replace(/'/g, "''")}'`;
|
|
118
115
|
if (parentCategoryId) {
|
|
@@ -134,7 +131,7 @@ class QueryDatabaseWriter {
|
|
|
134
131
|
return result.Results[0].ID;
|
|
135
132
|
}
|
|
136
133
|
// Category doesn't exist, create it
|
|
137
|
-
const md = new
|
|
134
|
+
const md = new Metadata();
|
|
138
135
|
const category = await md.GetEntityObject('Query Categories', contextUser);
|
|
139
136
|
category.NewRecord();
|
|
140
137
|
category.Name = categoryName;
|
|
@@ -147,5 +144,4 @@ class QueryDatabaseWriter {
|
|
|
147
144
|
return category.ID;
|
|
148
145
|
}
|
|
149
146
|
}
|
|
150
|
-
exports.QueryDatabaseWriter = QueryDatabaseWriter;
|
|
151
147
|
//# sourceMappingURL=QueryDatabaseWriter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryDatabaseWriter.js","sourceRoot":"","sources":["../../src/core/QueryDatabaseWriter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QueryDatabaseWriter.js","sourceRoot":"","sources":["../../src/core/QueryDatabaseWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* corrected SQL queries with updated metadata.
|
|
6
6
|
*/
|
|
7
7
|
import { UserInfo } from '@memberjunction/core';
|
|
8
|
-
import { GeneratedQuery, EntityMetadataForPrompt, BusinessQuestion } from '../data/schema';
|
|
9
|
-
import { QueryGenConfig } from '../cli/config';
|
|
8
|
+
import { GeneratedQuery, EntityMetadataForPrompt, BusinessQuestion } from '../data/schema.js';
|
|
9
|
+
import { QueryGenConfig } from '../cli/config.js';
|
|
10
10
|
/**
|
|
11
11
|
* QueryFixer class
|
|
12
12
|
* Fixes SQL queries that fail to execute
|
package/dist/core/QueryFixer.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* QueryFixer - Fixes SQL queries that fail execution
|
|
4
3
|
*
|
|
5
4
|
* Uses the SQL Query Fixer AI prompt to analyze errors and generate
|
|
6
5
|
* corrected SQL queries with updated metadata.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const PromptNames_1 = require("../prompts/PromptNames");
|
|
14
|
-
const prompt_helpers_1 = require("../utils/prompt-helpers");
|
|
7
|
+
import { AIEngine } from '@memberjunction/aiengine';
|
|
8
|
+
import { LogStatus } from '@memberjunction/core';
|
|
9
|
+
import { extractErrorMessage } from '../utils/error-handlers.js';
|
|
10
|
+
import { PROMPT_SQL_QUERY_FIXER } from '../prompts/PromptNames.js';
|
|
11
|
+
import { executePromptWithOverrides } from '../utils/prompt-helpers.js';
|
|
15
12
|
/**
|
|
16
13
|
* QueryFixer class
|
|
17
14
|
* Fixes SQL queries that fail to execute
|
|
18
15
|
*/
|
|
19
|
-
class QueryFixer {
|
|
20
|
-
contextUser;
|
|
21
|
-
config;
|
|
16
|
+
export class QueryFixer {
|
|
22
17
|
constructor(contextUser, config) {
|
|
23
18
|
this.contextUser = contextUser;
|
|
24
19
|
this.config = config;
|
|
@@ -36,10 +31,10 @@ class QueryFixer {
|
|
|
36
31
|
async fixQuery(query, errorMessage, entityMetadata, businessQuestion) {
|
|
37
32
|
try {
|
|
38
33
|
// Ensure AIEngine is configured
|
|
39
|
-
const aiEngine =
|
|
34
|
+
const aiEngine = AIEngine.Instance;
|
|
40
35
|
await aiEngine.Config(false, this.contextUser);
|
|
41
36
|
// Find the SQL Query Fixer prompt
|
|
42
|
-
const prompt = this.findPromptByName(aiEngine,
|
|
37
|
+
const prompt = this.findPromptByName(aiEngine, PROMPT_SQL_QUERY_FIXER);
|
|
43
38
|
// Prepare prompt data
|
|
44
39
|
const promptData = {
|
|
45
40
|
queryName: query.queryName,
|
|
@@ -57,7 +52,7 @@ class QueryFixer {
|
|
|
57
52
|
return fixedQuery;
|
|
58
53
|
}
|
|
59
54
|
catch (error) {
|
|
60
|
-
throw new Error(
|
|
55
|
+
throw new Error(extractErrorMessage(error, 'QueryFixer.fixQuery'));
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
58
|
/**
|
|
@@ -77,7 +72,7 @@ class QueryFixer {
|
|
|
77
72
|
*/
|
|
78
73
|
async executePrompt(prompt, promptData) {
|
|
79
74
|
// The SQL Query Fixer template returns { newSQL, reasoning }
|
|
80
|
-
const result = await
|
|
75
|
+
const result = await executePromptWithOverrides(prompt, promptData, this.contextUser, this.config);
|
|
81
76
|
if (!result || !result.success) {
|
|
82
77
|
throw new Error(`AI prompt execution failed: ${result?.errorMessage || 'Unknown error'}`);
|
|
83
78
|
}
|
|
@@ -86,7 +81,7 @@ class QueryFixer {
|
|
|
86
81
|
}
|
|
87
82
|
// Log the reasoning
|
|
88
83
|
if (this.config.verbose && result.result.reasoning) {
|
|
89
|
-
|
|
84
|
+
LogStatus(`Query fix reasoning: ${result.result.reasoning}`);
|
|
90
85
|
}
|
|
91
86
|
// Return GeneratedQuery format, preserving original parameters and queryName
|
|
92
87
|
return {
|
|
@@ -113,5 +108,4 @@ class QueryFixer {
|
|
|
113
108
|
}
|
|
114
109
|
}
|
|
115
110
|
}
|
|
116
|
-
exports.QueryFixer = QueryFixer;
|
|
117
111
|
//# sourceMappingURL=QueryFixer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryFixer.js","sourceRoot":"","sources":["../../src/core/QueryFixer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QueryFixer.js","sourceRoot":"","sources":["../../src/core/QueryFixer.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* the business question correctly and improve them through iterations.
|
|
6
6
|
*/
|
|
7
7
|
import { UserInfo } from '@memberjunction/core';
|
|
8
|
-
import { GeneratedQuery, BusinessQuestion, EntityMetadataForPrompt, RefinedQuery } from '../data/schema';
|
|
9
|
-
import { QueryTester } from './QueryTester';
|
|
10
|
-
import { QueryGenConfig } from '../cli/config';
|
|
8
|
+
import { GeneratedQuery, BusinessQuestion, EntityMetadataForPrompt, RefinedQuery } from '../data/schema.js';
|
|
9
|
+
import { QueryTester } from './QueryTester.js';
|
|
10
|
+
import { QueryGenConfig } from '../cli/config.js';
|
|
11
11
|
/**
|
|
12
12
|
* QueryRefiner class
|
|
13
13
|
* Iteratively refines queries based on evaluation feedback
|
|
@@ -1,30 +1,24 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* QueryRefiner - Iteratively improves queries based on evaluation feedback
|
|
4
3
|
*
|
|
5
4
|
* Uses evaluation and refinement AI prompts to assess if queries answer
|
|
6
5
|
* the business question correctly and improve them through iterations.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const PromptNames_1 = require("../prompts/PromptNames");
|
|
14
|
-
const prompt_helpers_1 = require("../utils/prompt-helpers");
|
|
7
|
+
import { AIEngine } from '@memberjunction/aiengine';
|
|
8
|
+
import { LogStatus } from '@memberjunction/core';
|
|
9
|
+
import { extractErrorMessage } from '../utils/error-handlers.js';
|
|
10
|
+
import { PROMPT_QUERY_EVALUATOR, PROMPT_QUERY_REFINER } from '../prompts/PromptNames.js';
|
|
11
|
+
import { executePromptWithOverrides } from '../utils/prompt-helpers.js';
|
|
15
12
|
/**
|
|
16
13
|
* QueryRefiner class
|
|
17
14
|
* Iteratively refines queries based on evaluation feedback
|
|
18
15
|
*/
|
|
19
|
-
class QueryRefiner {
|
|
20
|
-
tester;
|
|
21
|
-
contextUser;
|
|
22
|
-
config;
|
|
23
|
-
entityMetadata = [];
|
|
16
|
+
export class QueryRefiner {
|
|
24
17
|
constructor(tester, contextUser, config) {
|
|
25
18
|
this.tester = tester;
|
|
26
19
|
this.contextUser = contextUser;
|
|
27
20
|
this.config = config;
|
|
21
|
+
this.entityMetadata = [];
|
|
28
22
|
}
|
|
29
23
|
/**
|
|
30
24
|
* Refine a query through evaluation and improvement iterations
|
|
@@ -61,7 +55,7 @@ class QueryRefiner {
|
|
|
61
55
|
catch (error) {
|
|
62
56
|
// Query broke during refinement - revert to last working version
|
|
63
57
|
if (this.config.verbose) {
|
|
64
|
-
|
|
58
|
+
LogStatus(`Refinement produced broken query: ${extractErrorMessage(error, 'Refinement Test')}. Reverting to last working version.`);
|
|
65
59
|
}
|
|
66
60
|
// If we have a previous working version, use that
|
|
67
61
|
if (lastWorkingTestResult && lastWorkingEvaluation) {
|
|
@@ -80,7 +74,7 @@ class QueryRefiner {
|
|
|
80
74
|
// 4. Refine the query based on suggestions
|
|
81
75
|
refinementCount++;
|
|
82
76
|
if (this.config.verbose) {
|
|
83
|
-
|
|
77
|
+
LogStatus(`Refinement iteration ${refinementCount}/${maxRefinements}`);
|
|
84
78
|
}
|
|
85
79
|
currentQuery = await this.performRefinement(currentQuery, businessQuestion, evaluation, entityMetadata);
|
|
86
80
|
}
|
|
@@ -104,11 +98,11 @@ class QueryRefiner {
|
|
|
104
98
|
*/
|
|
105
99
|
async configureAIEngine() {
|
|
106
100
|
try {
|
|
107
|
-
const aiEngine =
|
|
101
|
+
const aiEngine = AIEngine.Instance;
|
|
108
102
|
await aiEngine.Config(false, this.contextUser);
|
|
109
103
|
}
|
|
110
104
|
catch (error) {
|
|
111
|
-
throw new Error(
|
|
105
|
+
throw new Error(extractErrorMessage(error, 'AIEngine Configuration'));
|
|
112
106
|
}
|
|
113
107
|
}
|
|
114
108
|
/**
|
|
@@ -166,8 +160,8 @@ class QueryRefiner {
|
|
|
166
160
|
*/
|
|
167
161
|
async evaluateQuery(query, businessQuestion, testResult) {
|
|
168
162
|
try {
|
|
169
|
-
const aiEngine =
|
|
170
|
-
const prompt = this.findPromptByName(aiEngine,
|
|
163
|
+
const aiEngine = AIEngine.Instance;
|
|
164
|
+
const prompt = this.findPromptByName(aiEngine, PROMPT_QUERY_EVALUATOR);
|
|
171
165
|
// Limit sample results to first 10 rows for efficiency
|
|
172
166
|
const sampleResults = testResult.sampleRows?.slice(0, 10) || [];
|
|
173
167
|
const promptData = {
|
|
@@ -184,7 +178,7 @@ class QueryRefiner {
|
|
|
184
178
|
return evaluation;
|
|
185
179
|
}
|
|
186
180
|
catch (error) {
|
|
187
|
-
throw new Error(
|
|
181
|
+
throw new Error(extractErrorMessage(error, 'QueryRefiner.evaluateQuery'));
|
|
188
182
|
}
|
|
189
183
|
}
|
|
190
184
|
/**
|
|
@@ -199,8 +193,8 @@ class QueryRefiner {
|
|
|
199
193
|
*/
|
|
200
194
|
async performRefinement(query, businessQuestion, evaluation, entityMetadata) {
|
|
201
195
|
try {
|
|
202
|
-
const aiEngine =
|
|
203
|
-
const prompt = this.findPromptByName(aiEngine,
|
|
196
|
+
const aiEngine = AIEngine.Instance;
|
|
197
|
+
const prompt = this.findPromptByName(aiEngine, PROMPT_QUERY_REFINER);
|
|
204
198
|
const promptData = {
|
|
205
199
|
userQuestion: businessQuestion.userQuestion,
|
|
206
200
|
description: businessQuestion.description,
|
|
@@ -210,7 +204,7 @@ class QueryRefiner {
|
|
|
210
204
|
};
|
|
211
205
|
const refinedQuery = await this.executePrompt(prompt, promptData);
|
|
212
206
|
if (this.config.verbose) {
|
|
213
|
-
|
|
207
|
+
LogStatus(`Refinements applied: ${refinedQuery.improvementsSummary}`);
|
|
214
208
|
}
|
|
215
209
|
return {
|
|
216
210
|
queryName: refinedQuery.queryName,
|
|
@@ -219,7 +213,7 @@ class QueryRefiner {
|
|
|
219
213
|
};
|
|
220
214
|
}
|
|
221
215
|
catch (error) {
|
|
222
|
-
throw new Error(
|
|
216
|
+
throw new Error(extractErrorMessage(error, 'QueryRefiner.performRefinement'));
|
|
223
217
|
}
|
|
224
218
|
}
|
|
225
219
|
/**
|
|
@@ -238,7 +232,7 @@ class QueryRefiner {
|
|
|
238
232
|
* Generic method for any prompt type
|
|
239
233
|
*/
|
|
240
234
|
async executePrompt(prompt, promptData) {
|
|
241
|
-
const result = await
|
|
235
|
+
const result = await executePromptWithOverrides(prompt, promptData, this.contextUser, this.config);
|
|
242
236
|
if (!result || !result.success) {
|
|
243
237
|
throw new Error(`AI prompt execution failed: ${result?.errorMessage || 'Unknown error'}`);
|
|
244
238
|
}
|
|
@@ -253,16 +247,15 @@ class QueryRefiner {
|
|
|
253
247
|
logEvaluation(evaluation) {
|
|
254
248
|
if (!this.config.verbose)
|
|
255
249
|
return;
|
|
256
|
-
|
|
250
|
+
LogStatus(`Evaluation: answersQuestion=${evaluation.answersQuestion}, ` +
|
|
257
251
|
`confidence=${evaluation.confidence}, ` +
|
|
258
252
|
`needsRefinement=${evaluation.needsRefinement}`);
|
|
259
253
|
if (evaluation.reasoning) {
|
|
260
|
-
|
|
254
|
+
LogStatus(`Reasoning: ${evaluation.reasoning}`);
|
|
261
255
|
}
|
|
262
256
|
if (evaluation.suggestions.length > 0) {
|
|
263
|
-
|
|
257
|
+
LogStatus(`Suggestions: ${evaluation.suggestions.join('; ')}`);
|
|
264
258
|
}
|
|
265
259
|
}
|
|
266
260
|
}
|
|
267
|
-
exports.QueryRefiner = QueryRefiner;
|
|
268
261
|
//# sourceMappingURL=QueryRefiner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryRefiner.js","sourceRoot":"","sources":["../../src/core/QueryRefiner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QueryRefiner.js","sourceRoot":"","sources":["../../src/core/QueryRefiner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAY,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAU9D,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;GAGG;AACH,MAAM,OAAO,YAAY;IAGvB,YACU,MAAmB,EACnB,WAAqB,EACrB,MAAsB;QAFtB,WAAM,GAAN,MAAM,CAAa;QACnB,gBAAW,GAAX,WAAW,CAAU;QACrB,WAAM,GAAN,MAAM,CAAgB;QALxB,mBAAc,GAA8B,EAAE,CAAC;IAMpD,CAAC;IAEJ;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,WAAW,CACf,KAAqB,EACrB,gBAAkC,EAClC,cAAyC,EACzC,iBAAyB,CAAC;QAE1B,8CAA8C;QAC9C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,2DAA2D;QAC3D,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,qBAAqB,GAA2B,IAAI,CAAC;QACzD,IAAI,qBAAqB,GAA2B,IAAI,CAAC;QAEzD,gCAAgC;QAChC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,OAAO,eAAe,GAAG,cAAc,EAAE,CAAC;YACxC,4BAA4B;YAC5B,IAAI,UAA2B,CAAC;YAChC,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBACvD,iDAAiD;gBACjD,gBAAgB,GAAG,YAAY,CAAC;gBAChC,qBAAqB,GAAG,UAAU,CAAC;YACrC,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,iEAAiE;gBACjE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACxB,SAAS,CAAC,qCAAqC,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,CAAC,sCAAsC,CAAC,CAAC;gBACtI,CAAC;gBAED,kDAAkD;gBAClD,IAAI,qBAAqB,IAAI,qBAAqB,EAAE,CAAC;oBACnD,OAAO,IAAI,CAAC,kBAAkB,CAC5B,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,CAChB,CAAC;gBACJ,CAAC;gBAED,gDAAgD;gBAChD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,yCAAyC;YACzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CACzC,YAAY,EACZ,gBAAgB,EAChB,UAAU,CACX,CAAC;YACF,qBAAqB,GAAG,UAAU,CAAC;YAEnC,uCAAuC;YACvC,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC,kBAAkB,CAC5B,YAAY,EACZ,UAAU,EACV,UAAU,EACV,eAAe,CAChB,CAAC;YACJ,CAAC;YAED,2CAA2C;YAC3C,eAAe,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,SAAS,CAAC,wBAAwB,eAAe,IAAI,cAAc,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CACzC,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,cAAc,CACf,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,yCAAyC;QACzC,IAAI,qBAAqB,IAAI,qBAAqB,EAAE,CAAC;YACnD,OAAO;gBACL,KAAK,EAAE,gBAAgB;gBACvB,UAAU,EAAE,qBAAqB;gBACjC,UAAU,EAAE,qBAAqB;gBACjC,eAAe;gBACf,qBAAqB,EAAE,IAAI;aAC5B,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAChC,YAAY,EACZ,gBAAgB,EAChB,eAAe,CAChB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACnC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,gBAAgB,CAAC,KAAqB;QAClD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,8BAA8B,UAAU,CAAC,QAAQ,cAAc,UAAU,CAAC,KAAK,EAAE,CAClF,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,UAA2B;QACpD,OAAO,UAAU,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;IACnE,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,KAAqB,EACrB,UAA2B,EAC3B,UAA2B,EAC3B,eAAuB;QAEvB,OAAO;YACL,KAAK;YACL,UAAU;YACV,UAAU;YACV,eAAe;SAChB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,gBAAgB,CAC5B,KAAqB,EACrB,gBAAkC,EAClC,eAAuB;QAEvB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CACzC,KAAK,EACL,gBAAgB,EAChB,UAAU,CACX,CAAC;QAEF,OAAO;YACL,KAAK;YACL,UAAU;YACV,UAAU;YACV,eAAe;YACf,qBAAqB,EAAE,IAAI;SAC5B,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,aAAa,CACzB,KAAqB,EACrB,gBAAkC,EAClC,UAA2B;QAE3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YAEvE,uDAAuD;YACvD,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YAEhE,MAAM,UAAU,GAAG;gBACjB,YAAY,EAAE,gBAAgB,CAAC,YAAY;gBAC3C,WAAW,EAAE,gBAAgB,CAAC,WAAW;gBACzC,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB;gBAC3D,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,YAAY,EAAE,KAAK,CAAC,GAAG;gBACvB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,aAAa;aACd,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CACzC,MAAM,EACN,UAAU,CACX,CAAC;YAEF,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/B,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,iBAAiB,CAC7B,KAAqB,EACrB,gBAAkC,EAClC,UAA2B,EAC3B,cAAyC;QAEzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;YAErE,MAAM,UAAU,GAAG;gBACjB,YAAY,EAAE,gBAAgB,CAAC,YAAY;gBAC3C,WAAW,EAAE,gBAAgB,CAAC,WAAW;gBACzC,UAAU,EAAE,KAAK,CAAC,GAAG;gBACrB,kBAAkB,EAAE,UAAU;gBAC9B,cAAc;aACf,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAE3C,MAAM,EAAE,UAAU,CAAC,CAAC;YAEtB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,SAAS,CAAC,wBAAwB,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACxE,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,UAAU,EAAE,YAAY,CAAC,UAAU;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,mBAAmB,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,gBAAgB,CACtB,QAAkB,EAClB,UAAkB;QAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,+BAA+B,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,aAAa,CACzB,MAA8B,EAC9B,UAAmC;QAEnC,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,MAAM,EACN,UAAU,EACV,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,CACZ,CAAC;QAEF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,EAAE,YAAY,IAAI,eAAe,EAAE,CACzE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,UAA2B;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAEjC,SAAS,CACP,+BAA+B,UAAU,CAAC,eAAe,IAAI;YAC3D,cAAc,UAAU,CAAC,UAAU,IAAI;YACvC,mBAAmB,UAAU,CAAC,eAAe,EAAE,CAClD,CAAC;QAEF,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,SAAS,CAAC,cAAc,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,SAAS,CAAC,gBAAgB,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* queries against the database. Handles error fixing with retry loop.
|
|
6
6
|
*/
|
|
7
7
|
import { DatabaseProviderBase, UserInfo } from '@memberjunction/core';
|
|
8
|
-
import { GeneratedQuery, QueryTestResult, EntityMetadataForPrompt, BusinessQuestion } from '../data/schema';
|
|
9
|
-
import { QueryGenConfig } from '../cli/config';
|
|
8
|
+
import { GeneratedQuery, QueryTestResult, EntityMetadataForPrompt, BusinessQuestion } from '../data/schema.js';
|
|
9
|
+
import { QueryGenConfig } from '../cli/config.js';
|
|
10
10
|
/**
|
|
11
11
|
* QueryTester class
|
|
12
12
|
* Tests SQL queries by rendering templates and executing against database
|
package/dist/core/QueryTester.js
CHANGED
|
@@ -1,50 +1,18 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* QueryTester - Tests and validates SQL queries
|
|
4
3
|
*
|
|
5
4
|
* Renders Nunjucks templates with sample parameter values and executes
|
|
6
5
|
* queries against the database. Handles error fixing with retry loop.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
-
}
|
|
14
|
-
Object.defineProperty(o, k2, desc);
|
|
15
|
-
}) : (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
o[k2] = m[k];
|
|
18
|
-
}));
|
|
19
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
-
}) : function(o, v) {
|
|
22
|
-
o["default"] = v;
|
|
23
|
-
});
|
|
24
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
-
if (mod && mod.__esModule) return mod;
|
|
26
|
-
var result = {};
|
|
27
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
-
__setModuleDefault(result, mod);
|
|
29
|
-
return result;
|
|
30
|
-
};
|
|
31
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
exports.QueryTester = void 0;
|
|
33
|
-
const nunjucks = __importStar(require("nunjucks"));
|
|
34
|
-
const core_1 = require("@memberjunction/core");
|
|
35
|
-
const error_handlers_1 = require("../utils/error-handlers");
|
|
36
|
-
const QueryFixer_1 = require("./QueryFixer");
|
|
7
|
+
import nunjucks from 'nunjucks';
|
|
8
|
+
import { RunQuerySQLFilterManager, LogError, } from '@memberjunction/core';
|
|
9
|
+
import { extractErrorMessage } from '../utils/error-handlers.js';
|
|
10
|
+
import { QueryFixer } from './QueryFixer.js';
|
|
37
11
|
/**
|
|
38
12
|
* QueryTester class
|
|
39
13
|
* Tests SQL queries by rendering templates and executing against database
|
|
40
14
|
*/
|
|
41
|
-
class QueryTester {
|
|
42
|
-
dataProvider;
|
|
43
|
-
entityMetadata;
|
|
44
|
-
businessQuestion;
|
|
45
|
-
contextUser;
|
|
46
|
-
config;
|
|
47
|
-
nunjucksEnv;
|
|
15
|
+
export class QueryTester {
|
|
48
16
|
constructor(dataProvider, entityMetadata, businessQuestion, contextUser, config) {
|
|
49
17
|
this.dataProvider = dataProvider;
|
|
50
18
|
this.entityMetadata = entityMetadata;
|
|
@@ -59,7 +27,7 @@ class QueryTester {
|
|
|
59
27
|
lstripBlocks: true,
|
|
60
28
|
});
|
|
61
29
|
// Add custom SQL-safe filters from RunQuerySQLFilterManager
|
|
62
|
-
const filterManager =
|
|
30
|
+
const filterManager = RunQuerySQLFilterManager.Instance;
|
|
63
31
|
const filters = filterManager.getAllFilters();
|
|
64
32
|
for (const filter of filters) {
|
|
65
33
|
if (filter.implementation) {
|
|
@@ -100,9 +68,9 @@ class QueryTester {
|
|
|
100
68
|
};
|
|
101
69
|
}
|
|
102
70
|
catch (error) {
|
|
103
|
-
lastError =
|
|
71
|
+
lastError = extractErrorMessage(error, 'Query Testing');
|
|
104
72
|
if (this.config.verbose) {
|
|
105
|
-
|
|
73
|
+
LogError(`Attempt ${attempt}/${maxAttempts} failed: ${lastError}`);
|
|
106
74
|
}
|
|
107
75
|
// 5. If not last attempt, try to fix the query
|
|
108
76
|
if (attempt < maxAttempts) {
|
|
@@ -139,7 +107,7 @@ class QueryTester {
|
|
|
139
107
|
return renderedSQL;
|
|
140
108
|
}
|
|
141
109
|
catch (error) {
|
|
142
|
-
throw new Error(`Template rendering failed: ${
|
|
110
|
+
throw new Error(`Template rendering failed: ${extractErrorMessage(error, 'Nunjucks')}`);
|
|
143
111
|
}
|
|
144
112
|
}
|
|
145
113
|
/**
|
|
@@ -223,7 +191,7 @@ class QueryTester {
|
|
|
223
191
|
return result;
|
|
224
192
|
}
|
|
225
193
|
catch (error) {
|
|
226
|
-
throw new Error(`SQL execution failed: ${
|
|
194
|
+
throw new Error(`SQL execution failed: ${extractErrorMessage(error, 'Database')}`);
|
|
227
195
|
}
|
|
228
196
|
}
|
|
229
197
|
/**
|
|
@@ -235,9 +203,8 @@ class QueryTester {
|
|
|
235
203
|
* @returns Corrected query
|
|
236
204
|
*/
|
|
237
205
|
async fixQuery(query, errorMessage) {
|
|
238
|
-
const fixer = new
|
|
206
|
+
const fixer = new QueryFixer(this.contextUser, this.config);
|
|
239
207
|
return await fixer.fixQuery(query, errorMessage, this.entityMetadata, this.businessQuestion);
|
|
240
208
|
}
|
|
241
209
|
}
|
|
242
|
-
exports.QueryTester = QueryTester;
|
|
243
210
|
//# sourceMappingURL=QueryTester.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryTester.js","sourceRoot":"","sources":["../../src/core/QueryTester.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QueryTester.js","sourceRoot":"","sources":["../../src/core/QueryTester.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* based on business questions and similar golden query examples.
|
|
6
6
|
*/
|
|
7
7
|
import { UserInfo } from '@memberjunction/core';
|
|
8
|
-
import { QueryGenConfig } from '../cli/config';
|
|
9
|
-
import { BusinessQuestion, GeneratedQuery, EntityMetadataForPrompt, GoldenQuery } from '../data/schema';
|
|
8
|
+
import { QueryGenConfig } from '../cli/config.js';
|
|
9
|
+
import { BusinessQuestion, GeneratedQuery, EntityMetadataForPrompt, GoldenQuery } from '../data/schema.js';
|
|
10
10
|
/**
|
|
11
11
|
* QueryWriter class
|
|
12
12
|
* Generates Nunjucks SQL query templates using AI with few-shot learning
|
package/dist/core/QueryWriter.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* QueryWriter - Generates SQL query templates using AI with few-shot learning
|
|
4
3
|
*
|
|
5
4
|
* Uses the SQL Query Writer AI prompt to generate Nunjucks SQL templates
|
|
6
5
|
* based on business questions and similar golden query examples.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const prompt_helpers_1 = require("../utils/prompt-helpers");
|
|
14
|
-
const PromptNames_1 = require("../prompts/PromptNames");
|
|
7
|
+
import { AIEngine } from '@memberjunction/aiengine';
|
|
8
|
+
import { LogStatus } from '@memberjunction/core';
|
|
9
|
+
import { extractErrorMessage } from '../utils/error-handlers.js';
|
|
10
|
+
import { executePromptWithOverrides } from '../utils/prompt-helpers.js';
|
|
11
|
+
import { PROMPT_SQL_QUERY_WRITER } from '../prompts/PromptNames.js';
|
|
15
12
|
/**
|
|
16
13
|
* QueryWriter class
|
|
17
14
|
* Generates Nunjucks SQL query templates using AI with few-shot learning
|
|
18
15
|
*/
|
|
19
|
-
class QueryWriter {
|
|
20
|
-
contextUser;
|
|
21
|
-
config;
|
|
16
|
+
export class QueryWriter {
|
|
22
17
|
constructor(contextUser, config) {
|
|
23
18
|
this.contextUser = contextUser;
|
|
24
19
|
this.config = config;
|
|
@@ -35,10 +30,10 @@ class QueryWriter {
|
|
|
35
30
|
async generateQuery(businessQuestion, entityMetadata, fewShotExamples) {
|
|
36
31
|
try {
|
|
37
32
|
// Ensure AIEngine is configured
|
|
38
|
-
const aiEngine =
|
|
33
|
+
const aiEngine = AIEngine.Instance;
|
|
39
34
|
await aiEngine.Config(false, this.contextUser);
|
|
40
35
|
// Find the SQL Query Writer prompt
|
|
41
|
-
const prompt = this.findPromptByName(aiEngine,
|
|
36
|
+
const prompt = this.findPromptByName(aiEngine, PROMPT_SQL_QUERY_WRITER);
|
|
42
37
|
// Prepare prompt data
|
|
43
38
|
const promptData = {
|
|
44
39
|
userQuestion: businessQuestion.userQuestion,
|
|
@@ -54,7 +49,7 @@ class QueryWriter {
|
|
|
54
49
|
return generatedQuery;
|
|
55
50
|
}
|
|
56
51
|
catch (error) {
|
|
57
|
-
throw new Error(
|
|
52
|
+
throw new Error(extractErrorMessage(error, 'QueryWriter.generateQuery'));
|
|
58
53
|
}
|
|
59
54
|
}
|
|
60
55
|
/**
|
|
@@ -79,7 +74,7 @@ class QueryWriter {
|
|
|
79
74
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
80
75
|
try {
|
|
81
76
|
// Execute AI prompt
|
|
82
|
-
const result = await
|
|
77
|
+
const result = await executePromptWithOverrides(prompt, promptData, this.contextUser, this.config);
|
|
83
78
|
if (!result || !result.success) {
|
|
84
79
|
throw new Error(`AI prompt execution failed: ${result?.errorMessage || 'Unknown error'}`);
|
|
85
80
|
}
|
|
@@ -101,8 +96,8 @@ class QueryWriter {
|
|
|
101
96
|
}
|
|
102
97
|
// Log retry attempt
|
|
103
98
|
if (this.config.verbose) {
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
LogStatus(`⚠️ Query validation failed on attempt ${attempt + 1}/${maxRetries + 1}: ${lastError.message}`);
|
|
100
|
+
LogStatus(` Retrying with validation feedback...`);
|
|
106
101
|
}
|
|
107
102
|
// Add validation feedback to the prompt data for next attempt
|
|
108
103
|
// This helps the LLM correct its mistakes
|
|
@@ -180,5 +175,4 @@ class QueryWriter {
|
|
|
180
175
|
}
|
|
181
176
|
}
|
|
182
177
|
}
|
|
183
|
-
exports.QueryWriter = QueryWriter;
|
|
184
178
|
//# sourceMappingURL=QueryWriter.js.map
|