Создать простого текстового агента с вызовом функции
В Yandex AI Studio вы можете создать текстового агента с вызовом функции, способного взаимодействовать с пользователем в текстовом формате и поддерживать диалог, близкий к естественному человеческому общению.
Перед началом работы
Чтобы воспользоваться примером:
-
Создайте сервисный аккаунт и назначьте ему роли
ai.assistants.editorиai.languageModels.user. -
Получите и сохраните API-ключ сервисного аккаунта, указав для него область действия
yc.ai.foundationModels.execute.Примечание
Если вы используете ОС Windows
, рекомендуем предварительно установить оболочку WSL и выполнять дальнейшие действия в этой оболочке. -
Установите Python версии 3.10
или выше. -
Установите библиотеку Python venv
для создания изолированных виртуальных окружений в Python. -
Создайте и войдите в новое виртуальное окружение Python:
python3 -m venv new-env source new-env/bin/activate -
Установите библиотеку
OpenAI для Python:pip install openai
Реализуйте чат
-
Создайте файл
index.pyи добавьте в него код:import openai from openai import OpenAI import json YANDEX_CLOUD_MODEL = "yandexgpt" client = openai.OpenAI( api_key=YANDEX_CLOUD_API_KEY, base_url="https://rest-assistant.api.cloud.yandex.net/v1", project=YANDEX_CLOUD_FOLDER ) # 1. Определение списка функций, которые модель может вызывать tools = [ { "type": "function", "name": "get_weather", "description": "Получить текущую погоду для указанного города.", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города, например: Петербург или Москва", }, }, "required": ["city"], }, }, ] # Простейшая реализация функции (можно заменить на вызов реального API) def get_weather(city): # Здесь можно реализовать интеграцию, например, с Яндекс Погодой return { "город": city, "температура": "12 °C", "состояние": "Облачно, лёгкий ветер" } # Формирование списка сообщений, который будет пополняться input_list = [ {"role": "user", "content": "Какая погода в Красноярске?"} ] # 2. Запрос модели с определенными функциями response = client.responses.create( model=f"gpt://{YANDEX_CLOUD_FOLDER}/{YANDEX_CLOUD_MODEL}", tools=tools, input=input_list, ) # Добавление ввода модели в историю input_list += response.output for item in response.output: if item.type == "function_call": if item.name == "get_weather": # 3. Выполнение функции get_weather weather_info = get_weather(**json.loads(item.arguments)) # 4. Передача результата функции обратно модели input_list.append({ "type": "function_call_output", "call_id": item.call_id, "output": json.dumps(weather_info) }) print("Финальный ввод:") for item in input_list: if isinstance(item, dict) and item.get("type") == "function_call_output": parsed = json.loads(item["output"]) print("function_call_output:", parsed) else: print(item) response = client.responses.create( model=f"gpt://{YANDEX_CLOUD_FOLDER}/{YANDEX_CLOUD_MODEL}", instructions="Отвечай только данными о погоде, которые вернула функция.", tools=tools, input=input_list, ) # 5. Финальный ответ print("Финальный вывод:") print(response.model_dump_json(indent=2)) print("\n" + response.output_text) -
Сохраните данные для аутентификации в переменные окружения:
export YANDEX_CLOUD_FOLDER=<идентификатор_каталога> export YANDEX_CLOUD_API_KEY=<API-ключ> -
Выполните созданный файл:
python index.pyПример ответа:
Финальный ввод: {'role': 'user', 'content': 'Какая погода в Красноярске?'} ResponseFunctionToolCall(arguments='{"city":"Красноярск"}', call_id='get_weather', name='get_weather', type='function_call', id='get_weather', status='completed', valid=True) function_call_output: {'город': 'Красноярск', 'температура': '12 °C', 'состояние': 'Облачно, лёгкий ветер'} Финальный вывод: { "id": "70d96fac-1c4b-4f4a-9f80-56df********", "created_at": 1758556157206.0, "error": null, "incomplete_details": null, "instructions": "Отвечай только данными о погоде, которые вернула функция.", "metadata": null, "model": "gpt://b1gstllj8rgs********/yandexgpt", "object": "response", "output": [ { "id": "f15c66e8-99a2-4647-a820-406e********", "content": [ { "annotations": [], "text": "В Красноярске сейчас 12 °C, облачно, легкий ветер.", "type": "output_text", "logprobs": null, "valid": true } ], "role": "assistant", "status": "completed", "type": "message", "valid": true } ], "parallel_tool_calls": true, "temperature": null, "tool_choice": "auto", "tools": [ { "name": "get_weather", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "Название города, например: Петербург или Москва" } }, "required": [ "city" ] }, "strict": null, "type": "function", "description": "Получить текущую погоду для указанного города.", "valid": true } ], "top_p": null, "background": false, "conversation": null, "max_output_tokens": null, "max_tool_calls": null, "previous_response_id": null, "prompt": null, "prompt_cache_key": null, "reasoning": null, "safety_identifier": null, "service_tier": null, "status": "completed", "text": null, "top_logprobs": null, "truncation": null, "usage": null, "user": "", "valid": true } В Красноярске сейчас 12 °C, облачно, легкий ветер.