feedback in chat added

This commit is contained in:
OwusuBlessing
2025-02-08 02:39:43 +01:00
parent ed55e5e48e
commit cf00443a75
8 changed files with 1081 additions and 167 deletions
+180 -99
View File
@@ -34,10 +34,10 @@ base_path = os.path.join("data", "config_files")
QUESTIONS_PATH = os.path.join(base_path, "questions.json")
THEME_CONTEXT_PATH = os.path.join(base_path, "theme_context.json")
# Load themes at module level
with open(THEME_CONTEXT_PATH, "r") as f:
themes = json.load(f)
with open(THEME_CONTEXT_PATH, "r", encoding="utf-8") as f:
themes = json.load(f)
# Initialize FastAPI app
app = FastAPI(
title="Fire Fighter Interview API",
@@ -81,6 +81,10 @@ class ChatRequest(BaseModel):
query: str=None
conversation_id: str
theme_id: Optional[int] = 1
full_history_url: Optional[str] = None
form_id:Optional[int] = None
feedback: Optional[str] = None
generate_theme:str="NO"
class ChatResponse(BaseModel):
message: str
@@ -142,153 +146,230 @@ async def extract_pdf_text(pdf_url: str) -> Union[str, None]:
status_code=500,
detail=f"Error processing PDF: {str(e)}"
)
@app.post("/rescue-career/chat", response_model=ChatResponse)
@app.post("/rescue-career/chat")
async def chat_endpoint(
request: ChatRequest,
api_key: str = Depends(get_api_key)
):
try:
# Validate theme
print(f"Received request with theme_id: {request.theme_id}") # Debugging print
matching_themes = [t for t in themes if t["id"] == request.theme_id]
if not matching_themes:
print(f"No theme found with ID: {request.theme_id}") # Debugging print
raise HTTPException(
status_code=400,
detail=f"No theme found with ID {request.theme_id}"
)
# Only try to load document if resume_url is provided
print(f"Validated theme ID: {request.theme_id}") # Print statement added
resume_docs = ""
if request.resume_url:
print(f"Loading resume from URL: {request.resume_url}") # Debugging print
docs = load_document(request.resume_url)
if not docs:
print("Invalid resume URL: Unable to fetch document") # Debugging print
raise HTTPException(
status_code=400,
detail="Invalid resume URL: Unable to fetch document"
)
resume_docs = "\n".join(f"- {doc.page_content}" for doc in docs)
# Get AI chat response
response = ai_chat(
query=request.query,
conversation_id=request.conversation_id,
theme_id=request.theme_id,
resume=resume_docs
)
# Parse response
try:
parsed_response = json.loads(response)
return ChatResponse(
message=parsed_response.get("message", ""),
end=parsed_response.get("end", "no") == "yes",
error=None
)
except json.JSONDecodeError:
return ChatResponse(
message=response,
end=False,
error=None
)
except HTTPException as e:
# Re-raise HTTP exceptions
raise
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Error processing chat request: {str(e)}"
)
@app.post("/rescue-career/generate-theme")
async def generate_pdf_endpoint(
request: GeneratePDFRequest,
api_key: str = Depends(get_api_key)
):
try:
# Here you would fetch the conversation data using the conversation_id
# This is a placeholder - replace with your actual conversation data fetching logic
conversation_data = await get_conversation_data(request.conversation_id)
if not conversation_data:
raise HTTPException(
status_code=404,
detail=f"No conversation found with ID {request.conversation_id}"
)
resume_docs = ""
if request.resume_url:
docs = load_document(request.resume_url)
if not docs:
raise HTTPException(
status_code=400,
detail="Invalid resume URL: Unable to fetch document"
)
resume_docs = "\n".join(f"- {doc.page_content}" for doc in docs)
print(f"Loaded resume documents: {resume_docs}") # Debugging print
full_history_docs = ""
if request.full_history_url:
print(f"Loading full history from URL: {request.full_history_url}") # Debugging print
docs = load_document(request.full_history_url)
if not docs:
print("Invalid full history URL: Unable to fetch document") # Debugging print
raise HTTPException(
status_code=400,
detail="Invalid full_history URL: Unable to fetch document"
detail="Invalid full history URL: Unable to fetch document"
)
full_history_docs = "\n".join(f"- {doc.page_content}" for doc in docs)
print(f"Loaded full history documents: {full_history_docs}") # Debugging print
form_response_docs = ""
if request.form_id:
print(f"Fetching form response for form_id: {request.form_id}") # Debugging print
try:
x_api_key = os.getenv("BACKEND_XAPI_KEY")
url = f"{os.getenv('BACKEND_BASE_URL')}/v3/api/custom/theme-document/answer/{request.form_id}?x-project={x_api_key}"
result = requests.get(url)
form_response = result.json() # Return response in JSON format
form_response_docs = "\n".join(f"- {form_response}")
except:
result.raise_for_status() # Ensure we raise an error for bad responses
form_response = result.json()["data"] # Return response in JSON format
form_response_docs = "\n".join(f"- {form_response}")
print(f"Fetched form response: {form_response}") # Debugging print
except requests.RequestException as e:
print(f"Error fetching onboarding data: {str(e)}") # Debugging print
raise HTTPException(
status_code=400,
detail="Unable to fetch onborading data"
detail="Unable to fetch onboarding data"
)
# Generate theme data using the generate_theme function
theme_data = generate_theme(
conversation_data=conversation_data,
feedback=request.feedback,
previous_result=request.previous_results,
resume = resume_docs,
form_response=form_response_docs,
full_history = full_history_docs
)
if not theme_data:
raise HTTPException(
status_code=500,
detail="Failed to generate theme data"
# Get AI chat response
if request.generate_theme == "YES":
print("Generating PDF from response...") # Debugging print
print(f"Calling AI chat function...") # Debugging print
response = ai_chat(
query=f"NOW GENERATE THE STARTPOP FRAME WORK ,THEME_GENERATION_STATE: {request.generate_theme}",
conversation_id=request.conversation_id,
theme_id=request.theme_id,
resume=resume_docs,
full_history=full_history_docs,
form_response=form_response_docs,
generate_theme=request.generate_theme
)
# Generate the PDF using the create_pdf function
pdf_content = create_pdf(theme_data)
# Create filename with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"theme_{timestamp}.pdf"
# Return the PDF as a response
return Response(
print(f"pdf content {response}")
response = json.loads(response)
pdf_content = create_pdf(response)
# Create filename with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"theme_{timestamp}.pdf"
# Return the PDF as a response
print(f"Returning PDF with filename: {filename}") # Debugging print
return Response(
content=pdf_content,
media_type="application/pdf",
headers={
"Content-Disposition": f'attachment; filename="{filename}"'
}
)
# Parse response
print("Parsing AI response...") # Debugging print
response = ai_chat(
query=request.query,
conversation_id=request.conversation_id,
theme_id=request.theme_id,
resume=resume_docs,
full_history=full_history_docs,
form_response=form_response_docs,
generate_theme=request.generate_theme
)
parsed_response = json.loads(response)
return ChatResponse(
message=parsed_response.get("message", ""),
end=parsed_response.get("end", "no") == "yes",
error=None
)
except Exception as e:
print(f"Error processing chat request: {str(e)}") # Print statement added
raise HTTPException(
status_code=500,
detail=f"Error generating PDF: {str(e)}"
detail=f"Error processing chat request: {str(e)}"
)
@app.post("/rescue-career/generate-theme")
async def generate_pdf_endpoint(
request: ChatRequest,
api_key: str = Depends(get_api_key)
):
try:
print(f"Received request with theme_id: {request.theme_id}") # Debugging print
matching_themes = [t for t in themes if t["id"] == request.theme_id]
if not matching_themes:
print(f"No theme found with ID: {request.theme_id}") # Debugging print
raise HTTPException(
status_code=400,
detail=f"No theme found with ID {request.theme_id}"
)
print(f"Validated theme ID: {request.theme_id}") # Print statement added
resume_docs = ""
if request.resume_url:
print(f"Loading resume from URL: {request.resume_url}") # Debugging print
docs = load_document(request.resume_url)
if not docs:
print("Invalid resume URL: Unable to fetch document") # Debugging print
raise HTTPException(
status_code=400,
detail="Invalid resume URL: Unable to fetch document"
)
resume_docs = "\n".join(f"- {doc.page_content}" for doc in docs)
print(f"Loaded resume documents: {resume_docs}") # Debugging print
full_history_docs = ""
if request.full_history_url:
print(f"Loading full history from URL: {request.full_history_url}") # Debugging print
docs = load_document(request.full_history_url)
if not docs:
print("Invalid full history URL: Unable to fetch document") # Debugging print
raise HTTPException(
status_code=400,
detail="Invalid full history URL: Unable to fetch document"
)
full_history_docs = "\n".join(f"- {doc.page_content}" for doc in docs)
print(f"Loaded full history documents: {full_history_docs}") # Debugging print
form_response_docs = ""
if request.form_id:
print(f"Fetching form response for form_id: {request.form_id}") # Debugging print
try:
x_api_key = os.getenv("BACKEND_XAPI_KEY")
url = f"{os.getenv('BACKEND_BASE_URL')}/v3/api/custom/theme-document/answer/{request.form_id}?x-project={x_api_key}"
result = requests.get(url)
result.raise_for_status() # Ensure we raise an error for bad responses
form_response = result.json()["data"] # Return response in JSON format
form_response_docs = "\n".join(f"- {form_response}")
print(f"Fetched form response: {form_response}") # Debugging print
except requests.RequestException as e:
print(f"Error fetching onboarding data: {str(e)}") # Debugging print
raise HTTPException(
status_code=400,
detail="Unable to fetch onboarding data"
)
# Here you would fetch the conversation data using the conversation_id
# This is a placeholder - replace with your actual conversation data fetching logic
# Get AI-generated theme content
response = ai_chat(
query="NOW GENERATE THE STARTPOP FRAME WORK, THEME_GENERATION_STATE: YES",
conversation_id=request.conversation_id,
theme_id=request.theme_id,
resume=resume_docs,
full_history=full_history_docs,
form_response=form_response_docs,
generate_theme="YES"
)
print(f"AI Response for theme: {response}")
# Ensure AI response is valid
if not isinstance(response, str):
raise HTTPException(status_code=500, detail="Invalid AI response format")
# Generate PDF
response = json.loads(response)
pdf_content = create_pdf(response)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"theme_{timestamp}.pdf"
print(f"Returning PDF with filename: {filename}")
return Response(
content=pdf_content,
media_type="application/pdf",
headers={"Content-Disposition": f'attachment; filename="{filename}"'}
)
except Exception as e:
print(f"Error generating theme: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error: {str(e)}")
@app.post("/rescue-career/generate-quiz", response_model=QuizResponse)
async def generate_quiz_endpoint(
@@ -365,4 +446,4 @@ async def startup_event():
if __name__ == "__main__":
import uvicorn
uvicorn.run("app:app", host="0.0.0.0", port=5048, reload=True)
uvicorn.run("app:app", host="0.0.0.0", port=5042, reload=True)