From 71d97688091e1a36f1f91e708c1cd5eaf8f447b9 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Tue, 5 Mar 2024 01:40:05 +0900 Subject: [PATCH] Add Claude 3 Formating --- src/lib/Setting/Pages/BotSettings.svelte | 8 +- src/ts/process/request.ts | 135 ++++++++++++++++++++++- 2 files changed, 140 insertions(+), 3 deletions(-) diff --git a/src/lib/Setting/Pages/BotSettings.svelte b/src/lib/Setting/Pages/BotSettings.svelte index addf51ac..90998860 100644 --- a/src/lib/Setting/Pages/BotSettings.svelte +++ b/src/lib/Setting/Pages/BotSettings.svelte @@ -147,7 +147,11 @@ Mancer {language.apiKey} {/if} -{#if $DataBase.aiModel.startsWith('claude') || $DataBase.subModel.startsWith('claude')} +{#if $DataBase.aiModel.startsWith('claude-3') || $DataBase.subModel.startsWith('claude-3')} + Claude {language.apiKey} + +{/if} +{#if $DataBase.aiModel.startsWith('claude-1') || $DataBase.subModel.startsWith('claude-1') || $DataBase.subModel.startsWith('claude-2') || $DataBase.subModel.startsWith('claude-2')} Claude {language.apiKey} {#if $DataBase.useExperimental} @@ -332,7 +336,7 @@ {/if} {($DataBase.temperature / 100).toFixed(2)} -{#if $DataBase.aiModel.startsWith('openrouter')} +{#if $DataBase.aiModel.startsWith('openrouter') || $DataBase.aiModel.startsWith('claude-3')} Top K {($DataBase.top_k).toFixed(0)} diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 0977dcfc..78f4a312 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -1401,7 +1401,140 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' } } default:{ - if(raiModel.startsWith('claude')){ + if(raiModel.startsWith('claude-3')){ + let replacerURL = (aiModel === 'reverse_proxy') ? (db.forceReplaceUrl) : ('https://api.anthropic.com/v1/messages') + let apiKey = (aiModel === 'reverse_proxy') ? db.proxyKey : db.claudeAPIKey + if(aiModel === 'reverse_proxy' && db.autofillRequestUrl){ + if(replacerURL.endsWith('v1')){ + replacerURL += '/messages' + } + else if(replacerURL.endsWith('v1/')){ + replacerURL += 'messages' + } + else if(!(replacerURL.endsWith('messages') || replacerURL.endsWith('messages/'))){ + if(replacerURL.endsWith('/')){ + replacerURL += 'v1/messages' + } + else{ + replacerURL += '/v1/messages' + } + } + } + + interface Claude3Chat { + role: 'user'|'assistant' + content: string + } + + let claudeChat: Claude3Chat[] = [] + let systemPrompt:string = '' + + const addClaudeChat = (chat:Claude3Chat) => { + if(claudeChat.length > 0 && claudeChat[claudeChat.length-1].role === chat.role){ + claudeChat[claudeChat.length-1].content += "\n\n" + chat.content + } + else{ + claudeChat.push(chat) + } + } + + for(const chat of formated){ + switch(chat.role){ + case 'user':{ + addClaudeChat({ + role: 'user', + content: chat.content + }) + break + } + case 'assistant':{ + addClaudeChat({ + role: 'assistant', + content: chat.content + }) + break + } + case 'system':{ + if(claudeChat.length === 0){ + systemPrompt = chat.content + } + else{ + addClaudeChat({ + role: 'user', + content: "System: " + chat.content + }) + } + break + } + case 'function':{ + //ignore function for now + break + } + } + } + + if(claudeChat.length === 0 && systemPrompt === ''){ + return { + type: 'fail', + result: 'No input' + } + } + if(claudeChat.length === 0 && systemPrompt !== ''){ + claudeChat.push({ + role: 'user', + content: systemPrompt + }) + systemPrompt = '' + } + if(claudeChat[0].role !== 'user'){ + claudeChat.unshift({ + role: 'user', + content: 'Start' + }) + } + console.log(claudeChat, formated) + let body = { + model: raiModel, + messages: claudeChat, + system: systemPrompt, + max_tokens: maxTokens, + temperature: temperature, + top_p: db.top_p, + top_k: db.top_k, + } + + if(systemPrompt === ''){ + delete body.system + } + + + + const res = await globalFetch(replacerURL, { + body: body, + headers: { + "Content-Type": "application/json", + "x-api-key": apiKey, + "anthropic-version": "2023-06-01", + "accept": "application/json" + }, + method: "POST" + }) + + if(!res.ok){ + return { + type: 'fail', + result: JSON.stringify(res.data) + } + } + if(res.data.error){ + return { + type: 'fail', + result: JSON.stringify(res.data.error) + } + } + return res.data.content[0].text + } + else if(raiModel.startsWith('claude')){ let replacerURL = (aiModel === 'reverse_proxy') ? (db.forceReplaceUrl) : ('https://api.anthropic.com/v1/complete') let apiKey = (aiModel === 'reverse_proxy') ? db.proxyKey : db.claudeAPIKey