|
""" |
|
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." |
|
|
|
|
|
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 |
|
} |
|
|
|
|
|
response = requests.post( |
|
endpoint, |
|
headers=headers, |
|
data=json.dumps(payload), |
|
timeout=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 |
|
""" |
|
|
|
try: |
|
from langchain_openai import ChatOpenAI |
|
|
|
|
|
test_result = test_deepseek_api(api_key, endpoint, model) |
|
|
|
if not test_result["success"]: |
|
logger.error(f"DeepSeek API ์ฐ๊ฒฐ ํ
์คํธ ์คํจ: {test_result['message']}") |
|
return None |
|
|
|
|
|
|
|
client = ChatOpenAI( |
|
model=model, |
|
temperature=0.2, |
|
api_key=api_key, |
|
base_url=endpoint.rstrip("/v1/chat/completions"), |
|
) |
|
|
|
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 |