Spaces:
Paused
Paused
""" | |
DeepSeek API ํ ์คํธ ๋ฐ ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ | |
""" | |
import os | |
import logging | |
import requests | |
import json | |
from typing import Dict, Any, Optional | |
# ๋ก๊น ์ค์ | |
logger = logging.getLogger("DeepSeekUtils") | |
class DeepSeekError(Exception): | |
"""DeepSeek API ๊ด๋ จ ์ค๋ฅ""" | |
pass | |
def test_deepseek_api(api_key: str, endpoint: str, model: str) -> Dict[str, Any]: | |
""" | |
DeepSeek API ์ฐ๊ฒฐ ํ ์คํธ | |
Args: | |
api_key: DeepSeek API ํค | |
endpoint: DeepSeek API ์๋ํฌ์ธํธ | |
model: ์ฌ์ฉํ ๋ชจ๋ธ๋ช | |
Returns: | |
ํ ์คํธ ๊ฒฐ๊ณผ ๋์ ๋๋ฆฌ (์ฑ๊ณต ์ฌ๋ถ ๋ฐ ๋ฉ์์ง) | |
""" | |
if not api_key: | |
logger.error("DeepSeek API ํค๊ฐ ์ ๊ณต๋์ง ์์์ต๋๋ค.") | |
return { | |
"success": False, | |
"message": "API ํค๊ฐ ์ ๊ณต๋์ง ์์์ต๋๋ค.", | |
"status_code": None, | |
"response": None | |
} | |
try: | |
logger.info(f"DeepSeek API ์ฐ๊ฒฐ ํ ์คํธ ์์: {endpoint}, ๋ชจ๋ธ: {model}") | |
# ํ ์คํธ์ฉ ๊ฐ๋จํ ํ๋กฌํํธ | |
test_prompt = "Hello, please respond with a short greeting." | |
# API ์์ฒญ ํค๋ ๋ฐ ๋ฐ์ดํฐ | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {api_key}" | |
} | |
payload = { | |
"model": model, | |
"messages": [{"role": "user", "content": test_prompt}], | |
"temperature": 0.7, | |
"max_tokens": 50 | |
} | |
# API ์์ฒญ ์ ์ก | |
response = requests.post( | |
endpoint, | |
headers=headers, | |
data=json.dumps(payload), | |
timeout=10 # 10์ด ํ์์์ | |
) | |
# ์๋ต ํ์ธ | |
if response.status_code == 200: | |
logger.info("DeepSeek API ์ฐ๊ฒฐ ์ฑ๊ณต") | |
response_data = response.json() | |
# ์๋ต ๋ด์ฉ ํ์ธ | |
if "choices" in response_data and len(response_data["choices"]) > 0: | |
message_content = response_data["choices"][0].get("message", {}).get("content", "") | |
return { | |
"success": True, | |
"message": "API ์ฐ๊ฒฐ ์ฑ๊ณต", | |
"status_code": response.status_code, | |
"response": message_content[:100] + "..." if len(message_content) > 100 else message_content | |
} | |
else: | |
return { | |
"success": True, | |
"message": "API ์ฐ๊ฒฐ ์ฑ๊ณตํ์ผ๋ ์๋ต ํ์์ด ์์๊ณผ ๋ค๋ฆ ๋๋ค.", | |
"status_code": response.status_code, | |
"response": response_data | |
} | |
else: | |
logger.error(f"DeepSeek API ์ค๋ฅ: ์ํ ์ฝ๋ {response.status_code}") | |
error_message = "" | |
try: | |
error_data = response.json() | |
error_message = error_data.get("error", {}).get("message", str(error_data)) | |
except: | |
error_message = response.text | |
return { | |
"success": False, | |
"message": f"API ์ค๋ฅ: {error_message}", | |
"status_code": response.status_code, | |
"response": error_message | |
} | |
except requests.exceptions.Timeout: | |
logger.error("DeepSeek API ์์ฒญ ์๊ฐ ์ด๊ณผ") | |
return { | |
"success": False, | |
"message": "API ์์ฒญ ์๊ฐ ์ด๊ณผ", | |
"status_code": None, | |
"response": None | |
} | |
except requests.exceptions.ConnectionError: | |
logger.error("DeepSeek API ์ฐ๊ฒฐ ์คํจ") | |
return { | |
"success": False, | |
"message": "API ์๋ฒ ์ฐ๊ฒฐ ์คํจ", | |
"status_code": None, | |
"response": None | |
} | |
except Exception as e: | |
logger.error(f"DeepSeek API ํ ์คํธ ์ค ์์์น ๋ชปํ ์ค๋ฅ: {e}", exc_info=True) | |
return { | |
"success": False, | |
"message": f"์์์น ๋ชปํ ์ค๋ฅ: {str(e)}", | |
"status_code": None, | |
"response": None | |
} | |
def create_deepseek_client(api_key: str, endpoint: str, model: str): | |
""" | |
DeepSeek ํด๋ผ์ด์ธํธ ์์ฑ (LangChain ํธํ) | |
Args: | |
api_key: DeepSeek API ํค | |
endpoint: DeepSeek API ์๋ํฌ์ธํธ | |
model: ์ฌ์ฉํ ๋ชจ๋ธ๋ช | |
Returns: | |
DeepSeek ํด๋ผ์ด์ธํธ ๊ฐ์ฒด ๋๋ None | |
""" | |
# LangChain๊ณผ DeepSeek ํตํฉ ์๋ | |
try: | |
from langchain_openai import ChatOpenAI | |
# API ์ฐ๊ฒฐ ํ ์คํธ ๋จผ์ ์ํ | |
test_result = test_deepseek_api(api_key, endpoint, model) | |
if not test_result["success"]: | |
logger.error(f"DeepSeek API ์ฐ๊ฒฐ ํ ์คํธ ์คํจ: {test_result['message']}") | |
return None | |
# ์ ์ ์ฐ๊ฒฐ ์ ํด๋ผ์ด์ธํธ ์์ฑ | |
# DeepSeek๋ OpenAI ํธํ API๋ฅผ ์ ๊ณตํ๋ฏ๋ก ChatOpenAI๋ฅผ ์ฌ์ฉ | |
client = ChatOpenAI( | |
model=model, | |
temperature=0.2, | |
api_key=api_key, | |
base_url=endpoint.rstrip("/v1/chat/completions"), # OpenAI ํธํ ๋ฒ ์ด์ค URL | |
) | |
logger.info(f"DeepSeek ํด๋ผ์ด์ธํธ ์์ฑ ์ฑ๊ณต: {model}") | |
return client | |
except ImportError as e: | |
logger.error(f"ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ ์คํจ: {e}") | |
return None | |
except Exception as e: | |
logger.error(f"DeepSeek ํด๋ผ์ด์ธํธ ์์ฑ ์ค ์ค๋ฅ: {e}", exc_info=True) | |
return None |