DB - llm_provider_configs

abstract

Stores encrypted API keys for each LLM provider (Anthropic, OpenAI, Gemini, OpenRouter, Ollama) — one row per provider — with active status and a masked display hint.

Table Info

PropertyValue
Table Namellm_provider_configs
SQLAlchemy Modelbackend/db/models.py :: LLMProviderConfig
Pydantic Schemabackend/api/routes/settings.py :: ProviderStatus / SaveProviderRequest
Migration Filealembic/versions/
TimescaleDB HypertableNo
Partition Column

Columns

ColumnSQLAlchemy TypeNullableDefaultDescription
idIntegerNoautoPrimary key
providerString(32)NoProvider name: openai | gemini | anthropic | openrouter | ollama (UNIQUE)
encrypted_api_keyTextNoFernet-encrypted API key
key_hintString(50)YesnullMasked display hint (e.g., sk-...abcd)
is_activeBooleanNoTrueWhether this provider is available for task assignment
created_atDateTime(timezone=True)Nodatetime.now(UTC)Row creation timestamp
updated_atDateTime(timezone=True)Nodatetime.now(UTC)Last updated timestamp

Constraints & Indexes

NameTypeColumnsPurpose
pk_llm_provider_configsPRIMARY KEYidRow uniqueness
uq_providerUNIQUEproviderOne config per provider

SQLAlchemy Model (reference snapshot)

class LLMProviderConfig(Base):
    __tablename__ = "llm_provider_configs"
 
    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    provider: Mapped[str] = mapped_column(String(32), unique=True, nullable=False)
    encrypted_api_key: Mapped[str] = mapped_column(Text, nullable=False)
    key_hint: Mapped[str | None] = mapped_column(String(50), nullable=True)
    is_active: Mapped[bool] = mapped_column(Boolean, default=True)
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(UTC))
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        default=lambda: datetime.now(UTC),
        onupdate=lambda: datetime.now(UTC),
    )
RoleLink
API EndpointAPI-POST-v1-Settings
Frontend PagePage - Settings
Related TableDB - task_llm_assignments