EnglishРусский Map

go-bt

title
go-bt
type
toolbox
summary
Минималистичная библиотека деревьев поведения для Go с неблокирующими тиками и типизированным generic-blackboard
tags
golang, behavior-trees, game-ai, task-automation
language
Go
license
Unknown
created
2026-04-09
updated
2026-04-09
lang
ru
translation_of
go-bt
source_updated
2026-04-09
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Минималистичная библиотека behavior-tree для Go. Спроектирована для фоновых воркеров, игрового ИИ, автоматизации задач и асинхронной логики. Узлы мгновенно возвращают состояние (кооперативная многозадачность), а не блокируются через goroutine'ы или sleep'ы.

Как устроена

Метод Run каждого узла возвращает одно из трёх целых чисел: 1 (успех), 0 (выполняется), -1 (ошибка). Супервизор тикает дерево с настраиваемым интервалом, и каждый тик проходит по дереву без блокировок.

Основная абстракция - BTContext[T], generic-контекст, который встраивает стандартный context.Context из Go (для отмены и таймаутов) и несёт в себе типизированный blackboard - структуру общего состояния, которую узлы читают и модифицируют.

Типы узлов:

  • Composites - Selector (пробует дочерние узлы, пока один не завершится успехом), Sequence (выполняет дочерние узлы, пока один не завершится ошибкой), MemSequence (продолжает с места, где остановился)
  • Decorators - Inverter, Optional (проглатывает ошибки), Timeout, Retry, Repeat
  • Leaves - Condition (проверяет blackboard), Action (выполняет работу), Sleep (неблокирующее ожидание)

Использование

type WorkerState struct {
    IsConnected  bool
    PendingTasks int
}

tree := composite.NewSelector(
    composite.NewSequence(
        leaf.NewCondition(func(bb *WorkerState) bool {
            return bb.IsConnected
        }),
        leaf.NewAction(func(ctx *core.BTContext[WorkerState]) int {
            ctx.Blackboard.PendingTasks--
            return 1
        }),
    ),
)

supervisor := core.NewSupervisor(tree, 100*time.Millisecond, func(err any) {
    println("recovered:", err)
})
wg := supervisor.Start(btCtx)
wg.Wait()

Тестирование

Библиотека внедряет часы в BTContext, поэтому узлы, работающие со временем (Timeout, Sleep), можно тестировать искусственной перемоткой времени - ждать в реальном времени не нужно.

Ограничения

Очень свежий проект (апрель 2026 года, около 73 звёзд). Лицензия пока не указана. Нет параллельного узла для одновременного выполнения дочерних узлов. Из-за stateless-архитектуры композитных узлов MemSequence остаётся единственным способом возобновить выполнение внутри последовательности между тиками.

Для data-oriented управления сущностями в связке с деревьями поведения на сущность смотрите Ark - обе библиотеки минималистичны и близки по философии дизайна.

https://github.com/rvitorper/go-bt