Skip to content

Commit 919efc4

Browse files
suncadesundebiao
andauthored
fix validate_api_key (#790)
Co-authored-by: sundebiao <[email protected]>
1 parent 2da4865 commit 919efc4

File tree

4 files changed

+194
-2
lines changed

4 files changed

+194
-2
lines changed

lazyllm/module/llms/onlinemodule/supplier/deepseek.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from urllib.parse import urljoin
2+
import requests
23
import lazyllm
34
from ..base import OnlineChatModuleBase
45

@@ -14,3 +15,15 @@ def _get_system_prompt(self):
1415

1516
def _set_chat_url(self):
1617
self._url = urljoin(self._base_url, 'chat/completions')
18+
19+
def _validate_api_key(self):
20+
try:
21+
models_url = urljoin(self._base_url, 'models')
22+
headers = {
23+
'Authorization': f'Bearer {self._api_key}',
24+
'Content-Type': 'application/json'
25+
}
26+
response = requests.get(models_url, headers=headers, timeout=10)
27+
return response.status_code == 200
28+
except Exception:
29+
return False

lazyllm/module/llms/onlinemodule/supplier/doubao.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@ def _get_system_prompt(self):
2424
def _set_chat_url(self):
2525
self._url = urljoin(self._base_url, 'chat/completions')
2626

27+
def _validate_api_key(self):
28+
'''Validate API Key by sending a minimal request'''
29+
try:
30+
# Doubao (Volcano Engine) validates API key using a minimal chat request
31+
chat_url = urljoin(self._base_url, 'chat/completions')
32+
headers = {
33+
'Authorization': f'Bearer {self._api_key}',
34+
'Content-Type': 'application/json'
35+
}
36+
data = {
37+
'model': self._model_name,
38+
'messages': [{'role': 'user', 'content': 'hi'}],
39+
'max_tokens': 1 # Only generate 1 token for validation
40+
}
41+
response = requests.post(chat_url, headers=headers, json=data, timeout=10)
42+
return response.status_code == 200
43+
except Exception:
44+
return False
2745

2846
class DoubaoEmbedding(OnlineEmbeddingModuleBase):
2947
def __init__(self,
@@ -47,7 +65,7 @@ def _encapsulated_data(self, input: Union[List, str], **kwargs) -> Dict[str, str
4765
if isinstance(input, str):
4866
input = [{'text': input}]
4967
elif isinstance(input, list):
50-
# 验证输入格式,最多为1段文本+1张图片
68+
# Validate input format, at most 1 text segment + 1 image
5169
if len(input) == 0:
5270
raise ValueError('Input list cannot be empty')
5371
if len(input) > 2:
@@ -65,7 +83,7 @@ def _encapsulated_data(self, input: Union[List, str], **kwargs) -> Dict[str, str
6583
return json_data
6684

6785
def _parse_response(self, response: Dict, input: Union[List, str]) -> List[float]:
68-
# 豆包多模态Embedding返回融合的单个embedding
86+
# Doubao multimodal embedding returns a single fused embedding
6987
return response['data']['embedding']
7088

7189

lazyllm/module/llms/onlinemodule/supplier/kimi.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import lazyllm
22
from urllib.parse import urljoin
3+
import requests
34
from ..base import OnlineChatModuleBase
45

56
class KimiModule(OnlineChatModuleBase):
@@ -28,3 +29,15 @@ def _format_vl_chat_image_url(self, image_url, mime):
2829

2930
def _format_vl_chat_query(self, query: str):
3031
return query
32+
33+
def _validate_api_key(self):
34+
try:
35+
models_url = urljoin(self._base_url, 'v1/models')
36+
headers = {
37+
'Authorization': f'Bearer {self._api_key}',
38+
'Content-Type': 'application/json'
39+
}
40+
response = requests.get(models_url, headers=headers, timeout=10)
41+
return response.status_code == 200
42+
except Exception:
43+
return False
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import pytest
2+
import os
3+
from lazyllm.module.llms.onlinemodule.supplier.deepseek import DeepSeekModule
4+
from lazyllm.module.llms.onlinemodule.supplier.doubao import DoubaoModule
5+
from lazyllm.module.llms.onlinemodule.supplier.kimi import KimiModule
6+
from lazyllm.module.llms.onlinemodule.supplier.openai import OpenAIModule
7+
from lazyllm.module.llms.onlinemodule.supplier.glm import GLMModule
8+
from lazyllm.module.llms.onlinemodule.supplier.qwen import QwenModule
9+
from lazyllm.module.llms.onlinemodule.supplier.sensenova import SenseNovaModule
10+
11+
12+
class TestValidateApiKey:
13+
'''Test online model API Key validation functionality'''
14+
15+
def setup_method(self):
16+
'''Initialize test environment, get API Keys from environment variables'''
17+
self.api_keys = {
18+
'deepseek': os.getenv('LAZYLLM_DEEPSEEK_API_KEY'),
19+
'doubao': os.getenv('LAZYLLM_DOUBAO_API_KEY'),
20+
'kimi': os.getenv('LAZYLLM_KIMI_API_KEY'),
21+
'openai': os.getenv('LAZYLLM_OPENAI_API_KEY'),
22+
'glm': os.getenv('LAZYLLM_GLM_API_KEY'),
23+
'qwen': os.getenv('LAZYLLM_QWEN_API_KEY'),
24+
'sensenova': os.getenv('LAZYLLM_SENSENOVA_API_KEY'),
25+
}
26+
# Get sensenova secret key
27+
self.sensenova_secret_key = os.getenv('LAZYLLM_SENSENOVA_SECRET_KEY')
28+
# Get doubao model name (if set in environment variables)
29+
self.doubao_model_name = os.getenv('LAZYLLM_DOUBAO_MODEL_NAME')
30+
31+
def test_deepseek_validate_valid_api_key(self):
32+
'''Test DeepSeek valid API Key validation'''
33+
if not self.api_keys['deepseek']:
34+
pytest.skip('LAZYLLM_DEEPSEEK_API_KEY environment variable is not set')
35+
36+
module = DeepSeekModule(api_key=self.api_keys['deepseek'])
37+
result = module._validate_api_key()
38+
assert result is True, 'DeepSeek valid API Key should pass validation'
39+
40+
def test_deepseek_validate_invalid_api_key(self):
41+
'''Test DeepSeek invalid API Key validation'''
42+
module = DeepSeekModule(api_key='invalid_api_key_12345')
43+
result = module._validate_api_key()
44+
assert result is False, 'DeepSeek invalid API Key should fail validation'
45+
46+
def test_doubao_validate_valid_api_key(self):
47+
'''Test Doubao valid API Key validation'''
48+
if not self.api_keys['doubao']:
49+
pytest.skip('LAZYLLM_DOUBAO_API_KEY environment variable is not set')
50+
51+
# If model name is set in environment variables, use it; otherwise use default
52+
if self.doubao_model_name:
53+
module = DoubaoModule(
54+
api_key=self.api_keys['doubao'],
55+
model=self.doubao_model_name
56+
)
57+
else:
58+
module = DoubaoModule(api_key=self.api_keys['doubao'])
59+
60+
result = module._validate_api_key()
61+
assert result is True, 'Doubao valid API Key should pass validation'
62+
63+
def test_doubao_validate_invalid_api_key(self):
64+
'''Test Doubao invalid API Key validation'''
65+
module = DoubaoModule(api_key='invalid_api_key_12345')
66+
result = module._validate_api_key()
67+
assert result is False, 'Doubao invalid API Key should fail validation'
68+
69+
def test_kimi_validate_valid_api_key(self):
70+
'''Test Kimi valid API Key validation'''
71+
if not self.api_keys['kimi']:
72+
pytest.skip('LAZYLLM_KIMI_API_KEY environment variable is not set')
73+
74+
module = KimiModule(api_key=self.api_keys['kimi'])
75+
result = module._validate_api_key()
76+
assert result is True, 'Kimi valid API Key should pass validation'
77+
78+
def test_kimi_validate_invalid_api_key(self):
79+
'''Test Kimi invalid API Key validation'''
80+
module = KimiModule(api_key='invalid_api_key_12345')
81+
result = module._validate_api_key()
82+
assert result is False, 'Kimi invalid API Key should fail validation'
83+
84+
def test_openai_validate_valid_api_key(self):
85+
'''Test OpenAI valid API Key validation'''
86+
if not self.api_keys['openai']:
87+
pytest.skip('LAZYLLM_OPENAI_API_KEY environment variable is not set')
88+
89+
module = OpenAIModule(api_key=self.api_keys['openai'])
90+
result = module._validate_api_key()
91+
assert result is True, 'OpenAI valid API Key should pass validation'
92+
93+
def test_openai_validate_invalid_api_key(self):
94+
'''Test OpenAI invalid API Key validation'''
95+
module = OpenAIModule(api_key='invalid_api_key_12345')
96+
result = module._validate_api_key()
97+
assert result is False, 'OpenAI invalid API Key should fail validation'
98+
99+
def test_glm_validate_valid_api_key(self):
100+
'''Test GLM valid API Key validation'''
101+
if not self.api_keys['glm']:
102+
pytest.skip('LAZYLLM_GLM_API_KEY environment variable is not set')
103+
104+
module = GLMModule(api_key=self.api_keys['glm'])
105+
result = module._validate_api_key()
106+
assert result is True, 'GLM valid API Key should pass validation'
107+
108+
def test_glm_validate_invalid_api_key(self):
109+
'''Test GLM invalid API Key validation'''
110+
module = GLMModule(api_key='invalid_api_key_12345')
111+
result = module._validate_api_key()
112+
assert result is False, 'GLM invalid API Key should fail validation'
113+
114+
def test_qwen_validate_valid_api_key(self):
115+
'''Test Qwen valid API Key validation'''
116+
if not self.api_keys['qwen']:
117+
pytest.skip('LAZYLLM_QWEN_API_KEY environment variable is not set')
118+
119+
module = QwenModule(api_key=self.api_keys['qwen'])
120+
result = module._validate_api_key()
121+
assert result is True, 'Qwen valid API Key should pass validation'
122+
123+
def test_qwen_validate_invalid_api_key(self):
124+
'''Test Qwen invalid API Key validation'''
125+
module = QwenModule(api_key='invalid_api_key_12345')
126+
result = module._validate_api_key()
127+
assert result is False, 'Qwen invalid API Key should fail validation'
128+
129+
def test_sensenova_validate_valid_api_key(self):
130+
'''Test SenseNova valid API Key validation'''
131+
if not self.api_keys['sensenova'] or not self.sensenova_secret_key:
132+
pytest.skip('LAZYLLM_SENSENOVA_API_KEY or LAZYLLM_SENSENOVA_SECRET_KEY environment variable is not set')
133+
134+
module = SenseNovaModule(
135+
api_key=self.api_keys['sensenova'],
136+
secret_key=self.sensenova_secret_key
137+
)
138+
result = module._validate_api_key()
139+
assert result is True, 'SenseNova valid API Key should pass validation'
140+
141+
def test_sensenova_validate_invalid_api_key(self):
142+
'''Test SenseNova invalid API Key validation'''
143+
module = SenseNovaModule(
144+
api_key='invalid_api_key_12345',
145+
secret_key='invalid_secret_key_12345'
146+
)
147+
result = module._validate_api_key()
148+
assert result is False, 'SenseNova invalid API Key should fail validation'

0 commit comments

Comments
 (0)