Skip to main content

Store and track LLM actions, tool calls, and sessions in Memgraph

Project description

Actions Graph

Store and track LLM actions, tool calls, and sessions in Memgraph.

Actions Graph provides a graph-based storage system for tracking all LLM interactions, including:

  • Tool Calls: Function/tool invocations by the LLM
  • Tool Results: Outputs from tool executions
  • Messages: User, assistant, and system messages
  • Structured Outputs: Validated JSON outputs from the LLM
  • Subagent Events: Subagent lifecycle tracking
  • Sessions: Conversation session management

Features

  • 📊 Graph-based Storage: Store actions as nodes with relationships in Memgraph
  • 🔗 Temporal Sequences: Track action order with FOLLOWED_BY relationships
  • 🌳 Nested Actions: Support for parent-child action relationships (e.g., subagents)
  • 🏷️ Session Management: Create, track, and query sessions with tags
  • 📈 Analytics: Built-in queries for tool usage stats and session summaries
  • 🔌 Agent Context Graph Integration: Consume normalized runtime events through ActionsGraphConnector

Installation

pip install actions-graph

For Agent Context Graph integration:

pip install "actions-graph[agent-context-graph]"

Quick Start

Basic Usage

from actions_graph import ActionsGraph, Session, ToolCall

# Initialize the graph
graph = ActionsGraph()
graph.setup()  # Create indexes and constraints

# Create a session
session = Session(
    session_id="session-123",
    model="claude-sonnet-4-20250514",
    working_directory="/path/to/project",
)
graph.create_session(session)

# Record a tool call
tool_call = graph.record_tool_call(
    session_id="session-123",
    tool_name="Read",
    tool_input={"file_path": "/path/to/file.py"},
    tool_use_id="tool-use-001",
)

# Record the result
tool_result = graph.record_tool_result(
    session_id="session-123",
    tool_use_id="tool-use-001",
    tool_name="Read",
    content="def hello():\n    print('Hello, World!')",
)

# Get session summary
summary = graph.get_session_summary("session-123")
print(f"Actions: {summary['action_count']}, Tools: {summary['tool_call_count']}")

Agent Context Graph Integration

from actions_graph import ActionsGraph
from actions_graph.connector import ActionsGraphConnector
from agent_context_graph import AgentLink
from agent_context_graph.adapters.claude import ClaudeAdapter

graph = ActionsGraph()
graph.setup()

link = AgentLink()
link.add_connector(ActionsGraphConnector(graph))

adapter = ClaudeAdapter(link, session_id="my-session-123")
hooks = adapter.get_runtime_hooks()

Actions Graph should consume runtime activity through Agent Context Graph when possible. Runtime adapters normalize SDK callbacks and command hooks into the shared Event Protocol; ActionsGraphConnector decides which events become session and action nodes.

Graph Schema

Nodes

  • Session: LLM conversation sessions

    • Properties: session_id, started_at, ended_at, status, model, total_cost_usd, etc.
  • Action: Individual actions with type-specific labels

    • Labels: ToolCall, ToolResult, Message, StructuredOutput, SubagentEvent, etc.
    • Properties: action_id, session_id, action_type, timestamp, status, etc.
  • Tool: Tool definitions

    • Properties: name, is_mcp, mcp_server
  • Tag: Session/action tags

    • Properties: name

Relationships

(:Session)-[:HAS_ACTION]->(:Action)
(:Action)-[:FOLLOWED_BY]->(:Action)
(:Action)-[:PARENT_OF]->(:Action)
(:Session)-[:FORKED_FROM]->(:Session)
(:Action)-[:USED_TOOL]->(:Tool)
(:Session)-[:HAS_TAG]->(:Tag)

API Reference

ActionsGraph

Main class for interacting with the graph.

graph = ActionsGraph()

# Setup
graph.setup()      # Create indexes
graph.drop()       # Remove indexes
graph.clear()      # Clear all data

