mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-10 20:07:14 +00:00
0f216a0d4d
* feat(provider): support Codex subscriptions with ChatGPT sign-in * style: format Codex live integration test * fix(provider): preserve Codex identity in temporary model tests * fix(web): portal provider selector without dialog overflow * fix(web): allow native scrolling in provider dropdown * fix(provider): surface safe Codex quota and upstream errors * fix(web): provide reliable Codex copy feedback in dialogs * feat(provider): confirm cascade deletion from edit dialog * fix(persistence): discard connections after failed commit * fix(web): polish provider loading and confirmation motion --------- Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com>
166 lines
6.7 KiB
Python
166 lines
6.7 KiB
Python
import sqlalchemy
|
|
|
|
from .base import Base
|
|
|
|
|
|
class ModelProvider(Base):
|
|
"""Model provider"""
|
|
|
|
__tablename__ = 'model_providers'
|
|
|
|
uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True)
|
|
workspace_uuid = sqlalchemy.Column(
|
|
sqlalchemy.String(36),
|
|
sqlalchemy.ForeignKey('workspaces.uuid', ondelete='CASCADE'),
|
|
nullable=False,
|
|
)
|
|
name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
requester = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
base_url = sqlalchemy.Column(sqlalchemy.String(512), nullable=False)
|
|
api_keys = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default=[])
|
|
created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now())
|
|
updated_at = sqlalchemy.Column(
|
|
sqlalchemy.DateTime,
|
|
nullable=False,
|
|
server_default=sqlalchemy.func.now(),
|
|
onupdate=sqlalchemy.func.now(),
|
|
)
|
|
|
|
__table_args__ = (
|
|
sqlalchemy.UniqueConstraint('workspace_uuid', 'uuid', name='uq_model_providers_workspace_uuid'),
|
|
sqlalchemy.Index('ix_model_providers_workspace_name', 'workspace_uuid', 'name'),
|
|
sqlalchemy.Index('ix_model_providers_workspace_requester', 'workspace_uuid', 'requester'),
|
|
)
|
|
|
|
|
|
class CodexCredential(Base):
|
|
"""Server-only OAuth state. Never joined into provider/model serialization."""
|
|
|
|
__tablename__ = 'codex_credentials'
|
|
|
|
provider_uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True)
|
|
workspace_uuid = sqlalchemy.Column(sqlalchemy.String(36), nullable=False)
|
|
payload = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default=dict)
|
|
version = sqlalchemy.Column(sqlalchemy.Integer, nullable=False, default=0)
|
|
lease_owner = sqlalchemy.Column(sqlalchemy.String(64), nullable=True)
|
|
lease_until = sqlalchemy.Column(sqlalchemy.Float, nullable=False, default=0)
|
|
__table_args__ = (
|
|
sqlalchemy.ForeignKeyConstraint(
|
|
['workspace_uuid', 'provider_uuid'],
|
|
['model_providers.workspace_uuid', 'model_providers.uuid'],
|
|
name='fk_codex_credentials_workspace_provider',
|
|
ondelete='CASCADE',
|
|
),
|
|
sqlalchemy.Index('ix_codex_credentials_workspace', 'workspace_uuid'),
|
|
)
|
|
|
|
|
|
class LLMModel(Base):
|
|
"""LLM model"""
|
|
|
|
__tablename__ = 'llm_models'
|
|
|
|
uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True)
|
|
workspace_uuid = sqlalchemy.Column(
|
|
sqlalchemy.String(36),
|
|
sqlalchemy.ForeignKey('workspaces.uuid', ondelete='CASCADE'),
|
|
nullable=False,
|
|
)
|
|
name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
provider_uuid = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
abilities = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default=[])
|
|
context_length = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
|
|
reasoning_config = sqlalchemy.Column(
|
|
sqlalchemy.JSON,
|
|
nullable=False,
|
|
default=lambda: {'level': 'provider_default'},
|
|
server_default=sqlalchemy.text('\'{"level":"provider_default"}\''),
|
|
)
|
|
extra_args = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default={})
|
|
prefered_ranking = sqlalchemy.Column(sqlalchemy.Integer, nullable=False, default=0)
|
|
created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now())
|
|
updated_at = sqlalchemy.Column(
|
|
sqlalchemy.DateTime,
|
|
nullable=False,
|
|
server_default=sqlalchemy.func.now(),
|
|
onupdate=sqlalchemy.func.now(),
|
|
)
|
|
|
|
__table_args__ = (
|
|
sqlalchemy.ForeignKeyConstraint(
|
|
['workspace_uuid', 'provider_uuid'],
|
|
['model_providers.workspace_uuid', 'model_providers.uuid'],
|
|
name='fk_llm_models_workspace_provider',
|
|
),
|
|
sqlalchemy.Index('ix_llm_models_workspace_provider', 'workspace_uuid', 'provider_uuid'),
|
|
sqlalchemy.Index('ix_llm_models_workspace_name', 'workspace_uuid', 'name'),
|
|
)
|
|
|
|
|
|
class EmbeddingModel(Base):
|
|
"""Embedding model"""
|
|
|
|
__tablename__ = 'embedding_models'
|
|
|
|
uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True)
|
|
workspace_uuid = sqlalchemy.Column(
|
|
sqlalchemy.String(36),
|
|
sqlalchemy.ForeignKey('workspaces.uuid', ondelete='CASCADE'),
|
|
nullable=False,
|
|
)
|
|
name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
provider_uuid = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
extra_args = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default={})
|
|
prefered_ranking = sqlalchemy.Column(sqlalchemy.Integer, nullable=False, default=0)
|
|
created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now())
|
|
updated_at = sqlalchemy.Column(
|
|
sqlalchemy.DateTime,
|
|
nullable=False,
|
|
server_default=sqlalchemy.func.now(),
|
|
onupdate=sqlalchemy.func.now(),
|
|
)
|
|
|
|
__table_args__ = (
|
|
sqlalchemy.ForeignKeyConstraint(
|
|
['workspace_uuid', 'provider_uuid'],
|
|
['model_providers.workspace_uuid', 'model_providers.uuid'],
|
|
name='fk_embedding_models_workspace_provider',
|
|
),
|
|
sqlalchemy.Index('ix_embedding_models_workspace_provider', 'workspace_uuid', 'provider_uuid'),
|
|
sqlalchemy.Index('ix_embedding_models_workspace_name', 'workspace_uuid', 'name'),
|
|
)
|
|
|
|
|
|
class RerankModel(Base):
|
|
"""Rerank model"""
|
|
|
|
__tablename__ = 'rerank_models'
|
|
|
|
uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True)
|
|
workspace_uuid = sqlalchemy.Column(
|
|
sqlalchemy.String(36),
|
|
sqlalchemy.ForeignKey('workspaces.uuid', ondelete='CASCADE'),
|
|
nullable=False,
|
|
)
|
|
name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
provider_uuid = sqlalchemy.Column(sqlalchemy.String(255), nullable=False)
|
|
extra_args = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default={})
|
|
prefered_ranking = sqlalchemy.Column(sqlalchemy.Integer, nullable=False, default=0)
|
|
created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now())
|
|
updated_at = sqlalchemy.Column(
|
|
sqlalchemy.DateTime,
|
|
nullable=False,
|
|
server_default=sqlalchemy.func.now(),
|
|
onupdate=sqlalchemy.func.now(),
|
|
)
|
|
|
|
__table_args__ = (
|
|
sqlalchemy.ForeignKeyConstraint(
|
|
['workspace_uuid', 'provider_uuid'],
|
|
['model_providers.workspace_uuid', 'model_providers.uuid'],
|
|
name='fk_rerank_models_workspace_provider',
|
|
),
|
|
sqlalchemy.Index('ix_rerank_models_workspace_provider', 'workspace_uuid', 'provider_uuid'),
|
|
sqlalchemy.Index('ix_rerank_models_workspace_name', 'workspace_uuid', 'name'),
|
|
)
|