feat(cloud): manage LLM providers in database
Tests / Test passed: 664

This commit is contained in:
2026-07-14 00:31:47 +08:00
parent b613a315ff
commit a166ffd8a4
35 changed files with 2432 additions and 204 deletions
@@ -0,0 +1,65 @@
"""Add durable, encrypted Cloud LLM Provider profiles."""
from __future__ import annotations
from alembic import op
import sqlalchemy as sa
revision = "0007_llm_provider_management"
down_revision = "0006_host_planner_transport"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"cloud_llm_provider_profiles",
sa.Column("id", sa.String(), primary_key=True),
sa.Column("name", sa.String(), nullable=False),
sa.Column("name_normalized", sa.String(), nullable=False),
sa.Column("provider_type", sa.String(), nullable=False),
sa.Column("model", sa.String(), nullable=False),
sa.Column("base_url", sa.String(), nullable=True),
sa.Column("timeout_seconds", sa.Float(), nullable=False),
sa.Column("api_key_ciphertext", sa.Text(), nullable=False),
sa.Column("key_last_rotated_at", sa.String(), nullable=False),
sa.Column("enabled", sa.Integer(), nullable=False, server_default="1"),
sa.Column("revision", sa.Integer(), nullable=False, server_default="1"),
sa.Column("created_at", sa.String(), nullable=False),
sa.Column("updated_at", sa.String(), nullable=False),
sa.UniqueConstraint(
"name_normalized", name="uq_cloud_llm_provider_profiles_name_normalized"
),
)
op.create_index(
"ix_cloud_llm_provider_profiles_enabled",
"cloud_llm_provider_profiles",
["enabled"],
)
op.create_table(
"cloud_llm_provider_settings",
sa.Column("id", sa.String(), primary_key=True),
sa.Column(
"active_profile_id",
sa.String(),
sa.ForeignKey("cloud_llm_provider_profiles.id"),
nullable=True,
),
sa.Column("revision", sa.Integer(), nullable=False, server_default="1"),
sa.Column("updated_at", sa.String(), nullable=False),
)
op.execute(
"insert into cloud_llm_provider_settings "
"(id, active_profile_id, revision, updated_at) values "
"('global', null, 0, '1970-01-01T00:00:00+00:00')"
)
def downgrade() -> None:
op.drop_table("cloud_llm_provider_settings")
op.drop_index(
"ix_cloud_llm_provider_profiles_enabled",
table_name="cloud_llm_provider_profiles",
)
op.drop_table("cloud_llm_provider_profiles")