@proofhound/optimization-strategy 0.1.6
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/LICENSE +190 -0
- package/dist/error-pattern-analysis/analysis-types.d.ts +45 -0
- package/dist/error-pattern-analysis/analysis-types.d.ts.map +1 -0
- package/dist/error-pattern-analysis/analysis-types.js +3 -0
- package/dist/error-pattern-analysis/analysis-types.js.map +1 -0
- package/dist/error-pattern-analysis/analyze.d.ts +81 -0
- package/dist/error-pattern-analysis/analyze.d.ts.map +1 -0
- package/dist/error-pattern-analysis/analyze.js +423 -0
- package/dist/error-pattern-analysis/analyze.js.map +1 -0
- package/dist/error-pattern-analysis/config.schema.d.ts +16 -0
- package/dist/error-pattern-analysis/config.schema.d.ts.map +1 -0
- package/dist/error-pattern-analysis/config.schema.js +26 -0
- package/dist/error-pattern-analysis/config.schema.js.map +1 -0
- package/dist/error-pattern-analysis/confusion-pairs.d.ts +37 -0
- package/dist/error-pattern-analysis/confusion-pairs.d.ts.map +1 -0
- package/dist/error-pattern-analysis/confusion-pairs.js +109 -0
- package/dist/error-pattern-analysis/confusion-pairs.js.map +1 -0
- package/dist/error-pattern-analysis/generate-initial.d.ts +36 -0
- package/dist/error-pattern-analysis/generate-initial.d.ts.map +1 -0
- package/dist/error-pattern-analysis/generate-initial.js +261 -0
- package/dist/error-pattern-analysis/generate-initial.js.map +1 -0
- package/dist/error-pattern-analysis/generate.d.ts +57 -0
- package/dist/error-pattern-analysis/generate.d.ts.map +1 -0
- package/dist/error-pattern-analysis/generate.js +369 -0
- package/dist/error-pattern-analysis/generate.js.map +1 -0
- package/dist/error-pattern-analysis/index.d.ts +8 -0
- package/dist/error-pattern-analysis/index.d.ts.map +1 -0
- package/dist/error-pattern-analysis/index.js +29 -0
- package/dist/error-pattern-analysis/index.js.map +1 -0
- package/dist/error-pattern-analysis/parse.d.ts +92 -0
- package/dist/error-pattern-analysis/parse.d.ts.map +1 -0
- package/dist/error-pattern-analysis/parse.js +456 -0
- package/dist/error-pattern-analysis/parse.js.map +1 -0
- package/dist/error-pattern-analysis/prompts/analyze-confusion.system.en-US.md +50 -0
- package/dist/error-pattern-analysis/prompts/analyze-confusion.system.md +61 -0
- package/dist/error-pattern-analysis/prompts/analyze-regression.system.en-US.md +50 -0
- package/dist/error-pattern-analysis/prompts/analyze-regression.system.md +61 -0
- package/dist/error-pattern-analysis/prompts/generate-initial.system.en-US.md +43 -0
- package/dist/error-pattern-analysis/prompts/generate-initial.system.md +49 -0
- package/dist/error-pattern-analysis/prompts/generate.system.en-US.md +53 -0
- package/dist/error-pattern-analysis/prompts/generate.system.md +68 -0
- package/dist/error-pattern-analysis/prompts/loader.d.ts +46 -0
- package/dist/error-pattern-analysis/prompts/loader.d.ts.map +1 -0
- package/dist/error-pattern-analysis/prompts/loader.js +109 -0
- package/dist/error-pattern-analysis/prompts/loader.js.map +1 -0
- package/dist/error-pattern-analysis/prompts/optimization-tips.en-US.md +25 -0
- package/dist/error-pattern-analysis/prompts/optimization-tips.md +38 -0
- package/dist/error-pattern-analysis/prompts/summarize.system.en-US.md +48 -0
- package/dist/error-pattern-analysis/prompts/summarize.system.md +69 -0
- package/dist/error-pattern-analysis/prompts.d.ts +79 -0
- package/dist/error-pattern-analysis/prompts.d.ts.map +1 -0
- package/dist/error-pattern-analysis/prompts.js +659 -0
- package/dist/error-pattern-analysis/prompts.js.map +1 -0
- package/dist/error-pattern-analysis/token-budget.d.ts +20 -0
- package/dist/error-pattern-analysis/token-budget.d.ts.map +1 -0
- package/dist/error-pattern-analysis/token-budget.js +88 -0
- package/dist/error-pattern-analysis/token-budget.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/loop/best.d.ts +3 -0
- package/dist/loop/best.d.ts.map +1 -0
- package/dist/loop/best.js +43 -0
- package/dist/loop/best.js.map +1 -0
- package/dist/loop/goals.d.ts +6 -0
- package/dist/loop/goals.d.ts.map +1 -0
- package/dist/loop/goals.js +38 -0
- package/dist/loop/goals.js.map +1 -0
- package/dist/loop/round-outcome.d.ts +14 -0
- package/dist/loop/round-outcome.d.ts.map +1 -0
- package/dist/loop/round-outcome.js +18 -0
- package/dist/loop/round-outcome.js.map +1 -0
- package/dist/loop/run-iteration-loop.d.ts +5 -0
- package/dist/loop/run-iteration-loop.d.ts.map +1 -0
- package/dist/loop/run-iteration-loop.js +247 -0
- package/dist/loop/run-iteration-loop.js.map +1 -0
- package/dist/loop/types.d.ts +190 -0
- package/dist/loop/types.d.ts.map +1 -0
- package/dist/loop/types.js +13 -0
- package/dist/loop/types.js.map +1 -0
- package/dist/registry.d.ts +5 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +19 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// LLM JSON output parsing — strict JSON + resilience fallback + truncation detection
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.InvalidAppliedChangeReferenceError = exports.InvalidVariableUsageError = exports.MalformedGenerationError = void 0;
|
|
5
|
+
exports.isTruncated = isTruncated;
|
|
6
|
+
exports.extractJsonObject = extractJsonObject;
|
|
7
|
+
exports.safeParseJson = safeParseJson;
|
|
8
|
+
exports.normalizeEvidenceBundle = normalizeEvidenceBundle;
|
|
9
|
+
exports.parseConfusionAnalysisOutput = parseConfusionAnalysisOutput;
|
|
10
|
+
exports.parseRegressionAnalysisOutput = parseRegressionAnalysisOutput;
|
|
11
|
+
exports.parseSummarizeOutput = parseSummarizeOutput;
|
|
12
|
+
exports.safeValidateNewOutputSchema = safeValidateNewOutputSchema;
|
|
13
|
+
exports.parseGenerateOutput = parseGenerateOutput;
|
|
14
|
+
exports.validatePromptVariables = validatePromptVariables;
|
|
15
|
+
// jsonrepair publishes both ESM/CJS, but the server's Node16 CJS build cannot statically import its ESM type entry.
|
|
16
|
+
// Here we explicitly take the require condition of the package exports, keeping safeParseJson's synchronous API unchanged.
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
18
|
+
const { jsonrepair } = require('jsonrepair');
|
|
19
|
+
class MalformedGenerationError extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'MalformedGenerationError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.MalformedGenerationError = MalformedGenerationError;
|
|
26
|
+
class InvalidVariableUsageError extends Error {
|
|
27
|
+
disallowedVariables;
|
|
28
|
+
missingVariables;
|
|
29
|
+
removedVariables;
|
|
30
|
+
constructor(disallowed, missing, removed = []) {
|
|
31
|
+
super(`new prompt body violates variable whitelist — disallowed: [${disallowed.join(', ')}], missing: [${missing.join(', ')}], removed: [${removed.join(', ')}]`);
|
|
32
|
+
this.name = 'InvalidVariableUsageError';
|
|
33
|
+
this.disallowedVariables = disallowed;
|
|
34
|
+
this.missingVariables = missing;
|
|
35
|
+
this.removedVariables = removed;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.InvalidVariableUsageError = InvalidVariableUsageError;
|
|
39
|
+
class InvalidAppliedChangeReferenceError extends Error {
|
|
40
|
+
invalidChangeIds;
|
|
41
|
+
constructor(invalidChangeIds) {
|
|
42
|
+
super(`generate output references unknown suggestedChanges — invalid changeIds: [${invalidChangeIds.join(', ')}]`);
|
|
43
|
+
this.name = 'InvalidAppliedChangeReferenceError';
|
|
44
|
+
this.invalidChangeIds = invalidChangeIds;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.InvalidAppliedChangeReferenceError = InvalidAppliedChangeReferenceError;
|
|
48
|
+
function isTruncated(finishReason) {
|
|
49
|
+
return finishReason === 'length' || finishReason === 'max_tokens';
|
|
50
|
+
}
|
|
51
|
+
// Extract the first JSON object from the LLM output — prefer matching ```json ... ``` block, fall back to bare JSON
|
|
52
|
+
function extractJsonObject(text) {
|
|
53
|
+
if (!text)
|
|
54
|
+
return null;
|
|
55
|
+
// Prefer the ```json fenced block
|
|
56
|
+
const fenced = /```(?:json)?\s*\n?([\s\S]*?)```/m.exec(text);
|
|
57
|
+
if (fenced && fenced[1]) {
|
|
58
|
+
return fenced[1].trim();
|
|
59
|
+
}
|
|
60
|
+
// Fallback: find the first { to the last } (conservative — suited for pure JSON output without markdown wrap)
|
|
61
|
+
const firstBrace = text.indexOf('{');
|
|
62
|
+
const lastBrace = text.lastIndexOf('}');
|
|
63
|
+
if (firstBrace >= 0 && lastBrace > firstBrace) {
|
|
64
|
+
return text.slice(firstBrace, lastBrace + 1).trim();
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function safeParseJson(text) {
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(text);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// LLMs commonly emit non-strict-compliant JSON — typical: bare newlines inside string literals (Claude often forgets \n
|
|
74
|
+
// escapes when writing long strings in ```json``` code blocks) / trailing commas / single quotes / unescaped backslashes. When strict fails,
|
|
75
|
+
// use jsonrepair to repair before parsing; only give up if it still fails. The fast path for valid JSON has zero overhead.
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(jsonrepair(text));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function asStringArr(value) {
|
|
85
|
+
if (typeof value === 'string')
|
|
86
|
+
return [value];
|
|
87
|
+
if (!Array.isArray(value))
|
|
88
|
+
return [];
|
|
89
|
+
return value.filter((x) => typeof x === 'string');
|
|
90
|
+
}
|
|
91
|
+
function asNumber(value) {
|
|
92
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
93
|
+
}
|
|
94
|
+
function asPriority(value) {
|
|
95
|
+
return value === 'high' || value === 'medium' || value === 'low' ? value : undefined;
|
|
96
|
+
}
|
|
97
|
+
function slugIdPart(value) {
|
|
98
|
+
const ascii = value
|
|
99
|
+
.trim()
|
|
100
|
+
.toLowerCase()
|
|
101
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
102
|
+
.replace(/^-+|-+$/g, '');
|
|
103
|
+
if (ascii)
|
|
104
|
+
return ascii.slice(0, 48);
|
|
105
|
+
let hash = 0;
|
|
106
|
+
for (const ch of value) {
|
|
107
|
+
hash = (hash * 31 + ch.charCodeAt(0)) >>> 0;
|
|
108
|
+
}
|
|
109
|
+
return hash.toString(36);
|
|
110
|
+
}
|
|
111
|
+
function fallbackPatternId(input) {
|
|
112
|
+
const source = input.source ?? 'summary';
|
|
113
|
+
const bucket = input.bucketKey ? `${slugIdPart(input.bucketKey)}-` : '';
|
|
114
|
+
return `${source}:${bucket}p${input.index + 1}:${slugIdPart(input.label)}`;
|
|
115
|
+
}
|
|
116
|
+
function fallbackChangeId(input) {
|
|
117
|
+
const source = input.source ?? 'summary';
|
|
118
|
+
const bucket = input.bucketKey ? `${slugIdPart(input.bucketKey)}-` : '';
|
|
119
|
+
return `${source}:${bucket}c${input.index + 1}:${slugIdPart(input.section)}`;
|
|
120
|
+
}
|
|
121
|
+
function parsePatterns(value, options = {}) {
|
|
122
|
+
if (!Array.isArray(value))
|
|
123
|
+
return [];
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const [index, item] of value.entries()) {
|
|
126
|
+
if (!item || typeof item !== 'object')
|
|
127
|
+
continue;
|
|
128
|
+
const obj = item;
|
|
129
|
+
const label = typeof obj.label === 'string' ? obj.label : null;
|
|
130
|
+
if (!label)
|
|
131
|
+
continue;
|
|
132
|
+
const source = obj.source === 'confusion' || obj.source === 'regression' ? obj.source : options.source;
|
|
133
|
+
const bucketKey = typeof obj.bucketKey === 'string'
|
|
134
|
+
? obj.bucketKey
|
|
135
|
+
: typeof obj.confusionPair === 'string'
|
|
136
|
+
? obj.confusionPair
|
|
137
|
+
: options.bucketKey;
|
|
138
|
+
const count = typeof obj.count === 'number' ? obj.count : 0;
|
|
139
|
+
out.push({
|
|
140
|
+
patternId: typeof obj.patternId === 'string' && obj.patternId.length > 0
|
|
141
|
+
? obj.patternId
|
|
142
|
+
: fallbackPatternId({ source, bucketKey, label, index }),
|
|
143
|
+
source,
|
|
144
|
+
bucketKey,
|
|
145
|
+
affectedCount: asNumber(obj.affectedCount) ?? count,
|
|
146
|
+
label,
|
|
147
|
+
count,
|
|
148
|
+
reason: typeof obj.reason === 'string' ? obj.reason : '',
|
|
149
|
+
exampleSampleIds: asStringArr(obj.exampleSampleIds),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
function parseSuggestedChanges(value, options = {}) {
|
|
155
|
+
if (!Array.isArray(value))
|
|
156
|
+
return [];
|
|
157
|
+
const out = [];
|
|
158
|
+
for (const [index, item] of value.entries()) {
|
|
159
|
+
if (!item || typeof item !== 'object')
|
|
160
|
+
continue;
|
|
161
|
+
const obj = item;
|
|
162
|
+
const section = typeof obj.section === 'string' ? obj.section : null;
|
|
163
|
+
const change = typeof obj.change === 'string' ? obj.change : null;
|
|
164
|
+
if (!section || !change)
|
|
165
|
+
continue;
|
|
166
|
+
out.push({
|
|
167
|
+
changeId: typeof obj.changeId === 'string' && obj.changeId.length > 0
|
|
168
|
+
? obj.changeId
|
|
169
|
+
: fallbackChangeId({ source: options.source, bucketKey: options.bucketKey, section, index }),
|
|
170
|
+
section,
|
|
171
|
+
change,
|
|
172
|
+
rationale: typeof obj.rationale === 'string' ? obj.rationale : '',
|
|
173
|
+
addressesPatternIds: asStringArr(obj.addressesPatternIds ?? obj.patternIds ?? obj.patternId),
|
|
174
|
+
evidenceSampleIds: asStringArr(obj.evidenceSampleIds ?? obj.exampleSampleIds),
|
|
175
|
+
affectedCount: asNumber(obj.affectedCount),
|
|
176
|
+
priority: asPriority(obj.priority),
|
|
177
|
+
conflictGroup: typeof obj.conflictGroup === 'string' ? obj.conflictGroup : undefined,
|
|
178
|
+
resolutionReason: typeof obj.resolutionReason === 'string' ? obj.resolutionReason : undefined,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
// Final normalization layer on the per-batch parse result:
|
|
184
|
+
// - errorPatterns: backfill patternId / source / bucketKey / affectedCount (fallback)
|
|
185
|
+
// - suggestedChanges: derive addressesPatternIds (when empty, default to all patternIds in the batch),
|
|
186
|
+
// evidenceSampleIds (when empty, default to all exampleSampleIds in the batch),
|
|
187
|
+
// affectedCount (when empty, take patterns' sum or fallback)
|
|
188
|
+
function normalizeEvidenceBundle(raw, ctx) {
|
|
189
|
+
const errorPatterns = raw.errorPatterns.map((pattern, index) => ({
|
|
190
|
+
...pattern,
|
|
191
|
+
patternId: pattern.patternId ?? `${ctx.source}:${slugIdPart(ctx.bucketKey)}:p${index + 1}`,
|
|
192
|
+
source: pattern.source ?? ctx.source,
|
|
193
|
+
bucketKey: pattern.bucketKey ?? ctx.bucketKey,
|
|
194
|
+
affectedCount: pattern.affectedCount ?? pattern.count ?? ctx.affectedCountFallback,
|
|
195
|
+
}));
|
|
196
|
+
const patternIds = errorPatterns
|
|
197
|
+
.map((p) => p.patternId)
|
|
198
|
+
.filter((id) => Boolean(id));
|
|
199
|
+
const sampleIds = Array.from(new Set(errorPatterns.flatMap((p) => p.exampleSampleIds)));
|
|
200
|
+
const patternsAffectedSum = errorPatterns.reduce((sum, p) => sum + (p.affectedCount ?? p.count ?? 0), 0);
|
|
201
|
+
const suggestedChanges = raw.suggestedChanges.map((change, index) => ({
|
|
202
|
+
...change,
|
|
203
|
+
changeId: change.changeId ?? `${ctx.source}:${slugIdPart(ctx.bucketKey)}:c${index + 1}`,
|
|
204
|
+
addressesPatternIds: change.addressesPatternIds && change.addressesPatternIds.length > 0
|
|
205
|
+
? change.addressesPatternIds
|
|
206
|
+
: patternIds,
|
|
207
|
+
evidenceSampleIds: change.evidenceSampleIds && change.evidenceSampleIds.length > 0
|
|
208
|
+
? change.evidenceSampleIds
|
|
209
|
+
: sampleIds,
|
|
210
|
+
affectedCount: change.affectedCount ?? (patternsAffectedSum || ctx.affectedCountFallback),
|
|
211
|
+
}));
|
|
212
|
+
return { errorPatterns, suggestedChanges };
|
|
213
|
+
}
|
|
214
|
+
function parseConflicts(value) {
|
|
215
|
+
if (!Array.isArray(value))
|
|
216
|
+
return [];
|
|
217
|
+
const out = [];
|
|
218
|
+
for (const [index, item] of value.entries()) {
|
|
219
|
+
if (!item || typeof item !== 'object')
|
|
220
|
+
continue;
|
|
221
|
+
const obj = item;
|
|
222
|
+
out.push({
|
|
223
|
+
conflictGroup: typeof obj.conflictGroup === 'string' && obj.conflictGroup.length > 0
|
|
224
|
+
? obj.conflictGroup
|
|
225
|
+
: `conflict:${index + 1}`,
|
|
226
|
+
patternIds: asStringArr(obj.patternIds),
|
|
227
|
+
changeIds: asStringArr(obj.changeIds),
|
|
228
|
+
resolution: typeof obj.resolution === 'string' ? obj.resolution : '',
|
|
229
|
+
reason: typeof obj.reason === 'string' ? obj.reason : '',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
function parseConfusionAnalysisOutput(content, finishReason) {
|
|
235
|
+
const truncated = isTruncated(finishReason);
|
|
236
|
+
const jsonText = extractJsonObject(content);
|
|
237
|
+
if (!jsonText) {
|
|
238
|
+
return { errorPatterns: [], suggestedChanges: [], truncated, rawContent: content };
|
|
239
|
+
}
|
|
240
|
+
const parsed = safeParseJson(jsonText);
|
|
241
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
242
|
+
return { errorPatterns: [], suggestedChanges: [], truncated, rawContent: content };
|
|
243
|
+
}
|
|
244
|
+
const obj = parsed;
|
|
245
|
+
const bucketKey = typeof obj.confusionPair === 'string' ? obj.confusionPair : undefined;
|
|
246
|
+
return {
|
|
247
|
+
confusionPair: bucketKey,
|
|
248
|
+
errorPatterns: parsePatterns(obj.errorPatterns, { source: 'confusion', bucketKey }),
|
|
249
|
+
suggestedChanges: parseSuggestedChanges(obj.suggestedChanges, { source: 'confusion', bucketKey }),
|
|
250
|
+
truncated,
|
|
251
|
+
rawContent: content,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function parseRegressionAnalysisOutput(content, finishReason) {
|
|
255
|
+
const truncated = isTruncated(finishReason);
|
|
256
|
+
const jsonText = extractJsonObject(content);
|
|
257
|
+
if (!jsonText) {
|
|
258
|
+
return { errorPatterns: [], suggestedChanges: [], truncated, rawContent: content };
|
|
259
|
+
}
|
|
260
|
+
const parsed = safeParseJson(jsonText);
|
|
261
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
262
|
+
return { errorPatterns: [], suggestedChanges: [], truncated, rawContent: content };
|
|
263
|
+
}
|
|
264
|
+
const obj = parsed;
|
|
265
|
+
return {
|
|
266
|
+
errorPatterns: parsePatterns(obj.errorPatterns, { source: 'regression' }),
|
|
267
|
+
suggestedChanges: parseSuggestedChanges(obj.suggestedChanges, { source: 'regression' }),
|
|
268
|
+
truncated,
|
|
269
|
+
rawContent: content,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function parseSummarizeOutput(content, finishReason) {
|
|
273
|
+
const truncated = isTruncated(finishReason);
|
|
274
|
+
const jsonText = extractJsonObject(content);
|
|
275
|
+
if (!jsonText) {
|
|
276
|
+
return {
|
|
277
|
+
summary: content,
|
|
278
|
+
errorPatterns: [],
|
|
279
|
+
suggestedChanges: [],
|
|
280
|
+
conflicts: [],
|
|
281
|
+
evidenceBundleVersion: 1,
|
|
282
|
+
truncated,
|
|
283
|
+
rawContent: content,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const parsed = safeParseJson(jsonText);
|
|
287
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
288
|
+
return {
|
|
289
|
+
summary: content,
|
|
290
|
+
errorPatterns: [],
|
|
291
|
+
suggestedChanges: [],
|
|
292
|
+
conflicts: [],
|
|
293
|
+
evidenceBundleVersion: 1,
|
|
294
|
+
truncated,
|
|
295
|
+
rawContent: content,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const obj = parsed;
|
|
299
|
+
const patterns = parsePatterns(obj.errorPatterns).map((p) => {
|
|
300
|
+
const raw = obj.errorPatterns?.find?.((x) => x && typeof x === 'object' && x.label === p.label);
|
|
301
|
+
const source = raw?.source === 'confusion' || raw?.source === 'regression' ? raw.source : undefined;
|
|
302
|
+
return { ...p, source };
|
|
303
|
+
});
|
|
304
|
+
return {
|
|
305
|
+
summary: typeof obj.summary === 'string' && obj.summary.length > 0 ? obj.summary : content,
|
|
306
|
+
errorPatterns: patterns,
|
|
307
|
+
suggestedChanges: parseSuggestedChanges(obj.suggestedChanges),
|
|
308
|
+
conflicts: parseConflicts(obj.conflicts),
|
|
309
|
+
evidenceBundleVersion: 1,
|
|
310
|
+
truncated,
|
|
311
|
+
rawContent: content,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function isPlainObject(v) {
|
|
315
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
316
|
+
}
|
|
317
|
+
// Validate whether the LLM-output newOutputSchema is safe and acceptable.
|
|
318
|
+
// Rules (aligned with constraint 3 in generate.system.md):
|
|
319
|
+
// - The new schema must be a type=object JSON Schema object, and properties is an object
|
|
320
|
+
// - The properties keys of the old schema ⊆ the properties keys of the new schema (no field deletion allowed)
|
|
321
|
+
// - The type of old fields must remain unchanged (to avoid breaking the parsing contract)
|
|
322
|
+
// If the old schema is not in the type=object shape (rare — free-form schema), only validate the new schema's own structure.
|
|
323
|
+
function safeValidateNewOutputSchema(newSchema, oldSchema) {
|
|
324
|
+
const errors = [];
|
|
325
|
+
if (!isPlainObject(newSchema)) {
|
|
326
|
+
errors.push('newOutputSchema must be a plain object');
|
|
327
|
+
return { ok: false, errors };
|
|
328
|
+
}
|
|
329
|
+
const newType = newSchema.type;
|
|
330
|
+
if (newType !== undefined && newType !== 'object') {
|
|
331
|
+
errors.push(`newOutputSchema.type must be "object", got ${JSON.stringify(newType)}`);
|
|
332
|
+
}
|
|
333
|
+
const newProps = newSchema.properties;
|
|
334
|
+
if (!isPlainObject(newProps)) {
|
|
335
|
+
errors.push('newOutputSchema.properties must be a plain object');
|
|
336
|
+
return { ok: false, errors };
|
|
337
|
+
}
|
|
338
|
+
if (isPlainObject(oldSchema)) {
|
|
339
|
+
const oldType = oldSchema.type;
|
|
340
|
+
const oldProps = oldSchema.properties;
|
|
341
|
+
if ((oldType === undefined || oldType === 'object') && isPlainObject(oldProps)) {
|
|
342
|
+
for (const [name, oldProp] of Object.entries(oldProps)) {
|
|
343
|
+
if (!(name in newProps)) {
|
|
344
|
+
errors.push(`existing field "${name}" was removed (not allowed)`);
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
const oldPropType = isPlainObject(oldProp) ? oldProp.type : undefined;
|
|
348
|
+
const newPropRaw = newProps[name];
|
|
349
|
+
const newPropType = isPlainObject(newPropRaw) ? newPropRaw.type : undefined;
|
|
350
|
+
if (oldPropType !== undefined && newPropType !== undefined && oldPropType !== newPropType) {
|
|
351
|
+
errors.push(`existing field "${name}" type changed from ${JSON.stringify(oldPropType)} to ${JSON.stringify(newPropType)} (not allowed)`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return { ok: errors.length === 0, errors };
|
|
357
|
+
}
|
|
358
|
+
function parseGenerateOutput(content, finishReason) {
|
|
359
|
+
const truncated = isTruncated(finishReason);
|
|
360
|
+
const jsonText = extractJsonObject(content);
|
|
361
|
+
if (!jsonText) {
|
|
362
|
+
throw new MalformedGenerationError('generate output: missing JSON block');
|
|
363
|
+
}
|
|
364
|
+
const parsed = safeParseJson(jsonText);
|
|
365
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
366
|
+
throw new MalformedGenerationError('generate output: JSON parse failed');
|
|
367
|
+
}
|
|
368
|
+
const obj = parsed;
|
|
369
|
+
const body = typeof obj.newPromptBody === 'string' ? obj.newPromptBody : null;
|
|
370
|
+
if (!body || body.length === 0) {
|
|
371
|
+
throw new MalformedGenerationError('generate output: newPromptBody is empty or missing');
|
|
372
|
+
}
|
|
373
|
+
const result = {
|
|
374
|
+
newPromptBody: body,
|
|
375
|
+
changeSummary: typeof obj.changeSummary === 'string' ? obj.changeSummary : '',
|
|
376
|
+
appliedTips: asStringArr(obj.appliedTips),
|
|
377
|
+
variablesUsed: asStringArr(obj.variablesUsed),
|
|
378
|
+
truncated,
|
|
379
|
+
rawContent: content,
|
|
380
|
+
};
|
|
381
|
+
if (isPlainObject(obj.newOutputSchema)) {
|
|
382
|
+
result.newOutputSchema = obj.newOutputSchema;
|
|
383
|
+
}
|
|
384
|
+
if (typeof obj.outputSchemaChangeReason === 'string' && obj.outputSchemaChangeReason.length > 0) {
|
|
385
|
+
result.outputSchemaChangeReason = obj.outputSchemaChangeReason;
|
|
386
|
+
}
|
|
387
|
+
const appliedChanges = parseAppliedChanges(obj.appliedChanges);
|
|
388
|
+
if (appliedChanges.length > 0)
|
|
389
|
+
result.appliedChanges = appliedChanges;
|
|
390
|
+
const unappliedSuggestions = parseUnappliedSuggestions(obj.unappliedSuggestions);
|
|
391
|
+
if (unappliedSuggestions.length > 0)
|
|
392
|
+
result.unappliedSuggestions = unappliedSuggestions;
|
|
393
|
+
return result;
|
|
394
|
+
}
|
|
395
|
+
function parseAppliedChanges(value) {
|
|
396
|
+
if (!Array.isArray(value))
|
|
397
|
+
return [];
|
|
398
|
+
const out = [];
|
|
399
|
+
for (const item of value) {
|
|
400
|
+
if (!item || typeof item !== 'object')
|
|
401
|
+
continue;
|
|
402
|
+
const obj = item;
|
|
403
|
+
const changeId = typeof obj.changeId === 'string' ? obj.changeId : null;
|
|
404
|
+
if (!changeId)
|
|
405
|
+
continue;
|
|
406
|
+
out.push({
|
|
407
|
+
changeId,
|
|
408
|
+
patternIds: asStringArr(obj.patternIds ?? obj.addressesPatternIds),
|
|
409
|
+
summary: typeof obj.summary === 'string' ? obj.summary : '',
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
return out;
|
|
413
|
+
}
|
|
414
|
+
function parseUnappliedSuggestions(value) {
|
|
415
|
+
if (!Array.isArray(value))
|
|
416
|
+
return [];
|
|
417
|
+
const out = [];
|
|
418
|
+
for (const item of value) {
|
|
419
|
+
if (!item || typeof item !== 'object')
|
|
420
|
+
continue;
|
|
421
|
+
const obj = item;
|
|
422
|
+
const changeId = typeof obj.changeId === 'string' ? obj.changeId : null;
|
|
423
|
+
if (!changeId)
|
|
424
|
+
continue;
|
|
425
|
+
out.push({
|
|
426
|
+
changeId,
|
|
427
|
+
reason: typeof obj.reason === 'string' ? obj.reason : '',
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
return out;
|
|
431
|
+
}
|
|
432
|
+
// =========================
|
|
433
|
+
// Variable whitelist validation
|
|
434
|
+
// =========================
|
|
435
|
+
const prompts_1 = require("./prompts");
|
|
436
|
+
// Validate that the variables referenced in the new prompt body ⊆ promptVariables, and contain the LLM-self-reported variablesUsed;
|
|
437
|
+
// requiredVariables (usually = variables base used that are still in the whitelist) must all be retained in newPromptBody.
|
|
438
|
+
function validatePromptVariables(newPromptBody, promptVariables, reportedVariablesUsed, requiredVariables = []) {
|
|
439
|
+
const detected = (0, prompts_1.extractVariableNames)(newPromptBody);
|
|
440
|
+
const allowedSet = new Set(promptVariables);
|
|
441
|
+
const disallowed = detected.filter((v) => !allowedSet.has(v));
|
|
442
|
+
const reportedSet = new Set(reportedVariablesUsed);
|
|
443
|
+
// Do not enforce reported = detected — as long as detected ⊆ promptVariables, OK
|
|
444
|
+
// missing field preserved: the upper layer can warn that LLM-self-reported and actual differ
|
|
445
|
+
const missing = detected.filter((v) => !reportedSet.has(v));
|
|
446
|
+
const detectedSet = new Set(detected);
|
|
447
|
+
const removed = requiredVariables.filter((v) => !detectedSet.has(v));
|
|
448
|
+
return {
|
|
449
|
+
ok: disallowed.length === 0 && removed.length === 0,
|
|
450
|
+
disallowed,
|
|
451
|
+
missing,
|
|
452
|
+
removed,
|
|
453
|
+
detected,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/error-pattern-analysis/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
You are a prompt error-pattern analyst for a confusion-pair subtask.
|
|
2
|
+
|
|
3
|
+
## Task
|
|
4
|
+
You will receive failed samples for one expected -> predicted confusion pair from the current experiment. Identify why the model makes this specific mistake and propose evidence-backed prompt changes.
|
|
5
|
+
|
|
6
|
+
## Constraints
|
|
7
|
+
- Only fields listed in `promptVariables` may appear as `{{variable}}` placeholders in a future prompt.
|
|
8
|
+
- `analysisOnlyFields` may be read for diagnosis, but their field names must not appear in the final prompt.
|
|
9
|
+
- Use cross-round history, when provided, to avoid repeating directions that already caused metric regressions.
|
|
10
|
+
- `suggestedChanges[].changeId` must be generated for the current bucket only. Do not reuse historical change IDs.
|
|
11
|
+
|
|
12
|
+
## What To Produce
|
|
13
|
+
1. Identify 3-8 concrete error patterns for this confusion pair.
|
|
14
|
+
2. Estimate counts and cite 2-3 `sampleId` values per pattern.
|
|
15
|
+
3. Propose 1-3 local prompt changes, each tied to pattern IDs and sample evidence.
|
|
16
|
+
4. Do not produce generic suggestions without sample evidence.
|
|
17
|
+
|
|
18
|
+
## Output Format
|
|
19
|
+
Return exactly one fenced ```json code block and no other text. The JSON must be parseable by `JSON.parse`; escape quotes, backslashes, newlines, and tabs inside strings.
|
|
20
|
+
|
|
21
|
+
## JSON Schema
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"confusionPair": "expected->predicted",
|
|
25
|
+
"errorPatterns": [
|
|
26
|
+
{
|
|
27
|
+
"patternId": "confusion:expected-predicted:p1",
|
|
28
|
+
"source": "confusion",
|
|
29
|
+
"bucketKey": "expected->predicted",
|
|
30
|
+
"label": "short label",
|
|
31
|
+
"count": 1,
|
|
32
|
+
"affectedCount": 1,
|
|
33
|
+
"reason": "concise cause",
|
|
34
|
+
"exampleSampleIds": ["s1", "s2"]
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"suggestedChanges": [
|
|
38
|
+
{
|
|
39
|
+
"changeId": "confusion:expected-predicted:c1",
|
|
40
|
+
"section": "target prompt section",
|
|
41
|
+
"change": "specific change",
|
|
42
|
+
"rationale": "why this helps",
|
|
43
|
+
"addressesPatternIds": ["confusion:expected-predicted:p1"],
|
|
44
|
+
"evidenceSampleIds": ["s1", "s2"],
|
|
45
|
+
"affectedCount": 1,
|
|
46
|
+
"priority": "high"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
你是「提示词错误模式分析师 · 混淆对分析子任务」。
|
|
2
|
+
|
|
3
|
+
## 任务
|
|
4
|
+
你会收到本轮实验里**TOP 混淆对**之一的失败样本集合(同一对 expected→predicted 下的多条样本)。请分析这些样本,归纳「为什么模型会犯这种错误」并给出可量化的改写建议。
|
|
5
|
+
|
|
6
|
+
## 输入字段的硬约束
|
|
7
|
+
- **可作为最终 prompt 变量的字段**(promptVariables 白名单):分析时可以引用,新版本只能在这个集合内使用 `{{variable}}` 占位符;**不允许**自创变量或丢弃已有变量。
|
|
8
|
+
- **仅供分析使用的字段**(analysisOnlyFields):你可以阅读它们来推断成因,但**严禁**把这些字段名出现在最终 prompt 中——这些字段只在 analyze 阶段可见,运行时无法被 prompt 引用。
|
|
9
|
+
|
|
10
|
+
## 同时收到的辅助信息
|
|
11
|
+
- 当前 prompt 的全文
|
|
12
|
+
- **优化目标 vs 当前实际**:用户声明了若干优化目标(可以是「整体的某指标」或「某分类的某指标」),每条目标会附带当前实际值与差距,让你看清哪些目标尚未达成、缺多少
|
|
13
|
+
- **涉及范围的完整指标**:仅展示与优化目标相关的范围(整体 + 用户关心的分类)下的全部指标,便于你评估改写时的 trade-off(提升一个指标会不会牺牲另一个)
|
|
14
|
+
|
|
15
|
+
## 你要做什么
|
|
16
|
+
1. 阅读样本,识别 3-8 个**针对此混淆对**的具体错误模式(不是泛泛而谈)。
|
|
17
|
+
2. 对每个模式估计在本批样本中的出现次数、提供 2-3 个 sampleId 作为证据。
|
|
18
|
+
3. 给出至少 1-3 条**局部候选改写建议**——具体到「加哪句话 / 改哪一段 / 强化哪个判定边界」。
|
|
19
|
+
4. 每条建议都必须绑定它解决的 `patternId` 和样本证据;禁止输出没有样本证据支撑的泛化建议。
|
|
20
|
+
|
|
21
|
+
## 跨轮历史的使用约束(仅当 user 段含「## 历史优化轨迹」时适用)
|
|
22
|
+
1. 若某历史轮的 `changeSummary` / `appliedChanges` 已与"指标 Δ<0"绑定(即被证伪的方向),**不要把同方向的建议再次列入 `suggestedChanges`**——除非当前混淆样本提供了新的证据指向相反方向。
|
|
23
|
+
2. 若 best 轮(标记 ★)的方向仍未饱和(多轮 Δ≥0 且当前差距尚存),可在该方向上继续提出**增量**改写建议。
|
|
24
|
+
3. `suggestedChanges[].changeId` 仍只能在本轮 bucket 内生成(如 `confusion:expected-predicted:c1`);**严禁借用历史轮的 changeId**,避免跨轮 ID 串错。
|
|
25
|
+
|
|
26
|
+
**输出格式(严格遵循)**:
|
|
27
|
+
- 必须以单个 ```json ... ``` 代码块输出 — 代码块外不要任何其它字符。
|
|
28
|
+
- JSON 必须可被 JSON.parse 直接解析。
|
|
29
|
+
- 字符串内若含特殊字符(双引号 \" / 反斜杠 \\ / 换行 \n / 制表符 \t),必须按 JSON 字符串规范转义。
|
|
30
|
+
- 不要使用 JavaScript 注释、不要尾随逗号、不要 BigInt 等非 JSON 语法。
|
|
31
|
+
|
|
32
|
+
## JSON 输出 schema
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"confusionPair": "expected→predicted",
|
|
36
|
+
"errorPatterns": [
|
|
37
|
+
{
|
|
38
|
+
"patternId": "confusion:expected-predicted:p1",
|
|
39
|
+
"source": "confusion",
|
|
40
|
+
"bucketKey": "expected→predicted",
|
|
41
|
+
"label": "短标签(10 字以内)",
|
|
42
|
+
"count": 整数,
|
|
43
|
+
"affectedCount": 整数,
|
|
44
|
+
"reason": "成因描述(控制 60 字内)",
|
|
45
|
+
"exampleSampleIds": ["s1", "s2"]
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"suggestedChanges": [
|
|
49
|
+
{
|
|
50
|
+
"changeId": "confusion:expected-predicted:c1",
|
|
51
|
+
"section": "目标 prompt 段(如:任务说明 / 输出格式 / 示例区)",
|
|
52
|
+
"change": "具体改什么",
|
|
53
|
+
"rationale": "为什么改",
|
|
54
|
+
"addressesPatternIds": ["confusion:expected-predicted:p1"],
|
|
55
|
+
"evidenceSampleIds": ["s1", "s2"],
|
|
56
|
+
"affectedCount": 整数,
|
|
57
|
+
"priority": "high" | "medium" | "low"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
You are a prompt error-pattern analyst for regression samples.
|
|
2
|
+
|
|
3
|
+
## Task
|
|
4
|
+
You will receive samples that were correct under a previous comparable prompt but wrong under the current prompt. Diagnose the specific risk introduced by the current prompt and propose evidence-backed fixes.
|
|
5
|
+
|
|
6
|
+
## Constraints
|
|
7
|
+
- Only fields listed in `promptVariables` may appear as `{{variable}}` placeholders in a future prompt.
|
|
8
|
+
- `analysisOnlyFields` may be read for diagnosis, but their field names must not appear in the final prompt.
|
|
9
|
+
- Only blame a concrete prompt change when a previous comparable prompt is provided.
|
|
10
|
+
- Use cross-round history, when provided, to avoid repeating directions that already caused metric regressions.
|
|
11
|
+
- `suggestedChanges[].changeId` must be generated for the current bucket only. Do not reuse historical change IDs.
|
|
12
|
+
|
|
13
|
+
## What To Produce
|
|
14
|
+
1. Identify concrete regression patterns in the current prompt.
|
|
15
|
+
2. Cite sample evidence for each pattern.
|
|
16
|
+
3. Propose 1-3 local changes that prevent the regression, such as restoring an older anchor or narrowing a new rule.
|
|
17
|
+
4. Do not produce generic suggestions without sample evidence.
|
|
18
|
+
|
|
19
|
+
## Output Format
|
|
20
|
+
Return exactly one fenced ```json code block and no other text. The JSON must be parseable by `JSON.parse`; escape quotes, backslashes, newlines, and tabs inside strings.
|
|
21
|
+
|
|
22
|
+
## JSON Schema
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"errorPatterns": [
|
|
26
|
+
{
|
|
27
|
+
"patternId": "regression:predicted-x:p1",
|
|
28
|
+
"source": "regression",
|
|
29
|
+
"bucketKey": "predicted=X",
|
|
30
|
+
"label": "short label",
|
|
31
|
+
"count": 1,
|
|
32
|
+
"affectedCount": 1,
|
|
33
|
+
"reason": "why the current prompt regressed",
|
|
34
|
+
"exampleSampleIds": ["s1"]
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"suggestedChanges": [
|
|
38
|
+
{
|
|
39
|
+
"changeId": "regression:predicted-x:c1",
|
|
40
|
+
"section": "target prompt section",
|
|
41
|
+
"change": "specific change, especially what to keep or restore",
|
|
42
|
+
"rationale": "why this helps",
|
|
43
|
+
"addressesPatternIds": ["regression:predicted-x:p1"],
|
|
44
|
+
"evidenceSampleIds": ["s1"],
|
|
45
|
+
"affectedCount": 1,
|
|
46
|
+
"priority": "high"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
```
|