Skip to main content

AgentLoop

Python 3.11+ License: MIT OpenAI Code style: black

An Autonomous Agent System demonstrating LLM-based decision-making in a closed-loop control architecture.

AgentLoop is not a chatbot or a prompt chain—it's a closed-loop decision system where an LLM repeatedly decides what action to take next based on evolving state until the goal is satisfied.

🎬 Quick Demo

# Install from PyPI
pip install autonomous-agentloop

# Run
agentloop "Calculate first 10 Fibonacci numbers and save to file"

Or try the Live Web Demo on Streamlit Cloud

🎯 Core Objective

This project demonstrates how an LLM can be used as a decision-making controller inside a software system, rather than as a text generator. The agent autonomously:

  • ✅ Decides what to do next
  • ✅ Chooses which action to invoke
  • ✅ Observes results
  • ✅ Recovers from failures
  • ✅ Terminates when the goal is complete

🏗️ Architecture

The Fundamental Loop

The entire system is built around this explicit control loop:

while goal_not_satisfied:
    decide_next_action()    # LLM decides
    execute_action()        # System executes
    observe_result()        # System observes
    update_state()          # System updates

System Design

┌─────────────────────────────────────────┐
│         User Submits Goal               │
└────────────────┬────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────┐
│      Decision Engine (LLM)              │
│  - Receives: Goal, State, History       │
│  - Outputs: Structured Action Decision  │
└────────────────┬────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────┐
│      Action Executor (System)           │
│  - search_web                           │
│  - run_code                             │
│  - write_file                           │
│  - finish                               │
└────────────────┬────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────┐
│         State Management                │
│  - History                              │
│  - Results                              │
│  - Errors                               │
└─────────────────────────────────────────┘

Key Design Principles

  1. Plan-Execute Separation: LLM plans, system executes
  2. Structured Actions: Fixed action space with strict schemas
  3. Explicit State: All history is tracked and passed to LLM
  4. Failure Recovery: Automatic retry with error context
  5. Safety Limits: Maximum steps and cost controls

🚀 Quick Start

Installation

# Option 1: Install from PyPI (recommended)
pip install autonomous-agentloop

# Option 2: Install from source
git clone https://github.com/Guri10/AgentLoop.git
cd AgentLoop
pip install -e .

Configuration

Create a .env file:

cp .env.example .env

Add your OpenAI API key:

OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini
MAX_STEPS=50
MAX_RETRIES=3

Basic Usage

from agentloop.main import run_agent

# Submit a goal - the agent does the rest
state = run_agent(
    goal="Research recent AI developments and create a summary report"
)

# Check results
print(f"Completed: {state.is_complete}")
print(f"Cost: ${state.total_cost:.4f}")

Run Demo Scripts

# Simple web search demo
python examples/demo_simple.py

# Research and summarization
python examples/demo_research.py

# Code execution and analysis
python examples/demo_analysis.py

🎮 Available Actions

The agent can only interact through these predefined actions:

1. search_web

Search the internet for information.

{
  "action": "search_web",
  "reasoning": "Need to find recent information",
  "input": {
    "query": "small language models 2024",
    "num_results": 5
  }
}

2. run_code

Execute Python code for analysis or computation.

{
  "action": "run_code",
  "reasoning": "Calculate statistics from data",
  "input": {
    "code": "print(sum([1, 2, 3, 4, 5]))",
    "timeout": 30
  }
}

3. write_file

Save content to a file.

{
  "action": "write_file",
  "reasoning": "Save final report",
  "input": {
    "filename": "report.md",
    "content": "# Report\n\nFindings..."
  }
}

4. finish

Complete the task and terminate.

{
  "action": "finish",
  "reasoning": "Goal accomplished",
  "input": {
    "summary": "Created research report with 3 key findings",
    "artifacts": ["report.md"]
  }
}

📊 State Management

The agent maintains complete state throughout execution:

class AgentState:
    goal: str                          # Original goal
    current_step: int                  # Current step number
    max_steps: int                     # Step limit
    actions_taken: list[ActionDecision]  # Decision history
    action_results: list[ActionResult]   # Execution results
    is_complete: bool                  # Completion status
    total_cost: float                  # API cost tracking

State is passed to the LLM at each decision point, enabling:

  • Learning from past actions
  • Avoiding repeated mistakes
  • Contextual decision-making

🛡️ Failure Handling

AgentLoop implements robust error recovery:

  1. Retry Logic: Failed actions retry up to 3 times with error context
  2. Alternative Actions: LLM chooses different approaches after failures
  3. State Preservation: All failures are recorded and influence future decisions
  4. Safety Limits: Automatic termination at step/cost limits

💰 Cost Tracking

The system tracks API usage and estimates costs:

# After execution
print(f"Total tokens: {agent.decision_engine.total_tokens}")
print(f"Estimated cost: ${state.total_cost:.4f}")

