from typing import Optional from sqlmodel import Field, SQLModel from datetime import datetime class BotInstance(SQLModel, table=True): id: str = Field(primary_key=True) name: str avatar_model: str = Field(default="base") avatar_skin: Optional[str] = Field(default="blue_suit") system_prompt: Optional[str] = Field(default=None) soul_md: Optional[str] = Field(default=None) agents_md: Optional[str] = Field(default=None) user_md: Optional[str] = Field(default=None) tools_md: Optional[str] = Field(default=None) tools_config_json: Optional[str] = Field(default=None) # JSON string for runtime tools config identity_md: Optional[str] = Field(default=None) llm_provider: str llm_model: str api_key: str # Encrypted api_base: Optional[str] = Field(default=None) temperature: float = Field(default=0.2) top_p: float = Field(default=1.0) max_tokens: int = Field(default=8192) presence_penalty: float = Field(default=0.0) frequency_penalty: float = Field(default=0.0) send_progress: bool = Field(default=False) send_tool_hints: bool = Field(default=False) workspace_dir: str = Field(unique=True) docker_status: str = Field(default="STOPPED", index=True) current_state: Optional[str] = Field(default="IDLE") last_action: Optional[str] = Field(default=None) image_tag: str = Field(default="nanobot-base:v0.1.4") # 记录该机器人使用的镜像版本 created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) class BotMessage(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) bot_id: str = Field(foreign_key="botinstance.id", index=True) role: str = Field(index=True) # user | assistant | system text: str media_json: Optional[str] = Field(default=None) # JSON string list of workspace-relative file paths created_at: datetime = Field(default_factory=datetime.utcnow, index=True) class NanobotImage(SQLModel, table=True): tag: str = Field(primary_key=True) # e.g., nanobot-base:v0.1.4 image_id: Optional[str] = Field(default=None) # Docker 内部的 Image ID version: str # e.g., 0.1.4 status: str = Field(default="READY") # READY, BUILDING, ERROR source_dir: Optional[str] = Field(default=None) # 本地来源标识(如 manual) created_at: datetime = Field(default_factory=datetime.utcnow)