ai: save last chat, make sure model's messages are saved properly

This commit is contained in:
end-4
2025-07-11 19:37:23 +07:00
parent b1ee817c78
commit b958c0ad6c
+19 -7
View File
@@ -461,6 +461,7 @@ Singleton {
root.postResponseHook(); root.postResponseHook();
root.postResponseHook = null; // Reset hook after use root.postResponseHook = null; // Reset hook after use
} }
root.saveChat("lastSession")
} }
function buildGeminiRequestData(model, messages) { function buildGeminiRequestData(model, messages) {
@@ -492,7 +493,7 @@ Singleton {
return { return {
"role": geminiApiRoleName, "role": geminiApiRoleName,
"parts": [{ "parts": [{
text: message.content, text: message.rawContent,
}] }]
} }
}), }),
@@ -517,7 +518,7 @@ Singleton {
...messages.filter(message => (message.role != Ai.interfaceRole)).map(message => { ...messages.filter(message => (message.role != Ai.interfaceRole)).map(message => {
return { return {
"role": message.role, "role": message.role,
"content": message.content, "content": message.rawContent,
} }
}), }),
], ],
@@ -594,12 +595,15 @@ Singleton {
const functionCall = dataJson.candidates[0]?.content?.parts[0]?.functionCall; const functionCall = dataJson.candidates[0]?.content?.parts[0]?.functionCall;
requester.message.functionName = functionCall.name; requester.message.functionName = functionCall.name;
requester.message.functionCall = functionCall.name; requester.message.functionCall = functionCall.name;
requester.message.content += `\n\n[[ Function: ${functionCall.name}(${JSON.stringify(functionCall.args, null, 2)}) ]]\n`; const newContent = `\n\n[[ Function: ${functionCall.name}(${JSON.stringify(functionCall.args, null, 2)}) ]]\n`
requester.message.rawContent += newContent;
requester.message.content += newContent;
root.handleGeminiFunctionCall(functionCall.name, functionCall.args); root.handleGeminiFunctionCall(functionCall.name, functionCall.args);
return return
} }
// Normal text response // Normal text response
const responseContent = dataJson.candidates[0]?.content?.parts[0]?.text const responseContent = dataJson.candidates[0]?.content?.parts[0]?.text
requester.message.rawContent += responseContent;
requester.message.content += responseContent; requester.message.content += responseContent;
const annotationSources = dataJson.candidates[0]?.groundingMetadata?.groundingChunks?.map(chunk => { const annotationSources = dataJson.candidates[0]?.groundingMetadata?.groundingChunks?.map(chunk => {
return { return {
@@ -623,6 +627,7 @@ Singleton {
// console.log(JSON.stringify(requester.message, null, 2)); // console.log(JSON.stringify(requester.message, null, 2));
} catch (e) { } catch (e) {
console.log("[AI] Could not parse response from stream: ", e); console.log("[AI] Could not parse response from stream: ", e);
requester.message.rawContent += requester.geminiBuffer;
requester.message.content += requester.geminiBuffer requester.message.content += requester.geminiBuffer
} finally { } finally {
requester.geminiBuffer = ""; requester.geminiBuffer = "";
@@ -664,14 +669,18 @@ Singleton {
if (responseContent && responseContent.length > 0) { if (responseContent && responseContent.length > 0) {
if (requester.isReasoning) { if (requester.isReasoning) {
requester.isReasoning = false; requester.isReasoning = false;
requester.message.content += "\n\n</think>\n\n"; const endBlock = "\n\n</think>\n\n";
requester.message.content += endBlock;
requester.message.rawContent += endBlock;
} }
newContent = dataJson.choices[0]?.delta?.content || dataJson.message.content; newContent = dataJson.choices[0]?.delta?.content || dataJson.message.content;
} else if (responseReasoning && responseReasoning.length > 0) { } else if (responseReasoning && responseReasoning.length > 0) {
// console.log("Reasoning content: ", dataJson.choices[0].delta.reasoning); // console.log("Reasoning content: ", dataJson.choices[0].delta.reasoning);
if (!requester.isReasoning) { if (!requester.isReasoning) {
requester.isReasoning = true; requester.isReasoning = true;
requester.message.content += "\n\n<think>\n\n"; const startBlock = "\n\n<think>\n\n";
requester.message.rawContent += startBlock;
requester.message.content += startBlock;
} }
newContent = dataJson.choices[0].delta.reasoning || dataJson.choices[0].delta.reasoning_content; newContent = dataJson.choices[0].delta.reasoning || dataJson.choices[0].delta.reasoning_content;
} }
@@ -699,10 +708,12 @@ Singleton {
} }
else { else {
console.log("Unknown API format: ", requester.apiFormat); console.log("Unknown API format: ", requester.apiFormat);
requester.message.rawContent += data;
requester.message.content += data; requester.message.content += data;
} }
} catch (e) { } catch (e) {
console.log("[AI] Could not parse response from stream: ", e); console.log("[AI] Could not parse response from stream: ", e);
requester.message.rawContent += data;
requester.message.content += data; requester.message.content += data;
} }
} }
@@ -714,8 +725,9 @@ Singleton {
try { // to parse full response into json for error handling try { // to parse full response into json for error handling
// console.log("Full response: ", requester.message.content + "]"); // console.log("Full response: ", requester.message.content + "]");
const parsedResponse = JSON.parse(requester.message.content + "]"); const parsedResponse = JSON.parse(requester.message.rawContent + "]");
requester.message.content = `\`\`\`json\n${JSON.stringify(parsedResponse, null, 2)}\n\`\`\``; requester.message.rawContent = `\`\`\`json\n${JSON.stringify(parsedResponse, null, 2)}\n\`\`\``;
requester.message.content = requester.message.rawContent;
} catch (e) { } catch (e) {
// console.log("[AI] Could not parse response on exit: ", e); // console.log("[AI] Could not parse response on exit: ", e);
} }