feat(ui,markdown): add collapsible 'Thoughts' for <think>, sanitize titles, improve focus UX; refactor table/blockquote render & styles
Backend: HTML-unescape and strip <think>/<thinking> from generated titles; trim and return cleaned value; add debug logs. Electron: send 'window-focused' from main; expose onWindowFocus in preload. Frontend: stream-safe AssistantMessageContent with collapsible Thoughts; switch streaming render to React state updates; autofocus textarea on window focus/new chat and when clicking empty chat area; sanitize session title client-side. Markdown: support blockquotes; allow '-' or '*' bullets; simplify <think> removal to handle streaming; drop table wrapper div (emit <table class='nice'>); theme-aware code block headers/borders. CSS: rounded 'nice' tables with light inner grid; blockquote styling; Thoughts toggle/panel styles. Color: brighten Grayscale --accent. Follow-ups: add IPC listener cleanup; ensure single source of truth for colorSchemes.
This commit is contained in:
@@ -3,6 +3,8 @@ from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import StreamingResponse
|
||||
from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
import re # Import the regex module
|
||||
import html # Import the html module for unescaping
|
||||
from . import models, schemas
|
||||
from .database import Base, engine, SessionLocal
|
||||
from .ollama_client import list_models as ollama_list, chat as ollama_chat, chat_stream as ollama_chat_stream
|
||||
@@ -125,10 +127,22 @@ async def generate_title(req: schemas.GenerateTitleRequest, db: Session = Depend
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=502, detail=f"Ollama error: {e}")
|
||||
|
||||
session.name = title
|
||||
print(f"Original title from LLM: {title}") # Debugging line to see the raw title
|
||||
|
||||
# HTML unescape the title first to handle encoded tags
|
||||
unescaped_title = html.unescape(title)
|
||||
print(f"Unescaped title: {unescaped_title}") # Debugging line to see the unescaped title
|
||||
|
||||
# Remove <think> blocks from the unescaped title
|
||||
# Use re.IGNORECASE to handle potential variations in casing (e.g., <Think>)
|
||||
cleaned_title = re.sub(r'<think>.*?</think>', '', unescaped_title, flags=re.DOTALL | re.IGNORECASE)
|
||||
|
||||
print(f"Cleaned title before saving: {cleaned_title.strip()}") # Debugging line to see the cleaned title
|
||||
|
||||
session.name = cleaned_title.strip() # Use .strip() to remove any leading/trailing whitespace after removal
|
||||
db.commit()
|
||||
|
||||
return {"title": title}
|
||||
return {"title": cleaned_title.strip()}
|
||||
|
||||
@app.delete("/sessions/{session_id}")
|
||||
def delete_session(session_id: str, db: Session = Depends(get_db)):
|
||||
|
||||
Reference in New Issue
Block a user