Skip to main content

AI Agent Interaction Tracker and Loop Detection Middleware

Project description

AgentTracker: Monitoring Middleware for AI Agents

A complete system for tracking, monitoring, and analyzing interactions between AI agents (such as CrewAI, AutoGen, LangChain, etc.) with automatic loop detection and cost calculation.

🎯 Main Features

1. Message Tracking

  • Stores complete history of exchanged messages
  • Records sender, recipient, content, timestamp, and tokens consumed
  • Flexible queries on history

2. Intelligent Loop Detection

  • Advanced algorithm that analyzes patterns in messages
  • Detects identical or very similar messages (configurable similarity threshold)
  • Signals repetitions (default: 3+ repetitions)
  • Configurable exception or warning

3. Cost Calculation

  • Estimates session cost based on tokens consumed
  • Support for multiple models (GPT-4, GPT-3.5-turbo, custom)
  • Input/output cost breakdown

4. Analysis and Reporting

  • Complete session summary
  • Export conversation to file
  • Statistics per agent

📦 Installation

Requirements

  • Python 3.8+
  • No external dependencies (standard library only)

Setup

# Clone or copy files to your project
git clone <repository>
cd LoopHalter

# (Optional) Create a virtual environment
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

🚀 Quick Start

Basic Example

from agent_tracker_en import AgentTracker, LoopDetectionException

# Create a tracker
tracker = AgentTracker()

# Add messages
try:
    tracker.add_message(
        sender="Agent_A",
        recipient="Agent_B",
        content="What is the meaning of life?",
        tokens_used=150
    )
    
    tracker.add_message(
        sender="Agent_B",
        recipient="Agent_A",
        content="The answer is 42",
        tokens_used=120
    )
    
except LoopDetectionException as e:
    print(f"❌ Loop detected: {e}")

# Get estimated cost
cost = tracker.estimate_session_cost(model="gpt-3.5-turbo")
print(f"💰 Total cost: ${cost['total_cost']:.6f}")

# Session summary
summary = tracker.get_conversation_summary()
print(f"📊 Total messages: {summary['total_messages']}")

📚 API Reference

Class: AgentTracker

Initialization

tracker = AgentTracker(
    max_loop_repetitions=3,      # Max repetitions before detecting loop
    similarity_threshold=0.85     # Similarity threshold (0-1)
)

Method: add_message()

Adds a message and checks for loops.

result = tracker.add_message(
    sender: str,              # Sending agent ID
    recipient: str,           # Receiving agent ID
    content: str,             # Message content
    tokens_used: int = 0,     # Tokens consumed (optional)
    raise_on_loop: bool = True # Raise exception if loop detected
)

# Returns:
# {
#     "status": "success",
#     "message_count": int,
#     "loop_detected": bool,
#     "warning_message": str,
#     "loop_info": {...}
# }

Method: estimate_session_cost()

Calculates estimated session cost.

cost = tracker.estimate_session_cost(model="gpt-3.5-turbo")

# Returns:
# {
#     "total_cost": float,      # Total cost in USD
#     "input_cost": float,      # Input cost
#     "output_cost": float,     # Output cost
#     "total_tokens": int,      # Total tokens
#     "input_tokens": int,
#     "output_tokens": int,
#     "model": str
# }

Supported Models:

  • "gpt-4" - GPT-4 (most expensive, most powerful)
  • "gpt-3.5-turbo" - GPT-3.5 Turbo (standard)
  • "default" - Generic model

Method: get_message_history()

Retrieves message history with optional filters.

# All messages
all_messages = tracker.get_message_history()

# Filter by sender
from_agent_a = tracker.get_message_history(sender="Agent_A")

# Filter by recipient
to_agent_b = tracker.get_message_history(recipient="Agent_B")

# Filter by both
conversation = tracker.get_message_history(
    sender="Agent_A",
    recipient="Agent_B"
)

Method: get_conversation_summary()

Provides a complete session summary.

summary = tracker.get_conversation_summary()
print(summary)
# {
#     "total_messages": 5,
#     "agents_involved": ["Agent_A", "Agent_B", "Agent_C"],
#     "session_duration_seconds": 42.5,
#     "loop_detected": False,
#     "total_tokens": 750,
#     "estimated_cost": {...},
#     "message_count_by_agent": {"Agent_A": 3, "Agent_B": 2},
#     "start_time": "2024-06-18T10:30:00",
#     "end_time": "2024-06-18T10:30:42"
# }

Method: export_conversation()

Exports conversation to a text file.

filename = tracker.export_conversation("conversation_log.txt")
print(f"Exported to: {filename}")

Method: reset_session()

