(messages = [])
| 4338 | } |
| 4339 | |
| 4340 | function renderChatMessages(messages = []) { |
| 4341 | state.chatMessages = messages; |
| 4342 | if (!messages.length) { |
| 4343 | resetChatThread(); |
| 4344 | return; |
| 4345 | } |
| 4346 | let latestCitations = []; |
| 4347 | $("chatThread").innerHTML = messages.map((message) => { |
| 4348 | const role = message.role === "user" ? "user" : "assistant"; |
| 4349 | const content = String(message.content || ""); |
| 4350 | if (role === "user") { |
| 4351 | return ` |
| 4352 | <div class="message user" data-chat-message-id="${escapeHtml(message.id || "")}"> |
| 4353 | <div class="avatar">${escapeHtml(ui().chat.me)}</div> |
| 4354 | <div class="bubble"><p>${escapeHtml(content).replace(/\n/g, "<br>")}</p></div> |
| 4355 | </div> |
| 4356 | `; |
| 4357 | } |
| 4358 | const metadata = message.metadata && typeof message.metadata === "object" ? message.metadata : {}; |
| 4359 | const answerData = { |
| 4360 | mode: "direct", |
| 4361 | retrieval_required: false, |
| 4362 | ...metadata, |
| 4363 | text: content |
| 4364 | }; |
| 4365 | const citations = normalizeCitations(answerData); |
| 4366 | latestCitations = citations; |
| 4367 | return ` |
| 4368 | <div class="message assistant" data-chat-message-id="${escapeHtml(message.id || "")}"> |
| 4369 | <div class="avatar">AI</div> |
| 4370 | <div class="bubble"> |
| 4371 | ${renderAnswerMeta(answerData, citations)} |
| 4372 | <div class="answer-text">${renderAnswerWithCitations(content, citations)}</div> |
| 4373 | </div> |
| 4374 | </div> |
| 4375 | `; |
| 4376 | }).join(""); |
| 4377 | renderChatSources(latestCitations); |
| 4378 | window.setTimeout(() => { |
| 4379 | $("chatThread").scrollTop = $("chatThread").scrollHeight; |
| 4380 | }, 0); |
| 4381 | } |
| 4382 | |
| 4383 | function renderChatHistoryUnavailable() { |
| 4384 | state.chatHistoryLoaded = false; |
no test coverage detected