v2.0: Multi-user platform with agent catalog, admin panel, LLM providers
This commit is contained in:
+51
-7
@@ -1,28 +1,60 @@
|
||||
from sqlalchemy import Column, String, Text, DateTime, Integer, ForeignKey, JSON
|
||||
from sqlalchemy import Column, String, Text, DateTime, Integer, Boolean, ForeignKey, JSON
|
||||
from sqlalchemy.orm import relationship
|
||||
from datetime import datetime, timezone
|
||||
from database import Base
|
||||
|
||||
|
||||
class Agent(Base):
|
||||
__tablename__ = "agents"
|
||||
class User(Base):
|
||||
__tablename__ = "users"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
username = Column(String, unique=True, nullable=False)
|
||||
password_hash = Column(String, nullable=False)
|
||||
display_name = Column(String, default="")
|
||||
role = Column(String, default="user") # admin or user
|
||||
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
|
||||
|
||||
instances = relationship("AgentInstance", back_populates="user")
|
||||
|
||||
|
||||
class AgentCatalog(Base):
|
||||
__tablename__ = "agent_catalog"
|
||||
|
||||
id = Column(String, primary_key=True)
|
||||
name = Column(String, nullable=False)
|
||||
description = Column(Text, default="")
|
||||
category = Column(String, default="utility") # data, briefing, utility
|
||||
config_schema = Column(JSON, default=dict)
|
||||
default_config = Column(JSON, default=dict)
|
||||
supports_schedule = Column(Boolean, default=True)
|
||||
is_sub_agent = Column(Boolean, default=False)
|
||||
|
||||
instances = relationship("AgentInstance", back_populates="catalog_entry")
|
||||
|
||||
|
||||
class AgentInstance(Base):
|
||||
__tablename__ = "agent_instances"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||
catalog_id = Column(String, ForeignKey("agent_catalog.id"), nullable=False)
|
||||
name = Column(String, nullable=False)
|
||||
config = Column(JSON, default=dict)
|
||||
schedule = Column(String, default="manual")
|
||||
status = Column(String, default="active")
|
||||
config = Column(JSON, default=dict)
|
||||
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
|
||||
|
||||
runs = relationship("Run", back_populates="agent", order_by="Run.started_at.desc()")
|
||||
user = relationship("User", back_populates="instances")
|
||||
catalog_entry = relationship("AgentCatalog", back_populates="instances")
|
||||
runs = relationship("Run", back_populates="instance", order_by="Run.started_at.desc()")
|
||||
|
||||
|
||||
class Run(Base):
|
||||
__tablename__ = "runs"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
agent_id = Column(String, ForeignKey("agents.id"), nullable=False)
|
||||
instance_id = Column(Integer, ForeignKey("agent_instances.id"), nullable=False)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||
started_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
|
||||
finished_at = Column(DateTime, nullable=True)
|
||||
status = Column(String, default="running")
|
||||
@@ -30,4 +62,16 @@ class Run(Base):
|
||||
error = Column(Text, default="")
|
||||
metadata_ = Column("metadata", JSON, default=dict)
|
||||
|
||||
agent = relationship("Agent", back_populates="runs")
|
||||
instance = relationship("AgentInstance", back_populates="runs")
|
||||
|
||||
|
||||
class LLMProvider(Base):
|
||||
__tablename__ = "llm_providers"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
name = Column(String, nullable=False)
|
||||
provider_type = Column(String, default="anthropic") # anthropic, openai, litellm, ollama
|
||||
api_url = Column(String, default="")
|
||||
api_key = Column(String, default="")
|
||||
default_model = Column(String, default="")
|
||||
is_default = Column(Boolean, default=False)
|
||||
|
||||
Reference in New Issue
Block a user