User Tools

Site Tools


yandex_ai

Differences

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

Link to this comparison view

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>​
yandex_ai.1782541926.txt.gz · Last modified: 2026/06/27 09:32 by val