from pydantic import BaseModel, EmailStr, Field from typing import Optional class AiAgent(BaseModel): agent_id: int agent_name: str agent_description: str | None = Field(default=None, title="The description of the agent", max_length=300) agent_purpose: str | None = Field(default=None, title="The purpose of the agent", max_length=200) agent_version: str | None = Field(default=None, title="The version of the agent", max_length=100) agent_status: str | None = Field(default=None, title="The status of the agent", max_length=100, enum=['Active', 'Inactive', 'Deprecated', 'Development']) agent_location: str | None = Field(default=None, title="The location of the agent", max_length=100) agent_department: str | None = Field(default=None, title="The department of the agent", max_length=100) agent_contact_person: str | None = Field(default=None, title="The contact person for the agent", max_length=100) agent_created_at: str | None = Field(default=None, title="The creation date of the agent", max_length=100) agent_updated_at: str | None = Field(default=None, title="The last update date of the agent", max_length=100) agent_tags: list[str] | None = Field(default=None, title="Tags associated with the agent", max_length=100) agent_metadata: dict[str, str] | None = Field(default=None, title="Metadata associated with the agent") agent_userbase: list[str] | None = Field(default=None, title="Userbase associated with the agent") agent_capabilities: list[str] | None = Field(default=None, title="Capabilities of the agent") # User Base Model class UserCreate(BaseModel): email: EmailStr password: str full_name: Optional[str] = None class UserLogin(BaseModel): email: EmailStr password: str class UserResponse(BaseModel): email: EmailStr full_name: Optional[str] = None is_active: bool is_admin: bool class UserUpdate(BaseModel): full_name: Optional[str] = None is_active: Optional[bool] = None is_admin: Optional[bool] = None class Token(BaseModel): access_token: str token_type: str = "bearer" # Agent models for creation and response class AiAgentCreate(BaseModel): agent_name: str agent_description: Optional[str] = None agent_purpose: Optional[str] = None agent_version: Optional[str] = None agent_status: Optional[str] = "Development" agent_location: Optional[str] = None agent_department: Optional[str] = None agent_contact_person: Optional[str] = None agent_tags: Optional[list[str]] = None agent_metadata: Optional[dict[str, str]] = None agent_userbase: Optional[list[str]] = None agent_capabilities: Optional[list[str]] = None class AiAgentResponse(BaseModel): agent_id: str agent_name: str agent_description: Optional[str] = None agent_purpose: Optional[str] = None agent_version: Optional[str] = None agent_status: Optional[str] = None agent_location: Optional[str] = None agent_department: Optional[str] = None agent_contact_person: Optional[str] = None agent_created_at: Optional[str] = None agent_updated_at: Optional[str] = None agent_tags: Optional[list[str]] = None agent_metadata: Optional[dict[str, str]] = None agent_userbase: Optional[list[str]] = None agent_capabilities: Optional[list[str]] = None created_by: str # Agent Collector API Models (for compatibility with agent_collector app) class AgentCollectorCreate(BaseModel): name: str = Field(min_length=1) description: str = Field(min_length=1) purpose: str = Field(min_length=1) location: Optional[str] = None userbase: Optional[list[str]] = None version: Optional[str] = None creation_date: Optional[str] = None # ISO 8601 datetime string last_updated: Optional[str] = None # ISO 8601 datetime string capabilities: Optional[list[str]] = None status: Optional[str] = Field(default="development", pattern="^(?i)(active|inactive|deprecated|development)$") department: Optional[str] = None contact_person: Optional[str] = None tags: Optional[list[str]] = None metadata: Optional[dict] = None class AgentCollectorResponse(BaseModel): status: str = "success" message: str = "Agent data collected successfully" agent_id: str class HealthCheckResponse(BaseModel): status: str message: str timestamp: str database: dict class AgentUsageTrackingResponse(BaseModel): status: str = "usage_logged" message: str = "Agent already exists, usage tracked" agent_name: str class AgentUsageRecord(BaseModel): agent_name: str agent_data: dict timestamp: str usage_count: Optional[int] = None class AgentUsageStatsResponse(BaseModel): agent_name: str total_usage_count: int first_usage: Optional[str] = None last_usage: Optional[str] = None usage_by_period: dict