Fix Connection error for OpenAI and DeepSeek: add retry logic and increase timeout to 120s
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|