Le client synchrone (Olostep) offre une interface bloquante parfaite pour les scripts et les cas d’utilisation simples.
from olostep import Olostep# Fournis la clé API soit en passant le paramètre 'api_key' soit# en définissant la variable d'environnement OLOSTEP_API_KEY# Le client synchrone gère automatiquement la gestion des ressources# Pas besoin de fermeture explicite - les ressources sont nettoyées après chaque opérationclient = Olostep(api_key="YOUR_REAL_KEY")scrape_result = client.scrapes.create(url_to_scrape="https://example.com")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Traite efficacement plusieurs URLbatch = client.batches.create( urls=[ "https://www.google.com/search?q=python", "https://www.google.com/search?q=javascript", "https://www.google.com/search?q=typescript" ])# Attends la fin et traite les résultatsfor item in batch.items(): content = item.retrieve(["html"]) print(f"Processed {item.url}: {len(content.html_content)} bytes")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Extrait tous les liens d'un site webmaps = client.maps.create(url="https://example.com")# Obtiens toutes les URL découvertesurls = []for url in maps.urls(): urls.append(url) if len(urls) >= 10: # Limite pour la démo breakprint(f"Found {len(urls)} URLs")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Obtiens des réponses à partir de pages web en utilisant l'IAanswer = client.answers.create( task="What is the main topic of https://example.com?")print(f"Answer: {answer.answer}")
Le client asynchrone (AsyncOlostep) est le client recommandé pour les applications haute performance, les services backend, et lorsque tu dois gérer de nombreuses requêtes simultanées.
from olostep import AsyncOlostep# Fournis la clé API soit en passant le paramètre 'api_key' soit# en définissant la variable d'environnement OLOSTEP_API_KEY# GESTION DES RESSOURCES# ======================# Le SDK prend en charge deux modèles d'utilisation pour la gestion des ressources :# 1. Gestionnaire de Contexte (Recommandé pour une utilisation ponctuelle) :# Gère automatiquement le nettoyage des ressourcesasync with AsyncOlostep(api_key="YOUR_REAL_KEY") as client: scrape_result = await client.scrapes.create(url_to_scrape="https://example.com")# Le transport est automatiquement fermé ici# 2. Fermeture Explicite (Pour les services de longue durée) :# Nécessite un nettoyage manuel des ressourcesclient = AsyncOlostep(api_key="YOUR_REAL_KEY")try: scrape_result = await client.scrapes.create(url_to_scrape="https://example.com")finally: await client.close() # Ferme manuellement le transport
import asynciofrom olostep import AsyncOlostepasync def main(): async with AsyncOlostep(api_key="your-api-key") as client: # Extrait tous les liens d'un site web maps = await client.maps.create(url="https://example.com") # Obtiens toutes les URL découvertes urls = [] async for url in maps.urls(): urls.append(url) if len(urls) >= 10: # Limite pour la démo break print(f"Found {len(urls)} URLs")asyncio.run(main())
import asynciofrom olostep import AsyncOlostepasync def main(): async with AsyncOlostep(api_key="your-api-key") as client: # Obtiens des réponses à partir de pages web en utilisant l'IA answer = await client.answers.create( task="What is the main topic of https://example.com?" ) print(f"Answer: {answer.answer}")asyncio.run(main())
Capture toutes les erreurs SDK en utilisant la classe d’exception de base :
from olostep import Olostep, Olostep_BaseErrorclient = Olostep(api_key="your-api-key")try: result = client.scrapes.create(url_to_scrape="https://example.com")except Olostep_BaseError as e: print(f"Error has occurred: {type(e).__name__}") print(f"Error message: {e}")
Pour des informations détaillées sur la gestion des erreurs, y compris la hiérarchie complète des exceptions et les options de gestion des erreurs granulaires, voir Gestion détaillée des erreurs.
Le SDK réessaie automatiquement en cas d’erreurs transitoires (problèmes de réseau, problèmes temporaires du serveur) en fonction de la configuration RetryStrategy. Tu peux personnaliser le comportement de réessai en passant une instance de RetryStrategy lors de la création du client :
Le SDK gère intelligemment divers formats d’entrée pour un maximum de commodité :
from olostep import Olostep, Countryclient = Olostep(api_key="your-api-key")# Formats : chaîne, liste ou énumérationclient.scrapes.create(url_to_scrape="https://example.com", formats="html")client.scrapes.create(url_to_scrape="https://example.com", formats=["html", "markdown"])# Pays : chaînes insensibles à la casse ou énumérationsclient.scrapes.create(url_to_scrape="https://example.com", country="us")client.scrapes.create(url_to_scrape="https://example.com", country=Country.US)# Listes : valeurs uniques ou listesclient.batches.create(urls="https://example.com") # URL uniqueclient.batches.create(urls=["https://a.com", "https://b.com"]) # Plusieurs URL
Traitement par Lots avec Identifiants Personnalisés
from olostep import Olostep, Countryclient = Olostep(api_key="your-api-key")batch = client.batches.create([ {"url": "https://www.google.com/search?q=python", "custom_id": "search_1"}, {"url": "https://www.google.com/search?q=javascript", "custom_id": "search_2"}, {"url": "https://www.google.com/search?q=typescript", "custom_id": "search_3"}],country=Country.US,parser="@olostep/google-search")# Traite les résultats par identifiant personnalisé# Lors de l'utilisation d'un parser, récupère le contenu JSON au lieu de HTMLfor item in batch.items(): if item.custom_id == "search_2": content = item.retrieve(["json"]) print(f"Search result: {content.json_content}")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Extrait tous les liens avec filtrage avancémaps = client.maps.create( url="https://www.bbc.com", include_subdomain=True, include_urls=["/articles/**", "/news/**"], exclude_urls=["/ads/**", "/tracking/**"])# Obtiens les URL filtréesurls = []for url in maps.urls(): urls.append(url)print(f"Found {len(urls)} relevant URLs")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Crée d'abord une réponsecreated_answer = client.answers.create( task="What is the main topic of https://example.com?")# Puis récupère-la en utilisant l'IDanswer = client.answers.get(answer_id=created_answer.id)print(f"Answer: {answer.answer}")
from olostep import Olostepclient = Olostep(api_key="your-api-key")# Obtiens le contenu par ID de récupérationresult = client.retrieve.get(retrieve_id="ret_123")# Obtiens plusieurs formatsresult = client.retrieve.get(retrieve_id="ret_123", formats=["html", "markdown", "text", "json"])
La classe RetryStrategy contrôle comment le SDK Olostep gère les erreurs API transitoires via des réessais automatiques avec un backoff exponentiel et un jitter. Cela aide à assurer un fonctionnement fiable dans les environnements de production où des problèmes de réseau temporaires, des limites de taux et une surcharge du serveur peuvent causer des échecs intermittents.
from olostep import AsyncOlostep, RetryStrategy# Crée une stratégie de réessai personnaliséeretry_strategy = RetryStrategy( max_retries=3, initial_delay=1.0, jitter_min=0.2, # Jitter minimum de 20% jitter_max=0.8, # Jitter maximum de 80%)# Utilise avec le clientasync with AsyncOlostep( api_key="your-api-key", retry_strategy=retry_strategy) as client: result = await client.scrapes.create("https://example.com")
# Moins de réessais, délais plus courtsretry_strategy = RetryStrategy( max_retries=3, initial_delay=1.0, jitter_min=0.2, jitter_max=0.8)# Durée max : ~12.6s
# Désactive les réessais pour un retour d'échec immédiatretry_strategy = RetryStrategy(max_retries=0)client = AsyncOlostep(api_key="your-api-key", retry_strategy=retry_strategy)
# Optimisé pour les opérations à haut volumeretry_strategy = RetryStrategy( max_retries=2, initial_delay=0.5, jitter_min=0.1, jitter_max=0.3 # Jitter plus faible pour un timing plus prévisible)# Durée max : ~1.95s
Le jitter ajoute une randomisation pour éviter les problèmes de “thundering herd” lorsque de nombreux clients réessaient simultanément. Le jitter est calculé comme suit :
Lorsque tous les réessais sont épuisés, l’erreur originale est levée :
try: result = await client.scrapes.create("https://example.com")except OlostepServerError_TemporaryIssue as e: print(f"Failed after all retries: {e}") # Gère l'échec permanent
Le SDK Olostep fournit une hiérarchie d’exceptions complète pour différents scénarios d’échec. Toutes les exceptions héritent de Olostep_BaseError.Il existe trois principaux types d’erreurs qui héritent directement de Olostep_BaseError :
Olostep_APIConnectionError - Échecs de connexion au niveau réseau
OlostepServerError_BaseError - Erreurs levées (en quelque sorte) par le serveur API
OlostepClientError_BaseError - Erreurs levées par le SDK client
Olostep_APIConnectionError est séparé des erreurs serveur car il représente des échecs au niveau réseau qui se produisent avant que l’API puisse traiter la requête. Ce sont des problèmes de couche de transport (échecs DNS ou HTTP, délais d’attente, connexion refusée, etc.) plutôt que des erreurs au niveau API. Les codes de statut HTTP (4xx, 5xx) sont considérés comme des réponses API et sont classés comme erreurs serveur, même s’ils indiquent des problèmes.
Pour la plupart des cas d’utilisation, capture l’erreur de base et affiche le nom de l’erreur :
from olostep import AsyncOlostep, Olostep_BaseErrortry: result = await client.scrapes.create(url_to_scrape="https://example.com")except Olostep_BaseError as e: print(f"Error has occurred: {type(e).__name__}") print(f"Error message: {e}")
Cette approche capture toutes les erreurs SDK et fournit des informations claires sur ce qui a mal tourné. Le nom de l’erreur (par exemple, OlostepServerError_AuthFailed) est suffisamment descriptif pour comprendre le problème.
Si tu as besoin d’une gestion des erreurs plus spécifique, capture directement les types d’erreurs spécifiques. Évite d’utiliser OlostepServerError_BaseError ou OlostepClientError_BaseError - ces classes de base indiquent seulement qui a levé l’erreur (serveur vs client), pas qui est responsable de la corriger. C’est un détail d’implémentation qui n’aide pas à la logique de gestion des erreurs.Au lieu de cela, capture les types d’erreurs spécifiques qui indiquent le problème réel :
from olostep import ( AsyncOlostep, Olostep_BaseError, Olostep_APIConnectionError, OlostepServerError_AuthFailed, OlostepServerError_CreditsExhausted, OlostepClientError_NoAPIKey,)try: result = await client.scrapes.create(url_to_scrape="https://example.com")except Olostep_APIConnectionError as e: print(f"Network error: {type(e).__name__}")except OlostepServerError_AuthFailed: print("Invalid API key")except OlostepServerError_CreditsExhausted: print("Credits exhausted")except OlostepClientError_NoAPIKey: print("API key not provided")except Olostep_BaseError as e: print(f"Error has occurred: {type(e).__name__}")