Introduce optional web search enrichment flow for chat and regenerate requests. New /websearch endpoint calls enrich_prompt via SearXNG and returns enriched_prompt + citation sources. DB: add sources_json column to chat_messages via ensure_sources_column migration helper. Backend: persist sources_json for assistant replies (streaming and non-streaming); extend ChatRequest/RegenerateRequest to accept enriched_message and sources; history endpoint returns sources. Frontend: add toggle for web search, settings for SearXNG URL + engines, and optional enrichment calls in sendMessage/regenerate. Render citation sources as rounded chips labeled with base domain under assistant replies. Dependencies: add beautifulsoup4, httpx[http2], numpy for enrichment pipeline.
28 lines
1.1 KiB
Python
28 lines
1.1 KiB
Python
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
|
|
from sqlalchemy.orm import relationship
|
|
from datetime import datetime
|
|
from .database import Base
|
|
|
|
class ChatSession(Base):
|
|
__tablename__ = 'chat_sessions'
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
session_id = Column(String(64), unique=True, index=True, nullable=False)
|
|
name = Column(String(100), default="New Chat", nullable=False)
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
|
|
messages = relationship("ChatMessage", back_populates="session")
|
|
|
|
class ChatMessage(Base):
|
|
__tablename__ = 'chat_messages'
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
session_pk = Column(Integer, ForeignKey('chat_sessions.id'), nullable=False)
|
|
role = Column(String(16), nullable=False) # 'user' | 'assistant'
|
|
content = Column(Text, nullable=False)
|
|
# JSON-encoded list of citation URLs; null/empty => no chips
|
|
sources_json = Column(Text, nullable=True, default='[]')
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
|
|
session = relationship("ChatSession", back_populates="messages")
|