Функция — самая маленькая единица на платформе: обработчик, который получает событие, делает работу и возвращает результат, а контейнеры, масштабирование, логи и трассы платформа берёт на себя. В этом туториале мы напишем функцию, запустим, задеплоим и дадим ей URL. Входов два, и оба приводят в одну точку: редактор в браузере, когда хочется видеть всё своими глазами, и CLI, когда функция живёт в репозитории.
Путь A: в браузере#
1. Создаём функцию#
Откройте Functions и нажмите + New Function. Диалог спросит Name (hello вполне подойдёт), Runtime, Handler в виде файл.экспорт (оставьте index.handler), Timeout в миллисекундах и Memory в мегабайтах. Пока оставьте значения по умолчанию, их легко поменять потом в Config.
На два переключателя стоит взглянуть. Allow Network Access по умолчанию выключен: функция, которая только считает, остаётся запечатанной, а та, что ходит во внешние API, открывает дверь явно. И если код уже есть, Code ZIP загрузит его целиком вместо набора в редакторе.
2. Пишем обработчик#
Редактор откроется с заготовкой. Замените её обработчиком ниже. Обработчик — это экспортированная async-функция, которая получает event и context и возвращает то, что нужно отдать наружу:
exports.handler = async (event, context) => { // "Run" in the editor passes your JSON as `event`. A gateway route passes an // API Gateway-style event whose body is a string. Accept both. const input = typeof event.body === 'string' ? JSON.parse(event.body || '{}') : (event.body ?? event); const name = input.name || 'world'; console.log(`greeting ${name}`); // ends up in the run's logs and trace return { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: `Hello, ${name}!`, at: new Date().toISOString() }), }; };
Небольшой танец в начале стоит понять. Когда вы нажимаете Run в редакторе, введённый JSON приходит как сам event. Когда ту же функцию вызывают через маршрут шлюза, событие имеет форму HTTP-запроса с телом в виде строки. Читая оба варианта, функция ведёт себя одинаково в тестовой панели и в production, а возврат statusCode и body позволяет шлюзу превратить результат в нормальный HTTP-ответ.
3. Запускаем#
Нажмите Run. Тестовая панель принимает JSON-событие: введите {"name": "Ada"} и запустите. Через секунду появится результат, вместе со строками логов, которые напечатала функция, и временем с памятью, которые она потратила. Поменяйте имя, запустите снова. Редактор сохраняет по мере ввода, между попытками ничего не теряется.
Запуск из редактора выполняет текущий код в настоящем контейнере выбранного рантайма. Ошибки показываются как стек-трейс с указанием строки и теми же логами, что вы увидели бы в production.
4. Деплоим#
Нажмите Deploy. Текущий код становится живой версией: он упаковывается, ставятся зависимости, готовятся тёплые контейнеры, поэтому первый настоящий вызов быстрый. Каждый следующий Deploy заменяет живую версию атомарно; вызов, который уже выполняется, завершается на старом коде.
5. Даём ей URL#
Задеплоенную функцию можно вызывать из SDK, из пайплайна (включая запуски по расписанию) или по HTTP через шлюз. Откройте Gateway, возьмите API воркспейса по умолчанию и добавьте маршрут: метод POST, путь /hello, цель — функция hello. Выберите режим авторизации: Public, чтобы попробовать, API key или Bearer для настоящих клиентов. Лимит запросов на маршрут и валидация запроса — опциональны и в одном клике.
Маршрут работает сразу после сохранения. Вызовите его из любого терминала:
# The full URL of every route is shown on the Gateway page. The default # workspace API lives under /gw/<workspace-slug>/… curl -X POST "https://api.inquir.org/gw/<workspace-slug>/hello" \ -H "Content-Type: application/json" \ -d '{"name":"Ada"}' # {"message":"Hello, Ada!","at":"2026-09-05T12:00:00.000Z"} # The same route with API-key auth curl -X POST "https://api.inquir.org/gw/<workspace-slug>/hello" \ -H "X-Api-Key: $INQUIR_GATEWAY_KEY" \ -H "Content-Type: application/json" \ -d '{"name":"Ada"}'
6. Смотрим, как она работает#
Вкладка Traces функции показывает каждый вызов: когда он был, сколько длился, что вернул и логи. Упавшие вызовы помечены и хранят свои стек-трейсы. Страница Executions по всему воркспейсу показывает то же самое для всех функций с фильтрами по статусу и времени — с неё обычно и начинают, когда что-то не так.
Путь B: из терминала#
Когда функции живут в репозитории, CLI создаёт проект, запускает обработчики локально и деплоит их из той же папки, так что код-ревью и CI, которые у вас уже есть, распространяются и на функции:
npm install -g @inquir/compute-cli@latest inquir init # inquir.config.json, folders, a sample `hello` function inquir run hello --payload '{"name":"World"}' # runs locally — no account needed yet inquir login # browser pairing → a personal access token inquir use <workspace-slug> # the workspace to deploy into inquir deploy hello # package, upload, deploy — streams the build log inquir invoke hello --payload '{"name":"World"}' inquir logs hello # recent remote invocations inquir sync status # local vs deployed: in-sync / drift / missing
inquir init создаёт inquir.config.json, структуру папок и пример функции hello, написанный через defineFunction из SDK: схема входа объявлена в zod, невалидные payload отбрасываются до вызова обработчика, а тип входа выводится прямо в редакторе. inquir run выполняет функцию локально с переданным payload, аккаунт не нужен, и цикл «поправил — запустил» становится мгновенным.
inquir deploy hello упаковывает функцию, загружает и стримит лог сборки, пока версия не станет живой; inquir invoke вызывает задеплоенную версию, inquir logs показывает её недавние вызовы. В любой момент inquir sync status покажет, какие локальные функции совпадают с задеплоенными, какие разошлись, а какие есть только с одной стороны.
Куда дальше#
Справочник по функциям полностью описывает контракт обработчика, переменные окружения и лимиты; страница шлюза — режимы авторизации, валидацию и подписи вебхуков; страница SDK показывает defineFunction с типизированным входом. Когда функция вырастает в сервис, который должен быть всегда поднят, предыдущий туториал деплоит его как приложение.