User Tools

Site Tools


yandex_ai

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
yandex_ai [2026/06/28 15:34]
val
yandex_ai [2026/07/17 07:54] (current)
val
Line 1: Line 1:
 ====== Yandex AI ====== ====== Yandex AI ======
  
-  * [[https://​aistudio.yandex.ru/​docs/​ru/​ai-studio/​quickstart/​|Как начать работать с Yandex AI Studio]]+  * [[https://​aistudio.yandex.ru/​docs/​ru/​ai-studio/​quickstart/​|Как начать работать с Yandex AI Studio]] (выбираем AI SDK) 
 + 
 +  * [[Язык программирования Python]]
  
 <​code>​ <​code>​
-~/ai$  export ​API_KEY="y0_AgAAA11AA5aXjoAATuwQAAAADqIwuHRJ5znNT2QAm6HmHHbKjtghcsbgk"+(venv1) ~/ai$ pip install yandex-ai-studio-sdk 
 + 
 +(venv1) ​~/ai$  export ​YANDEX_API_KEY=AQVN3_tpBw9JigLSI1107j0xhkgREwzwD2VCZx5FzA 
 + 
 +(venv1) ~/ai$ export YANDEX_FOLDER_ID=b1gg4j6ru4esprat3uu7 
 +</​code>​ 
 + 
 +  * [[Язык программирования Python#​request_to_agent.py]] 
 + 
 +===== Черновик ===== 
 +<​code>​ 
 +(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) 
 +</​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("​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) 
 +</​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("​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Команда не распознана. Я не могу обработать этот запрос.")
  
-~/ai$ export FOLDER_ID=b1gg4j6ru4esprat3uu7+if __name__ ​== "​__main__":​ 
 +    main()
 </​code>​ </​code>​
yandex_ai.1782650078.txt.gz · Last modified: 2026/06/28 15:34 by val