@@ -18,6 +18,7 @@ class DatalabAPIError(Exception):
1818class DuplicateItemError (DatalabAPIError ):
1919 """Raised when the API operation would create a duplicate item."""
2020
21+
2122__version__ = version ("datalab-api" )
2223
2324__all__ = ("BaseDatalabClient" , "__version__" )
@@ -230,30 +231,80 @@ def _handle_response(
230231 DuplicateItemError: For 409 conflicts or duplicate key errors
231232 DatalabAPIError: For other API errors
232233 """
233- # Handle HTTP status code errors
234- if response .status_code != expected_status :
234+ # Handle authentication errors first
235+ if response .status_code in (401 , 403 ):
236+ auth_help = (
237+ "Authentication failed. Please check your API key and ensure it's set correctly. "
238+ "You can set your API key using the DATALAB_API_KEY environment variable or "
239+ "the instance-specific <PREFIX>_DATALAB_API_KEY variable."
240+ )
235241 try :
236242 error_data = response .json ()
237243 error_message = error_data .get ("message" , str (response .content ))
244+ except ValueError :
245+ error_message = str (response .content )
246+ raise DatalabAPIError (
247+ f"HTTP { response .status_code } error at { url } : { error_message } . { auth_help } "
248+ )
238249
239- # Handle specific error cases
240- if response .status_code == 409 :
241- raise DuplicateItemError (f"Duplicate item error at { url } : { error_message } " )
250+ # Handle other HTTP status code errors
251+ if response .status_code != expected_status :
252+ try :
253+ error_data = response .json ()
254+ error_message = error_data .get ("message" , str (response .content ))
255+ except ValueError :
256+ error_message = str (response .content )
242257
258+ # Handle specific error cases with helpful messages
259+ if response .status_code == 404 :
243260 raise DatalabAPIError (
244- f"HTTP { response .status_code } error at { url } : { error_message } "
261+ f"HTTP 404 Not Found at { url } : { error_message } . "
262+ "Please check the URL/endpoint is correct and the resource exists."
245263 )
246- except ValueError :
247- # Response is not JSON
264+ elif response .status_code == 409 :
265+ raise DuplicateItemError (f"Duplicate item error at { url } : { error_message } " )
266+ elif response .status_code == 429 :
248267 raise DatalabAPIError (
249- f"HTTP { response .status_code } error at { url } : { response .content } "
268+ f"HTTP 429 Too Many Requests at { url } : { error_message } . "
269+ "You are being rate limited. Please wait before making more requests."
270+ )
271+ elif response .status_code == 500 :
272+ server_info = ""
273+ if hasattr (self , "_datalab_server_version" ):
274+ server_info = f" (Server version: { self ._datalab_server_version } )"
275+ raise DatalabAPIError (
276+ f"HTTP 500 Internal Server Error at { url } : { error_message } { server_info } . "
277+ "This is a server-side bug. Please report this issue to the datalab developers "
278+ "at https://github.com/datalab-org/datalab/issues with the full error message."
279+ )
280+ elif response .status_code == 502 :
281+ raise DatalabAPIError (
282+ f"HTTP 502 Bad Gateway at { url } : { error_message } . "
283+ "The server is having connectivity issues. Please try again later."
284+ )
285+ elif response .status_code == 503 :
286+ raise DatalabAPIError (
287+ f"HTTP 503 Service Unavailable at { url } : { error_message } . "
288+ "The datalab service is temporarily unavailable. Please report deployment "
289+ "issues to your datalab instance maintainer."
290+ )
291+ elif response .status_code == 504 :
292+ raise DatalabAPIError (
293+ f"HTTP 504 Gateway Timeout at { url } : { error_message } . "
294+ "The request timed out. Please try again or check if the operation is taking too long."
295+ )
296+ else :
297+ raise DatalabAPIError (
298+ f"HTTP { response .status_code } error at { url } : { error_message } "
250299 )
251300
252301 # Parse JSON response
253302 try :
254303 data = response .json ()
255304 except ValueError as e :
256- raise DatalabAPIError (f"Invalid JSON response from { url } : { e } " )
305+ raise DatalabAPIError (
306+ f"Invalid JSON response from { url } : { e } . Response content: { response .content } "
307+ )
257308
258309 # Handle API-level status errors
259310 if isinstance (data , dict ) and data .get ("status" ) != "success" :
0 commit comments