"""数据表定义(SQLAlchemy 2.0)。 两张表,职责分离(见设计): - ProviderCredential:模型凭证(key 明文存,同 dograh,靠 DB 访问控制兜底;读时打码) - Assistant:助手配置,**只存模型/音色的"选项名",不嵌 key** 助手运行时再用 kind 去 ProviderCredential 取真 key(services/config_resolver.py)。 """ from datetime import datetime from sqlalchemy import Boolean, DateTime, String, func from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass class ProviderCredential(Base): """模型资源凭证。字段对齐前端 ComponentsModelsPage 的 ModelResource。""" __tablename__ = "provider_credentials" id: Mapped[str] = mapped_column(String(40), primary_key=True) # model_xxx name: Mapped[str] = mapped_column(String(128), default="") # 资源名称,如 "DeepSeek-V3" model_id: Mapped[str] = mapped_column(String(128), default="") # 模型ID,如 "deepseek-chat" type: Mapped[str] = mapped_column(String(16), index=True) # LLM|ASR|TTS|Realtime|Embedding interface_type: Mapped[str] = mapped_column(String(32), default="openai") # openai|xfyun|dashscope|gemini api_url: Mapped[str] = mapped_column(String(512), default="") api_key: Mapped[str] = mapped_column(String(512), default="") # 明文 # 同一 type 下的默认凭证(后端解析用;前端 ModelResource 无此字段,留作可选) is_default: Mapped[bool] = mapped_column(Boolean, default=False) 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() ) class Assistant(Base): __tablename__ = "assistants" id: Mapped[str] = mapped_column(String(40), primary_key=True) # asst_xxx name: Mapped[str] = mapped_column(String(128)) greeting: Mapped[str] = mapped_column(String(2048), default="") prompt: Mapped[str] = mapped_column(String(8192), default="") runtime_mode: Mapped[str] = mapped_column(String(16), default="pipeline") # 模型/音色的"选项名",不是 key model: Mapped[str] = mapped_column(String(128), default="") asr: Mapped[str] = mapped_column(String(128), default="") voice: Mapped[str] = mapped_column(String(128), default="") enable_interrupt: Mapped[bool] = mapped_column(Boolean, default=True) 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() )