from __future__ import annotations import logging import os from pathlib import Path from dotenv import load_dotenv from fastapi import FastAPI, HTTPException from pydantic import BaseModel from crew import ContentCrew # Load agents/.env if present (kept separate from backend/.env). # Also load backend/.env to support local dev where keys are stored there. _agents_env = Path(__file__).resolve().parent / ".env" _backend_env = Path(__file__).resolve().parents[1] / "backend" / ".env" load_dotenv(_agents_env, override=False) load_dotenv(_backend_env, override=False) logger = logging.getLogger(__name__) app = FastAPI() class GenerateRequest(BaseModel): topic: str feedback: str | None = None memory_context: str = "" tone_instruction: str = "" @app.get("/health") def health(): return {"ok": True} @app.post("/generate") def generate(req: GenerateRequest): topic = (req.topic or "").strip() if not topic: raise HTTPException(400, "topic is required") prompt = topic[:4000] if req.memory_context: prompt = f"{req.memory_context.strip()}\n\nTopic to write about: {prompt}" if req.tone_instruction: prompt = f"{prompt}\n\nTone requirements: {req.tone_instruction.strip()[:1200]}" if req.feedback: prompt += f"\n\nPrevious post rejected. Feedback: {req.feedback.strip()[:1000]}" try: crew_instance = ContentCrew().crew() result = crew_instance.kickoff(inputs={"topic": prompt}) return {"post": str(result)} except Exception as exc: # Don't leak internal stack traces in the HTTP response by default. msg = str(exc) or "Agent generation failed" logger.warning("POST /generate failed: %s", msg, exc_info=True) if os.getenv("AGENTS_DEBUG", "").strip() in ("1", "true", "yes"): raise raise HTTPException(500, msg[:500]) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=int(os.getenv("PORT", "9000")))