UNPKG

genkitx-mistral

Version:

Firebase Genkit AI framework plugin for Mistral AI APIs.

1 lines 22.4 kB
{"version":3,"sources":["../src/mistral_llms.ts"],"sourcesContent":["/**\n * Copyright 2024 Bloom Labs Inc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Message, Part, StreamingCallback } from 'genkit';\nimport {\n CandidateData,\n GenerateRequest,\n GenerateResponseChunkData,\n MessageData,\n ModelAction,\n Role,\n ToolDefinition,\n} from 'genkit/model';\nimport { GenerationCommonConfigSchema, modelRef } from 'genkit/model';\nimport {\n Tool,\n FunctionT,\n ChatCompletionChoice,\n CompletionChunk,\n ToolCall,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ContentChunk,\n} from '@mistralai/mistralai/models/components/index.js';\nimport { Genkit } from 'genkit';\nimport { z } from 'genkit';\nimport { Mistral } from '@mistralai/mistralai';\n\nexport const MistralConfigSchema = GenerationCommonConfigSchema.extend({\n visualDetailLevel: z.enum(['auto', 'low', 'high']).optional(),\n});\n\nexport const openMistral7B = modelRef({\n name: 'mistral/open-mistral-7b',\n info: {\n versions: ['mistral-tiny-2312'],\n label: 'Mistral - Mistral 7B',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMinistral3B = modelRef({\n name: 'mistral/ministral-3b',\n info: {\n versions: ['ministral-3b-latest', 'ministral-3b-2410'],\n label: 'Mistral - Ministral 3B',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMinistral8B = modelRef({\n name: 'mistral/ministral-8b',\n info: {\n versions: ['ministral-8b-latest', 'ministral-8b-2410'],\n label: 'Mistral - Ministral 8B',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMistralNemo = modelRef({\n name: 'mistral/open-mistral-nemo',\n info: {\n versions: ['open-mistral-nemo', 'pen-mistral-nemo-2407'],\n label: 'Mistral - Nemo Model',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMistralSaba = modelRef({\n name: 'mistral/mistral-saba',\n info: {\n versions: ['mistral-saba-latest', 'mistral-saba-2502'],\n label: 'Mistral - Saba Model',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openCodestralMambda = modelRef({\n name: 'mistral/open-codestral-mamba',\n info: {\n versions: ['open-codestral-mamba'],\n label: 'Mistral - Codestral Mamba',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openCodestral = modelRef({\n name: 'mistral/codestral',\n info: {\n versions: ['codestral-latest', 'codestral-2501'],\n label: 'Mistral - Codestral',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMistral8x7B = modelRef({\n name: 'mistral/open-mixtral-8x7b',\n info: {\n versions: ['open-mixtral-8x7b'],\n label: 'Mistral - Mistral 8x7B',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMixtral8x22B = modelRef({\n name: 'mistral/open-mixtral-8x22b',\n info: {\n versions: ['open-mixtral-8x22b'],\n label: 'Mistral - Mistral 8x22B',\n supports: {\n multiturn: true,\n tools: true,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMistralSmall = modelRef({\n name: 'mistral/mistral-small',\n info: {\n versions: [\n 'mistral-small-latest',\n 'mistral-small-2402',\n 'mistral-small-2501',\n ],\n label: 'Mistral - Mistral Small',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMistralMedium = modelRef({\n name: 'mistral/mistral-medium',\n info: {\n versions: ['mistral-medium-2312'],\n label: 'Mistral - Mistral Medium',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openMistralLarge = modelRef({\n name: 'mistral/mistral-large',\n info: {\n versions: [\n 'mistral-large-latest',\n 'mistral-large-2402',\n 'mistral-large-2407',\n ],\n label: 'Mistral - Mistral Large',\n supports: {\n multiturn: true,\n tools: false,\n media: false,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openPixtralLarge = modelRef({\n name: 'mistral/pixtral-large',\n info: {\n versions: ['pixtral-large-latest', 'pixtral-large-2411'],\n label: 'Mistral - Pixtral Large',\n supports: {\n multiturn: true,\n tools: false,\n media: true,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nexport const openPixtral = modelRef({\n name: 'mistral/pixtral',\n info: {\n versions: ['pixtral-12b-2409'],\n label: 'Mistral - Pixtral',\n supports: {\n multiturn: true,\n tools: false,\n media: true,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: GenerationCommonConfigSchema,\n});\n\nfunction toMistralRole(role: Role): 'system' | 'user' | 'assistant' | 'tool' {\n switch (role) {\n case 'user':\n return 'user';\n case 'model':\n return 'assistant';\n case 'system':\n return 'system';\n case 'tool':\n return 'assistant';\n default:\n throw new Error(`Role ${role} doesn't map to a Mistral role.`);\n }\n}\n\nfunction toMistralTool(tool: ToolDefinition): Tool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n parameters: tool.inputSchema,\n description: tool.description,\n } as FunctionT,\n };\n}\n\n/**\n * Converts a Genkit Part to the corresponding Mistral ChatCompletionContentPart.\n * @param part The Genkit Part to convert.\n * @param visualDetailLevel The visual detail level to use for media parts.\n * @returns The corresponding Mistral ChatCompletionContentPart.\n * @throws Error if the part contains unsupported fields for the current message role.\n */\nexport function toMistralTextAndMedia(part: Part): ContentChunk {\n if (part.text) {\n return {\n type: 'text',\n text: part.text,\n };\n } else if (part.media) {\n return {\n type: 'image_url',\n imageUrl: {\n url: part.media.url,\n },\n };\n }\n throw Error(\n `Unsupported genkit part fields encountered for current message role: ${JSON.stringify(part)}.`\n );\n}\n\nexport function toMistralMessages(\n messages: MessageData[]\n): ChatCompletionRequest['messages'] {\n const mistralMsgs: ChatCompletionRequest['messages'] = [];\n for (const message of messages) {\n const msg = new Message(message);\n const role = toMistralRole(message.role);\n\n // Build the appropriate message type based on the role\n if (role === 'system') {\n mistralMsgs.push({\n role: 'system',\n content: msg.text || '',\n });\n } else if (role === 'user') {\n mistralMsgs.push({\n role: 'user',\n content: msg.content.map((part) => toMistralTextAndMedia(part)),\n });\n } else if (role === 'assistant') {\n mistralMsgs.push({\n role: 'assistant',\n content: msg.content.map((part) => toMistralTextAndMedia(part)),\n });\n } else if (role === 'tool') {\n mistralMsgs.push({\n role: 'tool',\n content: msg.content.map((part) => toMistralTextAndMedia(part)),\n });\n }\n }\n return mistralMsgs;\n}\n\nconst finishReasonMap: Record<\n NonNullable<string>,\n CandidateData['finishReason']\n> = {\n length: 'length',\n stop: 'stop',\n tool_calls: 'stop',\n content_filter: 'blocked',\n};\n\nexport const SUPPORTED_MISTRAL_MODELS = {\n 'open-mistral-7b': openMistral7B,\n 'open-mixtral-8x7b': openMistral8x7B,\n 'open-mixtral-8x22b': openMixtral8x22B,\n 'mistral-small': openMistralSmall,\n 'mistral-medium': openMistralMedium,\n 'mistral-large': openMistralLarge,\n 'ministral-3b': openMinistral3B,\n 'ministral-8b': openMinistral8B,\n 'open-mistral-nemo': openMistralNemo,\n 'open-codestral-mamba': openCodestralMambda,\n codestral: openCodestral,\n 'mistral-saba': openMistralSaba,\n 'pixtral-large': openPixtralLarge,\n pixtral: openPixtral,\n};\n\nfunction fromMistralToolCall(toolCall: ToolCall) {\n if (!toolCall.function) {\n throw Error(\n `Unexpected mistral chunk choice. tool_calls was provided but one or more tool_calls is missing.`\n );\n }\n const f = toolCall.function;\n return {\n toolRequest: {\n name: f.name,\n ref: toolCall.id,\n input:\n typeof f.arguments === 'string' ? JSON.parse(f.arguments) : f.arguments,\n },\n };\n}\n\nfunction fromMistralChoice(choice: ChatCompletionChoice): CandidateData {\n const toolRequestParts = choice.message.toolCalls?.map(fromMistralToolCall);\n return {\n index: choice.index,\n finishReason: finishReasonMap[choice.finishReason] || 'other',\n message: {\n role: 'model',\n content: toolRequestParts\n ? toolRequestParts\n : [\n {\n text:\n typeof choice.message.content === 'string'\n ? choice.message.content\n : '',\n },\n ],\n },\n custom: {},\n };\n}\n\nfunction fromMistralChunkChoice(\n choice: CompletionChunk['choices'][0]\n): CandidateData {\n return {\n index: choice.index,\n finishReason: choice.finishReason\n ? finishReasonMap[choice.finishReason] || 'other'\n : 'unknown',\n message: {\n role: 'model',\n content: [\n {\n text:\n typeof choice.delta.content === 'string'\n ? choice.delta.content\n : '',\n },\n ],\n },\n custom: {},\n };\n}\n\nexport function toMistralRequestBody(\n modelName: string,\n request: GenerateRequest<typeof GenerationCommonConfigSchema>\n) {\n const model = SUPPORTED_MISTRAL_MODELS[modelName];\n if (!model) throw new Error(`Unsupported model: ${modelName}`);\n const mistralMessages = toMistralMessages(request.messages);\n const mappedModelName = request.config?.version || model.version || modelName;\n\n let responseFormat;\n if (request.output?.format === 'json') {\n responseFormat = { type: 'json_object' };\n } else {\n responseFormat = null;\n }\n const body: ChatCompletionRequest = {\n messages: mistralMessages,\n tools: request.tools?.map(toMistralTool),\n model: mappedModelName,\n maxTokens: request.config?.maxOutputTokens,\n temperature: request.config?.temperature,\n topP: request.config?.topP,\n n: request.candidates,\n stop: request.config?.stopSequences,\n responseFormat: responseFormat,\n };\n\n for (const key in body) {\n if (!body[key] || (Array.isArray(body[key]) && !body[key].length))\n delete body[key];\n }\n return body;\n}\n\nexport function mistralModel(\n ai: Genkit,\n name: string,\n client: Mistral\n): ModelAction<typeof GenerationCommonConfigSchema> {\n //Ugly any type, should be MistralClient but cannot import it here\n const modelId = `mistral/${name}`;\n const model = SUPPORTED_MISTRAL_MODELS[name];\n if (!model) throw new Error(`Unsupported model: ${name}`);\n\n return ai.defineModel(\n {\n name: modelId,\n ...model.info,\n configSchema: SUPPORTED_MISTRAL_MODELS[name].configSchema,\n },\n async (\n request,\n streamingCallback?: StreamingCallback<GenerateResponseChunkData>\n ) => {\n let response: ChatCompletionResponse | CompletionChunk;\n const body = toMistralRequestBody(name, request);\n if (streamingCallback) {\n const stream = await client.chat.stream(body);\n for await (const chunk of stream) {\n chunk.data.choices?.forEach((choice) => {\n const c = fromMistralChunkChoice(choice);\n streamingCallback({\n index: c.index,\n content: c.message.content,\n });\n });\n }\n\n response = await client.chat.complete(body);\n } else {\n response = await client.chat.complete(body);\n }\n return {\n candidates: response.choices?.map((c) => fromMistralChoice(c)) || [],\n usage: {\n inputTokens: response.usage?.promptTokens,\n outputTokens: response.usage?.completionTokens,\n totalTokens: response.usage?.totalTokens,\n },\n custom: response,\n };\n }\n );\n}\n"],"mappings":"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","names":[]}