jeongsoo's picture
Add application file
2771c11
import requests
import os
from dotenv import load_dotenv
# ν™˜κ²½ λ³€μˆ˜ λ‘œλ“œ
load_dotenv()
class DeepSeekLLM:
"""DeepSeek APIλ₯Ό μ‚¬μš©ν•œ μ–Έμ–΄ λͺ¨λΈ 클래슀"""
def __init__(self):
"""
DeepSeek API μ΄ˆκΈ°ν™”
ν™˜κ²½ λ³€μˆ˜μ—μ„œ 섀정을 κ°€μ Έμ˜΄:
- DEEPSEEK_API_KEY: API ν‚€
- DEEPSEEK_ENDPOINT: API μ—”λ“œν¬μΈνŠΈ URL
- DEEPSEEK_MODEL: μ‚¬μš©ν•  λͺ¨λΈ 이름
"""
self.api_key = os.getenv("DEEPSEEK_API_KEY")
self.endpoint = os.getenv("DEEPSEEK_ENDPOINT", "https://api.deepseek.com/v1/chat/completions")
self.model = os.getenv("DEEPSEEK_MODEL", "deepseek-chat")
if not self.api_key:
raise ValueError("DEEPSEEK_API_KEY ν™˜κ²½ λ³€μˆ˜κ°€ μ„€μ •λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
print(f"DeepSeek LLM μ΄ˆκΈ°ν™”: λͺ¨λΈ={self.model}, μ—”λ“œν¬μΈνŠΈ={'섀정됨' if self.endpoint else 'κΈ°λ³Έκ°’'}")
def generate_response(self, query, temperature=0.7, max_tokens=500):
"""
단일 μ§ˆμ˜μ— λŒ€ν•œ 응닡 생성
Args:
query: μ‚¬μš©μž 질문
temperature: μ‘λ‹΅μ˜ λ‹€μ–‘μ„± (0.0-1.0)
max_tokens: μ΅œλŒ€ 토큰 수
Returns:
str: μƒμ„±λœ 응닡
"""
# μ‹œμŠ€ν…œ λ©”μ‹œμ§€: 항상 μ˜μ–΄λ‘œ 응닡
system_message = "You are a helpful assistant. Always respond in English, regardless of the language used in the question. Keep your answers clear, concise, and helpful."
# λ©”μ‹œμ§€ ꡬ성
messages = [
{"role": "system", "content": system_message},
{"role": "user", "content": query}
]
# API μš”μ²­
return self._call_api(messages, temperature, max_tokens)
def chat_completion(self, messages, temperature=0.7, max_tokens=500):
"""
λŒ€ν™” 이λ ₯을 ν¬ν•¨ν•œ 응닡 생성
Args:
messages: λ©”μ‹œμ§€ λͺ©λ‘ [{"role": "user", "content": "..."}, ...]
temperature: μ‘λ‹΅μ˜ λ‹€μ–‘μ„± (0.0-1.0)
max_tokens: μ΅œλŒ€ 토큰 수
Returns:
str: μƒμ„±λœ 응닡
"""
# 첫 λ©”μ‹œμ§€κ°€ μ‹œμŠ€ν…œ λ©”μ‹œμ§€κ°€ μ•„λ‹ˆλ©΄ μΆ”κ°€
if not messages or messages[0]["role"] != "system":
system_message = {"role": "system",
"content": "You are a helpful assistant. Always respond in English, regardless of the language used in the question."}
messages = [system_message] + messages
# API μš”μ²­
return self._call_api(messages, temperature, max_tokens)
def _call_api(self, messages, temperature, max_tokens):
"""
DeepSeek API 호좜
Args:
messages: λ©”μ‹œμ§€ λͺ©λ‘
temperature: μ‘λ‹΅μ˜ λ‹€μ–‘μ„±
max_tokens: μ΅œλŒ€ 토큰 수
Returns:
str: μƒμ„±λœ 응닡
"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.api_key}"
}
data = {
"model": self.model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
try:
print(f"DeepSeek API μš”μ²­: λ©”μ‹œμ§€ 수={len(messages)}, μ˜¨λ„={temperature}")
response = requests.post(self.endpoint, headers=headers, json=data)
# 응닡 처리
if response.status_code == 200:
result = response.json()
if (result.get('choices') and
len(result['choices']) > 0 and
result['choices'][0].get('message') and
result['choices'][0]['message'].get('content')):
content = result['choices'][0]['message']['content'].strip()
print(f"DeepSeek API 응닡 성곡: {len(content)} 자")
return content
else:
print(f"DeepSeek API 응닡 ν˜•μ‹ 였λ₯˜: {result}")
return "I couldn't generate a response. Please try again."
else:
print(f"DeepSeek API 였λ₯˜: μƒνƒœ μ½”λ“œ {response.status_code}")
print(f"였λ₯˜ 상세: {response.text}")
return f"An error occurred (Status code: {response.status_code})"
except Exception as e:
print(f"DeepSeek API μ˜ˆμ™Έ λ°œμƒ: {str(e)}")
return f"An error occurred: {str(e)}"