Created
July 2, 2025 09:33
-
-
Save buvanenko/62e6323fca1e067b6adbb94bac89a9d1 to your computer and use it in GitHub Desktop.
Пример для Макса
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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