@anvia/mistral 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.js +456 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Indra Zulfi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @anvia/mistral
|
|
2
|
+
|
|
3
|
+
Mistral provider adapter for Anvia.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { AgentBuilder } from "@anvia/core";
|
|
7
|
+
import { MistralClient } from "@anvia/mistral";
|
|
8
|
+
|
|
9
|
+
const client = new MistralClient({ apiKey: process.env.MISTRAL_API_KEY });
|
|
10
|
+
const model = client.completionModel("mistral-large-latest");
|
|
11
|
+
|
|
12
|
+
const agent = new AgentBuilder("support", model)
|
|
13
|
+
.instructions("Answer clearly and concisely.")
|
|
14
|
+
.build();
|
|
15
|
+
|
|
16
|
+
const response = await agent.prompt("What should I check before launch?").send();
|
|
17
|
+
console.log(response.output);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Embeddings
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
const embeddings = client.embeddingModel("mistral-embed");
|
|
24
|
+
const vectors = await embeddings.embedTexts(["Refunds take five business days."]);
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Capabilities
|
|
28
|
+
|
|
29
|
+
The v1 adapter supports text completions, streaming, tools, tool choice, structured output, and Mistral embeddings. Image inputs, document file inputs, transcription, audio generation, image generation, and model listing are not implemented yet.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Mistral } from '@mistralai/mistralai';
|
|
2
|
+
import { StreamingCompletionModel, CompletionModelCapabilities, CompletionRequest, CompletionResponse, CompletionStreamEvent, Message, ToolDefinition } from '@anvia/core/completion';
|
|
3
|
+
import { EmbeddingModel, Embedding } from '@anvia/core/embeddings';
|
|
4
|
+
|
|
5
|
+
type MistralChatParams = Record<string, unknown>;
|
|
6
|
+
type MistralChatMessage = Record<string, unknown>;
|
|
7
|
+
declare class MistralCompletionModel implements StreamingCompletionModel {
|
|
8
|
+
private readonly client;
|
|
9
|
+
readonly defaultModel: string;
|
|
10
|
+
readonly provider = "mistral";
|
|
11
|
+
readonly capabilities: CompletionModelCapabilities;
|
|
12
|
+
constructor(client: Mistral, defaultModel?: string);
|
|
13
|
+
completion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
14
|
+
streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent>;
|
|
15
|
+
}
|
|
16
|
+
declare function toMistralChatParams(defaultModel: string, request: CompletionRequest): MistralChatParams;
|
|
17
|
+
declare function fromMistralChatResponse(response: unknown): CompletionResponse;
|
|
18
|
+
declare function fromMistralChatStreamChunk(chunk: unknown): CompletionStreamEvent[];
|
|
19
|
+
declare function messageToMistralMessages(message: Message): MistralChatMessage[];
|
|
20
|
+
declare function toolDefinitionToMistral(tool: ToolDefinition): MistralChatMessage;
|
|
21
|
+
declare const mistralMessageHelpers: {
|
|
22
|
+
messageToMistralMessages: typeof messageToMistralMessages;
|
|
23
|
+
toolDefinitionToMistral: typeof toolDefinitionToMistral;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
type MistralEmbeddingModelOptions = {
|
|
27
|
+
dimensions?: number | undefined;
|
|
28
|
+
maxBatchSize?: number | undefined;
|
|
29
|
+
};
|
|
30
|
+
declare class MistralEmbeddingModel implements EmbeddingModel {
|
|
31
|
+
private readonly client;
|
|
32
|
+
private readonly model;
|
|
33
|
+
readonly dimensions: number | undefined;
|
|
34
|
+
readonly maxBatchSize: number;
|
|
35
|
+
constructor(client: Mistral, model: string, options?: MistralEmbeddingModelOptions);
|
|
36
|
+
embedTexts(texts: string[]): Promise<Embedding[]>;
|
|
37
|
+
private embedBatch;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type MistralClientOptions = {
|
|
41
|
+
apiKey?: string | undefined;
|
|
42
|
+
serverURL?: string | undefined;
|
|
43
|
+
client?: Mistral | undefined;
|
|
44
|
+
};
|
|
45
|
+
declare class MistralClient {
|
|
46
|
+
readonly client: Mistral;
|
|
47
|
+
constructor(options?: MistralClientOptions);
|
|
48
|
+
completionModel(model?: string): MistralCompletionModel;
|
|
49
|
+
embeddingModel(model?: string, options?: MistralEmbeddingModelOptions): MistralEmbeddingModel;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
type index_MistralClient = MistralClient;
|
|
53
|
+
declare const index_MistralClient: typeof MistralClient;
|
|
54
|
+
type index_MistralClientOptions = MistralClientOptions;
|
|
55
|
+
type index_MistralCompletionModel = MistralCompletionModel;
|
|
56
|
+
declare const index_MistralCompletionModel: typeof MistralCompletionModel;
|
|
57
|
+
type index_MistralEmbeddingModel = MistralEmbeddingModel;
|
|
58
|
+
declare const index_MistralEmbeddingModel: typeof MistralEmbeddingModel;
|
|
59
|
+
type index_MistralEmbeddingModelOptions = MistralEmbeddingModelOptions;
|
|
60
|
+
declare const index_fromMistralChatResponse: typeof fromMistralChatResponse;
|
|
61
|
+
declare const index_fromMistralChatStreamChunk: typeof fromMistralChatStreamChunk;
|
|
62
|
+
declare const index_mistralMessageHelpers: typeof mistralMessageHelpers;
|
|
63
|
+
declare const index_toMistralChatParams: typeof toMistralChatParams;
|
|
64
|
+
declare namespace index {
|
|
65
|
+
export { index_MistralClient as MistralClient, type index_MistralClientOptions as MistralClientOptions, index_MistralCompletionModel as MistralCompletionModel, index_MistralEmbeddingModel as MistralEmbeddingModel, type index_MistralEmbeddingModelOptions as MistralEmbeddingModelOptions, index_fromMistralChatResponse as fromMistralChatResponse, index_fromMistralChatStreamChunk as fromMistralChatStreamChunk, index_mistralMessageHelpers as mistralMessageHelpers, index_toMistralChatParams as toMistralChatParams };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export { MistralClient, type MistralClientOptions, MistralCompletionModel, MistralEmbeddingModel, type MistralEmbeddingModelOptions, fromMistralChatResponse, fromMistralChatStreamChunk, index as mistral, mistralMessageHelpers, toMistralChatParams };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/mistral/index.ts
|
|
8
|
+
var mistral_exports = {};
|
|
9
|
+
__export(mistral_exports, {
|
|
10
|
+
MistralClient: () => MistralClient,
|
|
11
|
+
MistralCompletionModel: () => MistralCompletionModel,
|
|
12
|
+
MistralEmbeddingModel: () => MistralEmbeddingModel,
|
|
13
|
+
fromMistralChatResponse: () => fromMistralChatResponse,
|
|
14
|
+
fromMistralChatStreamChunk: () => fromMistralChatStreamChunk,
|
|
15
|
+
mistralMessageHelpers: () => mistralMessageHelpers,
|
|
16
|
+
toMistralChatParams: () => toMistralChatParams
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// src/mistral/client.ts
|
|
20
|
+
import { Mistral } from "@mistralai/mistralai";
|
|
21
|
+
|
|
22
|
+
// src/mistral/completion.ts
|
|
23
|
+
import {
|
|
24
|
+
AssistantContent,
|
|
25
|
+
assertCompletionRequestSupported,
|
|
26
|
+
Usage
|
|
27
|
+
} from "@anvia/core/completion";
|
|
28
|
+
|
|
29
|
+
// src/request-messages.ts
|
|
30
|
+
import {
|
|
31
|
+
Message,
|
|
32
|
+
normalizeDocuments
|
|
33
|
+
} from "@anvia/core/completion";
|
|
34
|
+
function orderedRequestMessages(request, options = {}) {
|
|
35
|
+
const messages = [];
|
|
36
|
+
if (options.includeInstructionsAsSystem === true && request.instructions !== void 0) {
|
|
37
|
+
messages.push(Message.system(request.instructions));
|
|
38
|
+
}
|
|
39
|
+
messages.push(...request.chatHistory.filter((message) => message.role === "system"));
|
|
40
|
+
const documents = normalizeDocuments(request.documents);
|
|
41
|
+
if (documents !== void 0) {
|
|
42
|
+
messages.push(documents);
|
|
43
|
+
}
|
|
44
|
+
messages.push(...request.chatHistory.filter((message) => message.role !== "system"));
|
|
45
|
+
return messages;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/utils.ts
|
|
49
|
+
function isPlainObject(value) {
|
|
50
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
51
|
+
}
|
|
52
|
+
function numberFrom(value) {
|
|
53
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
54
|
+
}
|
|
55
|
+
function stringFrom(value) {
|
|
56
|
+
return typeof value === "string" ? value : void 0;
|
|
57
|
+
}
|
|
58
|
+
function parseJsonValue(text) {
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(text);
|
|
61
|
+
} catch {
|
|
62
|
+
return text;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function schemaName(schema) {
|
|
66
|
+
return typeof schema.title === "string" ? schema.title : "response_schema";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/mistral/completion.ts
|
|
70
|
+
var MistralCompletionModel = class {
|
|
71
|
+
constructor(client, defaultModel = "mistral-large-latest") {
|
|
72
|
+
this.client = client;
|
|
73
|
+
this.defaultModel = defaultModel;
|
|
74
|
+
}
|
|
75
|
+
client;
|
|
76
|
+
defaultModel;
|
|
77
|
+
provider = "mistral";
|
|
78
|
+
capabilities = {
|
|
79
|
+
streaming: true,
|
|
80
|
+
tools: true,
|
|
81
|
+
toolChoice: true,
|
|
82
|
+
imageInput: false,
|
|
83
|
+
documentInput: false,
|
|
84
|
+
outputSchema: true,
|
|
85
|
+
reasoning: false
|
|
86
|
+
};
|
|
87
|
+
async completion(request) {
|
|
88
|
+
assertCompletionRequestSupported(this, request);
|
|
89
|
+
const params = toMistralChatParams(this.defaultModel, request);
|
|
90
|
+
const response = await this.client.chat.complete(params);
|
|
91
|
+
return fromMistralChatResponse(response);
|
|
92
|
+
}
|
|
93
|
+
async *streamCompletion(request) {
|
|
94
|
+
assertCompletionRequestSupported(this, request, { streaming: true });
|
|
95
|
+
const params = toMistralChatParams(this.defaultModel, request);
|
|
96
|
+
const stream = await this.client.chat.stream(params);
|
|
97
|
+
for await (const chunk of stream) {
|
|
98
|
+
for (const event of fromMistralChatStreamChunk(chunk)) {
|
|
99
|
+
yield event;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
function toMistralChatParams(defaultModel, request) {
|
|
105
|
+
const params = {
|
|
106
|
+
model: request.model ?? defaultModel,
|
|
107
|
+
messages: requestMessages(request).flatMap(messageToMistralMessages)
|
|
108
|
+
};
|
|
109
|
+
if (request.temperature !== void 0) {
|
|
110
|
+
params.temperature = request.temperature;
|
|
111
|
+
}
|
|
112
|
+
if (request.maxTokens !== void 0) {
|
|
113
|
+
params.maxTokens = request.maxTokens;
|
|
114
|
+
}
|
|
115
|
+
if (request.tools.length > 0) {
|
|
116
|
+
params.tools = request.tools.map(toolDefinitionToMistral);
|
|
117
|
+
}
|
|
118
|
+
if (request.toolChoice !== void 0) {
|
|
119
|
+
params.toolChoice = toolChoiceToMistral(request.toolChoice);
|
|
120
|
+
}
|
|
121
|
+
if (request.outputSchema !== void 0) {
|
|
122
|
+
params.responseFormat = {
|
|
123
|
+
type: "json_schema",
|
|
124
|
+
jsonSchema: {
|
|
125
|
+
name: schemaName(request.outputSchema),
|
|
126
|
+
strict: true,
|
|
127
|
+
schema: request.outputSchema
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (request.additionalParams !== void 0 && isPlainObject(request.additionalParams)) {
|
|
132
|
+
Object.assign(params, request.additionalParams);
|
|
133
|
+
}
|
|
134
|
+
return params;
|
|
135
|
+
}
|
|
136
|
+
function requestMessages(request) {
|
|
137
|
+
return orderedRequestMessages(request, { includeInstructionsAsSystem: true });
|
|
138
|
+
}
|
|
139
|
+
function fromMistralChatResponse(response) {
|
|
140
|
+
const raw = response;
|
|
141
|
+
const choices = Array.isArray(raw.choices) ? raw.choices : [];
|
|
142
|
+
const firstChoice = choices.find(isPlainObject);
|
|
143
|
+
const message = isPlainObject(firstChoice?.message) ? firstChoice.message : {};
|
|
144
|
+
const choice = [];
|
|
145
|
+
const text = stringContent(message.content);
|
|
146
|
+
if (text !== void 0 && text.length > 0) {
|
|
147
|
+
choice.push(AssistantContent.text(text));
|
|
148
|
+
}
|
|
149
|
+
const toolCalls = toolCallsFrom(message);
|
|
150
|
+
for (const toolCall of toolCalls) {
|
|
151
|
+
const fn = isPlainObject(toolCall.function) ? toolCall.function : {};
|
|
152
|
+
const id = stringFrom(toolCall.id) ?? crypto.randomUUID();
|
|
153
|
+
const name = stringFrom(fn.name) ?? "";
|
|
154
|
+
const args = parseToolArguments(fn.arguments);
|
|
155
|
+
choice.push(AssistantContent.toolCall(id, name, args));
|
|
156
|
+
}
|
|
157
|
+
const result = {
|
|
158
|
+
choice,
|
|
159
|
+
usage: usageFromMistral(raw.usage),
|
|
160
|
+
rawResponse: response
|
|
161
|
+
};
|
|
162
|
+
if (typeof raw.id === "string") {
|
|
163
|
+
result.messageId = raw.id;
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
function fromMistralChatStreamChunk(chunk) {
|
|
168
|
+
if (!isPlainObject(chunk)) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
const events = [];
|
|
172
|
+
const choices = Array.isArray(chunk.choices) ? chunk.choices : [];
|
|
173
|
+
for (const choice of choices) {
|
|
174
|
+
if (!isPlainObject(choice) || !isPlainObject(choice.delta)) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const delta = choice.delta;
|
|
178
|
+
const content = stringContent(delta.content);
|
|
179
|
+
if (content !== void 0 && content.length > 0) {
|
|
180
|
+
events.push({ type: "text_delta", delta: content });
|
|
181
|
+
}
|
|
182
|
+
for (const toolCall of toolCallsFrom(delta)) {
|
|
183
|
+
if (!isPlainObject(toolCall)) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const fn = isPlainObject(toolCall.function) ? toolCall.function : {};
|
|
187
|
+
const index = numberFrom(toolCall.index);
|
|
188
|
+
events.push(
|
|
189
|
+
toolCallDelta(`tool_${index}`, {
|
|
190
|
+
callId: stringFrom(toolCall.id),
|
|
191
|
+
name: stringFrom(fn.name),
|
|
192
|
+
argumentsDelta: stringFrom(fn.arguments)
|
|
193
|
+
})
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (typeof chunk.id === "string") {
|
|
198
|
+
events.push({ type: "message_id", id: chunk.id });
|
|
199
|
+
}
|
|
200
|
+
if (isPlainObject(chunk.usage)) {
|
|
201
|
+
const response = {
|
|
202
|
+
choice: [],
|
|
203
|
+
usage: usageFromMistral(chunk.usage),
|
|
204
|
+
rawResponse: chunk
|
|
205
|
+
};
|
|
206
|
+
if (typeof chunk.id === "string") {
|
|
207
|
+
response.messageId = chunk.id;
|
|
208
|
+
}
|
|
209
|
+
events.push({ type: "final", response });
|
|
210
|
+
}
|
|
211
|
+
return events;
|
|
212
|
+
}
|
|
213
|
+
function usageFromMistral(usage) {
|
|
214
|
+
const raw = isPlainObject(usage) ? usage : {};
|
|
215
|
+
const inputTokens = numberFrom(raw.promptTokens) || numberFrom(raw.prompt_tokens);
|
|
216
|
+
const outputTokens = numberFrom(raw.completionTokens) || numberFrom(raw.completion_tokens);
|
|
217
|
+
return {
|
|
218
|
+
...Usage.empty(),
|
|
219
|
+
inputTokens,
|
|
220
|
+
outputTokens,
|
|
221
|
+
totalTokens: numberFrom(raw.totalTokens) || numberFrom(raw.total_tokens)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function messageToMistralMessages(message) {
|
|
225
|
+
if (message.role === "system") {
|
|
226
|
+
return [{ role: "system", content: message.content }];
|
|
227
|
+
}
|
|
228
|
+
if (message.role === "user") {
|
|
229
|
+
const contentParts = [];
|
|
230
|
+
for (const content of message.content) {
|
|
231
|
+
contentParts.push(...userContentToMistralText(content));
|
|
232
|
+
}
|
|
233
|
+
const text2 = contentParts.join("\n");
|
|
234
|
+
if (text2.length > 0) {
|
|
235
|
+
return [{ role: "user", content: text2 }];
|
|
236
|
+
}
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
if (message.role === "tool") {
|
|
240
|
+
return message.content.map(toolContentToMistralMessage);
|
|
241
|
+
}
|
|
242
|
+
const text = message.content.flatMap((content) => content.type === "text" ? [content.text] : []).join("\n");
|
|
243
|
+
if (message.content.some((content) => content.type === "image")) {
|
|
244
|
+
throw new Error("Mistral chat does not support image content in assistant history");
|
|
245
|
+
}
|
|
246
|
+
const toolCalls = message.content.filter((content) => content.type === "tool_call").map((content) => ({
|
|
247
|
+
id: content.id,
|
|
248
|
+
type: "function",
|
|
249
|
+
function: {
|
|
250
|
+
name: content.function.name,
|
|
251
|
+
arguments: JSON.stringify(content.function.arguments ?? {})
|
|
252
|
+
}
|
|
253
|
+
}));
|
|
254
|
+
const chatMessage = {
|
|
255
|
+
role: "assistant"
|
|
256
|
+
};
|
|
257
|
+
if (text.length > 0) {
|
|
258
|
+
chatMessage.content = text;
|
|
259
|
+
}
|
|
260
|
+
if (toolCalls.length > 0) {
|
|
261
|
+
chatMessage.toolCalls = toolCalls;
|
|
262
|
+
}
|
|
263
|
+
return [chatMessage];
|
|
264
|
+
}
|
|
265
|
+
function toolContentToMistralMessage(content) {
|
|
266
|
+
return {
|
|
267
|
+
role: "tool",
|
|
268
|
+
toolCallId: content.callId ?? content.id,
|
|
269
|
+
name: content.id,
|
|
270
|
+
content: content.content.map((item) => item.type === "text" ? item.text : item.data).join("\n")
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function userContentToMistralText(content) {
|
|
274
|
+
if (content.type === "text") {
|
|
275
|
+
return [content.text];
|
|
276
|
+
}
|
|
277
|
+
if (content.type === "image") {
|
|
278
|
+
throw new Error("Mistral image inputs are not supported yet");
|
|
279
|
+
}
|
|
280
|
+
if (content.type === "document") {
|
|
281
|
+
return documentToMistralText(content);
|
|
282
|
+
}
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
function documentToMistralText(document) {
|
|
286
|
+
if (document.source.type === "text") {
|
|
287
|
+
return [document.source.text];
|
|
288
|
+
}
|
|
289
|
+
throw new Error("Mistral document inputs are not supported yet");
|
|
290
|
+
}
|
|
291
|
+
function toolDefinitionToMistral(tool) {
|
|
292
|
+
return {
|
|
293
|
+
type: "function",
|
|
294
|
+
function: {
|
|
295
|
+
name: tool.name,
|
|
296
|
+
description: tool.description,
|
|
297
|
+
parameters: tool.parameters
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function toolChoiceToMistral(toolChoice) {
|
|
302
|
+
if (toolChoice === "required") {
|
|
303
|
+
return "any";
|
|
304
|
+
}
|
|
305
|
+
if (toolChoice === "auto" || toolChoice === "none") {
|
|
306
|
+
return toolChoice;
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
type: "function",
|
|
310
|
+
function: {
|
|
311
|
+
name: toolChoice.name
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
function toolCallsFrom(message) {
|
|
316
|
+
const raw = message.toolCalls ?? message.tool_calls;
|
|
317
|
+
return Array.isArray(raw) ? raw.filter(isPlainObject) : [];
|
|
318
|
+
}
|
|
319
|
+
function stringContent(content) {
|
|
320
|
+
if (typeof content === "string") {
|
|
321
|
+
return content;
|
|
322
|
+
}
|
|
323
|
+
if (Array.isArray(content)) {
|
|
324
|
+
const text = content.flatMap((part) => {
|
|
325
|
+
if (!isPlainObject(part)) {
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
return typeof part.text === "string" ? [part.text] : [];
|
|
329
|
+
}).join("");
|
|
330
|
+
return text.length > 0 ? text : void 0;
|
|
331
|
+
}
|
|
332
|
+
return void 0;
|
|
333
|
+
}
|
|
334
|
+
function parseToolArguments(args) {
|
|
335
|
+
if (typeof args === "string") {
|
|
336
|
+
return parseJsonValue(args);
|
|
337
|
+
}
|
|
338
|
+
return toJsonValue(args);
|
|
339
|
+
}
|
|
340
|
+
function toJsonValue(value) {
|
|
341
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
342
|
+
return value;
|
|
343
|
+
}
|
|
344
|
+
if (Array.isArray(value)) {
|
|
345
|
+
return value.map(toJsonValue);
|
|
346
|
+
}
|
|
347
|
+
if (isPlainObject(value)) {
|
|
348
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, toJsonValue(item)]));
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
function toolCallDelta(id, values) {
|
|
353
|
+
const event = { type: "tool_call_delta", id };
|
|
354
|
+
if (values.callId !== void 0) event.callId = values.callId;
|
|
355
|
+
if (values.name !== void 0) event.name = values.name;
|
|
356
|
+
if (values.argumentsDelta !== void 0) event.argumentsDelta = values.argumentsDelta;
|
|
357
|
+
return event;
|
|
358
|
+
}
|
|
359
|
+
var mistralMessageHelpers = {
|
|
360
|
+
messageToMistralMessages,
|
|
361
|
+
toolDefinitionToMistral
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
// src/mistral/embedding.ts
|
|
365
|
+
var MistralEmbeddingModel = class {
|
|
366
|
+
constructor(client, model, options = {}) {
|
|
367
|
+
this.client = client;
|
|
368
|
+
this.model = model;
|
|
369
|
+
this.dimensions = options.dimensions;
|
|
370
|
+
this.maxBatchSize = options.maxBatchSize ?? 1024;
|
|
371
|
+
}
|
|
372
|
+
client;
|
|
373
|
+
model;
|
|
374
|
+
dimensions;
|
|
375
|
+
maxBatchSize;
|
|
376
|
+
async embedTexts(texts) {
|
|
377
|
+
const embeddings = [];
|
|
378
|
+
for (let index = 0; index < texts.length; index += this.maxBatchSize) {
|
|
379
|
+
const batch = texts.slice(index, index + this.maxBatchSize);
|
|
380
|
+
embeddings.push(...await this.embedBatch(batch));
|
|
381
|
+
}
|
|
382
|
+
return embeddings;
|
|
383
|
+
}
|
|
384
|
+
async embedBatch(texts) {
|
|
385
|
+
if (texts.length === 0) {
|
|
386
|
+
return [];
|
|
387
|
+
}
|
|
388
|
+
const params = {
|
|
389
|
+
model: this.model,
|
|
390
|
+
inputs: texts
|
|
391
|
+
};
|
|
392
|
+
if (this.dimensions !== void 0) {
|
|
393
|
+
params.dimensions = this.dimensions;
|
|
394
|
+
}
|
|
395
|
+
const response = await this.client.embeddings.create(params);
|
|
396
|
+
const data = dataFromResponse(response);
|
|
397
|
+
if (data.length !== texts.length) {
|
|
398
|
+
throw new Error(
|
|
399
|
+
`Embedding response length ${data.length} did not match input length ${texts.length}`
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
return data.slice().sort((left, right) => left.index - right.index).map((item, index) => ({
|
|
403
|
+
document: texts[index],
|
|
404
|
+
vector: item.embedding
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
function dataFromResponse(response) {
|
|
409
|
+
const raw = response;
|
|
410
|
+
return Array.isArray(raw.data) ? raw.data.flatMap((item) => {
|
|
411
|
+
const data = item;
|
|
412
|
+
if (!Array.isArray(data.embedding)) {
|
|
413
|
+
return [];
|
|
414
|
+
}
|
|
415
|
+
return [
|
|
416
|
+
{
|
|
417
|
+
embedding: data.embedding.filter((value) => typeof value === "number"),
|
|
418
|
+
index: typeof data.index === "number" ? data.index : 0
|
|
419
|
+
}
|
|
420
|
+
];
|
|
421
|
+
}) : [];
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// src/mistral/client.ts
|
|
425
|
+
var MistralClient = class {
|
|
426
|
+
client;
|
|
427
|
+
constructor(options = {}) {
|
|
428
|
+
this.client = options.client ?? new Mistral({
|
|
429
|
+
apiKey: requireApiKey(options.apiKey),
|
|
430
|
+
serverURL: options.serverURL
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
completionModel(model = "mistral-large-latest") {
|
|
434
|
+
return new MistralCompletionModel(this.client, model);
|
|
435
|
+
}
|
|
436
|
+
embeddingModel(model = "mistral-embed", options = {}) {
|
|
437
|
+
return new MistralEmbeddingModel(this.client, model, options);
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
function requireApiKey(apiKey) {
|
|
441
|
+
if (apiKey === void 0 || apiKey.length === 0) {
|
|
442
|
+
throw new Error("Missing Mistral credentials. Pass apiKey when constructing MistralClient.");
|
|
443
|
+
}
|
|
444
|
+
return apiKey;
|
|
445
|
+
}
|
|
446
|
+
export {
|
|
447
|
+
MistralClient,
|
|
448
|
+
MistralCompletionModel,
|
|
449
|
+
MistralEmbeddingModel,
|
|
450
|
+
fromMistralChatResponse,
|
|
451
|
+
fromMistralChatStreamChunk,
|
|
452
|
+
mistral_exports as mistral,
|
|
453
|
+
mistralMessageHelpers,
|
|
454
|
+
toMistralChatParams
|
|
455
|
+
};
|
|
456
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mistral/index.ts","../src/mistral/client.ts","../src/mistral/completion.ts","../src/request-messages.ts","../src/utils.ts","../src/mistral/embedding.ts"],"sourcesContent":["export { MistralClient, type MistralClientOptions } from \"./client\";\nexport {\n fromMistralChatResponse,\n fromMistralChatStreamChunk,\n MistralCompletionModel,\n mistralMessageHelpers,\n toMistralChatParams,\n} from \"./completion\";\nexport { MistralEmbeddingModel, type MistralEmbeddingModelOptions } from \"./embedding\";\n","import { Mistral } from \"@mistralai/mistralai\";\nimport { MistralCompletionModel } from \"./completion\";\nimport { MistralEmbeddingModel, type MistralEmbeddingModelOptions } from \"./embedding\";\n\nexport type MistralClientOptions = {\n apiKey?: string | undefined;\n serverURL?: string | undefined;\n client?: Mistral | undefined;\n};\n\nexport class MistralClient {\n readonly client: Mistral;\n\n constructor(options: MistralClientOptions = {}) {\n this.client =\n options.client ??\n new Mistral({\n apiKey: requireApiKey(options.apiKey),\n serverURL: options.serverURL,\n });\n }\n\n completionModel(model = \"mistral-large-latest\"): MistralCompletionModel {\n return new MistralCompletionModel(this.client, model);\n }\n\n embeddingModel(\n model = \"mistral-embed\",\n options: MistralEmbeddingModelOptions = {},\n ): MistralEmbeddingModel {\n return new MistralEmbeddingModel(this.client, model, options);\n }\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (apiKey === undefined || apiKey.length === 0) {\n throw new Error(\"Missing Mistral credentials. Pass apiKey when constructing MistralClient.\");\n }\n\n return apiKey;\n}\n","import {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type DocumentContent,\n type JsonValue,\n type Message as MessageType,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { Mistral } from \"@mistralai/mistralai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport { isPlainObject, numberFrom, parseJsonValue, schemaName, stringFrom } from \"../utils\";\n\ntype MistralChatParams = Record<string, unknown>;\ntype MistralChatMessage = Record<string, unknown>;\n\nexport class MistralCompletionModel implements StreamingCompletionModel {\n readonly provider = \"mistral\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: false,\n documentInput: false,\n outputSchema: true,\n reasoning: false,\n };\n\n constructor(\n private readonly client: Mistral,\n readonly defaultModel = \"mistral-large-latest\",\n ) {}\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toMistralChatParams(this.defaultModel, request);\n const response = await this.client.chat.complete(params as never);\n return fromMistralChatResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = toMistralChatParams(this.defaultModel, request);\n const stream = await this.client.chat.stream(params as never);\n for await (const chunk of stream as unknown as AsyncIterable<unknown>) {\n for (const event of fromMistralChatStreamChunk(chunk)) {\n yield event;\n }\n }\n }\n}\n\nexport function toMistralChatParams(\n defaultModel: string,\n request: CompletionRequest,\n): MistralChatParams {\n const params: MistralChatParams = {\n model: request.model ?? defaultModel,\n messages: requestMessages(request).flatMap(messageToMistralMessages),\n };\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.maxTokens !== undefined) {\n params.maxTokens = request.maxTokens;\n }\n\n if (request.tools.length > 0) {\n params.tools = request.tools.map(toolDefinitionToMistral);\n }\n\n if (request.toolChoice !== undefined) {\n params.toolChoice = toolChoiceToMistral(request.toolChoice);\n }\n\n if (request.outputSchema !== undefined) {\n params.responseFormat = {\n type: \"json_schema\",\n jsonSchema: {\n name: schemaName(request.outputSchema),\n strict: true,\n schema: request.outputSchema,\n },\n };\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n return params;\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request, { includeInstructionsAsSystem: true });\n}\n\nexport function fromMistralChatResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const choices = Array.isArray(raw.choices) ? raw.choices : [];\n const firstChoice = choices.find(isPlainObject);\n const message = isPlainObject(firstChoice?.message) ? firstChoice.message : {};\n const choice: AssistantContentType[] = [];\n\n const text = stringContent(message.content);\n if (text !== undefined && text.length > 0) {\n choice.push(AssistantContent.text(text));\n }\n\n const toolCalls = toolCallsFrom(message);\n for (const toolCall of toolCalls) {\n const fn = isPlainObject(toolCall.function) ? toolCall.function : {};\n const id = stringFrom(toolCall.id) ?? crypto.randomUUID();\n const name = stringFrom(fn.name) ?? \"\";\n const args = parseToolArguments(fn.arguments);\n choice.push(AssistantContent.toolCall(id, name, args));\n }\n\n const result: CompletionResponse = {\n choice,\n usage: usageFromMistral(raw.usage),\n rawResponse: response,\n };\n\n if (typeof raw.id === \"string\") {\n result.messageId = raw.id;\n }\n\n return result;\n}\n\nexport function fromMistralChatStreamChunk(chunk: unknown): CompletionStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionStreamEvent[] = [];\n const choices = Array.isArray(chunk.choices) ? chunk.choices : [];\n for (const choice of choices) {\n if (!isPlainObject(choice) || !isPlainObject(choice.delta)) {\n continue;\n }\n\n const delta = choice.delta;\n const content = stringContent(delta.content);\n if (content !== undefined && content.length > 0) {\n events.push({ type: \"text_delta\", delta: content });\n }\n\n for (const toolCall of toolCallsFrom(delta)) {\n if (!isPlainObject(toolCall)) {\n continue;\n }\n const fn = isPlainObject(toolCall.function) ? toolCall.function : {};\n const index = numberFrom(toolCall.index);\n events.push(\n toolCallDelta(`tool_${index}`, {\n callId: stringFrom(toolCall.id),\n name: stringFrom(fn.name),\n argumentsDelta: stringFrom(fn.arguments),\n }),\n );\n }\n }\n\n if (typeof chunk.id === \"string\") {\n events.push({ type: \"message_id\", id: chunk.id });\n }\n\n if (isPlainObject(chunk.usage)) {\n const response: CompletionResponse = {\n choice: [],\n usage: usageFromMistral(chunk.usage),\n rawResponse: chunk,\n };\n if (typeof chunk.id === \"string\") {\n response.messageId = chunk.id;\n }\n events.push({ type: \"final\", response });\n }\n\n return events;\n}\n\nfunction usageFromMistral(usage: unknown): Usage {\n const raw = isPlainObject(usage) ? usage : {};\n const inputTokens = numberFrom(raw.promptTokens) || numberFrom(raw.prompt_tokens);\n const outputTokens = numberFrom(raw.completionTokens) || numberFrom(raw.completion_tokens);\n return {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens: numberFrom(raw.totalTokens) || numberFrom(raw.total_tokens),\n };\n}\n\nfunction messageToMistralMessages(message: MessageType): MistralChatMessage[] {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: message.content }];\n }\n\n if (message.role === \"user\") {\n const contentParts: string[] = [];\n\n for (const content of message.content) {\n contentParts.push(...userContentToMistralText(content));\n }\n\n const text = contentParts.join(\"\\n\");\n if (text.length > 0) {\n return [{ role: \"user\", content: text }];\n }\n\n return [];\n }\n\n if (message.role === \"tool\") {\n return message.content.map(toolContentToMistralMessage);\n }\n\n const text = message.content\n .flatMap((content) => (content.type === \"text\" ? [content.text] : []))\n .join(\"\\n\");\n if (message.content.some((content) => content.type === \"image\")) {\n throw new Error(\"Mistral chat does not support image content in assistant history\");\n }\n\n const toolCalls = message.content\n .filter((content) => content.type === \"tool_call\")\n .map((content) => ({\n id: content.id,\n type: \"function\",\n function: {\n name: content.function.name,\n arguments: JSON.stringify(content.function.arguments ?? {}),\n },\n }));\n\n const chatMessage: MistralChatMessage = {\n role: \"assistant\",\n };\n if (text.length > 0) {\n chatMessage.content = text;\n }\n if (toolCalls.length > 0) {\n chatMessage.toolCalls = toolCalls;\n }\n\n return [chatMessage];\n}\n\nfunction toolContentToMistralMessage(content: ToolContent): MistralChatMessage {\n return {\n role: \"tool\",\n toolCallId: content.callId ?? content.id,\n name: content.id,\n content: content.content\n .map((item) => (item.type === \"text\" ? item.text : item.data))\n .join(\"\\n\"),\n };\n}\n\nfunction userContentToMistralText(content: UserContent): string[] {\n if (content.type === \"text\") {\n return [content.text];\n }\n\n if (content.type === \"image\") {\n throw new Error(\"Mistral image inputs are not supported yet\");\n }\n\n if (content.type === \"document\") {\n return documentToMistralText(content);\n }\n\n return [];\n}\n\nfunction documentToMistralText(document: DocumentContent): string[] {\n if (document.source.type === \"text\") {\n return [document.source.text];\n }\n\n throw new Error(\"Mistral document inputs are not supported yet\");\n}\n\nfunction toolDefinitionToMistral(tool: ToolDefinition): MistralChatMessage {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n}\n\nfunction toolChoiceToMistral(toolChoice: ToolChoice): unknown {\n if (toolChoice === \"required\") {\n return \"any\";\n }\n\n if (toolChoice === \"auto\" || toolChoice === \"none\") {\n return toolChoice;\n }\n\n return {\n type: \"function\",\n function: {\n name: toolChoice.name,\n },\n };\n}\n\nfunction toolCallsFrom(message: Record<string, unknown>): Record<string, unknown>[] {\n const raw = message.toolCalls ?? message.tool_calls;\n return Array.isArray(raw) ? raw.filter(isPlainObject) : [];\n}\n\nfunction stringContent(content: unknown): string | undefined {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (Array.isArray(content)) {\n const text = content\n .flatMap((part) => {\n if (!isPlainObject(part)) {\n return [];\n }\n return typeof part.text === \"string\" ? [part.text] : [];\n })\n .join(\"\");\n return text.length > 0 ? text : undefined;\n }\n\n return undefined;\n}\n\nfunction parseToolArguments(args: unknown): JsonValue {\n if (typeof args === \"string\") {\n return parseJsonValue(args);\n }\n return toJsonValue(args);\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(toJsonValue);\n }\n if (isPlainObject(value)) {\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, toJsonValue(item)]));\n }\n return null;\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n return event;\n}\n\nexport const mistralMessageHelpers = {\n messageToMistralMessages,\n toolDefinitionToMistral,\n};\n","import {\n type CompletionRequest,\n Message,\n type Message as MessageType,\n normalizeDocuments,\n} from \"@anvia/core/completion\";\n\nexport type OrderedRequestMessagesOptions = {\n includeInstructionsAsSystem?: boolean;\n};\n\nexport function orderedRequestMessages(\n request: CompletionRequest,\n options: OrderedRequestMessagesOptions = {},\n): MessageType[] {\n const messages: MessageType[] = [];\n if (options.includeInstructionsAsSystem === true && request.instructions !== undefined) {\n messages.push(Message.system(request.instructions));\n }\n messages.push(...request.chatHistory.filter((message) => message.role === \"system\"));\n const documents = normalizeDocuments(request.documents);\n if (documents !== undefined) {\n messages.push(documents);\n }\n messages.push(...request.chatHistory.filter((message) => message.role !== \"system\"));\n return messages;\n}\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function numberFrom(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nexport function stringFrom(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function parseJsonValue(text: string): JsonValue {\n try {\n return JSON.parse(text) as JsonValue;\n } catch {\n return text;\n }\n}\n\nexport function schemaName(schema: JsonObject): string {\n return typeof schema.title === \"string\" ? schema.title : \"response_schema\";\n}\n","import type { Embedding, EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type { Mistral } from \"@mistralai/mistralai\";\n\nexport type MistralEmbeddingModelOptions = {\n dimensions?: number | undefined;\n maxBatchSize?: number | undefined;\n};\n\nexport class MistralEmbeddingModel implements EmbeddingModel {\n readonly dimensions: number | undefined;\n readonly maxBatchSize: number;\n\n constructor(\n private readonly client: Mistral,\n private readonly model: string,\n options: MistralEmbeddingModelOptions = {},\n ) {\n this.dimensions = options.dimensions;\n this.maxBatchSize = options.maxBatchSize ?? 1024;\n }\n\n async embedTexts(texts: string[]): Promise<Embedding[]> {\n const embeddings: Embedding[] = [];\n for (let index = 0; index < texts.length; index += this.maxBatchSize) {\n const batch = texts.slice(index, index + this.maxBatchSize);\n embeddings.push(...(await this.embedBatch(batch)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const params: Record<string, unknown> = {\n model: this.model,\n inputs: texts,\n };\n if (this.dimensions !== undefined) {\n params.dimensions = this.dimensions;\n }\n\n const response = await this.client.embeddings.create(params as never);\n const data = dataFromResponse(response);\n if (data.length !== texts.length) {\n throw new Error(\n `Embedding response length ${data.length} did not match input length ${texts.length}`,\n );\n }\n\n return data\n .slice()\n .sort((left, right) => left.index - right.index)\n .map((item, index) => ({\n document: texts[index] as string,\n vector: item.embedding,\n }));\n }\n}\n\ntype EmbeddingData = {\n embedding: number[];\n index: number;\n};\n\nfunction dataFromResponse(response: unknown): EmbeddingData[] {\n const raw = response as Record<string, unknown>;\n return Array.isArray(raw.data)\n ? raw.data.flatMap((item): EmbeddingData[] => {\n const data = item as Record<string, unknown>;\n if (!Array.isArray(data.embedding)) {\n return [];\n }\n return [\n {\n embedding: data.embedding.filter((value): value is number => typeof value === \"number\"),\n index: typeof data.index === \"number\" ? data.index : 0,\n },\n ];\n })\n : [];\n}\n"],"mappings":"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","names":["text"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@anvia/mistral",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Mistral provider adapter for Anvia.",
|
|
5
|
+
"author": "anvia",
|
|
6
|
+
"maintainer": "Indra Zulfi",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@mistralai/mistralai": "^2.2.1",
|
|
22
|
+
"@anvia/core": "0.1.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^24.9.1",
|
|
26
|
+
"tsup": "^8.5.0",
|
|
27
|
+
"typescript": "^5.9.3",
|
|
28
|
+
"vitest": "^4.0.8"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"typecheck": "tsc --noEmit"
|
|
34
|
+
}
|
|
35
|
+
}
|