Refactor model handling

This commit is contained in:
kwaroran
2024-11-25 05:25:58 +09:00
parent cfc819f144
commit 8274fae180
6 changed files with 2702 additions and 2817 deletions

View File

@@ -9,15 +9,15 @@
import { HideIconStore, ReloadGUIPointer, selIdState } from "../../ts/stores.svelte"; import { HideIconStore, ReloadGUIPointer, selIdState } from "../../ts/stores.svelte";
import { translateHTML } from "../../ts/translator/translator"; import { translateHTML } from "../../ts/translator/translator";
import { risuChatParser } from "src/ts/process/scripts"; import { risuChatParser } from "src/ts/process/scripts";
import { get, type Unsubscriber } from "svelte/store"; import { type Unsubscriber } from "svelte/store";
import { isEqual } from "lodash"; import { isEqual } from "lodash";
import { sayTTS } from "src/ts/process/tts"; import { sayTTS } from "src/ts/process/tts";
import { getModelShortName } from "src/ts/model/names";
import { capitalize } from "src/ts/util"; import { capitalize } from "src/ts/util";
import { longpress } from "src/ts/gui/longtouch"; import { longpress } from "src/ts/gui/longtouch";
import { ColorSchemeTypeStore } from "src/ts/gui/colorscheme"; import { ColorSchemeTypeStore } from "src/ts/gui/colorscheme";
import { ConnectionOpenStore } from "src/ts/sync/multiuser"; import { ConnectionOpenStore } from "src/ts/sync/multiuser";
import { onDestroy, onMount } from "svelte"; import { onDestroy, onMount } from "svelte";
import { getModelInfo } from "src/ts/model/modellist";
let translating = $state(false) let translating = $state(false)
let editMode = $state(false) let editMode = $state(false)
let statusMessage:string = $state('') let statusMessage:string = $state('')
@@ -232,7 +232,7 @@
> >
<BotIcon size={20} /> <BotIcon size={20} />
<span class="ml-1"> <span class="ml-1">
{capitalize(getModelShortName(messageGenerationInfo.model))} {capitalize(getModelInfo(messageGenerationInfo.model).shortName)}
</span> </span>
</button> </button>
</div> </div>

View File

