Clawith/backend/app/models/llm.py

35 lines
1.8 KiB
Python

"""LLM model pool configuration."""
import uuid
from datetime import datetime
from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, func
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column
from app.database import Base
class LLMModel(Base):
"""LLM model in the platform model pool."""
__tablename__ = "llm_models"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
tenant_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("tenants.id"), nullable=True, index=True)
provider: Mapped[str] = mapped_column(String(50), nullable=False) # anthropic, openai, deepseek, etc.
model: Mapped[str] = mapped_column(String(100), nullable=False) # claude-opus-4-6, gpt-4o, etc.
api_key_encrypted: Mapped[str] = mapped_column(String(500), nullable=False)
base_url: Mapped[str | None] = mapped_column(String(500))
label: Mapped[str] = mapped_column(String(200), nullable=False) # Display name
max_tokens_per_day: Mapped[int | None] = mapped_column(Integer)
enabled: Mapped[bool] = mapped_column(Boolean, default=True)
supports_vision: Mapped[bool] = mapped_column(Boolean, default=False)
temperature: Mapped[float | None] = mapped_column(Float, nullable=True)
request_timeout: Mapped[int | None] = mapped_column(Integer, nullable=True) # Request timeout in seconds, default 120
max_output_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) # Per-model output token limit override
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)