petter2025's picture
Add FastAPI app
2d521fd verified
import sys
from app.database.session import SessionLocal
from slowapi import Limiter
from slowapi.util import get_remote_address
from app.core.config import settings
# ARF core engine imports
from agentic_reliability_framework.core.governance.risk_engine import RiskEngine
from agentic_reliability_framework.core.decision.decision_engine import DecisionEngine
from agentic_reliability_framework.core.governance.stability_controller import LyapunovStabilityController
from agentic_reliability_framework.core.governance.causal_explainer import CausalExplainer
from agentic_reliability_framework.runtime.memory.rag_graph import RAGGraphMemory
from agentic_reliability_framework.core.models.event import ReliabilityEvent, HealingAction
# Dependency to get DB session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# Rate limiter with default limit from settings
limiter = Limiter(key_func=get_remote_address, default_limits=[settings.RATE_LIMIT])
# ARF engine dependencies (singletons for simplicity)
_risk_engine = None
_decision_engine = None
_stability_controller = None
_causal_explainer = None
_rag_graph = None
def _seed_rag_graph(rag):
"""Seed the RAG graph with historical healing action outcomes."""
seed_data = [
("seed_restart_1", "test", HealingAction.RESTART_CONTAINER.value, True, 2),
("seed_restart_2", "test", HealingAction.RESTART_CONTAINER.value, True, 3),
("seed_restart_3", "test", HealingAction.RESTART_CONTAINER.value, False, 10),
("seed_rollback_1", "test", HealingAction.ROLLBACK.value, True, 1),
("seed_rollback_2", "test", HealingAction.ROLLBACK.value, True, 2),
("seed_rollback_3", "test", HealingAction.ROLLBACK.value, False, 5),
("seed_scale_1", "test", HealingAction.SCALE_OUT.value, True, 5),
("seed_scale_2", "test", HealingAction.SCALE_OUT.value, False, 15),
("seed_cb_1", "test", HealingAction.CIRCUIT_BREAKER.value, True, 1),
("seed_cb_2", "test", HealingAction.CIRCUIT_BREAKER.value, True, 2),
("seed_ts_1", "test", HealingAction.TRAFFIC_SHIFT.value, True, 4),
("seed_ts_2", "test", HealingAction.TRAFFIC_SHIFT.value, False, 8),
]
for inc_id, comp, action, success, res_time in seed_data:
event = ReliabilityEvent(
component=comp,
latency_p99=500,
error_rate=0.1,
service_mesh="default"
)
rag.record_outcome(
incident_id=inc_id,
event=event,
action_taken=action,
success=success,
resolution_time_minutes=res_time
)
print("Seeded RAG graph with historical data", file=sys.stderr)
def get_rag_graph():
global _rag_graph
if _rag_graph is None:
_rag_graph = RAGGraphMemory()
_seed_rag_graph(_rag_graph)
return _rag_graph
def get_decision_engine():
global _decision_engine
if _decision_engine is None:
rag = get_rag_graph()
_decision_engine = DecisionEngine(rag_graph=rag)
return _decision_engine
def get_risk_engine():
global _risk_engine
if _risk_engine is None:
_risk_engine = RiskEngine()
return _risk_engine
def get_stability_controller():
global _stability_controller
if _stability_controller is None:
_stability_controller = LyapunovStabilityController()
return _stability_controller
def get_causal_explainer():
global _causal_explainer
if _causal_explainer is None:
_causal_explainer = CausalExplainer()
return _causal_explainer