Создание AI-агента с помощью функции Yandex Cloud Functions
- Что такое AI-агент и зачем он нужен
- Подготовьте облако к работе
- Автоматизированное развертывание AI-агента с использованием SourceCraft CI/CD
- Автоматизированное создание AI-агента
- Создание AI-агента вручную
- Создайте сервисный аккаунт
- Создайте API-ключ сервисного аккаунта
- Создайте секрет Yandex Lockbox
- Подготовьте ZIP-архив с кодом функции
- Создайте функцию
- Протестируйте работу функции
- Как удалить созданные ресурсы
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
Узнайте, как с помощью функции Cloud Functions с использованием OpenAI Agents SDK
В данном руководстве вы создадите простого AI-агента, который через функцию Cloud Functions будет получать информацию о погоде, взаимодействовать с языковой моделью
На схеме:
- Пользователь отправляет запрос к AI-агенту. Запрос поступает в обработчик функции Cloud Functions.
- Обработчик функции Cloud Functions создает и запускает AI-агента.
- AI-агент запрашивает дополнительные данные о погоде в нужном городе в пользовательской функции
get_weather(). - AI-агент отправляет расширенный дополнительным контекстом запрос пользователя в модель генерации текста AI Studio.
- Сервисный аккаунт с помощью API-ключа авторизует для AI-агента доступ к Text Generation API
AI Studio. - Сервисный аккаунт предоставляет функции Cloud Functions доступ к секрету Yandex Lockbox, в котором хранится API-ключ сервисного аккаунта.
- Функция Cloud Functions получает из секрета Yandex Lockbox API-ключ сервисного аккаунта.
- Модель AI Studio передает AI-агенту сгенерированный ответ.
- AI-агент возвращает полученный ответ пользователю.
Созданный в этом руководстве AI-агент будет развернут в Yandex Cloud с помощью Yandex Cloud Functions. При этом вы создадите необходимые для доступа к модели AI Studio ресурсы: сервисный аккаунт, API-ключ сервисного аккаунта, секрет Yandex Lockbox и функцию Cloud Functions.
Вы можете создать эти ресурсы автоматически или вручную.
Что такое AI-агент и зачем он нужен
AI-агент — это программный помощник на базе искусственного интеллекта, который может выполнять инструкции, отвечать на вопросы и взаимодействовать с пользователями или другими системами в заданном контексте. В отличие от обычных моделей генеративного искусственного интеллекта, AI-агенты могут:
- обладать персонализированными инструкциями и «личностью»;
- использовать внешние источники информации и сторонние инструменты, позволяющие получить дополнительную информацию;
- поддерживать контекст диалога;
- выполнять последовательности действий для решения комплексных задач.
Почему бессерверные функции подходят для работы с AI-агентами
Функции Cloud Functions при развертывании AI-агентов предоставляют несколько преимуществ:
- Масштабируемость — автоматическое масштабирование в зависимости от нагрузки.
- Экономичность — плата только за фактическое время выполнения.
- Отсутствие необходимости управлять инфраструктурой — не нужно настраивать и поддерживать серверы.
- Быстрое развертывание — простота создания и обновления AI-агента.
- Интеграция с другими сервисами — простота подключения к API и другим сервисам Yandex Cloud.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для этого практического руководства входят:
- Плата за использование функции (см. тарифы Yandex Cloud Functions).
- Плата за генерацию текста (см. тарифы Yandex AI Studio
). - Плата за хранение секрета и операции с ним (см. тарифы Yandex Lockbox).
- Плата за запись и хранение данных в лог-группе (см. тарифы Yandex Cloud Logging), если вы используете сервис Cloud Logging.
Автоматизированное развертывание AI-агента с использованием SourceCraft CI/CD
Запустите в SourceCraft
Почему SourceCraft CI/CD — самый быстрый и безопасный способ для развертывания AI-агента
В SourceCraft при развертывании AI-агентов предоставляется несколько преимуществ:
- Отсутствие необходимости настраивать среду разработки локально — все необходимые настройки происходят удаленно в процессе запуска CI/CD-процессов в SourceCraft.
- Безопасность — для развертывания не нужно хранить секреты от сервисных аккаунтов локально. SourceCraft через сервисное подключение
предоставляет безопасный способ запроса короткоживущих IAM-токенов для доступа к сервисам Yandex Cloud.
Чтобы создать AI-агента в автоматическом режиме с использованием SourceCraft CI/CD:
-
Сделайте ответвление (fork)
для репозитория со скриптами для создания AI-агента.Репозиторий содержит скрипты для создания следующих AI-агентов:
Простой AI-агентПродвинутый AI-агентАгент-переводчикПроцесс
create-simple-ai-agent-workflowсоздаст простого AI-агента, который при запуске возвращает информацию о погоде в Токио в форме хайку.Процесс
create-advanced-ai-agent-workflowсоздаст продвинутого AI-агента, который отвечает на пользовательские запросы в форме хайку. При отсутствии пользовательского запроса агент возвращает ответ на запрос по умолчанию.Процесс
create-complex-ai-agent-workflowсоздаст Агента-переводчика, которому можно передавать пользовательские запросы на перевод текста на нужный язык в нужном стиле. -
Настройте сервисное подключение
в SourceCraft для доступа к вашему облаку Yandex Cloud. -
Запустите рабочий процесс
, напримерcreate-simple-ai-agent-workflow. -
Протестируйте работу AI-агента.
Вы можете увидеть результат работы функции, посмотрев логи
кубика SourceCraft CI/CD, например, дляcreate-simple-ai-agent-workflowэтот кубик называетсяdeploy-simple-ai-agent. Дополнительно вы можете протестировать работу функции в консоли управления Yandex Cloud. -
Если созданные ресурсы вам больше не нужны, удалите их.
Автоматизированное создание AI-агента
Запустите скрипт, который автоматически создаст в выбранном вами каталоге все необходимые ресурсы и развернет готового AI-агента, с которым вы сможете поэкспериментировать.
Чтобы создать AI-агента в автоматическом режиме:
-
Установите Yandex Cloud CLI и аутентифицируйтесь.
-
Склонируйте репозиторий
со скриптами для создания AI-агента:git clone https://git@git.sourcecraft.dev/yandex-cloud-examples/yc-serverless-ai-agent.gitРепозиторий содержит скрипты для создания трех вариантов AI-агента:
Простой AI-агентПродвинутый AI-агентАгент-переводчикСкрипт
create-simple-ai-agent.pyсоздаст простого AI-агента, который при запуске возвращает информацию о погоде в Токио в форме хайку.Скрипт
create-advanced-ai-agent.pyсоздаст продвинутого AI-агента, который отвечает на пользовательские запросы в форме хайку. При отсутствии пользовательского запроса агент возвращает ответ на запрос по умолчанию.Скрипт
create-complex-ai-agent.pyсоздаст Агента-переводчика, которому можно передавать пользовательские запросы на перевод текста на нужный язык в нужном стиле. -
Сделайте файл скрипта исполняемым, например:
chmod +x create-simple-ai-agent.py -
Выполните скрипт, например:
./create-simple-ai-agent.pyВ процессе выполнения скрипта укажите данные вашего облака и каталога, после чего дождитесь создания ресурсов.
-
Протестируйте работу AI-агента.
Простой AI-агентПродвинутый AI-агентАгент-переводчикПротестируйте работу функции в консоли управления.
Протестируйте работу функции в консоли управления.
Дополнительно вы можете протестировать работу функции, передав AI-агенту пользовательский запрос с помощью Yandex Cloud CLI. Для этого выполните команду, указав полученный при создании AI-агента идентификатор функции:
echo '{"query": "What's the weather in Paris?"}' > request.json \ yc serverless function invoke <идентификатор_функции> --data-file request.jsonПротестируйте работу функции в консоли управления.
Дополнительно вы можете протестировать работу функции, передав AI-агенту пользовательский запрос с помощью Yandex Cloud CLI. Для этого выполните команду, указав полученный при создании AI-агента идентификатор функции:
echo '{"text": "Hello, world!", "target_language": "русский", "tone": "дружеский"}' > translate.json \ yc serverless function invoke <идентификатор_функции> --data-file translate.json -
Если созданные ресурсы вам больше не нужны, удалите их.
Создание AI-агента вручную
Чтобы вручную создать AI-агента с помощью функции Cloud Functions:
- Создайте сервисный аккаунт.
- Создайте API-ключ сервисного аккаунта.
- Создайте секрет Yandex Lockbox.
- Подготовьте ZIP-архив с кодом функции.
- Создайте функцию.
- Протестируйте работу функции.
Если созданные ресурсы вам больше не нужны, удалите их.
Создайте сервисный аккаунт
- В консоли управления
выберите каталог, в котором вы будете создавать инфраструктуру. - Перейдите в сервис Identity and Access Management.
- Нажмите Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
function-sa. - Нажмите
Добавить роль и выберите рольai.languageModels.user. - Нажмите Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
-
Создайте сервисный аккаунт
function-saв каталоге по умолчанию:yc iam service-account create \ --name function-saРезультат:
done (1s) id: aje23dgspcpi******** folder_id: b1gt6g8ht345******** created_at: "2025-06-04T19:34:58.145514099Z" name: function-saСохраните идентификаторы сервисного аккаунта (значение поля
id) и каталога (значение поляfolder_id) — они понадобятся позднее.Подробнее о команде
yc iam service-account createчитайте в справочнике CLI. -
Назначьте созданному сервисному аккаунту роль
ai.languageModels.userна каталог, указав сохраненные на предыдущем шаге идентификаторы каталога и сервисного аккаунта:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role ai.languageModels.user \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>Результат:
done (2s) effective_deltas: - action: ADD access_binding: role_id: ai.languageModels.user subject: id: aje23dgspcpi******** type: serviceAccountПодробнее о команде
yc resource-manager folder add-access-bindingчитайте в справочнике CLI.
Чтобы создать сервисный аккаунт, воспользуйтесь методом REST API create для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/Create.
Чтобы назначить сервисному аккаунту роль ai.languageModels.user на каталог, воспользуйтесь методом REST API updateAccessBindings для ресурса Folder или вызовом gRPC API FolderService/UpdateAccessBindings.
Создайте API-ключ сервисного аккаунта
-
В консоли управления
выберите каталог, в котором вы создаете инфраструктуру. -
Перейдите в сервис Identity and Access Management и выберите созданный ранее сервисный аккаунт
function-sa. -
На панели сверху нажмите
Создать новый ключ и выберите пункт Создать API-ключ. -
В поле Область действия выберите область действия
yc.ai.languageModels.execute. -
(Опционально) Укажите Срок действия API-ключа.
-
Нажмите Создать.
-
Сохраните полученный секретный ключ — он понадобится при создании функции.
Внимание
После закрытия диалога значение ключа будет недоступно.
-
Создайте API-ключ для сервисного аккаунта
function-sa:yc iam api-key create \ --service-account-name function-sa \ --scopes yc.ai.languageModels.executeРезультат:
api_key: id: ajemcpt92i9j******** service_account_id: aje23dgspcpi******** created_at: "2025-06-04T19:41:28.960624728Z" scope: yc.ai.languageModels.execute scopes: - yc.ai.languageModels.execute secret: AQVN1mZ6kUkzDCjhNJxmjDX6WeJdOlJv********Сохраните полученное значение ключа — получить его повторно будет невозможно.
Подробнее о команде
yc iam api-key createчитайте в справочнике CLI.
Чтобы создать API-ключ, воспользуйтесь методом REST API create для ресурса ApiKey или вызовом gRPC API ApiKeyService/Create.
Создайте секрет Yandex Lockbox
- В консоли управления
выберите каталог, в котором вы создаете инфраструктуру. - Перейдите в сервис Lockbox и нажмите Создать секрет.
- В поле Имя укажите имя секрета
api-key-secret. - В поле Тип секрета выберите
Пользовательский. - В поле Ключ введите ключ секрета
api-key. - В поле Значение вставьте полученный на предыдущем шаге секретный ключ.
- Нажмите Создать.
-
Создайте секрет Yandex Lockbox
api-key-secretв каталоге по умолчанию, указав полученный на предыдущем шаге секретный ключ:yc lockbox secret create \ --name api-key-secret \ --payload "[{'key': 'api-key', 'text_value': '<секретный_ключ>'}]"Результат:
done (1s) id: e6q7c0n0n7ji******** folder_id: b1gt6g8ht345******** created_at: "2025-06-04T19:50:38.690Z" name: api-key-secret status: ACTIVE current_version: id: e6qhmal099ki******** secret_id: e6q7c0n0n7ji******** created_at: "2025-06-04T19:50:38.690Z" status: ACTIVE payload_entry_keys: - api-keyПодробнее о команде
yc lockbox secret createчитайте в справочнике CLI.
Чтобы создать секрет, воспользуйтесь методом REST API create для ресурса Secret или вызовом gRPC API SecretService/Create.
Назначьте сервисному аккаунту права на чтение содержимого секрета
-
В консоли управления
выберите каталог, в котором вы создаете инфраструктуру. -
Перейдите в сервис Lockbox и выберите созданный ранее секрет
api-key-secret. -
На панели слева выберите раздел
Права доступа и нажмите Назначить роли. В открывшемся окне:- В строке поиска введите имя созданного ранее сервисного аккаунта
function-saи выберите этот сервисный аккаунт. - Нажмите
Добавить роль и выберите рольlockbox.payloadViewer. - Нажмите Сохранить.
- В строке поиска введите имя созданного ранее сервисного аккаунта
-
Назначьте сервисному аккаунту
function-saрольlockbox.payloadViewerна секретapi-key-secret:yc lockbox secret add-access-binding \ --name api-key-secret \ --service-account-name function-sa \ --role lockbox.payloadViewerПодробнее о команде
yc lockbox secret add-access-bindingчитайте в справочнике CLI.
Чтобы назначить сервисному аккаунту роль на секрет, воспользуйтесь методом REST API setAccessBindings для ресурса Secret или вызовом gRPC API SecretService/SetAccessBindings.
Подготовьте ZIP-архив с кодом функции
-
Сохраните следующий код в файл с названием
index.py:Простой AI-агентПродвинутый AI-агентАгент-переводчикimport os from openai import AsyncOpenAI from agents import ( Agent, OpenAIChatCompletionsModel, Runner, function_tool, set_tracing_disabled, ) BASE_URL = os.getenv("BASE_URL") API_KEY = os.getenv("API_KEY") MODEL_NAME = os.getenv("MODEL_NAME") client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY) set_tracing_disabled(disabled=True) @function_tool def get_weather(city: str): print(f"[debug] getting weather for {city}") return f"The weather in {city} is sunny." async def handler(event, context): agent = Agent( name="Assistant", instructions="You only respond in haikus.", model=OpenAIChatCompletionsModel(model=MODEL_NAME, openai_client=client), tools=[get_weather], ) result = await Runner.run(agent, "What's the weather in Tokyo?") return { "statusCode": 200, "body": result.final_output, }import os import json from openai import AsyncOpenAI from agents import ( Agent, OpenAIChatCompletionsModel, Runner, function_tool, set_tracing_disabled, ) BASE_URL = os.getenv("BASE_URL") API_KEY = os.getenv("API_KEY") MODEL_NAME = os.getenv("MODEL_NAME") client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY) set_tracing_disabled(disabled=True) @function_tool def get_weather(city: str): print(f"[debug] getting weather for {city}") return f"The weather in {city} is sunny." async def handler(event, context): # Извлекаем пользовательский запрос из события user_query = "What's the weather today?" # Запрос по умолчанию try: # Пытаемся получить запрос из тела события if event and isinstance(event, dict): body = event.get('body') if body: # Если body передан как строка (что часто бывает при вызове через API Gateway) if isinstance(body, str): try: body_json = json.loads(body) if 'query' in body_json: user_query = body_json['query'] except json.JSONDecodeError: pass # Используем запрос по умолчанию, если body не является JSON elif isinstance(body, dict) and 'query' in body: user_query = body['query'] # Если запрос передан напрямую в event elif 'query' in event: user_query = event['query'] except Exception as e: print(f"Ошибка при обработке запроса: {e}") # В случае ошибки используем запрос по умолчанию print(f"Обрабатываемый запрос: {user_query}") agent = Agent( name="Assistant", instructions="You only respond in haikus. Be creative and poetic.", model=OpenAIChatCompletionsModel(model=MODEL_NAME, openai_client=client), tools=[get_weather], ) result = await Runner.run(agent, user_query) return { "statusCode": 200, "body": result.final_output, "headers": { "Content-Type": "application/json" } }import os import json import re from typing import Dict, List, Optional, Any from openai import AsyncOpenAI from agents import ( Agent, OpenAIChatCompletionsModel, Runner, function_tool, set_tracing_disabled, ) BASE_URL = os.getenv("BASE_URL") API_KEY = os.getenv("API_KEY") MODEL_NAME = os.getenv("MODEL_NAME") client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY) set_tracing_disabled(disabled=True) # Dictionary with language codes to simplify input LANGUAGE_CODES = { "русский": "ru", "russian": "ru", "английский": "en", "english": "en", "французский": "fr", "french": "fr", "немецкий": "de", "german": "de", "испанский": "es", "spanish": "es", "итальянский": "it", "italian": "it", "китайский": "zh", "chinese": "zh", "японский": "ja", "japanese": "ja", "корейский": "ko", "korean": "ko", "арабский": "ar", "arabic": "ar", "португальский": "pt", "portuguese": "pt", } # Dictionary with tone codes TONE_TYPES = { "формальный": "formal", "formal": "formal", "неформальный": "informal", "informal": "informal", "дружеский": "friendly", "friendly": "friendly", "деловой": "business", "business": "business", "технический": "technical", "technical": "technical", "простой": "simple", "simple": "simple", "академический": "academic", "academic": "academic", "поэтический": "poetic", "poetic": "poetic", "разговорный": "conversational", "conversational": "conversational", } @function_tool def detect_language(text: str) -> dict: """Detects the language of the input text. Args: text: Text to analyze Returns: Dictionary with detected language and its code """ # This function uses model capabilities to determine the language # In a real application, you could use specialized libraries for more accurate detection common_words = { "en": ["the", "and", "of", "to", "in", "a", "is", "that", "for", "it", "with", "as", "was", "on"], "ru": ["и", "в", "не", "на", "что", "с", "по", "это", "я", "он", "как", "из", "то", "а", "все", "так"], "fr": ["le", "la", "les", "un", "une", "et", "de", "des", "du", "dans", "en", "est", "que", "pour", "qui"], "de": ["der", "die", "das", "und", "in", "von", "mit", "den", "zu", "ist", "für", "auf", "dem", "nicht"], "es": ["el", "la", "los", "las", "un", "una", "y", "de", "en", "que", "a", "por", "con", "no", "es"], "it": ["il", "la", "i", "le", "e", "di", "un", "una", "in", "che", "per", "con", "è", "non", "sono"], } # Simple detection by characteristic symbols and words text_lower = text.lower() # Check for Cyrillic characters (for Russian) if re.search('[а-яА-Я]', text): return {"language": "Russian", "code": "ru"} # Check for characters (for Chinese and Japanese) if re.search('[\u4e00-\u9fff]', text): return {"language": "Chinese", "code": "zh"} if re.search('[\u3040-\u309F\u30A0-\u30FF]', text): return {"language": "Japanese", "code": "ja"} # Check by common words word_counts = {} for lang, words in common_words.items(): count = 0 for word in words: pattern = r'\b' + re.escape(word) + r'\b' count += len(re.findall(pattern, text_lower)) word_counts[lang] = count # Determine the language with the most matches if word_counts: detected_code = max(word_counts.items(), key=lambda x: x[1])[0] language_names = { "en": "English", "ru": "Russian", "fr": "French", "de": "German", "es": "Spanish", "it": "Italian", } return {"language": language_names.get(detected_code, "Unknown"), "code": detected_code} # Default to English return {"language": "Unknown (assuming English)", "code": "en"} @function_tool def translate_text(text: str, target_language: str, source_language: Optional[str] = None, tone: Optional[str] = None) -> str: """Translates text to the specified language while preserving tone and style. Args: text: Text to translate target_language: Target language for translation (code or name) source_language: Source language of the text (code or name, optional) tone: Desired tone of translation (formal, informal, business, etc., optional) Returns: Translated text """ # This function would use LLM for translation in reality # Here we just return information about the request for demonstration # Normalize language codes target_code = LANGUAGE_CODES.get(target_language.lower(), target_language.lower()) source_code = None if source_language: source_code = LANGUAGE_CODES.get(source_language.lower(), source_language.lower()) # Normalize tone tone_type = None if tone: tone_type = TONE_TYPES.get(tone.lower(), tone.lower()) # Return information for LLM to perform translation # In a real application, you could call a specialized translation API here return { "text": text, "target_language_code": target_code, "source_language_code": source_code, "tone": tone_type, "length": len(text) } async def handler(event, context): """Function handler""" try: # Get text for translation and parameters from the request text = None target_language = None source_language = None tone = None # Process different formats of incoming data if event and isinstance(event, dict): body = event.get('body') if body: # If body is passed as a string (common when called via API Gateway) if isinstance(body, str): try: body_json = json.loads(body) text = body_json.get('text') target_language = body_json.get('target_language') source_language = body_json.get('source_language') tone = body_json.get('tone') except json.JSONDecodeError: # Maybe it's just text for translation text = body elif isinstance(body, dict): text = body.get('text') target_language = body.get('target_language') source_language = body.get('source_language') tone = body.get('tone') else: # If parameters are passed directly in the event text = event.get('text') target_language = event.get('target_language') source_language = event.get('source_language') tone = event.get('tone') # Check required parameters if not text: return { "statusCode": 400, "body": json.dumps({"error": "Missing 'text' parameter (text to translate)"}), "headers": {"Content-Type": "application/json"} } if not target_language: return { "statusCode": 400, "body": json.dumps({"error": "Missing 'target_language' parameter (target language)"}), "headers": {"Content-Type": "application/json"} } # Create request for AI agent user_query = f"Translate the following text to {target_language}:" if source_language: user_query += f" from {source_language}" if tone: user_query += f". Preserve the {tone} tone and style of the original" user_query += f"\\n\\n{text}" # Set up AI agent agent = Agent( name="TranslatorAssistant", instructions="""You are a professional translator assistant who can translate text between different languages while preserving the original tone, style, and context. Your tools: 1. detect_language - to identify the language of the input text 2. translate_text - to translate text to the target language You should: - Understand the tone and style of the original text - Preserve formatting, including paragraphs, bullet points, and special symbols - Keep names, terms, and brand names unchanged unless translation is specifically required - When translating technical or specialized content, use appropriate terminology - Be sensitive to cultural context and adapt idioms appropriately - For formal documents, maintain formal language in the translation - For creative content, preserve the creative elements in the translation When responding: 1. Provide the translation 2. If requested or if there are important notes about the translation, briefly mention them 3. Be concise and focus on accurate translation""", model=OpenAIChatCompletionsModel(model=MODEL_NAME, openai_client=client), tools=[detect_language, translate_text], ) # Run the agent result = await Runner.run(agent, user_query) # Format the response return { "statusCode": 200, "body": json.dumps({ "translation": result.final_output, "original_text": text, "target_language": target_language, "source_language": source_language, "tone": tone }, ensure_ascii=False), "headers": {"Content-Type": "application/json; charset=utf-8"} } except Exception as e: print(f"Request processing error: {str(e)}") return { "statusCode": 500, "body": json.dumps({"error": f"Internal server error: {str(e)}"}), "headers": {"Content-Type": "application/json"} } -
Сохраните следующий код в файл с названием
requirements.txt:openai-agents -
Добавьте файлы
index.pyиrequirements.txtв ZIP-архивopenai-function.zip.
Создайте функцию
- В консоли управления
выберите каталог, в котором вы создаете инфраструктуру. - Перейдите в сервис Cloud Functions.
- Создайте функцию:
- Нажмите Создать функцию.
- В открывшемся окне введите имя функции
ai-agent-function. - Нажмите Создать.
- Создайте версию функции:
- Выберите среду выполнения
Python 3.12, отключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить. - В поле Источник кода выберите
ZIP-архиви прикрепите созданный ранее файлopenai-function.zip. - Укажите точку входа
index.handler. - В блоке Параметры укажите:
-
Таймаут —
5 минут. -
Память —
128 МБ. -
Сервисный аккаунт — выберите сервисный аккаунт
function-sa. -
Переменные окружения:
-
FOLDER_ID— идентификатор каталога, в котором вы создаете инфраструктуру. -
MODEL_NAME— URI модели генерации текста Yandex AI Studio.Например:
gpt://<идентификатор_каталога>/yandexgpt/latest.Укажите идентификатор каталога, в котором вы создаете инфраструктуру.
-
BASE_URL— URL сервиса Yandex AI Studio:https://ai.api.cloud.yandex.net/v1.
-
-
Секреты Lockbox:
- В поле Переменная окружения укажите
API_KEYи выберите созданный ранее секретapi-key-secret, его версию и ключapi-key.
- В поле Переменная окружения укажите
-
Если вы не хотите сохранять логи и платить за использование сервиса Cloud Logging, отключите опцию Запись логов, чтобы отключить логирование.
-
- Нажмите Сохранить изменения.
- Выберите среду выполнения
-
Создайте функцию
ai-agent-functionв каталоге по умолчанию:yc serverless function create \ --name ai-agent-functionРезультат:
id: d4edhic2qf3i******** folder_id: b1gt6g8ht345******** created_at: "2025-06-04T20:02:14.741Z" name: ai-agent-function http_invoke_url: https://functions.yandexcloud.net/d4edhic2qf3i******** status: ACTIVEПодробнее о команде
yc serverless function createчитайте в справочнике CLI. -
Создайте версию функции
ai-agent-function:yc serverless function version create \ --function-name ai-agent-function \ --memory=128m \ --execution-timeout=5m \ --runtime=python312 \ --entrypoint=index.handler \ --service-account-id=<идентификатор_сервисного_аккаунта> \ --environment FOLDER_ID="<идентификатор_каталога>",MODEL_NAME="gpt://<идентификатор_каталога>/yandexgpt/latest",BASE_URL="https://ai.api.cloud.yandex.net/v1" \ --secret name=api-key-secret,key=api-key,environment-variable=API_KEY \ --source-path=./openai-function.zip \ --no-loggingГде:
-
--service-account-id— идентификатор сервисного аккаунтаfunction-sa, сохраненный ранее при его создании. -
--environment— переменные окружения:-
FOLDER_ID— идентификатор каталога, сохраненный ранее при создании сервисного аккаунта. -
MODEL_NAME— URI модели генерации текста Yandex AI Studio.Например: `gpt://<идентификатор_каталога>/yandexgpt/latest`. Укажите идентификатор каталога, в котором вы создаете инфраструктуру. -
BASE_URL— URL сервиса Yandex AI Studio:https://ai.api.cloud.yandex.net/v1.
-
Результат:
done (16s) id: d4e1vnnvhk5p******** function_id: d4edhic2qf3i******** created_at: "2025-06-04T20:09:59.675Z" runtime: python312 entrypoint: index.handler resources: memory: "134217728" execution_timeout: 300s service_account_id: aje23dgspcpi******** image_size: "14958592" status: ACTIVE tags: - $latest environment: FOLDER_ID: b1gt6g8ht345******** BASE_URL: https://ai.api.cloud.yandex.net/v1 MODEL_NAME: gpt://b1gt6g8ht345********/yandexgpt/latest secrets: - id: e6q7c0n0n7ji******** version_id: e6qhmal099ki******** key: api-key environment_variable: API_KEY log_options: disabled: true folder_id: b1gt6g8ht345******** concurrency: "1"Подробнее о команде
yc serverless function version createчитайте в справочнике CLI. -
Чтобы создать функцию, воспользуйтесь методом REST API create для ресурса Function или вызовом gRPC API FunctionService/Create.
Чтобы создать версию функции, воспользуйтесь методом REST API createVersion для ресурса Function или вызовом gRPC API FunctionService/CreateVersion.
Протестируйте работу функции
-
В консоли управления
выберите каталог, в котором вы создали инфраструктуру. -
Перейдите в сервис Cloud Functions и выберите созданную функцию.
-
Перейдите на вкладку
Тестирование. -
Нажмите
Запустить тест и посмотрите результат тестирования.При успешном выполнении запроса состояние функции изменится на
Выполнена, а ответ функции будет содержать код статуса200и ответ модели. Например:{ "statusCode": 200, "body": "In Tokyo's sky,\nSunshine beams so bright and clear,\nWarmth fills the air." }
-
Перейдите в сервис Cloud Functions и выберите созданную функцию.
-
Перейдите на вкладку
Тестирование. -
В поле Входные данные укажите:
{ "query": "What's the weather in Paris?" } -
Нажмите
Запустить тест и посмотрите результат тестирования.При успешном выполнении запроса состояние функции изменится на
Выполнена, а ответ функции будет содержать код статуса200и ответ модели. Например:{ "statusCode": 200, "body": "Paris skies so blue,\nSunshine warms the city's heart,\nBreathe in, feel the joy.", "headers": { "Content-Type": "application/json" } }
-
Перейдите в сервис Cloud Functions и выберите созданную функцию.
-
Перейдите на вкладку
Тестирование. -
В поле Входные данные укажите:
{ "text": "Hello, world!", "target_language": "русский", "tone": "дружеский" } -
Нажмите
Запустить тест и посмотрите результат тестирования.При успешном выполнении запроса состояние функции изменится на
Выполнена, а ответ функции будет содержать код статуса200и ответ модели. Например:{ "statusCode": 200, "body": "{\"translation\": \"Привет, мир!\", \"original_text\": \"Hello, world!\", \"target_language\": \"русский\", \"source_language\": null, \"tone\": \"дружеский\"}", "headers": { "Content-Type": "application/json; charset=utf-8" } }
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите функцию.
- Удалите секрет.
- Если вы записывали логи в лог-группу, удалите ее.