1
1
import asyncio
2
2
from typing import Any , Optional
3
3
4
- import aiohttp
5
4
from aiohttp import ClientSession , ClientTimeout , TCPConnector
6
5
from aiohttp .client_exceptions import ClientError
7
6
from pydantic import BaseModel
@@ -101,18 +100,14 @@ def __init__(
101
100
102
101
async def _make_request (self , method : str , url : str , ** kwargs ) -> Any :
103
102
"""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
-
107
103
for attempt in range (self .max_retries ):
108
104
try :
109
105
logger .info (
110
106
f"🚀 Making { method } request to { url } (Attempt { attempt + 1 } /{ self .max_retries } )"
111
107
)
112
108
logger .debug (f"🔍 Request parameters: { kwargs } " )
113
109
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 :
116
111
logger .debug (f"📥 Response status: { response .status } " )
117
112
result = await handle_async_response (response )
118
113
logger .info (f"✅ Request completed successfully: { method } { url } " )
@@ -141,6 +136,33 @@ async def _make_request(self, method: str, url: str, **kwargs) -> Any:
141
136
logger .info (f"⏳ Waiting { retry_delay } s before retry { attempt + 2 } " )
142
137
await asyncio .sleep (retry_delay )
143
138
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
+
144
166
async def smartscraper (
145
167
self ,
146
168
website_url : str ,
@@ -158,17 +180,11 @@ async def smartscraper(
158
180
)
159
181
logger .debug ("✅ Request validation passed" )
160
182
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
172
188
173
189
async def get_smartscraper (self , request_id : str ):
174
190
"""Get the result of a previous smartscraper request"""
@@ -178,80 +194,8 @@ async def get_smartscraper(self, request_id: str):
178
194
GetSmartScraperRequest (request_id = request_id )
179
195
logger .debug ("✅ Request ID validation passed" )
180
196
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
-
253
197
result = await self ._make_request (
254
- "GET" , f"{ API_BASE_URL } /markdownify /{ request_id } "
198
+ "GET" , f"{ API_BASE_URL } /smartscraper /{ request_id } "
255
199
)
256
200
logger .info (f"✨ Successfully retrieved result for request { request_id } " )
257
201
return result
@@ -292,3 +236,46 @@ async def get_localscraper(self, request_id: str):
292
236
)
293
237
logger .info (f"✨ Successfully retrieved result for request { request_id } " )
294
238
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