myrmidon / python /src /server /main.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
7.77 kB
"""
FastAPI Backend for Archon Knowledge Engine
This is the main entry point for the Archon backend API.
It uses a modular approach with separate API modules for different functionality.
Modules:
- settings_api: Settings and credentials management
- mcp_api: MCP server management and tool execution
- knowledge_api: Knowledge base, crawling, and RAG operations
- projects_api: Project and task management with streaming
"""
# ruff: noqa: E402
import os
import warnings
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv(), override=True)
# Suppress the noisy transformers LambdaRuntimeClient deprecation warnings
warnings.filterwarnings("ignore", message=".*LambdaRuntimeClient.*")
warnings.filterwarnings("ignore", category=DeprecationWarning, module="transformers")
# Suppress FastAPIDeprecationWarning from fastapi package
warnings.filterwarnings("ignore", category=DeprecationWarning, module="fastapi")
warnings.filterwarnings("ignore", message=".*regex.*")
import logging
try:
import transformers.utils.logging as transformers_logging
transformers_logging.set_verbosity_error()
except ImportError:
pass
logging.getLogger("transformers").setLevel(logging.ERROR)
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from src.server.core import (
check_system_health,
global_exception_handler,
lifespan,
)
from .api_routes.admin_api import router as admin_router # NEW IMPORT
from .api_routes.agent_chat_api import router as agent_chat_router
from .api_routes.agents_api import router as agents_router # MISSING
from .api_routes.audio_api import router as audio_router
from .api_routes.auth_api import router as auth_router # NEW IMPORT
from .api_routes.blog_api import router as blog_router
from .api_routes.bug_report_api import router as bug_report_router
from .api_routes.changes_api import router as changes_router # NEW IMPORT
from .api_routes.ethics_api import router as ethics_router # NEW IMPORT
from .api_routes.extraction_api import router as extraction_router # NEW IMPORT (GAP-018)
from .api_routes.game_api import router as game_router
from .api_routes.internal_api import router as internal_router
from .api_routes.internal_llm_api import router as internal_llm_router # NEW IMPORT
from .api_routes.knowledge_api import router as knowledge_router
from .api_routes.log_api import router as log_router
from .api_routes.marketing_api import router as marketing_router # NEW IMPORT
from .api_routes.mcp_api import router as mcp_api_router # NEW IMPORT
from .api_routes.migration_api import router as migration_router
from .api_routes.progress_api import router as progress_router
from .api_routes.projects_api import router as projects_router
from .api_routes.prompts_api import router as prompts_router # MISSING
from .api_routes.providers_api import router as providers_router
from .api_routes.rag_api import router as rag_router # NEW IMPORT
from .api_routes.settings_api import router as settings_router
from .api_routes.sse_api import router as sse_router # NEW IMPORT
from .api_routes.stats_api import router as stats_router
from .api_routes.system_api import router as system_router # NEW IMPORT
from .api_routes.test_api import router as test_api_router # NEW IMPORT
from .api_routes.version_api import router as version_router
from .api_routes.visit_log_api import router as visit_log_router # NEW IMPORT
from .middleware.budget_guard import BudgetGuardMiddleware
# Import Logfire configuration
# Create FastAPI application
app = FastAPI(
title="Archon Knowledge Engine API",
description="Backend API for the Archon knowledge management and project automation platform",
version="1.0.0",
lifespan=lifespan,
)
app.add_exception_handler(Exception, global_exception_handler)
# Configure CORS
origins = [
"https://archon-ui-wiwy.onrender.com",
"https://enduser-ui-fe.onrender.com",
"http://localhost:5173",
"http://127.0.0.1:5173",
"http://localhost:3000",
"http://localhost:3737",
"http://enduser-ui:5173",
"http://archon-ui:3737",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_middleware(BudgetGuardMiddleware)
app.include_router(test_api_router) # NEW ROUTER
app.include_router(internal_llm_router)
# Add middleware to skip logging for health checks
@app.middleware("http")
async def skip_health_check_logs(request, call_next):
# Skip logging for health check endpoints
if request.url.path in ["/health", "/api/health"]:
# Temporarily suppress the log
import logging
logger = logging.getLogger("uvicorn.access")
old_level = logger.level
logger.setLevel(logging.ERROR)
response = await call_next(request)
logger.setLevel(old_level)
return response
return await call_next(request)
# --- API Routing Standardized (Phase 4.6.34) ---
# Group 1: Routers that ALREADY define "/api" in their internal prefix (No extra prefix needed)
app.include_router(projects_router)
app.include_router(marketing_router)
app.include_router(admin_router)
app.include_router(blog_router)
app.include_router(stats_router)
app.include_router(mcp_api_router)
app.include_router(visit_log_router)
app.include_router(version_router)
app.include_router(log_router)
app.include_router(bug_report_router)
app.include_router(changes_router)
app.include_router(extraction_router)
app.include_router(ethics_router)
app.include_router(providers_router)
app.include_router(migration_router)
app.include_router(system_router)
app.include_router(sse_router)
app.include_router(agent_chat_router)
app.include_router(audio_router)
app.include_router(progress_router)
app.include_router(knowledge_router)
app.include_router(agents_router)
app.include_router(prompts_router)
# Group 2: Routers that NEED an "/api" prefix (defined without prefix internally)
app.include_router(auth_router, prefix="/api")
app.include_router(settings_router, prefix="/api")
app.include_router(game_router, prefix="/api")
app.include_router(rag_router, prefix="/api")
app.include_router(internal_router) # Already defines /internal
app.include_router(test_api_router)
# Root endpoint
@app.get("/")
@app.head("/")
async def root():
"""Root endpoint returning API information."""
return {
"name": "Archon Knowledge Engine API",
"version": "1.0.0",
"description": "Backend API for knowledge management and project automation",
"status": "healthy",
"modules": ["settings", "mcp", "mcp-clients", "knowledge", "projects"],
}
# Health check endpoint
@app.get("/health")
@app.head("/health")
async def health_check_route():
"""Health check endpoint that indicates true readiness including credential loading."""
return await check_system_health()
# API health check endpoint (alias for /health at /api/health)
@app.get("/api/health")
async def api_health_check_route():
"""API health check endpoint - alias for /health."""
return await check_system_health()
# Export the app directly for uvicorn to use
def main():
"""Main entry point for running the server."""
import uvicorn
# Require ARCHON_SERVER_PORT to be set
server_port = os.getenv("ARCHON_SERVER_PORT")
if not server_port:
raise ValueError(
"ARCHON_SERVER_PORT environment variable is required. "
"Please set it in your .env file or environment. "
"Default value: 8181"
)
uvicorn.run(
"src.server.main:app",
host="0.0.0.0",
port=int(server_port),
reload=True,
log_level="info",
)
if __name__ == "__main__":
main()