|
|
import os |
|
|
import requests |
|
|
import openai |
|
|
from dotenv import load_dotenv |
|
|
import json |
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
class LLM: |
|
|
|
|
|
usages = [] |
|
|
|
|
|
def __init__(self, model_name, logger=None, user_id=None): |
|
|
self.model_name = model_name |
|
|
self.logger = logger |
|
|
self.user_id = user_id |
|
|
self.api_key = None |
|
|
self.api_base = None |
|
|
|
|
|
def reset(self, api_key=None, api_base=None, model_name=None): |
|
|
if api_key: |
|
|
self.api_key = api_key |
|
|
if api_base: |
|
|
self.api_base = api_base |
|
|
if model_name: |
|
|
self.model_name = model_name |
|
|
self.client = openai.Client(api_key=self.api_key, base_url=self.api_base) |
|
|
|
|
|
def generate(self, prompt, system='', usage=True): |
|
|
try: |
|
|
if self.model_name in ['deepseek-chat', 'deepseek-reasoner']: |
|
|
response = self.client.chat.completions.create( |
|
|
model=self.model_name, |
|
|
messages=[ |
|
|
{'role': 'system', 'content': system}, |
|
|
{'role': 'user', 'content': prompt} |
|
|
], |
|
|
temperature=0.7, |
|
|
top_p=1.0, |
|
|
frequency_penalty=0.0, |
|
|
presence_penalty=0.0 |
|
|
) |
|
|
answer = response.choices[0].message.content |
|
|
usage = { |
|
|
'completion_tokens': response.usage.completion_tokens, |
|
|
'prompt_tokens': response.usage.prompt_tokens, |
|
|
'total_tokens': response.usage.total_tokens |
|
|
} |
|
|
else: |
|
|
messages=[{'role': 'system', 'content': system}, |
|
|
{'role': 'user', 'content': prompt}] |
|
|
raw_request = { |
|
|
"model": self.model_name, |
|
|
"temperature": 0.7, |
|
|
"top_p": 1.0, |
|
|
"frequency_penalty": 0.0, |
|
|
"presence_penalty": 0.0 |
|
|
} |
|
|
|
|
|
HEADERS = { |
|
|
"Content-Type": "application/json", |
|
|
"Authorization": "Bearer {}".format(self.api_key) |
|
|
} |
|
|
response = requests.post(self.api_base, headers=HEADERS, data=json.dumps({"messages": messages, **raw_request})) |
|
|
response.raise_for_status() |
|
|
response = response.json() |
|
|
answer = response["choices"][0]["message"]["content"] |
|
|
if self.model_name == 'DeepSeek-R1-671B': |
|
|
answer = answer.split('\n</think>\n\n')[1] |
|
|
usage = { |
|
|
'completion_tokens': response['usage']['completion_tokens'], |
|
|
'prompt_tokens': response['usage']['prompt_tokens'], |
|
|
'total_tokens': response['usage']['total_tokens'] |
|
|
} |
|
|
if self.logger: |
|
|
self.logger.info(f"[LLM] UserID: {self.user_id} Key: {self.api_key}, Model: {self.model_name}, Usage: {usage}") |
|
|
if usage: |
|
|
self.usages.append(usage) |
|
|
return answer |
|
|
|
|
|
except Exception as e: |
|
|
return f'An error occurred: {e}' |
|
|
|
|
|
def get_total_usage(self): |
|
|
total_usage = { |
|
|
'completion_tokens': 0, |
|
|
'prompt_tokens': 0, |
|
|
'total_tokens': 0 |
|
|
} |
|
|
for usage in self.usages: |
|
|
for key, value in usage.items(): |
|
|
total_usage[key] += value |
|
|
return total_usage |
|
|
|
|
|
def clear_usage(self): |
|
|
self.usages = [] |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
llm = LLM('deepseek-chat') |
|
|
print(llm.generate('Hello, how are you?', 'You are a helpful assistant.', usage=True)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|