Merge remote-tracking branch 'upstream/main'
This commit is contained in:
@@ -88,7 +88,7 @@ export async function importCharacterProcess(f:{
|
||||
return
|
||||
}
|
||||
const card:CharacterCardV3 = JSON.parse(cardData)
|
||||
if(CCardLib.character.check(card) !== 'v3'){
|
||||
if(card.spec !== 'chara_card_v3'){
|
||||
alertError(language.errors.noData)
|
||||
return
|
||||
}
|
||||
@@ -1316,7 +1316,7 @@ export async function exportCharacterCard(char:character, type:'png'|'json'|'cha
|
||||
path = `assets/${type}/${itype}/${name}.${card.data.assets[i].ext}`
|
||||
}
|
||||
card.data.assets[i].uri = 'embeded://' + path
|
||||
await writer.write(path, rData)
|
||||
await writer.write(path, Buffer.from(await convertImage(rData)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ export enum LLMFlags{
|
||||
hasStreaming,
|
||||
requiresAlternateRole,
|
||||
mustStartWithUserInput,
|
||||
poolSupported
|
||||
}
|
||||
|
||||
export enum LLMProvider{
|
||||
@@ -52,6 +53,22 @@ export enum LLMFormat{
|
||||
AWSBedrockClaude
|
||||
}
|
||||
|
||||
export enum LLMTokenizer{
|
||||
Unknown,
|
||||
tiktokenCl100kBase,
|
||||
tiktokenO200Base,
|
||||
Mistral,
|
||||
Llama,
|
||||
NovelAI,
|
||||
Claude,
|
||||
NovelList,
|
||||
Llama3,
|
||||
Gemma,
|
||||
GoogleCloud,
|
||||
Cohere,
|
||||
Local
|
||||
}
|
||||
|
||||
export interface LLMModel{
|
||||
id: string
|
||||
name: string
|
||||
@@ -61,7 +78,8 @@ export interface LLMModel{
|
||||
provider: LLMProvider
|
||||
flags: LLMFlags[]
|
||||
format: LLMFormat
|
||||
parameters: Parameter[]
|
||||
parameters: Parameter[],
|
||||
tokenizer: LLMTokenizer
|
||||
recommended?: boolean
|
||||
}
|
||||
|
||||
@@ -92,6 +110,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.OpenAICompatible,
|
||||
flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'instructgpt35',
|
||||
@@ -101,6 +120,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.OpenAILegacyInstruct,
|
||||
flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_turbo',
|
||||
@@ -110,6 +130,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.OpenAICompatible,
|
||||
flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4o',
|
||||
@@ -124,6 +145,7 @@ export const LLMModels: LLMModel[] = [
|
||||
],
|
||||
recommended: true,
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4om',
|
||||
@@ -138,6 +160,7 @@ export const LLMModels: LLMModel[] = [
|
||||
],
|
||||
recommended: true,
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4',
|
||||
@@ -150,6 +173,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_32k',
|
||||
@@ -162,6 +186,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt35_16k',
|
||||
@@ -174,6 +199,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_0314',
|
||||
@@ -186,6 +212,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_0613',
|
||||
@@ -198,6 +225,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_32k_0613',
|
||||
@@ -210,6 +238,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_1106',
|
||||
@@ -222,6 +251,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt35_0125',
|
||||
@@ -234,6 +264,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt35_1106',
|
||||
@@ -246,6 +277,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt35_0613',
|
||||
@@ -258,6 +290,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt35_16k_0613',
|
||||
@@ -270,6 +303,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt35_0301',
|
||||
@@ -282,6 +316,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_0125',
|
||||
@@ -294,6 +329,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gptvi4_1106',
|
||||
@@ -306,6 +342,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4_turbo_20240409',
|
||||
@@ -318,6 +355,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenCl100kBase
|
||||
},
|
||||
{
|
||||
id: 'gpt4o-2024-05-13',
|
||||
@@ -331,6 +369,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4o-2024-08-06',
|
||||
@@ -344,6 +383,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4o-2024-11-20',
|
||||
@@ -357,6 +397,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4o-chatgpt',
|
||||
@@ -370,6 +411,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4o1-preview',
|
||||
@@ -382,6 +424,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
id: 'gpt4o1-mini',
|
||||
@@ -394,6 +437,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.tiktokenO200Base
|
||||
},
|
||||
{
|
||||
name: "Claude 3.5 Sonnet",
|
||||
@@ -409,6 +453,7 @@ export const LLMModels: LLMModel[] = [
|
||||
],
|
||||
recommended: true,
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: "Claude 3.5 Haiku",
|
||||
@@ -424,6 +469,7 @@ export const LLMModels: LLMModel[] = [
|
||||
],
|
||||
recommended: true,
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3.5 Sonnet (20241022)',
|
||||
@@ -438,6 +484,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: "Claude 3.5 Haiku (20241022)",
|
||||
@@ -452,6 +499,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3 Haiku (20240307)',
|
||||
@@ -466,6 +514,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3.5 Sonnet (20240620)',
|
||||
@@ -480,6 +529,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3 Opus (20240229)',
|
||||
@@ -494,6 +544,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3 Sonnet (20240229)',
|
||||
@@ -508,6 +559,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasStreaming
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 2.1',
|
||||
@@ -518,6 +570,7 @@ export const LLMModels: LLMModel[] = [
|
||||
LLMFlags.hasPrefill,
|
||||
],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 2',
|
||||
@@ -526,6 +579,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 2 100k',
|
||||
@@ -534,6 +588,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude v1',
|
||||
@@ -542,6 +597,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude v1 100k',
|
||||
@@ -550,6 +606,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude Instant v1',
|
||||
@@ -558,6 +615,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude Instant v1 100k',
|
||||
@@ -566,6 +624,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude v1.2',
|
||||
@@ -574,6 +633,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude v1.0',
|
||||
@@ -582,6 +642,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AnthropicLegacy,
|
||||
flags: [LLMFlags.hasPrefill],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3.5 Sonnet (20241022) v2',
|
||||
@@ -590,6 +651,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AWSBedrockClaude,
|
||||
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3.5 Sonnet (20240620) v1',
|
||||
@@ -598,6 +660,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AWSBedrockClaude,
|
||||
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Claude 3 Opus (20240229) v1',
|
||||
@@ -606,6 +669,7 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.AWSBedrockClaude,
|
||||
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ClaudeParameters,
|
||||
tokenizer: LLMTokenizer.Claude
|
||||
},
|
||||
{
|
||||
name: 'Ooba',
|
||||
@@ -614,7 +678,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.Ooba,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt],
|
||||
recommended: true,
|
||||
parameters: []
|
||||
parameters: [],
|
||||
tokenizer: LLMTokenizer.Llama
|
||||
},
|
||||
{
|
||||
name: 'Mancer',
|
||||
@@ -622,7 +687,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.AsIs,
|
||||
format: LLMFormat.OobaLegacy,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: []
|
||||
parameters: [],
|
||||
tokenizer: LLMTokenizer.Llama
|
||||
},
|
||||
{
|
||||
name: 'OpenRouter',
|
||||
@@ -631,7 +697,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.OpenAICompatible,
|
||||
flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasImageInput, LLMFlags.hasStreaming],
|
||||
parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k'],
|
||||
recommended: true
|
||||
recommended: true,
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
},
|
||||
{
|
||||
name: 'Mistral Small Latest',
|
||||
@@ -641,7 +708,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.Mistral,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.mustStartWithUserInput, LLMFlags.requiresAlternateRole],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty']
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty'],
|
||||
tokenizer: LLMTokenizer.Mistral
|
||||
},
|
||||
{
|
||||
name: 'Mistral Medium Latest',
|
||||
@@ -651,7 +719,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.Mistral,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.mustStartWithUserInput, LLMFlags.requiresAlternateRole],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty']
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty'],
|
||||
tokenizer: LLMTokenizer.Mistral
|
||||
},
|
||||
{
|
||||
name: 'Mistral Large 2411',
|
||||
@@ -660,7 +729,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.Mistral,
|
||||
format: LLMFormat.Mistral,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.mustStartWithUserInput, LLMFlags.requiresAlternateRole],
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty']
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty'],
|
||||
tokenizer: LLMTokenizer.Mistral
|
||||
},
|
||||
{
|
||||
name: 'Mistral Nemo',
|
||||
@@ -669,7 +739,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.Mistral,
|
||||
format: LLMFormat.Mistral,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.mustStartWithUserInput, LLMFlags.requiresAlternateRole],
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty']
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty'],
|
||||
tokenizer: LLMTokenizer.Mistral
|
||||
},
|
||||
{
|
||||
name: 'Mistral Large Latest',
|
||||
@@ -679,7 +750,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.Mistral,
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.mustStartWithUserInput, LLMFlags.requiresAlternateRole],
|
||||
parameters: ['temperature', 'presence_penalty', 'frequency_penalty'],
|
||||
recommended: true
|
||||
recommended: true,
|
||||
tokenizer: LLMTokenizer.Mistral
|
||||
},
|
||||
{
|
||||
name: "Gemini Pro 1.5 0827",
|
||||
@@ -687,16 +759,27 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Exp 1121",
|
||||
id: 'gemini-exp-1121',
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt, LLMFlags.poolSupported],
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud,
|
||||
},
|
||||
{
|
||||
name: "Gemini Exp 1206",
|
||||
id: 'gemini-exp-1206',
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt, LLMFlags.poolSupported],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Pro 1.5",
|
||||
@@ -705,7 +788,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Flash 1.5",
|
||||
@@ -714,7 +798,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Exp 1121",
|
||||
@@ -723,7 +808,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.VertexAI,
|
||||
format: LLMFormat.VertexAIGemini,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.Gemma
|
||||
},
|
||||
{
|
||||
name: "Gemini Pro 1.5",
|
||||
@@ -732,7 +818,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.VertexAI,
|
||||
format: LLMFormat.VertexAIGemini,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.Gemma
|
||||
},
|
||||
{
|
||||
name: "Gemini Flash 1.5",
|
||||
@@ -741,7 +828,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.VertexAI,
|
||||
format: LLMFormat.VertexAIGemini,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.Gemma
|
||||
},
|
||||
{
|
||||
name: "Gemini Exp 1114",
|
||||
@@ -749,7 +837,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Pro 1.5 002",
|
||||
@@ -757,7 +846,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Flash 1.5 002",
|
||||
@@ -765,7 +855,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Pro",
|
||||
@@ -773,7 +864,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Pro Vision",
|
||||
@@ -781,7 +873,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Ultra",
|
||||
@@ -789,7 +882,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: "Gemini Ultra Vision",
|
||||
@@ -797,7 +891,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.GoogleCloud,
|
||||
format: LLMFormat.GoogleCloud,
|
||||
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt],
|
||||
parameters: ['temperature', 'top_k', 'top_p']
|
||||
parameters: ['temperature', 'top_k', 'top_p'],
|
||||
tokenizer: LLMTokenizer.GoogleCloud
|
||||
},
|
||||
{
|
||||
name: 'Kobold',
|
||||
@@ -812,7 +907,8 @@ export const LLMModels: LLMModel[] = [
|
||||
'repetition_penalty',
|
||||
'top_k',
|
||||
'top_a'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
},
|
||||
{
|
||||
name: "SuperTrin",
|
||||
@@ -820,7 +916,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.NovelList,
|
||||
format: LLMFormat.NovelList,
|
||||
flags: [],
|
||||
parameters: []
|
||||
parameters: [],
|
||||
tokenizer: LLMTokenizer.NovelList
|
||||
},
|
||||
{
|
||||
name: "Damsel",
|
||||
@@ -828,7 +925,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.NovelList,
|
||||
format: LLMFormat.NovelList,
|
||||
flags: [],
|
||||
parameters: []
|
||||
parameters: [],
|
||||
tokenizer: LLMTokenizer.NovelList
|
||||
},
|
||||
{
|
||||
name: "Command R",
|
||||
@@ -840,7 +938,8 @@ export const LLMModels: LLMModel[] = [
|
||||
recommended: true,
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Cohere
|
||||
},
|
||||
{
|
||||
name: "Command R Plus",
|
||||
@@ -852,7 +951,8 @@ export const LLMModels: LLMModel[] = [
|
||||
recommended: true,
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Cohere
|
||||
},
|
||||
{
|
||||
name: "Command R 08-2024",
|
||||
@@ -863,7 +963,8 @@ export const LLMModels: LLMModel[] = [
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.requiresAlternateRole, LLMFlags.mustStartWithUserInput],
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Cohere
|
||||
},
|
||||
{
|
||||
name: "Command R 03-2024",
|
||||
@@ -874,7 +975,8 @@ export const LLMModels: LLMModel[] = [
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.requiresAlternateRole, LLMFlags.mustStartWithUserInput],
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Cohere
|
||||
},
|
||||
{
|
||||
name: "Command R Plus 08-2024",
|
||||
@@ -885,7 +987,8 @@ export const LLMModels: LLMModel[] = [
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.requiresAlternateRole, LLMFlags.mustStartWithUserInput],
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Cohere
|
||||
},
|
||||
{
|
||||
name: "Command R Plus 04-2024",
|
||||
@@ -896,7 +999,8 @@ export const LLMModels: LLMModel[] = [
|
||||
flags: [LLMFlags.hasFirstSystemPrompt, LLMFlags.requiresAlternateRole, LLMFlags.mustStartWithUserInput],
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.Cohere
|
||||
},
|
||||
{
|
||||
name: "Clio",
|
||||
@@ -907,7 +1011,8 @@ export const LLMModels: LLMModel[] = [
|
||||
recommended: true,
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.NovelAI
|
||||
},
|
||||
{
|
||||
name: "Kayra",
|
||||
@@ -918,7 +1023,8 @@ export const LLMModels: LLMModel[] = [
|
||||
recommended: true,
|
||||
parameters: [
|
||||
'temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'
|
||||
]
|
||||
],
|
||||
tokenizer: LLMTokenizer.NovelAI
|
||||
},
|
||||
{
|
||||
id: 'ollama-hosted',
|
||||
@@ -926,7 +1032,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.AsIs,
|
||||
format: LLMFormat.Ollama,
|
||||
flags: [LLMFlags.hasFullSystemPrompt],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
},
|
||||
{
|
||||
id: 'hf:::Xenova/opt-350m',
|
||||
@@ -934,7 +1041,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.WebLLM,
|
||||
format: LLMFormat.WebLLM,
|
||||
flags: [LLMFlags.hasFullSystemPrompt],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Local
|
||||
},
|
||||
{
|
||||
id: 'hf:::Xenova/tiny-random-mistral',
|
||||
@@ -942,7 +1050,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.WebLLM,
|
||||
format: LLMFormat.WebLLM,
|
||||
flags: [LLMFlags.hasFullSystemPrompt],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Local
|
||||
},
|
||||
{
|
||||
id: 'hf:::Xenova/gpt2-large-conversational',
|
||||
@@ -950,7 +1059,8 @@ export const LLMModels: LLMModel[] = [
|
||||
provider: LLMProvider.WebLLM,
|
||||
format: LLMFormat.WebLLM,
|
||||
flags: [LLMFlags.hasFullSystemPrompt],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Local
|
||||
},
|
||||
{
|
||||
id: 'custom',
|
||||
@@ -959,7 +1069,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.Plugin,
|
||||
flags: [LLMFlags.hasFullSystemPrompt],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k']
|
||||
parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k'],
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
},
|
||||
{
|
||||
id: 'reverse_proxy',
|
||||
@@ -968,7 +1079,8 @@ export const LLMModels: LLMModel[] = [
|
||||
format: LLMFormat.OpenAICompatible,
|
||||
flags: [LLMFlags.hasFullSystemPrompt, LLMFlags.hasStreaming],
|
||||
recommended: true,
|
||||
parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k']
|
||||
parameters: ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k'],
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1002,7 +1114,8 @@ export function getModelInfo(id: string): LLMModel{
|
||||
provider: LLMProvider.WebLLM,
|
||||
format: LLMFormat.WebLLM,
|
||||
flags: [],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Local
|
||||
}
|
||||
}
|
||||
if(id.startsWith('horde:::')){
|
||||
@@ -1016,7 +1129,8 @@ export function getModelInfo(id: string): LLMModel{
|
||||
provider: LLMProvider.Horde,
|
||||
format: LLMFormat.Horde,
|
||||
flags: [],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1029,7 +1143,8 @@ export function getModelInfo(id: string): LLMModel{
|
||||
provider: LLMProvider.AsIs,
|
||||
format: LLMFormat.OpenAICompatible,
|
||||
flags: [],
|
||||
parameters: OpenAIParameters
|
||||
parameters: OpenAIParameters,
|
||||
tokenizer: LLMTokenizer.Unknown
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -318,9 +318,17 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
|
||||
}
|
||||
}
|
||||
}
|
||||
const path = assetPaths[name]
|
||||
let path = assetPaths[name]
|
||||
if(!path){
|
||||
return ''
|
||||
if(DBState.db.legacyMediaFindings){
|
||||
return ''
|
||||
}
|
||||
|
||||
path = getClosestMatch(name, assetPaths)
|
||||
|
||||
if(!path){
|
||||
return ''
|
||||
}
|
||||
}
|
||||
switch(type){
|
||||
case 'raw':
|
||||
@@ -366,6 +374,50 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
|
||||
return data
|
||||
}
|
||||
|
||||
function getClosestMatch(name:string, assetPaths:{[key:string]:{path:string, ext?:string}}){
|
||||
if(Object.keys(assetPaths).length === 0){
|
||||
return null
|
||||
}
|
||||
|
||||
const dest = (a:string, b:string) => {
|
||||
let d:Int16Array[] = []
|
||||
|
||||
for(let i=0;i<a.length+1;i++){
|
||||
d.push(new Int16Array(b.length+1))
|
||||
}
|
||||
|
||||
for(let i=0;i<=a.length;i++){
|
||||
d[i][0] = i
|
||||
}
|
||||
|
||||
for(let i=0;i<=b.length;i++){
|
||||
d[0][i] = i
|
||||
}
|
||||
|
||||
for(let i=1; i<=a.length; i++){
|
||||
for(let j=1;j<=b.length;j++){
|
||||
d[i][j] = Math.min(
|
||||
d[i-1][j-1] + (a.charAt(i-1)===b.charAt(j-1) ? 0 : 1),
|
||||
d[i-1][j]+1, d[i][j-1]+1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return d[a.length][b.length];
|
||||
}
|
||||
|
||||
let closest = ''
|
||||
let closestDist = 999999
|
||||
for(const key in assetPaths){
|
||||
const dist = dest(name.trim().replace(/[_ ]/g, ''), key.trim().replace(/[_ ]/g, ''))
|
||||
if(dist < closestDist){
|
||||
closest = key
|
||||
closestDist = dist
|
||||
}
|
||||
}
|
||||
return assetPaths[closest]
|
||||
}
|
||||
|
||||
async function parseInlayImages(data:string){
|
||||
const inlayMatch = data.match(/{{inlay::(.+?)}}/g)
|
||||
if(inlayMatch){
|
||||
|
||||
@@ -3,7 +3,7 @@ import { HypaProcesser } from '../memory/hypamemory'
|
||||
import { getUserName } from "src/ts/util";
|
||||
|
||||
export async function additionalInformations(char: character,chats:Chat,){
|
||||
const processer = new HypaProcesser('MiniLM')
|
||||
const processer = new HypaProcesser()
|
||||
const db = getDatabase()
|
||||
|
||||
const info = char.additionalText
|
||||
|
||||
@@ -84,7 +84,7 @@ export async function getInlayImage(id: string){
|
||||
|
||||
export function supportsInlayImage(){
|
||||
const db = getDatabase()
|
||||
return db.aiModel.startsWith('gptv') || db.aiModel === 'gemini-pro-vision' || db.aiModel.startsWith('claude-3') || db.aiModel.startsWith('gpt4_turbo') || db.aiModel.startsWith('gpt5') || db.aiModel.startsWith('gpt4o') ||
|
||||
return db.aiModel.startsWith('gptv') || db.aiModel === 'gemini-pro-vision' || db.aiModel.startsWith('gemini-exp') || db.aiModel.startsWith('claude-3') || db.aiModel.startsWith('gpt4_turbo') || db.aiModel.startsWith('gpt5') || db.aiModel.startsWith('gpt4o') ||
|
||||
(db.aiModel === 'reverse_proxy' && (
|
||||
db.proxyRequestModel?.startsWith('gptv') || db.proxyRequestModel === 'gemini-pro-vision' || db.proxyRequestModel?.startsWith('claude-3') || db.proxyRequestModel.startsWith('gpt4_turbo') ||
|
||||
db.proxyRequestModel?.startsWith('gpt5') || db.proxyRequestModel?.startsWith('gpt4o') ||
|
||||
|
||||
@@ -124,7 +124,7 @@ async function sendPDFFile(arg:sendFileArg) {
|
||||
}
|
||||
}
|
||||
console.log(texts)
|
||||
const hypa = new HypaProcesser('MiniLM')
|
||||
const hypa = new HypaProcesser()
|
||||
hypa.addText(texts)
|
||||
const result = await hypa.similaritySearch(arg.query)
|
||||
let message = ''
|
||||
@@ -142,7 +142,7 @@ async function sendTxtFile(arg:sendFileArg) {
|
||||
const lines = arg.file.split('\n').filter((a) => {
|
||||
return a !== ''
|
||||
})
|
||||
const hypa = new HypaProcesser('MiniLM')
|
||||
const hypa = new HypaProcesser()
|
||||
hypa.addText(lines)
|
||||
const result = await hypa.similaritySearch(arg.query)
|
||||
let message = ''
|
||||
@@ -157,7 +157,7 @@ async function sendTxtFile(arg:sendFileArg) {
|
||||
}
|
||||
|
||||
async function sendXMLFile(arg:sendFileArg) {
|
||||
const hypa = new HypaProcesser('MiniLM')
|
||||
const hypa = new HypaProcesser()
|
||||
let nodeTexts:string[] = []
|
||||
const parser = new DOMParser();
|
||||
const xmlDoc = parser.parseFromString(arg.file, "text/xml");
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { get, writable } from "svelte/store";
|
||||
import { type character, type MessageGenerationInfo, type Chat } from "../storage/database.svelte";
|
||||
import { type character, type MessageGenerationInfo, type Chat, changeToPreset } from "../storage/database.svelte";
|
||||
import { DBState } from '../stores.svelte';
|
||||
import { CharEmotion, selectedCharID } from "../stores.svelte";
|
||||
import { ChatTokenizer, tokenize, tokenizeNum } from "../tokenizer";
|
||||
import { language } from "../../lang";
|
||||
import { alertError } from "../alert";
|
||||
import { alertError, alertToast } from "../alert";
|
||||
import { loadLoreBookV3Prompt } from "./lorebook.svelte";
|
||||
import { findCharacterbyId, getAuthorNoteDefaultText, getPersonaPrompt, getUserName, isLastCharPunctuation, trimUntilPunctuation } from "../util";
|
||||
import { requestChatData } from "./request";
|
||||
@@ -109,6 +109,23 @@ export async function sendChat(chatProcessIndex = -1,arg:{
|
||||
}
|
||||
doingChat.set(true)
|
||||
|
||||
if(chatProcessIndex === -1 && DBState.db.presetChain){
|
||||
const names = DBState.db.presetChain.split(',').map((v) => v.trim())
|
||||
const randomSelect = Math.floor(Math.random() * names.length)
|
||||
const ele = names[randomSelect]
|
||||
|
||||
const findId = DBState.db.botPresets.findIndex((v) => {
|
||||
return v.name === ele
|
||||
})
|
||||
|
||||
if(findId === -1){
|
||||
alertToast(`Cannot find preset: ${ele}`)
|
||||
}
|
||||
else{
|
||||
changeToPreset(findId, true)
|
||||
}
|
||||
}
|
||||
|
||||
if(connectionOpen){
|
||||
chatProcessStage.set(4)
|
||||
const peerSafe = await peerSafeCheck()
|
||||
@@ -1396,7 +1413,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{
|
||||
}
|
||||
|
||||
if(DBState.db.emotionProcesser === 'embedding'){
|
||||
const hypaProcesser = new HypaProcesser('MiniLM')
|
||||
const hypaProcesser = new HypaProcesser()
|
||||
await hypaProcesser.addText(emotionList.map((v) => 'emotion:' + v))
|
||||
let searched = (await hypaProcesser.similaritySearchScored(result)).map((v) => {
|
||||
v[0] = v[0].replace("emotion:",'')
|
||||
|
||||
@@ -213,7 +213,7 @@ export async function runLua(code:string, arg:{
|
||||
if(!LuaLowLevelIds.has(id)){
|
||||
return
|
||||
}
|
||||
const processer = new HypaProcesser('MiniLM')
|
||||
const processer = new HypaProcesser()
|
||||
await processer.addText(value)
|
||||
return await processer.similaritySearch(source)
|
||||
})
|
||||
|
||||
@@ -13,7 +13,7 @@ export async function hanuraiMemory(chats:OpenAIChat[],arg:{
|
||||
}){
|
||||
const db = getDatabase()
|
||||
const tokenizer = arg.tokenizer
|
||||
const processer = new HypaProcesser('MiniLM')
|
||||
const processer = new HypaProcesser()
|
||||
let addTexts:string[] = []
|
||||
const queryStartIndex=chats.length-maxRecentChatQuery
|
||||
console.log(chats.length,maxRecentChatQuery,queryStartIndex)
|
||||
|
||||
@@ -1,22 +1,49 @@
|
||||
import localforage from "localforage";
|
||||
import {globalFetch} from "src/ts/globalApi.svelte";
|
||||
import {runEmbedding} from "../transformers";
|
||||
import {appendLastPath} from "src/ts/util";
|
||||
import { globalFetch } from "src/ts/globalApi.svelte";
|
||||
import { runEmbedding } from "../transformers";
|
||||
import { alertError } from "src/ts/alert";
|
||||
import { appendLastPath } from "src/ts/util";
|
||||
import { getDatabase } from "src/ts/storage/database.svelte";
|
||||
|
||||
|
||||
export type HypaModel = 'ada'|'MiniLM'|'nomic'|'custom'|'nomicGPU'|'bgeSmallEn'|'bgeSmallEnGPU'|'bgem3'|'bgem3GPU'|'openai3small'|'openai3large'
|
||||
|
||||
const localModels = {
|
||||
models: {
|
||||
'MiniLM':'Xenova/all-MiniLM-L6-v2',
|
||||
'nomic':'nomic-ai/nomic-embed-text-v1.5',
|
||||
'nomicGPU':'nomic-ai/nomic-embed-text-v1.5',
|
||||
'bgeSmallEn': 'BAAI/bge-small-en-v1.5',
|
||||
'bgeSmallEnGPU': 'BAAI/bge-small-en-v1.5',
|
||||
'bgem3': 'BAAI/bge-m3',
|
||||
'bgem3GPU': 'BAAI/bge-m3',
|
||||
},
|
||||
gpuModels:[
|
||||
'nomicGPU',
|
||||
'bgeSmallEnGPU',
|
||||
'bgem3GPU'
|
||||
]
|
||||
}
|
||||
|
||||
export class HypaProcesser{
|
||||
oaikey:string
|
||||
vectors:memoryVector[]
|
||||
forage:LocalForage
|
||||
model:'ada'|'MiniLM'|'nomic'|'custom'
|
||||
model:HypaModel
|
||||
customEmbeddingUrl:string
|
||||
|
||||
constructor(model:'ada'|'MiniLM'|'nomic'|'custom',customEmbeddingUrl?:string){
|
||||
constructor(model:HypaModel|'auto' = 'auto',customEmbeddingUrl?:string){
|
||||
this.forage = localforage.createInstance({
|
||||
name: "hypaVector"
|
||||
})
|
||||
this.vectors = []
|
||||
this.model = model
|
||||
if(model === 'auto'){
|
||||
const db = getDatabase()
|
||||
this.model = db.hypaModel || 'MiniLM'
|
||||
}
|
||||
else{
|
||||
this.model = model
|
||||
}
|
||||
this.customEmbeddingUrl = customEmbeddingUrl
|
||||
}
|
||||
|
||||
@@ -38,9 +65,9 @@ export class HypaProcesser{
|
||||
|
||||
|
||||
async getEmbeds(input:string[]|string):Promise<VectorArray[]> {
|
||||
if(this.model === 'MiniLM' || this.model === 'nomic'){
|
||||
if(Object.keys(localModels.models).includes(this.model)){
|
||||
const inputs:string[] = Array.isArray(input) ? input : [input]
|
||||
let results:Float32Array[] = await runEmbedding(inputs, this.model === 'nomic' ? 'nomic-ai/nomic-embed-text-v1.5' : 'Xenova/all-MiniLM-L6-v2')
|
||||
let results:Float32Array[] = await runEmbedding(inputs, localModels.models[this.model], localModels.gpuModels.includes(this.model) ? 'webgpu' : 'wasm')
|
||||
return results
|
||||
}
|
||||
let gf = null;
|
||||
@@ -57,14 +84,21 @@ export class HypaProcesser{
|
||||
},
|
||||
})
|
||||
}
|
||||
if(this.model === 'ada'){
|
||||
if(this.model === 'ada' || this.model === 'openai3small' || this.model === 'openai3large'){
|
||||
const db = getDatabase()
|
||||
const models = {
|
||||
'ada':'text-embedding-ada-002',
|
||||
'openai3small':'text-embedding-3-small',
|
||||
'openai3large':'text-embedding-3-large'
|
||||
}
|
||||
|
||||
gf = await globalFetch("https://api.openai.com/v1/embeddings", {
|
||||
headers: {
|
||||
"Authorization": "Bearer " + this.oaikey
|
||||
"Authorization": "Bearer " + db.supaMemoryKey || this.oaikey
|
||||
},
|
||||
body: {
|
||||
"input": input,
|
||||
"model": "text-embedding-ada-002"
|
||||
"input": input,
|
||||
"model": models[this.model]
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -138,7 +172,7 @@ export class HypaProcesser{
|
||||
}
|
||||
|
||||
async similaritySearchScored(query: string) {
|
||||
return await this.similaritySearchVectorWithScore((await this.getEmbeds(query))[0],)
|
||||
return await this.similaritySearchVectorWithScore((await this.getEmbeds(query))[0],);
|
||||
}
|
||||
|
||||
private async similaritySearchVectorWithScore(
|
||||
|
||||
@@ -30,6 +30,7 @@ async function summary(
|
||||
stringlizedChat: string
|
||||
): Promise<{ success: boolean; data: string }> {
|
||||
const db = getDatabase();
|
||||
console.log("Summarizing");
|
||||
|
||||
if (db.supaModelType === "distilbart") {
|
||||
try {
|
||||
@@ -101,35 +102,27 @@ async function summary(
|
||||
supaPrompt.replaceAll("{{slot}}", stringlizedChat)
|
||||
);
|
||||
|
||||
const promptbody: OpenAIChat[] = parsedPrompt ?? [
|
||||
const promptbody: OpenAIChat[] = (parsedPrompt ?? [
|
||||
{
|
||||
role: "user",
|
||||
content: stringlizedChat,
|
||||
},
|
||||
{
|
||||
role: "system",
|
||||
content: supaPrompt,
|
||||
},
|
||||
];
|
||||
console.log(
|
||||
"Using submodel: ",
|
||||
db.subModel,
|
||||
"for supaMemory model"
|
||||
);
|
||||
const da = await requestChatData(
|
||||
{
|
||||
formated: promptbody,
|
||||
bias: {},
|
||||
useStreaming: false,
|
||||
noMultiGen: true,
|
||||
},
|
||||
"memory"
|
||||
);
|
||||
if (
|
||||
da.type === "fail" ||
|
||||
da.type === "streaming" ||
|
||||
da.type === "multiline"
|
||||
) {
|
||||
content: supaPrompt
|
||||
}
|
||||
]).map(message => ({
|
||||
...message,
|
||||
memo: "supaPrompt"
|
||||
}));
|
||||
console.log("Using submodel: ", db.subModel, "for supaMemory model");
|
||||
const da = await requestChatData({
|
||||
formated: promptbody,
|
||||
bias: {},
|
||||
useStreaming: false,
|
||||
noMultiGen: true
|
||||
}, 'memory');
|
||||
if (da.type === 'fail' || da.type === 'streaming' || da.type === 'multiline') {
|
||||
return {
|
||||
success: false,
|
||||
data: "SupaMemory: HTTP: " + da.result,
|
||||
@@ -179,7 +172,7 @@ export async function regenerateSummary(
|
||||
mainChunkIndex: number
|
||||
) : Promise<void> {
|
||||
const targetMainChunk = data.mainChunks[mainChunkIndex];
|
||||
|
||||
|
||||
}
|
||||
export async function hypaMemoryV2(
|
||||
chats: OpenAIChat[],
|
||||
@@ -209,6 +202,7 @@ export async function hypaMemoryV2(
|
||||
currentTokens += allocatedTokens + chats.length * 4; // ChatML token counting from official openai documentation
|
||||
let mainPrompt = "";
|
||||
const lastTwoChats = chats.slice(-2);
|
||||
// Error handling for infinite summarization attempts
|
||||
let summarizationFailures = 0;
|
||||
const maxSummarizationFailures = 3;
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ export function getGenerationModelString(){
|
||||
const db = getDatabase()
|
||||
switch (db.aiModel){
|
||||
case 'reverse_proxy':
|
||||
return 'reverse_proxy-' + (db.reverseProxyOobaMode ? 'ooba' : db.proxyRequestModel)
|
||||
return 'custom-' + (db.reverseProxyOobaMode ? 'ooba' : db.customProxyRequestModel)
|
||||
case 'openrouter':
|
||||
return 'openrouter-' + db.openrouterRequestModel
|
||||
default:
|
||||
|
||||
@@ -1364,7 +1364,6 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
|
||||
|
||||
|
||||
let reformatedChat:GeminiChat[] = []
|
||||
let pendingImage = ''
|
||||
let systemPrompt = ''
|
||||
|
||||
if(formated[0].role === 'system'){
|
||||
@@ -1374,10 +1373,7 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
|
||||
|
||||
for(let i=0;i<formated.length;i++){
|
||||
const chat = formated[i]
|
||||
if(chat.memo && chat.memo.startsWith('inlayImage')){
|
||||
pendingImage = chat.content
|
||||
continue
|
||||
}
|
||||
|
||||
if(i === 0){
|
||||
if(chat.role === 'user' || chat.role === 'assistant'){
|
||||
reformatedChat.push({
|
||||
@@ -1403,7 +1399,34 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
|
||||
chat.role === 'assistant' ? 'MODEL' :
|
||||
chat.role
|
||||
|
||||
if(prevChat.role === qRole){
|
||||
if (chat.multimodals && chat.multimodals.length > 0 && chat.role === "user") {
|
||||
let geminiParts: GeminiPart[] = [];
|
||||
|
||||
geminiParts.push({
|
||||
text: chat.content,
|
||||
});
|
||||
|
||||
for (const modal of chat.multimodals) {
|
||||
if (modal.type === "image") {
|
||||
const dataurl = modal.base64;
|
||||
const base64 = dataurl.split(",")[1];
|
||||
const mediaType = dataurl.split(";")[0].split(":")[1];
|
||||
|
||||
geminiParts.push({
|
||||
inlineData: {
|
||||
mimeType: mediaType,
|
||||
data: base64,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
reformatedChat.push({
|
||||
role: "USER",
|
||||
parts: geminiParts,
|
||||
});
|
||||
|
||||
} else if (prevChat.role === qRole) {
|
||||
reformatedChat[reformatedChat.length-1].parts[0].text += '\n' + chat.content
|
||||
continue
|
||||
}
|
||||
@@ -1420,36 +1443,7 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
|
||||
})
|
||||
}
|
||||
}
|
||||
else if(chat.role === 'user' && pendingImage !== ''){
|
||||
//conver image to jpeg so it can be inlined
|
||||
const canv = document.createElement('canvas')
|
||||
const img = new Image()
|
||||
img.src = pendingImage
|
||||
await img.decode()
|
||||
canv.width = img.width
|
||||
canv.height = img.height
|
||||
const ctx = canv.getContext('2d')
|
||||
ctx.drawImage(img, 0, 0)
|
||||
const base64 = canv.toDataURL('image/jpeg').replace(/^data:image\/jpeg;base64,/, "")
|
||||
const mimeType = 'image/jpeg'
|
||||
pendingImage = ''
|
||||
canv.remove()
|
||||
img.remove()
|
||||
|
||||
reformatedChat.push({
|
||||
role: "USER",
|
||||
parts: [
|
||||
{
|
||||
text: chat.content,
|
||||
},
|
||||
{
|
||||
inlineData: {
|
||||
mimeType: mimeType,
|
||||
data: base64
|
||||
}
|
||||
}]
|
||||
})
|
||||
}
|
||||
else if(chat.role === 'assistant' || chat.role === 'user'){
|
||||
reformatedChat.push({
|
||||
role: chat.role === 'user' ? 'USER' : 'MODEL',
|
||||
@@ -1578,14 +1572,24 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
|
||||
}
|
||||
}
|
||||
|
||||
const url = arg.customURL ?? (arg.modelInfo.format === LLMFormat.VertexAIGemini ?
|
||||
`https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/publishers/google/models/${arg.modelInfo.internalID}:streamGenerateContent`
|
||||
: `https://generativelanguage.googleapis.com/v1beta/models/${arg.modelInfo.internalID}:generateContent?key=${db.google.accessToken}`)
|
||||
let url = ''
|
||||
|
||||
if(arg.customURL){
|
||||
const u = new URL(arg.customURL)
|
||||
u.searchParams.set('key', db.proxyKey)
|
||||
url = u.toString()
|
||||
}
|
||||
else if(arg.modelInfo.format === LLMFormat.VertexAIGemini){
|
||||
url =`https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/publishers/google/models/${arg.modelInfo.internalID}:streamGenerateContent`
|
||||
}
|
||||
else{
|
||||
url = `https://generativelanguage.googleapis.com/v1beta/models/${arg.modelInfo.internalID}:generateContent?key=${db.google.accessToken}`
|
||||
}
|
||||
const res = await globalFetch(url, {
|
||||
headers: headers,
|
||||
body: body,
|
||||
chatId: arg.chatId,
|
||||
abortSignal: arg.abortSignal
|
||||
abortSignal: arg.abortSignal,
|
||||
})
|
||||
|
||||
if(!res.ok){
|
||||
@@ -2533,7 +2537,7 @@ async function requestWebLLM(arg:RequestDataArgumentExtended):Promise<requestDat
|
||||
top_p: db.ooba.top_p,
|
||||
repetition_penalty: db.ooba.repetition_penalty,
|
||||
typical_p: db.ooba.typical_p,
|
||||
})
|
||||
} as any)
|
||||
return {
|
||||
type: 'success',
|
||||
result: unstringlizeChat(v.generated_text as string, formated, currentChar?.name ?? '')
|
||||
|
||||
@@ -321,7 +321,7 @@ export async function processScriptFull(char:character|groupChat|simpleCharacter
|
||||
}
|
||||
}
|
||||
|
||||
const processer = new HypaProcesser('MiniLM')
|
||||
const processer = new HypaProcesser()
|
||||
await processer.addText(assetNames)
|
||||
const matches = data.matchAll(assetRegex)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {env, AutoTokenizer, pipeline, type SummarizationOutput, type TextGenerationConfig, type TextGenerationOutput, FeatureExtractionPipeline, TextToAudioPipeline, type ImageToTextOutput } from '@xenova/transformers';
|
||||
import {env, AutoTokenizer, pipeline, type SummarizationOutput, type TextGenerationConfig, type TextGenerationOutput, FeatureExtractionPipeline, TextToAudioPipeline, type ImageToTextOutput } from '@huggingface/transformers';
|
||||
import { unzip } from 'fflate';
|
||||
import { globalFetch, loadAsset, saveAsset } from 'src/ts/globalApi.svelte';
|
||||
import { selectSingleFile } from 'src/ts/util';
|
||||
@@ -15,6 +15,7 @@ async function initTransformers(){
|
||||
env.useBrowserCache = false
|
||||
env.useFSCache = false
|
||||
env.useCustomCache = true
|
||||
env.allowLocalModels = true
|
||||
env.customCache = {
|
||||
put: async (url:URL|string, response:Response) => {
|
||||
await tfCache.put(url, response)
|
||||
@@ -33,10 +34,12 @@ async function initTransformers(){
|
||||
console.log('transformers loaded')
|
||||
}
|
||||
|
||||
export const runTransformers = async (baseText:string, model:string,config:TextGenerationConfig = {}) => {
|
||||
export const runTransformers = async (baseText:string, model:string,config:TextGenerationConfig, device:'webgpu'|'wasm' = 'wasm') => {
|
||||
await initTransformers()
|
||||
let text = baseText
|
||||
let generator = await pipeline('text-generation', model);
|
||||
let generator = await pipeline('text-generation', model, {
|
||||
device
|
||||
});
|
||||
let output = await generator(text, config) as TextGenerationOutput
|
||||
const outputOne = output[0]
|
||||
return outputOne
|
||||
@@ -50,16 +53,25 @@ export const runSummarizer = async (text: string) => {
|
||||
}
|
||||
|
||||
let extractor:FeatureExtractionPipeline = null
|
||||
let lastEmbeddingModelQuery:string = ''
|
||||
type EmbeddingModel = 'Xenova/all-MiniLM-L6-v2'|'nomic-ai/nomic-embed-text-v1.5'
|
||||
export const runEmbedding = async (texts: string[], model:EmbeddingModel = 'Xenova/all-MiniLM-L6-v2'):Promise<Float32Array[]> => {
|
||||
export const runEmbedding = async (texts: string[], model:EmbeddingModel = 'Xenova/all-MiniLM-L6-v2', device:'webgpu'|'wasm'):Promise<Float32Array[]> => {
|
||||
await initTransformers()
|
||||
if(!extractor){
|
||||
extractor = await pipeline('feature-extraction', model);
|
||||
console.log('running embedding')
|
||||
let embeddingModelQuery = model + device
|
||||
if(!extractor || embeddingModelQuery !== lastEmbeddingModelQuery){
|
||||
extractor = await pipeline('feature-extraction', model, {
|
||||
device: device,
|
||||
progress_callback: (progress) => {
|
||||
console.log(progress)
|
||||
}
|
||||
});
|
||||
console.log('extractor loaded')
|
||||
}
|
||||
let result = await extractor(texts, { pooling: 'mean', normalize: true });
|
||||
console.log(texts, result)
|
||||
const data = result.data as Float32Array
|
||||
|
||||
console.log(data)
|
||||
const lenPerText = data.length / texts.length
|
||||
let res:Float32Array[] = []
|
||||
for(let i = 0; i < texts.length; i++){
|
||||
|
||||
@@ -459,7 +459,7 @@ export async function runTrigger(char:character,mode:triggerMode, arg:{
|
||||
break
|
||||
}
|
||||
|
||||
const processer = new HypaProcesser('MiniLM')
|
||||
const processer = new HypaProcesser()
|
||||
const effectValue = risuChatParser(effect.value,{chara:char})
|
||||
const source = risuChatParser(effect.source,{chara:char})
|
||||
await processer.addText(effectValue.split('§'))
|
||||
|
||||
@@ -12,7 +12,7 @@ import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme';
|
||||
import type { PromptItem, PromptSettings } from '../process/prompt';
|
||||
import type { OobaChatCompletionRequestParams } from '../model/ooba';
|
||||
|
||||
export let appVer = "141.2.0"
|
||||
export let appVer = "143.0.1"
|
||||
export let webAppSubVer = ''
|
||||
|
||||
|
||||
@@ -703,7 +703,7 @@ export interface Database{
|
||||
colorSchemeName:string
|
||||
promptTemplate?:PromptItem[]
|
||||
forceProxyAsOpenAI?:boolean
|
||||
hypaModel:'ada'|'MiniLM'
|
||||
hypaModel:HypaModel
|
||||
saveTime?:number
|
||||
mancerHeader:string
|
||||
emotionProcesser:'submodel'|'embedding',
|
||||
@@ -857,6 +857,9 @@ export interface Database{
|
||||
notification: boolean
|
||||
customFlags: LLMFlags[]
|
||||
enableCustomFlags: boolean
|
||||
googleClaudeTokenizing: boolean
|
||||
presetChain: string
|
||||
legacyMediaFindings?:boolean
|
||||
}
|
||||
|
||||
interface SeparateParameters{
|
||||
@@ -1597,6 +1600,7 @@ import { decodeRPack, encodeRPack } from '../rpack/rpack_bg';
|
||||
import { DBState, selectedCharID } from '../stores.svelte';
|
||||
import { LLMFlags, LLMFormat } from '../model/modellist';
|
||||
import type { Parameter } from '../process/request';
|
||||
import type { HypaModel } from '../process/memory/hypamemory';
|
||||
|
||||
export async function downloadPreset(id:number, type:'json'|'risupreset'|'return' = 'json'){
|
||||
saveCurrentPreset()
|
||||
|
||||
@@ -6,6 +6,7 @@ import { supportsInlayImage } from "./process/files/image";
|
||||
import { risuChatParser } from "./parser.svelte";
|
||||
import { tokenizeGGUFModel } from "./process/models/local";
|
||||
import { globalFetch } from "./globalApi.svelte";
|
||||
import { getModelInfo, LLMTokenizer } from "./model/modellist";
|
||||
|
||||
|
||||
export const tokenizerList = [
|
||||
@@ -44,58 +45,86 @@ export async function encode(data:string):Promise<(number[]|Uint32Array|Int32Arr
|
||||
return await tikJS(data, 'o200k_base')
|
||||
}
|
||||
}
|
||||
if(db.aiModel.startsWith('novellist')){
|
||||
const modelInfo = getModelInfo(db.aiModel)
|
||||
|
||||
if(modelInfo.tokenizer === LLMTokenizer.NovelList){
|
||||
const nv= await tokenizeWebTokenizers(data, 'novellist')
|
||||
return nv
|
||||
}
|
||||
if(db.aiModel.startsWith('claude')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.Claude){
|
||||
return await tokenizeWebTokenizers(data, 'claude')
|
||||
}
|
||||
if(db.aiModel.startsWith('novelai')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.NovelAI){
|
||||
return await tokenizeWebTokenizers(data, 'novelai')
|
||||
}
|
||||
if(db.aiModel.startsWith('mistral')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.Mistral){
|
||||
return await tokenizeWebTokenizers(data, 'mistral')
|
||||
}
|
||||
if(db.aiModel === 'mancer' ||
|
||||
db.aiModel === 'textgen_webui' ||
|
||||
(db.aiModel === 'reverse_proxy' && db.reverseProxyOobaMode)){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.Llama){
|
||||
return await tokenizeWebTokenizers(data, 'llama')
|
||||
}
|
||||
if(db.aiModel.startsWith('local_')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.Local){
|
||||
return await tokenizeGGUFModel(data)
|
||||
}
|
||||
if(db.aiModel === 'ooba'){
|
||||
if(db.reverseProxyOobaArgs.tokenizer === 'mixtral' || db.reverseProxyOobaArgs.tokenizer === 'mistral'){
|
||||
return await tokenizeWebTokenizers(data, 'mistral')
|
||||
}
|
||||
else if(db.reverseProxyOobaArgs.tokenizer === 'llama'){
|
||||
return await tokenizeWebTokenizers(data, 'llama')
|
||||
}
|
||||
else{
|
||||
return await tokenizeWebTokenizers(data, 'llama')
|
||||
}
|
||||
}
|
||||
if(db.aiModel.startsWith('gpt4o')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.tiktokenO200Base){
|
||||
return await tikJS(data, 'o200k_base')
|
||||
}
|
||||
if(db.aiModel.startsWith('gemini')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.GoogleCloud && db.googleClaudeTokenizing){
|
||||
return await tokenizeGoogleCloud(data)
|
||||
}
|
||||
if(modelInfo.tokenizer === LLMTokenizer.Gemma || modelInfo.tokenizer === LLMTokenizer.GoogleCloud){
|
||||
return await tokenizeWebTokenizers(data, 'gemma')
|
||||
}
|
||||
if(db.aiModel.startsWith('cohere')){
|
||||
if(modelInfo.tokenizer === LLMTokenizer.Cohere){
|
||||
return await tokenizeWebTokenizers(data, 'cohere')
|
||||
}
|
||||
|
||||
return await tikJS(data)
|
||||
}
|
||||
|
||||
type tokenizerType = 'novellist'|'claude'|'novelai'|'llama'|'mistral'|'llama3'|'gemma'|'cohere'
|
||||
type tokenizerType = 'novellist'|'claude'|'novelai'|'llama'|'mistral'|'llama3'|'gemma'|'cohere'|'googleCloud'
|
||||
|
||||
let tikParser:Tiktoken = null
|
||||
let tokenizersTokenizer:Tokenizer = null
|
||||
let tokenizersType:tokenizerType = null
|
||||
let lastTikModel = 'cl100k_base'
|
||||
|
||||
let googleCloudTokenizedCache = new Map<string, number>()
|
||||
|
||||
async function tokenizeGoogleCloud(text:string) {
|
||||
const db = getDatabase()
|
||||
const model = getModelInfo(db.aiModel)
|
||||
|
||||
if(googleCloudTokenizedCache.has(text + model.internalID)){
|
||||
const count = googleCloudTokenizedCache.get(text)
|
||||
return new Uint32Array(count)
|
||||
}
|
||||
|
||||
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model.internalID}:countTokens?key=${db.google?.accessToken}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
contents: [{
|
||||
parts:[{
|
||||
text: text
|
||||
}]
|
||||
}]
|
||||
}),
|
||||
})
|
||||
|
||||
if(res.status !== 200){
|
||||
return await tokenizeWebTokenizers(text, 'gemma')
|
||||
}
|
||||
|
||||
const json = await res.json()
|
||||
googleCloudTokenizedCache.set(text + model.internalID, json.totalTokens as number)
|
||||
const count = json.totalTokens as number
|
||||
|
||||
return new Uint32Array(count)
|
||||
}
|
||||
|
||||
async function tikJS(text:string, model='cl100k_base') {
|
||||
if(!tikParser || lastTikModel !== model){
|
||||
if(model === 'cl100k_base'){
|
||||
|
||||
Reference in New Issue
Block a user