@node-llm/core 1.12.0 → 1.14.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 +11 -10
- package/dist/aliases.d.ts +187 -63
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +245 -121
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +4 -2
- package/dist/models/models.json +2919 -867
- package/dist/models/types.d.ts +1 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/providers/mistral/Capabilities.d.ts +19 -0
- package/dist/providers/mistral/Capabilities.d.ts.map +1 -0
- package/dist/providers/mistral/Capabilities.js +113 -0
- package/dist/providers/mistral/Chat.d.ts +8 -0
- package/dist/providers/mistral/Chat.d.ts.map +1 -0
- package/dist/providers/mistral/Chat.js +149 -0
- package/dist/providers/mistral/Embedding.d.ts +8 -0
- package/dist/providers/mistral/Embedding.d.ts.map +1 -0
- package/dist/providers/mistral/Embedding.js +44 -0
- package/dist/providers/mistral/Errors.d.ts +2 -0
- package/dist/providers/mistral/Errors.d.ts.map +1 -0
- package/dist/providers/mistral/Errors.js +57 -0
- package/dist/providers/mistral/MistralProvider.d.ts +40 -0
- package/dist/providers/mistral/MistralProvider.d.ts.map +1 -0
- package/dist/providers/mistral/MistralProvider.js +82 -0
- package/dist/providers/mistral/Models.d.ts +8 -0
- package/dist/providers/mistral/Models.d.ts.map +1 -0
- package/dist/providers/mistral/Models.js +71 -0
- package/dist/providers/mistral/Moderation.d.ts +8 -0
- package/dist/providers/mistral/Moderation.d.ts.map +1 -0
- package/dist/providers/mistral/Moderation.js +49 -0
- package/dist/providers/mistral/Streaming.d.ts +8 -0
- package/dist/providers/mistral/Streaming.d.ts.map +1 -0
- package/dist/providers/mistral/Streaming.js +203 -0
- package/dist/providers/mistral/Transcription.d.ts +9 -0
- package/dist/providers/mistral/Transcription.d.ts.map +1 -0
- package/dist/providers/mistral/Transcription.js +76 -0
- package/dist/providers/mistral/index.d.ts +10 -0
- package/dist/providers/mistral/index.d.ts.map +1 -0
- package/dist/providers/mistral/index.js +26 -0
- package/dist/providers/registry.d.ts +3 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +3 -1
- package/dist/providers/xai/Capabilities.d.ts +12 -0
- package/dist/providers/xai/Capabilities.d.ts.map +1 -0
- package/dist/providers/xai/Capabilities.js +79 -0
- package/dist/providers/xai/Chat.d.ts +8 -0
- package/dist/providers/xai/Chat.d.ts.map +1 -0
- package/dist/providers/xai/Chat.js +69 -0
- package/dist/providers/xai/Errors.d.ts +2 -0
- package/dist/providers/xai/Errors.d.ts.map +1 -0
- package/dist/providers/xai/Errors.js +33 -0
- package/dist/providers/xai/Image.d.ts +8 -0
- package/dist/providers/xai/Image.d.ts.map +1 -0
- package/dist/providers/xai/Image.js +47 -0
- package/dist/providers/xai/Models.d.ts +8 -0
- package/dist/providers/xai/Models.d.ts.map +1 -0
- package/dist/providers/xai/Models.js +47 -0
- package/dist/providers/xai/Streaming.d.ts +8 -0
- package/dist/providers/xai/Streaming.d.ts.map +1 -0
- package/dist/providers/xai/Streaming.js +167 -0
- package/dist/providers/xai/XAIProvider.d.ts +37 -0
- package/dist/providers/xai/XAIProvider.d.ts.map +1 -0
- package/dist/providers/xai/XAIProvider.js +66 -0
- package/dist/providers/xai/index.d.ts +7 -0
- package/dist/providers/xai/index.d.ts.map +1 -0
- package/dist/providers/xai/index.js +19 -0
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ModerationRequest, ModerationResponse } from "../Provider.js";
|
|
2
|
+
export declare class MistralModeration {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
execute(request: ModerationRequest): Promise<ModerationResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Moderation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Moderation.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Moderation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAoB,MAAM,gBAAgB,CAAC;AAgBzF,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAiDvE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { handleMistralError } from "./Errors.js";
|
|
2
|
+
import { logger } from "../../utils/logger.js";
|
|
3
|
+
import { fetchWithTimeout } from "../../utils/fetch.js";
|
|
4
|
+
const DEFAULT_MODERATION_MODEL = "mistral-moderation-latest";
|
|
5
|
+
export class MistralModeration {
|
|
6
|
+
baseUrl;
|
|
7
|
+
apiKey;
|
|
8
|
+
constructor(baseUrl, apiKey) {
|
|
9
|
+
this.baseUrl = baseUrl;
|
|
10
|
+
this.apiKey = apiKey;
|
|
11
|
+
}
|
|
12
|
+
async execute(request) {
|
|
13
|
+
// Mistral's moderation API expects input as a list of conversations
|
|
14
|
+
// Each conversation is a list of messages with role and content
|
|
15
|
+
const inputs = Array.isArray(request.input) ? request.input : [request.input];
|
|
16
|
+
// Convert strings to chat message format
|
|
17
|
+
const formattedInput = inputs.map((text) => [{ role: "user", content: text }]);
|
|
18
|
+
const body = {
|
|
19
|
+
model: request.model || DEFAULT_MODERATION_MODEL,
|
|
20
|
+
input: formattedInput
|
|
21
|
+
};
|
|
22
|
+
const url = `${this.baseUrl}/chat/moderations`;
|
|
23
|
+
logger.logRequest("Mistral", "POST", url, body);
|
|
24
|
+
const response = await fetchWithTimeout(url, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
28
|
+
"Content-Type": "application/json"
|
|
29
|
+
},
|
|
30
|
+
body: JSON.stringify(body)
|
|
31
|
+
}, request.requestTimeout);
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
await handleMistralError(response, request.model || DEFAULT_MODERATION_MODEL);
|
|
34
|
+
}
|
|
35
|
+
const json = (await response.json());
|
|
36
|
+
logger.logResponse("Mistral", response.status, response.statusText, json);
|
|
37
|
+
// Map Mistral's response format to our standard format
|
|
38
|
+
const results = json.results.map((result) => ({
|
|
39
|
+
flagged: Object.values(result.categories).some((v) => v === true),
|
|
40
|
+
categories: result.categories,
|
|
41
|
+
category_scores: result.category_scores
|
|
42
|
+
}));
|
|
43
|
+
return {
|
|
44
|
+
id: json.id,
|
|
45
|
+
model: json.model,
|
|
46
|
+
results
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChatRequest, ChatChunk } from "../Provider.js";
|
|
2
|
+
export declare class MistralStreaming {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
execute(request: ChatRequest, controller?: AbortController): AsyncGenerator<ChatChunk>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Streaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAOxD,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG1B,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;CAgO9F"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { APIError } from "../../errors/index.js";
|
|
2
|
+
import { logger } from "../../utils/logger.js";
|
|
3
|
+
import { handleMistralError } from "./Errors.js";
|
|
4
|
+
import { mapSystemMessages } from "../utils.js";
|
|
5
|
+
import { fetchWithTimeout } from "../../utils/fetch.js";
|
|
6
|
+
export class MistralStreaming {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
constructor(baseUrl, apiKey) {
|
|
10
|
+
this.baseUrl = baseUrl;
|
|
11
|
+
this.apiKey = apiKey;
|
|
12
|
+
}
|
|
13
|
+
async *execute(request, controller) {
|
|
14
|
+
const abortController = controller || new AbortController();
|
|
15
|
+
const { model, messages, tools, max_tokens, response_format, thinking: _thinking, headers: _headers, requestTimeout, signal: _signal, ...rest } = request;
|
|
16
|
+
const mappedMessages = mapSystemMessages(messages, false);
|
|
17
|
+
// Sanitize messages - remove internal properties that Mistral API doesn't accept
|
|
18
|
+
const sanitizedMessages = mappedMessages.map((msg) => {
|
|
19
|
+
const m = msg;
|
|
20
|
+
const { role, content, tool_calls, tool_call_id, name } = m;
|
|
21
|
+
const clean = { role, content };
|
|
22
|
+
if (tool_calls)
|
|
23
|
+
clean.tool_calls = tool_calls;
|
|
24
|
+
if (tool_call_id)
|
|
25
|
+
clean.tool_call_id = tool_call_id;
|
|
26
|
+
if (name)
|
|
27
|
+
clean.name = name;
|
|
28
|
+
return clean;
|
|
29
|
+
});
|
|
30
|
+
const body = {
|
|
31
|
+
model,
|
|
32
|
+
messages: sanitizedMessages,
|
|
33
|
+
stream: true,
|
|
34
|
+
...rest
|
|
35
|
+
};
|
|
36
|
+
if (max_tokens)
|
|
37
|
+
body.max_tokens = max_tokens;
|
|
38
|
+
if (tools && tools.length > 0)
|
|
39
|
+
body.tools = tools;
|
|
40
|
+
if (response_format)
|
|
41
|
+
body.response_format = response_format;
|
|
42
|
+
let done = false;
|
|
43
|
+
// Track tool calls being built across chunks
|
|
44
|
+
const toolCallsMap = new Map();
|
|
45
|
+
try {
|
|
46
|
+
const url = `${this.baseUrl}/chat/completions`;
|
|
47
|
+
logger.logRequest("Mistral", "POST", url, body);
|
|
48
|
+
const response = await fetchWithTimeout(url, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: {
|
|
51
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
52
|
+
"Content-Type": "application/json",
|
|
53
|
+
Accept: "text/event-stream",
|
|
54
|
+
...request.headers
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify(body),
|
|
57
|
+
signal: abortController.signal
|
|
58
|
+
}, requestTimeout);
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
await handleMistralError(response, model);
|
|
61
|
+
}
|
|
62
|
+
logger.debug("Mistral streaming started", {
|
|
63
|
+
status: response.status,
|
|
64
|
+
statusText: response.statusText
|
|
65
|
+
});
|
|
66
|
+
if (!response.body) {
|
|
67
|
+
throw new Error("No response body for streaming");
|
|
68
|
+
}
|
|
69
|
+
const reader = response.body.getReader();
|
|
70
|
+
const decoder = new TextDecoder();
|
|
71
|
+
let buffer = "";
|
|
72
|
+
while (true) {
|
|
73
|
+
const { value, done: readerDone } = await reader.read();
|
|
74
|
+
if (readerDone)
|
|
75
|
+
break;
|
|
76
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
77
|
+
buffer += chunk;
|
|
78
|
+
const lines = buffer.split("\n");
|
|
79
|
+
buffer = lines.pop() || "";
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
let trimmed = line.trim();
|
|
82
|
+
if (trimmed.endsWith("\r")) {
|
|
83
|
+
trimmed = trimmed.substring(0, trimmed.length - 1);
|
|
84
|
+
}
|
|
85
|
+
if (!trimmed.startsWith("data: "))
|
|
86
|
+
continue;
|
|
87
|
+
const data = trimmed.replace("data: ", "").trim();
|
|
88
|
+
if (data === "[DONE]") {
|
|
89
|
+
done = true;
|
|
90
|
+
// Yield final tool calls if any were accumulated
|
|
91
|
+
if (toolCallsMap.size > 0) {
|
|
92
|
+
const toolCalls = Array.from(toolCallsMap.values()).map((tc) => ({
|
|
93
|
+
id: tc.id,
|
|
94
|
+
type: "function",
|
|
95
|
+
function: {
|
|
96
|
+
name: tc.function.name,
|
|
97
|
+
arguments: tc.function.arguments
|
|
98
|
+
}
|
|
99
|
+
}));
|
|
100
|
+
yield {
|
|
101
|
+
content: "",
|
|
102
|
+
tool_calls: toolCalls,
|
|
103
|
+
done: true
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
yield { content: "", done: true };
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const parsed = JSON.parse(data);
|
|
113
|
+
const choice = parsed.choices?.[0];
|
|
114
|
+
const delta = choice?.delta;
|
|
115
|
+
// Handle usage in final chunk
|
|
116
|
+
if (parsed.usage) {
|
|
117
|
+
yield {
|
|
118
|
+
content: "",
|
|
119
|
+
usage: {
|
|
120
|
+
input_tokens: parsed.usage.prompt_tokens ?? 0,
|
|
121
|
+
output_tokens: parsed.usage.completion_tokens ?? 0,
|
|
122
|
+
total_tokens: parsed.usage.total_tokens ?? 0
|
|
123
|
+
},
|
|
124
|
+
done: false
|
|
125
|
+
};
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Handle tool calls
|
|
129
|
+
if (delta?.tool_calls) {
|
|
130
|
+
for (const tc of delta.tool_calls) {
|
|
131
|
+
const index = tc.index ?? 0;
|
|
132
|
+
let existing = toolCallsMap.get(index);
|
|
133
|
+
if (!existing) {
|
|
134
|
+
existing = {
|
|
135
|
+
id: tc.id || "",
|
|
136
|
+
type: tc.type || "function",
|
|
137
|
+
function: {
|
|
138
|
+
name: tc.function?.name || "",
|
|
139
|
+
arguments: ""
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
toolCallsMap.set(index, existing);
|
|
143
|
+
}
|
|
144
|
+
if (tc.id)
|
|
145
|
+
existing.id = tc.id;
|
|
146
|
+
if (tc.function?.name)
|
|
147
|
+
existing.function.name = tc.function.name;
|
|
148
|
+
if (tc.function?.arguments)
|
|
149
|
+
existing.function.arguments += tc.function.arguments;
|
|
150
|
+
}
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// Handle content
|
|
154
|
+
const content = delta?.content || "";
|
|
155
|
+
if (content) {
|
|
156
|
+
yield {
|
|
157
|
+
content,
|
|
158
|
+
done: false,
|
|
159
|
+
finish_reason: choice?.finish_reason ?? null
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Skip malformed JSON
|
|
165
|
+
logger.debug("Mistral streaming: failed to parse chunk", { data });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Final chunk if not already sent
|
|
170
|
+
if (!done) {
|
|
171
|
+
if (toolCallsMap.size > 0) {
|
|
172
|
+
const toolCalls = Array.from(toolCallsMap.values()).map((tc) => ({
|
|
173
|
+
id: tc.id,
|
|
174
|
+
type: "function",
|
|
175
|
+
function: {
|
|
176
|
+
name: tc.function.name,
|
|
177
|
+
arguments: tc.function.arguments
|
|
178
|
+
}
|
|
179
|
+
}));
|
|
180
|
+
yield {
|
|
181
|
+
content: "",
|
|
182
|
+
tool_calls: toolCalls,
|
|
183
|
+
done: true
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
yield { content: "", done: true };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (error instanceof APIError)
|
|
193
|
+
throw error;
|
|
194
|
+
const isAbort = error instanceof Error &&
|
|
195
|
+
(error.name === "AbortError" || error.message.includes("aborted"));
|
|
196
|
+
if (isAbort) {
|
|
197
|
+
yield { content: "", done: true };
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TranscriptionRequest, TranscriptionResponse } from "../Provider.js";
|
|
2
|
+
export declare class MistralTranscription {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
execute(request: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
7
|
+
private getMimeType;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=Transcription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transcription.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/Transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAwB,MAAM,gBAAgB,CAAC;AAqBnG,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA2D5E,OAAO,CAAC,WAAW;CAmBpB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { handleMistralError } from "./Errors.js";
|
|
2
|
+
import { AudioUtils } from "../../utils/audio.js";
|
|
3
|
+
import { logger } from "../../utils/logger.js";
|
|
4
|
+
import { fetchWithTimeout } from "../../utils/fetch.js";
|
|
5
|
+
const DEFAULT_TRANSCRIPTION_MODEL = "voxtral-mini-latest";
|
|
6
|
+
export class MistralTranscription {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
constructor(baseUrl, apiKey) {
|
|
10
|
+
this.baseUrl = baseUrl;
|
|
11
|
+
this.apiKey = apiKey;
|
|
12
|
+
}
|
|
13
|
+
async execute(request) {
|
|
14
|
+
const formData = new FormData();
|
|
15
|
+
const { data, fileName, duration: estimatedDuration } = await AudioUtils.load(request.file);
|
|
16
|
+
const mimeType = this.getMimeType(fileName);
|
|
17
|
+
const file = new File([data], fileName, { type: mimeType });
|
|
18
|
+
formData.append("file", file);
|
|
19
|
+
formData.append("model", request.model || DEFAULT_TRANSCRIPTION_MODEL);
|
|
20
|
+
formData.append("response_format", "verbose_json");
|
|
21
|
+
if (request.prompt) {
|
|
22
|
+
formData.append("prompt", request.prompt);
|
|
23
|
+
}
|
|
24
|
+
if (request.language) {
|
|
25
|
+
formData.append("language", request.language);
|
|
26
|
+
}
|
|
27
|
+
const url = `${this.baseUrl}/audio/transcriptions`;
|
|
28
|
+
logger.logRequest("Mistral", "POST", url, {
|
|
29
|
+
model: request.model || DEFAULT_TRANSCRIPTION_MODEL,
|
|
30
|
+
file: fileName
|
|
31
|
+
});
|
|
32
|
+
const response = await fetchWithTimeout(url, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
36
|
+
},
|
|
37
|
+
body: formData
|
|
38
|
+
}, request.requestTimeout);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
await handleMistralError(response, request.model || DEFAULT_TRANSCRIPTION_MODEL);
|
|
41
|
+
}
|
|
42
|
+
const json = (await response.json());
|
|
43
|
+
logger.logResponse("Mistral", response.status, response.statusText, json);
|
|
44
|
+
const segments = json.segments?.map((s) => ({
|
|
45
|
+
id: s.id,
|
|
46
|
+
start: s.start,
|
|
47
|
+
end: s.end,
|
|
48
|
+
text: s.text
|
|
49
|
+
}));
|
|
50
|
+
return {
|
|
51
|
+
text: json.text,
|
|
52
|
+
model: json.model || request.model || DEFAULT_TRANSCRIPTION_MODEL,
|
|
53
|
+
duration: json.duration || estimatedDuration,
|
|
54
|
+
segments
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
getMimeType(fileName) {
|
|
58
|
+
const ext = fileName.toLowerCase().split(".").pop();
|
|
59
|
+
switch (ext) {
|
|
60
|
+
case "wav":
|
|
61
|
+
return "audio/wav";
|
|
62
|
+
case "mp3":
|
|
63
|
+
return "audio/mpeg";
|
|
64
|
+
case "m4a":
|
|
65
|
+
return "audio/mp4";
|
|
66
|
+
case "flac":
|
|
67
|
+
return "audio/flac";
|
|
68
|
+
case "ogg":
|
|
69
|
+
return "audio/ogg";
|
|
70
|
+
case "webm":
|
|
71
|
+
return "audio/webm";
|
|
72
|
+
default:
|
|
73
|
+
return "audio/mpeg";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./MistralProvider.js";
|
|
2
|
+
export * from "./Chat.js";
|
|
3
|
+
export * from "./Models.js";
|
|
4
|
+
export * from "./Capabilities.js";
|
|
5
|
+
export * from "./Embedding.js";
|
|
6
|
+
export * from "./Transcription.js";
|
|
7
|
+
export * from "./Moderation.js";
|
|
8
|
+
export declare function registerMistralProvider(): void;
|
|
9
|
+
export declare const ensureMistralRegistered: typeof registerMistralProvider;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/index.ts"],"names":[],"mappings":"AAIA,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAIhC,wBAAgB,uBAAuB,SAkBtC;AAED,eAAO,MAAM,uBAAuB,gCAA0B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { config as globalConfig } from "../../config.js";
|
|
2
|
+
import { providerRegistry } from "../registry.js";
|
|
3
|
+
import { MistralProvider } from "./MistralProvider.js";
|
|
4
|
+
export * from "./MistralProvider.js";
|
|
5
|
+
export * from "./Chat.js";
|
|
6
|
+
export * from "./Models.js";
|
|
7
|
+
export * from "./Capabilities.js";
|
|
8
|
+
export * from "./Embedding.js";
|
|
9
|
+
export * from "./Transcription.js";
|
|
10
|
+
export * from "./Moderation.js";
|
|
11
|
+
let registered = false;
|
|
12
|
+
export function registerMistralProvider() {
|
|
13
|
+
if (registered)
|
|
14
|
+
return;
|
|
15
|
+
providerRegistry.register("mistral", (config) => {
|
|
16
|
+
const cfg = config || globalConfig;
|
|
17
|
+
const apiKey = cfg.mistralApiKey;
|
|
18
|
+
const baseUrl = cfg.mistralApiBase;
|
|
19
|
+
if (!apiKey) {
|
|
20
|
+
throw new Error("mistral_api_key is not set in config or MISTRAL_API_KEY environment variable");
|
|
21
|
+
}
|
|
22
|
+
return new MistralProvider({ apiKey, baseUrl });
|
|
23
|
+
});
|
|
24
|
+
registered = true;
|
|
25
|
+
}
|
|
26
|
+
export const ensureMistralRegistered = registerMistralProvider;
|
|
@@ -6,6 +6,8 @@ import { registerDeepSeekProvider } from "./deepseek/index.js";
|
|
|
6
6
|
import { registerOllamaProvider } from "./ollama/index.js";
|
|
7
7
|
import { registerOpenRouterProvider } from "./openrouter/index.js";
|
|
8
8
|
import { registerBedrockProvider } from "./bedrock/index.js";
|
|
9
|
+
import { registerXAIProvider } from "./xai/index.js";
|
|
10
|
+
import { registerMistralProvider } from "./mistral/index.js";
|
|
9
11
|
import { NodeLLMConfig } from "../config.js";
|
|
10
12
|
type ProviderFactory = (config?: NodeLLMConfig) => Provider;
|
|
11
13
|
export type ProviderInterceptor = (provider: Provider) => Provider;
|
|
@@ -46,5 +48,5 @@ declare class ProviderRegistry {
|
|
|
46
48
|
* ```
|
|
47
49
|
*/
|
|
48
50
|
export declare const providerRegistry: ProviderRegistry;
|
|
49
|
-
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider };
|
|
51
|
+
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider };
|
|
50
52
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,KAAK,eAAe,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,QAAQ,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEnE,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAEzC,cAAc,CAAC,WAAW,EAAE,mBAAmB,GAAG,SAAS;IAIlE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAO/C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ;IAgBvD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAGvD,OAAO,EACL,sBAAsB,IAAI,sBAAsB,EAChD,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,KAAK,eAAe,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,QAAQ,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEnE,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAEzC,cAAc,CAAC,WAAW,EAAE,mBAAmB,GAAG,SAAS;IAIlE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAO/C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ;IAgBvD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAGvD,OAAO,EACL,sBAAsB,IAAI,sBAAsB,EAChD,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACxB,CAAC"}
|
|
@@ -5,6 +5,8 @@ import { registerDeepSeekProvider } from "./deepseek/index.js";
|
|
|
5
5
|
import { registerOllamaProvider } from "./ollama/index.js";
|
|
6
6
|
import { registerOpenRouterProvider } from "./openrouter/index.js";
|
|
7
7
|
import { registerBedrockProvider } from "./bedrock/index.js";
|
|
8
|
+
import { registerXAIProvider } from "./xai/index.js";
|
|
9
|
+
import { registerMistralProvider } from "./mistral/index.js";
|
|
8
10
|
class ProviderRegistry {
|
|
9
11
|
providers = new Map();
|
|
10
12
|
globalInterceptor;
|
|
@@ -64,4 +66,4 @@ class ProviderRegistry {
|
|
|
64
66
|
*/
|
|
65
67
|
export const providerRegistry = new ProviderRegistry();
|
|
66
68
|
// Exported registration functions (delegates to provider-specific index files)
|
|
67
|
-
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider };
|
|
69
|
+
export { registerOpenAIProvider as ensureOpenAIRegistered, registerOpenAIProvider, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class Capabilities {
|
|
2
|
+
static supportsVision(model: string): boolean;
|
|
3
|
+
static supportsTools(model: string): boolean;
|
|
4
|
+
static supportsStructuredOutput(model: string): boolean;
|
|
5
|
+
static supportsEmbeddings(model: string): boolean;
|
|
6
|
+
static supportsImageGeneration(model: string): boolean;
|
|
7
|
+
static supportsTranscription(model: string): boolean;
|
|
8
|
+
static supportsModeration(model: string): boolean;
|
|
9
|
+
static supportsReasoning(model: string): boolean;
|
|
10
|
+
static getContextWindow(model: string): number;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=Capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Capabilities.ts"],"names":[],"mappings":"AAsBA,qBAAa,YAAY;IACvB,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAO7C,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAS5C,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASvD,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOtD,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOpD,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOjD,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOhD,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAM/C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ModelRegistry } from "../../models/ModelRegistry.js";
|
|
2
|
+
const VISION_MODELS = [
|
|
3
|
+
"grok-2-vision-1212",
|
|
4
|
+
"grok-4-0709",
|
|
5
|
+
"grok-4-fast-non-reasoning",
|
|
6
|
+
"grok-4-fast-reasoning",
|
|
7
|
+
"grok-4.1-fast-non-reasoning",
|
|
8
|
+
"grok-4.1-fast-reasoning",
|
|
9
|
+
"grok-4-1-fast-non-reasoning",
|
|
10
|
+
"grok-4-1-fast-reasoning"
|
|
11
|
+
];
|
|
12
|
+
const REASONING_MODELS = [
|
|
13
|
+
"grok-3-mini",
|
|
14
|
+
"grok-4-0709",
|
|
15
|
+
"grok-4-fast-reasoning",
|
|
16
|
+
"grok-4.1-fast-reasoning",
|
|
17
|
+
"grok-4-1-fast-reasoning",
|
|
18
|
+
"grok-code-fast-1"
|
|
19
|
+
];
|
|
20
|
+
export class Capabilities {
|
|
21
|
+
static supportsVision(model) {
|
|
22
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
23
|
+
if (registryModel?.capabilities.includes("vision"))
|
|
24
|
+
return true;
|
|
25
|
+
return model.includes("vision") || VISION_MODELS.includes(model);
|
|
26
|
+
}
|
|
27
|
+
static supportsTools(model) {
|
|
28
|
+
if (this.supportsImageGeneration(model))
|
|
29
|
+
return false;
|
|
30
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
31
|
+
if (registryModel?.capabilities.includes("tools"))
|
|
32
|
+
return true;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
static supportsStructuredOutput(model) {
|
|
36
|
+
if (this.supportsImageGeneration(model))
|
|
37
|
+
return false;
|
|
38
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
39
|
+
if (registryModel?.capabilities.includes("structured_output"))
|
|
40
|
+
return true;
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
static supportsEmbeddings(model) {
|
|
44
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
45
|
+
if (registryModel?.capabilities.includes("embeddings"))
|
|
46
|
+
return true;
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
static supportsImageGeneration(model) {
|
|
50
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
51
|
+
if (registryModel?.capabilities.includes("image_generation"))
|
|
52
|
+
return true;
|
|
53
|
+
return model.includes("image") || model.includes("imagine");
|
|
54
|
+
}
|
|
55
|
+
static supportsTranscription(model) {
|
|
56
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
57
|
+
if (registryModel?.capabilities.includes("transcription"))
|
|
58
|
+
return true;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
static supportsModeration(model) {
|
|
62
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
63
|
+
if (registryModel?.capabilities.includes("moderation"))
|
|
64
|
+
return true;
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
static supportsReasoning(model) {
|
|
68
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
69
|
+
if (registryModel?.capabilities.includes("reasoning"))
|
|
70
|
+
return true;
|
|
71
|
+
return model.includes("reasoning") || REASONING_MODELS.includes(model);
|
|
72
|
+
}
|
|
73
|
+
static getContextWindow(model) {
|
|
74
|
+
const registryModel = ModelRegistry.find(model, "xai");
|
|
75
|
+
if (registryModel?.context_window)
|
|
76
|
+
return registryModel.context_window;
|
|
77
|
+
return 128000;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChatRequest, ChatResponse } from "../Provider.js";
|
|
2
|
+
export declare class XAIChat {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
execute(request: ChatRequest): Promise<ChatResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAiClE,qBAAa,OAAO;IAEhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAgF3D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ModelRegistry } from "../../models/ModelRegistry.js";
|
|
2
|
+
import { logger } from "../../utils/logger.js";
|
|
3
|
+
import { handleXAIError } from "./Errors.js";
|
|
4
|
+
import { mapSystemMessages } from "../utils.js";
|
|
5
|
+
import { fetchWithTimeout } from "../../utils/fetch.js";
|
|
6
|
+
export class XAIChat {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
constructor(baseUrl, apiKey) {
|
|
10
|
+
this.baseUrl = baseUrl;
|
|
11
|
+
this.apiKey = apiKey;
|
|
12
|
+
}
|
|
13
|
+
async execute(request) {
|
|
14
|
+
const { model, messages, tools, max_tokens, response_format, thinking: _thinking, headers: _headers, requestTimeout, ...rest } = request;
|
|
15
|
+
const mappedMessages = mapSystemMessages(messages, false);
|
|
16
|
+
const body = {
|
|
17
|
+
model,
|
|
18
|
+
messages: mappedMessages,
|
|
19
|
+
...rest
|
|
20
|
+
};
|
|
21
|
+
if (max_tokens)
|
|
22
|
+
body.max_tokens = max_tokens;
|
|
23
|
+
if (tools && tools.length > 0)
|
|
24
|
+
body.tools = tools;
|
|
25
|
+
if (response_format)
|
|
26
|
+
body.response_format = response_format;
|
|
27
|
+
const url = `${this.baseUrl}/chat/completions`;
|
|
28
|
+
logger.logRequest("xAI", "POST", url, body);
|
|
29
|
+
const response = await fetchWithTimeout(url, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
...request.headers
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify(body)
|
|
37
|
+
}, requestTimeout);
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
await handleXAIError(response, model);
|
|
40
|
+
}
|
|
41
|
+
const json = (await response.json());
|
|
42
|
+
logger.logResponse("xAI", response.status, response.statusText, json);
|
|
43
|
+
const message = json.choices[0]?.message;
|
|
44
|
+
const content = message?.content ?? null;
|
|
45
|
+
const usage = {
|
|
46
|
+
input_tokens: json.usage.prompt_tokens,
|
|
47
|
+
output_tokens: json.usage.completion_tokens,
|
|
48
|
+
total_tokens: json.usage.total_tokens
|
|
49
|
+
};
|
|
50
|
+
const toolCalls = message?.tool_calls?.map((tc) => ({
|
|
51
|
+
id: tc.id,
|
|
52
|
+
type: "function",
|
|
53
|
+
function: {
|
|
54
|
+
name: tc.function.name,
|
|
55
|
+
arguments: tc.function.arguments
|
|
56
|
+
}
|
|
57
|
+
}));
|
|
58
|
+
if (!content && (!toolCalls || toolCalls.length === 0)) {
|
|
59
|
+
throw new Error("xAI returned empty response");
|
|
60
|
+
}
|
|
61
|
+
// Cost calculation if registered in ModelRegistry
|
|
62
|
+
const calculatedUsage = ModelRegistry.calculateCost(usage, model, "xai");
|
|
63
|
+
return {
|
|
64
|
+
content,
|
|
65
|
+
usage: calculatedUsage,
|
|
66
|
+
tool_calls: toolCalls
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Errors.ts"],"names":[],"mappings":"AASA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAiCvF"}
|