DocUA commited on
Commit
2ef2be1
·
1 Parent(s): 558b73f

Fix Connection error for OpenAI and DeepSeek: add retry logic and increase timeout to 120s

Browse files
Files changed (1) hide show
  1. main.py +86 -8
main.py CHANGED
@@ -251,11 +251,11 @@ class LLMAnalyzer:
251
  if provider == ModelProvider.OPENAI:
252
  if not OPENAI_API_KEY:
253
  raise ValueError(f"OpenAI API key not configured. Please set OPENAI_API_KEY environment variable to use {provider.value} provider.")
254
- self.client = openai.OpenAI(api_key=OPENAI_API_KEY)
255
  elif provider == ModelProvider.DEEPSEEK:
256
  if not DEEPSEEK_API_KEY:
257
  raise ValueError(f"DeepSeek API key not configured. Please set DEEPSEEK_API_KEY environment variable to use {provider.value} provider.")
258
- self.client = openai.OpenAI(api_key=DEEPSEEK_API_KEY, base_url="https://api.deepseek.com")
259
  elif provider == ModelProvider.ANTHROPIC:
260
  if not ANTHROPIC_API_KEY:
261
  raise ValueError(f"Anthropic API key not configured. Please set ANTHROPIC_API_KEY environment variable to use {provider.value} provider.")
@@ -312,7 +312,23 @@ class LLMAnalyzer:
312
  if not is_reasoning_model:
313
  completion_params["temperature"] = 0
314
 
315
- response = self.client.chat.completions.create(**completion_params)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
316
  response_text = response.choices[0].message.content
317
 
318
  # Verify it's valid JSON
@@ -345,7 +361,23 @@ class LLMAnalyzer:
345
  completion_params["response_format"] = {'type': 'json_object'}
346
  completion_params["temperature"] = 0
347
 
348
- response = self.client.chat.completions.create(**completion_params)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  response_text = response.choices[0].message.content
350
 
351
  # Verify and clean JSON
