first commit
This commit is contained in:
@@ -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
|
||||
@@ -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"
|
||||
)
|
||||
@@ -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()
|
||||
@@ -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="是否激活")
|
||||
@@ -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"
|
||||
)
|
||||
@@ -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="下次运行时间")
|
||||
@@ -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)"
|
||||
)
|
||||
@@ -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
|
||||
@@ -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='是否激活')
|
||||
@@ -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="是否激活")
|
||||
@@ -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"
|
||||
)
|
||||
@@ -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"
|
||||
)
|
||||
@@ -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"
|
||||
)
|
||||
Reference in New Issue
Block a user