-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.py
More file actions
135 lines (112 loc) · 4.07 KB
/
api.py
File metadata and controls
135 lines (112 loc) · 4.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import sys
import os
import asyncio
import subprocess
import logging
from pathlib import Path
from fastapi import FastAPI, BackgroundTasks, HTTPException, Request
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List, Optional
# Ensure project root is on path (for running via uvicorn)
_project_root = os.path.dirname(os.path.abspath(__file__))
if _project_root not in sys.path:
sys.path.insert(0, _project_root)
# Configure structured logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(name)s] %(levelname)s: %(message)s",
datefmt="%H:%M:%S",
)
logger = logging.getLogger(__name__)
from core.loop import AgentLoop4
from core.graph_adapter import nx_to_reactflow
from memory.context import ExecutionContextManager
from remme.utils import get_embedding
from config.settings_loader import settings, save_settings, reset_settings, reload_settings
# Import shared state
from shared.state import (
active_loops,
get_multi_mcp,
get_remme_store,
get_remme_extractor,
PROJECT_ROOT,
)
from routers.remme import background_smart_scan # Needed for lifespan startup
from contextlib import asynccontextmanager
# Get shared instances
multi_mcp = get_multi_mcp()
remme_store = get_remme_store()
remme_extractor = get_remme_extractor()
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("API Starting up...")
await multi_mcp.start()
# Check git
try:
subprocess.run(["git", "--version"], capture_output=True, check=True)
logger.info("Git found.")
except Exception:
logger.warning("Git NOT found. GitHub explorer features will fail.")
# Start Smart Sync in background
asyncio.create_task(background_smart_scan())
yield
# Graceful shutdown: close shared sessions
from core.model_manager import close_ollama_session
await close_ollama_session()
await multi_mcp.stop()
logger.info("API shut down cleanly.")
app = FastAPI(lifespan=lifespan)
# Enable CORS for Frontend
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173", "http://127.0.0.1:5173", "app://."], # Explicitly allow frontend
allow_origin_regex=r"http://localhost:(517\d|5555)",
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Global State is now managed in shared/state.py
# active_loops, multi_mcp, remme_store, remme_extractor are imported from there
# === Import and Include Routers ===
from routers import runs as runs_router
from routers import rag as rag_router
from routers import remme as remme_router
from routers import apps as apps_router
from routers import settings as settings_router
from routers import explorer as explorer_router
from routers import mcp as mcp_router
app.include_router(runs_router.router)
app.include_router(rag_router.router)
app.include_router(remme_router.router)
app.include_router(apps_router.router)
app.include_router(settings_router.router)
app.include_router(explorer_router.router)
app.include_router(mcp_router.router)
from routers import prompts as prompts_router
from routers import news as news_router
from routers import git as git_router
app.include_router(prompts_router.router)
app.include_router(news_router.router)
app.include_router(git_router.router)
from routers import chat as chat_router
app.include_router(chat_router.router)
from routers import agent as agent_router
app.include_router(agent_router.router)
from routers import ide_agent as ide_agent_router
app.include_router(ide_agent_router.router)
from routers import metrics as metrics_router
app.include_router(metrics_router.router)
# Chat router included
@app.get("/health")
async def health_check():
return {
"status": "ok",
"version": "1.0.0",
"mcp_ready": True # Since lifespan finishes multi_mcp.start()
}
if __name__ == "__main__":
import uvicorn
# Enable reload=True for development if needed, but here we'll just keep it simple
# or actually enable it to avoid these restart issues.
uvicorn.run("api:app", host="0.0.0.0", port=8000, reload=True)