====== Yandex AI ====== * [[https://aistudio.yandex.ru/docs/ru/ai-studio/quickstart/|Как начать работать с Yandex AI Studio]] (выбираем AI SDK) * [[Язык программирования Python]] (venv1) ~/ai$ pip install yandex-ai-studio-sdk (venv1) ~/ai$ export YANDEX_API_KEY=AQVN3_tpBw9JigLSI1107j0xhkgREwzwD2VCZx5FzA (venv1) ~/ai$ export YANDEX_FOLDER_ID=b1gg4j6ru4esprat3uu7 * [[Язык программирования Python#request_to_agent.py]] ===== Черновик ===== (venv1) root@server:~/ai# cat agent_rand_hello.py import os import sys import random from yandex_ai_studio_sdk import AIStudio sdk = AIStudio( folder_id=os.getenv("YANDEX_FOLDER_ID"), auth=os.getenv("YANDEX_API_KEY") ) # 2. Локальная Python-функция def get_random_lucky_number() -> int: return random.randint(1, 100) # Регистрируем инструмент через метод sdk.tools.function lucky_number_tool = sdk.tools.function( parameters={ "type": "object", "properties": {} }, name="lucky_number", description="Используй эту функцию, когда пользователь просит назвать его счастливое число." ) # 3. Инициализируем модель через chat.completions model = sdk.chat.completions("yandexgpt").configure( temperature=0.3, tools=[lucky_number_tool] ) # Начальный запрос пользователя messages = [ {"role": "user", "content": "Привет! Назови мое счастливое число на сегодня и пожелай удачи разнообразно."} ] #messages = [ # {"role": "user", "content": "Привет! Пожелай удачи разнообразно."} #] print("Отправка первого запроса агенту...") response = model.run(messages) # Извлекаем первый вариант ответа из кортежа choice = response.choices[0] if hasattr(choice, 'tool_calls') and choice.tool_calls: print(f"-> Агент запросил вызов инструмента.") formatted_tool_calls = [] for call in choice.tool_calls: if call.function.name == "lucky_number": tool_result = get_random_lucky_number() print(f"-> Результат локальной функции: {tool_result}") # Простой подход: добавляем результат как ответ пользователя messages.append({ "role": "user", "content": f"Результат выполнения функции lucky_number: {tool_result}" }) # Отправляем обновленную историю обратно модели print("Отправка результата выполнения функции обратно агенту...") # В run() передаем только messages, tools уже настроены final_response = model.run(messages=messages) print("\nИтоговый ответ AI агента:") print(final_response.choices[0].text) else: print("\nОтвет модели:") print(choice.text) (venv1) root@server:~/ai# cat agent_email_or_cal.py import os import sys #import random import re import json from yandex_ai_studio_sdk import AIStudio sdk = AIStudio( folder_id=os.getenv("YANDEX_FOLDER_ID"), auth=os.getenv("YANDEX_API_KEY") ) # Функция для интеграции с календарем def add_to_calendar(task_title: str): """ Ваша кастомная функция для добавления события в календарь. """ print(f"[Вызов функции]: Успешно добавлено в календарь: '{task_title}'") # Примеры для тестирования (раскомментируйте нужный для проверки): user_request = "Привет! Слушай, отправь пожалуйста письмо Ивану с отчетом." #user_request = "Напомни мне завтра в 15:00 созвониться с коллегами по проекту." # Расширяем системный промт для обработки двух типов команд system_prompt = ( "Ты — ассистент, который анализирует команды пользователя и классифицирует их.\n" "Определи, что просит сделать пользователь. Ответь строго в формате JSON.\n" "Схема ответа JSON должна содержать следующие поля:\n" "- 'intent': строка, может принимать значения: 'send_email', 'add_calendar' или 'unknown'.\n" "- 'recipient_name': имя получателя (строка), если intent == 'send_email', иначе null.\n" "- 'calendar_task': текст напоминания (строка), если intent == 'add_calendar', иначе null." ) messages = [ {"role": "system", "text": system_prompt}, {"role": "user", "text": user_request} ] # Вызываем модель YandexGPT model = sdk.chat.completions("yandexgpt").configure( temperature=0.3 ) response = model.run(messages) match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL) result_text = match.group(0) #print(result_text) #sys.exit() try: # Парсим JSON-ответ от модели data = json.loads(result_text) intent = data.get("intent") # Сценарий 1: Отправка письма if intent == "send_email": recipient = data.get("recipient_name") if recipient: print(f"Обнаружена команда отправки письма. Получатель: {recipient}") else: print("Обнаружена команда отправки письма, но имя получателя не указано.") # Сценарий 2: Добавление в календарь elif intent == "add_calendar": task = data.get("calendar_task") if task: print("Обнаружена команда календаря. Вызываю функцию...") add_to_calendar(task) else: print("Обнаружена команда календаря, но текст напоминания пуст.") # Сценарий 3: Команда не распознана else: print("Команда не распознана или не требует автоматических действий.") except json.JSONDecodeError: print("Ошибка парсинга ответа модели:", result_text) (venv1) root@server:~/ai# cat agent_email_or_cal_2.py import os import sys import re import json from yandex_ai_studio_sdk import AIStudio sdk = AIStudio( folder_id=os.getenv("YANDEX_FOLDER_ID"), auth=os.getenv("YANDEX_API_KEY") ) # Функция-заглушка для отправки письма def send_email(recipient_name: str, subject: str, body: str): """ Заглушка для отправки письма. В реальном проекте здесь был бы код для отправки через SMTP или API почтового сервиса. """ print("\n" + "="*50) print(f"[ОТПРАВКА ПИСЬМА]") print(f"Получатель: {recipient_name}") print(f"Тема: {subject}") print(f"Тело письма:\n{body}") print("="*50 + "\n") print("[Заглушка] Письмо успешно отправлено (симуляция)") # Функция для интеграции с календарем def add_to_calendar(task_title: str): """ Ваша кастомная функция для добавления события в календарь. """ print(f"[Вызов функции]: Успешно добавлено в календарь: '{task_title}'") # Функция для определения интента (что хочет пользователь) def detect_intent(user_request: str): """ Первый этап: определяем намерение пользователя. """ system_prompt_intent = ( "Ты — ассистент, который анализирует команды пользователя и классифицирует их.\n" "Определи, что просит сделать пользователь. Ответь строго в формате JSON.\n" "Схема ответа JSON должна содержать только одно поле:\n" "- 'intent': строка, может принимать значения: 'send_email', 'add_calendar' или 'unknown'.\n" "\nПримеры:\n" "Запрос: 'Отправь письмо Ивану с отчетом' -> {\"intent\": \"send_email\"}\n" "Запрос: 'Напомни мне завтра в 15:00 созвониться' -> {\"intent\": \"add_calendar\"}\n" "Запрос: 'Какая сегодня погода?' -> {\"intent\": \"unknown\"}" ) messages = [ {"role": "system", "text": system_prompt_intent}, {"role": "user", "text": user_request} ] model = sdk.chat.completions("yandexgpt").configure(temperature=0.1) response = model.run(messages) match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL) if match: try: data = json.loads(match.group(0)) return data.get("intent", "unknown") except json.JSONDecodeError: return "unknown" return "unknown" # Функция для обработки отправки письма def process_email(user_request: str): """ Второй этап: если определили, что нужно отправить письмо, запрашиваем у модели составление темы и тела. """ system_prompt_email = ( "Ты — ассистент, который помогает составлять деловые письма.\n" "Проанализируй запрос пользователя и составь письмо.\n" "Ответь строго в формате JSON со следующими полями:\n" "- 'recipient_name': имя получателя (строка). Извлеки из запроса.\n" "- 'subject': тема письма (строка). Составь краткую и понятную тему.\n" "- 'body': тело письма (строка). Напиши вежливое, содержательное письмо.\n" "\nПравила:\n" "- Тема должна быть краткой и отражать суть письма (максимум 5-7 слов)\n" "- Тело письма должно быть вежливым, структурированным и соответствовать запросу\n" "- Используй стандартный деловой тон\n" "- Если в запросе не указано имя получателя, используй 'Уважаемый коллега'\n" "\nПример:\n" "Запрос: 'Отправь Ивану отчет по продажам за май'\n" "Ответ: {\"recipient_name\": \"Иван\", \"subject\": \"Отчет по продажам за май\", \"body\": \"Здравствуйте, Иван!\\n\\nНаправляю вам отчет по продажам за май месяц. В отчете вы найдете детальную информацию по каждому региону и сравнительный анализ с прошлым месяцем.\\n\\nС уважением,\\nАссистент\"}" ) messages = [ {"role": "system", "text": system_prompt_email}, {"role": "user", "text": user_request} ] model = sdk.chat.completions("yandexgpt").configure(temperature=0.3) response = model.run(messages) match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL) if match: try: data = json.loads(match.group(0)) return data except json.JSONDecodeError: return None return None # Функция для обработки добавления в календарь def process_calendar(user_request: str): """ Второй этап: если определили, что нужно добавить в календарь, запрашиваем у модели составление напоминания. """ system_prompt_calendar = ( "Ты — ассистент, который помогает создавать напоминания для календаря.\n" "Проанализируй запрос пользователя и составь четкое напоминание.\n" "Ответь строго в формате JSON с одним полем:\n" "- 'calendar_task': текст напоминания (строка). Составь конкретное, понятное описание события.\n" "\nПравила:\n" "- Напоминание должно быть четким и конкретным\n" "- Включай дату и время, если они указаны в запросе\n" "- Формулируй как действие, которое нужно выполнить\n" "\nПример:\n" "Запрос: 'Напомни мне завтра в 15:00 созвониться с коллегами по проекту'\n" "Ответ: {\"calendar_task\": \"Завтра в 15:00 созвониться с коллегами по проекту\"}" ) messages = [ {"role": "system", "text": system_prompt_calendar}, {"role": "user", "text": user_request} ] model = sdk.chat.completions("yandexgpt").configure(temperature=0.2) response = model.run(messages) match = re.search(r"\{.*\}", response.choices[0].text, re.DOTALL) if match: try: data = json.loads(match.group(0)) return data except json.JSONDecodeError: return None return None # Основная логика def main(): # Примеры для тестирования #user_request = "Привет! Слушай, отправь пожалуйста письмо Ивану с отчетом по продажам за май." user_request = "Напомни мне завтра в двенадцать созвониться с коллегами по проекту." print(f"Запрос пользователя: {user_request}\n") print("Обработка запроса...\n") # Шаг 1: Определяем намерение intent = detect_intent(user_request) print(f"Определенное намерение: {intent}") # Шаг 2: Обрабатываем в зависимости от намерения if intent == "send_email": print("\nСоставляю письмо...") email_data = process_email(user_request) if email_data: recipient = email_data.get("recipient_name") subject = email_data.get("subject") body = email_data.get("body") if subject and body: print(f"✓ Письмо составлено успешно") print(f" Получатель: {recipient}") print(f" Тема: {subject}") # Отправляем письмо send_email(recipient, subject, body) else: print("✗ Не удалось составить письмо: недостаточно данных") else: print("✗ Ошибка при составлении письма") elif intent == "add_calendar": print("\nСоставляю напоминание...") calendar_data = process_calendar(user_request) if calendar_data: task = calendar_data.get("calendar_task") if task: print(f"✓ Напоминание составлено: {task}") add_to_calendar(task) else: print("✗ Не удалось составить напоминание") else: print("✗ Ошибка при составлении напоминания") else: print("\nКоманда не распознана. Я не могу обработать этот запрос.") if __name__ == "__main__": main()