feat: Add agent workspace system and runtime management
- Add agent core modules (agent_core, factory, registry, skill_loader) - Add runtime system for agent execution management - Add REST API for agents, workspaces, and runtime control - Add process supervisor for agent lifecycle management - Add workspace template system with agent profiles - Add frontend RuntimeView and runtime API integration - Add per-agent skill workspaces for smoke_fullstack run - Refactor skill system with active/installed separation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
115
backend/app.py
Normal file
115
backend/app.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
FastAPI Application - REST API for EvoTraders
|
||||
|
||||
Provides HTTP endpoints for:
|
||||
- Agent management
|
||||
- Workspace management
|
||||
- Tool guard operations
|
||||
- Health checks
|
||||
"""
|
||||
from contextlib import asynccontextmanager
|
||||
from pathlib import Path
|
||||
from typing import AsyncGenerator
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
from backend.api import agents_router, workspaces_router, guard_router, runtime_router
|
||||
from backend.agents import AgentFactory, WorkspaceManager, get_registry
|
||||
|
||||
|
||||
# Global instances (initialized on startup)
|
||||
agent_factory: AgentFactory | None = None
|
||||
workspace_manager: WorkspaceManager | None = None
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI) -> AsyncGenerator:
|
||||
"""
|
||||
Application lifespan manager.
|
||||
|
||||
Initializes global services on startup and cleans up on shutdown.
|
||||
"""
|
||||
global agent_factory, workspace_manager
|
||||
|
||||
# Startup: Initialize services
|
||||
project_root = Path(__file__).parent.parent
|
||||
|
||||
# Initialize workspace manager
|
||||
workspace_manager = WorkspaceManager(project_root=project_root)
|
||||
|
||||
# Initialize agent factory
|
||||
agent_factory = AgentFactory(project_root=project_root)
|
||||
|
||||
# Ensure workspaces root exists
|
||||
agent_factory.workspaces_root.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Get or create global registry
|
||||
registry = get_registry()
|
||||
|
||||
print(f"✓ EvoTraders API started")
|
||||
print(f" - Workspaces root: {agent_factory.workspaces_root}")
|
||||
print(f" - Registered agents: {registry.get_agent_count()}")
|
||||
|
||||
yield
|
||||
|
||||
# Shutdown: Cleanup
|
||||
print("✓ EvoTraders API shutting down")
|
||||
|
||||
|
||||
# Create FastAPI application
|
||||
app = FastAPI(
|
||||
title="EvoTraders API",
|
||||
description="REST API for the EvoTraders multi-agent trading system",
|
||||
version="0.1.0",
|
||||
lifespan=lifespan,
|
||||
)
|
||||
|
||||
# CORS middleware
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"], # Configure appropriately for production
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
|
||||
# Health check endpoint
|
||||
@app.get("/health")
|
||||
async def health_check():
|
||||
"""Health check endpoint."""
|
||||
registry = get_registry()
|
||||
return {
|
||||
"status": "healthy",
|
||||
"version": "0.1.0",
|
||||
"agents_registered": registry.get_agent_count(),
|
||||
"workspaces_available": len(workspace_manager.list_workspaces()) if workspace_manager else 0,
|
||||
}
|
||||
|
||||
|
||||
# API status endpoint
|
||||
@app.get("/api/status")
|
||||
async def api_status():
|
||||
"""Get API status and system information."""
|
||||
registry = get_registry()
|
||||
stats = registry.get_stats()
|
||||
|
||||
return {
|
||||
"status": "operational",
|
||||
"registry": stats,
|
||||
}
|
||||
|
||||
|
||||
# Include routers
|
||||
app.include_router(workspaces_router)
|
||||
app.include_router(agents_router)
|
||||
app.include_router(guard_router)
|
||||
app.include_router(runtime_router)
|
||||
|
||||
|
||||
# Main entry point for running with uvicorn
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="0.0.0.0", port=8000)
|
||||
Reference in New Issue
Block a user