diff --git a/src/ts/model/modellist.ts b/src/ts/model/modellist.ts index 223dac58..f5ce78db 100644 --- a/src/ts/model/modellist.ts +++ b/src/ts/model/modellist.ts @@ -17,6 +17,7 @@ export enum LLMFlags{ hasVideoInput, OAICompletionTokens, DeveloperRole, + geminiThinking } export enum LLMProvider{ @@ -814,7 +815,7 @@ export const LLMModels: LLMModel[] = [ id: 'gemini-2.0-flash-thinking-exp-1219', provider: LLMProvider.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'], tokenizer: LLMTokenizer.GoogleCloud, recommended: true diff --git a/src/ts/process/index.svelte.ts b/src/ts/process/index.svelte.ts index b10d701d..e57f8788 100644 --- a/src/ts/process/index.svelte.ts +++ b/src/ts/process/index.svelte.ts @@ -39,6 +39,7 @@ export interface OpenAIChat{ removable?:boolean attr?:string[] multimodals?: MultiModal[] + thoughts?: string[] } export interface MultiModal{ @@ -752,14 +753,19 @@ export async function sendChat(chatProcessIndex = -1,arg:{ break } } - formatedChat = formatedChat.replace(/(.+?)<\/Thoughts>/gm, '') + let thoughts:string[] = [] + formatedChat = formatedChat.replace(/(.+?)<\/Thoughts>/gm, (match, p1) => { + thoughts.push(p1) + return '' + }) const chat:OpenAIChat = { role: role, content: formatedChat, memo: msg.chatId, attr: attr, - multimodals: multimodal + multimodals: multimodal, + thoughts: thoughts } if(chat.multimodals.length === 0){ delete chat.multimodals diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index e79ed17c..6c7587f1 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -1458,7 +1458,6 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise role: "USER", parts: geminiParts, }); - } else if (prevChat?.role === qRole) { reformatedChat[reformatedChat.length-1].parts[0].text += '\n' + chat.content 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'){ reformatedChat.push({ @@ -1664,32 +1673,25 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise const data = JSON.parse(reformatted) - let r = '' - let r2 = '' - let bump = false + let rDatas:string[] = [''] for(const d of data){ const parts = d.candidates[0].content?.parts for(let i=0;i 0){ + rDatas.push('') } - if(!bump){ - r += part.text - } - else{ - r2 += part.text - } + rDatas[rDatas.length-1] += part.text } } - console.log(data) - if(r2){ - r = `${r}\n\n${r2}` + if(rDatas.length > 1){ + const thought = rDatas.splice(rDatas.length-2, 1)[0] + rDatas[rDatas.length-1] = `${thought}\n\n${rDatas.join('\n')}` } control.enqueue({ - '0': r + '0': rDatas[rDatas.length-1], }) } catch (error) { console.log(error) @@ -1717,16 +1719,19 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise } } - let r = '' - let r2 = '' + let rDatas:string[] = [''] const processDataItem = (data:any) => { - if(data?.candidates?.[0]?.content?.parts?.[0]?.text){ - r += data.candidates[0].content.parts[0].text + const parts = data?.candidates?.[0]?.content?.parts + for(let i=0;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 - } - else if(data?.errors){ + + if(data?.errors){ return { type: 'fail', result: `${JSON.stringify(data.errors)}` @@ -1750,13 +1755,14 @@ async function requestGoogleCloudVertex(arg:RequestDataArgumentExtended):Promise } - if(r2){ - r = `${r}\n\n${r2}` + if(rDatas.length > 1){ + const thought = rDatas.splice(rDatas.length-2, 1)[0] + rDatas[rDatas.length-1] = `${thought}\n\n${rDatas.join('\n')}` } return { type: 'success', - result: r + result: rDatas[rDatas.length-1] } }