# Как настроить бесплатного ИИ-агента для Roblox Studio: studsmith, генерация Luau и автоплейтест

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-nastroit-besplatnogo-ii-agenta-dlya-roblox-studio-s.html

## TL;DR

- Время выполнения: 40–60 минут (первый цикл «сгенерировал → запустил → исправил»)
- Уровень сложности: Basic
- Понадобится:
  - Roblox Studio (актуальную версию смотрите в самом Studio: `File → About Roblox Studio`; номер версии сверьте с документацией Roblox)
  - бесплатный аккаунт Roblox
  - агент studsmith, установленный по инструкции проекта: способ установки, имя конфигурационного файла и список поддерживаемых моделей — **сверьтесь с документацией studsmith**, в гайде они не фиксируются
  - пустая папка под проект и любой текстовый редактор

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/kak-nastroit-besplatnogo-ii-agenta-dlya-roblox-studio-s-ru-1.jpg?v=1794386753)


- ОС: Windows или macOS — платформы, для которых Roblox официально выпускает Studio. Для Linux-сборок и эмуляторов **сверьтесь с документацией Roblox**.
- Права на установку программ (Studio ставится системным установщиком, может потребоваться подтверждение администратора).
- Свободное место на диске под Studio и кэш ассетов — точный объём **сверьтесь с требованиями установщика**.
- Аккаунт Roblox с доступом в Studio (для локального плейтеста публикация игры не нужна).
- Открытое окно агента (studsmith) рядом со Studio — вы будете копировать код туда и обратно.

Чек-лист готовности:

- [ ] Studio запускается и показывает стартовый экран с шаблонами
- [ ] Создан новый проект из шаблона `Baseplate`, файл сохранён как `<ваш-путь>/<имя-проекта>.rbxl`
- [ ] Открыто окно `Output` (View → Output) — оно понадобится для проверки каждого шага
- [ ] Открыта `Command Bar` (View → Command Bar) — строка ввода Luau-команд в один клик
- [ ] В агенте создан новый диалог под этот проект

**Пример:** после `View → Output` в нижней панели Studio появляется вкладка `Output` с пустым списком. Если вкладки нет — пункт меню не нажат, а не «сломался Studio».

