diff --git a/public/token/mistral/tokenizer.model b/public/token/mistral/tokenizer.model new file mode 100644 index 00000000..85c0803f Binary files /dev/null and b/public/token/mistral/tokenizer.model differ diff --git a/src/lib/Setting/Pages/BotSettings.svelte b/src/lib/Setting/Pages/BotSettings.svelte index 5d8d8131..61aec249 100644 --- a/src/lib/Setting/Pages/BotSettings.svelte +++ b/src/lib/Setting/Pages/BotSettings.svelte @@ -134,6 +134,10 @@ Claude {language.apiKey} {/if} +{#if $DataBase.aiModel.startsWith('mistral') || $DataBase.subModel.startsWith('mistral')} + Mistral {language.apiKey} + +{/if} {#if $DataBase.aiModel === 'reverse_proxy' || $DataBase.subModel === 'reverse_proxy'} {language.forceReplaceUrl} URL diff --git a/src/lib/UI/ModelList.svelte b/src/lib/UI/ModelList.svelte index 927e4615..d7cbd4dd 100644 --- a/src/lib/UI/ModelList.svelte +++ b/src/lib/UI/ModelList.svelte @@ -69,6 +69,12 @@ return "GPT-4 Turbo 1106 Vision" case 'palm2_unicorn': return "PaLM2 Unicorn" + case 'mistral-tiny': + return "Mistral Tiny" + case 'mistral-small': + return "Mistral Small" + case 'mistral-medium': + return "Mistral Medium" default: if(name.startsWith("horde:::")){ return name.replace(":::", " ") @@ -144,6 +150,11 @@ {/if} + + + + + {#if showUnrec} diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 4d286ac3..943c1cb8 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -148,6 +148,9 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' case 'gpt4_0301': case 'gptvi4_1106': case 'openrouter': + case 'mistral-tiny': + case 'mistral-small': + case 'mistral-medium': case 'reverse_proxy':{ let formatedChat:OpenAIChatExtra[] = [] @@ -281,6 +284,53 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' requestModel = db.customProxyRequestModel } + if(aiModel.startsWith('mistral')){ + requestModel = aiModel + + const res = await globalFetch("https://api.mistral.ai/v1/chat/completions", { + body: { + model: requestModel, + messages: formatedChat, + temperature: temperature, + max_tokens: maxTokens, + top_p: db.top_p, + }, + headers: { + "Authorization": "Bearer " + db.mistralKey, + }, + abortSignal, + }) + + const dat = res.data as any + if(res.ok){ + try { + const msg:OpenAIChatFull = (dat.choices[0].message) + return { + type: 'success', + result: msg.content + } + } catch (error) { + return { + type: 'fail', + result: (language.errors.httpError + `${JSON.stringify(dat)}`) + } + } + } + else{ + if(dat.error && dat.error.message){ + return { + type: 'fail', + result: (language.errors.httpError + `${dat.error.message}`) + } + } + else{ + return { + type: 'fail', + result: (language.errors.httpError + `${JSON.stringify(res.data)}`) + } + } + } + } db.cipherChat = false let body = ({ diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index f87b3700..ea450e3d 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -559,6 +559,7 @@ export interface Database{ accessToken: string projectId: string } + mistralKey?:string } export interface customscript{ diff --git a/src/ts/tokenizer.ts b/src/ts/tokenizer.ts index 6e6a9ed0..8f26cef2 100644 --- a/src/ts/tokenizer.ts +++ b/src/ts/tokenizer.ts @@ -18,6 +18,9 @@ async function encode(data:string):Promise<(number[]|Uint32Array|Int32Array)>{ if(db.aiModel.startsWith('novelai')){ return await tokenizeWebTokenizers(data, 'novelai') } + if(db.aiModel.startsWith('mistral')){ + return await tokenizeWebTokenizers(data, 'mistral') + } if(db.aiModel.startsWith('local_') || db.aiModel === 'mancer' || db.aiModel === 'textgen_webui' || @@ -29,7 +32,7 @@ async function encode(data:string):Promise<(number[]|Uint32Array|Int32Array)>{ return await tikJS(data) } -type tokenizerType = 'novellist'|'claude'|'novelai'|'llama' +type tokenizerType = 'novellist'|'claude'|'novelai'|'llama'|'mistral' let tikParser:Tiktoken = null let tokenizersTokenizer:Tokenizer = null @@ -73,6 +76,12 @@ async function tokenizeWebTokenizers(text:string, type:tokenizerType) { tokenizersTokenizer = await webTokenizer.Tokenizer.fromSentencePiece( await (await fetch("/token/llama/llama.model") ).arrayBuffer()) + break + case 'mistral': + tokenizersTokenizer = await webTokenizer.Tokenizer.fromSentencePiece( + await (await fetch("/token/mistral/tokenizer.model") + ).arrayBuffer()) + break } tokenizersType = type