11import asyncio
22from typing import Any , Optional
33
4- import aiohttp
54from aiohttp import ClientSession , ClientTimeout , TCPConnector
65from aiohttp .client_exceptions import ClientError
76from pydantic import BaseModel
@@ -101,18 +100,14 @@ def __init__(
101100
102101 async def _make_request (self , method : str , url : str , ** kwargs ) -> Any :
103102 """Make HTTP request with retry logic."""
104- batch_size = len (kwargs .get ('json' , {}).get ('urls' , [1 ])) if kwargs .get ('json' ) else 1
105- timeout = ClientTimeout (total = self .timeout .total * batch_size )
106-
107103 for attempt in range (self .max_retries ):
108104 try :
109105 logger .info (
110106 f"🚀 Making { method } request to { url } (Attempt { attempt + 1 } /{ self .max_retries } )"
111107 )
112108 logger .debug (f"🔍 Request parameters: { kwargs } " )
113109
114- # Use the calculated timeout for this request
115- async with self .session .request (method , url , timeout = timeout , ** kwargs ) as response :
110+ async with self .session .request (method , url , ** kwargs ) as response :
116111 logger .debug (f"📥 Response status: { response .status } " )
117112 result = await handle_async_response (response )
118113 logger .info (f"✅ Request completed successfully: { method } { url } " )
@@ -141,6 +136,33 @@ async def _make_request(self, method: str, url: str, **kwargs) -> Any:
141136 logger .info (f"⏳ Waiting { retry_delay } s before retry { attempt + 2 } " )
142137 await asyncio .sleep (retry_delay )
143138
139+ async def markdownify (self , website_url : str ):
140+ """Send a markdownify request"""
141+ logger .info (f"🔍 Starting markdownify request for { website_url } " )
142+
143+ request = MarkdownifyRequest (website_url = website_url )
144+ logger .debug ("✅ Request validation passed" )
145+
146+ result = await self ._make_request (
147+ "POST" , f"{ API_BASE_URL } /markdownify" , json = request .model_dump ()
148+ )
149+ logger .info ("✨ Markdownify request completed successfully" )
150+ return result
151+
152+ async def get_markdownify (self , request_id : str ):
153+ """Get the result of a previous markdownify request"""
154+ logger .info (f"🔍 Fetching markdownify result for request { request_id } " )
155+
156+ # Validate input using Pydantic model
157+ GetMarkdownifyRequest (request_id = request_id )
158+ logger .debug ("✅ Request ID validation passed" )
159+
160+ result = await self ._make_request (
161+ "GET" , f"{ API_BASE_URL } /markdownify/{ request_id } "
162+ )
163+ logger .info (f"✨ Successfully retrieved result for request { request_id } " )
164+ return result
165+
144166 async def smartscraper (
145167 self ,
146168 website_url : str ,
@@ -158,17 +180,11 @@ async def smartscraper(
158180 )
159181 logger .debug ("✅ Request validation passed" )
160182
161- try :
162- async with self .session .post (
163- f"{ API_BASE_URL } /smartscraper" , json = request .model_dump ()
164- ) as response :
165- response .raise_for_status ()
166- result = await handle_async_response (response )
167- logger .info ("✨ Smartscraper request completed successfully" )
168- return result
169- except aiohttp .ClientError as e :
170- logger .error (f"❌ Smartscraper request failed: { str (e )} " )
171- raise ConnectionError (f"Failed to connect to API: { str (e )} " )
183+ result = await self ._make_request (
184+ "POST" , f"{ API_BASE_URL } /smartscraper" , json = request .model_dump ()
185+ )
186+ logger .info ("✨ Smartscraper request completed successfully" )
187+ return result
172188
173189 async def get_smartscraper (self , request_id : str ):
174190 """Get the result of a previous smartscraper request"""
@@ -178,80 +194,8 @@ async def get_smartscraper(self, request_id: str):
178194 GetSmartScraperRequest (request_id = request_id )
179195 logger .debug ("✅ Request ID validation passed" )
180196
181- async with self .session .get (
182- f"{ API_BASE_URL } /smartscraper/{ request_id } "
183- ) as response :
184- result = await handle_async_response (response )
185- logger .info (f"✨ Successfully retrieved result for request { request_id } " )
186- return result
187-
188- async def get_credits (self ):
189- """Get credits information"""
190- logger .info ("💳 Fetching credits information" )
191-
192- async with self .session .get (
193- f"{ API_BASE_URL } /credits" ,
194- ) as response :
195- result = await handle_async_response (response )
196- logger .info (
197- f"✨ Credits info retrieved: { result .get ('remaining_credits' )} credits remaining"
198- )
199- return result
200-
201- async def submit_feedback (
202- self , request_id : str , rating : int , feedback_text : Optional [str ] = None
203- ):
204- """Submit feedback for a request"""
205- logger .info (f"📝 Submitting feedback for request { request_id } " )
206- logger .debug (f"⭐ Rating: { rating } , Feedback: { feedback_text } " )
207-
208- feedback = FeedbackRequest (
209- request_id = request_id , rating = rating , feedback_text = feedback_text
210- )
211- logger .debug ("✅ Feedback validation passed" )
212-
213- async with self .session .post (
214- f"{ API_BASE_URL } /feedback" , json = feedback .model_dump ()
215- ) as response :
216- result = await handle_async_response (response )
217- logger .info ("✨ Feedback submitted successfully" )
218- return result
219-
220- async def close (self ):
221- """Close the session to free up resources"""
222- logger .info ("🔒 Closing AsyncClient session" )
223- await self .session .close ()
224- logger .debug ("✅ Session closed successfully" )
225-
226- async def __aenter__ (self ):
227- return self
228-
229- async def __aexit__ (self , exc_type , exc_val , exc_tb ):
230- await self .close ()
231-
232- async def markdownify (self , website_url : str ):
233- """Send a markdownify request"""
234- logger .info (f"🔍 Starting markdownify request for { website_url } " )
235-
236- request = MarkdownifyRequest (website_url = website_url )
237- logger .debug ("✅ Request validation passed" )
238-
239- result = await self ._make_request (
240- "POST" , f"{ API_BASE_URL } /markdownify" , json = request .model_dump ()
241- )
242- logger .info ("✨ Markdownify request completed successfully" )
243- return result
244-
245- async def get_markdownify (self , request_id : str ):
246- """Get the result of a previous markdownify request"""
247- logger .info (f"🔍 Fetching markdownify result for request { request_id } " )
248-
249- # Validate input using Pydantic model
250- GetMarkdownifyRequest (request_id = request_id )
251- logger .debug ("✅ Request ID validation passed" )
252-
253197 result = await self ._make_request (
254- "GET" , f"{ API_BASE_URL } /markdownify /{ request_id } "
198+ "GET" , f"{ API_BASE_URL } /smartscraper /{ request_id } "
255199 )
256200 logger .info (f"✨ Successfully retrieved result for request { request_id } " )
257201 return result
@@ -292,3 +236,46 @@ async def get_localscraper(self, request_id: str):
292236 )
293237 logger .info (f"✨ Successfully retrieved result for request { request_id } " )
294238 return result
239+
240+ async def submit_feedback (
241+ self , request_id : str , rating : int , feedback_text : Optional [str ] = None
242+ ):
243+ """Submit feedback for a request"""
244+ logger .info (f"📝 Submitting feedback for request { request_id } " )
245+ logger .debug (f"⭐ Rating: { rating } , Feedback: { feedback_text } " )
246+
247+ feedback = FeedbackRequest (
248+ request_id = request_id , rating = rating , feedback_text = feedback_text
249+ )
250+ logger .debug ("✅ Feedback validation passed" )
251+
252+ result = await self ._make_request (
253+ "POST" , f"{ API_BASE_URL } /feedback" , json = feedback .model_dump ()
254+ )
255+ logger .info ("✨ Feedback submitted successfully" )
256+ return result
257+
258+ async def get_credits (self ):
259+ """Get credits information"""
260+ logger .info ("💳 Fetching credits information" )
261+
262+ result = await self ._make_request (
263+ "GET" ,
264+ f"{ API_BASE_URL } /credits" ,
265+ )
266+ logger .info (
267+ f"✨ Credits info retrieved: { result .get ('remaining_credits' )} credits remaining"
268+ )
269+ return result
270+
271+ async def close (self ):
272+ """Close the session to free up resources"""
273+ logger .info ("🔒 Closing AsyncClient session" )
274+ await self .session .close ()
275+ logger .debug ("✅ Session closed successfully" )
276+
277+ async def __aenter__ (self ):
278+ return self
279+
280+ async def __aexit__ (self , exc_type , exc_val , exc_tb ):
281+ await self .close ()
0 commit comments