-
Notifications
You must be signed in to change notification settings - Fork 70
Expand file tree
/
Copy pathmodel.py
More file actions
130 lines (112 loc) · 5.56 KB
/
model.py
File metadata and controls
130 lines (112 loc) · 5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import openai
import dotenv
import logging
import requests
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Загружаем переменные окружения из файла .env
try:
env = dotenv.dotenv_values(".env")
YA_API_KEY = env["YA_API_KEY"]
YA_FOLDER_ID = env["YA_FOLDER_ID"]
except FileNotFoundError:
raise FileNotFoundError("Файл .env не найден. Убедитесь, что он существует в корневой директории проекта.")
except KeyError as e:
raise KeyError(f"Переменная окружения {str(e)} не найдена в файле .env. Проверьте его содержимое.")
class LLMService:
"""
Параметры:
sys_prompt - системный промпт для указания роли ассистента
use_data - имя файла для включения полезной информации в системный промпт
"""
def __init__(self, prompt_file):
"""
Инициализация сервиса LLM.
Аргументы:
prompt_file (str): Путь к файлу с системным промптом для LLM.
"""
# Читаем системный промпт из файла и сохраняем в атрибут sys_prompt
with open(prompt_file, encoding='utf-8') as f:
self.sys_prompt = f.read()
try:
# Создаём клиента OpenAI с вашим API-ключом и базовым URL для Yandex LLM API
self.client = openai.OpenAI(
api_key=YA_API_KEY,
base_url="https://llm.api.cloud.yandex.net/v1",
)
# Формируем путь к модели с использованием идентификатора каталога из .env
self.model = f"gpt://{YA_FOLDER_ID}/yandexgpt-lite"
except Exception as e:
logger.error(f"Ошибка при авторизации модели. Проверьте настройки аккаунта и область действия ключа API. {str(e)}")
def chat(self, message, history):
# Берем последние два сообщения из истории, чтобы не перегружать запрос
messages=[
{"role": "system", "content": self.sys_prompt}] + history[-4:] + [{"role": "user", "content": message}]
logger.debug(f"Messages: {messages}")
try:
# Обращаемся к API
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=0.3,
max_tokens=256,
)
logger.debug(f"Response: {response}")
# Возвращаем ответ
return response.choices[0].message.content
except Exception as e:
return f"Произошла ошибка: {str(e)}"
class OllamaService:
"""
Сервис для взаимодействия с локальным Ollama API.
"""
def __init__(self, prompt_file, base_url="http://localhost:11434", model="gemma3:1b"):
"""
Аргументы:
prompt_file (str): Путь к файлу с системным промптом.
base_url (str): URL Ollama API.
model (str): Название модели Ollama.
"""
with open(prompt_file, encoding='utf-8') as f:
self.sys_prompt = f.read()
self.base_url = base_url
self.model = model
def chat(self, message, history):
"""
Отправляет сообщение в Ollama и получает ответ.
Аргументы:
message (str): Сообщение пользователя.
history (list): История сообщений (список dict с ключами 'role' и 'content').
Возвращает:
str: Ответ Ollama.
"""
# Формируем сообщения для Ollama (system prompt + история + новое сообщение)
messages = [{"role": "system", "content": self.sys_prompt}] + history[-4:] + [{"role": "user", "content": message}]
payload = {
"model": self.model,
"messages": messages,
"stream": False
}
try:
response = requests.post(f"{self.base_url}/api/chat", json=payload, timeout=60)
response.raise_for_status()
data = response.json()
return data["message"]["content"]
except Exception as e:
logger.error(f"Ollama error: {str(e)}")
return f"Ошибка Ollama: {str(e)}"
llm_1 = LLMService('prompts/prompt_1.txt')
def chat_with_llm(user_message, history):
"""
Чат с использованием сервиса LLM.
К переменной history добавляется сообщение пользователя и ответ LLM.
Аргументы:
user_message (str): Сообщение пользователя.
history (list): История сообщений.
Возвращает:
str: Ответ LLM.
"""
llm_response = llm_1.chat(user_message, history)
history.append({"role": "user", "content": user_message}) # добавляем сообщение пользователя в историю
history.append({"role": "assistant", "content": llm_response})
return llm_response