import logging
import time
from graphora import GraphoraClient
from graphora.exceptions import GraphoraAPIError, GraphoraClientError
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Initialize client
client = GraphoraClient(base_url="https://api.graphora.io")
def retry_operation(func, *args, max_retries=3, **kwargs):
"""Retry an operation with exponential backoff."""
retries = 0
delay = 1
while True:
try:
return func(*args, **kwargs)
except GraphoraAPIError as e:
# Only retry on server errors (5xx) or rate limiting (429)
if e.status_code != 429 and e.status_code < 500:
logger.error(f"Non-retryable API error: {str(e)}")
raise
retries += 1
if retries > max_retries:
logger.error(f"Max retries exceeded: {str(e)}")
raise
wait_time = delay * (2 ** (retries - 1))
logger.info(f"Retrying after error: {str(e)} (retry {retries}/{max_retries}, waiting {wait_time}s)")
time.sleep(wait_time)
except GraphoraClientError as e:
# Don't retry client errors
logger.error(f"Client error: {str(e)}")
raise
except Exception as e:
# Log unexpected errors
logger.exception(f"Unexpected error: {str(e)}")
raise
# Example usage
try:
# Load ontology
with open("ontology.yaml", "r") as f:
ontology_yaml = f.read()
# Register ontology with retry
ontology_response = retry_operation(
client.register_ontology,
ontology_yaml,
max_retries=3
)
logger.info(f"Ontology registered with ID: {ontology_response.id}")
# Transform documents
transform_response = retry_operation(
client.transform,
ontology_id=ontology_response.id,
files=["document.pdf"],
max_retries=3
)
logger.info(f"Transformation started with ID: {transform_response.id}")
except GraphoraAPIError as e:
logger.error(f"API Error (Status {e.status_code}): {str(e)}")
# Handle API errors (e.g., display user-friendly message)
except GraphoraClientError as e:
logger.error(f"Client Error: {str(e)}")
# Handle client errors (e.g., check network, validate input)
except Exception as e:
logger.exception(f"Unexpected error: {str(e)}")
# Handle unexpected errors