В этой статье
Если Roblox-игра должна отправить запрос в OpenAI, ключ API не должен попадать в LocalScript. Всё, что опубликовано в клиентской части, игрок может изучить и извлечь из него секрет. Поэтому схема здесь такая: Roblox-сервер получает секрет из Secret Store, серверный Script отправляет запрос через HttpService, а клиент получает только результат, который вы сами разрешили ему показать.
Это не ключ Roblox Open Cloud и не подписка ChatGPT. Нужен отдельный API-ключ OpenAI с доступом к API.
Что подготовить
- Создайте API-ключ в кабинете OpenAI и скопируйте его. Вставлять его в исходники Roblox не нужно.
- В Creator Hub добавьте ключ в Secret Store опыта. Назовите секрет, например,
OPENAI_API_KEY. Имя чувствительно к точному совпадению: оно понадобится вHttpService:GetSecret("OPENAI_API_KEY"). - В настройках опыта включите разрешение на HTTP-запросы. Без него
HttpService:RequestAsyncне сможет обратиться к внешнему API. - В Roblox Studio добавьте обычный серверный
ScriptвServerScriptService.
Secret Store хранит значение отдельно от Luau-кода, а GetSecret возвращает специальный тип Secret. Не выводите его через print, не кладите в ReplicatedStorage, ModuleScript или атрибуты объектов. Для локального теста Roblox отдельно описывает добавление секрета в Local Secrets и ограничение доступа сервером (инструкция по локальному хранению секретов). Документация Roblox показывает передачу такого значения прямо в HTTP-заголовке через HttpService (Secret storage, HttpService). OpenAI также рекомендует хранить ключи вне исходного кода и использовать серверное хранилище секретов (Production best practices).
Если вам параллельно нужен отдельный зарубежный цифровой сервис для проекта, его можно посмотреть в каталоге Amber Market. Это самостоятельный маршрут к цифровым сервисам, а не способ получить API-ключ OpenAI или пополнить баланс API; наличие и условия проверяйте на карточке, оплату по подтверждённым условиям можно провести через СБП.
Если нужен отдельный разбор базового окружения и первого запроса OpenAI API, он есть в материале «Первый запрос к GPT API на Python». Для Roblox сам принцип аутентификации тот же, но ключ здесь остаётся на сервере.
Минимальный серверный запрос к Responses API
Поместите этот код в ServerScriptService, а не в StarterPlayerScripts:
local HttpService = game:GetService("HttpService")
local OPENAI_URL = "https://api.openai.com/v1/responses"
local MODEL_ID = "YOUR_AVAILABLE_MODEL_ID"
local function requestOpenAI()
local apiKey = HttpService:GetSecret("OPENAI_API_KEY")
local requestBody = {
model = MODEL_ID,
input = "Ответь одной короткой фразой: серверный запрос Roblox работает.",
}
local response = HttpService:RequestAsync({
Url = OPENAI_URL,
Method = "POST",
Headers = {
["Content-Type"] = "application/json",
["Authorization"] = apiKey:AddPrefix("Bearer "),
},
Body = HttpService:JSONEncode(requestBody),
})
if not response.Success then
warn(string.format(
"OpenAI request failed: %d %s\n%s",
response.StatusCode,
response.StatusMessage,
response.Body
))
return nil
end
local data = HttpService:JSONDecode(response.Body)
print("OpenAI response:", data.id, data.status)
print("Raw body:", response.Body)
return data
end
local ok, resultOrError = pcall(requestOpenAI)
if not ok then
warn("HTTP call or JSON parsing failed:", resultOrError)
end
Здесь MODEL_ID намеренно оставлен заполнителем. Подставьте модель, доступную вашему API-проекту и разрешённую для выбранного запроса. Не зашивайте конкретный ID в инструкцию как вечную гарантию: доступность моделей и права проекта могут отличаться.
Ключевая деталь — apiKey:AddPrefix("Bearer "). Метод добавляет префикс к секретному значению, но сам ключ не превращается в обычную строку в вашем коде. OpenAI принимает API-ключ как bearer-учётные данные в заголовке Authorization (API Overview). В тело JSON ключ не добавляется.
RequestAsync возвращает словарь с полями вроде Success, StatusCode, StatusMessage и Body. Сначала проверяйте Success, затем разбирайте Body через JSONDecode. Обёртка pcall нужна для другого класса ошибок: например, сеть недоступна, HTTP-запросы отключены или тело ответа оказалось невалидным JSON. Статус 401 обычно означает проблему с ключом или заголовком, 403 — с правами, 404 — с URL или маршрутом, а 429 — с лимитом или квотой. Это диагностические направления, а не замена чтению тела ошибки.
Как проверить результат в Studio
Запустите игру с сервером, откройте окно Output и проверьте три вещи:
- в логе появился
OpenAI responseс идентификатором ответа; response.Successравенtrue, а HTTP-код успешный;- в
Raw bodyпришёл JSON Responses API, а не сообщение об ошибке.
Если GetSecret не находит значение, сначала проверьте имя OPENAI_API_KEY, опыт и окружение, для которого секрет добавлен. Если запрос не отправляется вообще, проверьте разрешение HTTP-запросов в настройках безопасности. Если приходит 401, не печатайте ключ для диагностики: сверяйте сам секрет в Secret Store и формирование заголовка.
Этот тест печатает тело ответа только для локальной проверки. В рабочей игре лучше логировать код, id и безопасное описание ошибки, а полный ответ передавать клиенту только после фильтрации. Ответ модели может содержать текст, который не должен без проверки появляться в интерфейсе, чате или игровом мире.
Как передать результат клиенту
Если игрок запускает запрос кнопкой, клиент может вызвать RemoteEvent, но сам вызов OpenAI всё равно остаётся в ServerScriptService. Сервер принимает ограниченный набор входных данных, проверяет длину и смысл запроса, вызывает requestOpenAI, а затем отправляет клиенту только нужное поле результата. Не передавайте клиенту apiKey, объект Secret, полный набор служебных заголовков или диагностический секрет.
Для первого теста достаточно серверного Script выше. После него можно добавить RemoteEvent и лимиты: частоту запросов на игрока, максимальный размер input, обработку таймаута и понятное сообщение при 429. Повтор запроса без ограничения опасен: временная сетевая ошибка может превратить одну попытку в несколько оплачиваемых запросов. Сначала сохраните идентификатор и состояние операции, затем решайте, допустим ли повтор.
Итоговая граница компонентов простая: API-ключ создаётся в OpenAI, хранится в Secret Store Roblox и используется только серверным Script; HttpService отправляет POST на /v1/responses; клиент получает уже проверенный результат. Пока ключ остаётся за этой границей, опубликованный клиентский код не становится копией ваших учётных данных.
Источники
- Developer quickstart | OpenAI APIOpenAI
- API Overview | OpenAI API ReferenceOpenAI
- Production best practices | OpenAI APIOpenAI
- HttpService | Documentation - Roblox Creator HubRoblox Creator Hub
- Secrets stores | Documentation - Roblox Creator HubRoblox Creator Hub
- Secret storage | Roblox Creator HubRoblox Creator Hub