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