Resets session state and clears history.

tracker.reset_session()
# Now tracker is clean and ready for a new session

🔍 Loop Detection Algorithm

How It Works

  1. Extraction: Extracts last N messages between two agents (bidirectional)
  2. Similarity Calculation: Uses difflib.SequenceMatcher to calculate similarity
  3. Pattern Analysis: Detects repetitive patterns
  4. Reporting: If found 3+ similar messages (configurable):
    • ✅ Option 1: Raises LoopDetectionException
    • ⚠️ Option 2: Emits warning

Configurable Parameters

tracker = AgentTracker(
    max_loop_repetitions=3,    # Number of repetitions before warning
    similarity_threshold=0.85   # Similarity threshold (0.0 = different, 1.0 = identical)
)

Detection Example

# These messages will trigger loop detector
messages = [
    "Can you repeat the question?",
    "Can you repeat the question?",
    "Can you repeat the question?",  # ⚠️ Loop detected!
]

for msg in messages:
    result = tracker.add_message(
        sender="Agent_A",
        recipient="Agent_B",
        content=msg,
        raise_on_loop=False  # Don't raise exception, just warn
    )
    
    if result["loop_detected"]:
        print(f"⚠️ {result['warning_message']}")
        print(f"   Repetitions: {result['loop_info']['repetitions']}")

💰 Cost System

Predefined Cost Models

Model Input (per 1K tokens) Output (per 1K tokens)
GPT-4 $0.03 $0.06
GPT-3.5-Turbo $0.50 $1.50
Default $0.01 $0.02

Calculation

# Split 80% input / 20% output by default
cost = tracker.estimate_session_cost(model="gpt-4")
print(f"Input cost: ${cost['input_cost']:.6f}")
print(f"Output cost: ${cost['output_cost']:.6f}")
print(f"Total: ${cost['total_cost']:.6f}")

🔧 Framework Integration

CrewAI

from crewai_integration_en import TrackedCrewAIIntegration

integration = TrackedCrewAIIntegration()

agent_a.send_message(
    "agent_b",
    "Message",
    tokens=100
)

# Integration logs automatically!
status = integration.get_status()
integration.save_logs("crew_logs.json")

Generic

def your_agent_communication(sender, recipient, msg, tokens):
    tracker.add_message(sender, recipient, msg, tokens)

🧪 Testing

Run Tests

# All tests
python -m unittest test_agent_tracker_en -v

# Specific tests
python -m unittest test_agent_tracker_en.TestLoopDetection -v

Test Coverage

  • ✅ 8 test classes
  • ✅ 28+ unit tests
  • ✅ Complete feature coverage

📖 Usage Examples

Run Examples

python agent_tracker_en.py       # Basic example
python quickstart_en.py          # 7 use cases
python config_examples_en.py    # Configurations

🛠️ Troubleshooting

Q: Loop detector is too sensitive

A: Increase similarity_threshold or max_loop_repetitions:

tracker = AgentTracker(max_loop_repetitions=5, similarity_threshold=0.95)

Q: Costs are not accurate

A: Provide actual consumed tokens:

tracker.add_message(
    sender="Agent_A",
    recipient="Agent_B",
    content="Message",
    tokens_used=150  # Use the actual token count from the model
)

📄 License

MIT License - see LICENSE file

👥 Contributions

Pull requests and issue reports are welcome!


Version: 1.0.0
Last Update: June 2024
Author: AI Development Team

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

loophalter-1.0.0.tar.gz (21.6 kB view details)

Uploaded Source

Built Distribution

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

loophalter-1.0.0-py3-none-any.whl (27.1 kB view details)

Uploaded Python 3

File details

Details for the file loophalter-1.0.0.tar.gz.

File metadata

  • Download URL: loophalter-1.0.0.tar.gz
  • Upload date:
  • Size: 21.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for loophalter-1.0.0.tar.gz
Algorithm Hash digest
SHA256 c19698a461202078f8bc9d8070b52246c260de53a2cb094493bb54ff790c3642
MD5 a28e006468353488359be5f87e0fe225
BLAKE2b-256 b2d5a3ff8f866267bc3ecada9ee716a450e21edf28451d4cdd655031ffebd795

See more details on using hashes here.

File details

Details for the file loophalter-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: loophalter-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 27.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for loophalter-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a1b0ea78002b7d18b3ab88ffd3f25a0e398ebfd7927cd29bb0209411c4eaa633
MD5 862e7364ebbe450e395e11fdb4271832
BLAKE2b-256 3afc1f58dadbbab999c43f58635120b68f2125f5a5bb790c003fa6414d076c1b

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