from typing import Optional, Dict from httpx import Client as HttpxClient, AsyncClient as HttpxAsyncClient, Response from phi.cli.settings import phi_cli_settings from phi.cli.credentials import read_auth_token from phi.utils.log import logger class Api: def __init__(self): self.headers: Dict[str, str] = { "user-agent": f"{phi_cli_settings.app_name}/{phi_cli_settings.app_version}", "Content-Type": "application/json", } self._auth_token: Optional[str] = None self._authenticated_headers = None @property def auth_token(self) -> Optional[str]: if self._auth_token is None: try: self._auth_token = read_auth_token() except Exception as e: logger.debug(f"Failed to read auth token: {e}") return self._auth_token @property def authenticated_headers(self) -> Dict[str, str]: if self._authenticated_headers is None: self._authenticated_headers = self.headers.copy() token = self.auth_token if token is not None: self._authenticated_headers[phi_cli_settings.auth_token_header] = token return self._authenticated_headers def Client(self) -> HttpxClient: return HttpxClient( base_url=phi_cli_settings.api_url, headers=self.headers, timeout=60, ) def AuthenticatedClient(self) -> HttpxClient: return HttpxClient( base_url=phi_cli_settings.api_url, headers=self.authenticated_headers, timeout=60, ) def AsyncClient(self) -> HttpxAsyncClient: return HttpxAsyncClient( base_url=phi_cli_settings.api_url, headers=self.headers, timeout=60, ) def AuthenticatedAsyncClient(self) -> HttpxAsyncClient: return HttpxAsyncClient( base_url=phi_cli_settings.api_url, headers=self.authenticated_headers, timeout=60, ) api = Api() def invalid_response(r: Response) -> bool: """Returns true if the response is invalid""" if r.status_code >= 400: return True return False