AUXteam's picture
Fix: Append uuid to mock persona names to prevent TinyTroupe naming collision
d9ec5e4 verified
from fastapi import APIRouter, BackgroundTasks, HTTPException, Depends
from typing import List, Dict, Any
import uuid
from backend.models.schemas import SimulationRequest, GeneratePersonasRequest, SimulationResponse, BulkSimulationRequest, Persona
from backend.core.job_registry import job_registry
from backend.services.tinytroupe_manager import tinytroupe_manager
from backend.services.persona_matcher import persona_matcher
from backend.core.config import settings
router = APIRouter(prefix="/api/v1")
@router.post("/simulations", response_model=SimulationResponse)
async def start_simulation(request: SimulationRequest, background_tasks: BackgroundTasks):
job_id = str(uuid.uuid4())
job_registry.create_job(job_id, {"request": request.model_dump()})
# In a real scenario, fetch personas from a DB/storage based on request.focus_group_id
# Here we simulate fetching 2 personas for the given focus group
mock_personas_data = [
{"name": f"Tech Founder 1_{job_id[:4]}", "occupation": "Software Engineer"},
{"name": f"Tech Founder 2_{job_id[:4]}", "occupation": "Product Manager"}
]
background_tasks.add_task(
tinytroupe_manager.run_simulation_async,
job_id,
request.content_payload,
mock_personas_data,
request.content_type,
request.parameters or {},
job_registry
)
return SimulationResponse(job_id=job_id, status="PENDING", message="Simulation job queued.")
@router.get("/simulations/{job_id}", response_model=SimulationResponse)
async def get_simulation_status(job_id: str):
job_data = job_registry.get_job(job_id)
if job_data.get("status") == "NOT_FOUND":
raise HTTPException(status_code=404, detail="Simulation job not found")
return SimulationResponse(
job_id=job_id,
status=job_data.get("status", "UNKNOWN"),
progress_percentage=job_data.get("progress_percentage", 0),
message=job_data.get("message"),
results=job_data.get("results")
)
@router.post("/simulations/bulk", response_model=List[SimulationResponse])
async def bulk_start_simulations(bulk_request: BulkSimulationRequest, background_tasks: BackgroundTasks):
responses = []
for req in bulk_request.requests:
resp = await start_simulation(req, background_tasks)
responses.append(resp)
return responses
@router.get("/personas", response_model=Dict[str, List[Persona]])
async def get_personas():
return {
"focus_groups": [
Persona(id="tech_founders_eu", name="Tech Founders EU", agent_count=5),
Persona(id="marketing_pros_us", name="Marketing Professionals US", agent_count=3)
]
}
@router.post("/personas/generate", response_model=SimulationResponse)
async def generate_personas(request: GeneratePersonasRequest, background_tasks: BackgroundTasks):
job_id = str(uuid.uuid4())
job_registry.create_job(job_id, {"request": request.model_dump()})
background_tasks.add_task(
tinytroupe_manager.generate_personas_async,
request.business_description,
request.customer_profile,
request.num_personas,
job_id,
job_registry
)
return SimulationResponse(job_id=job_id, status="PENDING", message="Persona generation job queued.")