Spaces:
Sleeping
Sleeping
File size: 5,141 Bytes
757671f 1bd7671 b30769a 7b0cf58 b30769a 757671f b30769a 1bd7671 b30769a 1e0f477 b30769a 1e0f477 e77124a 757671f b30769a e77124a 1e0f477 e77124a 757671f b30769a 536c044 b30769a 536c044 757671f f4384d6 b30769a 757671f f4384d6 b30769a 757671f 9d4945e f4384d6 4108598 757671f 536c044 757671f b30769a 1e0f477 c26abff 1e0f477 7b0cf58 f665542 7b0cf58 757671f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | import os
from fastapi import FastAPI, HTTPException, Header
from pydantic import BaseModel
from dotenv import load_dotenv
from schemas import GenerateWholeRequest, GenerateWholeResponse, GeneratePartialRequest, GeneratePartialResponse, ChatWithPersonaRequest, ChatWithPersonaResponse, ChatWithReportRequest, ChatWithReportResponse
import uvicorn
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
load_dotenv()
API_KEY = os.getenv("MY_API_KEY")
app = FastAPI(
title="Alter Ego API",
description="API for generating and interacting with synthetic user personas",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
@app.post("/re-generate",
response_model=GeneratePartialResponse,
summary="Generate report from existing personas",
description="Generate a research report using existing user personas and a new set of questions"
)
def generate_report(request: GeneratePartialRequest, x_api_key: str = Header(...)):
if x_api_key != API_KEY:
raise HTTPException(status_code=403, detail="Invalid API Key")
from core import generate_report, generate_fleet_from_users
logger.info("Generating interviews for each persona.")
fleet=generate_fleet_from_users(users_personas=request.users, questions=request.questions)
logger.info(f"Generated fleet:\n{fleet}")
logger.info("Generating report based on all interviews.")
report = generate_report(fleet=fleet, scope=request.scope,questions=request.questions)
logger.info("Report generation completed.")
return GeneratePartialResponse(report=report, users=fleet)
@app.post("/generate",
response_model=GenerateWholeResponse,
summary="Generate complete research",
description="Generate user personas and a research report from scratch"
)
def generate_all(request: GenerateWholeRequest, x_api_key: str = Header(...)):
if x_api_key != API_KEY:
logger.warning("Unauthorized access attempt.")
raise HTTPException(status_code=403, detail="Invalid API Key")
from core import generate_user_parameters, generate_synthetic_personas, generate_fleet, generate_report, generate_audience_name
# Generate a concise audience name
audience_name = generate_audience_name(request.audience, request.scope)
logger.info(f"Generated audience name: {audience_name}")
logger.info(f"Generating user personas for audience: {audience_name}, scope: {request.scope}, n: {request.n}")
user_parameters = generate_user_parameters(request.audience, request.scope)
logger.info(f"User parameters: {user_parameters}")
users = generate_synthetic_personas(parameters=user_parameters, num_personas=request.n, audience=request.audience)["users_personas"]
logger.info(f"Generated {len(users)} personas:\n{users}")
logger.info("Generating interviews for each persona.")
fleet = generate_fleet(n=request.n, parameters=user_parameters, questions=request.questions, audience=request.audience)
logger.info(f"Generated fleet of length {len(fleet)}:\n{fleet}")
logger.info("Generating report based on all interviews.")
report_text = generate_report(questions=request.questions,fleet=fleet, scope=request.scope)
logger.info(f"Report generated:\n{report_text}")
return {
"audience_name": audience_name,
"users": fleet,
"report": report_text
}
@app.post("/chat-with-persona",
response_model=ChatWithPersonaResponse,
summary="Chat with a specific persona",
description="Have a conversation with a specific user persona, optionally including conversation history"
)
def chat_with_persona_endpoint(request: ChatWithPersonaRequest, x_api_key: str = Header(...)):
if x_api_key != API_KEY:
logger.warning("Unauthorized access attempt.")
raise HTTPException(status_code=403, detail="Invalid API Key")
from core import chat_with_persona
logger.info(f"Chatting with persona: {request.user}")
answer = chat_with_persona(
persona=request.user,
question=request.question,
conversation_history=request.conversation_history
)
logger.info("Chat completed successfully.")
return ChatWithPersonaResponse(answer=answer)
@app.post("/chat-with-report",
response_model=ChatWithReportResponse,
summary="Chat with report content",
description="Ask questions about the synthesized content from multiple user interviews"
)
def chat_with_report_endpoint(request: ChatWithReportRequest, x_api_key: str = Header(...)):
if x_api_key != API_KEY:
logger.warning("Unauthorized access attempt.")
raise HTTPException(status_code=403, detail="Invalid API Key")
from core import chat_with_report
logger.info("Chatting with report content")
answer = chat_with_report(
users=request.users,
question=request.question,
questions=request.questions
)
logger.info(f"Chat with report completed successfully.\nAnswer:\n{answer}")
return ChatWithReportResponse(answer=answer)
if __name__ == "__main__": uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=False)
|