@aalis/util-json-repair 0.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.
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 从模型原始输出里提取 JSON 子串。
3
+ * - 去掉 ```json / ``` 围栏
4
+ * - 扫描所有顶层 '{' 候选,取**最后一个**包含 ':' 的配平对象
5
+ * (有 ':' 才是真正的 key:value JSON 对象,数学集合符号如 {1,2,3} 不含 ':' 会被跳过)
6
+ * - 模型通常先输出推理/自由文本,最后才输出 JSON payload,因此优先取最后一个候选
7
+ * - 若无合格候选则退化为原行为:从第一个 '{' 取配平或截断片段
8
+ */
9
+ export declare function extractJsonCandidate(raw: string): string;
10
+ export interface RepairResult {
11
+ /** 解析得到的对象;解析全部失败时为 null。 */
12
+ parsed: Record<string, unknown> | null;
13
+ /** 命中的修复步骤名称(按顺序累积)。直接解析成功则为空数组。 */
14
+ repairsApplied: string[];
15
+ }
16
+ /**
17
+ * 容错解析 JSON 对象:先按原文 parse,失败则依次叠加修复策略再试。
18
+ * 仅返回对象类型;数组/原始值或所有修复都失败时 parsed 为 null。
19
+ */
20
+ export declare function tryParseJsonObject(jsonStr: string): RepairResult;
21
+ /**
22
+ * 一站式:从 LLM 原始输出中提取 + 容错解析 JSON 对象。
23
+ * 等价于 `tryParseJsonObject(extractJsonCandidate(raw))`,便于调用方一行解决。
24
+ */
25
+ export declare function parseLLMJsonObject(raw: string): RepairResult;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6KA;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA2CxD;AAED,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,oCAAoC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAwBhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAE5D"}
package/dist/index.js ADDED
@@ -0,0 +1,255 @@
1
+ // 通用 LLM JSON 输出的容错解析与提取。
2
+ //
3
+ // LLM 输出的 JSON 经常带各种小毛病:包了 markdown 代码块、前后多了文本、
4
+ // XML 属性里的双引号没转义、尾部多余逗号、被截断少了 '}' 等。
5
+ // 这里把所有修复策略集中到一处,按"由轻到重"依次尝试,直到 JSON.parse 成功。
6
+ //
7
+ // 历史:本文件抽自 @aalis/plugin-persona/src/json-repair.ts,
8
+ // 供 persona / user-profile / user-relation 等所有需要解析 LLM JSON
9
+ // 的插件共享,避免重复实现修复策略。
10
+ const repairSteps = [
11
+ {
12
+ // 模型有时会在 JSON 字符串里直接写英文引号,例如:
13
+ // "message": "他说"你好"然后走了"
14
+ // 严格 JSON 需要把内部引号转义。这里用状态机判断:字符串中的引号只有在
15
+ // 后续字符像 JSON 分隔符(: , } ] 或结尾)时才视为闭合,否则转义。
16
+ name: '字符串内部裸引号转义',
17
+ apply: escapeBareQuotesInStrings,
18
+ },
19
+ {
20
+ // 模型偶尔会在 message 里写 <face id="14"/> 之类的 XML 标签,
21
+ // 但属性引号没转义,导致 JSON 解析在字符串中提前断开。
22
+ name: 'XML 属性引号转义',
23
+ apply: s => s.replace(/<(\w+)\s+(\w+)="([^"]*?)"\s*\/>/g, '<$1 $2=\\"$3\\" />'),
24
+ },
25
+ {
26
+ name: '移除尾部多余逗号',
27
+ apply: s => s.replace(/,\s*([\]}])/g, '$1'),
28
+ },
29
+ {
30
+ // 模型截断(max_tokens 触发、推理块被中途切断等)常常少一个或多个 '}'。
31
+ name: "补全缺失的 '}' 与 ']'",
32
+ apply: s => {
33
+ const trimmed = s.trimEnd();
34
+ const missingObj = countOutsideStrings(trimmed, '{') - countOutsideStrings(trimmed, '}');
35
+ const missingArr = countOutsideStrings(trimmed, '[') - countOutsideStrings(trimmed, ']');
36
+ if (missingObj <= 0 && missingArr <= 0)
37
+ return s;
38
+ let completed = trimmed;
39
+ // 数组先闭合,再闭合对象,符合常见嵌套
40
+ if (missingArr > 0)
41
+ completed += ']'.repeat(missingArr);
42
+ if (missingObj > 0)
43
+ completed += '}'.repeat(missingObj);
44
+ return completed;
45
+ },
46
+ },
47
+ ];
48
+ /** 在字符串字面量之外计算字符出现次数,避免把 message 里的 '{' 算进去。 */
49
+ function countOutsideStrings(s, ch) {
50
+ let count = 0;
51
+ let inString = false;
52
+ let escaped = false;
53
+ for (let i = 0; i < s.length; i++) {
54
+ const c = s[i];
55
+ if (escaped) {
56
+ escaped = false;
57
+ continue;
58
+ }
59
+ if (c === '\\') {
60
+ escaped = true;
61
+ continue;
62
+ }
63
+ if (c === '"') {
64
+ inString = !inString;
65
+ continue;
66
+ }
67
+ if (!inString && c === ch)
68
+ count++;
69
+ }
70
+ return count;
71
+ }
72
+ function nextNonWhitespace(s, start) {
73
+ for (let i = start; i < s.length; i++) {
74
+ if (!/\s/.test(s[i]))
75
+ return s[i];
76
+ }
77
+ return '';
78
+ }
79
+ function isJsonValueStart(c) {
80
+ return c === '"' || c === '{' || c === '[' || c === '-' || /[0-9tfn]/.test(c);
81
+ }
82
+ function isLikelyClosingQuote(s, quoteIndex) {
83
+ const next = nextNonWhitespace(s, quoteIndex + 1);
84
+ if (next === '' || next === ':' || next === '}' || next === ']')
85
+ return true;
86
+ if (next !== ',')
87
+ return false;
88
+ const commaIndex = s.indexOf(',', quoteIndex + 1);
89
+ if (commaIndex < 0)
90
+ return false;
91
+ const afterComma = nextNonWhitespace(s, commaIndex + 1);
92
+ return isJsonValueStart(afterComma) || afterComma === '}' || afterComma === ']';
93
+ }
94
+ function escapeBareQuotesInStrings(s) {
95
+ let out = '';
96
+ let inString = false;
97
+ let escaped = false;
98
+ let changed = false;
99
+ for (let i = 0; i < s.length; i++) {
100
+ const c = s[i];
101
+ if (escaped) {
102
+ out += c;
103
+ escaped = false;
104
+ continue;
105
+ }
106
+ if (c === '\\') {
107
+ out += c;
108
+ if (inString)
109
+ escaped = true;
110
+ continue;
111
+ }
112
+ if (c === '"') {
113
+ if (!inString) {
114
+ inString = true;
115
+ out += c;
116
+ continue;
117
+ }
118
+ if (isLikelyClosingQuote(s, i)) {
119
+ inString = false;
120
+ out += c;
121
+ }
122
+ else {
123
+ out += '\\"';
124
+ changed = true;
125
+ }
126
+ continue;
127
+ }
128
+ out += c;
129
+ }
130
+ return changed ? out : s;
131
+ }
132
+ /** 找到第一个顶层 JSON 对象的结束位置;忽略字符串里的括号与转义。 */
133
+ function findBalancedJsonObjectEnd(s, start) {
134
+ let depth = 0;
135
+ let inString = false;
136
+ let escaped = false;
137
+ for (let i = start; i < s.length; i++) {
138
+ const c = s[i];
139
+ if (escaped) {
140
+ escaped = false;
141
+ continue;
142
+ }
143
+ if (c === '\\') {
144
+ if (inString)
145
+ escaped = true;
146
+ continue;
147
+ }
148
+ if (c === '"') {
149
+ inString = !inString;
150
+ continue;
151
+ }
152
+ if (inString)
153
+ continue;
154
+ if (c === '{')
155
+ depth++;
156
+ else if (c === '}') {
157
+ depth--;
158
+ if (depth === 0)
159
+ return i;
160
+ if (depth < 0)
161
+ return -1;
162
+ }
163
+ }
164
+ return -1;
165
+ }
166
+ /**
167
+ * 从模型原始输出里提取 JSON 子串。
168
+ * - 去掉 ```json / ``` 围栏
169
+ * - 扫描所有顶层 '{' 候选,取**最后一个**包含 ':' 的配平对象
170
+ * (有 ':' 才是真正的 key:value JSON 对象,数学集合符号如 {1,2,3} 不含 ':' 会被跳过)
171
+ * - 模型通常先输出推理/自由文本,最后才输出 JSON payload,因此优先取最后一个候选
172
+ * - 若无合格候选则退化为原行为:从第一个 '{' 取配平或截断片段
173
+ */
174
+ export function extractJsonCandidate(raw) {
175
+ const trimmed = raw.trim();
176
+ if (!trimmed)
177
+ return trimmed;
178
+ const unfenced = trimmed
179
+ .replace(/^```(?:json)?\s*\n?/i, '')
180
+ .replace(/\n?```\s*$/i, '')
181
+ .trim();
182
+ // 遍历所有顶层 '{' 位置,收集平衡且含 ':' 的对象候选,记录最后一个。
183
+ // 关键:找到平衡对象后跳到 end+1,跳过该对象的全部内容,只扫顶层对象,
184
+ // 避免把嵌套的内层 {} 误当成候选。
185
+ let lastObjectStart = -1;
186
+ let lastObjectEnd = -1;
187
+ let searchFrom = 0;
188
+ while (searchFrom < unfenced.length) {
189
+ const brace = unfenced.indexOf('{', searchFrom);
190
+ if (brace < 0)
191
+ break;
192
+ const end = findBalancedJsonObjectEnd(unfenced, brace);
193
+ if (end > brace) {
194
+ const candidate = unfenced.slice(brace, end + 1);
195
+ // 真正的 JSON 对象必须含 ':';纯集合/枚举写法 {A,B,C} 没有 ':' 故排除
196
+ if (candidate.includes(':')) {
197
+ lastObjectStart = brace;
198
+ lastObjectEnd = end;
199
+ }
200
+ // 跳过整个对象(含其内部的所有嵌套 '{'),只扫顶层
201
+ searchFrom = end + 1;
202
+ }
203
+ else {
204
+ searchFrom = brace + 1;
205
+ }
206
+ }
207
+ if (lastObjectStart >= 0) {
208
+ return unfenced.slice(lastObjectStart, lastObjectEnd + 1);
209
+ }
210
+ // 降级回原行为:从第一个 '{' 开始,配平或截断
211
+ const firstBrace = unfenced.indexOf('{');
212
+ if (firstBrace < 0)
213
+ return unfenced;
214
+ const endFb = findBalancedJsonObjectEnd(unfenced, firstBrace);
215
+ return endFb >= firstBrace ? unfenced.slice(firstBrace, endFb + 1) : unfenced.slice(firstBrace);
216
+ }
217
+ /**
218
+ * 容错解析 JSON 对象:先按原文 parse,失败则依次叠加修复策略再试。
219
+ * 仅返回对象类型;数组/原始值或所有修复都失败时 parsed 为 null。
220
+ */
221
+ export function tryParseJsonObject(jsonStr) {
222
+ const tryParse = (s) => {
223
+ try {
224
+ const obj = JSON.parse(s);
225
+ return obj && typeof obj === 'object' && !Array.isArray(obj) ? obj : null;
226
+ }
227
+ catch {
228
+ return null;
229
+ }
230
+ };
231
+ let parsed = tryParse(jsonStr);
232
+ if (parsed)
233
+ return { parsed, repairsApplied: [] };
234
+ let current = jsonStr;
235
+ const applied = [];
236
+ for (const step of repairSteps) {
237
+ const next = step.apply(current);
238
+ if (next === current)
239
+ continue;
240
+ current = next;
241
+ applied.push(step.name);
242
+ parsed = tryParse(current);
243
+ if (parsed)
244
+ return { parsed, repairsApplied: applied };
245
+ }
246
+ return { parsed: null, repairsApplied: applied };
247
+ }
248
+ /**
249
+ * 一站式:从 LLM 原始输出中提取 + 容错解析 JSON 对象。
250
+ * 等价于 `tryParseJsonObject(extractJsonCandidate(raw))`,便于调用方一行解决。
251
+ */
252
+ export function parseLLMJsonObject(raw) {
253
+ return tryParseJsonObject(extractJsonCandidate(raw));
254
+ }
255
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@aalis/util-json-repair",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "devDependencies": {
11
+ "typescript": "^5.7.0"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch"
16
+ }
17
+ }