This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
|
yandex_ai [2026/06/27 09:32] val created |
yandex_ai [2026/06/29 14:16] (current) val |
||
|---|---|---|---|
| Line 2: | Line 2: | ||
| * [[https://aistudio.yandex.ru/docs/ru/ai-studio/quickstart/|Как начать работать с Yandex AI Studio]] | * [[https://aistudio.yandex.ru/docs/ru/ai-studio/quickstart/|Как начать работать с Yandex AI Studio]] | ||
| + | |||
| + | <code> | ||
| + | (venv1) ~/ai$ pip install yandex-ai-studio-sdk | ||
| + | |||
| + | (venv1) ~/ai$ export API_KEY="y0_AgAAA11AA5aXjoAATuwQAAAADqIwuHRJ5znNT2QAm6HmHHbKjtghcsbgk" | ||
| + | |||
| + | (venv1) ~/ai$ export FOLDER_ID=b1gg4j6ru4esprat3uu7 | ||
| + | |||
| + | (venv1) root@server:~/ai# cat app.py | ||
| + | import os | ||
| + | from yandex_ai_studio_sdk import AIStudio | ||
| + | |||
| + | sdk = AIStudio( | ||
| + | folder_id=os.getenv("FOLDER_ID"), | ||
| + | auth=os.getenv("API_KEY") | ||
| + | ) | ||
| + | |||
| + | |||
| + | #model = sdk.models.completions("aliceai-llm") | ||
| + | model = sdk.models.completions("yandexgpt") | ||
| + | model = model.configure(temperature=0.8, max_tokens=1500) | ||
| + | result = model.run("Придумай 3 необычные идеи для стартапа в сфере путешествий.") | ||
| + | |||
| + | for alternative in result: | ||
| + | print(alternative.text) | ||
| + | </code><code> | ||
| + | (venv1) root@server:~/ai# cat agent_rand_hello.py | ||
| + | import warnings | ||
| + | warnings.filterwarnings('ignore', category=UserWarning, module='yandex_ai_studio_sdk._auth') | ||
| + | |||
| + | import os | ||
| + | import sys | ||
| + | import random | ||
| + | from yandex_ai_studio_sdk import AIStudio | ||
| + | |||
| + | sdk = AIStudio( | ||
| + | folder_id=os.getenv("FOLDER_ID"), | ||
| + | auth=os.getenv("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="get_random_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 == "get_random_lucky_number": | ||
| + | tool_result = get_random_lucky_number() | ||
| + | print(f"-> Результат локальной функции: {tool_result}") | ||
| + | |||
| + | # Простой подход: добавляем результат как ответ пользователя | ||
| + | messages.append({ | ||
| + | "role": "user", | ||
| + | "content": f"Результат выполнения функции get_random_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) | ||
| + | </code><code> | ||
| + | (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("FOLDER_ID"), | ||
| + | auth=os.getenv("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) | ||
| + | </code><code> | ||
| + | (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("FOLDER_ID"), | ||
| + | auth=os.getenv("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() | ||
| + | (venv1) root@server:~/ai# | ||
| + | |||
| + | </code> | ||