{language.chatBot}
{#if submenu !== -1}
{ submenu = 0 }} class="p-2 flex-1 border-r border-darkborderc" class:bg-darkbutton={submenu === 0}>
{language.model}
{ submenu = 1 }} class="p2 flex-1 border-r border-darkborderc" class:bg-darkbutton={submenu === 1}>
{language.parameters}
{ submenu = 2 }} class="p-2 flex-1 border-r border-darkborderc" class:bg-darkbutton={submenu === 2}>
{language.prompt}
{ submenu = 3 }} class="p-2 flex-1" class:bg-darkbutton={submenu === 3}>
{language.others}
{/if} {#if submenu === 0 || submenu === -1}
{language.model}
{language.submodel}
{#if modelInfo.provider === LLMProvider.GoogleCloud || subModelInfo.provider === LLMProvider.GoogleCloud}
GoogleAI API Key
{/if} {#if modelInfo.provider === LLMProvider.VertexAI || subModelInfo.provider === LLMProvider.VertexAI}
Vertex Client Email
Vertex Private Key
{/if} {#if modelInfo.provider === LLMProvider.AI21 || subModelInfo.provider === LLMProvider.AI21}
AI21 {language.apiKey}
{/if} {#if modelInfo.provider === LLMProvider.NovelList || subModelInfo.provider === LLMProvider.NovelList}
NovelList {language.apiKey}
{/if} {#if DBState.db.aiModel.startsWith('mancer') || DBState.db.subModel.startsWith('mancer')}
Mancer {language.apiKey}
{/if} {#if modelInfo.provider === LLMProvider.Anthropic || subModelInfo.provider === LLMProvider.Anthropic || modelInfo.provider === LLMProvider.AWS || subModelInfo.provider === LLMProvider.AWS }
Claude {language.apiKey}
{/if} {#if modelInfo.provider === LLMProvider.Mistral || subModelInfo.provider === LLMProvider.Mistral}
Mistral {language.apiKey}
{/if} {#if modelInfo.provider === LLMProvider.NovelAI || subModelInfo.provider === LLMProvider.NovelAI}
NovelAI Bearer Token
{/if} {#if DBState.db.aiModel === 'reverse_proxy' || DBState.db.subModel === 'reverse_proxy'}
URL
{language.proxyAPIKey}
{language.proxyRequestModel}
{language.format}
{ DBState.db.customAPIFormat = parseInt(e.currentTarget.value) }}>
OpenAI Compatible
Anthropic Claude
Mistral
Google Cloud
Cohere
{/if} {#if modelInfo.provider === LLMProvider.Cohere || subModelInfo.provider === LLMProvider.Cohere}
Cohere {language.apiKey}
{/if} {#if DBState.db.aiModel === 'ollama-hosted'}
Ollama URL
Ollama Model
{/if} {#if DBState.db.aiModel === 'openrouter' || DBState.db.subModel === 'openrouter'}
Openrouter Key
Openrouter Model
{#await openRouterModels()}
Loading..
{:then m}
{#if (!m) || (m.length === 0)}
GPT 3.5
GPT 3.5 16k
GPT-4
GPT-4 32k
Claude 2
Claude Instant v1
Claude Instant v1 100k
Claude v1
Claude v1 100k
Claude v1.2
{:else}
Free Auto
Openrouter Auto
{#each m as model}
{model.name}
{/each} {/if}
{/await} {/if} {#if DBState.db.aiModel === 'openrouter' || DBState.db.aiModel === 'reverse_proxy'}
{language.tokenizer}
{#each tokenizerList as entry}
{entry[1]}
{/each}
{/if} {#if modelInfo.provider === LLMProvider.OpenAI || subModelInfo.provider === LLMProvider.OpenAI}
OpenAI {language.apiKey}
{/if} {#if modelInfo.keyIdentifier}
{modelInfo.name} {language.apiKey}
{/if} {#if subModelInfo.keyIdentifier && subModelInfo.keyIdentifier !== modelInfo.keyIdentifier}
{subModelInfo.name} {language.apiKey}
{/if}
{#if modelInfo.flags.includes(LLMFlags.hasStreaming) || subModelInfo.flags.includes(LLMFlags.hasStreaming)}
{/if} {#if DBState.db.aiModel === 'reverse_proxy' || DBState.db.subModel === 'reverse_proxy'}
{/if} {#if modelInfo.provider === LLMProvider.NovelAI || subModelInfo.provider === LLMProvider.NovelAI}
{/if}
{#if DBState.db.aiModel === 'custom' || DBState.db.subModel === 'custom'}
{language.plugin}
None
{#each $customProviderStore as plugin}
{plugin}
{/each}
{/if} {#if DBState.db.aiModel === "kobold" || DBState.db.subModel === "kobold"}
Kobold URL
{/if} {#if DBState.db.aiModel.startsWith("horde") || DBState.db.subModel.startsWith("horde") }
Horde {language.apiKey}
{/if} {#if DBState.db.aiModel === 'textgen_webui' || DBState.db.subModel === 'textgen_webui' || DBState.db.aiModel === 'mancer' || DBState.db.subModel === 'mancer'}
Blocking {language.providerURL}
You must use textgen webui with --public-api
Stream {language.providerURL}
{#if !isTauri}
You are using web version. you must use ngrok or other tunnels to use your local webui.
{/if}
Warning: For Ooba version over 1.7, use "Ooba" as model, and use url like http://127.0.0.1:5000/v1/chat/completions
{/if} {#if DBState.db.aiModel === 'ooba' || DBState.db.subModel === 'ooba'}
Ooba {language.providerURL}
{/if} {#if DBState.db.aiModel.startsWith("horde") || DBState.db.aiModel === 'kobold' }
{/if} {/if} {#if submenu === 1 || submenu === -1}
{language.maxContextSize}
{language.maxResponseSize}
{#if DBState.db.aiModel.startsWith('gpt') || DBState.db.aiModel === 'reverse_proxy' || DBState.db.aiModel === 'openrouter'}
{language.seed}
{/if} {#if modelInfo.parameters.includes('thinking_tokens')}
{language.thinkingTokens}
{/if}
{language.temperature}
{#if modelInfo.parameters.includes('top_k')}
Top K
{/if} {#if modelInfo.parameters.includes('min_p')}
Min P
{/if} {#if modelInfo.parameters.includes('top_a')}
Top A
{/if} {#if modelInfo.parameters.includes('repetition_penalty')}
Repetition penalty
{/if} {#if modelInfo.parameters.includes('reasoning_effort')}
Reasoning Effort
{/if} {#if DBState.db.aiModel === 'textgen_webui' || DBState.db.aiModel === 'mancer' || DBState.db.aiModel.startsWith('local_') || DBState.db.aiModel.startsWith('hf:::')}
Repetition Penalty
Length Penalty
Top K
Top P
Typical P
Top A
No Repeat n-gram Size
{ if(!DBState.db.localStopStrings){ DBState.db.localStopStrings = [] } else{ DBState.db.localStopStrings = null } }} />
{#if DBState.db.localStopStrings}
{ let localStopStrings = DBState.db.localStopStrings localStopStrings.push('') DBState.db.localStopStrings = localStopStrings }}>
{#each DBState.db.localStopStrings as stopString, i}
{ let localStopStrings = DBState.db.localStopStrings localStopStrings.splice(i, 1) DBState.db.localStopStrings = localStopStrings }}>
{/each}
{/if}
{:else if modelInfo.format === LLMFormat.NovelAI}
Starter
Seperator
Top P
Top K
Top A
Tailfree Sampling
Typical P
Repetition Penalty
Repetition Penalty Range
Repetition Penalty Slope
Frequency Penalty
Presence Penalty
Mirostat LR
Mirostat Tau
Cfg Scale
{:else if modelInfo.format === LLMFormat.NovelList}
Top P
Reputation Penalty
Reputation Penalty Range
Reputation Penalty Slope
Top K
Top A
Typical P
{:else} {#if modelInfo.parameters.includes('top_p')}
Top P
{/if} {#if modelInfo.parameters.includes('frequency_penalty')}
{language.frequencyPenalty}
{/if} {#if modelInfo.parameters.includes('presence_penalty')}
{language.presensePenalty}
{/if} {/if} {#if (DBState.db.reverseProxyOobaMode && DBState.db.aiModel === 'reverse_proxy') || (DBState.db.aiModel === 'ooba')}
{/if} {#if DBState.db.aiModel.startsWith('openrouter')}
{/if}
{#if DBState.db.seperateParametersEnabled} {#each Object.keys(DBState.db.seperateParameters) as param, i}
{language.temperature}
Top K
Repetition penalty
Min P
Top A
Top P
Frequency Penalty
Presence Penalty
{language.thinkingTokens}
{/each} {/if}
{/if} {#if submenu === 3 || submenu === -1}
Bias
{language.value}
{ let bia = DBState.db.bias bia.push(['', 0]) DBState.db.bias = bia }}>
{#if DBState.db.bias.length === 0}
{language.noBias}
{/if} {#each DBState.db.bias as bias, i}
{ let bia = DBState.db.bias bia.splice(i, 1) DBState.db.bias = bia }}>
{/each}
{ const data = JSON.stringify(DBState.db.bias, null, 2) downloadFile('bias.json', data) }}>
{ const sel = await selectSingleFile(['json']) const utf8 = new TextDecoder().decode(sel.data) if(Array.isArray(JSON.parse(utf8))){ DBState.db.bias = JSON.parse(utf8) } }}>
{#if DBState.db.aiModel === 'reverse_proxy'}
{language.key}
{language.value}
{ let additionalParams = DBState.db.additionalParams additionalParams.push(['', '']) DBState.db.additionalParams = additionalParams }}>
{#if DBState.db.bias.length === 0}
{language.noData}
{/if} {#each DBState.db.additionalParams as additionalParams, i}
{ let additionalParams = DBState.db.additionalParams additionalParams.splice(i, 1) DBState.db.additionalParams = additionalParams }}>
{/each}
{/if}
{#if DBState.db.promptTemplate} {#if submenu !== -1}
{/if} {:else}
{ DBState.db.promptTemplate = [] }}/> {/if}
{#snippet CustomFlagButton(name:string,flag:number)}
{ if(DBState.db.customFlags.includes(flag)){ DBState.db.customFlags = DBState.db.customFlags.filter((f) => f !== flag) } else{ DBState.db.customFlags.push(flag) } }} styled={DBState.db.customFlags.includes(flag) ? 'primary' : 'outlined'}> {name}
{/snippet}
{#if DBState.db.enableCustomFlags} {@render CustomFlagButton('hasImageInput', 0)} {@render CustomFlagButton('hasImageOutput', 1)} {@render CustomFlagButton('hasAudioInput', 2)} {@render CustomFlagButton('hasAudioOutput', 3)} {@render CustomFlagButton('hasPrefill', 4)} {@render CustomFlagButton('hasCache', 5)} {@render CustomFlagButton('hasFullSystemPrompt', 6)} {@render CustomFlagButton('hasFirstSystemPrompt', 7)} {@render CustomFlagButton('hasStreaming', 8)} {@render CustomFlagButton('requiresAlternateRole', 9)} {@render CustomFlagButton('mustStartWithUserInput', 10)} {@render CustomFlagButton('hasVideoInput', 12)} {@render CustomFlagButton('OAICompletionTokens', 13)} {@render CustomFlagButton('DeveloperRole', 14)} {@render CustomFlagButton('geminiThinking', 15)} {@render CustomFlagButton('geminiBlockOff', 16)} {@render CustomFlagButton('deepSeekPrefix', 17)} {@render CustomFlagButton('deepSeekThinkingInput', 18)} {@render CustomFlagButton('deepSeekThinkingOutput', 19)} {/if}
{ if(DBState.db.modelTools.includes('search')){ DBState.db.modelTools = DBState.db.modelTools.filter((tool) => tool !== 'search') } else{ DBState.db.modelTools.push('search') } }} />
{language.preview}
{#if DBState.db.botPresets[DBState.db.botPresetsId]?.image}
{DBState.db.botPresets[DBState.db.botPresetsId]?.name}
{:else}
{language.noImages}
{/if}
{ const sel = await selectSingleFile(['png', 'jpg', 'jpeg', 'webp']) const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d') const img = new Image() const blob = new Blob([sel.data], {type: "image/png"}) img.src = URL.createObjectURL(blob) await img.decode() canvas.width = 48 canvas.height = 48 ctx.drawImage(img, 0, 0, 48, 48) const data = canvas.toDataURL('image/jpeg', 0.7) DBState.db.botPresets[DBState.db.botPresetsId].image = data //Since its small (max 2304 pixels), its okay to store it directly }}>
{#if submenu !== -1}
{$openPresetList = true}} className="mt-4">{language.presets}
{/if} {/if} {#if submenu === 2 || submenu === -1} {#if !DBState.db.promptTemplate}
{language.mainPrompt}
{tokens.mainPrompt} {language.tokens}
{language.jailbreakPrompt}
{tokens.jailbreak} {language.tokens}
{language.globalNote}
{tokens.globalNote} {language.tokens}
{language.formatingOrder}
{:else if submenu === 2}
{/if} {/if} {#if DBState.db.promptTemplate && submenu === -1}
{language.promptTemplate}
{/if} {#if submenu === -1}
{$openPresetList = true}} className="mt-4">{language.presets}
{/if}