AILanguageCompanion / deepseek_client.py
koura718's picture
Add DeepSeek
af01c91
raw
history blame
3.71 kB
import os
import time
import requests
from typing import List, Dict, Optional
from config import Config
from openai import OpenAI
class DeepseekClient(OpenAI):
def __init__(self, api_key=None, **kwargs):
super().__init__(api_key=api_key or Config.get_deepseek_key(), **kwargs)
if not self.api_key:
raise ValueError("Deepseek API key is not set")
self.base_url = Config.DEEPSEEK_API_BASE
self.max_retries = 3
self.retry_delay = 2 # Initial delay in seconds
# Debug info
print(f"Initializing DeepseekClient with:")
print(f" api_key: {'*' * 8}{self.api_key[-4:]}" if self.api_key else " api_key: None")
print(f" base_url: {self.base_url}")
def create(self, messages: List[Dict[str, str]], model: str = None, response_format: Optional[Dict] = None, **kwargs) -> str:
if not self.api_key:
raise ValueError("Deepseek API key is not set")
# Debug info
print("\n[DeepseekClient] Starting create request")
print(f" Using model: {model or Config.DEEPSEEK_MODEL}")
print(f" Messages count: {len(messages)}")
if messages:
print(f" First message: {messages[0]['content'][:50]}...")
retries = 0
last_error = None
while retries < self.max_retries:
try:
print(f"[DeepseekClient] Attempting API request (retry {retries + 1}/{self.max_retries})")
response = self.chat.completions.create(
model=model or Config.DEEPSEEK_MODEL,
messages=messages,
temperature=0.7,
max_tokens=1000,
response_format=response_format,
**kwargs
)
response_data = response.model_dump()
if "error" in response_data:
raise ValueError(f"Deepseek API returned error: {response_data['error']}")
if not response_data.get('choices'):
raise ValueError("No choices in Deepseek API response")
if not response_data['choices'][0].get('message'):
raise ValueError("No message in Deepseek API response choice")
content = response_data['choices'][0]['message']['content']
print("[DeepseekClient] API request successful")
print(f"[DeepseekClient] Received response content (length: {len(content)})")
return content
except requests.exceptions.RequestException as e:
print(f"[DeepseekClient] Request failed: {str(e)}")
print(f"Deepseek Request Error: {str(e)}")
last_error = e
retries += 1
if retries < self.max_retries:
time.sleep(self.retry_delay * (2 ** retries))
except ValueError as e:
print(f"[DeepseekClient] Value error occurred: {str(e)}")
print(f"Deepseek Value Error: {str(e)}")
last_error = e
break
except Exception as e:
print(f"[DeepseekClient] Unexpected error occurred: {str(e)}")
print(f"Deepseek Unexpected Error: {str(e)}")
last_error = e
break
# If all retries failed or other error occurred
error_msg = str(last_error) if last_error else "Maximum retries exceeded"
if "Rate limit exceeded" in error_msg:
raise Exception(f"Deepseek rate limit exceeded. Please try again later or switch to a different model.")
raise Exception(f"Deepseek API error: {error_msg}")