Add geminiThinking flag and enhance thoughts handling in chat processing

This commit is contained in:
Kwaroran
2024-12-20 02:53:58 +09:00
parent bd14dcd038
commit 4afe32a2c2
3 changed files with 43 additions and 30 deletions

View File

@@ -17,6 +17,7 @@ export enum LLMFlags{
hasVideoInput, hasVideoInput,
OAICompletionTokens, OAICompletionTokens,
DeveloperRole, DeveloperRole,
geminiThinking
} }
export enum LLMProvider{ export enum LLMProvider{
@@ -814,7 +815,7 @@ export const LLMModels: LLMModel[] = [
id: 'gemini-2.0-flash-thinking-exp-1219', id: 'gemini-2.0-flash-thinking-exp-1219',
provider: LLMProvider.GoogleCloud, provider: LLMProvider.GoogleCloud,
format: LLMFormat.GoogleCloud, format: LLMFormat.GoogleCloud,
flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt, LLMFlags.poolSupported, LLMFlags.hasAudioInput, LLMFlags.hasVideoInput, LLMFlags.hasStreaming], flags: [LLMFlags.hasImageInput, LLMFlags.hasFirstSystemPrompt, LLMFlags.poolSupported, LLMFlags.hasAudioInput, LLMFlags.hasVideoInput, LLMFlags.hasStreaming, LLMFlags.geminiThinking],
parameters: ['temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'], parameters: ['temperature', 'top_k', 'top_p', 'presence_penalty', 'frequency_penalty'],
tokenizer: LLMTokenizer.GoogleCloud, tokenizer: LLMTokenizer.GoogleCloud,
recommended: true recommended: true

View File

@@ -39,6 +39,7 @@ export interface OpenAIChat{
removable?:boolean removable?:boolean
attr?:string[] attr?:string[]
multimodals?: MultiModal[] multimodals?: MultiModal[]
thoughts?: string[]
} }
export interface MultiModal{ export interface MultiModal{
@@ -752,14 +753,19 @@ export async function sendChat(chatProcessIndex = -1,arg:{
break break
} }
} }
formatedChat = formatedChat.replace(/<Thoughts>(.+?)<\/Thoughts>/gm, '') let thoughts:string[] = []
formatedChat = formatedChat.replace(/<Thoughts>(.+?)<\/Thoughts>/gm, (match, p1) => {
thoughts.push(p1)
return ''
})
const chat:OpenAIChat = { const chat:OpenAIChat = {
role: role, role: role,
content: formatedChat, content: formatedChat,
memo: msg.chatId, memo: msg.chatId,
attr: attr, attr: attr,
multimodals: multimodal multimodals: multimodal,
thoughts: thoughts
} }
if(chat.multimodals.length === 0){ if(chat.multimodals.length === 0){
delete chat.multimodals delete chat.multimodals

View File

@@ -1458,7 +1458,6 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
role: "USER", role: "USER",
parts: geminiParts, parts: geminiParts,
}); });
} else if (prevChat?.role === qRole) { } else if (prevChat?.role === qRole) {
reformatedChat[reformatedChat.length-1].parts[0].text += '\n' + chat.content reformatedChat[reformatedChat.length-1].parts[0].text += '\n' + chat.content
continue continue
@@ -1476,6 +1475,16 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
}) })
} }
} }
else if(chat.role === 'assistant' && arg.modelInfo.flags.includes(LLMFlags.geminiThinking) && chat.thoughts?.length > 0){
reformatedChat.push({
role: 'MODEL',
parts: [{
text: chat.thoughts.join('\n\n')
}, {
text: chat.content
}]
})
}
else if(chat.role === 'assistant' || chat.role === 'user'){ else if(chat.role === 'assistant' || chat.role === 'user'){
reformatedChat.push({ reformatedChat.push({
@@ -1664,32 +1673,25 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
const data = JSON.parse(reformatted) const data = JSON.parse(reformatted)
let r = '' let rDatas:string[] = ['']
let r2 = ''
let bump = false
for(const d of data){ for(const d of data){
const parts = d.candidates[0].content?.parts const parts = d.candidates[0].content?.parts
for(let i=0;i<parts.length;i++){ for(let i=0;i<parts.length;i++){
const part = parts[i] const part = parts[i]
if(i === 1){ if(i > 0){
bump = true rDatas.push('')
} }
if(!bump){ rDatas[rDatas.length-1] += part.text
r += part.text
}
else{
r2 += part.text
}
} }
} }
console.log(data) if(rDatas.length > 1){
if(r2){ const thought = rDatas.splice(rDatas.length-2, 1)[0]
r = `<Thoughts>${r}</Thoughts>\n\n${r2}` rDatas[rDatas.length-1] = `<Thoughts>${thought}</Thoughts>\n\n${rDatas.join('\n')}`
} }
control.enqueue({ control.enqueue({
'0': r '0': rDatas[rDatas.length-1],
}) })
} catch (error) { } catch (error) {
console.log(error) console.log(error)
@@ -1717,16 +1719,19 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
} }
} }
let r = '' let rDatas:string[] = ['']
let r2 = ''
const processDataItem = (data:any) => { const processDataItem = (data:any) => {
if(data?.candidates?.[0]?.content?.parts?.[0]?.text){ const parts = data?.candidates?.[0]?.content?.parts
r += data.candidates[0].content.parts[0].text for(let i=0;i<parts.length;i++){
const part = parts[i]
if(i > 0){
rDatas.push('')
}
rDatas[rDatas.length-1] += part.text
} }
if(data?.candidates?.[0]?.content?.parts?.[1]?.text){
r2 += data.candidates[0].content.parts[1].text if(data?.errors){
}
else if(data?.errors){
return { return {
type: 'fail', type: 'fail',
result: `${JSON.stringify(data.errors)}` result: `${JSON.stringify(data.errors)}`
@@ -1750,13 +1755,14 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise
} }
if(r2){ if(rDatas.length > 1){
r = `<Thoughts>${r}</Thoughts>\n\n${r2}` const thought = rDatas.splice(rDatas.length-2, 1)[0]
rDatas[rDatas.length-1] = `<Thoughts>${thought}</Thoughts>\n\n${rDatas.join('\n')}`
} }
return { return {
type: 'success', type: 'success',
result: r result: rDatas[rDatas.length-1]
} }
} }