[feat] add deepai

This commit is contained in:
kwaroran
2023-06-22 20:36:06 +09:00
parent 2bc96514fc
commit 839b288168
6 changed files with 151 additions and 15 deletions

View File

@@ -19,6 +19,7 @@
"@msgpack/msgpack": "3.0.0-beta2", "@msgpack/msgpack": "3.0.0-beta2",
"@tauri-apps/api": "1.3.0", "@tauri-apps/api": "1.3.0",
"@xenova/transformers": "^2.1.1", "@xenova/transformers": "^2.1.1",
"blueimp-md5": "^2.19.0",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"core-js": "^3.30.2", "core-js": "^3.30.2",
@@ -50,6 +51,7 @@
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"@tauri-apps/cli": "1.3.1", "@tauri-apps/cli": "1.3.1",
"@tsconfig/svelte": "^3.0.0", "@tsconfig/svelte": "^3.0.0",
"@types/blueimp-md5": "^2.18.0",
"@types/dompurify": "^3.0.1", "@types/dompurify": "^3.0.1",
"@types/lodash": "^4.14.194", "@types/lodash": "^4.14.194",
"@types/lodash.clonedeep": "^4.5.7", "@types/lodash.clonedeep": "^4.5.7",

14
pnpm-lock.yaml generated
View File

@@ -16,6 +16,9 @@ dependencies:
'@xenova/transformers': '@xenova/transformers':
specifier: ^2.1.1 specifier: ^2.1.1
version: 2.1.1 version: 2.1.1
blueimp-md5:
specifier: ^2.19.0
version: 2.19.0
body-parser: body-parser:
specifier: ^1.20.2 specifier: ^1.20.2
version: 1.20.2 version: 1.20.2
@@ -105,6 +108,9 @@ devDependencies:
'@tsconfig/svelte': '@tsconfig/svelte':
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.0.0 version: 3.0.0
'@types/blueimp-md5':
specifier: ^2.18.0
version: 2.18.0
'@types/dompurify': '@types/dompurify':
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
@@ -731,6 +737,10 @@ packages:
resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==} resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==}
dev: true dev: true
/@types/blueimp-md5@2.18.0:
resolution: {integrity: sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==}
dev: true
/@types/dompurify@3.0.1: /@types/dompurify@3.0.1:
resolution: {integrity: sha512-ubq8VKmf8W+U48jUOiZO4BoSGS7NnbITPMvrF+7HgMN4L+eezCKv8QBPB8p3o4YPicLMmNeTyDkE5X4c2ViHJQ==} resolution: {integrity: sha512-ubq8VKmf8W+U48jUOiZO4BoSGS7NnbITPMvrF+7HgMN4L+eezCKv8QBPB8p3o4YPicLMmNeTyDkE5X4c2ViHJQ==}
dependencies: dependencies:
@@ -912,6 +922,10 @@ packages:
readable-stream: 3.6.2 readable-stream: 3.6.2
dev: false dev: false
/blueimp-md5@2.19.0:
resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==}
dev: false
/body-parser@1.20.1: /body-parser@1.20.1:
resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}

40
src/ts/process/deepai.ts Normal file
View File

@@ -0,0 +1,40 @@
import md5 from "blueimp-md5";
import { globalFetch } from "../storage/globalApi";
import type { OpenAIChat } from ".";
function randomBytes(size: number): Uint8Array {
const array = new Uint8Array(size);
return crypto.getRandomValues(array);
}
export async function createDeep(messages: OpenAIChat[]) {
const userAgent = navigator.userAgent;
const part1 = Math.floor(Math.random() * Math.pow(10, 11)).toString();
const md5Text = (text: string): string => {
return md5(text).split('').reverse().join('');
}
const part2 = md5Text(userAgent + md5Text(userAgent + md5Text(userAgent + part1 + "x")));
const apiKey = `tryit-${part1}-${part2}`;
const headers = {
"api-key": apiKey,
"user-agent": userAgent
};
const body = new URLSearchParams();
body.append("chat_style", "chat");
console.log(messages);
body.append("chatHistory", JSON.stringify(messages));
const response = await globalFetch("https://api.deepai.org/chat_response", {
method: 'POST',
headers: headers,
body: body,
rawResponse: true
});
return response;
}

View File

