from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from app.core.database import get_db from app.core.security import ApiPrincipal, require_api_key from app.modules.audit.constants import AuditSource from app.modules.ai_agent.schemas import ( AIAskRequest, AIAskResponse, DraftPolicyRequest, InvestmentResearchRequest, OpenClawToolInvokeRequest, ) from app.modules.ai_agent.service import AIService router = APIRouter(dependencies=[Depends(require_api_key)]) @router.post("/ask", response_model=AIAskResponse) def ask( payload: AIAskRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return AIService(db).ask( payload.prompt, payload.context, actor=principal.actor, source=AuditSource.API, ) @router.get("/provider-health") def provider_health( db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return AIService(db).provider_health(actor=principal.actor) @router.post("/openclaw/tools/invoke") def invoke_openclaw_tool( payload: OpenClawToolInvokeRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return AIService(db).invoke_openclaw_tool( tool=payload.tool, action=payload.action, args=payload.args, session_key=payload.session_key, actor=principal.actor, ) @router.post("/draft-policy", response_model=AIAskResponse) def draft_policy( payload: DraftPolicyRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return AIService(db).draft_policy( title=payload.title, policy_type=payload.policy_type, requirements=payload.requirements, actor=principal.actor, ) @router.post("/investment-research", response_model=AIAskResponse) def investment_research( payload: InvestmentResearchRequest, db: Session = Depends(get_db), principal: ApiPrincipal = Depends(require_api_key), ) -> dict: return AIService(db).draft_investment_research( symbol_or_topic=payload.symbol_or_topic, risk_preference=payload.risk_preference, actor=principal.actor, )