Spaces:
Sleeping
Sleeping
Add DeepSeek
Browse files- config.py +2 -2
- deepseek_client.py +33 -45
- llm_client.py +6 -1
- locales/en/translation.json +2 -0
- locales/ja/translation.json +2 -0
- ui_components.py +1 -1
config.py
CHANGED
@@ -31,8 +31,8 @@ class Config:
|
|
31 |
]
|
32 |
|
33 |
# DeepSeek model configuration
|
34 |
-
DEEPSEEK_MODEL = "deepseek-chat"
|
35 |
-
DEEPSEEK_API_BASE = "https://api.deepseek.com
|
36 |
|
37 |
# Chat context settings
|
38 |
MAX_HISTORY_CHATS = 10
|
|
|
31 |
]
|
32 |
|
33 |
# DeepSeek model configuration
|
34 |
+
DEEPSEEK_MODEL = "deepseek-chat-1.3"
|
35 |
+
DEEPSEEK_API_BASE = "https://api.deepseek.com"
|
36 |
|
37 |
# Chat context settings
|
38 |
MAX_HISTORY_CHATS = 10
|
deepseek_client.py
CHANGED
@@ -3,67 +3,49 @@ import time
|
|
3 |
import requests
|
4 |
from typing import List, Dict, Optional
|
5 |
from config import Config
|
|
|
6 |
|
7 |
-
class DeepseekClient:
|
8 |
-
def __init__(self):
|
9 |
-
|
10 |
if not self.api_key:
|
11 |
raise ValueError("Deepseek API key is not set")
|
12 |
self.base_url = Config.DEEPSEEK_API_BASE
|
13 |
self.max_retries = 3
|
14 |
self.retry_delay = 2 # Initial delay in seconds
|
15 |
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
17 |
if not self.api_key:
|
18 |
raise ValueError("Deepseek API key is not set")
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
retries = 0
|
21 |
last_error = None
|
22 |
|
23 |
while retries < self.max_retries:
|
24 |
try:
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
"model": model or Config.AUTO_MODEL,
|
34 |
-
"messages": messages,
|
35 |
-
"temperature": 0.7,
|
36 |
-
"max_tokens": 1000
|
37 |
-
}
|
38 |
-
|
39 |
-
if response_format:
|
40 |
-
data["response_format"] = response_format
|
41 |
-
|
42 |
-
response = requests.post(
|
43 |
-
f"{self.base_url}/chat/completions",
|
44 |
-
headers=headers,
|
45 |
-
json=data,
|
46 |
-
timeout=30 # Added timeout
|
47 |
)
|
48 |
|
49 |
-
|
50 |
-
error_data = response.json()
|
51 |
-
error_message = error_data.get('error', {}).get('message', 'Rate limit exceeded')
|
52 |
-
print(f"Rate limit error: {error_message}")
|
53 |
-
|
54 |
-
# Check if it's a provider-specific rate limit
|
55 |
-
if 'metadata' in error_data.get('error', {}):
|
56 |
-
provider = error_data['error']['metadata'].get('provider_name', 'Unknown')
|
57 |
-
raise Exception(f"Rate limit exceeded for provider: {provider}")
|
58 |
-
|
59 |
-
wait_time = self.retry_delay * (2 ** retries)
|
60 |
-
print(f"Rate limit exceeded. Waiting {wait_time} seconds before retry...")
|
61 |
-
time.sleep(wait_time)
|
62 |
-
retries += 1
|
63 |
-
continue
|
64 |
-
|
65 |
-
response.raise_for_status()
|
66 |
-
response_data = response.json()
|
67 |
|
68 |
if "error" in response_data:
|
69 |
raise ValueError(f"Deepseek API returned error: {response_data['error']}")
|
@@ -74,19 +56,25 @@ class DeepseekClient:
|
|
74 |
if not response_data['choices'][0].get('message'):
|
75 |
raise ValueError("No message in Deepseek API response choice")
|
76 |
|
77 |
-
|
|
|
|
|
|
|
78 |
|
79 |
except requests.exceptions.RequestException as e:
|
|
|
80 |
print(f"Deepseek Request Error: {str(e)}")
|
81 |
last_error = e
|
82 |
retries += 1
|
83 |
if retries < self.max_retries:
|
84 |
time.sleep(self.retry_delay * (2 ** retries))
|
85 |
except ValueError as e:
|
|
|
86 |
print(f"Deepseek Value Error: {str(e)}")
|
87 |
last_error = e
|
88 |
break
|
89 |
except Exception as e:
|
|
|
90 |
print(f"Deepseek Unexpected Error: {str(e)}")
|
91 |
last_error = e
|
92 |
break
|
|
|
3 |
import requests
|
4 |
from typing import List, Dict, Optional
|
5 |
from config import Config
|
6 |
+
from openai import OpenAI
|
7 |
|
8 |
+
class DeepseekClient(OpenAI):
|
9 |
+
def __init__(self, api_key=None, **kwargs):
|
10 |
+
super().__init__(api_key=api_key or Config.get_deepseek_key(), **kwargs)
|
11 |
if not self.api_key:
|
12 |
raise ValueError("Deepseek API key is not set")
|
13 |
self.base_url = Config.DEEPSEEK_API_BASE
|
14 |
self.max_retries = 3
|
15 |
self.retry_delay = 2 # Initial delay in seconds
|
16 |
|
17 |
+
# Debug info
|
18 |
+
print(f"Initializing DeepseekClient with:")
|
19 |
+
print(f" api_key: {'*' * 8}{self.api_key[-4:]}" if self.api_key else " api_key: None")
|
20 |
+
print(f" base_url: {self.base_url}")
|
21 |
+
|
22 |
+
def create(self, messages: List[Dict[str, str]], model: str = None, response_format: Optional[Dict] = None, **kwargs) -> str:
|
23 |
if not self.api_key:
|
24 |
raise ValueError("Deepseek API key is not set")
|
25 |
|
26 |
+
# Debug info
|
27 |
+
print("\n[DeepseekClient] Starting create request")
|
28 |
+
print(f" Using model: {model or Config.DEEPSEEK_MODEL}")
|
29 |
+
print(f" Messages count: {len(messages)}")
|
30 |
+
if messages:
|
31 |
+
print(f" First message: {messages[0]['content'][:50]}...")
|
32 |
+
|
33 |
retries = 0
|
34 |
last_error = None
|
35 |
|
36 |
while retries < self.max_retries:
|
37 |
try:
|
38 |
+
print(f"[DeepseekClient] Attempting API request (retry {retries + 1}/{self.max_retries})")
|
39 |
+
response = self.chat.completions.create(
|
40 |
+
model=model or Config.DEEPSEEK_MODEL,
|
41 |
+
messages=messages,
|
42 |
+
temperature=0.7,
|
43 |
+
max_tokens=1000,
|
44 |
+
response_format=response_format,
|
45 |
+
**kwargs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
)
|
47 |
|
48 |
+
response_data = response.model_dump()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
if "error" in response_data:
|
51 |
raise ValueError(f"Deepseek API returned error: {response_data['error']}")
|
|
|
56 |
if not response_data['choices'][0].get('message'):
|
57 |
raise ValueError("No message in Deepseek API response choice")
|
58 |
|
59 |
+
content = response_data['choices'][0]['message']['content']
|
60 |
+
print("[DeepseekClient] API request successful")
|
61 |
+
print(f"[DeepseekClient] Received response content (length: {len(content)})")
|
62 |
+
return content
|
63 |
|
64 |
except requests.exceptions.RequestException as e:
|
65 |
+
print(f"[DeepseekClient] Request failed: {str(e)}")
|
66 |
print(f"Deepseek Request Error: {str(e)}")
|
67 |
last_error = e
|
68 |
retries += 1
|
69 |
if retries < self.max_retries:
|
70 |
time.sleep(self.retry_delay * (2 ** retries))
|
71 |
except ValueError as e:
|
72 |
+
print(f"[DeepseekClient] Value error occurred: {str(e)}")
|
73 |
print(f"Deepseek Value Error: {str(e)}")
|
74 |
last_error = e
|
75 |
break
|
76 |
except Exception as e:
|
77 |
+
print(f"[DeepseekClient] Unexpected error occurred: {str(e)}")
|
78 |
print(f"Deepseek Unexpected Error: {str(e)}")
|
79 |
last_error = e
|
80 |
break
|
llm_client.py
CHANGED
@@ -25,7 +25,12 @@ class LLMClient:
|
|
25 |
if openrouter_key:
|
26 |
self.openrouter_client = OpenRouterClient()
|
27 |
if deepseek_key:
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
29 |
except Exception as e:
|
30 |
print(f"Error initializing API clients: {str(e)}")
|
31 |
|
|
|
25 |
if openrouter_key:
|
26 |
self.openrouter_client = OpenRouterClient()
|
27 |
if deepseek_key:
|
28 |
+
try:
|
29 |
+
self.deepseek_client = DeepseekClient(api_key=deepseek_key)
|
30 |
+
except Exception as e:
|
31 |
+
print(f"Failed to initialize DeepseekClient: {str(e)}")
|
32 |
+
print("Check your Deepseek API key and endpoint configuration")
|
33 |
+
raise
|
34 |
except Exception as e:
|
35 |
print(f"Error initializing API clients: {str(e)}")
|
36 |
|
locales/en/translation.json
CHANGED
@@ -12,12 +12,14 @@
|
|
12 |
"timezone": "Timezone",
|
13 |
"api_key_openai": "OpenAI API Key",
|
14 |
"api_key_openrouter": "OpenRouter API Key",
|
|
|
15 |
"save_settings": "Save Settings",
|
16 |
"error_missing_key": "Please enter API key",
|
17 |
"error_api_call": "Error calling API",
|
18 |
"error_model_switch": "Failed to switch to the selected model",
|
19 |
"error_model_switch_openai": "Failed to switch to GPT-4. Please check your OpenAI API key.",
|
20 |
"error_model_switch_openrouter": "Failed to switch to model. Please check your OpenRouter API key.",
|
|
|
21 |
"error_rate_limit": "Rate limit exceeded. Please try again later.",
|
22 |
"error_network": "Network connection error. Please check your connection.",
|
23 |
"default_system_prompt": "You are a helpful assistant. Please provide clear and concise responses.",
|
|
|
12 |
"timezone": "Timezone",
|
13 |
"api_key_openai": "OpenAI API Key",
|
14 |
"api_key_openrouter": "OpenRouter API Key",
|
15 |
+
"api_key_deepseek": "DeepSeek API Key",
|
16 |
"save_settings": "Save Settings",
|
17 |
"error_missing_key": "Please enter API key",
|
18 |
"error_api_call": "Error calling API",
|
19 |
"error_model_switch": "Failed to switch to the selected model",
|
20 |
"error_model_switch_openai": "Failed to switch to GPT-4. Please check your OpenAI API key.",
|
21 |
"error_model_switch_openrouter": "Failed to switch to model. Please check your OpenRouter API key.",
|
22 |
+
"error_model_switch_deepseek": "Failed to switch to model. Please check your DeepSeek API key.",
|
23 |
"error_rate_limit": "Rate limit exceeded. Please try again later.",
|
24 |
"error_network": "Network connection error. Please check your connection.",
|
25 |
"default_system_prompt": "You are a helpful assistant. Please provide clear and concise responses.",
|
locales/ja/translation.json
CHANGED
@@ -12,12 +12,14 @@
|
|
12 |
"timezone": "タイムゾーン",
|
13 |
"api_key_openai": "OpenAI APIキー",
|
14 |
"api_key_openrouter": "OpenRouter APIキー",
|
|
|
15 |
"save_settings": "設定を保存",
|
16 |
"error_missing_key": "APIキーを入力してください",
|
17 |
"error_api_call": "APIの呼び出しでエラーが発生しました",
|
18 |
"error_model_switch": "モデルの切り替えに失敗しました",
|
19 |
"error_model_switch_openai": "GPT-4への切り替えに失敗しました。OpenAI APIキーを確認してください。",
|
20 |
"error_model_switch_openrouter": "モデルの切り替えに失敗しました。OpenRouter APIキーを確認してください。",
|
|
|
21 |
"error_rate_limit": "レート制限を超えました。しばらく待ってから再試行してください。",
|
22 |
"error_network": "ネットワーク接続エラーが発生しました。接続を確認してください。",
|
23 |
"default_system_prompt": "私は役立つアシスタントです。明確で簡潔な応答を提供します。",
|
|
|
12 |
"timezone": "タイムゾーン",
|
13 |
"api_key_openai": "OpenAI APIキー",
|
14 |
"api_key_openrouter": "OpenRouter APIキー",
|
15 |
+
"api_key_deepseek": "DeepSeek APIキー",
|
16 |
"save_settings": "設定を保存",
|
17 |
"error_missing_key": "APIキーを入力してください",
|
18 |
"error_api_call": "APIの呼び出しでエラーが発生しました",
|
19 |
"error_model_switch": "モデルの切り替えに失敗しました",
|
20 |
"error_model_switch_openai": "GPT-4への切り替えに失敗しました。OpenAI APIキーを確認してください。",
|
21 |
"error_model_switch_openrouter": "モデルの切り替えに失敗しました。OpenRouter APIキーを確認してください。",
|
22 |
+
"error_model_switch_deepseek": "モデルの切り替えに失敗しました。DeepSeek APIキーを確認してください。",
|
23 |
"error_rate_limit": "レート制限を超えました。しばらく待ってから再試行してください。",
|
24 |
"error_network": "ネットワーク接続エラーが発生しました。接続を確認してください。",
|
25 |
"default_system_prompt": "私は役立つアシスタントです。明確で簡潔な応答を提供します。",
|
ui_components.py
CHANGED
@@ -52,7 +52,7 @@ def render_sidebar(i18n, chat_manager):
|
|
52 |
# Model selection - デフォルトをOpenRouter-Autoに設定
|
53 |
model = st.selectbox(
|
54 |
i18n.get_text("model_selection"),
|
55 |
-
["OpenRouter-Auto", "OpenAI", "Claude-3.5", "Gemini-2.0", "
|
56 |
index=0,
|
57 |
key="model_selection"
|
58 |
)
|
|
|
52 |
# Model selection - デフォルトをOpenRouter-Autoに設定
|
53 |
model = st.selectbox(
|
54 |
i18n.get_text("model_selection"),
|
55 |
+
["OpenRouter-Auto", "OpenAI", "Claude-3.5", "Gemini-2.0", "deepseek-chat"],
|
56 |
index=0,
|
57 |
key="model_selection"
|
58 |
)
|