Skip to main content

A flexible Goal-Oriented Action Planning (GOAP) system for game AI and planning problems, featuring A* search, efficient state management, and modular design.

Project description

GOAP Planner (goapauto)

Goal-Oriented Action Planning for Python — Build intelligent, autonomous agents with strict typing and comprehensive tooling.

CI Release License

goapauto provides a modular framework for AI decision-making using A* search. It separates Perception (Sensors), Thinking (Arbitration), Planning (A*), and Acting (Actions), making it ideal for game AI, NPCs, and simulation bots.

🚀 Key Features (v0.2.0)

  • 🎯 Goal Arbitration: Dynamically select the best goal based on priority and state.
  • 🧠 Smart Planning: A* pathfinding finds the optimal sequence of actions.
  • 🛡️ Type Safety: Built on Pydantic for strict validation and robustness.
  • 👁️ Visualizer: Export search trees to Mermaid or Graphviz for debugging.
  • 🔌 Modular Architecture: Decoupled components for WorldState, Sensors, and Goals.

📚 Documentation

Detailed documentation is available in the docs/ directory:

📦 Installation

uv add goapauto
# or
uv add goapauto

⚡ Quick Start

Here's a minimal example of an agent figuring out how to open a door.

from goapauto.models.worldstate import WorldState
from goapauto.models.goal import Goal
from goapauto.models.actions import Action
from goapauto.models.goap_planner import Planner

# 1. The World: Agent has a key, but the door is closed.
state = WorldState(has_key=True, is_open=False)

# 2. The Action: Needs 'has_key' to open the door.
open_door = Action(
    name="open_door",
    preconditions={"has_key": True, "is_open": False},
    effects={"is_open": True},
    cost=1.0
)

# 3. The Goal: We want the door open.
goal = Goal(target_state={"is_open": True})

# 4. The Plan: Find the path.
planner = Planner(actions_list=[open_door])
result = planner.generate_plan(state, goal)

print(f"Plan to '{goal.name}': {result.plan}")
# Output: Plan to "{'is_open': True}": ['open_door']

🛠️ Advanced Tooling

Visualization

Debug your planner's decision-making process by exporting the search tree:

from goapauto.utils.visualizer import SearchTreeVisualizer

viz = SearchTreeVisualizer()
planner.register_hook("on_node_expanded", viz.on_node_expanded)

# ... run plan ...

# Save as a Mermaid diagram
viz.export("planning_tree.mmd")

Visualization

GoapAuto includes a built-in search tree visualizer that hooks into the planning process to capture every explored node.

Capturing the Search Tree

Register the visualizer hook with the planner before generating a plan:

from goapauto.utils.visualizer import SearchTreeVisualizer

viz = SearchTreeVisualizer()
planner.register_hook("on_node_expanded", viz.on_node_expanded)
planner.generate_plan(initial_state, goal)
viz.export("search_tree.md")

Branching and Complexity

Simple planning problems often result in linear "chains". To see A* explore multiple branches, provide actions with overlapping effects or varying costs.

See [examples/complex_search_demo.py](file:///f:/AI/goapauto/examples/complex_search_demo.py) for a scenario that demonstrates branching search trees.

🤝 Contributing

Contributions are welcome! Please read CONTRIBUTING.md and our Code of Conduct.

📄 License

MIT License. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

goapauto-0.2.2.tar.gz (19.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

goapauto-0.2.2-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

File details

Details for the file goapauto-0.2.2.tar.gz.

File metadata

  • Download URL: goapauto-0.2.2.tar.gz
  • Upload date:
  • Size: 19.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for goapauto-0.2.2.tar.gz
Algorithm Hash digest
SHA256 b24e994ef4c52942f23d4281a4197d5300fbaebd850c77e903c32d5b7c0f8a72
MD5 69efb6f46927436cd32747324cb6798e
BLAKE2b-256 fbb13b7090df949fedc02b47a266309206deae13972678ec7bd7e833c2e1dd34

See more details on using hashes here.

Provenance

The following attestation bundles were made for goapauto-0.2.2.tar.gz:

Publisher: release.yml on IAmNo1Special/goapauto

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file goapauto-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: goapauto-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 24.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for goapauto-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 527d56e21bb5a3656debefbcc47d7b00d4e8a6c3c5542ed37c00615020a2556b
MD5 a117f31e3c6a7cffcc8743bd01125a9b
BLAKE2b-256 6af545f5817757ffe57832acbeffe300c9a6b46a6dc5649150ad62fbfd2d1943

See more details on using hashes here.

Provenance

The following attestation bundles were made for goapauto-0.2.2-py3-none-any.whl:

Publisher: release.yml on IAmNo1Special/goapauto

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page