@@ -139,6 +139,11 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
maxContextTokens = 8000 maxContextTokens = 8000
} }
} }
if(db.aiModel === 'deepai'){
if(maxContextTokens > 3000){
maxContextTokens = 3000
}
}
let unformated = { let unformated = {

View File

@@ -6,6 +6,7 @@ import { language } from "../../lang";
import { stringlizeChat, unstringlizeChat } from "./stringlize"; import { stringlizeChat, unstringlizeChat } from "./stringlize";
import { globalFetch, isTauri } from "../storage/globalApi"; import { globalFetch, isTauri } from "../storage/globalApi";
import { sleep } from "../util"; import { sleep } from "../util";
import { createDeep } from "./deepai";
interface requestDataArgument{ interface requestDataArgument{
formated: OpenAIChat[] formated: OpenAIChat[]
@@ -579,6 +580,40 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
'result': unstringlizeChat(result, formated, currentChar?.name ?? '') 'result': unstringlizeChat(result, formated, currentChar?.name ?? '')
} }
} }
case "deepai":{
for(let i=0;i<formated.length;i++){
delete formated[i].memo
delete formated[i].name
if(arg.isGroupChat && formated[i].name && formated[i].role === 'assistant'){
formated[i].content = formated[i].name + ": " + formated[i].content
}
if(formated[i].role !== 'assistant' && formated[i].role !== 'user'){
formated[i].content = formated[i].role + ": " + formated[i].content
formated[i].role = 'assistant'
}
formated[i].name = undefined
}
const response = await createDeep([{
role: 'user',
content: stringlizeChat(formated, currentChar?.name ?? '')
}])
if(!response.ok){
return {
type: 'fail',
result: response.data
}
}
const result = Buffer.from(response.data).toString('utf-8')
return {
'type': 'success',
'result': result
}
}
default:{ default:{
if(aiModel.startsWith('claude')){ if(aiModel.startsWith('claude')){
for(let i=0;i<formated.length;i++){ for(let i=0;i<formated.length;i++){

View File

@@ -498,8 +498,17 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
if(db.requester === 'new'){ if(db.requester === 'new'){
try { try {
let preHeader = arg.headers ?? {} let preHeader = arg.headers ?? {}
preHeader["Content-Type"] = `application/json` let body:any
const body = JSON.stringify(arg.body) if(arg.body instanceof URLSearchParams){
const argBody = arg.body as URLSearchParams
body = argBody.toString()
preHeader["Content-Type"] = `application/x-www-form-urlencoded`
}
else{
body = JSON.stringify(arg.body)
preHeader["Content-Type"] = `application/json`
}
console.log(body)
const header = JSON.stringify(preHeader) const header = JSON.stringify(preHeader)
const res:string = await invoke('native_request', {url:url, body:body, header:header, method: method}) const res:string = await invoke('native_request', {url:url, body:body, header:header, method: method})
const d:{ const d:{
@@ -576,15 +585,27 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
} }
else{ else{
try { try {
let headers = arg.headers ?? {} let body:any
if(!headers["Content-Type"]){ if(arg.body instanceof URLSearchParams){
headers["Content-Type"] = `application/json` const argBody = arg.body as URLSearchParams
body = argBody.toString()
let headers = arg.headers ?? {}
if(!headers["Content-Type"]){
headers["Content-Type"] = `application/x-www-form-urlencoded`
}
}
else{
body = JSON.stringify(arg.body)
let headers = arg.headers ?? {}
if(!headers["Content-Type"]){
headers["Content-Type"] = `application/json`
}
} }
if(arg.rawResponse){ if(arg.rawResponse){
const furl = `/proxy?url=${encodeURIComponent(url)}` const furl = `/proxy?url=${encodeURIComponent(url)}`
const da = await fetch(furl, { const da = await fetch(furl, {
body: JSON.stringify(arg.body), body: body,
headers: { headers: {
"risu-header": encodeURIComponent(JSON.stringify(arg.headers)), "risu-header": encodeURIComponent(JSON.stringify(arg.headers)),
"Content-Type": "application/json" "Content-Type": "application/json"
@@ -604,20 +625,29 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
const furl = `/proxy?url=${encodeURIComponent(url)}` const furl = `/proxy?url=${encodeURIComponent(url)}`
const da = await fetch(furl, { const da = await fetch(furl, {
body: JSON.stringify(arg.body), body: body,
headers: { headers: {
"risu-header": encodeURIComponent(JSON.stringify(arg.headers)), "risu-header": encodeURIComponent(JSON.stringify(arg.headers)),
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
method: method method: method
}) })
const daText = await da.text()
const dat = await da.json() try {
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300) const dat = JSON.parse(daText)
return { addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
ok: da.ok && da.status >= 200 && da.status < 300, return {
data: dat, ok: da.ok && da.status >= 200 && da.status < 300,
headers: Object.fromEntries(da.headers) data: dat,
headers: Object.fromEntries(da.headers)
}
} catch (error) {
addFetchLog(daText, false)
return {
ok:false,
data: daText,
headers: Object.fromEntries(da.headers)
}
} }
} }
} catch (error) { } catch (error) {
@@ -853,4 +883,14 @@ export function openURL(url:string){
else{ else{
window.open(url, "_blank") window.open(url, "_blank")
} }
} }
function formDataToString(formData: FormData): string {
const params: string[] = [];
for (const [name, value] of formData.entries()) {
params.push(`${encodeURIComponent(name)}=${encodeURIComponent(value.toString())}`);
}
return params.join('&');
}