fix: restore models.py to 1346fbb baseline

Recovers 7 model classes (UserStorageQuota, AutomatedTask, ExternalKBService,
KnowledgeDocumentChunk, MCPServer, OSSStorageConfig, TaskExecutionLog) and the
gen_uuid helper that were lost in the mass file-deletion (5d7f32d). These are
required by the restored admin modules (storage_admin/asset_admin/etc). Verified
at runtime: /health=200 and all restored admin routers serve 200.
This commit is contained in:
workbuddy committed 2026-07-11 16:28:47 +08:00
1 parent 6d5e215a9f
commit da0ab6496c
1 file changed
+164
+164
View File
@@ -65,6 +65,9 @@ class ApiKey(Base):
last_used_at = Column(DateTime, default=None) last_used_at = Column(DateTime, default=None)
created_at = Column(DateTime, default=datetime.now) created_at = Column(DateTime, default=datetime.now)
expired_at = Column(DateTime, default=None) expired_at = Column(DateTime, default=None)
description = Column(String(500), default=None, comment="密钥描述")
rate_limit = Column(Integer, default=60, comment="速率限制(请求/分钟)")
total_calls = Column(BigInteger, default=0, comment="总调用次数")
# ============================================================ # ============================================================
@@ -81,6 +84,8 @@ class Conversation(Base):
status = Column(String(10), nullable=False, default="active") # active / archived status = Column(String(10), nullable=False, default="active") # active / archived
pinned = Column(Boolean, default=False) pinned = Column(Boolean, default=False)
knowledge_graph_count = Column(Integer, default=0) knowledge_graph_count = Column(Integer, default=0)
knowledge_graph_base_id = Column(String(64), default=None, comment="已生成的知识图谱知识库ID")
source = Column(String(32), default=None, comment="对话来源,如 wechat_bot")
created_at = Column(DateTime, default=datetime.now) created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now) updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
@@ -165,6 +170,12 @@ class KnowledgeBase(Base):
knowledge_graph_count = Column(Integer, default=0) knowledge_graph_count = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.now) created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now) updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
is_official = Column(Boolean, default=False)
status = Column(String(20), default="active")
external_service_id = Column(String(36), default=None)
external_id = Column(String(100), default=None)
external_sync_status = Column(String(20), default="none")
external_config = Column(JSON, default=None)
class KnowledgeDirectory(Base): class KnowledgeDirectory(Base):
@@ -196,6 +207,28 @@ class KnowledgeDocument(Base):
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now) updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
class KnowledgeDocumentChunk(Base):
"""知识库文档分段表 — Stage C.1"""
__tablename__ = "knowledge_document_chunks"
id = Column(String(36), primary_key=True, default=gen_uuid)
document_id = Column(String(36), ForeignKey("knowledge_documents.id"), nullable=False)
knowledge_base_id = Column(String(36), ForeignKey("knowledge_bases.id"), nullable=False)
chunk_index = Column(Integer, nullable=False, default=0, comment="分段序号")
content = Column(Text, nullable=False, comment="分段文本内容")
start_char = Column(Integer, default=0, comment="起始字符位置")
end_char = Column(Integer, default=0, comment="结束字符位置")
chunk_metadata = Column(JSON, default=None, comment="分段元数据(标题、关键词等)")
token_count = Column(Integer, default=0, comment="分段token数估算")
created_at = Column(DateTime, default=datetime.now)
__table_args__ = (
Index("idx_kdc_doc_id", "document_id"),
Index("idx_kdc_kb_id", "knowledge_base_id"),
)
class KnowledgeGraphNode(Base): class KnowledgeGraphNode(Base):
__tablename__ = "knowledge_graph_nodes" __tablename__ = "knowledge_graph_nodes"
@@ -316,6 +349,23 @@ class MembershipPlan(Base):
features = Column(JSON, default=None) features = Column(JSON, default=None)
free_app_ids = Column(JSON, default=None) free_app_ids = Column(JSON, default=None)
free_model_ids = Column(JSON, default=None) free_model_ids = Column(JSON, default=None)
# 配额字段
max_agents = Column(Integer, default=5)
max_workflows = Column(Integer, default=3)
max_knowledge_bases = Column(Integer, default=2)
max_storage_mb = Column(Integer, default=1024)
api_calls_per_day = Column(Integer, default=100)
api_calls_per_min = Column(Integer, default=10)
# 权限字段
can_publish_apps = Column(Boolean, default=False)
can_create_api_keys = Column(Boolean, default=False)
can_use_workflow = Column(Boolean, default=False)
can_use_mcp = Column(Boolean, default=False)
can_use_code_exec = Column(Boolean, default=False)
can_use_privacy_mode = Column(Boolean, default=False)
can_use_dag = Column(Boolean, default=False)
allowed_model_tiers = Column(JSON, default=None)
permissions = Column(JSON, default=None)
is_active = Column(Boolean, default=True) is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.now) created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now) updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
@@ -455,6 +505,7 @@ class AIModel(Base):
id = Column(String(36), primary_key=True, default=gen_uuid) id = Column(String(36), primary_key=True, default=gen_uuid)
provider_id = Column(String(36), ForeignKey("model_providers.id"), nullable=False) provider_id = Column(String(36), ForeignKey("model_providers.id"), nullable=False)
name = Column(String(100), nullable=False) name = Column(String(100), nullable=False)
display_name = Column(String(200), default=None, comment="display name")
api_key = Column(String(255), default=None) api_key = Column(String(255), default=None)
endpoint = Column(String(500), default=None) endpoint = Column(String(500), default=None)
capabilities = Column(JSON, default=None) capabilities = Column(JSON, default=None)
@@ -577,6 +628,7 @@ class EmailConfig(Base):
password = Column(String(200), nullable=False) password = Column(String(200), nullable=False)
from_address = Column(String(200), nullable=False) from_address = Column(String(200), nullable=False)
use_tls = Column(Boolean, default=True) use_tls = Column(Boolean, default=True)
use_ssl = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.now) created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now) updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
@@ -742,6 +794,8 @@ class OpenApiClient(Base):
rate_limit = Column(Integer, default=60) rate_limit = Column(Integer, default=60)
status = Column(String(10), nullable=False, default="active") status = Column(String(10), nullable=False, default="active")
created_at = Column(DateTime, default=datetime.now) created_at = Column(DateTime, default=datetime.now)
total_calls = Column(BigInteger, default=0, comment="总调用次数")
last_used_at = Column(DateTime, default=None, comment="最后使用时间")
# ============================================================ # ============================================================
@@ -935,3 +989,113 @@ class TeamSharedSkill(Base):
__table_args__ = ( __table_args__ = (
UniqueConstraint("team_id", "skill_id", name="uk_tss_team_skill"), UniqueConstraint("team_id", "skill_id", name="uk_tss_team_skill"),
) )
class ExternalKBService(Base):
"""外部知识库服务配置"""
__tablename__ = "external_kb_services"
id = Column(String(36), primary_key=True, default=gen_uuid)
name = Column(String(200), nullable=False)
service_type = Column(String(20), nullable=False)
api_url = Column(String(500), nullable=False)
api_key = Column(String(255), default="")
config = Column(JSON, default=None)
is_enabled = Column(Boolean, default=True)
status = Column(String(20), default="disconnected")
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
class OSSStorageConfig(Base):
__tablename__ = "oss_storage_configs"
id = Column(String(36), primary_key=True, default=gen_uuid)
name = Column(String(200), nullable=False)
provider = Column(String(20), nullable=False)
endpoint = Column(String(500), nullable=False)
access_key = Column(String(255), nullable=False)
secret_key = Column(String(255), nullable=False)
bucket = Column(String(200), nullable=False)
region = Column(String(100), default="")
base_path = Column(String(300), default="")
is_default = Column(Boolean, default=False)
is_enabled = Column(Boolean, default=True)
status = Column(String(20), default="disconnected")
config = Column(JSON, default=None)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
class UserStorageQuota(Base):
__tablename__ = "user_storage_quotas"
id = Column(String(36), primary_key=True, default=gen_uuid)
user_id = Column(String(36), nullable=False, unique=True)
quota_bytes = Column(BigInteger, nullable=False, default=1073741824)
used_bytes = Column(BigInteger, nullable=False, default=0)
quota_type = Column(String(20), nullable=False, default="membership")
membership_level = Column(Integer, default=0)
plan_id = Column(String(36), default=None)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
class AutomatedTask(Base):
__tablename__ = "automated_tasks"
id = Column(String(36), primary_key=True, default=gen_uuid)
name = Column(String(200), nullable=False)
description = Column(Text, default="")
trigger_type = Column(String(20), nullable=False)
cron_expression = Column(String(100), default=None)
event_condition = Column(JSON, default=None)
action_type = Column(String(30), nullable=False)
action_config = Column(JSON, default=None)
is_enabled = Column(Boolean, default=True)
status = Column(String(20), default="idle")
max_retries = Column(Integer, default=3)
timeout_seconds = Column(Integer, default=300)
last_run_at = Column(DateTime, default=None)
next_run_at = Column(DateTime, default=None)
total_runs = Column(Integer, default=0)
success_runs = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
class TaskExecutionLog(Base):
__tablename__ = "task_execution_logs"
id = Column(String(36), primary_key=True, default=gen_uuid)
task_id = Column(String(36), nullable=False)
task_name = Column(String(200), default="")
status = Column(String(20), default="running")
trigger_type = Column(String(20), default="manual")
started_at = Column(DateTime, default=None)
finished_at = Column(DateTime, default=None)
duration_ms = Column(Integer, default=0)
result_summary = Column(Text, default="")
error_message = Column(Text, default="")
created_at = Column(DateTime, default=datetime.now)
class MCPServer(Base):
__tablename__ = "mcp_servers"
id = Column(String(36), primary_key=True, default=gen_uuid)
name = Column(String(100), nullable=False)
description = Column(Text, default="")
transport_type = Column(String(20), default="stdio")
command = Column(String(500), default="")
args = Column(Text, default="")
env_vars = Column(Text, default="")
url = Column(String(500), default="")
headers = Column(Text, default="")
is_enabled = Column(Boolean, default=True)
status = Column(String(20), default="disconnected")
last_connected_at = Column(DateTime, default=None)
tools_count = Column(Integer, default=0)
resources_count = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)