Initial lightweight AI agent admin
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, JSON, String, Text
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from app.core.database import Base
|
||||
from app.models.base import TimestampMixin
|
||||
|
||||
|
||||
class LLMProvider(TimestampMixin, Base):
|
||||
__tablename__ = "ai_llm_provider"
|
||||
|
||||
name: Mapped[str] = mapped_column(String(100))
|
||||
code: Mapped[str] = mapped_column(String(80), unique=True, index=True)
|
||||
provider_type: Mapped[str] = mapped_column(String(40), default="openai_compatible")
|
||||
base_url: Mapped[str] = mapped_column(String(300), default="")
|
||||
api_key: Mapped[str] = mapped_column(String(500), default="")
|
||||
status: Mapped[str] = mapped_column(String(20), default="enabled")
|
||||
models: Mapped[list["LLMModel"]] = relationship("LLMModel", back_populates="provider")
|
||||
|
||||
|
||||
class LLMModel(TimestampMixin, Base):
|
||||
__tablename__ = "ai_llm_model"
|
||||
|
||||
provider_id: Mapped[str] = mapped_column(String(32), ForeignKey("ai_llm_provider.id"), index=True)
|
||||
name: Mapped[str] = mapped_column(String(120))
|
||||
display_name: Mapped[str] = mapped_column(String(120), default="")
|
||||
context_length: Mapped[int] = mapped_column(Integer, default=8192)
|
||||
supports_streaming: Mapped[bool] = mapped_column(Boolean, default=True)
|
||||
supports_function_call: Mapped[bool] = mapped_column(Boolean, default=False)
|
||||
default_temperature: Mapped[float] = mapped_column(Float, default=0.7)
|
||||
default_max_tokens: Mapped[int] = mapped_column(Integer, default=2048)
|
||||
status: Mapped[str] = mapped_column(String(20), default="enabled")
|
||||
provider: Mapped[LLMProvider] = relationship("LLMProvider", back_populates="models")
|
||||
|
||||
|
||||
class Agent(TimestampMixin, Base):
|
||||
__tablename__ = "ai_agent"
|
||||
|
||||
name: Mapped[str] = mapped_column(String(100))
|
||||
code: Mapped[str] = mapped_column(String(80), unique=True, index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
avatar: Mapped[str] = mapped_column(String(300), default="")
|
||||
status: Mapped[str] = mapped_column(String(20), default="draft")
|
||||
persona: Mapped[dict] = mapped_column(JSON, default=dict)
|
||||
system_prompt: Mapped[str] = mapped_column(Text, default="")
|
||||
model_id: Mapped[str | None] = mapped_column(String(32), ForeignKey("ai_llm_model.id"), nullable=True)
|
||||
temperature: Mapped[float] = mapped_column(Float, default=0.7)
|
||||
max_tokens: Mapped[int] = mapped_column(Integer, default=2048)
|
||||
tools: Mapped[list] = mapped_column(JSON, default=list)
|
||||
knowledge_base_ids: Mapped[list] = mapped_column(JSON, default=list)
|
||||
enable_memory: Mapped[bool] = mapped_column(Boolean, default=True)
|
||||
memory_window: Mapped[int] = mapped_column(Integer, default=10)
|
||||
model: Mapped[LLMModel | None] = relationship("LLMModel")
|
||||
|
||||
|
||||
class AgentConversation(TimestampMixin, Base):
|
||||
__tablename__ = "ai_agent_conversation"
|
||||
|
||||
agent_id: Mapped[str] = mapped_column(String(32), ForeignKey("ai_agent.id"), index=True)
|
||||
user_id: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
title: Mapped[str] = mapped_column(String(160), default="新建对话")
|
||||
total_tokens: Mapped[int] = mapped_column(Integer, default=0)
|
||||
agent: Mapped[Agent] = relationship("Agent")
|
||||
messages: Mapped[list["AgentMessage"]] = relationship("AgentMessage", back_populates="conversation")
|
||||
|
||||
|
||||
class AgentMessage(TimestampMixin, Base):
|
||||
__tablename__ = "ai_agent_message"
|
||||
|
||||
conversation_id: Mapped[str] = mapped_column(String(32), ForeignKey("ai_agent_conversation.id"), index=True)
|
||||
role: Mapped[str] = mapped_column(String(20))
|
||||
content: Mapped[str] = mapped_column(Text, default="")
|
||||
status: Mapped[str] = mapped_column(String(20), default="completed")
|
||||
reasoning_steps: Mapped[list] = mapped_column(JSON, default=list)
|
||||
total_tokens: Mapped[int] = mapped_column(Integer, default=0)
|
||||
elapsed_time: Mapped[int] = mapped_column(Integer, default=0)
|
||||
conversation: Mapped[AgentConversation] = relationship("AgentConversation", back_populates="messages")
|
||||
|
||||
|
||||
class Workflow(TimestampMixin, Base):
|
||||
__tablename__ = "ai_workflow"
|
||||
|
||||
name: Mapped[str] = mapped_column(String(100))
|
||||
code: Mapped[str] = mapped_column(String(80), unique=True, index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
status: Mapped[str] = mapped_column(String(20), default="draft")
|
||||
version: Mapped[int] = mapped_column(Integer, default=1)
|
||||
published_version: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
definition: Mapped[dict] = mapped_column(JSON, default=dict)
|
||||
published_definition: Mapped[dict] = mapped_column(JSON, default=dict)
|
||||
input_variables: Mapped[list] = mapped_column(JSON, default=list)
|
||||
output_variables: Mapped[list] = mapped_column(JSON, default=list)
|
||||
run_count: Mapped[int] = mapped_column(Integer, default=0)
|
||||
|
||||
|
||||
class WorkflowRun(TimestampMixin, Base):
|
||||
__tablename__ = "ai_workflow_run"
|
||||
|
||||
workflow_id: Mapped[str] = mapped_column(String(32), ForeignKey("ai_workflow.id"), index=True)
|
||||
status: Mapped[str] = mapped_column(String(20), default="running")
|
||||
trigger_type: Mapped[str] = mapped_column(String(40), default="api")
|
||||
inputs: Mapped[dict] = mapped_column(JSON, default=dict)
|
||||
outputs: Mapped[dict] = mapped_column(JSON, default=dict)
|
||||
execution_log: Mapped[list] = mapped_column(JSON, default=list)
|
||||
error_message: Mapped[str] = mapped_column(Text, default="")
|
||||
total_tokens: Mapped[int] = mapped_column(Integer, default=0)
|
||||
elapsed_time: Mapped[int] = mapped_column(Integer, default=0)
|
||||
started_at: Mapped[object | None] = mapped_column(DateTime, nullable=True)
|
||||
completed_at: Mapped[object | None] = mapped_column(DateTime, nullable=True)
|
||||
workflow: Mapped[Workflow] = relationship("Workflow")
|
||||
|
||||
|
||||
class KnowledgeBase(TimestampMixin, Base):
|
||||
__tablename__ = "ai_knowledge_base"
|
||||
|
||||
name: Mapped[str] = mapped_column(String(120))
|
||||
code: Mapped[str] = mapped_column(String(80), unique=True, index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
status: Mapped[str] = mapped_column(String(20), default="enabled")
|
||||
|
||||
|
||||
class AgentTeam(TimestampMixin, Base):
|
||||
__tablename__ = "ai_agent_team"
|
||||
|
||||
name: Mapped[str] = mapped_column(String(120))
|
||||
code: Mapped[str] = mapped_column(String(80), unique=True, index=True)
|
||||
description: Mapped[str] = mapped_column(Text, default="")
|
||||
mode: Mapped[str] = mapped_column(String(20), default="sequential")
|
||||
members: Mapped[list] = mapped_column(JSON, default=list)
|
||||
status: Mapped[str] = mapped_column(String(20), default="enabled")
|
||||
|
||||
|
||||
class CollaborationRun(TimestampMixin, Base):
|
||||
__tablename__ = "ai_collaboration_run"
|
||||
|
||||
team_id: Mapped[str] = mapped_column(String(32), ForeignKey("ai_agent_team.id"), index=True)
|
||||
task: Mapped[str] = mapped_column(Text, default="")
|
||||
status: Mapped[str] = mapped_column(String(20), default="running")
|
||||
messages: Mapped[list] = mapped_column(JSON, default=list)
|
||||
final_answer: Mapped[str] = mapped_column(Text, default="")
|
||||
elapsed_time: Mapped[int] = mapped_column(Integer, default=0)
|
||||
team: Mapped[AgentTeam] = relationship("AgentTeam")
|
||||
Reference in New Issue
Block a user