Skip to main content

Graph-native framework for building AI agents with FalkorDB persistence

Project description

agentic-graphs

Graph-native framework for building AI agents with persistent execution state.

Every agent's execution is a directed graph—GOAL → TASK → ACTION → SYNTHESIS. Persistence is backed by FalkorDB, so you can inspect the full state of every agent at http://localhost:3000.

  • 🚀 Built-in tool pipeline — agents don't hallucinate; they mutate graphs explicitly
  • 🔄 Multi-turn chat — sessions preserve full context across turns
  • 🤝 Multi-agent patterns — subagents, skills, handoffs, routers all share the parent graph
  • 💾 Persistent execution — every node, edge, and message is queryable in FalkorDB
  • 🧠 Semantic memory — cross-turn reasoning with embeddings

Installation

Via pip (stable)

pip install agentic-graphs

Via uv (development)

uvx agentic-graphs  # or
uv add agentic-graphs

Optional dependencies

# Use other LLM providers
pip install agentic-graphs[anthropic,gemini,groq]  # or [all]

# Development
pip install agentic-graphs[dev]

Quick Start

1. Set up FalkorDB (one-time)

docker run -d -p 6379:6379 -p 3000:3000 --name falkordb falkordb/falkordb:latest

Then open http://localhost:3000 to inspect agent state.

2. Create your first agent

import asyncio
from agentic_graphs import Agent, OpenAILLM, tool

@tool
def add(a: float, b: float) -> float:
    """Add two numbers."""
    return a + b

@tool
def multiply(a: float, b: float) -> float:
    """Multiply two numbers."""
    return a * b

class MathAgent(Agent):
    """Simple math agent with custom tools."""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._extra_action_tools = {"add": add, "multiply": multiply}
        self._extra_action_schemas = [add.schema, multiply.schema]

    def build_tools(self, node):
        schemas, impls = super().build_tools(node)
        schemas += self._extra_action_schemas
        impls.update(self._extra_action_tools)
        return schemas, impls

async def main():
    llm = OpenAILLM(model="gpt-4o-mini")
    agent = MathAgent(llm, "What is (17 * 3 + 42) / 9?")
    result = await agent.run()
    print(f"Answer: {result}")

asyncio.run(main())

3. Multi-turn chat sessions

from agentic_graphs.session import Session
from agentic_graphs.core.falkordb_backend import FalkorDBBackend

async def chat():
    session = await Session.create(
        llm=OpenAILLM(model="gpt-4o-mini"),
        agent_class=MathAgent,
        backend=FalkorDBBackend(),
        thread_name="math-session",
        user_id="alice",
    )

    # Each turn builds a fresh graph, history is auto-injected
    reply = await session.chat("What is 5 * 8?")
    print(reply)

    reply = await session.chat("Add 10 to that result")
    print(reply)

    # Resume later by thread ID
    session = await Session.create(..., thread_id=session.thread_id)

Run Examples

# Math agent (single-turn)
uv run python -m agentic_graphs.examples.math_agent "What is 15 + 27?"
uv run python -m agentic_graphs.examples.math_agent --chat  # Interactive

# Multi-turn chat session
uv run python -m agentic_graphs.examples.chat_session

# Multi-agent with subagents (research + math)
uv run python -m agentic_graphs.examples.multi_agent_demo

# Session debugger — inspect execution graphs
uv run python -m agentic_graphs.examples.debug_session
uv run python -m agentic_graphs.examples.debug_session --thread <thread-id>

Open http://localhost:3000 to see the graph state in real-time.

Core Concepts

Graph Nodes

Every agent execution builds a directed graph. Node types and states:

GOAL → TASK → ACTION → SYNTHESIS → (resolved)
  ↓
 (pending/ready/active/resolved/failed)
  • GOAL — user's request
  • TASK — sub-goal decomposition
  • ACTION — tool calls (mutations, external APIs)
  • SYNTHESIS — final answer generation

Built-in Tools

Agents automatically have:

  • create_task(label, ...) — create a TASK node
  • create_action(label, instruction) — create an ACTION node
  • resolve_current_node(output) — mark node as RESOLVED
  • add_dependency(waiting, prereq) — set up blocking edges
  • get_token_usage() — retrieve accumulated token costs

ACTION nodes also get your custom tools (e.g., add, multiply).

Multi-Agent Patterns

Subagents — delegate to child agents in sub-GOAL nodes:

agent.register_subagent(
    "researcher",
    agent_class=ResearchAgent,
    description="Research any topic",
)

Skills — progressive disclosure of domain tools:

agent.register_skill(
    "web_search",
    tools=[search.schema],
    tool_fns={"search": search},
    description="Search the web",
)

Handoffs — state-driven agent switching:

if "financial" in task:
    await agent.handoff_to("financial_analyst")

Supported LLM Providers

  • OpenAI — gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-5
  • Anthropic — claude-sonnet-4, claude-opus
  • Google Gemini — gemini-2.0-flash, gemini-pro
  • Groq — mixtral, llama
  • Ollama — local models
  • Azure OpenAI

Switch providers with:

from agentic_graphs import AnthropicLLM, GeminiLLM

