- Fix tag filtering (sa_text import shadowing caused UnboundLocalError) - Add TagBrowser component with per-section search - Multi-category selection (OR within categories, AND with tags) - AI image validation: has_figure field in extraction prompt - Skip known branding images by MD5 hash + dimension filters - Fix quiz timer auto-submit (wrong useEffect dependency) - Fix QuizResponse schema: section_id nullable - Fix Question.quiz_id → source_quiz_id attribute name - Fix SQL injection in quizzes.py vector search - Add PDF processing progress steps via Redis - Add delete user from admin panel - Admin page: no spinner flash on data refresh - Upload progress: axios 1.x e.progress, remove manual Content-Type - Duplicate model error: 409 with clear message - Backend startup: retry DDL migration on lock timeout - Replace all silent except:pass with warning logs - Comprehensive multi-page documentation (docs/) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
21 lines
820 B
Python
21 lines
820 B
Python
from datetime import datetime
|
|
|
|
from sqlalchemy import Column, Integer, String, Boolean, DateTime, UniqueConstraint
|
|
|
|
from app.database import Base
|
|
|
|
|
|
class AIModelConfig(Base):
|
|
__tablename__ = "ai_model_configs"
|
|
__table_args__ = (
|
|
UniqueConstraint("model_id", "task", name="uq_model_id_task"),
|
|
)
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String, nullable=False) # display name
|
|
model_id = Column(String, nullable=False) # litellm model id e.g. gpt-4o-mini
|
|
task = Column(String, nullable=False) # extraction, tts, general
|
|
api_key = Column(String, nullable=True) # override api key, if null uses default
|
|
is_active = Column(Boolean, default=True)
|
|
is_default = Column(Boolean, default=False)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|