# Sessions
graph.create_session(session)
graph.get_session(session_id)
graph.end_session(session_id, status=ActionStatus.COMPLETED)
graph.list_sessions(limit=100, status=None, tag=None)

# Actions
graph.record_action(action)
graph.record_tool_call(session_id, tool_name, tool_input, ...)
graph.record_tool_result(session_id, tool_use_id, tool_name, content, ...)
graph.record_message(session_id, role, content, ...)
graph.get_action(action_id)
graph.get_session_actions(session_id, action_type=None, limit=1000)

# Analytics
graph.get_tool_usage_stats(session_id=None)
graph.get_action_sequence(session_id, include_content=False)
graph.get_session_summary(session_id)

Action Types

Type Model Class Description
tool_call ToolCall Tool/function invocation
tool_result ToolResult Tool execution result
user_message Message User input
assistant_message Message LLM response
system_message Message System messages
structured_output StructuredOutput Validated JSON output
subagent_start SubagentEvent Subagent started
subagent_stop SubagentEvent Subagent completed
error ErrorEvent Error occurred
permission_request PermissionRequest Permission requested
rate_limit RateLimitEvent Rate limit event

Agent Context Graph Connector

from actions_graph.connector import ActionsGraphConnector

connector = ActionsGraphConnector(graph)
link.add_connector(connector)

The connector records:

  • SessionStartEvent and SessionEndEvent as session lifecycle data
  • ToolStartEvent as ToolCall action nodes
  • ToolEndEvent as ToolResult action nodes
  • MessageEvent, AgentStartEvent, AgentEndEvent, and ErrorOccurredEvent as action nodes

Claude Agent SDK Hooks

Direct Claude Agent SDK hooks remain available for standalone use, but Agent Context Graph is the preferred integration path when multiple graph components need the same runtime event stream.

For Claude Agent SDK integration:

from actions_graph.hooks import create_tracking_hooks, ActionTracker

# Simple usage
hooks = create_tracking_hooks(graph, session_id)

# Advanced usage with custom tracker
tracker = ActionTracker(
    graph,
    session_id,
    track_tool_calls=True,
    track_tool_results=True,
    track_messages=True,
    track_subagents=True,
    track_permissions=True,
    track_errors=True,
)

Example Queries

Find sessions with errors

sessions = graph.list_sessions(status=ActionStatus.FAILED)

Get all tool calls in a session

from actions_graph import ActionType

tool_calls = graph.get_session_actions(
    session_id,
    action_type=ActionType.TOOL_CALL,
)

Custom Cypher queries

rows = graph._db.query("""
    MATCH (s:Session {session_id: $session_id})-[:HAS_ACTION]->(a:ToolCall)
    RETURN a.tool_name AS tool, count(*) AS count
    ORDER BY count DESC
""", params={"session_id": "my-session"})

License

MIT

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

actions_graph-0.1.1.tar.gz (25.0 kB view details)

Uploaded Source

Built Distribution

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

actions_graph-0.1.1-py3-none-any.whl (21.2 kB view details)

Uploaded Python 3

File details

Details for the file actions_graph-0.1.1.tar.gz.

File metadata

  • Download URL: actions_graph-0.1.1.tar.gz
  • Upload date:
  • Size: 25.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for actions_graph-0.1.1.tar.gz
Algorithm Hash digest
SHA256 ecfddda46b539e55d2464a80af6696e4156546493db012980ee96ec113ff78fe
MD5 381f77183f5dd9e85708adf60197b1f4
BLAKE2b-256 b0ea79ff7b7280d7807261e3f8ff8d0b35bd4509bbf5a94fb61a7c8f2804ef81

See more details on using hashes here.

File details

Details for the file actions_graph-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: actions_graph-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 21.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for actions_graph-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 842d5788b959ba0863c1ef6951e6518aa5376293771f693f2a393f9fcea5cded
MD5 0b3f3c60585207e7f305f9493fe58554
BLAKE2b-256 85d2c27ae00536cd534298298f1345ed8d3abab2e8110cb602f5efa7a99107cb

See more details on using hashes here.

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