from typing import Any from sqlalchemy.orm import Session from app.modules.ai_agent.adapters import get_adapter from app.modules.audit.schemas import AuditLogCreate from app.modules.audit.service import AuditService class AIService: """Coordinate AI provider calls and audit logging.""" def __init__(self, db: Session): self.db = db self.audit = AuditService(db) def ask( self, prompt: str, context: dict[str, Any] | None = None, actor: str = "api", source: str = "api", ) -> dict[str, Any]: adapter = get_adapter() result = adapter.ask(prompt, context or {}) response = { "provider": adapter.provider_name, "answer": result["answer"], "raw": result.get("raw", {}), } self.audit.log( AuditLogCreate( actor=actor, source=source, action="ai.ask", target_type="ai", risk_level="medium", request_payload={"prompt": prompt, "context": context or {}}, response_payload=response, ) ) return response def draft_policy( self, title: str, policy_type: str, requirements: list[str], actor: str, ) -> dict[str, Any]: prompt = ( f"Draft a company policy in Chinese. Title: {title}. Type: {policy_type}. " "Include purpose, scope, roles, process, approval rules, audit rules, and KPI linkage. " f"Requirements: {requirements}" ) return self.ask(prompt, actor=actor, source="policy") def draft_investment_research( self, symbol_or_topic: str, risk_preference: str, actor: str, ) -> dict[str, Any]: prompt = ( "Create an investment research memo in Chinese. Do not give direct trading " "instructions. Include thesis, risks, data needed, position sizing constraints, " "and human approval checklist. " f"Topic: {symbol_or_topic}. Risk preference: {risk_preference}." ) return self.ask(prompt, actor=actor, source="investment")