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/09/12 15:21]
val [Yandex AI]
yandex_ai [2026/09/21 07:31] (current)
val [Черновик]
Line 3: Line 3:
   * [[https://​aistudio.yandex.ru/​docs/​ru/​ai-studio/​quickstart/​|Как начать работать с Yandex AI Studio]] (выбираем AI SDK)   * [[https://​aistudio.yandex.ru/​docs/​ru/​ai-studio/​quickstart/​|Как начать работать с Yandex AI Studio]] (выбираем AI SDK)
  
-  * AI Studio -> Создать API-ключ +  * [[Yandex SpeechKit]], ​AI Studio -> Создать API-ключ
- +
-  * [[Язык программирования Python]]+
  
 <​code>​ <​code>​
-(venv1) ~/ai$ pip install yandex-ai-studio-sdk 
- 
 (venv1) ~/ai$  export YANDEX_API_KEY=AQVN3_tpBw9JigLSI1107j0xhkgREwzwD2VCZx5FzA (venv1) ~/ai$  export YANDEX_API_KEY=AQVN3_tpBw9JigLSI1107j0xhkgREwzwD2VCZx5FzA
  
Line 15: Line 11:
 </​code>​ </​code>​
  
-  * [[Язык программирования Python#request_to_agent.py]]+  * [[Язык программирования Python#request_to_llm.py]] 
 +  * [[Язык программирования Python#​openai_request_to_llm.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>​ 
-$ cat request_to_agent_with_tools.py 
-import sys 
-import os 
-import random 
- 
-from yandex_ai_studio_sdk import AIStudio 
-#from rich import inspect 
- 
-def request_to_agent_with_tools(user_request,​ system_prompt,​ context_messages=None,​ tools=None):​ 
- 
-    sdk = AIStudio( 
-        folder_id=os.getenv("​YANDEX_FOLDER_ID"​),​ 
-        auth=os.getenv("​YANDEX_API_KEY"​) 
-    ) 
- 
-    sdk_tools = [] 
-    for item in tools: 
-        tool = sdk.tools.function( 
-            parameters={"​type":​ "​object","​properties":​ {}}, 
-            name=item["​func_name"​],​ 
-            description=item["​description"​] 
-        ) 
-        sdk_tools.append(tool) 
- 
-    messages = [{"​role":​ "​system",​ "​text":​ system_prompt}] 
- 
-    if context_messages:​ 
-        messages.extend(context_messages) 
- 
-    messages.append({"​role":​ "​user",​ "​text":​ user_request}) 
- 
-    #model = sdk.chat.completions("​yandexgpt"​) 
-    model = sdk.chat.completions("​aliceai-llm"​) 
-    model = model.configure( 
-        temperature=0.3,​ 
-        max_tokens=1500,​ 
-        tools=sdk_tools 
-    ) 
- 
-    #​inspect(messages,​ methods=True) 
-    #​inspect(messages) 
-    response = model.run(messages) 
-    #​inspect(response,​ methods=True) 
- 
-    choice = response.choices[0] 
-    if choice.tool_calls:​ 
-        return choice.tool_calls[0].function.name 
-    else: 
-        return choice.text 
- 
-if __name__ == "​__main__":​ 
- 
-    system_prompt = ( 
-        "Ты — ассистент.\n"​ 
-        "​Отвечай кратко.\n"​ 
-    ) 
- 
-    chat_context = [] 
-    #​chat_context = [ 
-    #    {"​role":​ "​user",​ "​text":​ "​Привет! Меня зовут Алексей,​ я программист."​},​ 
-    #    {"​role":​ "​assistant",​ "​text":​ "​Привет,​ Алексей! Рад знакомству. Чем могу помочь?"​} 
-    #] 
- 
-    # Определяем функцию для инструмента 
-    def get_random_number() -> int: 
-        return random.randint(1,​ 100) 
-    def get_random_fruit() -> str: 
-        words = ["​яблоко",​ "​банан",​ "​апельсин",​ "​груша",​ "​киви"​] 
-        return random.choice(words) 
-    #​print(get_random_number()) 
-    #​print(get_random_fruit()) 
- 
-    func_list = [ 
-        { 
-            "​func_name":​ "​random_number",​ 
-            "​description":​ "​Используй эту функцию,​ когда пользователь просит назвать его счастливое число."​ 
-        }, 
-        { 
-            "​func_name":​ "​random_fruit",​ 
-            "​description":​ "​Используй эту функцию,​ когда пользователь просит назвать его любимый фрукт."​ 
-        } 
-    ] 
-    ​ 
-    while True: 
-        try: 
-            user_request = input("​Введите ваш вопрос:​ ") 
-        except (KeyboardInterrupt,​ EOFError): 
-            print("​\nСессия завершена!"​) 
-            sys.exit(0) 
- 
-        reply_text = request_to_agent_with_tools(user_request,​ system_prompt,​ chat_context,​ func_list) 
-        if '​random_number'​ in reply_text: 
-            print(get_random_number()) 
-        elif '​random_fruit'​ in reply_text: 
-            print(get_random_fruit()) 
-        else: 
-            print(reply_text) 
-            chat_context.append({"​role":​ "​user",​ "​text":​ user_request}) 
-            chat_context.append({"​role":​ "​assistant",​ "​text":​ reply_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Команда не распознана. Я не могу обработать этот запрос."​) 
- 
-if __name__ == "​__main__":​ 
-    main() 
-</​code>​ 
yandex_ai.1789215660.txt.gz · Last modified: 2026/09/12 15:21 by val