Files
Heimgeist/backend/models.py
Victor Giers 728c7763e2 Add web search enrichment feature with source persistence and UI integration
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.
2025-08-27 04:27:18 +02:00

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")