Add pipecat-based backend with WebRTC/WS voice routes, Next.js frontend, and Docker Compose orchestration. Co-authored-by: Cursor <cursoragent@cursor.com>
57 lines
2.6 KiB
Python
57 lines
2.6 KiB
Python
"""数据表定义(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()
|
|
)
|