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)