import json from urllib.request import urlopen from openf1_registry import f1_api, api_endpoints ### Essential tools ### def get_api_endpoint(endpoint: str) -> dict: """ Retrieve the API endpoint URL and filter metadata for a given OpenF1 endpoint. Args: endpoint (str): The name of the OpenF1 API endpoint (e.g., 'sessions', 'laps'). Returns: dict: A dictionary containing: - status (str): 'success' if endpoint exists, 'error' otherwise - api_string (str): The full API URL for the endpoint - filter_metadata (dict): Available filters for the endpoint """ try: url = f1_api.base_url + api_endpoints.get(endpoint, None) return { "status": "success", "api_string": url, "filter_metadata": f1_api.get_endpoint_filters(endpoint) } except: return { "status": "error", "api_string": f"Endpoint {endpoint} not found. Available endpoints: {f1_api.list_all_endpoints()}", "filter_metadata": dict() } def get_filter_string(filter_name: str, filter_value: str, operator: str = "=") -> str: """ Create a filter string for OpenF1 API requests. Args: filter_name (str): The name of the filter to apply. filter_value (str): The value to filter by. operator (str, optional): The comparison operator. Defaults to "=". Returns: str: Formatted filter string that can be appended to an API request. """ return f"{filter_name}{operator}{filter_value}&" def apply_filters(api_string: str, *filters: str) -> str: """ Apply one or more filter strings to an API endpoint URL. Args: api_string (str): The base API endpoint URL. *filters (str): Variable number of filter strings to apply. Returns: str: The complete API URL with all filters applied. """ if filters: for filter in filters: api_string += filter return api_string.rstrip("&") # Remove trailing & for last filter def send_request(api_string: str) -> dict: """ Send an HTTP GET request to the specified API endpoint and return the JSON response. Args: api_string (str): The complete API URL to send the request to. Returns: dict: The JSON response parsed as a Python dictionary. Raises: Exception: If there's an error during the HTTP request or JSON parsing. """ try: response = urlopen(api_string) data = json.loads(response.read().decode('utf-8')) return data except Exception as e: print(f"Error: {e}") raise ### LLM helper functions ### def get_api_endpoints() -> dict: """ Retrieve a list of all available OpenF1 API endpoints. Returns: dict: A dictionary containing a single key 'endpoints' with a list of available endpoint names as strings. """ return { "endpoints": f1_api.list_all_endpoints(), } def get_endpoint_info(endpoint: str) -> dict: """ Retrieve detailed information about a specific OpenF1 API endpoint. Args: endpoint (str): The name of the endpoint to get information about. Returns: dict: A dictionary containing: - endpoint (str): The name of the endpoint - endpoint_filters (list): Available filters for this endpoint - endpoint_help (str): Help text describing the endpoint's purpose and usage """ return { "endpoint": endpoint, "endpoint_filters": f1_api.get_endpoint_filters(endpoint), "endpoint_help": f1_api.get_endpoint_help(endpoint) } def get_filter_info(filter_name: str) -> dict: """ Retrieve detailed information about a specific OpenF1 API filter. Args: filter_name (str): The name of the filter to get information about. Returns: dict: A dictionary containing: - filter_name (str): The name of the filter - filter_metadata (dict): Metadata about the filter, including description, valid values, and usage examples """ return { "filter_name": filter_name, "filter_metadata": f1_api.get_filter_help(filter_name) }