@@ -620,7 +652,14 @@ def generate_legal_position(
620
  raise Exception(f"Текст судового рішення занадто короткий або відсутній (довжина: {len(court_decision_text) if court_decision_text else 0} символів). Будь ласка, перевірте вхідні дані.")
621
 
622
  if provider == ModelProvider.OPENAI.value:
623
- client = OpenAI(api_key=OPENAI_API_KEY)
 
 
 
 
 
 
 
624
  try:
625
  print(f"[DEBUG] OpenAI Generation - Model: {model_name}")
626
 
@@ -654,7 +693,23 @@ def generate_legal_position(
654
  else:
655
  completion_params["temperature"] = GENERATION_TEMPERATURE
656
 
657
- response = client.chat.completions.create(**completion_params)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
658
  response_text = response.choices[0].message.content
659
  print(f"[DEBUG] OpenAI response length: {len(response_text) if response_text else 0}")
660
 
@@ -674,7 +729,14 @@ def generate_legal_position(
674
  }
675
 
676
  if provider == ModelProvider.DEEPSEEK.value:
677
- client = OpenAI(api_key=DEEPSEEK_API_KEY, base_url="https://api.deepseek.com")
 
 
 
 
 
 
 
678
  try:
679
  print(f"[DEBUG] DeepSeek Generation - Model: {model_name}")
680
 
@@ -699,7 +761,23 @@ def generate_legal_position(
699
  if not is_reasoning:
700
  completion_params["temperature"] = GENERATION_TEMPERATURE
701
 
702
- response = client.chat.completions.create(**completion_params)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
703
  response_text = response.choices[0].message.content
704
  print(f"[DEBUG] DeepSeek response length: {len(response_text) if response_text else 0}")
705
 
 
251
  if provider == ModelProvider.OPENAI:
252
  if not OPENAI_API_KEY:
253
  raise ValueError(f"OpenAI API key not configured. Please set OPENAI_API_KEY environment variable to use {provider.value} provider.")
254
+ self.client = openai.OpenAI(api_key=OPENAI_API_KEY, timeout=120.0)
255
  elif provider == ModelProvider.DEEPSEEK:
256
  if not DEEPSEEK_API_KEY:
257
  raise ValueError(f"DeepSeek API key not configured. Please set DEEPSEEK_API_KEY environment variable to use {provider.value} provider.")
258
+ self.client = openai.OpenAI(api_key=DEEPSEEK_API_KEY, base_url="https://api.deepseek.com", timeout=120.0)
259
  elif provider == ModelProvider.ANTHROPIC:
260
  if not ANTHROPIC_API_KEY:
261
  raise ValueError(f"Anthropic API key not configured. Please set ANTHROPIC_API_KEY environment variable to use {provider.value} provider.")
 
312
  if not is_reasoning_model:
313
  completion_params["temperature"] = 0
314
 
315
+ # Retry logic for OpenAI analysis
316
+ max_retries = 3
317
+ last_error = None
318
+ response = None
319
+ for attempt in range(max_retries):
320
+ try:
321
+ print(f"[DEBUG] OpenAI Analysis call attempt {attempt + 1}/{max_retries}")
322
+ response = self.client.chat.completions.create(**completion_params)
323
+ break
324
+ except Exception as api_err:
325
+ last_error = api_err
326
+ print(f"[ERROR] OpenAI Analysis attempt {attempt + 1} failed: {type(api_err).__name__}: {str(api_err)}")
327
+ if attempt < max_retries - 1:
328
+ time.sleep(2 ** attempt)
329
+ else:
330
+ raise last_error
331
+
332
  response_text = response.choices[0].message.content
333
 
334
  # Verify it's valid JSON
 
361
  completion_params["response_format"] = {'type': 'json_object'}
362
  completion_params["temperature"] = 0
363
 
364
+ # Retry logic for DeepSeek analysis
365
+ max_retries = 3
366
+ last_error = None
367
+ response = None
368
+ for attempt in range(max_retries):
369
+ try:
370
+ print(f"[DEBUG] DeepSeek Analysis call attempt {attempt + 1}/{max_retries}")
371
+ response = self.client.chat.completions.create(**completion_params)
372
+ break
373
+ except Exception as api_err:
374
+ last_error = api_err
375
+ print(f"[ERROR] DeepSeek Analysis attempt {attempt + 1} failed: {type(api_err).__name__}: {str(api_err)}")
376
+ if attempt < max_retries - 1:
377
+ time.sleep(2 ** attempt)
378
+ else:
379
+ raise last_error
380
+
381
  response_text = response.choices[0].message.content
382
 
383
  # Verify and clean JSON
 
652
  raise Exception(f"Текст судового рішення занадто короткий або відсутній (довжина: {len(court_decision_text) if court_decision_text else 0} символів). Будь ласка, перевірте вхідні дані.")
653
 
654
  if provider == ModelProvider.OPENAI.value:
655
+ # Increase timeout for complex models and HF Spaces environment
656
+ client = OpenAI(api_key=OPENAI_API_KEY, timeout=120.0)
657
+
658
+ # Retry logic for connection errors
659
+ max_retries = 3
660
+ last_error = None
661
+ response = None
662
+
663
  try:
664
  print(f"[DEBUG] OpenAI Generation - Model: {model_name}")
665
 
 
693
  else:
694
  completion_params["temperature"] = GENERATION_TEMPERATURE
695
 
696
+ # Execute with retries
697
+ for attempt in range(max_retries):
698
+ try:
699
+ print(f"[DEBUG] OpenAI API call attempt {attempt + 1}/{max_retries}")
700
+ response = client.chat.completions.create(**completion_params)
701
+ break
702
+ except Exception as api_err:
703
+ last_error = api_err
704
+ error_type = type(api_err).__name__
705
+ print(f"[ERROR] OpenAI API attempt {attempt + 1} failed: {error_type}: {str(api_err)}")
706
+ if attempt < max_retries - 1:
707
+ wait_time = 2 ** attempt # 1, 2, 4 seconds
708
+ print(f"[DEBUG] Retrying in {wait_time}s...")
709
+ time.sleep(wait_time)
710
+ else:
711
+ raise last_error
712
+
713
  response_text = response.choices[0].message.content
714
  print(f"[DEBUG] OpenAI response length: {len(response_text) if response_text else 0}")
715
 
 
729
  }
730
 
731
  if provider == ModelProvider.DEEPSEEK.value:
732
+ # Increase timeout for DeepSeek API
733
+ client = OpenAI(api_key=DEEPSEEK_API_KEY, base_url="https://api.deepseek.com", timeout=120.0)
734
+
735
+ # Retry logic for DeepSeek
736
+ max_retries = 3
737
+ last_error = None
738
+ response = None
739
+
740
  try:
741
  print(f"[DEBUG] DeepSeek Generation - Model: {model_name}")
742
 
 
761
  if not is_reasoning:
762
  completion_params["temperature"] = GENERATION_TEMPERATURE
763
 
764
+ # Execute with retries
765
+ for attempt in range(max_retries):
766
+ try:
767
+ print(f"[DEBUG] DeepSeek API call attempt {attempt + 1}/{max_retries}")
768
+ response = client.chat.completions.create(**completion_params)
769
+ break
770
+ except Exception as api_err:
771
+ last_error = api_err
772
+ error_type = type(api_err).__name__
773
+ print(f"[ERROR] DeepSeek API attempt {attempt + 1} failed: {error_type}: {str(api_err)}")
774
+ if attempt < max_retries - 1:
775
+ wait_time = 2 ** attempt
776
+ print(f"[DEBUG] Retrying in {wait_time}s...")
777
+ time.sleep(wait_time)
778
+ else:
779
+ raise last_error
780
+
781
  response_text = response.choices[0].message.content
782
  print(f"[DEBUG] DeepSeek response length: {len(response_text) if response_text else 0}")
783