[feat] claude support
This commit is contained in:
@@ -79,6 +79,13 @@
|
||||
$DataBase.maxContext = 4000
|
||||
$DataBase.maxResponse = 500
|
||||
}
|
||||
else if(v.startsWith('claude')){
|
||||
$DataBase.maxContext = 7500
|
||||
$DataBase.maxResponse = 500
|
||||
if(v.endsWith('100k')){
|
||||
$DataBase.maxContext = 99500
|
||||
}
|
||||
}
|
||||
else{
|
||||
$DataBase.maxContext = 1500
|
||||
$DataBase.maxResponse = 200
|
||||
@@ -94,6 +101,11 @@
|
||||
<span class="text-neutral-200">Palm2 {language.apiKey}</span>
|
||||
<input class="text-neutral-200 mb-4 p-2 bg-transparent input-text focus:bg-selected text-sm" placeholder="..." bind:value={$DataBase.palmAPI}>
|
||||
{/if}
|
||||
|
||||
{#if $DataBase.aiModel.startsWith('claude') || $DataBase.subModel.startsWith('claude')}
|
||||
<span class="text-neutral-200">Claude {language.apiKey}</span>
|
||||
<input class="text-neutral-200 mb-4 p-2 bg-transparent input-text focus:bg-selected text-sm" placeholder="..." bind:value={$DataBase.claudeAPIKey}>
|
||||
{/if}
|
||||
{#if $DataBase.aiModel === 'gpt35' || $DataBase.aiModel === 'gpt4' || $DataBase.subModel === 'gpt4' || $DataBase.subModel === 'gpt35'|| $DataBase.aiModel === 'gpt4_32k' || $DataBase.subModel === 'gpt4_32k'}
|
||||
<span class="text-neutral-200">OpenAI {language.apiKey} <Help key="oaiapikey"/></span>
|
||||
<input class="text-neutral-200 p-2 bg-transparent input-text focus:bg-selected text-sm" placeholder="sk-XXXXXXXXXXXXXXXXXXXX" bind:value={$DataBase.openAIKey}>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
if(name.startsWith("horde:::")){
|
||||
return name.replace(":::", " ")
|
||||
}
|
||||
return ''
|
||||
return name
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,6 +55,12 @@
|
||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4')}}>GPT-4</button>
|
||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_32k')}}>GPT-4 32K</button>
|
||||
</Arcodion>
|
||||
<Arcodion name="Anthropic Claude">
|
||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('claude-v1')}}>claude-v1</button>
|
||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('claude-v1-100k')}}>claude-v1-100k</button>
|
||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('claude-instant-v1')}}>claude-instant-v1</button>
|
||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('claude-instant-v1-100k')}}>claude-instant-v1-100k</button>
|
||||
</Arcodion>
|
||||
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('textgen_webui')}}>Oobabooga WebUI</button>
|
||||
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('palm2')}}>Google PaLM2</button>
|
||||
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('kobold')}}>Kobold</button>
|
||||
|
||||
@@ -48,7 +48,8 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
|
||||
const db = get(DataBase)
|
||||
let result = ''
|
||||
let formated = arg.formated
|
||||
let maxTokens = db.maxResponse
|
||||
let maxTokens = arg.maxTokens ??db.maxResponse
|
||||
let temperature = arg.temperature ?? (db.temperature / 100)
|
||||
let bias = arg.bias
|
||||
let currentChar = arg.currentChar
|
||||
const replacer = model === 'model' ? db.forceReplaceUrl : db.forceReplaceUrl2
|
||||
@@ -70,7 +71,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
|
||||
model: aiModel === 'gpt35' ? 'gpt-3.5-turbo'
|
||||
: aiModel === 'gpt4' ? 'gpt-4' : 'gpt-4-32k',
|
||||
messages: formated,
|
||||
temperature: arg.temperature ?? (db.temperature / 100),
|
||||
temperature: temperature,
|
||||
max_tokens: arg.maxTokens ?? maxTokens,
|
||||
presence_penalty: arg.PresensePenalty ?? (db.PresensePenalty / 100),
|
||||
frequency_penalty: arg.frequencyPenalty ?? (db.frequencyPenalty / 100),
|
||||
@@ -460,6 +461,65 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
|
||||
}
|
||||
}
|
||||
default:{
|
||||
if(aiModel.startsWith('claude')){
|
||||
for(let i=0;i<formated.length;i++){
|
||||
if(arg.isGroupChat && formated[i].name){
|
||||
formated[i].content = formated[i].name + ": " + formated[i].content
|
||||
}
|
||||
formated[i].name = undefined
|
||||
}
|
||||
|
||||
|
||||
|
||||
let requestPrompt = formated.map((v) => {
|
||||
let prefix = ''
|
||||
switch (v.role){
|
||||
case "assistant":
|
||||
prefix = "\n\nAssistant: "
|
||||
break
|
||||
case "user":
|
||||
prefix = "\n\nHuman: "
|
||||
break
|
||||
case "system":
|
||||
prefix = "\n\nSystem: "
|
||||
break
|
||||
}
|
||||
return prefix + v.content
|
||||
}).join('') + '\n\nAssistant: '
|
||||
|
||||
console.log(requestPrompt)
|
||||
|
||||
const da = await globalFetch('https://api.anthropic.com/v1/complete', {
|
||||
method: "POST",
|
||||
body: {
|
||||
prompt : "\n\nHuman: " + requestPrompt,
|
||||
model: aiModel,
|
||||
max_tokens_to_sample: maxTokens,
|
||||
stop_sequences: ["\n\nHuman:", "\n\nSystem:", "\n\nAssistant:"],
|
||||
temperature: temperature,
|
||||
},
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"x-api-key": db.claudeAPIKey
|
||||
}
|
||||
})
|
||||
|
||||
if((!da.ok) || (da.data.error)){
|
||||
return {
|
||||
type: 'fail',
|
||||
result: `${JSON.stringify(da.data)}`
|
||||
}
|
||||
}
|
||||
|
||||
const res = da.data
|
||||
|
||||
console.log(res)
|
||||
return {
|
||||
type: "success",
|
||||
result: res.completion,
|
||||
}
|
||||
|
||||
}
|
||||
if(aiModel.startsWith("horde:::")){
|
||||
const proompt = stringlizeChat(formated, currentChar?.name ?? '')
|
||||
|
||||
|
||||
@@ -500,7 +500,8 @@ export interface Database{
|
||||
koboldURL:string
|
||||
advancedBotSettings:boolean
|
||||
useAutoSuggestions:boolean
|
||||
autoSuggestPrompt:string
|
||||
autoSuggestPrompt:string,
|
||||
claudeAPIKey:string
|
||||
}
|
||||
|
||||
interface hordeConfig{
|
||||
|
||||
Reference in New Issue
Block a user