Typical costs with GPT-4o-mini:

  • Simple task (5-8 steps): $0.05 - $0.15
  • Medium task (10-20 steps): $0.15 - $0.50
  • Complex task (20-40 steps): $0.50 - $2.00

🧪 Example: End-to-End Execution

$ python -m agentloop.main "Find recent Python web frameworks and create a comparison"

============================================================
🎯 GOAL: Find recent Python web frameworks and create a comparison
============================================================

--- Step 1/50 ---
🤔 Decision: search_web
💭 Reasoning: Need to find current information about Python web frameworks
✅ Success: 5 items

--- Step 2/50 ---
🤔 Decision: search_web
💭 Reasoning: Get more details on specific frameworks
✅ Success: 5 items

--- Step 3/50 ---
🤔 Decision: write_file
💭 Reasoning: Compile findings into comparison document
✅ Success: File written successfully: ./output/framework_comparison.md

--- Step 4/50 ---
🤔 Decision: finish
💭 Reasoning: Goal accomplished - comparison created
✅ Success: {'summary': 'Created comparison...', 'artifacts': [...]}

🎉 Task completed!

============================================================
📊 EXECUTION SUMMARY
============================================================
Goal: Find recent Python web frameworks and create a comparison
Status: ✅ Complete
Steps taken: 4/50
Estimated cost: $0.0234
Success rate: 4/4 actions
============================================================

🏗️ Project Structure

AgentLoop/
├── src/agentloop/
│   ├── core/
│   │   ├── agent.py          # Main decision loop
│   │   └── schemas.py        # Action/state schemas
│   ├── actions/
│   │   └── executor.py       # Action implementations
│   ├── llm/
│   │   └── decision_engine.py # LLM interface
│   └── main.py               # Entry point
├── examples/
│   ├── demo_simple.py
│   ├── demo_research.py
│   └── demo_analysis.py
├── tests/
├── output/                   # Generated artifacts
├── pyproject.toml
└── README.md

🔬 Technical Details

Why This Architecture?

Separation of Concerns:

  • LLM = Decision maker (what to do)
  • System = Executor (how to do it)

Benefits:

  • Reduces hallucination (LLM doesn't execute)
  • Improves debuggability (clear boundaries)
  • Enables testing (mock executors)
  • Demonstrates software engineering

Action Schema Enforcement

All LLM outputs must match strict Pydantic schemas:

class ActionDecision(BaseModel):
    action: ActionType
    reasoning: str
    input: Dict[str, Any]

Invalid outputs are rejected and retried.

State-Driven Decisions

The LLM receives:

  • Original goal
  • Complete history (last 5 actions)
  • Current step count
  • Previous failures

This enables learning and adaptation.

🎓 What This Project Demonstrates

For Hiring Managers:

  • ✅ Systems architecture and design
  • ✅ LLM integration as a system component
  • ✅ Error handling and recovery patterns
  • ✅ State management
  • ✅ Clean code organization
  • ✅ Production considerations (cost tracking, limits)

Not Just Prompt Engineering:

This project shows engineering discipline:

  • Explicit control flow (not prompt chains)
  • Structured interfaces (not free-form text)
  • Testable components (separation of concerns)
  • Observable behavior (complete state tracking)

📈 Future Enhancements

Potential improvements:

  • Add more actions (read_document, database_query)
  • Implement state compression for long tasks
  • Add web UI for real-time visualization
  • Multi-agent coordination
  • Tool learning (let LLM suggest new actions)
  • Parallel action execution
  • Cost optimization with caching

📝 License

MIT License - see LICENSE file

🤝 Contributing

Contributions welcome! This is a learning project demonstrating autonomous agents.

📧 Contact

Built as a demonstration of LLM-based control systems.


Key Insight: This is not about making the smartest LLM—it's about building a system where an LLM can make reliable decisions within a controlled environment.

Metadata

Release files for autonomous-agentloop 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for autonomous-agentloop 0.1.1
File Size Uploaded
autonomous_agentloop-0.1.1.tar.gz 30.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for autonomous-agentloop 0.1.1
File Interpreter ABI Platform
autonomous_agentloop-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 48.3 kB

Release files / autonomous_agentloop-0.1.1.tar.gz

Download URL autonomous_agentloop-0.1.1.tar.gz
Size 30.5 kB
Tags Source
SHA-256 checksum
How to use checksums
44270bb6dd0f25a0c5cfbe474b7dfc558a6162b5a0256f397d5b1e63b17f102f
BLAKE2b-256 checksum
How to use checksums
3da4a850779021a2b498d6e114f541d9effd8e16bcd897ee4c26c2bc10ec10e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.2

Release files / autonomous_agentloop-0.1.1-py3-none-any.whl

Download URL autonomous_agentloop-0.1.1-py3-none-any.whl
Size 17.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bb5049c7932fbcafac98468aa1a896e304c0357baf86df73e8b15e68585999a5
BLAKE2b-256 checksum
How to use checksums
48d9ca326050b0e783477ae04f3f3dcbfcb3802e63175de5991b1613bd3d0201
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.2

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page