universal-llm-client 4.3.0 → 4.5.1
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/CHANGELOG.md +34 -19
- package/README.md +62 -11
- package/dist/ai-model.d.ts +12 -2
- package/dist/ai-model.js +36 -2
- package/dist/auditor.d.ts +0 -1
- package/dist/auditor.js +0 -1
- package/dist/client.d.ts +0 -1
- package/dist/client.js +0 -1
- package/dist/gemma-channel.d.ts +13 -0
- package/dist/gemma-channel.js +37 -0
- package/dist/gemma-diffusion.d.ts +48 -0
- package/dist/gemma-diffusion.js +146 -0
- package/dist/http.d.ts +4 -1
- package/dist/http.js +14 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -1
- package/dist/interfaces.d.ts +163 -8
- package/dist/interfaces.js +0 -1
- package/dist/mcp.d.ts +0 -1
- package/dist/mcp.js +0 -1
- package/dist/providers/anthropic.d.ts +0 -1
- package/dist/providers/anthropic.js +28 -4
- package/dist/providers/google.d.ts +22 -2
- package/dist/providers/google.js +223 -14
- package/dist/providers/index.d.ts +0 -1
- package/dist/providers/index.js +0 -1
- package/dist/providers/ollama.d.ts +2 -1
- package/dist/providers/ollama.js +59 -31
- package/dist/providers/openai.d.ts +16 -1
- package/dist/providers/openai.js +488 -81
- package/dist/router.d.ts +2 -1
- package/dist/router.js +4 -1
- package/dist/stream-decoder.d.ts +12 -1
- package/dist/stream-decoder.js +182 -6
- package/dist/structured-output.d.ts +0 -1
- package/dist/structured-output.js +0 -1
- package/dist/thinking.d.ts +35 -0
- package/dist/thinking.js +51 -0
- package/dist/tools.d.ts +0 -1
- package/dist/tools.js +0 -1
- package/dist/zod-adapter.d.ts +0 -1
- package/dist/zod-adapter.js +0 -1
- package/package.json +3 -1
- package/dist/ai-model.d.ts.map +0 -1
- package/dist/ai-model.js.map +0 -1
- package/dist/auditor.d.ts.map +0 -1
- package/dist/auditor.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/interfaces.d.ts.map +0 -1
- package/dist/interfaces.js.map +0 -1
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/google.d.ts.map +0 -1
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/ollama.d.ts.map +0 -1
- package/dist/providers/ollama.js.map +0 -1
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js.map +0 -1
- package/dist/router.d.ts.map +0 -1
- package/dist/router.js.map +0 -1
- package/dist/stream-decoder.d.ts.map +0 -1
- package/dist/stream-decoder.js.map +0 -1
- package/dist/structured-output.d.ts.map +0 -1
- package/dist/structured-output.js.map +0 -1
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js.map +0 -1
- package/dist/zod-adapter.d.ts.map +0 -1
- package/dist/zod-adapter.js.map +0 -1
package/dist/router.d.ts
CHANGED
|
@@ -52,6 +52,8 @@ export declare class Router {
|
|
|
52
52
|
addProvider(entry: ProviderEntry): void;
|
|
53
53
|
removeProvider(id: string): void;
|
|
54
54
|
setAuditor(auditor: Auditor): void;
|
|
55
|
+
/** All registered provider clients, in priority order. */
|
|
56
|
+
getClients(): BaseLLMClient[];
|
|
55
57
|
getStatus(): ProviderStatus[];
|
|
56
58
|
/**
|
|
57
59
|
* Execute a function against providers with automatic failover.
|
|
@@ -134,4 +136,3 @@ export declare class Router {
|
|
|
134
136
|
private recordSuccess;
|
|
135
137
|
private recordFailure;
|
|
136
138
|
}
|
|
137
|
-
//# sourceMappingURL=router.d.ts.map
|
package/dist/router.js
CHANGED
|
@@ -47,6 +47,10 @@ export class Router {
|
|
|
47
47
|
setAuditor(auditor) {
|
|
48
48
|
this.auditor = auditor;
|
|
49
49
|
}
|
|
50
|
+
/** All registered provider clients, in priority order. */
|
|
51
|
+
getClients() {
|
|
52
|
+
return this.providers.map(p => p.client);
|
|
53
|
+
}
|
|
50
54
|
getStatus() {
|
|
51
55
|
return this.providers.map(p => ({
|
|
52
56
|
id: p.id,
|
|
@@ -576,4 +580,3 @@ export class Router {
|
|
|
576
580
|
}
|
|
577
581
|
}
|
|
578
582
|
}
|
|
579
|
-
//# sourceMappingURL=router.js.map
|
package/dist/stream-decoder.d.ts
CHANGED
|
@@ -68,8 +68,20 @@ export declare class StandardChatDecoder implements StreamDecoder {
|
|
|
68
68
|
private content;
|
|
69
69
|
private reasoning;
|
|
70
70
|
private readonly callback;
|
|
71
|
+
private tagBuffer;
|
|
72
|
+
private inProgressTag;
|
|
73
|
+
private progressBody;
|
|
74
|
+
private inGemmaThought;
|
|
75
|
+
private gemmaThoughtBody;
|
|
76
|
+
private gemmaThoughtClose;
|
|
77
|
+
private inToolCallTag;
|
|
78
|
+
private toolCallBody;
|
|
79
|
+
private toolCallClose;
|
|
71
80
|
constructor(callback: DecoderCallback);
|
|
72
81
|
push(token: string): void;
|
|
82
|
+
private emitText;
|
|
83
|
+
private emitReasoning;
|
|
84
|
+
private matchesStructuralOpenerPrefix;
|
|
73
85
|
/** Feed native reasoning tokens from the provider */
|
|
74
86
|
pushReasoning(content: string): void;
|
|
75
87
|
/** Feed structured tool calls from the provider API response */
|
|
@@ -136,4 +148,3 @@ export declare function getRegisteredDecoders(): string[];
|
|
|
136
148
|
* @throws Error if the decoder type is not registered
|
|
137
149
|
*/
|
|
138
150
|
export declare function createDecoder(type: DecoderType | string, callback: DecoderCallback, options?: DecoderOptions): StreamDecoder;
|
|
139
|
-
//# sourceMappingURL=stream-decoder.d.ts.map
|
package/dist/stream-decoder.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* standard-chat for structured tool calls, or interleaved-reasoning
|
|
7
7
|
* for models that emit <think>/<progress> tags.
|
|
8
8
|
*/
|
|
9
|
+
import { GEMMA_THOUGHT_OPENERS, normalizeGemmaThought } from './gemma-channel.js';
|
|
9
10
|
// ============================================================================
|
|
10
11
|
// Passthrough Decoder
|
|
11
12
|
// ============================================================================
|
|
@@ -48,24 +49,200 @@ export class StandardChatDecoder {
|
|
|
48
49
|
content = '';
|
|
49
50
|
reasoning = '';
|
|
50
51
|
callback;
|
|
52
|
+
tagBuffer = '';
|
|
53
|
+
inProgressTag = false;
|
|
54
|
+
progressBody = '';
|
|
55
|
+
inGemmaThought = false;
|
|
56
|
+
gemmaThoughtBody = '';
|
|
57
|
+
gemmaThoughtClose = '';
|
|
58
|
+
inToolCallTag = false;
|
|
59
|
+
toolCallBody = '';
|
|
60
|
+
toolCallClose = '';
|
|
51
61
|
constructor(callback) {
|
|
52
62
|
this.callback = callback;
|
|
53
63
|
}
|
|
54
64
|
push(token) {
|
|
55
|
-
|
|
56
|
-
|
|
65
|
+
let pos = 0;
|
|
66
|
+
while (pos < token.length) {
|
|
67
|
+
if (this.inGemmaThought) {
|
|
68
|
+
this.gemmaThoughtBody += token.slice(pos);
|
|
69
|
+
const closeIdx = this.gemmaThoughtBody.indexOf(this.gemmaThoughtClose);
|
|
70
|
+
if (closeIdx !== -1) {
|
|
71
|
+
const body = this.gemmaThoughtBody.slice(0, closeIdx);
|
|
72
|
+
const remainder = this.gemmaThoughtBody.slice(closeIdx + this.gemmaThoughtClose.length);
|
|
73
|
+
this.emitReasoning(normalizeGemmaThought(body));
|
|
74
|
+
this.inGemmaThought = false;
|
|
75
|
+
this.gemmaThoughtBody = '';
|
|
76
|
+
this.gemmaThoughtClose = '';
|
|
77
|
+
if (remainder)
|
|
78
|
+
this.push(remainder);
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (this.inToolCallTag) {
|
|
83
|
+
this.toolCallBody += token.slice(pos);
|
|
84
|
+
const closeIdx = this.toolCallBody.indexOf(this.toolCallClose);
|
|
85
|
+
if (closeIdx !== -1) {
|
|
86
|
+
const body = this.toolCallBody.slice(0, closeIdx);
|
|
87
|
+
const remainder = this.toolCallBody.slice(closeIdx + this.toolCallClose.length);
|
|
88
|
+
if (body.trim()) {
|
|
89
|
+
try {
|
|
90
|
+
const normalizedJson = body.trim()
|
|
91
|
+
.replace(/'/g, '"')
|
|
92
|
+
.replace(/True/g, 'true')
|
|
93
|
+
.replace(/False/g, 'false')
|
|
94
|
+
.replace(/None/g, 'null');
|
|
95
|
+
const parsed = JSON.parse(normalizedJson);
|
|
96
|
+
const calls = Array.isArray(parsed) ? parsed : [parsed];
|
|
97
|
+
const validatedCalls = [];
|
|
98
|
+
for (const call of calls) {
|
|
99
|
+
if (call && typeof call === 'object' && call.name) {
|
|
100
|
+
validatedCalls.push({
|
|
101
|
+
id: call.id || `recovered_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
102
|
+
type: 'function',
|
|
103
|
+
function: {
|
|
104
|
+
name: call.name,
|
|
105
|
+
arguments: typeof call.arguments === 'string'
|
|
106
|
+
? call.arguments
|
|
107
|
+
: JSON.stringify(call.arguments ?? {}),
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (validatedCalls.length > 0) {
|
|
113
|
+
this.callback({ type: 'tool_call', calls: validatedCalls });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// ignore
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
this.inToolCallTag = false;
|
|
121
|
+
this.toolCallBody = '';
|
|
122
|
+
this.toolCallClose = '';
|
|
123
|
+
if (remainder)
|
|
124
|
+
this.push(remainder);
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (this.inProgressTag) {
|
|
129
|
+
this.progressBody += token.slice(pos);
|
|
130
|
+
const closeIdx = this.progressBody.indexOf('</progress>');
|
|
131
|
+
if (closeIdx !== -1) {
|
|
132
|
+
const body = this.progressBody.slice(0, closeIdx);
|
|
133
|
+
const remainder = this.progressBody.slice(closeIdx + '</progress>'.length);
|
|
134
|
+
if (body) {
|
|
135
|
+
this.callback({ type: 'progress', content: body });
|
|
136
|
+
}
|
|
137
|
+
this.inProgressTag = false;
|
|
138
|
+
this.progressBody = '';
|
|
139
|
+
if (remainder)
|
|
140
|
+
this.push(remainder);
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (this.tagBuffer.length > 0) {
|
|
145
|
+
const ch = token[pos];
|
|
146
|
+
pos++;
|
|
147
|
+
this.tagBuffer += ch;
|
|
148
|
+
if (this.matchesStructuralOpenerPrefix(this.tagBuffer)) {
|
|
149
|
+
if (this.tagBuffer === '<progress>') {
|
|
150
|
+
this.inProgressTag = true;
|
|
151
|
+
this.progressBody = '';
|
|
152
|
+
this.tagBuffer = '';
|
|
153
|
+
}
|
|
154
|
+
else if (this.tagBuffer === '<tool_call|>') {
|
|
155
|
+
this.inToolCallTag = true;
|
|
156
|
+
this.toolCallBody = '';
|
|
157
|
+
this.toolCallClose = '<|tool_response>';
|
|
158
|
+
this.tagBuffer = '';
|
|
159
|
+
}
|
|
160
|
+
else if (this.tagBuffer === '<|tool_response>') {
|
|
161
|
+
this.tagBuffer = '';
|
|
162
|
+
}
|
|
163
|
+
else if (this.tagBuffer === '<|channel>thought') {
|
|
164
|
+
this.inGemmaThought = true;
|
|
165
|
+
this.gemmaThoughtBody = '';
|
|
166
|
+
this.gemmaThoughtClose = '<channel|>';
|
|
167
|
+
this.tagBuffer = '';
|
|
168
|
+
}
|
|
169
|
+
else if (this.tagBuffer === '<|thought') {
|
|
170
|
+
this.inGemmaThought = true;
|
|
171
|
+
this.gemmaThoughtBody = '';
|
|
172
|
+
this.gemmaThoughtClose = '|>';
|
|
173
|
+
this.tagBuffer = '';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.emitText(this.tagBuffer);
|
|
178
|
+
this.tagBuffer = '';
|
|
179
|
+
}
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const ltIdx = token.indexOf('<', pos);
|
|
183
|
+
if (ltIdx === -1) {
|
|
184
|
+
this.emitText(token.slice(pos));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (ltIdx > pos) {
|
|
188
|
+
this.emitText(token.slice(pos, ltIdx));
|
|
189
|
+
}
|
|
190
|
+
this.tagBuffer = '<';
|
|
191
|
+
pos = ltIdx + 1;
|
|
192
|
+
}
|
|
57
193
|
}
|
|
58
|
-
|
|
59
|
-
|
|
194
|
+
emitText(text) {
|
|
195
|
+
if (!text)
|
|
196
|
+
return;
|
|
197
|
+
this.content += text;
|
|
198
|
+
this.callback({ type: 'text', content: text });
|
|
199
|
+
}
|
|
200
|
+
emitReasoning(content) {
|
|
201
|
+
if (!content)
|
|
202
|
+
return;
|
|
60
203
|
this.reasoning += content;
|
|
61
204
|
this.callback({ type: 'thinking', content });
|
|
62
205
|
}
|
|
206
|
+
matchesStructuralOpenerPrefix(candidate) {
|
|
207
|
+
if ('<progress>'.startsWith(candidate))
|
|
208
|
+
return true;
|
|
209
|
+
if ('<tool_call|>'.startsWith(candidate))
|
|
210
|
+
return true;
|
|
211
|
+
if ('<|tool_response>'.startsWith(candidate))
|
|
212
|
+
return true;
|
|
213
|
+
return GEMMA_THOUGHT_OPENERS.some(opener => opener.startsWith(candidate));
|
|
214
|
+
}
|
|
215
|
+
/** Feed native reasoning tokens from the provider */
|
|
216
|
+
pushReasoning(content) {
|
|
217
|
+
this.emitReasoning(content);
|
|
218
|
+
}
|
|
63
219
|
/** Feed structured tool calls from the provider API response */
|
|
64
220
|
pushToolCalls(calls) {
|
|
65
221
|
this.callback({ type: 'tool_call', calls });
|
|
66
222
|
}
|
|
67
223
|
flush() {
|
|
68
|
-
|
|
224
|
+
if (this.tagBuffer) {
|
|
225
|
+
this.emitText(this.tagBuffer);
|
|
226
|
+
this.tagBuffer = '';
|
|
227
|
+
}
|
|
228
|
+
if (this.inGemmaThought) {
|
|
229
|
+
this.emitReasoning(normalizeGemmaThought(this.gemmaThoughtBody));
|
|
230
|
+
this.inGemmaThought = false;
|
|
231
|
+
this.gemmaThoughtBody = '';
|
|
232
|
+
this.gemmaThoughtClose = '';
|
|
233
|
+
}
|
|
234
|
+
if (this.inProgressTag) {
|
|
235
|
+
if (this.progressBody) {
|
|
236
|
+
this.emitText('<progress>' + this.progressBody);
|
|
237
|
+
}
|
|
238
|
+
this.inProgressTag = false;
|
|
239
|
+
this.progressBody = '';
|
|
240
|
+
}
|
|
241
|
+
if (this.inToolCallTag) {
|
|
242
|
+
this.inToolCallTag = false;
|
|
243
|
+
this.toolCallBody = '';
|
|
244
|
+
this.toolCallClose = '';
|
|
245
|
+
}
|
|
69
246
|
}
|
|
70
247
|
getCleanContent() {
|
|
71
248
|
return this.content;
|
|
@@ -263,4 +440,3 @@ export function createDecoder(type, callback, options) {
|
|
|
263
440
|
}
|
|
264
441
|
return factory(callback, options);
|
|
265
442
|
}
|
|
266
|
-
//# sourceMappingURL=stream-decoder.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified thinking/reasoning resolution shared by all providers.
|
|
3
|
+
*
|
|
4
|
+
* Applications set a single `thinking` value — `true`/`false` or a level
|
|
5
|
+
* ('minimal' | 'low' | 'medium' | 'high') — at the model level and/or per call.
|
|
6
|
+
* Each provider maps the resolved intent to its native control (Gemini
|
|
7
|
+
* `thinkingLevel`/`thinkingBudget`, OpenAI `reasoning_effort`, vLLM
|
|
8
|
+
* `enable_thinking`, Anthropic `budget_tokens`, Ollama `think`).
|
|
9
|
+
*/
|
|
10
|
+
import type { ThinkingLevel } from './interfaces.js';
|
|
11
|
+
export interface ResolvedThinking {
|
|
12
|
+
/** Whether reasoning should be enabled at all. */
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
/** Explicit level when the user provided one (absent for a bare `true`). */
|
|
15
|
+
level?: ThinkingLevel;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the effective thinking intent from a per-call value (highest
|
|
19
|
+
* precedence) and the model-level config value. Returns `undefined` when
|
|
20
|
+
* neither is set, so providers omit the control entirely (and don't perturb
|
|
21
|
+
* servers that reject unknown fields).
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveThinking(perCall: boolean | ThinkingLevel | undefined, config: boolean | ThinkingLevel | undefined): ResolvedThinking | undefined;
|
|
24
|
+
/** Heuristic: OpenAI reasoning models use `reasoning_effort` (o-series, GPT-5). */
|
|
25
|
+
export declare function isOpenAIReasoningModel(model: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Gemini 2.5 `thinkingBudget` for a level. 0 disables, -1 is dynamic, and the
|
|
28
|
+
* Flash range is 0–24576. A bare `true` (no level) maps to dynamic (-1).
|
|
29
|
+
*/
|
|
30
|
+
export declare function geminiThinkingBudget(level: ThinkingLevel | undefined): number;
|
|
31
|
+
/**
|
|
32
|
+
* Anthropic extended-thinking `budget_tokens` for a level, kept >= 1024 (the
|
|
33
|
+
* API minimum) and < `maxTokens` (the API requires headroom for the answer).
|
|
34
|
+
*/
|
|
35
|
+
export declare function anthropicThinkingBudget(level: ThinkingLevel | undefined, maxTokens: number): number;
|
package/dist/thinking.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const LEVELS = ['minimal', 'low', 'medium', 'high'];
|
|
2
|
+
function isLevel(v) {
|
|
3
|
+
return typeof v === 'string' && LEVELS.includes(v);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the effective thinking intent from a per-call value (highest
|
|
7
|
+
* precedence) and the model-level config value. Returns `undefined` when
|
|
8
|
+
* neither is set, so providers omit the control entirely (and don't perturb
|
|
9
|
+
* servers that reject unknown fields).
|
|
10
|
+
*/
|
|
11
|
+
export function resolveThinking(perCall, config) {
|
|
12
|
+
const value = perCall ?? config;
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (value === false)
|
|
16
|
+
return { enabled: false };
|
|
17
|
+
if (value === true)
|
|
18
|
+
return { enabled: true };
|
|
19
|
+
if (isLevel(value))
|
|
20
|
+
return { enabled: true, level: value };
|
|
21
|
+
return undefined; // unknown string — ignore defensively
|
|
22
|
+
}
|
|
23
|
+
/** Heuristic: OpenAI reasoning models use `reasoning_effort` (o-series, GPT-5). */
|
|
24
|
+
export function isOpenAIReasoningModel(model) {
|
|
25
|
+
return /^(o\d|gpt-5)/i.test(model);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Gemini 2.5 `thinkingBudget` for a level. 0 disables, -1 is dynamic, and the
|
|
29
|
+
* Flash range is 0–24576. A bare `true` (no level) maps to dynamic (-1).
|
|
30
|
+
*/
|
|
31
|
+
export function geminiThinkingBudget(level) {
|
|
32
|
+
switch (level) {
|
|
33
|
+
case 'minimal': return 512;
|
|
34
|
+
case 'low': return 2048;
|
|
35
|
+
case 'medium': return 8192;
|
|
36
|
+
case 'high': return 24576;
|
|
37
|
+
default: return -1; // enabled without an explicit level → dynamic
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Anthropic extended-thinking `budget_tokens` for a level, kept >= 1024 (the
|
|
42
|
+
* API minimum) and < `maxTokens` (the API requires headroom for the answer).
|
|
43
|
+
*/
|
|
44
|
+
export function anthropicThinkingBudget(level, maxTokens) {
|
|
45
|
+
const base = level === 'high' ? 16384
|
|
46
|
+
: level === 'medium' ? 4096
|
|
47
|
+
: level === 'low' ? 1024
|
|
48
|
+
: level === 'minimal' ? 1024
|
|
49
|
+
: 2048; // bare `true`
|
|
50
|
+
return Math.max(1024, Math.min(base, maxTokens - 1024));
|
|
51
|
+
}
|
package/dist/tools.d.ts
CHANGED
package/dist/tools.js
CHANGED
package/dist/zod-adapter.d.ts
CHANGED
package/dist/zod-adapter.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-llm-client",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A universal LLM client with transparent provider failover, streaming tool execution, pluggable reasoning, and native observability.",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
"test": "bun test",
|
|
55
55
|
"typecheck": "tsc --noEmit",
|
|
56
56
|
"lint": "tsc --noEmit --strict",
|
|
57
|
+
"demo:diffusion-gemma": "bun run src/demos/diffusion-gemma/server.ts",
|
|
58
|
+
"demo:diffusion-gemma:engine": "docker compose -f src/demos/diffusion-gemma/docker-compose.yml up -d",
|
|
57
59
|
"prepack": "bun run build",
|
|
58
60
|
"docs:dev": "vitepress dev docs",
|
|
59
61
|
"docs:build": "vitepress build docs",
|
package/dist/ai-model.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-model.d.ts","sourceRoot":"","sources":["../src/ai-model.ts"],"names":[],"mappings":"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"}
|
package/dist/ai-model.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-model.js","sourceRoot":"","sources":["../src/ai-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — AIModel (The Universal Client)\r\n *\r\n * The only public-facing class. Developers configure one model with\r\n * multiple provider backends for transparent failover.\r\n *\r\n * Provider classes are internal — the user never imports them.\r\n */\r\n\r\nimport {\r\n AIModelApiType,\r\n type AIModelConfig,\r\n type ProviderConfig,\r\n type LLMClientOptions,\r\n type LLMChatMessage,\r\n type LLMChatResponse,\r\n type ChatOptions,\r\n type ModelMetadata,\r\n type LLMFunction,\r\n type ToolHandler,\r\n} from './interfaces.js';\r\nimport type { DecodedEvent } from './stream-decoder.js';\r\nimport { Router, type RouterConfig, type ProviderStatus } from './router.js';\r\nimport type { Auditor } from './auditor.js';\r\nimport { NoopAuditor } from './auditor.js';\r\nimport { OllamaClient } from './providers/ollama.js';\r\nimport { OpenAICompatibleClient } from './providers/openai.js';\r\nimport { GoogleClient } from './providers/google.js';\r\nimport { AnthropicClient } from './providers/anthropic.js';\r\nimport { BaseLLMClient } from './client.js';\r\nimport {\r\n type StructuredOutputResult,\r\n type SchemaConfig,\r\n} from './structured-output.js';\r\n\r\n// ============================================================================\r\n// Default Provider URLs\r\n// ============================================================================\r\n\r\nconst DEFAULT_URLS: Record<string, string> = {\r\n ollama: 'http://localhost:11434',\r\n openai: 'https://api.openai.com',\r\n llamacpp: 'http://localhost:8080',\r\n anthropic: 'https://api.anthropic.com',\r\n // google and vertex build their own URLs internally\r\n};\r\n\r\n// ============================================================================\r\n// AIModel — The Universal Client\r\n// ============================================================================\r\n\r\nexport class AIModel {\r\n private router: Router;\r\n private auditor: Auditor;\r\n private config: AIModelConfig;\r\n\r\n constructor(config: AIModelConfig) {\r\n this.config = config;\r\n this.auditor = config.auditor ?? new NoopAuditor();\r\n\r\n const routerConfig: RouterConfig = {\r\n retriesPerProvider: config.retries ?? 2,\r\n auditor: this.auditor,\r\n };\r\n this.router = new Router(routerConfig);\r\n\r\n // Initialize providers in order\r\n for (let i = 0; i < config.providers.length; i++) {\r\n const providerConfig = config.providers[i]!;\r\n const client = this.createClient(providerConfig);\r\n const id = `${this.normalizeType(providerConfig.type)}-${i}`;\r\n\r\n this.router.addProvider({\r\n id,\r\n client,\r\n priority: providerConfig.priority ?? i,\r\n modelOverride: providerConfig.model,\r\n });\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // Chat\r\n // ========================================================================\r\n\r\n /** Send a chat request with automatic failover across providers */\r\n async chat(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<LLMChatResponse> {\r\n return this.router.chat(messages, options);\r\n }\r\n\r\n /** Chat with automatic tool execution (multi-turn loop) */\r\n async chatWithTools(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions & { maxIterations?: number },\r\n ): Promise<LLMChatResponse> {\r\n return this.router.chatWithTools(messages, options);\r\n }\r\n\r\n /** Stream chat response with pluggable decoder strategy */\r\n async *chatStream(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown> {\r\n return yield* this.router.chatStream(messages, options);\r\n }\r\n\r\n // ========================================================================\r\n // Structured Output\r\n // ========================================================================\r\n\r\n /**\r\n * Generate structured output from the LLM with automatic failover.\r\n * Validates the response against the provided Zod schema.\r\n * Throws StructuredOutputError on validation failure.\r\n *\r\n * @template T The output type\r\n * @param config Schema configuration (JSON Schema + optional validator)\r\n * @param messages Chat messages to send\r\n * @param options Additional options (temperature, maxTokens, etc.)\r\n * @returns Promise resolving to validated structured output\r\n * @throws StructuredOutputError if JSON parsing fails or validation fails\r\n *\r\n * @example\r\n * ```typescript\r\n * import { fromZod } from 'universal-llm-client/zod';\r\n * const UserConfig = fromZod(z.object({\r\n * name: z.string(),\r\n * age: z.number(),\r\n * }));\r\n *\r\n * const user = await model.generateStructured(UserConfig, [\r\n * { role: 'user', content: 'Generate a user profile' },\r\n * ]);\r\n * // user.name: string, user.age: number\r\n * ```\r\n */\r\n async generateStructured<T>(\r\n config: SchemaConfig<T>,\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<T> {\r\n return this.router.generateStructured(config, messages, options);\r\n }\r\n\r\n /**\r\n * Try to generate structured output, returning a result object instead of throwing.\r\n * Same as generateStructured but returns { ok: true, value } on success\r\n * and { ok: false, error, rawOutput } on failure.\r\n *\r\n * @template T The output type\r\n * @param config Schema configuration (JSON Schema + optional validator)\r\n * @param messages Chat messages to send\r\n * @param options Additional options (temperature, maxTokens, etc.)\r\n * @returns StructuredOutputResult<T> - either success with value or failure with error\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await model.tryParseStructured(config, messages);\r\n *\r\n * if (result.ok) {\r\n * console.log('User:', result.value.name);\r\n * } else {\r\n * console.log('Error:', result.error.message);\r\n * console.log('Raw output:', result.rawOutput);\r\n * }\r\n * ```\r\n */\r\n async tryParseStructured<T>(\r\n config: SchemaConfig<T>,\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<StructuredOutputResult<T>> {\r\n return this.router.tryParseStructured(config, messages, options);\r\n }\r\n\r\n /**\r\n * Stream structured output with partial validated objects.\r\n *\r\n * Yields partial validated objects as JSON generates, then returns the\r\n * complete validated object on stream completion.\r\n *\r\n * For invalid partial JSON, no yield occurs (partial validation is best-effort).\r\n * On stream completion, if the final JSON fails validation, throws StructuredOutputError.\r\n *\r\n * @template T The output type\r\n * @param config Schema configuration (JSON Schema + optional validator)\r\n * @param messages Chat messages to send\r\n * @param options Additional options (temperature, maxTokens, etc.)\r\n * @yields Partial validated objects as the JSON stream progresses\r\n * @returns Complete validated object on stream completion\r\n * @throws StructuredOutputError if final validation fails\r\n *\r\n * @example\r\n * ```typescript\r\n * import { fromZod } from 'universal-llm-client/zod';\r\n * const UserConfig = fromZod(z.object({\r\n * name: z.string(),\r\n * age: z.number(),\r\n * }));\r\n *\r\n * const stream = model.generateStructuredStream(UserConfig, [\r\n * { role: 'user', content: 'Generate a user' },\r\n * ]);\r\n *\r\n * for await (const partial of stream) {\r\n * console.log('Partial user:', partial);\r\n * }\r\n * ```\r\n */\r\n async *generateStructuredStream<T>(\r\n config: SchemaConfig<T>,\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): AsyncGenerator<T, T, unknown> {\r\n return yield* this.router.generateStructuredStream(config, messages, options);\r\n }\r\n\r\n // ========================================================================\r\n // Embeddings\r\n // ========================================================================\r\n\r\n /** Generate embedding for a single text */\r\n async embed(text: string): Promise<number[]> {\r\n return this.router.embed(text);\r\n }\r\n\r\n /** Generate embeddings for multiple texts */\r\n async embedArray(texts: string[]): Promise<number[][]> {\r\n return this.router.embedArray(texts);\r\n }\r\n\r\n // ========================================================================\r\n // Tool Registration\r\n // ========================================================================\r\n\r\n /** Register a tool callable by the LLM (broadcast to all providers) */\r\n registerTool(\r\n name: string,\r\n description: string,\r\n parameters: LLMFunction['parameters'],\r\n handler: ToolHandler,\r\n ): void {\r\n this.router.registerTool(name, description, parameters, handler);\r\n }\r\n\r\n /** Register multiple tools at once */\r\n registerTools(\r\n tools: Array<{\r\n name: string;\r\n description: string;\r\n parameters: LLMFunction['parameters'];\r\n handler: ToolHandler;\r\n }>,\r\n ): void {\r\n this.router.registerTools(tools);\r\n }\r\n\r\n // ========================================================================\r\n // Model Management\r\n // ========================================================================\r\n\r\n /** Get available models from all configured providers */\r\n async getModels(): Promise<string[]> {\r\n return this.router.getModels();\r\n }\r\n\r\n /** Get metadata about the current model (context length, capabilities) */\r\n async getModelInfo(): Promise<ModelMetadata> {\r\n return this.router.getModelInfo();\r\n }\r\n\r\n /** Switch model at runtime (updates all providers) */\r\n setModel(name: string): void {\r\n this.config.model = name;\r\n // The model name change will be picked up by the providers\r\n // through the router on next request\r\n }\r\n\r\n /** Get the current model name */\r\n get model(): string {\r\n return this.config.model;\r\n }\r\n\r\n // ========================================================================\r\n // Provider Status\r\n // ========================================================================\r\n\r\n /** Get health/status of all configured providers */\r\n getProviderStatus(): ProviderStatus[] {\r\n return this.router.getStatus();\r\n }\r\n\r\n // ========================================================================\r\n // Lifecycle\r\n // ========================================================================\r\n\r\n /** Clean shutdown — flush auditor, disconnect MCP, etc. */\r\n async dispose(): Promise<void> {\r\n await this.auditor.flush?.();\r\n }\r\n\r\n // ========================================================================\r\n // Internal: Provider Factory\r\n // ========================================================================\r\n\r\n private createClient(providerConfig: ProviderConfig): BaseLLMClient {\r\n const type = this.normalizeType(providerConfig.type);\r\n const modelName = providerConfig.model ?? this.config.model;\r\n\r\n const clientOptions: LLMClientOptions = {\r\n model: modelName,\r\n url: providerConfig.url ?? DEFAULT_URLS[type] ?? '',\r\n apiType: type as AIModelApiType,\r\n apiKey: providerConfig.apiKey,\r\n timeout: this.config.timeout ?? 30000,\r\n retries: this.config.retries ?? 2,\r\n debug: this.config.debug ?? false,\r\n defaultParameters: this.config.defaultParameters,\r\n thinking: this.config.thinking ?? false,\r\n region: providerConfig.region,\r\n apiVersion: providerConfig.apiVersion,\r\n };\r\n\r\n switch (type) {\r\n case 'ollama':\r\n return new OllamaClient(clientOptions, this.auditor);\r\n\r\n case 'openai':\r\n case 'llamacpp':\r\n return new OpenAICompatibleClient(clientOptions, this.auditor);\r\n\r\n case 'google':\r\n case 'vertex':\r\n return new GoogleClient(clientOptions, this.auditor);\r\n\r\n case 'anthropic':\r\n return new AnthropicClient(clientOptions, this.auditor);\r\n\r\n default:\r\n throw new Error(`Unknown provider type: ${type}`);\r\n }\r\n }\r\n\r\n private normalizeType(type: string): string {\r\n return type.toLowerCase();\r\n }\r\n}\r\n"]}
|
package/dist/auditor.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auditor.d.ts","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3E,MAAM,MAAM,cAAc,GACpB,SAAS,GACT,UAAU,GACV,cAAc,GACd,YAAY,GACZ,WAAW,GACX,aAAa,GACb,OAAO,GACP,OAAO,GACP,UAAU,GACV,oBAAoB,GACpB,qBAAqB,GACrB,6BAA6B,CAAC;AAEpC,MAAM,WAAW,UAAU;IACvB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gEAAgE;IAChE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACpB,4BAA4B;IAC5B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,2CAA2C;IAC3C,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAMD;;;GAGG;AACH,qBAAa,WAAY,YAAW,OAAO;IACvC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;CAGnC;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,OAAO;IAC1C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,MAAgB;IAIpC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAwElC;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC3C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAC,CAA0C;gBAE9C,OAAO,GAAE;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAChD;IAKN,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ/B,8BAA8B;IAC9B,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC;IAItC,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,iDAAiD;IACjD,KAAK,IAAI,IAAI;CAGhB"}
|
package/dist/auditor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auditor.js","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — Auditor (Observability)\r\n *\r\n * Every LLM interaction (request, response, tool call, retry, failover)\r\n * is recorded through the Auditor interface. Frameworks inject their own\r\n * Auditor for dashboards, cost tracking, or behavioral scoring.\r\n */\r\n\r\nimport type { TokenUsageInfo, ToolExecutionResult } from './interfaces.js';\r\n\r\n// ============================================================================\r\n// Audit Event\r\n// ============================================================================\r\n\r\nexport type AuditEventType =\r\n | 'request'\r\n | 'response'\r\n | 'stream_start'\r\n | 'stream_end'\r\n | 'tool_call'\r\n | 'tool_result'\r\n | 'error'\r\n | 'retry'\r\n | 'failover'\r\n | 'structured_request'\r\n | 'structured_response'\r\n | 'structured_validation_error';\r\n\r\nexport interface AuditEvent {\r\n /** Unix timestamp in ms */\r\n timestamp: number;\r\n /** Event type */\r\n type: AuditEventType;\r\n /** Provider that generated this event */\r\n provider?: string;\r\n /** Model name */\r\n model?: string;\r\n /** Duration in ms (for request/response pairs) */\r\n duration?: number;\r\n /** Token usage (for response events) */\r\n usage?: TokenUsageInfo;\r\n /** Tool execution details (for tool_call/tool_result events) */\r\n toolExecution?: ToolExecutionResult;\r\n /** Error message (for error/retry events) */\r\n error?: string;\r\n /** Arbitrary metadata for framework-specific data */\r\n metadata?: Record<string, unknown>;\r\n /** Schema name for structured output events */\r\n schemaName?: string;\r\n /** Raw output snippet for validation errors */\r\n rawOutput?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Auditor Interface\r\n// ============================================================================\r\n\r\n/**\r\n * Interface for LLM observability.\r\n *\r\n * Implement this to capture all LLM lifecycle events.\r\n * The library calls `record()` at every interaction point.\r\n */\r\nexport interface Auditor {\r\n /** Record an audit event */\r\n record(event: AuditEvent): void;\r\n /** Flush any buffered events (optional) */\r\n flush?(): Promise<void>;\r\n}\r\n\r\n// ============================================================================\r\n// Built-in Auditors\r\n// ============================================================================\r\n\r\n/**\r\n * Zero-overhead auditor that discards all events.\r\n * Used as the default when no auditor is configured.\r\n */\r\nexport class NoopAuditor implements Auditor {\r\n record(_event: AuditEvent): void {\r\n // Intentionally empty\r\n }\r\n}\r\n\r\n/**\r\n * Structured console logging auditor.\r\n * Useful for development and debugging.\r\n */\r\nexport class ConsoleAuditor implements Auditor {\r\n private prefix: string;\r\n\r\n constructor(prefix: string = '[LLM]') {\r\n this.prefix = prefix;\r\n }\r\n\r\n record(event: AuditEvent): void {\r\n const parts = [\r\n this.prefix,\r\n event.type.toUpperCase(),\r\n event.provider ? `[${event.provider}]` : '',\r\n event.model ? `(${event.model})` : '',\r\n ].filter(Boolean);\r\n\r\n switch (event.type) {\r\n case 'request':\r\n console.log(parts.join(' '), '→');\r\n break;\r\n case 'response':\r\n console.log(\r\n parts.join(' '),\r\n event.duration ? `${event.duration}ms` : '',\r\n event.usage ? `${event.usage.totalTokens} tokens` : '',\r\n );\r\n break;\r\n case 'stream_start':\r\n console.log(parts.join(' '), 'streaming...');\r\n break;\r\n case 'stream_end':\r\n console.log(\r\n parts.join(' '),\r\n 'done',\r\n event.duration ? `${event.duration}ms` : '',\r\n );\r\n break;\r\n case 'tool_call':\r\n console.log(parts.join(' '), event.toolExecution?.tool_call_id ?? '');\r\n break;\r\n case 'tool_result':\r\n console.log(\r\n parts.join(' '),\r\n event.toolExecution?.error ? '❌' : '✅',\r\n event.toolExecution?.duration ? `${event.toolExecution.duration}ms` : '',\r\n );\r\n break;\r\n case 'error':\r\n console.error(parts.join(' '), event.error ?? 'Unknown error');\r\n break;\r\n case 'retry':\r\n console.warn(parts.join(' '), event.error ?? '', event.metadata ?? '');\r\n break;\r\n case 'failover':\r\n console.warn(parts.join(' '), '→', event.metadata?.['nextProvider'] ?? '');\r\n break;\r\n case 'structured_request':\r\n console.log(\r\n parts.join(' '),\r\n `schema=${event.schemaName ?? 'unknown'}`,\r\n '→',\r\n );\r\n break;\r\n case 'structured_response':\r\n console.log(\r\n parts.join(' '),\r\n event.duration ? `${event.duration}ms` : '',\r\n `schema=${event.schemaName ?? 'unknown'}`,\r\n );\r\n break;\r\n case 'structured_validation_error':\r\n console.error(\r\n parts.join(' '),\r\n `schema=${event.schemaName ?? 'unknown'}`,\r\n event.error ?? 'Validation failed',\r\n event.rawOutput ? `raw=${event.rawOutput.slice(0, 50)}...` : '',\r\n );\r\n break;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Buffered auditor that collects events for batch processing.\r\n * Useful for custom sinks (OpenTelemetry, DataDog, databases, etc.)\r\n */\r\nexport class BufferedAuditor implements Auditor {\r\n private events: AuditEvent[] = [];\r\n private maxBufferSize: number;\r\n private onFlush?: (events: AuditEvent[]) => Promise<void>;\r\n\r\n constructor(options: {\r\n maxBufferSize?: number;\r\n onFlush?: (events: AuditEvent[]) => Promise<void>;\r\n } = {}) {\r\n this.maxBufferSize = options.maxBufferSize ?? 1000;\r\n this.onFlush = options.onFlush;\r\n }\r\n\r\n record(event: AuditEvent): void {\r\n this.events.push(event);\r\n if (this.events.length >= this.maxBufferSize) {\r\n // Auto-flush when buffer is full (fire and forget)\r\n this.flush().catch(() => {});\r\n }\r\n }\r\n\r\n /** Get all buffered events */\r\n getEvents(): ReadonlyArray<AuditEvent> {\r\n return this.events;\r\n }\r\n\r\n /** Flush buffered events to the configured sink */\r\n async flush(): Promise<void> {\r\n if (this.events.length === 0) return;\r\n const batch = this.events.splice(0);\r\n if (this.onFlush) {\r\n await this.onFlush(batch);\r\n }\r\n }\r\n\r\n /** Clear all buffered events without flushing */\r\n clear(): void {\r\n this.events.length = 0;\r\n }\r\n}\r\n"]}
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — Base LLM Client\r\n *\r\n * Abstract base class for all LLM providers.\r\n * Handles tool registration, execution, and the autonomous\r\n * multi-turn tool execution loop.\r\n */\r\n\r\nimport type {\r\n LLMClientOptions,\r\n LLMChatMessage,\r\n LLMChatResponse,\r\n LLMToolDefinition,\r\n LLMToolCall,\r\n LLMFunction,\r\n ToolRegistry,\r\n ToolHandler,\r\n ToolExecutionResult,\r\n ChatOptions,\r\n ModelMetadata,\r\n} from './interfaces.js';\r\nimport {\r\n StructuredOutputError,\r\n type StructuredOutputOptions,\r\n type SchemaConfig,\r\n} from './structured-output.js';\r\nimport type { DecodedEvent } from './stream-decoder.js';\r\nimport type { Auditor } from './auditor.js';\r\nimport { NoopAuditor } from './auditor.js';\r\n\r\n// ============================================================================\r\n// Abstract Base Client\r\n// ============================================================================\r\n\r\nexport abstract class BaseLLMClient {\r\n protected options: LLMClientOptions;\r\n protected toolRegistry: ToolRegistry = {};\r\n protected auditor: Auditor;\r\n protected debug: boolean;\r\n\r\n constructor(options: LLMClientOptions, auditor?: Auditor) {\r\n this.options = options;\r\n this.auditor = auditor ?? new NoopAuditor();\r\n this.debug = options.debug ?? false;\r\n }\r\n\r\n // ========================================================================\r\n // Abstract Methods (implemented by providers)\r\n // ========================================================================\r\n\r\n /** Send a chat request and get a response */\r\n abstract chat(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<LLMChatResponse>;\r\n\r\n /** Stream a chat response as decoded events */\r\n abstract chatStream(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown>;\r\n\r\n /** Get available models */\r\n abstract getModels(): Promise<string[]>;\r\n\r\n /** Generate embeddings for text */\r\n abstract embed(text: string): Promise<number[]>;\r\n\r\n /** Generate embeddings for multiple texts */\r\n async embedArray(texts: string[]): Promise<number[][]> {\r\n return Promise.all(texts.map(t => this.embed(t)));\r\n }\r\n\r\n /**\r\n * Get metadata about a model (context length, architecture, etc.)\r\n * Override per-provider for accurate data.\r\n */\r\n async getModelInfo(_modelName?: string): Promise<ModelMetadata> {\r\n return { contextLength: 8192 }; // Conservative default\r\n }\r\n\r\n // ========================================================================\r\n // Tool Registration\r\n // ========================================================================\r\n\r\n /**\r\n * Sanitize tool name for LLM compatibility.\r\n * LLM APIs require function names matching [a-zA-Z0-9_-].\r\n * Module-prefixed names like \"@core/computer:list_windows\" are cleaned.\r\n */\r\n private sanitizeToolName(name: string): string {\r\n return name\r\n .replace(/^@[^:]+:/, '') // Strip module prefix\r\n .replace(/[^a-zA-Z0-9_-]/g, '_') // Replace illegal chars\r\n .replace(/_+/g, '_') // Collapse\r\n .replace(/^_|_$/g, ''); // Trim\r\n }\r\n\r\n /** Register a tool/function callable by the model */\r\n registerTool(\r\n name: string,\r\n description: string,\r\n parameters: LLMFunction['parameters'],\r\n handler: ToolHandler,\r\n ): void {\r\n const safeName = this.sanitizeToolName(name);\r\n this.toolRegistry[name] = {\r\n definition: { name: safeName, description, parameters },\r\n handler,\r\n };\r\n // Index by sanitized name for reverse lookup\r\n if (safeName !== name && !this.toolRegistry[safeName]) {\r\n this.toolRegistry[safeName] = this.toolRegistry[name]!;\r\n }\r\n this.debugLog(`Registered tool: ${name} (LLM name: ${safeName})`);\r\n }\r\n\r\n /** Register multiple tools at once */\r\n registerTools(\r\n tools: Array<{\r\n name: string;\r\n description: string;\r\n parameters: LLMFunction['parameters'];\r\n handler: ToolHandler;\r\n }>,\r\n ): void {\r\n for (const tool of tools) {\r\n this.registerTool(tool.name, tool.description, tool.parameters, tool.handler);\r\n }\r\n }\r\n\r\n /** Get all registered tool definitions (deduplicated by sanitized name) */\r\n getToolDefinitions(): LLMToolDefinition[] {\r\n const seen = new Set<string>();\r\n const defs: LLMToolDefinition[] = [];\r\n for (const { definition } of Object.values(this.toolRegistry)) {\r\n if (seen.has(definition.name)) continue;\r\n seen.add(definition.name);\r\n defs.push({ type: 'function' as const, function: definition });\r\n }\r\n return defs;\r\n }\r\n\r\n // ========================================================================\r\n // Tool Execution\r\n // ========================================================================\r\n\r\n /** Execute a single tool call with fuzzy name matching */\r\n async executeTool(toolCall: LLMToolCall): Promise<ToolExecutionResult> {\r\n const toolName = toolCall.function.name;\r\n const start = Date.now();\r\n let tool = this.toolRegistry[toolName];\r\n\r\n // Fuzzy lookup: try suffix match (LLM stripped module prefix)\r\n if (!tool) {\r\n const entries = Object.entries(this.toolRegistry);\r\n const bySuffix = entries.find(([k]) => k.endsWith(`:${toolName}`));\r\n if (bySuffix) {\r\n tool = bySuffix[1];\r\n this.debugLog(`Fuzzy tool match: \"${toolName}\" → \"${bySuffix[0]}\"`);\r\n }\r\n\r\n // Try prefix match: if only one tool in that module, use it\r\n if (!tool) {\r\n const byPrefix = entries.filter(([k]) => k.startsWith(`${toolName}:`));\r\n if (byPrefix.length === 1) {\r\n tool = byPrefix[0]![1];\r\n this.debugLog(`Fuzzy tool match (single): \"${toolName}\" → \"${byPrefix[0]![0]}\"`);\r\n }\r\n }\r\n }\r\n\r\n if (!tool) {\r\n const result: ToolExecutionResult = {\r\n tool_call_id: toolCall.id,\r\n output: null,\r\n error: `Unknown tool: ${toolName}`,\r\n duration: Date.now() - start,\r\n };\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'tool_result',\r\n toolExecution: result,\r\n error: result.error,\r\n });\r\n return result;\r\n }\r\n\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'tool_call',\r\n metadata: { toolName, arguments: toolCall.function.arguments },\r\n });\r\n\r\n try {\r\n const args = JSON.parse(toolCall.function.arguments);\r\n const output = await tool.handler(args);\r\n const result: ToolExecutionResult = {\r\n tool_call_id: toolCall.id,\r\n output,\r\n duration: Date.now() - start,\r\n };\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'tool_result',\r\n toolExecution: result,\r\n });\r\n return result;\r\n } catch (error) {\r\n const result: ToolExecutionResult = {\r\n tool_call_id: toolCall.id,\r\n output: null,\r\n error: error instanceof Error ? error.message : String(error),\r\n duration: Date.now() - start,\r\n };\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'tool_result',\r\n toolExecution: result,\r\n error: result.error,\r\n });\r\n return result;\r\n }\r\n }\r\n\r\n /** Execute multiple tool calls in parallel */\r\n async executeTools(toolCalls: LLMToolCall[]): Promise<ToolExecutionResult[]> {\r\n return Promise.all(toolCalls.map(tc => this.executeTool(tc)));\r\n }\r\n\r\n // ========================================================================\r\n // Chat with Tools (multi-turn autonomous loop)\r\n // ========================================================================\r\n\r\n /**\r\n * Chat with automatic tool execution.\r\n * Continues until the model stops calling tools or max iterations reached.\r\n * Returns the complete execution trace in `toolExecutions`.\r\n */\r\n async chatWithTools(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions & { maxIterations?: number },\r\n ): Promise<LLMChatResponse> {\r\n const maxIterations = options?.maxIterations ?? 10;\r\n const conversationMessages = [...messages];\r\n const allToolExecutions: ToolExecutionResult[] = [];\r\n let iterations = 0;\r\n\r\n while (iterations < maxIterations) {\r\n const response = await this.chat(conversationMessages, {\r\n ...options,\r\n tools: this.getToolDefinitions(),\r\n });\r\n\r\n // If no tool calls, return with full trace\r\n if (!response.message.tool_calls?.length) {\r\n return {\r\n ...response,\r\n toolExecutions: allToolExecutions.length > 0 ? allToolExecutions : undefined,\r\n };\r\n }\r\n\r\n // Add assistant message with tool calls\r\n conversationMessages.push(response.message);\r\n\r\n // Execute tools in parallel\r\n const toolResults = await this.executeTools(response.message.tool_calls);\r\n allToolExecutions.push(...toolResults);\r\n\r\n // Add tool results as messages\r\n for (const result of toolResults) {\r\n conversationMessages.push({\r\n role: 'tool',\r\n content: typeof result.output === 'string'\r\n ? result.output\r\n : JSON.stringify(result.output),\r\n tool_call_id: result.tool_call_id,\r\n });\r\n }\r\n\r\n iterations++;\r\n }\r\n\r\n // Max iterations — final call without tools\r\n const finalResponse = await this.chat(conversationMessages);\r\n return {\r\n ...finalResponse,\r\n toolExecutions: allToolExecutions,\r\n };\r\n }\r\n\r\n // ========================================================================\r\n // Helpers\r\n // ========================================================================\r\n\r\n /** Set the model name at runtime */\r\n setModel(modelName: string): void {\r\n this.options.model = modelName;\r\n this.debugLog(`Model switched to: ${modelName}`);\r\n }\r\n\r\n /** Get the current model name */\r\n get model(): string {\r\n return this.options.model;\r\n }\r\n\r\n /** Get the base URL */\r\n get url(): string {\r\n return this.options.url;\r\n }\r\n\r\n /** Set the auditor instance */\r\n setAuditor(auditor: Auditor): void {\r\n this.auditor = auditor;\r\n }\r\n\r\n protected debugLog(message: string, data?: unknown): void {\r\n if (this.debug) {\r\n console.log(`[LLM:${this.options.model}] ${message}`, data ?? '');\r\n }\r\n }\r\n\r\n /**\r\n * Generate a unique ID for tool calls when the provider doesn't provide one.\r\n */\r\n protected generateToolCallId(): string {\r\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n\r\n // ========================================================================\r\n // Structured Output Helpers (shared across all providers)\r\n // ========================================================================\r\n\r\n /**\r\n * Extract schema options from ChatOptions.\r\n * Returns null if no schema is provided.\r\n * Returns a SchemaConfig if a schema was found.\r\n */\r\n protected extractSchemaOptions(options?: ChatOptions): (StructuredOutputOptions<unknown> & { schemaConfig: SchemaConfig<unknown> }) | null {\r\n if (!options) return null;\r\n\r\n if (options.schema) {\r\n return {\r\n schemaConfig: options.schema,\r\n name: options.schemaName,\r\n description: options.schemaDescription,\r\n };\r\n }\r\n\r\n if (options.jsonSchema) {\r\n // Raw JSON Schema without validation\r\n const config: SchemaConfig<unknown> = {\r\n jsonSchema: options.jsonSchema,\r\n };\r\n return {\r\n schemaConfig: config,\r\n name: options.schemaName,\r\n description: options.schemaDescription,\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Validate structured response using a SchemaConfig.\r\n * Throws StructuredOutputError on failure.\r\n */\r\n protected validateStructuredResponse(content: string, config: SchemaConfig<unknown>): void {\r\n if (!content) {\r\n throw new StructuredOutputError(\r\n 'Empty response from LLM',\r\n { rawOutput: content },\r\n );\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(content);\r\n } catch (error) {\r\n const syntaxError = error instanceof SyntaxError\r\n ? error\r\n : new SyntaxError(String(error));\r\n throw new StructuredOutputError(\r\n `Failed to parse JSON: ${syntaxError.message}`,\r\n { rawOutput: content, cause: syntaxError },\r\n );\r\n }\r\n\r\n if (config.validate) {\r\n try {\r\n config.validate(parsed);\r\n } catch (error) {\r\n const validationError = error instanceof Error ? error : new Error(String(error));\r\n throw new StructuredOutputError(\r\n `Validation failed: ${validationError.message}`,\r\n { rawOutput: content, cause: validationError },\r\n );\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
package/dist/http.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAMxD,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA6C1B;AAMD;;;GAGG;AACH,wBAAuB,UAAU,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GACjC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAoDvC;AAMD;;;GAGG;AACH,wBAAuB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC1C,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAC/B,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CA4BlC;AAED;;;GAGG;AACH,wBAAuB,QAAQ,CAC3B,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAC/B,cAAc,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CA6BjE;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU9E"}
|
package/dist/http.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — HTTP Utilities\r\n *\r\n * Zero-dependency HTTP layer using native fetch.\r\n * Works on Node 22+, Bun, Deno, and browsers.\r\n */\r\n\r\nimport type { LLMClientOptions } from './interfaces.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface HttpRequestOptions {\r\n method?: 'GET' | 'POST';\r\n headers?: Record<string, string>;\r\n body?: unknown;\r\n timeout?: number;\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport interface HttpResponse<T = unknown> {\r\n ok: boolean;\r\n status: number;\r\n data: T;\r\n /** Response headers (when available) */\r\n headers?: Headers;\r\n}\r\n\r\n// ============================================================================\r\n// HTTP Request\r\n// ============================================================================\r\n\r\n/**\r\n * Make an HTTP request with timeout and error handling.\r\n * Uses native fetch (available in all target runtimes).\r\n */\r\nexport async function httpRequest<T = unknown>(\r\n url: string,\r\n options: HttpRequestOptions = {},\r\n): Promise<HttpResponse<T>> {\r\n const { method = 'GET', headers = {}, body, timeout = 30000, signal } = options;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n // Combine external signal with timeout\r\n const combinedSignal = signal\r\n ? AbortSignal.any([signal, controller.signal])\r\n : controller.signal;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal: combinedSignal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => 'Unknown error');\r\n throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n }\r\n\r\n const data = (await response.json()) as T;\r\n\r\n return {\r\n ok: response.ok,\r\n status: response.status,\r\n data,\r\n headers: response.headers,\r\n };\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new Error(`Request timeout after ${timeout}ms: ${url}`);\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Streaming HTTP\r\n// ============================================================================\r\n\r\n/**\r\n * Make a streaming HTTP request.\r\n * Yields raw string chunks as they arrive.\r\n */\r\nexport async function* httpStream(\r\n url: string,\r\n options: HttpRequestOptions = {},\r\n): AsyncGenerator<string, void, unknown> {\r\n const { method = 'POST', headers = {}, body, timeout = 120000, signal } = options;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n const combinedSignal = signal\r\n ? AbortSignal.any([signal, controller.signal])\r\n : controller.signal;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal: combinedSignal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => 'Unknown error');\r\n throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n }\r\n\r\n if (!response.body) {\r\n throw new Error('No response body for streaming');\r\n }\r\n\r\n const reader = response.body.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n yield decoder.decode(value, { stream: true });\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new Error(`Stream timeout after ${timeout}ms: ${url}`);\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Protocol Parsers\r\n// ============================================================================\r\n\r\n/**\r\n * Parse NDJSON (newline-delimited JSON) stream.\r\n * Used by Ollama's streaming API.\r\n */\r\nexport async function* parseNDJSON<T = unknown>(\r\n stream: AsyncGenerator<string>,\r\n): AsyncGenerator<T, void, unknown> {\r\n let buffer = '';\r\n\r\n for await (const chunk of stream) {\r\n buffer += chunk;\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() ?? '';\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (!trimmed) continue;\r\n\r\n try {\r\n yield JSON.parse(trimmed) as T;\r\n } catch {\r\n // Skip invalid JSON lines\r\n }\r\n }\r\n }\r\n\r\n // Handle remaining buffer\r\n if (buffer.trim()) {\r\n try {\r\n yield JSON.parse(buffer) as T;\r\n } catch {\r\n // Skip invalid JSON\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Parse Server-Sent Events stream.\r\n * Used by OpenAI-compatible APIs and LlamaCpp/vLLM.\r\n */\r\nexport async function* parseSSE(\r\n stream: AsyncGenerator<string>,\r\n): AsyncGenerator<{ event?: string; data: string }, void, unknown> {\r\n let buffer = '';\r\n\r\n for await (const chunk of stream) {\r\n buffer += chunk;\r\n\r\n // Split by double newlines (SSE event delimiter)\r\n const events = buffer.split('\\n\\n');\r\n buffer = events.pop() ?? '';\r\n\r\n for (const event of events) {\r\n const lines = event.split('\\n');\r\n let eventType: string | undefined;\r\n const dataLines: string[] = [];\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('event:')) {\r\n eventType = line.slice(6).trim();\r\n } else if (line.startsWith('data:')) {\r\n dataLines.push(line.slice(5).trim());\r\n }\r\n }\r\n\r\n const data = dataLines.join('\\n');\r\n if (data && data !== '[DONE]') {\r\n yield { event: eventType, data };\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Header Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Build standard headers for LLM API requests.\r\n */\r\nexport function buildHeaders(options: LLMClientOptions): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n };\r\n\r\n if (options.apiKey) {\r\n headers['Authorization'] = `Bearer ${options.apiKey}`;\r\n }\r\n\r\n return headers;\r\n}\r\n"]}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAMxC,OAAO,EAEH,cAAc,EACd,WAAW,EAEX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,eAAe,EACpB,KAAK,cAAc,EAEnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAElB,KAAK,aAAa,EAElB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,QAAQ,GACX,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACH,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,WAAW,EACX,cAAc,EACd,eAAe,GAClB,MAAM,cAAc,CAAC;AAMtB,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,GAC9B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACH,WAAW,EACX,YAAY,EACZ,cAAc,EACd,sBAAsB,GACzB,MAAM,YAAY,CAAC;AAMpB,OAAO,EACH,WAAW,EACX,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,YAAY,GACpB,MAAM,WAAW,CAAC;AAMnB,OAAO,EACH,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,OAAO,GACf,MAAM,UAAU,CAAC;AAMlB,OAAO,EACH,qBAAqB,EACrB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,yBAAyB,EACzB,yBAAyB,EAEzB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,uBAAuB,EAEvB,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,EAEf,mBAAmB,EACnB,KAAK,yBAAyB,GACjC,MAAM,wBAAwB,CAAC"}
|