Files
hive/backend/app/models/responses.py
anthonyrawlins ca18476efc Implement comprehensive API documentation system
 Features:
- Comprehensive Pydantic response models with examples
- Enhanced FastAPI configuration with rich OpenAPI metadata
- Centralized error handling with standardized error codes
- Professional Swagger UI styling and branding
- Health check endpoints with detailed component status
- Type-safe request/response models for all endpoints

📊 Coverage:
- Agent Management API fully documented
- Standardized error responses across all endpoints
- Interactive API documentation with try-it-now functionality
- Custom OpenAPI schema with authentication schemes

🛠️ Technical Improvements:
- Created app/models/responses.py with comprehensive models
- Added app/core/error_handlers.py for centralized error handling
- Enhanced app/api/agents.py with detailed documentation
- Custom documentation configuration in app/docs_config.py
- Global exception handlers for consistent error responses

🌐 Access Points:
- Swagger UI: /docs
- ReDoc: /redoc
- OpenAPI JSON: /openapi.json

This establishes professional-grade API documentation that matches
Hive's technical excellence and provides developers with comprehensive,
interactive documentation for efficient integration.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-12 10:21:08 +10:00

350 lines
14 KiB
Python

"""
Pydantic response models for Hive API
This module contains all standardized response models used across the Hive API.
These models provide consistent structure, validation, and OpenAPI documentation.
"""
from pydantic import BaseModel, Field
from typing import List, Dict, Any, Optional, Union
from datetime import datetime
from enum import Enum
class StatusEnum(str, Enum):
"""Standard status values used across the API"""
SUCCESS = "success"
ERROR = "error"
WARNING = "warning"
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
FAILED = "failed"
class AgentStatusEnum(str, Enum):
"""Agent status values"""
AVAILABLE = "available"
BUSY = "busy"
OFFLINE = "offline"
ERROR = "error"
class AgentTypeEnum(str, Enum):
"""Agent specialization types"""
KERNEL_DEV = "kernel_dev"
PYTORCH_DEV = "pytorch_dev"
PROFILER = "profiler"
DOCS_WRITER = "docs_writer"
TESTER = "tester"
CLI_GEMINI = "cli_gemini"
GENERAL_AI = "general_ai"
REASONING = "reasoning"
# Base Response Models
class BaseResponse(BaseModel):
"""Base response model with common fields"""
status: StatusEnum = Field(..., description="Response status indicator")
timestamp: datetime = Field(default_factory=datetime.utcnow, description="Response timestamp")
message: Optional[str] = Field(None, description="Human-readable message")
class ErrorResponse(BaseResponse):
"""Standard error response model"""
status: StatusEnum = Field(StatusEnum.ERROR, description="Always 'error' for error responses")
error_code: Optional[str] = Field(None, description="Machine-readable error code")
details: Optional[Dict[str, Any]] = Field(None, description="Additional error details")
class Config:
schema_extra = {
"example": {
"status": "error",
"timestamp": "2024-01-01T12:00:00Z",
"message": "Agent not found",
"error_code": "AGENT_NOT_FOUND",
"details": {"agent_id": "missing-agent"}
}
}
class SuccessResponse(BaseResponse):
"""Standard success response model"""
status: StatusEnum = Field(StatusEnum.SUCCESS, description="Always 'success' for success responses")
data: Optional[Dict[str, Any]] = Field(None, description="Response payload data")
class Config:
schema_extra = {
"example": {
"status": "success",
"timestamp": "2024-01-01T12:00:00Z",
"message": "Operation completed successfully",
"data": {}
}
}
# Agent Response Models
class AgentModel(BaseModel):
"""Agent information model"""
id: str = Field(..., description="Unique agent identifier", example="walnut-codellama")
endpoint: str = Field(..., description="Agent endpoint URL", example="http://walnut:11434")
model: str = Field(..., description="AI model name", example="codellama:34b")
specialty: AgentTypeEnum = Field(..., description="Agent specialization type")
max_concurrent: int = Field(..., description="Maximum concurrent tasks", example=2, ge=1, le=10)
current_tasks: int = Field(default=0, description="Currently running tasks", example=0, ge=0)
status: AgentStatusEnum = Field(default=AgentStatusEnum.AVAILABLE, description="Current agent status")
last_heartbeat: Optional[datetime] = Field(None, description="Last heartbeat timestamp")
utilization: float = Field(default=0.0, description="Current utilization percentage", ge=0.0, le=1.0)
agent_type: Optional[str] = Field(default="ollama", description="Agent implementation type")
class Config:
schema_extra = {
"example": {
"id": "walnut-codellama",
"endpoint": "http://walnut:11434",
"model": "codellama:34b",
"specialty": "kernel_dev",
"max_concurrent": 2,
"current_tasks": 0,
"status": "available",
"last_heartbeat": "2024-01-01T12:00:00Z",
"utilization": 0.15,
"agent_type": "ollama"
}
}
class AgentListResponse(BaseResponse):
"""Response model for listing agents"""
status: StatusEnum = Field(StatusEnum.SUCCESS)
agents: List[AgentModel] = Field(..., description="List of registered agents")
total: int = Field(..., description="Total number of agents", example=3, ge=0)
class Config:
schema_extra = {
"example": {
"status": "success",
"timestamp": "2024-01-01T12:00:00Z",
"agents": [
{
"id": "walnut-codellama",
"endpoint": "http://walnut:11434",
"model": "codellama:34b",
"specialty": "kernel_dev",
"max_concurrent": 2,
"current_tasks": 0,
"status": "available",
"utilization": 0.15
}
],
"total": 1
}
}
class AgentRegistrationResponse(BaseResponse):
"""Response model for agent registration"""
status: StatusEnum = Field(StatusEnum.SUCCESS)
agent_id: str = Field(..., description="ID of the registered agent", example="walnut-codellama")
endpoint: Optional[str] = Field(None, description="Agent endpoint", example="http://walnut:11434")
health_check: Optional[Dict[str, Any]] = Field(None, description="Initial health check results")
class Config:
schema_extra = {
"example": {
"status": "success",
"timestamp": "2024-01-01T12:00:00Z",
"message": "Agent registered successfully",
"agent_id": "walnut-codellama",
"endpoint": "http://walnut:11434",
"health_check": {"healthy": True, "response_time": 0.15}
}
}
# Task Response Models
class TaskModel(BaseModel):
"""Task information model"""
id: str = Field(..., description="Unique task identifier", example="task-12345")
type: str = Field(..., description="Task type", example="code_analysis")
priority: int = Field(..., description="Task priority level", example=1, ge=1, le=5)
status: StatusEnum = Field(..., description="Current task status")
context: Dict[str, Any] = Field(..., description="Task context and parameters")
assigned_agent: Optional[str] = Field(None, description="ID of assigned agent", example="walnut-codellama")
result: Optional[Dict[str, Any]] = Field(None, description="Task execution results")
created_at: datetime = Field(..., description="Task creation timestamp")
started_at: Optional[datetime] = Field(None, description="Task start timestamp")
completed_at: Optional[datetime] = Field(None, description="Task completion timestamp")
error_message: Optional[str] = Field(None, description="Error message if task failed")
class Config:
schema_extra = {
"example": {
"id": "task-12345",
"type": "code_analysis",
"priority": 1,
"status": "completed",
"context": {"file_path": "/src/main.py", "analysis_type": "security"},
"assigned_agent": "walnut-codellama",
"result": {"issues_found": 0, "suggestions": []},
"created_at": "2024-01-01T12:00:00Z",
"completed_at": "2024-01-01T12:05:00Z"
}
}
class TaskListResponse(BaseResponse):
"""Response model for listing tasks"""
status: StatusEnum = Field(StatusEnum.SUCCESS)
tasks: List[TaskModel] = Field(..., description="List of tasks")
total: int = Field(..., description="Total number of tasks", example=10, ge=0)
filtered: bool = Field(default=False, description="Whether results are filtered")
filters_applied: Optional[Dict[str, Any]] = Field(None, description="Applied filter criteria")
class Config:
schema_extra = {
"example": {
"status": "success",
"timestamp": "2024-01-01T12:00:00Z",
"tasks": [
{
"id": "task-12345",
"type": "code_analysis",
"priority": 1,
"status": "completed",
"context": {"file_path": "/src/main.py"},
"created_at": "2024-01-01T12:00:00Z"
}
],
"total": 1,
"filtered": False
}
}
class TaskCreationResponse(BaseResponse):
"""Response model for task creation"""
status: StatusEnum = Field(StatusEnum.SUCCESS)
task_id: str = Field(..., description="ID of the created task", example="task-12345")
assigned_agent: Optional[str] = Field(None, description="ID of assigned agent", example="walnut-codellama")
estimated_completion: Optional[datetime] = Field(None, description="Estimated completion time")
class Config:
schema_extra = {
"example": {
"status": "success",
"timestamp": "2024-01-01T12:00:00Z",
"message": "Task created and assigned successfully",
"task_id": "task-12345",
"assigned_agent": "walnut-codellama",
"estimated_completion": "2024-01-01T12:05:00Z"
}
}
# System Status Response Models
class ComponentStatus(BaseModel):
"""Individual component status"""
name: str = Field(..., description="Component name", example="database")
status: StatusEnum = Field(..., description="Component status")
details: Optional[Dict[str, Any]] = Field(None, description="Additional status details")
last_check: datetime = Field(default_factory=datetime.utcnow, description="Last status check time")
class SystemStatusResponse(BaseResponse):
"""System-wide status response"""
status: StatusEnum = Field(StatusEnum.SUCCESS)
components: List[ComponentStatus] = Field(..., description="Status of system components")
agents: Dict[str, AgentModel] = Field(..., description="Active agents status")
total_agents: int = Field(..., description="Total number of agents", example=3, ge=0)
active_tasks: int = Field(..., description="Currently active tasks", example=5, ge=0)
pending_tasks: int = Field(..., description="Pending tasks in queue", example=2, ge=0)
completed_tasks: int = Field(..., description="Total completed tasks", example=100, ge=0)
uptime: float = Field(..., description="System uptime in seconds", example=86400.0, ge=0)
version: str = Field(..., description="System version", example="1.1.0")
class Config:
schema_extra = {
"example": {
"status": "success",
"timestamp": "2024-01-01T12:00:00Z",
"components": [
{
"name": "database",
"status": "success",
"details": {"connection_pool": "healthy"},
"last_check": "2024-01-01T12:00:00Z"
}
],
"agents": {},
"total_agents": 3,
"active_tasks": 5,
"pending_tasks": 2,
"completed_tasks": 100,
"uptime": 86400.0,
"version": "1.1.0"
}
}
# Health Check Response
class HealthResponse(BaseModel):
"""Simple health check response"""
status: str = Field(..., description="Health status", example="healthy")
timestamp: datetime = Field(default_factory=datetime.utcnow, description="Health check timestamp")
version: str = Field(..., description="API version", example="1.1.0")
class Config:
schema_extra = {
"example": {
"status": "healthy",
"timestamp": "2024-01-01T12:00:00Z",
"version": "1.1.0"
}
}
# Request Models
class AgentRegistrationRequest(BaseModel):
"""Request model for agent registration"""
id: str = Field(..., description="Unique agent identifier", example="walnut-codellama", min_length=1, max_length=100)
endpoint: str = Field(..., description="Agent endpoint URL", example="http://walnut:11434")
model: str = Field(..., description="AI model name", example="codellama:34b", min_length=1)
specialty: AgentTypeEnum = Field(..., description="Agent specialization type")
max_concurrent: int = Field(default=2, description="Maximum concurrent tasks", example=2, ge=1, le=10)
class Config:
schema_extra = {
"example": {
"id": "walnut-codellama",
"endpoint": "http://walnut:11434",
"model": "codellama:34b",
"specialty": "kernel_dev",
"max_concurrent": 2
}
}
class TaskCreationRequest(BaseModel):
"""Request model for task creation"""
type: str = Field(..., description="Task type", example="code_analysis", min_length=1)
priority: int = Field(default=3, description="Task priority level", example=1, ge=1, le=5)
context: Dict[str, Any] = Field(..., description="Task context and parameters")
preferred_agent: Optional[str] = Field(None, description="Preferred agent ID", example="walnut-codellama")
timeout: Optional[int] = Field(None, description="Task timeout in seconds", example=300, ge=1)
class Config:
schema_extra = {
"example": {
"type": "code_analysis",
"priority": 1,
"context": {
"file_path": "/src/main.py",
"analysis_type": "security",
"language": "python"
},
"preferred_agent": "walnut-codellama",
"timeout": 300
}
}