@loonylabs/llm-middleware 2.3.0 โ 2.4.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/README.md +1 -0
- package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.d.ts +3 -1
- package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.d.ts.map +1 -1
- package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.js +65 -14
- package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
- ๐ **OpenAI, Google**: Planned for future releases
|
|
45
45
|
- ๐ **Pluggable**: Easy to add custom providers - see [LLM Providers Guide](docs/LLM_PROVIDERS.md)
|
|
46
46
|
- ๐งน **JSON Cleaning**: Recipe-based JSON repair system with automatic strategy selection
|
|
47
|
+
- โจ **v2.4.0**: Enhanced array extraction support - properly handles JSON arrays `[...]` in addition to objects `{...}`
|
|
47
48
|
- ๐จ **FlatFormatter System**: Advanced data formatting for LLM consumption
|
|
48
49
|
- ๐ **Comprehensive Logging**: Multi-level logging with metadata support
|
|
49
50
|
- โ๏ธ **Configuration Management**: Flexible model and application configuration
|
|
@@ -17,11 +17,13 @@ export declare class JsonExtractor implements Parser {
|
|
|
17
17
|
thinking: string;
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
|
-
* Extract JSON block by finding balanced braces
|
|
20
|
+
* Extract JSON block by finding balanced braces or brackets
|
|
21
|
+
* Supports both objects {...} and arrays [...]
|
|
21
22
|
*/
|
|
22
23
|
private extractJsonBlock;
|
|
23
24
|
/**
|
|
24
25
|
* Extract JSON using common patterns
|
|
26
|
+
* Supports both objects {...} and arrays [...]
|
|
25
27
|
*/
|
|
26
28
|
private extractByPattern;
|
|
27
29
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-extractor.parser.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IACnC,IAAI,SAAoB;IAE/B;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IA4B/D
|
|
1
|
+
{"version":3,"file":"json-extractor.parser.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IACnC,IAAI,SAAoB;IAE/B;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IA4B/D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoExB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAwDxB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuBrB"}
|
|
@@ -44,11 +44,14 @@ class JsonExtractor {
|
|
|
44
44
|
return { json: result, thinking: '' };
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* Extract JSON block by finding balanced braces
|
|
47
|
+
* Extract JSON block by finding balanced braces or brackets
|
|
48
|
+
* Supports both objects {...} and arrays [...]
|
|
48
49
|
*/
|
|
49
50
|
extractJsonBlock(text) {
|
|
50
51
|
let braceCount = 0;
|
|
52
|
+
let bracketCount = 0;
|
|
51
53
|
let startIndex = -1;
|
|
54
|
+
let startChar = null;
|
|
52
55
|
let inString = false;
|
|
53
56
|
let escapeNext = false;
|
|
54
57
|
for (let i = 0; i < text.length; i++) {
|
|
@@ -67,14 +70,35 @@ class JsonExtractor {
|
|
|
67
70
|
}
|
|
68
71
|
if (!inString) {
|
|
69
72
|
if (char === '{') {
|
|
70
|
-
if (braceCount === 0) {
|
|
73
|
+
if (braceCount === 0 && bracketCount === 0) {
|
|
71
74
|
startIndex = i;
|
|
75
|
+
startChar = '{';
|
|
72
76
|
}
|
|
73
77
|
braceCount++;
|
|
74
78
|
}
|
|
75
79
|
else if (char === '}') {
|
|
76
80
|
braceCount--;
|
|
77
|
-
if (braceCount === 0 && startIndex >= 0) {
|
|
81
|
+
if (braceCount === 0 && bracketCount === 0 && startIndex >= 0 && startChar === '{') {
|
|
82
|
+
const jsonCandidate = text.substring(startIndex, i + 1);
|
|
83
|
+
try {
|
|
84
|
+
JSON.parse(jsonCandidate);
|
|
85
|
+
return jsonCandidate;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
// Continue searching
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (char === '[') {
|
|
93
|
+
if (braceCount === 0 && bracketCount === 0) {
|
|
94
|
+
startIndex = i;
|
|
95
|
+
startChar = '[';
|
|
96
|
+
}
|
|
97
|
+
bracketCount++;
|
|
98
|
+
}
|
|
99
|
+
else if (char === ']') {
|
|
100
|
+
bracketCount--;
|
|
101
|
+
if (bracketCount === 0 && braceCount === 0 && startIndex >= 0 && startChar === '[') {
|
|
78
102
|
const jsonCandidate = text.substring(startIndex, i + 1);
|
|
79
103
|
try {
|
|
80
104
|
JSON.parse(jsonCandidate);
|
|
@@ -91,25 +115,52 @@ class JsonExtractor {
|
|
|
91
115
|
}
|
|
92
116
|
/**
|
|
93
117
|
* Extract JSON using common patterns
|
|
118
|
+
* Supports both objects {...} and arrays [...]
|
|
94
119
|
*/
|
|
95
120
|
extractByPattern(text) {
|
|
96
|
-
// Pattern 1: JSON after "response:" or similar
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
if (
|
|
121
|
+
// Pattern 1: JSON object after "response:" or similar
|
|
122
|
+
const responseObjectPattern = /(?:response|result|json|output):\s*(\{.*\})/is;
|
|
123
|
+
const responseObjectMatch = text.match(responseObjectPattern);
|
|
124
|
+
if (responseObjectMatch) {
|
|
125
|
+
try {
|
|
126
|
+
JSON.parse(responseObjectMatch[1]);
|
|
127
|
+
return responseObjectMatch[1];
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
// Continue with other patterns
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Pattern 2: JSON array after "response:" or similar
|
|
134
|
+
const responseArrayPattern = /(?:response|result|json|output):\s*(\[.*\])/is;
|
|
135
|
+
const responseArrayMatch = text.match(responseArrayPattern);
|
|
136
|
+
if (responseArrayMatch) {
|
|
100
137
|
try {
|
|
101
|
-
JSON.parse(
|
|
102
|
-
return
|
|
138
|
+
JSON.parse(responseArrayMatch[1]);
|
|
139
|
+
return responseArrayMatch[1];
|
|
103
140
|
}
|
|
104
141
|
catch (e) {
|
|
105
142
|
// Continue with other patterns
|
|
106
143
|
}
|
|
107
144
|
}
|
|
108
|
-
// Pattern
|
|
109
|
-
const
|
|
110
|
-
const
|
|
111
|
-
if (
|
|
112
|
-
for (const match of
|
|
145
|
+
// Pattern 3: JSON object in the middle of text
|
|
146
|
+
const jsonObjectPattern = /\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}/g;
|
|
147
|
+
const objectMatches = text.match(jsonObjectPattern);
|
|
148
|
+
if (objectMatches) {
|
|
149
|
+
for (const match of objectMatches) {
|
|
150
|
+
try {
|
|
151
|
+
JSON.parse(match);
|
|
152
|
+
return match;
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
// Continue with next match
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Pattern 4: JSON array in the middle of text
|
|
160
|
+
const jsonArrayPattern = /\[[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]/g;
|
|
161
|
+
const arrayMatches = text.match(jsonArrayPattern);
|
|
162
|
+
if (arrayMatches) {
|
|
163
|
+
for (const match of arrayMatches) {
|
|
113
164
|
try {
|
|
114
165
|
JSON.parse(match);
|
|
115
166
|
return match;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-extractor.parser.js","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":";;;AAAA,gEAA2D;AAG3D;;;GAGG;AACH,MAAa,aAAa;IAA1B;QACS,SAAI,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"json-extractor.parser.js","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loonylabs/llm-middleware",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Complete middleware infrastructure for LLM-based backends with multi-provider support (Ollama, Anthropic, OpenAI, Google)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|