mirror of
https://github.com/perstarkse/minne.git
synced 2026-04-23 09:18:36 +02:00
fix: chat push url and references
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
use axum::{
|
use axum::{
|
||||||
extract::State,
|
extract::State,
|
||||||
http::StatusCode,
|
http::{HeaderName, StatusCode},
|
||||||
response::{Html, IntoResponse, Response},
|
response::{Html, IntoResponse, Response},
|
||||||
Extension,
|
Extension,
|
||||||
};
|
};
|
||||||
@@ -106,13 +106,31 @@ pub async fn with_template_response<S>(
|
|||||||
where
|
where
|
||||||
S: ProvidesTemplateEngine + Clone + Send + Sync + 'static,
|
S: ProvidesTemplateEngine + Clone + Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
|
// Headers to forward from the original response
|
||||||
|
const HTMX_HEADERS_TO_FORWARD: &[&str] = &["HX-Push", "HX-Trigger", "HX-Redirect"];
|
||||||
|
|
||||||
if let Some(template_response) = response.extensions().get::<TemplateResponse>().cloned() {
|
if let Some(template_response) = response.extensions().get::<TemplateResponse>().cloned() {
|
||||||
let template_engine = state.template_engine();
|
let template_engine = state.template_engine();
|
||||||
|
|
||||||
|
// Helper to forward relevant headers
|
||||||
|
fn forward_headers(from: &axum::http::HeaderMap, to: &mut axum::http::HeaderMap) {
|
||||||
|
for &header_name in HTMX_HEADERS_TO_FORWARD {
|
||||||
|
if let Ok(name) = HeaderName::from_bytes(header_name.as_bytes()) {
|
||||||
|
if let Some(value) = from.get(&name) {
|
||||||
|
to.insert(name.clone(), value.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match &template_response.template_kind {
|
match &template_response.template_kind {
|
||||||
TemplateKind::Full(name) => {
|
TemplateKind::Full(name) => {
|
||||||
match template_engine.render(name, &template_response.context) {
|
match template_engine.render(name, &template_response.context) {
|
||||||
Ok(html) => Html(html).into_response(),
|
Ok(html) => {
|
||||||
|
let mut final_response = Html(html).into_response();
|
||||||
|
forward_headers(response.headers(), final_response.headers_mut());
|
||||||
|
final_response
|
||||||
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("Failed to render template '{}': {:?}", name, e);
|
error!("Failed to render template '{}': {:?}", name, e);
|
||||||
(StatusCode::INTERNAL_SERVER_ERROR, Html(fallback_error())).into_response()
|
(StatusCode::INTERNAL_SERVER_ERROR, Html(fallback_error())).into_response()
|
||||||
@@ -121,7 +139,11 @@ where
|
|||||||
}
|
}
|
||||||
TemplateKind::Partial(template, block) => {
|
TemplateKind::Partial(template, block) => {
|
||||||
match template_engine.render_block(template, block, &template_response.context) {
|
match template_engine.render_block(template, block, &template_response.context) {
|
||||||
Ok(html) => Html(html).into_response(),
|
Ok(html) => {
|
||||||
|
let mut final_response = Html(html).into_response();
|
||||||
|
forward_headers(response.headers(), final_response.headers_mut());
|
||||||
|
final_response
|
||||||
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("Failed to render block '{}/{}': {:?}", template, block, e);
|
error!("Failed to render block '{}/{}': {:?}", template, block, e);
|
||||||
(StatusCode::INTERNAL_SERVER_ERROR, Html(fallback_error())).into_response()
|
(StatusCode::INTERNAL_SERVER_ERROR, Html(fallback_error())).into_response()
|
||||||
|
|||||||
@@ -222,5 +222,5 @@ pub async fn new_chat_user_message(
|
|||||||
HeaderValue::from_str(&format!("/chat/{}", conversation.id)).unwrap(),
|
HeaderValue::from_str(&format!("/chat/{}", conversation.id)).unwrap(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(response)
|
Ok(response.into_response())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use axum_htmx::{HxBoosted, HxRequest};
|
|||||||
use plotly::{
|
use plotly::{
|
||||||
common::{Line, Marker, Mode},
|
common::{Line, Marker, Mode},
|
||||||
layout::{Axis, LayoutScene},
|
layout::{Axis, LayoutScene},
|
||||||
Layout, Plot, Scatter, Scatter3D,
|
Layout, Plot, Scatter3D,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<span class="loading loading-dots loading-sm loading-id-{{user_message.id}}"></span>
|
<span class="loading loading-dots loading-sm loading-id-{{user_message.id}}"></span>
|
||||||
<div class="markdown-content" id="ai-message-content-{{user_message.id}}" sse-swap="chat_message"></div>
|
<div class="markdown-content" id="ai-message-content-{{user_message.id}}" sse-swap="chat_message"></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div sse-swap="references"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
@@ -22,17 +23,19 @@
|
|||||||
const spinner = document.querySelector('.loading-id-{{user_message.id}}');
|
const spinner = document.querySelector('.loading-id-{{user_message.id}}');
|
||||||
if (spinner) spinner.style.display = 'none';
|
if (spinner) spinner.style.display = 'none';
|
||||||
|
|
||||||
const el = document.getElementById('ai-message-content-{{user_message.id}}');
|
if (e.detail.event === 'chat_message') {
|
||||||
if (e.detail.elt !== el) return;
|
const el = document.getElementById('ai-message-content-{{user_message.id}}');
|
||||||
e.preventDefault(); // Prevent htmx from swapping
|
if (e.detail.elt !== el) return;
|
||||||
// Use message id as buffer key
|
e.preventDefault(); // Prevent htmx from swapping
|
||||||
const msgId = '{{user_message.id}}';
|
// Use message id as buffer key
|
||||||
window.markdownBuffer[msgId] = (window.markdownBuffer[msgId] || '') + (e.detail.data || '');
|
const msgId = '{{user_message.id}}';
|
||||||
// Render buffer (with newline fix) on *every* chunk
|
window.markdownBuffer[msgId] = (window.markdownBuffer[msgId] || '') + (e.detail.data || '');
|
||||||
el.innerHTML = marked.parse(
|
// Render buffer (with newline fix) on *every* chunk
|
||||||
window.markdownBuffer[msgId].replace(/\\n/g, '\n')
|
el.innerHTML = marked.parse(
|
||||||
);
|
window.markdownBuffer[msgId].replace(/\\n/g, '\n')
|
||||||
scrollChatToBottom();
|
);
|
||||||
|
scrollChatToBottom();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
document.body.addEventListener('htmx:sseClose', function () {
|
document.body.addEventListener('htmx:sseClose', function () {
|
||||||
const el = document.getElementById('ai-message-content-{{user_message.id}}');
|
const el = document.getElementById('ai-message-content-{{user_message.id}}');
|
||||||
|
|||||||
Reference in New Issue
Block a user