--- a
+++ b/src/utils/helpers.py
@@ -0,0 +1,79 @@
+# utils/helpers.py
+"""
+Helper Utilities for Clinical Trial Analysis
+
+This module provides utility functions that support various operations across the
+clinical trial analysis application. It includes network communication helpers
+and other general-purpose utilities.
+
+Functions:
+    curl_with_status_check: Send a GET request and handle response validation.
+"""
+
+import logging
+
+import requests
+
+# Configure logging
+logger = logging.getLogger(__name__)
+
+
+def curl_with_status_check(url: str) -> dict:
+    """
+    Send a GET request to a URL and check the response status.
+
+    This function handles HTTP requests to external APIs, including error checking
+    and response validation. It automatically raises exceptions for non-successful
+    HTTP responses.
+
+    Args:
+        url (str): The URL to send the GET request to.
+
+    Returns:
+        dict: The JSON response parsed as a dictionary.
+
+    Raises:
+        requests.exceptions.RequestException: If the request fails due to network issues,
+            timeout, or non-successful HTTP status code.
+    """
+    logger.info("Sending GET request to URL: %s", url)
+
+    # Send the request with a timeout to prevent hanging
+    response = requests.get(url, timeout=10)
+
+    # Raise an exception for non-200 status codes
+    response.raise_for_status()
+
+    logger.info("Request successful.")
+
+    # Return the parsed JSON response
+    return response.json()
+
+
+def get_non_empty_input(
+    prompt: str, empty_message: str = "Input cannot be empty. Please try again."
+) -> str:
+    """
+    Repeatedly prompts the user for input until a non-empty response is provided.
+
+    This function displays a prompt to the user and collects their input. If the user
+    provides an empty string (or just whitespace), it displays the specified empty_message
+    and prompts again. This continues until a non-empty response is received.
+
+    Args:
+        prompt (str): The question or prompt to display to the user.
+        empty_message (str): The message to display if the user provides an empty response.
+                            Defaults to "Input cannot be empty. Please try again."
+
+    Returns:
+        str: The non-empty user input (with leading/trailing whitespace removed).
+    """
+    while True:
+        if user_input := input(prompt).strip():
+            if user_input.lower() in ["quit", "exit"]:
+                print("Exiting program.")
+                import sys
+
+                sys.exit(0)
+            return user_input.strip()
+        print(empty_message)