@@ -4,11 +4,8 @@
import { getHordeModels } from "src/ts/horde/getModels"; import { getHordeModels } from "src/ts/horde/getModels";
import Arcodion from "./Arcodion.svelte"; import Arcodion from "./Arcodion.svelte";
import { language } from "src/lang"; import { language } from "src/lang";
import Help from "../Others/Help.svelte";
import CheckInput from "./GUI/CheckInput.svelte"; import CheckInput from "./GUI/CheckInput.svelte";
import { isTauri } from "src/ts/globalApi.svelte"; import { getModelInfo, getModelList } from 'src/ts/model/modellist';
import {open} from '@tauri-apps/plugin-dialog'
import { getModelName } from "src/ts/model/names";
interface Props { interface Props {
value?: string; value?: string;
@@ -26,8 +23,11 @@
openOptions = false openOptions = false
onChange(name) onChange(name)
} }
let showUnrec = $state(false) let showUnrec = $state(false)
let providers = $derived(getModelList({
recommendedOnly: !showUnrec,
groupedByProvider: true
}))
</script> </script>
{#if openOptions} {#if openOptions}
@@ -42,123 +42,20 @@
<h1 class="font-bold text-xl">{language.model} <h1 class="font-bold text-xl">{language.model}
</h1> </h1>
<div class="border-t-1 border-y-selected mt-1 mb-1"></div> <div class="border-t-1 border-y-selected mt-1 mb-1"></div>
<Arcodion name="OpenAI GPT">
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35')}}>GPT-3.5 Turbo</button> {#each providers as provider}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('instructgpt35')}}>GPT-3.5 Instruct</button> {#if provider.providerName === '@as-is'}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_turbo')}}>GPT-4 Turbo</button> {#each provider.models as model}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o')}}>GPT-4o</button> <button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel(model.id)}}>{model.name}</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4om')}}>GPT-4o Mini</button> {/each}
{#if showUnrec} {:else}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4')}}>GPT-4 (Old)</button> <Arcodion name={provider.providerName}>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_32k')}}>GPT-4 32K (Old)</button> {#each provider.models as model}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35_16k')}}>GPT-3.5 Turbo 16K</button> <button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel(model.id)}}>{model.name}</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_0314')}}>GPT-4 0314</button> {/each}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_0613')}}>GPT-4 0613</button> </Arcodion>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_32k_0613')}}>GPT-4 32K 0613</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_1106')}}>GPT-4 Turbo 1106</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35_0125')}}>GPT-3.5 Turbo 0125</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35_1106')}}>GPT-3.5 Turbo 1106</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35_0613')}}>GPT-3.5 Turbo 0613</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35_16k_0613')}}>GPT-3.5 Turbo 16K 0613</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt35_0301')}}>GPT-3.5 Turbo 0301</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_0125')}}>GPT-4 Turbo 0125</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gptvi4_1106')}}>GPT-4 Turbo 1106 Vision</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4_turbo_20240409')}}>GPT-4 Turbo 20240409</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o-2024-05-13')}}>GPT-4o 20240513</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o-2024-08-06')}}>GPT-4o 20240806</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o-2024-11-20')}}>GPT-4o 20241120</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o-chatgpt')}}>GPT-4o ChatGPT</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o1-preview')}}>o1 Preview</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('gpt4o1-mini')}}>o1 Mini</button>
{/if} {/if}
</Arcodion> {/each}
<Arcodion name="Anthropic Claude">
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-3-5-sonnet-20241022')}}>Claude 3.5 Sonnet (20241022)</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-3-haiku-20240307')}}>Claude 3 Haiku (20240307)</button>
{#if showUnrec}
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-3-5-sonnet-20240620')}}>Claude 3.5 Sonnet (20240620)</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-3-opus-20240229')}}>Claude 3 Opus (20240229)</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-3-sonnet-20240229')}}>Claude 3 Sonnet (20240229)</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-2.1')}}>claude-2.1</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-2')}}>claude-2</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-2-100k')}}>claude-2-100k</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-v1')}}>claude-v1</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-v1-100k')}}>claude-v1-100k</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-instant-v1')}}>claude-instant-v1</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-instant-v1-100k')}}>claude-instant-v1-100k</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-1.2')}}>claude-v1.2</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('claude-1.0')}}>claude-v1.0</button>
{/if}
</Arcodion>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('reverse_proxy')}}>Custom (OpenAI-compatible)</button>
{#if DBState.db.tpo && isTauri}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={async () => {
const selected = await open({
filters: [{
name: 'Model File',
extensions: ['gguf']
}]
});
if(selected){
changeModel('local_' + selected)
}
}}>Local GGUF Model <Help key="experimental"/> </button>
{/if}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('ooba')}}>Oobabooga</button>
{#if showUnrec}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('textgen_webui')}}>Oobabooga Legacy</button>
{/if}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('mancer')}}>Mancer</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('openrouter')}}>OpenRouter</button>
<Arcodion name="Mistral API">
{#if showUnrec}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('mistral-small-latest')}}>Mistral Small</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('mistral-medium-latest')}}>Mistral Medium</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('mistral-large-2411')}}>Mistral Large 2411</button>
{/if}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('open-mistral-nemo')}}>Mistral Nemo</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('mistral-large-latest')}}>Mistral Large</button>
</Arcodion>
<Arcodion name="Google Gemini">
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-1.5-pro-exp-0827')}}>Gemini Pro 1.5 0827</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-exp-1121')}}>Gemini Exp 1121</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-exp-1114')}}>Gemini Exp 1114</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-1.5-pro-002')}}>Gemini Pro 1.5 002</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-1.5-flash-002')}}>Gemini Flash 1.5 002</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-1.5-pro-latest')}}>Gemini Pro 1.5</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-1.5-flash')}}>Gemini Flash 1.5</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-pro')}}>Gemini Pro</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-pro-vision')}}>Gemini Pro Vision</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-ultra')}}>Gemini Ultra</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('gemini-ultra-vision')}}>Gemini Ultra Vision</button>
</Arcodion>
{#if showUnrec}
<Arcodion name="Google Palm2">
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('palm2')}}>Bison</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('palm2_unicorn')}}>Unicorn</button>
</Arcodion>
{/if}
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('kobold')}}>Kobold</button>
<Arcodion name="Novellist">
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('novellist')}}>SuperTrin</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('novellist_damsel')}}>Damsel</button>
</Arcodion>
<Arcodion name="Cohere">
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('cohere-command-r')}}>Command R</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('cohere-command-r-plus')}}>Command R Plus</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('cohere-command-r-08-2024')}}>Command R 08-2024</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('cohere-command-r-03-2024')}}>Command R 03-2024</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('cohere-command-r-plus-08-2024')}}>Command R Plus 08-2024</button>
<button class="p-2 hover:text-green-500" onclick={() => {changeModel('cohere-command-r-plus-04-2024')}}>Command R Plus 04-2024</button>
</Arcodion>
<Arcodion name="NovelAI">
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('novelai')}}>NovelAI Clio</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('novelai_kayra')}}>NovelAI Kayra</button>
</Arcodion>
<Arcodion name="AI21">
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('jamba-1.5-large')}}>Jamba 1.5 Large</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('jamba-1.5-medium')}}>Jamba 1.5 Medium</button>
</Arcodion>
<Arcodion name="Horde"> <Arcodion name="Horde">
{#await getHordeModels()} {#await getHordeModels()}
<button class="p-2">Loading...</button> <button class="p-2">Loading...</button>
@@ -175,15 +72,6 @@
{/each} {/each}
{/await} {/await}
</Arcodion> </Arcodion>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('ollama-hosted')}}>OLlama</button>
{#if showUnrec}
<Arcodion name="WebLLM Local">
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('hf:::Xenova/opt-350m')}}>opt-350m</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('hf:::Xenova/tiny-random-mistral')}}>tiny-random-mistral</button>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('hf:::Xenova/gpt2-large-conversational')}}>gpt2-large-conversational</button>
</Arcodion>
<button class="hover:bg-selected px-6 py-2 text-lg" onclick={() => {changeModel('risullm-proto')}}>RisuAI LLM (Prototype)</button>
{/if}
{#if DBState.db.plugins.length > 0} {#if DBState.db.plugins.length > 0}
<button onclick={() => {changeModel('custom')}} class="hover:bg-selected px-6 py-2 text-lg" >Plugin</button> <button onclick={() => {changeModel('custom')}} class="hover:bg-selected px-6 py-2 text-lg" >Plugin</button>
{/if} {/if}
@@ -197,6 +85,6 @@
<button onclick={() => {openOptions = true}} <button onclick={() => {openOptions = true}}
class="mt-4 drop-shadow-lg p-3 flex justify-center items-center ml-2 mr-2 rounded-lg bg-darkbutton mb-4 border-darkborderc border"> class="mt-4 drop-shadow-lg p-3 flex justify-center items-center ml-2 mr-2 rounded-lg bg-darkbutton mb-4 border-darkborderc border">
{getModelName(value)} {getModelInfo(value).fullName}
</button> </button>

View File

@@ -4,31 +4,52 @@ export enum LLMFlags{
hasAudioInput, hasAudioInput,
hasAudioOutput, hasAudioOutput,
hasPrefill, hasPrefill,
hasCache hasCache,
hasFullSystemPrompt,
hasFirstSystemPrompt,
} }
export enum LLMProvider{ export enum LLMProvider{
OpenAI, OpenAI,
Antropic, Anthropic,
GoogleCloud, GoogleCloud,
VertexAI, VertexAI,
AsIs, AsIs,
Mistral Mistral,
NovelList,
Cohere,
NovelAI,
WebLLM,
Horde,
AWS,
} }
export enum LLMFormat{ export enum LLMFormat{
OpenAICompatible, OpenAICompatible,
OpenAILegacyInstruct, OpenAILegacyInstruct,
Antropic, Anthropic,
AnthropicLegacy, AnthropicLegacy,
AsIs, Mistral,
Mistral GoogleCloud,
VertexAIGemini,
NovelList,
Cohere,
NovelAI,
WebLLM,
OobaLegacy,
Plugin,
Ooba,
Kobold,
Ollama,
Horde,
AWSBedrockClaude
} }
export interface LLMModel{ export interface LLMModel{
id: string id: string
name: string name: string
shortName?: string shortName?: string
fullName?: string
internalID?: string internalID?: string
provider: LLMProvider provider: LLMProvider
flags: LLMFlags[] flags: LLMFlags[]
@@ -36,6 +57,21 @@ export interface LLMModel{
recommended?: boolean recommended?: boolean
} }
const ProviderNames = new Map<LLMProvider, string>([
[LLMProvider.OpenAI, 'OpenAI'],
[LLMProvider.Anthropic, 'Anthropic'],
[LLMProvider.GoogleCloud, 'Google Cloud'],
[LLMProvider.VertexAI, 'Vertex AI'],
[LLMProvider.AsIs, 'As Is'],
[LLMProvider.Mistral, 'MistralAI'],
[LLMProvider.NovelList, 'NovelList'],
[LLMProvider.Cohere, 'Cohere'],
[LLMProvider.NovelAI, 'NovelAI'],
[LLMProvider.WebLLM, 'WebLLM'],
[LLMProvider.Horde, 'Horde'],
[LLMProvider.AWS, 'AWS'],
])
export const LLMModels: LLMModel[] = [ export const LLMModels: LLMModel[] = [
{ {
id: 'gpt35', id: 'gpt35',
@@ -69,7 +105,8 @@ export const LLMModels: LLMModel[] = [
format: LLMFormat.OpenAICompatible, format: LLMFormat.OpenAICompatible,
flags: [ flags: [
LLMFlags.hasImageInput LLMFlags.hasImageInput
] ],
recommended: true
}, },
{ {
id: 'gpt4om', id: 'gpt4om',
@@ -79,7 +116,8 @@ export const LLMModels: LLMModel[] = [
format: LLMFormat.OpenAICompatible, format: LLMFormat.OpenAICompatible,
flags: [ flags: [
LLMFlags.hasImageInput LLMFlags.hasImageInput
] ],
recommended: true
}, },
{ {
id: 'gpt4', id: 'gpt4',
@@ -257,116 +295,169 @@ export const LLMModels: LLMModel[] = [
format: LLMFormat.OpenAICompatible, format: LLMFormat.OpenAICompatible,
flags: [], flags: [],
}, },
{
name: "Claude 3.5 Sonnet",
id: 'claude-3-5-sonnet-latest',
shortName: "3.5 Sonnet",
provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
recommended: true
},
{
name: "Claude 3.5 Haiku",
id: 'claude-3-5-haiku-latest',
shortName: "3.5 Haiku",
provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
recommended: true
},
{ {
name: 'Claude 3.5 Sonnet (20241022)', name: 'Claude 3.5 Sonnet (20241022)',
id: 'claude-3-5-sonnet-20241022', id: 'claude-3-5-sonnet-20241022',
provider: LLMProvider.Antropic, shortName: "3.5 Sonnet 1022",
format: LLMFormat.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
},
{
name: "Claude 3.5 Haiku (20241022)",
id: 'claude-3-5-haiku-20241022',
shortName: "3.5 Haiku 1022",
provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput], flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
}, },
{ {
name: 'Claude 3 Haiku (20240307)', name: 'Claude 3 Haiku (20240307)',
id: 'claude-3-haiku-20240307', id: 'claude-3-haiku-20240307',
provider: LLMProvider.Antropic, shortName: "3 Haiku 0307",
format: LLMFormat.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput], flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
}, },
{ {
name: 'Claude 3.5 Sonnet (20240620)', name: 'Claude 3.5 Sonnet (20240620)',
id: 'claude-3-5-sonnet-20240620', id: 'claude-3-5-sonnet-20240620',
provider: LLMProvider.Antropic, shortName: "3.5 Sonnet 0620",
format: LLMFormat.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput], flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
}, },
{ {
name: 'Claude 3 Opus (20240229)', name: 'Claude 3 Opus (20240229)',
id: 'claude-3-opus-20240229', id: 'claude-3-opus-20240229',
provider: LLMProvider.Antropic, shortName: "3 Opus 0229",
format: LLMFormat.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput], flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
}, },
{ {
name: 'Claude 3 Sonnet (20240229)', name: 'Claude 3 Sonnet (20240229)',
id: 'claude-3-sonnet-20240229', id: 'claude-3-sonnet-20240229',
provider: LLMProvider.Antropic, shortName: "3 Sonnet 0229",
format: LLMFormat.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Anthropic,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput], flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
}, },
{ {
name: 'Claude 2.1', name: 'Claude 2.1',
id: 'claude-2.1', id: 'claude-2.1',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude 2', name: 'Claude 2',
id: 'claude-2', id: 'claude-2',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude 2 100k', name: 'Claude 2 100k',
id: 'claude-2-100k', id: 'claude-2-100k',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude v1', name: 'Claude v1',
id: 'claude-v1', id: 'claude-v1',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude v1 100k', name: 'Claude v1 100k',
id: 'claude-v1-100k', id: 'claude-v1-100k',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude Instant v1', name: 'Claude Instant v1',
id: 'claude-instant-v1', id: 'claude-instant-v1',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude Instant v1 100k', name: 'Claude Instant v1 100k',
id: 'claude-instant-v1-100k', id: 'claude-instant-v1-100k',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude v1.2', name: 'Claude v1.2',
id: 'claude-1.2', id: 'claude-1.2',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{ {
name: 'Claude v1.0', name: 'Claude v1.0',
id: 'claude-1.0', id: 'claude-1.0',
provider: LLMProvider.Antropic, provider: LLMProvider.Anthropic,
format: LLMFormat.Antropic, format: LLMFormat.AnthropicLegacy,
flags: [LLMFlags.hasPrefill], flags: [LLMFlags.hasPrefill],
}, },
{
name: 'Claude 3.5 Sonnet (20241022) v2',
id: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
provider: LLMProvider.AWS,
format: LLMFormat.AWSBedrockClaude,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
},
{
name: 'Claude 3.5 Sonnet (20240620) v1',
id: 'anthropic.claude-3-5-sonnet-20240620-v1:0',
provider: LLMProvider.AWS,
format: LLMFormat.AWSBedrockClaude,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
},
{
name: 'Claude 3 Opus (20240229) v1',
id: 'anthropic.claude-3-opus-20240229-v1:0',
provider: LLMProvider.AWS,
format: LLMFormat.AWSBedrockClaude,
flags: [LLMFlags.hasPrefill, LLMFlags.hasImageInput],
},
{ {
name: 'Ooba', name: 'Ooba',
id: 'ooba', id: 'ooba',
provider: LLMProvider.AsIs, provider: LLMProvider.AsIs,
format: LLMFormat.AsIs, format: LLMFormat.Ooba,
flags: [], flags: [],
recommended: true
}, },
{ {
name: 'Mancer', name: 'Mancer',
id: 'mancer', id: 'mancer',
provider: LLMProvider.AsIs, provider: LLMProvider.AsIs,
format: LLMFormat.AsIs, format: LLMFormat.OobaLegacy,
flags: [], flags: [],
}, },
{ {
@@ -375,12 +466,382 @@ export const LLMModels: LLMModel[] = [
provider: LLMProvider.AsIs, provider: LLMProvider.AsIs,
format: LLMFormat.OpenAICompatible, format: LLMFormat.OpenAICompatible,
flags: [], flags: [],
recommended: true
}, },
{ {
name: 'mistral-small-latest', name: 'Mistral Small Latest',
id: 'mistral-small-latest', id: 'mistral-small-latest',
shortName: 'Mistral S',
provider: LLMProvider.Mistral, provider: LLMProvider.Mistral,
format: LLMFormat.Mistral, format: LLMFormat.Mistral,
flags: [], flags: [],
recommended: true
},
{
name: 'Mistral Medium Latest',
id: 'mistral-medium-latest',
shortName: 'Mistral M',
provider: LLMProvider.Mistral,
format: LLMFormat.Mistral,
flags: [],
recommended: true
},
{
name: 'Mistral Large 2411',
id: 'mistral-large-2411',
shortName: 'Mistral L 2411',
provider: LLMProvider.Mistral,
format: LLMFormat.Mistral,
flags: [],
},
{
name: 'Mistral Nemo',
id: 'open-mistral-nemo',
shortName: 'Mistral Nemo',
provider: LLMProvider.Mistral,
format: LLMFormat.Mistral,
flags: [],
},
{
name: 'Mistral Large Latest',
id: 'mistral-large-latest',
shortName: 'Mistral L',
provider: LLMProvider.Mistral,
format: LLMFormat.Mistral,
flags: [],
recommended: true
},
{
name: "Gemini Pro 1.5 0827",
id: 'gemini-1.5-pro-exp-0827',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Exp 1121",
id: 'gemini-exp-1121',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
recommended: true
},
{
name: "Gemini Pro 1.5",
id: 'gemini-1.5-pro-latest',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
recommended: true
},
{
name: "Gemini Flash 1.5",
id: 'gemini-1.5-flash',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
recommended: true
},
{
name: "Gemini Exp 1121",
id: 'gemini-exp-1121-vertex',
internalID: 'gemini-exp-1121',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.VertexAIGemini,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Pro 1.5",
id: 'gemini-1.5-pro-latest-vertex',
internalID: 'gemini-1.5-pro-latest',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.VertexAIGemini,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Flash 1.5",
id: 'gemini-1.5-flash-vertex',
internalID: 'gemini-1.5-flash',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.VertexAIGemini,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Exp 1114",
id: 'gemini-exp-1114',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Pro 1.5 002",
id: 'gemini-1.5-pro-002',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Flash 1.5 002",
id: 'gemini-1.5-flash-002',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Pro",
id: 'gemini-pro',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Pro Vision",
id: 'gemini-pro-vision',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Ultra",
id: 'gemini-ultra',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: "Gemini Ultra Vision",
id: 'gemini-ultra-vision',
provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput],
},
{
name: 'Kobold',
id: 'kobold',
provider: LLMProvider.AsIs,
format: LLMFormat.Kobold,
flags: [],
recommended: true
},
{
name: "SuperTrin",
id: 'novellist',
provider: LLMProvider.NovelList,
format: LLMFormat.NovelList,
flags: [],
},
{
name: "Damsel",
id: 'novellist_damsel',
provider: LLMProvider.NovelList,
format: LLMFormat.NovelList,
flags: [],
},
{
name: "Command R",
id: 'cohere-command-r',
internalID: 'command-r',
provider: LLMProvider.Cohere,
format: LLMFormat.Cohere,
flags: [],
recommended: true
},
{
name: "Command R Plus",
id: 'cohere-command-r-plus',
internalID: 'command-r-plus',
provider: LLMProvider.Cohere,
format: LLMFormat.Cohere,
flags: [],
recommended: true
},
{
name: "Command R 08-2024",
id: 'cohere-command-r-08-2024',
internalID: 'command-r-08-2024',
provider: LLMProvider.Cohere,
format: LLMFormat.Cohere,
flags: [],
},
{
name: "Command R 03-2024",
id: 'cohere-command-r-03-2024',
internalID: 'command-r-03-2024',
provider: LLMProvider.Cohere,
format: LLMFormat.Cohere,
flags: [],
},
{
name: "Command R Plus 08-2024",
id: 'cohere-command-r-plus-08-2024',
internalID: 'command-r-plus-08-2024',
provider: LLMProvider.Cohere,
format: LLMFormat.Cohere,
flags: [],
},
{
name: "Command R Plus 04-2024",
id: 'cohere-command-r-plus-04-2024',
internalID: 'command-r-plus-04-2024',
provider: LLMProvider.Cohere,
format: LLMFormat.Cohere,
flags: [],
},
{
name: "Clio",
id: 'novelai',
provider: LLMProvider.NovelAI,
format: LLMFormat.NovelAI,
flags: [],
recommended: true
},
{
name: "Kayra",
id: 'novelai_kayra',
provider: LLMProvider.NovelAI,
format: LLMFormat.NovelAI,
flags: [],
recommended: true
},
{
id: 'ollama-hosted',
name: 'Ollama',
provider: LLMProvider.AsIs,
format: LLMFormat.Ollama,
flags: [],
},
{
id: 'hf:::Xenova/opt-350m',
name: 'opt-350m',
provider: LLMProvider.WebLLM,
format: LLMFormat.WebLLM,
flags: [],
},
{
id: 'hf:::Xenova/tiny-random-mistral',
name: 'tiny-random-mistral',
provider: LLMProvider.WebLLM,
format: LLMFormat.WebLLM,
flags: [],
},
{
id: 'hf:::Xenova/gpt2-large-conversational',
name: 'gpt2-large-conversational',
provider: LLMProvider.WebLLM,
format: LLMFormat.WebLLM,
flags: [],
},
{
id: 'custom',
name: "Plugin",
provider: LLMProvider.AsIs,
format: LLMFormat.Plugin,
flags: [],
recommended: true
},
{
id: 'reverse_proxy',
name: "Custom API",
provider: LLMProvider.AsIs,
format: LLMFormat.OpenAICompatible,
flags: [],
recommended: true
} }
] ]
for(let model of LLMModels){
model.shortName ??= model.name
model.internalID ??= model.id
model.fullName ??= model.provider !== LLMProvider.AsIs ? `${ProviderNames.get(model.provider) ?? ''} ${model.name}`.trim() : model.name
}
export function getModelInfo(id: string): LLMModel{
const found = LLMModels.find(model => model.id === id) ?? {
id,
name: id,
provider: LLMProvider.AsIs,
format: LLMFormat.OpenAICompatible,
flags: [],
}
if(found) return found
if(id.startsWith('hf:::')){
const withoutPrefix = id.replace('hf:::', '')
return {
id,
name: withoutPrefix,
shortName: withoutPrefix,
fullName: withoutPrefix,
internalID: withoutPrefix,
provider: LLMProvider.WebLLM,
format: LLMFormat.WebLLM,
flags: [],
}
}
if(id.startsWith('horde:::')){
const withoutPrefix = id.replace('horde:::', '')
return {
id,
name: withoutPrefix,
shortName: withoutPrefix,
fullName: withoutPrefix,
internalID: withoutPrefix,
provider: LLMProvider.Horde,
format: LLMFormat.Horde,
flags: [],
}
}
return {
id,
name: id,
shortName: id,
fullName: id,
internalID: id,
provider: LLMProvider.AsIs,
format: LLMFormat.OpenAICompatible,
flags: [],
}
}
interface GetModelListGroup {
providerName: string
models: LLMModel[]
}
export function getModelList<T extends boolean>(arg:{
recommendedOnly?:boolean,
groupedByProvider?:T
} = {}): T extends true ? GetModelListGroup[] : LLMModel[]{
let models = LLMModels
if(arg.recommendedOnly){
models = models.filter(model => model.recommended)
}
if(arg.groupedByProvider){
let group: GetModelListGroup[] = []
for(let model of models){
if(model.provider === LLMProvider.AsIs){
group.push({
providerName: '@as-is',
models: [model]
})
continue
}
let providerName = ProviderNames.get(model.provider) || 'Unknown'
let groupIndex = group.findIndex(g => g.providerName === providerName)
if(groupIndex === -1){
group.push({
providerName,
models: [model]
})
}else{
group[groupIndex].models.push(model)
}
}
return group as any
}
return models as any
}

View File

@@ -1,204 +0,0 @@
export function getModelName(name:string){
switch(name){
case "gpt35":
return "GPT-3.5 Turbo"
case "gpt35_0613":
return "GPT-3.5 Turbo 0613"
case "gpt35_0301":
return "GPT-3.5 Turbo 0301"
case "gpt35_16k":
return "GPT-3.5 Turbo 16k"
case "gpt35_16k_0613":
return "GPT-3.5 Turbo 16k 0613"
case 'instructgpt35':
return 'GPT-3.5 Turbo Instruct'
case "gpt4":
return "GPT-4"
case "gpt4_0301":
return "GPT-4 0301"
case "gpt4_32k":
return "GPT-4 32k"
case "gpt4_0613":
return "GPT-4 0613"
case "gpt4_32k_0613":
return "GPT-4 32k 0613"
case "gpt4_1106":
return "GPT-4 Turbo 1106"
case 'gpt45':
return 'GPT-4.5'
case "gpt35_1106":
return "GPT-3.5 Turbo 1106"
case 'local_gptq':
return 'Local Model GPTQ'
case "palm2":
return "PaLM2 Bison"
case "textgen_webui":
return "Oobabooga Legacy"
case 'ooba':
return 'Oobabooga'
case "mancer":
return "Mancer"
case "kobold":
return "Kobold"
case "custom":
return "Plugin"
case "novelai":
return "NovelAI Clio"
case "novelai_kayra":
return "NovelAI Kayra"
case "novellist":
return "NovelList SuperTrin"
case "novellist damsel":
return "NovelList Damsel"
case 'reverse_proxy':
return "Custom (OpenAI-compatible)"
case 'openrouter':
return "OpenRouter"
case 'gptvi4_1106':
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"
case 'gemini-pro':
return "Gemini Pro"
case 'horde:::auto':
return 'Horde Auto Model'
case 'gpt4_0125':
return 'GPT-4 Turbo 0125'
case 'gpt35_0125':
return 'GPT-3.5 Turbo 0125'
case 'gemini-ultra':
return 'Gemini Ultra'
case 'gemini-ultra-vision':
return 'Gemini Ultra Vision'
case 'claude-3-opus-20240229':
return 'Claude 3 Opus (20240229)'
case 'claude-3-5-sonnet-20240620':
return 'Claude 3.5 Sonnet (20240620)'
case 'claude-3-5-sonnet-20241022':
return 'Claude 3.5 Sonnet (20241022)'
case 'claude-3-sonnet-20240229':
return 'Claude 3 Sonnet (20240229)'
case 'mistral-large-latest':
return 'Mistral Large'
case 'mistral-small-latest':
return 'Mistral Small'
case 'mistral-medium-latest':
return 'Mistral Medium'
case 'claude-3-haiku-20240307':
return 'Claude 3 Haiku (20240307)'
case 'gpt4_turbo':
return 'GPT-4 Turbo'
case 'gpt4_turbo_20240409':
return 'GPT-4 Turbo (20240409)'
case 'gpt4o':
return 'GPT-4o'
case 'gpt4o-2024-05-13':
return 'GPT-4o (2024-05-13)'
case 'gpt4o-2024-08-06':
return 'GPT-4o (2024-08-06)'
case 'gpt4o-2024-11-20':
return 'GPT-4o (2024-11-20)'
case 'gpt4o-chatgpt':
return 'GPT-4o ChatGPT'
case 'gpt4om':
return 'GPT-4o Mini'
case 'gpt4o1-preview':
return 'o1 Preview'
case 'gpt4o1-mini':
return 'o1 Mini'
case 'gpt4om-2024-07-18':
return 'GPT-4o Mini (2024-07-18)'
case 'gemini-1.5-pro-latest':
return 'Gemini 1.5 Pro'
case 'gemini-1.5-pro-exp-0801':
return 'Gemini 1.5 Pro Exp (0801)'
case 'gemini-1.5-pro-exp-0827':
return 'Gemini 1.5 Pro Exp (0827)'
case 'gemini-1.5-flash':
return 'Gemini 1.5 Flash'
case 'ollama-hosted':
return 'Ollama'
case 'cohere-command-r':
return 'Cohere Command-R'
case 'cohere-command-r-plus':
return 'Cohere Command-R Plus'
default:
if(name.startsWith("horde:::")){
const split = name.split(":::")
return `Horde ${split[1]}`
}
if(name.startsWith('tf:::')){
const split = name.split(":::")
return `${split[1]}`
}
if(name.startsWith('local_')){
const realName = name.replace('local_', '').split(/(\\|\/)/g).at(-1)
return `GGUF ${realName}`
}
return name
}
}
export function getModelShortName(model:string){
if(model.startsWith("gpt35")){
return "GPT-3.5"
}
if(model.startsWith("cohere-")){
return model.replace("cohere-", "")
}
if(model.startsWith('gpt4om')){
return "GPT-4o Mini"
}
if(model.startsWith("gpt4o")){
return "GPT-4o"
}
if(model.startsWith("gpt4")){
return "GPT-4"
}
if(model.startsWith("gptvi4")){
return "GPT-4V"
}
if(model.startsWith("mistral")){
return getModelName(model).split(" ").at(-1)
}
if(model.startsWith("mancer")){
return "Mancer"
}
if(model.startsWith('tf:::')){
const split = model.split(":::")
return split[1]
}
if(model.startsWith('local_')){
const realName = model.replace('local_', '').split(/(\\|\/)/g).at(-1)
return realName
}
if(model.startsWith('horde:::')){
const split = model.split(":::")
return split[1]
}
if(model.startsWith('claude-3')){
const split = model.split("-")
if(!isNaN(parseInt(split[split.length-1]))){
return split[split.length-2]
}
else{
return split[split.length-1]
}
}
if(model.startsWith('reverse_proxy')){
return 'Custom'
}
if(model.startsWith('oaicomp')){
return 'Custom'
}
return getModelName(model)
}

File diff suppressed because it is too large Load Diff

View File

@@ -721,6 +721,8 @@ export interface Database{
google: { google: {
accessToken: string accessToken: string
projectId: string projectId: string
privateKey: string
clientEmail: string
} }
mistralKey?:string mistralKey?:string
chainOfThought?:boolean chainOfThought?:boolean