import os from uuid import UUID import requests from pydantic import BaseModel class GetAvailableInterviewsRequest(BaseModel): user_hf_id: str class InterviewMeta(BaseModel): title: str creator_name: str id: str class GetAvailableInterviewsResponse(BaseModel): interviews: list[InterviewMeta] class StartChatRequest(BaseModel): user_hf_id: str interview_id: str class StartChatResponse(BaseModel): chat_id: UUID first_message: str class GetChatRequest(BaseModel): chat_id: UUID user_message: str class GetChatResponse(BaseModel): chat_id: UUID agent_message: str | None error_message: str | None end_interview: bool class AppClient: url_available_interviews = os.environ["ENDPOINT_AVAILABLE_CHAT"] url_init_chat = os.environ["ENDPOINT_CHAT_INIT"] url_chat_response = os.environ["ENDPOINT_CHAT_RESPONSE"] @classmethod def _call_endpoint(cls, endpoint, data): headers = { "Content-Type": "application/json", } response = requests.post(url=endpoint, json=data.model_dump(mode="json"), headers=headers) if response.status_code == 200: return response.json() return None @classmethod def get_chats(cls, user_hf_id) -> list[InterviewMeta] | None: request = GetAvailableInterviewsRequest(user_hf_id=user_hf_id) response_json = cls._call_endpoint(cls.url_available_interviews, request) if response_json is None: return None return GetAvailableInterviewsResponse.model_validate(response_json).interviews @classmethod def start_chat(cls, user_hf_id: str, interview_id: str) -> StartChatResponse | None: request = StartChatRequest(user_hf_id=user_hf_id, interview_id=interview_id) response_json = cls._call_endpoint(cls.url_init_chat, request) if response_json is None: return None return StartChatResponse.model_validate(response_json) @classmethod def get_agent_response(cls, chat_id: UUID, user_message: str) -> GetChatResponse | None: request = GetChatRequest(chat_id=chat_id, user_message=user_message) response_json = cls._call_endpoint(cls.url_chat_response, request) if response_json is None: return None return GetChatResponse.model_validate(response_json)