112 lines
4.6 KiB
Python
112 lines
4.6 KiB
Python
from sqlalchemy import Column, String, UUID, DateTime, ForeignKey, JSON, Text, BigInteger, CheckConstraint, Boolean
|
|
from sqlalchemy.sql import func
|
|
from src.config.database import Base
|
|
import uuid
|
|
|
|
class Client(Base):
|
|
__tablename__ = "clients"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
name = Column(String, nullable=False)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
class Contact(Base):
|
|
__tablename__ = "contacts"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
client_id = Column(UUID(as_uuid=True), ForeignKey("clients.id", ondelete="CASCADE"))
|
|
ext_id = Column(String)
|
|
name = Column(String)
|
|
meta = Column(JSON, default={})
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
class Agent(Base):
|
|
__tablename__ = "agents"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
client_id = Column(UUID(as_uuid=True), ForeignKey("clients.id", ondelete="CASCADE"))
|
|
name = Column(String, nullable=False)
|
|
description = Column(Text, nullable=True)
|
|
type = Column(String, nullable=False)
|
|
model = Column(String, nullable=True, default="")
|
|
api_key = Column(String, nullable=True, default="")
|
|
instruction = Column(Text)
|
|
config = Column(JSON, default={})
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
__table_args__ = (
|
|
CheckConstraint("type IN ('llm', 'sequential', 'parallel', 'loop')", name='check_agent_type'),
|
|
)
|
|
|
|
def to_dict(self):
|
|
"""Converte o objeto para dicionário, convertendo UUIDs para strings"""
|
|
result = {}
|
|
for key, value in self.__dict__.items():
|
|
if key.startswith('_'):
|
|
continue
|
|
if isinstance(value, uuid.UUID):
|
|
result[key] = str(value)
|
|
elif isinstance(value, dict):
|
|
result[key] = self._convert_dict(value)
|
|
elif isinstance(value, list):
|
|
result[key] = [self._convert_dict(item) if isinstance(item, dict) else str(item) if isinstance(item, uuid.UUID) else item for item in value]
|
|
else:
|
|
result[key] = value
|
|
return result
|
|
|
|
def _convert_dict(self, d):
|
|
"""Converte UUIDs em um dicionário para strings"""
|
|
result = {}
|
|
for key, value in d.items():
|
|
if isinstance(value, uuid.UUID):
|
|
result[key] = str(value)
|
|
elif isinstance(value, dict):
|
|
result[key] = self._convert_dict(value)
|
|
elif isinstance(value, list):
|
|
result[key] = [self._convert_dict(item) if isinstance(item, dict) else str(item) if isinstance(item, uuid.UUID) else item for item in value]
|
|
else:
|
|
result[key] = value
|
|
return result
|
|
|
|
class MCPServer(Base):
|
|
__tablename__ = "mcp_servers"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
name = Column(String, nullable=False)
|
|
description = Column(Text, nullable=True)
|
|
config_json = Column(JSON, nullable=False, default={})
|
|
environments = Column(JSON, nullable=False, default={})
|
|
tools = Column(JSON, nullable=False, default=[])
|
|
type = Column(String, nullable=False, default="official")
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
__table_args__ = (
|
|
CheckConstraint("type IN ('official', 'community')", name='check_mcp_server_type'),
|
|
)
|
|
|
|
class Tool(Base):
|
|
__tablename__ = "tools"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
name = Column(String, nullable=False)
|
|
description = Column(Text, nullable=True)
|
|
config_json = Column(JSON, nullable=False, default={})
|
|
environments = Column(JSON, nullable=False, default={})
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
class Session(Base):
|
|
__tablename__ = "sessions"
|
|
# A diretiva abaixo faz com que o Alembic ignore esta tabela nas migrações
|
|
__table_args__ = {'extend_existing': True, 'info': {'skip_autogenerate': True}}
|
|
|
|
id = Column(String, primary_key=True)
|
|
app_name = Column(String)
|
|
user_id = Column(String)
|
|
state = Column(JSON)
|
|
create_time = Column(DateTime(timezone=True))
|
|
update_time = Column(DateTime(timezone=True)) |