SimpleChatTC:NSChatMessage: MultiChatUI and beyond updated for same

TODO: individual tool/function calls from tool_calls field, accessed
using different methods in different places for now. Need to think
on which is the best method to retain and use everywhere and or
retain things as is.
This commit is contained in:
hanishkvc 2025-11-08 19:17:53 +05:30
parent 9bd754d594
commit 7a61ca6aac
1 changed files with 33 additions and 20 deletions

View File

@ -88,6 +88,19 @@ class NSChatMessage {
return "" return ""
} }
/**
* Get the function wrt tool calls index
* @param {number} funcIndex
*/
getFunc(funcIndex) {
if (this.has_toolcalls()) {
if (this.tool_calls) {
return this.tool_calls[funcIndex]
}
}
return undefined
}
/** /**
* Get the function name wrt tool calls index * Get the function name wrt tool calls index
* @param {number} funcIndex * @param {number} funcIndex
@ -989,11 +1002,11 @@ class MultiChatUI {
* @param {boolean} bAuto - allows caller to explicitly control whether auto triggering should be setup. * @param {boolean} bAuto - allows caller to explicitly control whether auto triggering should be setup.
*/ */
ui_reset_toolcall_as_needed(ar, bAuto = false) { ui_reset_toolcall_as_needed(ar, bAuto = false) {
if (ar.has_toolcall()) { if (ar.ns.has_toolcalls()) {
this.elDivTool.hidden = false this.elDivTool.hidden = false
this.elInToolName.value = ar.ns.tool_calls[0].function.name this.elInToolName.value = ar.ns.getFuncName(0)
this.elInToolName.dataset.tool_call_id = ar.ns.tool_calls[0].id this.elInToolName.dataset.tool_call_id = ar.ns.getFunc(0)?.id
this.elInToolArgs.value = ar.ns.tool_calls[0].function.arguments this.elInToolArgs.value = `${ar.ns.getFunc(0)?.function.arguments}`
this.elBtnTool.disabled = false this.elBtnTool.disabled = false
if ((this.me.tools.autoSecs > 0) && (bAuto)) { if ((this.me.tools.autoSecs > 0) && (bAuto)) {
this.timers.toolcallTriggerClick = setTimeout(()=>{ this.timers.toolcallTriggerClick = setTimeout(()=>{
@ -1027,7 +1040,7 @@ class MultiChatUI {
/** /**
* Show the passed function / tool call details in specified parent element. * Show the passed function / tool call details in specified parent element.
* @param {HTMLElement} elParent * @param {HTMLElement} elParent
* @param {NSToolCalls} tc * @param {NSToolCall} tc
*/ */
show_message_toolcall(elParent, tc) { show_message_toolcall(elParent, tc) {
let secTC = document.createElement('section') let secTC = document.createElement('section')
@ -1067,7 +1080,7 @@ class MultiChatUI {
// Handle ToolTemp // Handle ToolTemp
if (msg.ns.role === Roles.ToolTemp) { if (msg.ns.role === Roles.ToolTemp) {
if (iFromLast == 0) { if (iFromLast == 0) {
this.elInUser.value = msg.ns.content; this.elInUser.value = msg.ns.getContent();
} }
return return
} }
@ -1087,11 +1100,11 @@ class MultiChatUI {
// Add the content // Add the content
//entry = ui.el_create_append_p(`${msg.content_equiv()}`, secContents); //entry = ui.el_create_append_p(`${msg.content_equiv()}`, secContents);
let showList = [] let showList = []
if (msg.ns.reasoning_content.trim().length > 0) { if (msg.ns.has_reasoning()) {
showList.push(['reasoning', `!!!Reasoning: ${msg.ns.reasoning_content.trim()} !!!\n\n`]) showList.push(['reasoning', `!!!Reasoning: ${msg.ns.getReasoningContent()} !!!\n\n`])
} }
if (msg.ns.content.trim().length > 0) { if (msg.ns.getContent().trim().length > 0) {
showList.push(['content', msg.ns.content.trim()]) showList.push(['content', msg.ns.getContent().trim()])
} }
for (const [name, content] of showList) { for (const [name, content] of showList) {
if (content.length > 0) { if (content.length > 0) {
@ -1116,9 +1129,9 @@ class MultiChatUI {
} }
} }
// Handle tool call non ui // Handle tool call non ui
if (msg.has_toolcall() && !bTC) { if (msg.ns.tool_calls && !bTC) {
for (const i in msg.ns.tool_calls) { for (const tc of msg.ns.tool_calls) {
this.show_message_toolcall(secContents, msg.ns.tool_calls[i]) this.show_message_toolcall(secContents, tc)
} }
} }
} }
@ -1228,7 +1241,7 @@ class MultiChatUI {
limitedData = data.slice(0, this.me.tools.iResultMaxDataLength) + `\n\n\nALERT: Data too long, was chopped ....` limitedData = data.slice(0, this.me.tools.iResultMaxDataLength) + `\n\n\nALERT: Data too long, was chopped ....`
} }
} }
chat.add(new ChatMessageEx(Roles.ToolTemp, ChatMessageEx.createToolCallResultAllInOne(tcid, name, limitedData))) chat.add(new ChatMessageEx(new NSChatMessage(Roles.ToolTemp, ChatMessageEx.createToolCallResultAllInOne(tcid, name, limitedData))))
if (this.chat_show(cid)) { if (this.chat_show(cid)) {
if (this.me.tools.autoSecs > 0) { if (this.me.tools.autoSecs > 0) {
this.timers.toolcallResponseSubmitClick = setTimeout(()=>{ this.timers.toolcallResponseSubmitClick = setTimeout(()=>{
@ -1317,7 +1330,7 @@ class MultiChatUI {
if (content.startsWith("<tool_response>")) { if (content.startsWith("<tool_response>")) {
chat.promote_tooltemp(content) chat.promote_tooltemp(content)
} else { } else {
chat.add(new ChatMessageEx(Roles.User, content)) chat.add(new ChatMessageEx(new NSChatMessage(Roles.User, content)))
} }
this.chat_show(chat.chatId); this.chat_show(chat.chatId);
@ -1328,7 +1341,7 @@ class MultiChatUI {
let theResp = await chat.handle_chat_hs(this.me.baseURL, apiEP, this.elDivChat) let theResp = await chat.handle_chat_hs(this.me.baseURL, apiEP, this.elDivChat)
if (chatId == this.curChatId) { if (chatId == this.curChatId) {
this.chat_show(chatId); this.chat_show(chatId);
if (theResp.trimmedContent.length > 0) { if ((theResp.trimmedContent) && (theResp.trimmedContent.length > 0)) {
let p = ui.el_create_append_p(`TRIMMED:${theResp.trimmedContent}`, this.elDivChat); let p = ui.el_create_append_p(`TRIMMED:${theResp.trimmedContent}`, this.elDivChat);
p.className="role-trim"; p.className="role-trim";
} }
@ -1356,13 +1369,13 @@ class MultiChatUI {
} }
let toolResult = await chat.handle_toolcall(toolCallId, toolname, this.elInToolArgs.value) let toolResult = await chat.handle_toolcall(toolCallId, toolname, this.elInToolArgs.value)
if (toolResult !== undefined) { if (toolResult !== undefined) {
chat.add(new ChatMessageEx(Roles.ToolTemp, ChatMessageEx.createToolCallResultAllInOne(toolCallId, toolname, toolResult))) chat.add(new ChatMessageEx(new NSChatMessage(Roles.ToolTemp, ChatMessageEx.createToolCallResultAllInOne(toolCallId, toolname, toolResult))))
this.chat_show(chat.chatId) this.chat_show(chat.chatId)
this.ui_reset_userinput(false) this.ui_reset_userinput(false)
} else { } else {
this.timers.toolcallResponseTimeout = setTimeout(() => { this.timers.toolcallResponseTimeout = setTimeout(() => {
this.me.toolsMgr.toolcallpending_found_cleared(chat.chatId, toolCallId, 'MCUI:HandleToolRun:TimeOut') this.me.toolsMgr.toolcallpending_found_cleared(chat.chatId, toolCallId, 'MCUI:HandleToolRun:TimeOut')
chat.add(new ChatMessageEx(Roles.ToolTemp, ChatMessageEx.createToolCallResultAllInOne(toolCallId, toolname, `Tool/Function call ${toolname} taking too much time, aborting...`))) chat.add(new ChatMessageEx(new NSChatMessage(Roles.ToolTemp, ChatMessageEx.createToolCallResultAllInOne(toolCallId, toolname, `Tool/Function call ${toolname} taking too much time, aborting...`))))
this.chat_show(chat.chatId) this.chat_show(chat.chatId)
this.ui_reset_userinput(false) this.ui_reset_userinput(false)
}, this.me.tools.toolCallResponseTimeoutMS) }, this.me.tools.toolCallResponseTimeoutMS)
@ -1439,7 +1452,7 @@ class MultiChatUI {
console.error(`ERRR:SimpleChat:MCUI:HandleSessionSwitch:${chatId} missing...`); console.error(`ERRR:SimpleChat:MCUI:HandleSessionSwitch:${chatId} missing...`);
return; return;
} }
this.elInSystem.value = chat.get_system_latest().ns.content; this.elInSystem.value = chat.get_system_latest().ns.getContent();
this.elInUser.value = ""; this.elInUser.value = "";
this.curChatId = chatId; this.curChatId = chatId;
this.chat_show(chatId, true, true); this.chat_show(chatId, true, true);
@ -1564,7 +1577,7 @@ export class Me {
chat.load(); chat.load();
queueMicrotask(()=>{ queueMicrotask(()=>{
this.multiChat.chat_show(chat.chatId, true, true); this.multiChat.chat_show(chat.chatId, true, true);
this.multiChat.elInSystem.value = chat.get_system_latest().ns.content; this.multiChat.elInSystem.value = chat.get_system_latest().ns.getContent();
}); });
}); });
div.appendChild(btn); div.appendChild(btn);