[feat] added streaming

This commit is contained in:
kwaroran
2023-05-18 04:43:54 +09:00
parent ab16a526fa
commit 8de92e6cd3
12 changed files with 103 additions and 18 deletions

View File

@@ -7,7 +7,7 @@ import { cloneDeep } from 'lodash';
export const DataBase = writable({} as any as Database)
export const loadedStore = writable(false)
export let appVer = '1.10.1'
export let appVer = '1.11.0'
export function setDatabase(data:Database){

View File

@@ -328,7 +328,8 @@ export async function sendChat(chatProcessIndex = -1):Promise<boolean> {
const req = await requestChatData({
formated: formated,
bias: bias,
currentChar: currentChar
currentChar: currentChar,
useStreaming: true
}, 'model')
let result = ''
@@ -339,7 +340,23 @@ export async function sendChat(chatProcessIndex = -1):Promise<boolean> {
return false
}
else if(req.type === 'streaming'){
const reader = req.result.getReader()
const msgIndex = db.characters[selectedChar].chats[selectedChat].message.length
db.characters[selectedChar].chats[selectedChat].message.push({
role: 'char',
data: "",
saying: currentChar.chaId
})
while(true){
const readed = (await reader.read())
if(readed.value){
db.characters[selectedChar].chats[selectedChat].message[msgIndex].data =readed.value
setDatabase(db)
}
if(readed.done){
break
}
}
}
else{
const result2 = processScriptFull(currentChar, reformatContent(req.result), 'editoutput')

View File

@@ -13,7 +13,8 @@ interface requestDataArgument{
temperature?: number
maxTokens?:number
PresensePenalty?: number
frequencyPenalty?: number
frequencyPenalty?: number,
useStreaming?:boolean
}
type requestDataResponse = {
@@ -21,7 +22,7 @@ type requestDataResponse = {
result: string
}|{
type: "streaming",
result: ReadableStreamDefaultReader<Uint8Array>
result: ReadableStream<string>
}
export async function requestChatData(arg:requestDataArgument, model:'model'|'submodel'):Promise<requestDataResponse> {
@@ -60,6 +61,7 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
presence_penalty: arg.PresensePenalty ?? (db.PresensePenalty / 100),
frequency_penalty: arg.frequencyPenalty ?? (db.frequencyPenalty / 100),
logit_bias: bias,
stream: false
})
let replacerURL = replacer === '' ? 'https://api.openai.com/v1/chat/completions' : replacer
@@ -71,19 +73,59 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
replacerURL += 'chat/completions'
}
if(db.useStreaming){
if(db.useStreaming && arg.useStreaming){
body.stream = true
const da = await fetch(replacerURL, {
body: JSON.stringify(body),
method: "POST",
headers: {
"Authorization": "Bearer " + db.openAIKey
"Authorization": "Bearer " + db.openAIKey,
"Content-Type": "application/json"
},
})
const reader = da.body.getReader()
if(da.status !== 200){
return {
type: "fail",
result: await da.text()
}
}
let dataUint = new Uint8Array([])
const transtream = new TransformStream<Uint8Array, string>( {
async transform(chunk, control) {
dataUint = Buffer.from(new Uint8Array([...dataUint, ...chunk]))
try {
const datas = dataUint.toString().split('\n')
let readed = ''
for(const data of datas){
if(data.startsWith("data: ")){
try {
const rawChunk = data.replace("data: ", "")
if(rawChunk === "[DONE]"){
control.enqueue(readed)
return
}
const chunk = JSON.parse(rawChunk).choices[0].delta.content
if(chunk){
readed += chunk
}
} catch (error) {}
}
}
control.enqueue(readed)
} catch (error) {
}
}
},)
da.body.pipeTo(transtream.writable)
return {
type: 'streaming',
result: reader
result: transtream.readable
}
}

View File

@@ -46,7 +46,7 @@ function versionStringToNumber(versionString:string):number {
return Number(
versionString
.split(".")
.map((component) => component.padStart(2, "0"))
.map((component) => component.padStart(4, "0"))
.join("")
);
}