API Models

Pydantic models used in the GatheRing API.

Agent Models

AgentCreate

class AgentCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    role: Optional[str] = Field(None, max_length=100)
    provider: str = Field(default="anthropic")  # openai, anthropic, ollama
    model: str = Field(default="claude-sonnet-4-20250514")
    personality: Optional[PersonalityConfig] = None
    background: Optional[BackgroundConfig] = None
    config: Optional[AgentConfig] = None

AgentUpdate

class AgentUpdate(BaseModel):
    name: Optional[str] = Field(None, min_length=1, max_length=100)
    role: Optional[str] = None
    model: Optional[str] = None
    personality: Optional[PersonalityConfig] = None
    config: Optional[AgentConfig] = None

AgentResponse

class AgentResponse(BaseModel):
    id: int
    name: str
    role: Optional[str]
    model: str
    personality: Optional[PersonalityConfig]
    config: Optional[AgentConfig]
    status: AgentStatus
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True

PersonalityConfig

class PersonalityConfig(BaseModel):
    traits: list[str] = Field(default_factory=list)
    communication_style: Optional[str] = "professional"
    languages: list[str] = Field(default_factory=lambda: ["English"])

AgentConfig

class AgentConfig(BaseModel):
    temperature: float = Field(default=0.7, ge=0, le=2)
    max_tokens: int = Field(default=4096, ge=1)
    tools: list[str] = Field(default_factory=list)

AgentStatus

class AgentStatus(str, Enum):
    IDLE = "idle"
    ACTIVE = "active"
    BUSY = "busy"
    OFFLINE = "offline"

Circle Models

CircleCreate

class CircleCreate(BaseModel):
    name: str = Field(..., pattern="^[a-z0-9-]+$", max_length=50)
    display_name: Optional[str] = Field(None, max_length=200)
    description: Optional[str] = None
    config: Optional[CircleConfig] = None

CircleResponse

class CircleResponse(BaseModel):
    id: int
    name: str
    display_name: Optional[str]
    description: Optional[str]
    config: Optional[CircleConfig]
    status: CircleStatus
    agent_count: int
    created_at: datetime

    class Config:
        from_attributes = True

CircleConfig

class CircleConfig(BaseModel):
    max_agents: int = Field(default=10, ge=1, le=50)
    conversation_mode: str = Field(default="round_robin")
    turn_timeout: int = Field(default=30, ge=1)
    max_turns_per_conversation: int = Field(default=50, ge=1)
    memory_scope: str = Field(default="circle")
    allow_tools: bool = True

CircleStatus

class CircleStatus(str, Enum):
    CREATED = "created"
    ACTIVE = "active"
    PAUSED = "paused"
    ARCHIVED = "archived"

Conversation Models

ConversationCreate

class ConversationCreate(BaseModel):
    circle_name: str
    topic: str = Field(..., min_length=1, max_length=500)
    agent_ids: list[int] = Field(..., min_items=1)
    initial_prompt: Optional[str] = None
    max_turns: int = Field(default=50, ge=1)

ConversationResponse

class ConversationResponse(BaseModel):
    id: int
    circle_id: int
    topic: str
    status: ConversationStatus
    turn_count: int
    created_at: datetime
    ended_at: Optional[datetime]

    class Config:
        from_attributes = True

ConversationAdvance

class ConversationAdvance(BaseModel):
    prompt: Optional[str] = None
    agent_id: Optional[int] = None

MessageResponse

class MessageResponse(BaseModel):
    id: int
    conversation_id: int
    agent_id: int
    agent_name: str
    content: str
    role: str
    created_at: datetime

    class Config:
        from_attributes = True

Workspace Models

WorkspaceInfo

class WorkspaceInfo(BaseModel):
    id: int
    path: str
    name: str
    git_enabled: bool
    current_branch: Optional[str]

FileInfo

class FileInfo(BaseModel):
    path: str
    name: str
    type: str  # "file" or "directory"
    size: Optional[int]
    modified_at: Optional[datetime]

FileContent

class FileContent(BaseModel):
    path: str
    content: str
    language: Optional[str]
    size: int

FileWrite

class FileWrite(BaseModel):
    content: str

GitStatus

class GitStatus(BaseModel):
    branch: str
    ahead: int
    behind: int
    staged: list[str]
    modified: list[str]
    untracked: list[str]
    deleted: list[str]

GitCommit

class GitCommit(BaseModel):
    hash: str
    short_hash: str
    message: str
    author: str
    date: datetime

GitStage

class GitStage(BaseModel):
    files: list[str]

GitCommitCreate

class GitCommitCreate(BaseModel):
    message: str = Field(..., min_length=1, max_length=500)

Memory Models

MemoryCreate

class MemoryCreate(BaseModel):
    agent_id: Optional[int] = None
    scope: MemoryScope
    scope_id: Optional[int] = None
    memory_type: MemoryType = MemoryType.FACT
    key: str = Field(..., max_length=200)
    value: str
    tags: list[str] = Field(default_factory=list)
    importance: float = Field(default=0.5, ge=0, le=1)

MemoryResponse

class MemoryResponse(BaseModel):
    id: int
    agent_id: Optional[int]
    scope: MemoryScope
    memory_type: MemoryType
    key: str
    value: str
    importance: float
    created_at: datetime

    class Config:
        from_attributes = True

MemorySearchResult

class MemorySearchResult(BaseModel):
    id: int
    key: str
    value: str
    similarity: float
    scope: MemoryScope

MemoryScope

class MemoryScope(str, Enum):
    GLOBAL = "global"
    CIRCLE = "circle"
    AGENT = "agent"
    CONVERSATION = "conversation"

MemoryType

class MemoryType(str, Enum):
    FACT = "fact"
    PREFERENCE = "preference"
    EXPERIENCE = "experience"
    SKILL = "skill"
    RELATIONSHIP = "relationship"

Dashboard Models

DashboardStats

class DashboardStats(BaseModel):
    total_agents: int
    active_agents: int
    total_circles: int
    active_circles: int
    conversations_today: int
    messages_today: int

ActivityItem

class ActivityItem(BaseModel):
    id: int
    type: str
    title: str
    description: Optional[str]
    agent_id: Optional[int]
    agent_name: Optional[str]
    circle_id: Optional[int]
    circle_name: Optional[str]
    timestamp: datetime

Common Models

PaginatedResponse

class PaginatedResponse(BaseModel, Generic[T]):
    items: list[T]
    total: int
    page: int
    page_size: int
    pages: int

ErrorResponse

class ErrorResponse(BaseModel):
    detail: str
    code: Optional[str] = None

ValidationErrorResponse

class ValidationErrorResponse(BaseModel):
    detail: list[ValidationErrorItem]


class ValidationErrorItem(BaseModel):
    loc: list[str]
    msg: str
    type: str