An autonomous agent system demonstrating LLM-based decision-making in a closed-loop control architecture
Project description
AgentLoop
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
pip install -e .
# Run
agentloop "Calculate first 10 Fibonacci numbers and save to file"
Or try the Web Interface (coming soon 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
- Plan-Execute Separation: LLM plans, system executes
- Structured Actions: Fixed action space with strict schemas
- Explicit State: All history is tracked and passed to LLM
- Failure Recovery: Automatic retry with error context
- Safety Limits: Maximum steps and cost controls
๐ Quick Start
Installation
# Clone the repository
git clone https://github.com/YOUR_USERNAME/AgentLoop.git
cd AgentLoop
# Install with uv (recommended)
uv sync
# Or with pip
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:
- Retry Logic: Failed actions retry up to 3 times with error context
- Alternative Actions: LLM chooses different approaches after failures
- State Preservation: All failures are recorded and influence future decisions
- 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file autonomous_agentloop-0.1.0.tar.gz.
File metadata
- Download URL: autonomous_agentloop-0.1.0.tar.gz
- Upload date:
- Size: 30.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb8f9400db641f64db65c4a4d502cda32883805718a917f9a8c1a004f2e5ac0e
|
|
| MD5 |
abe95f63d1c426d64213a27ae221037a
|
|
| BLAKE2b-256 |
337db2c4d995fd25dc0f033a33ec82a566d042b392c8691bc53a8ef411f2d749
|
File details
Details for the file autonomous_agentloop-0.1.0-py3-none-any.whl.
File metadata
- Download URL: autonomous_agentloop-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13540623cb09c5ebfa6f1f8b439f3355101af3d30387908cb4553e012e56a603
|
|
| MD5 |
b44d6ed58b1beebcdb738c5a07a87352
|
|
| BLAKE2b-256 |
e53cda9483bac522f3609dfece1883d0d6113445fe46b536621e3750c1a9eb6f
|