llm = AnthropicLLM(model="claude-sonnet-4")
llm = GeminiLLM(model="gemini-2.0-flash")

Token Usage Tracking

Each node tracks cumulative token costs:

agent = Agent(llm, goal)
result = await agent.run()

# Check usage on any node
for node_id, node in agent.graph.nodes.items():
    usage = node.props.get("_usage", {})
    print(f"{node.label}: {usage.get('total_tokens')} tokens")

Architecture

Graph Model:

  • Every agent owns a Graph object
  • Nodes have states: PENDING → READY → ACTIVE → RESOLVED | FAILED
  • Edges define dependencies: REQUIRES (blocking), PART_OF (structural), PRODUCES (data)

Scheduler:

  • Processes nodes in dependency order
  • Auto-retries failed nodes with exponential backoff
  • Persists state to FalkorDB on every mutation

Backend:

  • FalkorDB stores all nodes, edges, messages as queryable graphs
  • Each turn is a separate graph; sessions maintain history
  • Semantic search finds similar prior problems for transfer learning

See docs/ARCHITECTURE.md for deep dive.

Configuration

Environment variables

export OPENAI_API_KEY=sk-...          # OpenAI
export ANTHROPIC_API_KEY=sk-ant-...   # Anthropic
export GOOGLE_API_KEY=AIzaSy...       # Gemini
export GROQ_API_KEY=gsk_...           # Groq
export FALKORDB_HOST=localhost        # FalkorDB (default: localhost:6379)

Custom timeout

llm = OpenAILLM(model="gpt-4o-mini", timeout=300.0)

Tests

uv run pytest tests/ -v
uv run ruff check src/  # Linting

Contributing

Pull requests welcome! Please:

  1. Run uv run ruff check src/ --fix before committing
  2. Add tests for new features
  3. Update docs if behavior changes

License

MIT — see LICENSE

Links

  • 📖 Detailed Usage Guide
  • 🏗️ Architecture
  • 🚀 Publishing to PyPI
  • 📝 Research Paper
  • Scheduler — processes READY nodes concurrently; fan-out via asyncio.gather, fan-in via REQUIRES edges
  • LLM — abstract provider interface (OpenAI, LiteRT-LM, etc.)
  • @tool — auto-generates OpenAI-compatible schema from type hints + docstrings
  • Session — multi-turn conversation with per-turn graph traceability
  • FalkorDB — native graph persistence with built-in browser UI

Using FalkorDB directly

from agentic_graphs import FalkorDBBackend, Graph, Node, NT

backend = FalkorDBBackend(graph_name="my_agent")

# Push
backend.sync(my_graph)

# Pull
restored = backend.load("my_agent")

# Query
result = backend.query("MATCH (n:GOAL) RETURN n.label, n.state")
for row in result.result_set:
    print(row)

# Auto-sync every mutation
from agentic_graphs import set_sync_hook
set_sync_hook(lambda g: backend.sync(g))

Project structure

src/agentic_graphs/
├── __init__.py          # Public API
├── log.py               # Coloured logging
├── core/
│   ├── graph.py         # Graph, Node, Edge, algorithms
│   ├── tool.py          # @tool decorator
│   └── falkordb_backend.py  # FalkorDB persistence
├── llm/
│   ├── base.py          # Abstract LLM interface
│   └── openai.py        # OpenAI provider
├── agent/
│   ├── base.py          # Agent base class (history_messages support)
│   ├── defaults.py      # Default prompts, guides, mutation tools
│   └── scheduler.py     # Run loop with retry + concurrency
├── session/
│   ├── models.py        # Thread, Turn, TurnStatus, SessionConfig
│   ├── store.py         # ThreadStore — FalkorDB-backed persistence
│   └── session.py       # Session — multi-turn chat with graph traceability
└── examples/
    ├── math_agent.py       # Math solver with @tool tools
    ├── multi_agent.py      # Coordinator + parallel sub-agents
    ├── research_agent.py   # Single research agent (fixed)
    ├── chat_session.py     # Multi-turn session demo (new)
    └── debug_session.py    # Session debugger (new)

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

agentic_graphs-0.2.2.tar.gz (90.5 kB view details)

Uploaded Source

Built Distribution

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

agentic_graphs-0.2.2-py3-none-any.whl (82.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: agentic_graphs-0.2.2.tar.gz
  • Upload date:
  • Size: 90.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agentic_graphs-0.2.2.tar.gz
Algorithm Hash digest
SHA256 ed8b9a52e0f8d01c7b80ea7a7c2e2902e537256f72e3a693678a7b5b835a0d0a
MD5 f13b2687fffeeee17a258464531ecc41
BLAKE2b-256 e100b16c0b7b11759ed98520196ad7d5779c85d1c9bcdeaeefdace4349c47ddd

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on fab679/agentic-graphs

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

File details

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

File metadata

  • Download URL: agentic_graphs-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 82.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agentic_graphs-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fabe6f813b995a0b6799b4e278f9c43000ae78aae9f50d005b8c80b4e7e9f8ca
MD5 a40db752d135002bd3619840ebc7ff79
BLAKE2b-256 431bc1ab7202d74952f1d4112ab872910d1b7cf04861dbab70c4e272e33fd5ea

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on fab679/agentic-graphs

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