## Шаг 1. Подготовить рабочую папку и бриф для агента
![Иллюстрация к разделу «Шаг 1. Подготовить рабочую папку и бриф для агента»](https://ai-release.org/guides/img/kak-nastroit-besplatnogo-ii-agenta-dlya-roblox-studio-s-ru-2.jpg?v=1794386768)


**Что сделать:** создайте рядом с файлом `.rbxl` папку проекта и положите в неё два файла — `notes/agent-brief.md` (бриф с ограничениями) и `src/` для копий сгенерированных скриптов.

**Зачем:** агент генерирует Luau — диалект Lua, на котором Roblox исполняет скрипты, — опираясь на ваш текст. Чем предсказуемее структура и чем жёстче ограничения в брифе, тем меньше правок после вставки в Studio. Подробнее о том, как структура папок делает агента управляемым, — в гайде [ICM на практике: структура папок, которая делает ИИ-агента управляемым](https://ai-release.org/guides/icm-praktika-struktura-papok-agenta.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

Структура:

```
<имя-проекта>/
  <имя-проекта>.rbxl
  notes/
    agent-brief.md
  src/
    GameBootstrap.server.luau
  tests/
    SmokeTest.server.luau
```

Содержимое `notes/agent-brief.md`:

```markdown
# Брифинг для агента
Платформа: Roblox Studio, Luau.
Куда кладём код: ServerScriptService (серверные скрипты), StarterPlayerScripts (клиентские).
Запрещено: глобальный wait(), спавн объектов внутри RenderStepped, сторонние модули.
Обязательно: task.wait(), проверка FindFirstChild перед обращением к дочернему объекту,
--!strict в начале файла.
Критерий готовности: скрипт печатает BOOTSTRAP_OK и не даёт ошибок в Output.
Формат ответа: один файл Luau целиком, без пояснений вне кода.
```

**Как проверить:** покажите бриф агенту и попросите: «Перечисли ограничения из брифа». В ответе должны присутствовать все пять строк ограничений и критерий готовности. Если агент что-то пропустил — он прочитал не весь файл, сократите бриф или разбейте на два.

**Пример:** ответ вида «task.wait вместо wait, проверка FindFirstChild, без сторонних модулей, `--!strict`, критерий — BOOTSTRAP_OK» означает, что бриф доехал целиком.

## Шаг 2. Сгенерировать первый Luau-скрипт и включить нужные настройки Place

**Что сделать:** попросите агента написать серверный скрипт по брифу, вставьте его в Studio и при необходимости разрешите HTTP-запросы.

Промпт (копируется целиком):

```
Контекст: Roblox Studio, Luau, серверный Script в ServerScriptService.
Задача: при подключении игрока печатать в Output строку
PLAYER_JOINED name=<Name> id=<UserId>, а при старте сервера — BOOTSTRAP_OK.
Ограничения: см. agent-brief.md. Только task.wait, без внешних модулей.
Формат: один файл Luau целиком.
```

Ожидаемый результат генерации (файл `src/GameBootstrap.server.luau`):

```lua
--!strict
local Players = game:GetService("Players")

local function onPlayerAdded(player: Player)
	print(string.format("PLAYER_JOINED name=%s id=%d", player.Name, player.UserId))
end

Players.PlayerAdded:Connect(onPlayerAdded)

for _, player in Players:GetPlayers() do
	onPlayerAdded(player)
end

print("BOOTSTRAP_OK")
```

Вставка в Studio: `ServerScriptService` → `+` (Insert Object) → `Script`, переименуйте в `GameBootstrap`, содержимое замените целиком. Цикл по `Players:GetPlayers()` нужен потому, что в плейтесте персонаж часто уже существует к моменту запуска скрипта, и одно событие `PlayerAdded` его не поймает.

Если скрипт ходит во внешний API, включите HTTP: Home → Game Settings → Security → `Allow HTTP Requests` → Save. Дальше перезапустите плейтест — настройка применяется к новой сессии, а не к текущей.

**Как проверить:** `View → Script Analysis` → в списке ноль ошибок разбора. Затем `F5` (Play) и вкладка `Output`.

**Пример:** в `Output` две строки:

```
BOOTSTRAP_OK
PLAYER_JOINED name=Builder id=1234567
```

Если строк нет — скрипт не в `ServerScriptService` или вы смотрите вкладку клиента (`Output` переключается между сервером и клиентом в плейтесте).

## Шаг 3. Автоплейтест: смоук-тест и цикл проверки
![Иллюстрация к разделу «Шаг 3. Автоплейтест: смоук-тест и цикл проверки»](https://ai-release.org/guides/img/kak-nastroit-besplatnogo-ii-agenta-dlya-roblox-studio-s-ru-3.jpg?v=1794386780)


**Что сделать:** добавьте в `ServerScriptService` второй скрипт `SmokeTest`, который сам проверяет постусловия и печатает итог.

Смоук-тест — короткая автопроверка, которая отвечает «жив ли билд», без ручного клика по игре.

```lua
--!strict
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ok, fail = 0, 0

local function check(name: string, cond: boolean)
	if cond then
		ok += 1
		print("PASS " .. name)
	else
		fail += 1
		warn("FAIL " .. name)
	end
end

check("SpawnLocation exists", workspace:FindFirstChildOfClass("SpawnLocation") ~= nil)
check("Players service alive", game:GetService("Players") ~= nil)

print(string.format("SMOKE_RESULT ok=%d fail=%d", ok, fail))
```

Затем прогоняйте один и тот же цикл после каждой правки: `F5` → `Output` → скопировать ошибку агенту → вставить исправленный скрипт → `F5` снова. Один круг занимает 1–2 минуты, поэтому дешевле гонять его после каждой мелкой правки, чем раз в час большим пакетом. Если хотите расширить автоплейтест до генерации уровней и NPC — см. [Как нейросети используются в играх: генерация уровней, персонажей и диалогов](https://ai-release.org/guides/kak-neyroseti-ispolzuyutsya-v-igrah-generatsiya-urovney.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

Куда смотреть при проверке:

| Панель Studio | Что показывает | Признак успеха |
|---|---|---|
| `Output` | `print`/`warn` и рантайм-ошибки скриптов | `SMOKE_RESULT ok=2 fail=0` |
| `Script Analysis` | синтаксис и предупреждения Luau | 0 ошибок разбора |
| `Command Bar` | ручной запуск одной строки Luau | команда вернула ожидаемое значение |

**Как проверить:** запустите `F5` и дождитесь строки `SMOKE_RESULT`. Число после `ok=` равно количеству `PASS`-строк, `fail=0`.

**Пример:** в `Command Bar` наберите `print(workspace:FindFirstChildOfClass("SpawnLocation"))` и нажмите Enter — в `Output` появится имя объекта (`SpawnLocation`), а не `nil`. Так вы проверяете конкретный объект, не перезапуская плейтест.

## Возможные проблемы и решения

**Проблема. Скрипт падает при обращении к внешнему API**

- Ошибка: `Http requests are not enabled. Enable via game settings`
- Причина: `HttpService` запрещён настройкой Place — это защита по умолчанию, а не баг Studio.
- Решение: Home → Game Settings → Security → включите `Allow HTTP Requests` → Save. Полностью закройте плейтест и нажмите `F5` заново: текущая сессия настройку не подхватит.

**Проблема. Ошибка при работе с персонажем игрока**

- Ошибка: `attempt to index nil with 'Humanoid'`
- Причина: скрипт обращается к `Humanoid` до того, как модель персонажа догрузилась, — переменная равна `nil`.
- Решение: дождитесь загрузки с таймаутом и обработайте неудачу вместо бесконечного ожидания:

```lua
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid", 5)
if not humanoid then
	warn("HUMANOID_TIMEOUT player=" .. player.Name)
	return
end
```

**Проблема. Ответ агента обрезан, скрипт не компилируется**

- Ошибка: `Expected ')' (to close '(' at line 12), got 'end'`
- Причина: генерация упёрлась в лимит вывода или агент «сократил» код; в файл попал незакрытый блок.
- Решение: не правьте `end` вручную. Попросите выдать файл двумя частями («сначала функции, потом подключения событий») и проверьте результат через `View → Script Analysis` до запуска `F5`.

## Резюме и следующие шаги

Рабочий контур — это бриф с ограничениями, один серверный скрипт и смоук-тест, который печатает `SMOKE_RESULT` при каждом запуске. Дальше расширяйте бриф новыми правилами и добавляйте `check(...)` под каждую новую механику, чтобы автоплейтест ловил регрессии без ручного прохода по игре.

## FAQ

**Нужен ли платный аккаунт, чтобы пользоваться Roblox Studio?**
Studio бесплатна; условия и лимиты конкретно для studsmith **сверьтесь с документацией проекта** — в этом гайде они не зафиксированы.

**Можно ли работать без включения HTTP-запросов?**
Да. `Allow HTTP Requests` нужен только скриптам, которые обращаются к внешним сервисам. Локальная генерация Luau и плейтест работают с настройкой по умолчанию.

**Почему скрипт работает в Play, но не в опубликованной игре?**
Проверьте контекст: серверный код должен лежать в `ServerScriptService`, клиентский — в `StarterPlayerScripts`. Скрипт, вставленный в `Workspace` во время плейтеста, в сохранённый Place не попадает — правки в плейтесте не сохраняются.

**Как часто прогонять автоплейтест?**
После каждой правки скрипта. Цикл «`F5` → `Output` → правка» занимает 1–2 минуты, а разбор накопленных ошибок пачкой — заметно дольше.
