User Tools

Site Tools


yandex_ai

This is an old revision of the document!


Yandex AI

(venv1) ~/ai$ pip install yandex-ai-studio-sdk

(venv1) ~/ai$  export API_KEY=AQVN3_tpBw9JigLSI1107j0xhkgREwzwD2VCZx5FzA

(venv1) ~/ai$ export FOLDER_ID=b1gg4j6ru4esprat3uu7

Черновик

(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("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="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("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)
(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("OAUTH_TOKEN")
)

# Функция-заглушка для отправки письма
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()
yandex_ai.1784086848.txt.gz · Last modified: 2026/07/15 06:40 by val