first commit

This commit is contained in:
2026-04-07 16:05:05 +08:00
commit 9d9bdbb1ce
136 changed files with 5103 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from .user import User
from .workspace import Workspace
from .agent import Agent
from .conversation import Conversation
from .message import Message
from .tool import Tool, AgentTool
from .skill import Skill
from .memory import Memory
from .model import Model
from .cron_job import CronJob
from .channel import Channel
+37
View File
@@ -0,0 +1,37 @@
from .base import BaseModel
from . import db
class Agent(BaseModel):
__tablename__ = "agents"
workspace_id = db.Column(
db.BigInteger,
db.ForeignKey("workspaces.id"),
nullable=False,
comment="工作空间ID",
)
name = db.Column(db.String(100), nullable=False, comment="Agent 名称")
description = db.Column(db.Text, nullable=True, comment="描述")
system_prompt = db.Column(db.Text, nullable=True, comment="系统提示词")
model_id = db.Column(db.String(50), nullable=True, comment="模型ID")
temperature = db.Column(
db.Numeric(3, 2), default=0.70, nullable=False, comment="温度参数"
)
max_tokens = db.Column(
db.Integer, default=2000, nullable=False, comment="最大Token数"
)
is_active = db.Column(db.Boolean, default=True, nullable=False, comment="是否激活")
conversations = db.relationship(
"Conversation", backref="agent", lazy=True, cascade="all, delete-orphan"
)
tools = db.relationship(
"AgentTool", backref="agent", lazy=True, cascade="all, delete-orphan"
)
cron_jobs = db.relationship(
"CronJob", backref="agent", lazy=True, cascade="all, delete-orphan"
)
memories = db.relationship(
"Memory", backref="agent", lazy=True, cascade="all, delete-orphan"
)
+30
View File
@@ -0,0 +1,30 @@
from datetime import datetime
from . import db
class BaseModel(db.Model):
__abstract__ = True
id = db.Column(db.BigInteger, primary_key=True, autoincrement=True, comment="ID")
created_at = db.Column(
db.DateTime, default=datetime.utcnow, nullable=False, comment="创建时间"
)
updated_at = db.Column(
db.DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow,
nullable=False,
comment="更新时间",
)
def to_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
def save(self):
db.session.add(self)
db.session.commit()
return self
def delete(self):
db.session.delete(self)
db.session.commit()
+15
View File
@@ -0,0 +1,15 @@
from .base import BaseModel
from . import db
class Channel(BaseModel):
__tablename__ = "channels"
type = db.Column(
db.String(50),
nullable=False,
comment="类型(web, dingtalk, feishu, telegram, discord, qq",
)
name = db.Column(db.String(100), nullable=False, comment="渠道名称")
config = db.Column(db.JSON, nullable=False, comment="配置(JSON")
is_active = db.Column(db.Boolean, default=True, nullable=False, comment="是否激活")
+34
View File
@@ -0,0 +1,34 @@
from .base import BaseModel
from . import db
class Conversation(BaseModel):
__tablename__ = "conversations"
workspace_id = db.Column(
db.BigInteger,
db.ForeignKey("workspaces.id"),
nullable=False,
comment="工作空间ID",
)
agent_id = db.Column(
db.BigInteger, db.ForeignKey("agents.id"), nullable=False, comment="Agent ID"
)
title = db.Column(db.String(200), nullable=True, comment="会话标题")
channel = db.Column(
db.String(50),
default="web",
nullable=False,
comment="渠道(web, dingtalk, feishu, telegram, discord",
)
channel_user_id = db.Column(db.String(100), nullable=True, comment="渠道用户ID")
status = db.Column(
db.String(20),
default="active",
nullable=False,
comment="状态(active, archived, deleted",
)
messages = db.relationship(
"Message", backref="conversation", lazy=True, cascade="all, delete-orphan"
)
+16
View File
@@ -0,0 +1,16 @@
from .base import BaseModel
from . import db
class CronJob(BaseModel):
__tablename__ = "cron_jobs"
agent_id = db.Column(
db.BigInteger, db.ForeignKey("agents.id"), nullable=False, comment="Agent ID"
)
name = db.Column(db.String(100), nullable=False, comment="任务名称")
cron_expression = db.Column(db.String(50), nullable=False, comment="Cron 表达式")
prompt = db.Column(db.Text, nullable=False, comment="执行提示词")
is_active = db.Column(db.Boolean, default=True, nullable=False, comment="是否激活")
last_run_at = db.Column(db.DateTime, nullable=True, comment="上次运行时间")
next_run_at = db.Column(db.DateTime, nullable=True, comment="下次运行时间")
+24
View File
@@ -0,0 +1,24 @@
from .base import BaseModel
from . import db
class Memory(BaseModel):
__tablename__ = "memories"
workspace_id = db.Column(
db.BigInteger,
db.ForeignKey("workspaces.id"),
nullable=False,
comment="工作空间ID",
)
agent_id = db.Column(
db.BigInteger, db.ForeignKey("agents.id"), nullable=True, comment="Agent ID"
)
type = db.Column(
db.String(50), nullable=False, comment="类型(profile, memory, note"
)
content = db.Column(db.Text, nullable=False, comment="内容")
tags = db.Column(db.JSON, nullable=True, comment="标签")
importance = db.Column(
db.Integer, default=5, nullable=False, comment="重要性(1-10"
)
+38
View File
@@ -0,0 +1,38 @@
import json
from .base import BaseModel
from . import db
class Message(BaseModel):
__tablename__ = "messages"
conversation_id = db.Column(
db.BigInteger,
db.ForeignKey("conversations.id"),
nullable=False,
comment="会话ID",
)
role = db.Column(
db.String(20), nullable=False, comment="角色(user, assistant, system"
)
content = db.Column(db.Text, nullable=False, comment="消息内容")
tokens = db.Column(db.Integer, nullable=True, comment="Token数")
model = db.Column(db.String(50), nullable=True, comment="使用的模型")
tool_calls = db.Column(db.JSON, nullable=True, comment="工具调用记录")
metadata = db.Column(db.JSON, nullable=True, comment="元数据")
def to_dict(self):
result = super().to_dict()
if result.get("tool_calls"):
result["tool_calls"] = (
json.loads(result["tool_calls"])
if isinstance(result["tool_calls"], str)
else result["tool_calls"]
)
if result.get("metadata"):
result["metadata"] = (
json.loads(result["metadata"])
if isinstance(result["metadata"], str)
else result["metadata"]
)
return result
+14
View File
@@ -0,0 +1,14 @@
from .base import BaseModel
from . import db
class Model(BaseModel):
__tablename__ = 'models'
provider = db.Column(db.String(50), nullable=False, comment='提供商(dashscope, openai, anthropic, etc')
name = db.Column(db.String(100), nullable=False, comment='模型名称')
model_id = db.Column(db.String(100), nullable=False, comment='模型ID(如 qwen-plus')
api_key = db.Column(db.String(255), nullable=True, comment='API Key')
base_url = db.Column(db.String(255), nullable=True, comment='API Base URL')
is_default = db.Column(db.Boolean, default=False, nullable=False, comment='是否默认')
is_active = db.Column(db.Boolean, default=True, nullable=False, comment='是否激活')
+17
View File
@@ -0,0 +1,17 @@
from .base import BaseModel
from . import db
class Skill(BaseModel):
__tablename__ = "skills"
name = db.Column(db.String(100), nullable=False, comment="技能名称")
version = db.Column(db.String(20), default="1.0.0", nullable=False, comment="版本")
description = db.Column(db.Text, nullable=True, comment="描述")
author = db.Column(db.String(100), nullable=True, comment="作者")
repository = db.Column(db.String(255), nullable=True, comment="仓库地址")
config = db.Column(db.JSON, nullable=True, comment="配置(JSON")
is_installed = db.Column(
db.Boolean, default=False, nullable=False, comment="是否已安装"
)
is_active = db.Column(db.Boolean, default=True, nullable=False, comment="是否激活")
+29
View File
@@ -0,0 +1,29 @@
from .base import BaseModel
from . import db
class Tool(BaseModel):
__tablename__ = "tools"
name = db.Column(db.String(100), unique=True, nullable=False, comment="工具名称")
type = db.Column(
db.String(50), nullable=False, comment="类型(builtin, mcp, custom"
)
description = db.Column(db.Text, nullable=True, comment="描述")
config = db.Column(db.JSON, nullable=True, comment="配置(JSON")
is_active = db.Column(db.Boolean, default=True, nullable=False, comment="是否激活")
agent_tools = db.relationship(
"AgentTool", backref="tool", lazy=True, cascade="all, delete-orphan"
)
class AgentTool(BaseModel):
__tablename__ = "agent_tools"
agent_id = db.Column(
db.BigInteger, db.ForeignKey("agents.id"), nullable=False, comment="Agent ID"
)
tool_id = db.Column(
db.BigInteger, db.ForeignKey("tools.id"), nullable=False, comment="工具ID"
)
+19
View File
@@ -0,0 +1,19 @@
from .base import BaseModel
from . import db
class User(BaseModel):
__tablename__ = "users"
username = db.Column(db.String(50), unique=True, nullable=False, comment="用户名")
password = db.Column(db.String(255), nullable=False, comment="密码(加密)")
email = db.Column(db.String(100), unique=True, nullable=True, comment="邮箱")
avatar = db.Column(db.String(255), nullable=True, comment="头像URL")
is_active = db.Column(db.Boolean, default=True, nullable=False, comment="是否激活")
is_admin = db.Column(
db.Boolean, default=False, nullable=False, comment="是否管理员"
)
workspaces = db.relationship(
"Workspace", backref="user", lazy=True, cascade="all, delete-orphan"
)
+25
View File
@@ -0,0 +1,25 @@
from .base import BaseModel
from . import db
class Workspace(BaseModel):
__tablename__ = "workspaces"
user_id = db.Column(
db.BigInteger, db.ForeignKey("users.id"), nullable=False, comment="用户ID"
)
name = db.Column(db.String(100), nullable=False, comment="工作空间名称")
description = db.Column(db.Text, nullable=True, comment="描述")
is_default = db.Column(
db.Boolean, default=False, nullable=False, comment="是否默认"
)
agents = db.relationship(
"Agent", backref="workspace", lazy=True, cascade="all, delete-orphan"
)
conversations = db.relationship(
"Conversation", backref="workspace", lazy=True, cascade="all, delete-orphan"
)
memories = db.relationship(
"Memory", backref="workspace", lazy=True, cascade="all, delete-orphan"
)