Skip to content

Instantly share code, notes, and snippets.

@buvanenko
Created July 2, 2025 09:33
Show Gist options
  • Select an option

  • Save buvanenko/62e6323fca1e067b6adbb94bac89a9d1 to your computer and use it in GitHub Desktop.

Select an option

Save buvanenko/62e6323fca1e067b6adbb94bac89a9d1 to your computer and use it in GitHub Desktop.
Пример для Макса
import time
import requests
import urllib3
from typing import Dict, Any, List
# Отключение предупреждений о небезопасных запросах
urllib3.disable_warnings(category=urllib3.exceptions.InsecureRequestWarning)
# Конфигурационные константы
BASE_PROMPT = "Тебя зовут Глиномес. Ты чат-бот, созданный в качестве примера для Максима."
AUTH_URL = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"
CHAT_URL = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
RQ_UID = "АААААБОБА" # ЗАМЕНИ НА СВОЙ АЙДИ ПРОЕКТА
AUTH_TOKEN = "АААААБОБА" # ЗАМЕНИ НА СВОЙ КЛЮЧ
class GigaChatClient:
def __init__(self):
self.access_token: Dict[str, Any] = {
'token': "",
'expires_at': 0
}
self.messages: List[Dict[str, str]] = [{
"role": "system",
"content": BASE_PROMPT
}]
def _get_auth_headers(self) -> Dict[str, str]:
"""Генерирует заголовки для аутентификации"""
return {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'RqUID': RQ_UID,
'Authorization': f'Basic {AUTH_TOKEN}'
}
def _get_api_headers(self, token: str) -> Dict[str, str]:
"""Генерирует заголовки для API запросов"""
return {
'Accept': 'application/json',
'Authorization': f'Bearer {token}'
}
def _refresh_token(self) -> str:
"""Обновляет токен доступа"""
try:
response = requests.post(
url=AUTH_URL,
data='scope=GIGACHAT_API_PERS',
headers=self._get_auth_headers(),
verify=False,
timeout=10
)
response.raise_for_status()
token_data = response.json()
except requests.exceptions.RequestException as e:
raise ConnectionError(f"Ошибка получения токена: {str(e)}")
self.access_token = {
'token': token_data['access_token'],
'expires_at': time.time() + token_data.get('expires_in', 900)
}
return self.access_token['token']
def get_token(self) -> str:
"""Возвращает актуальный токен доступа"""
if time.time() >= self.access_token['expires_at']:
return self._refresh_token()
return self.access_token['token']
def get_response(self, user_message: str) -> str:
"""Получает ответ от модели на сообщение пользователя"""
try:
token = self.get_token()
# Добавляем сообщение пользователя в историю
self.messages.append({
"role": "user",
"content": user_message
})
# Формируем запрос
payload = {
"model": "GigaChat",
"messages": self.messages,
"max_tokens": 512,
"repetition_penalty": 1,
}
# Отправляем запрос
response = requests.post(
url=CHAT_URL,
headers=self._get_api_headers(token),
json=payload,
verify=False,
timeout=30
)
response.raise_for_status()
data = response.json()
# Извлекаем ответ
assistant_message = data['choices'][0]['message']['content']
# Добавляем ответ в историю
self.messages.append({
"role": "assistant",
"content": assistant_message
})
return assistant_message
except requests.exceptions.RequestException as e:
# Удаляем последнее сообщение при ошибке
if self.messages and self.messages[-1]["role"] == "user":
self.messages.pop()
return f"⚠️ Ошибка сети: {str(e)}"
except (KeyError, IndexError) as e:
return f"⚠️ Ошибка обработки ответа: {str(e)}"
except Exception as e:
return f"⚠️ Неизвестная ошибка: {str(e)}"
def main():
"""Основной цикл взаимодействия с пользователем"""
chat = GigaChatClient()
print("Чат-бот Глиномес запущен. Для выхода введите 'выход'.")
while True:
try:
user_input = input('\nUSER: ').strip()
if not user_input:
continue
if user_input.lower() in ['выход', 'exit', 'quit']:
print("До свидания!")
break
response = chat.get_response(user_input)
print('\nBOT:', response)
except KeyboardInterrupt:
print("\nЗавершение работы...")
break
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment