TAgent - Modular AI Agent Framework with Dynamic Tool Discovery
Project description
TAgent - When You're Tired of Unnecessarily Complex Agent Frameworks
A minimalist, Redux-inspired framework for AI agents that actually makes sense
Fed up with bloated frameworks that need 50 dependencies and 200 lines of boilerplate just to make a simple automation? TAgent is a straightforward, less verbose approach to building AI agents that solve specific problems without the unnecessary complexity.
Why TAgent?
TAgent follows a simple philosophy: state-controlled execution with LLM fallbacks. Instead of complex function calling or massive dependency trees, you get:
- Redux-inspired Architecture: Predictable state management with centralized store
- State Machine Control: Prevents infinite loops and unpredictable behavior
- Structured Outputs: Works with any LLM via JSON, not function calling
- Intelligent Fallbacks: When tools don't exist, uses LLM knowledge directly
- Zero Boilerplate: Get started with 3 lines of code
Quick Start
pip install -e .
from tagent import run_agent
# That's literally all you need to start
result = run_agent(
goal="Translate 'Hello world' to Chinese",
model="gpt-4o-mini",
max_iterations=3
)
print(result.get("raw_data", {}).get("llm_direct_response"))
# Output: 你好世界
How It Works Under the Hood
Deterministic State Machine
Instead of letting the LLM do whatever it wants, the agent follows a controlled flow:
INITIAL → PLAN → EXECUTE → EVALUATE → (loop until goal achieved)
Each transition is validated, preventing infinite loops and unpredictable behaviors.
Structured Outputs Over Function Calling
No function calling dependency. The LLM returns structured JSON validated with Pydantic:
{
"action": "execute",
"params": {"tool": "search", "args": {"query": "python"}},
"reasoning": "Need to search for Python information"
}
Intelligent Fallback System
If a tool doesn't exist, the agent uses the LLM's own knowledge as fallback. No crashes, no errors - it just works.
# Tool not found? No problem!
# Agent automatically uses LLM knowledge instead
Real-World Example
Here's an agent that extracts and translates TabNews articles:
def extract_tabnews_articles(state, args):
"""Extract recent articles from TabNews RSS"""
response = requests.get("https://www.tabnews.com.br/recentes/rss")
root = ET.fromstring(response.content)
articles = []
for item in root.findall('.//item'):
articles.append({
"url": item.find('link').text,
"title": item.find('title').text,
"publication_date": item.find('pubDate').text
})
return ("articles", articles)
def translate(state, args):
"""Translate text using direct LLM call"""
text = args.get("text", "")
target = args.get("target_language", "")
response = litellm.completion(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a professional translator."},
{"role": "user", "content": f"Translate to {target}: {text}"}
]
)
return ("translation", {"translation": response.choices[0].message.content})
# Run the agent
result = run_agent(
goal="Get 1 TabNews article, load content, summarize and translate to Chinese",
model="gpt-4o-mini",
tools={
"extract_tabnews_articles": extract_tabnews_articles,
"load_url_content": load_url_content,
"translate": translate
},
max_iterations=15
)
The agent plans, executes tools in the correct order, and delivers structured results.
Tool Ecosystem & Extensibility
Currently no default tools (keeping it minimal), but adapters are being developed for:
- CrewAI tools
- LangChain tools
- Model Context Protocol (MCP) tools
The idea is to leverage existing ecosystems without being locked into them.
Why Redux for Agents?
- Predictable State: Always know what's happening
- Debug Friendly: Every step is logged and inspectable
- Composition: Tools are pure functions, easy to test
- Extensible: Adding new actions is trivial
- Time Travel: Replay actions for debugging
Performance & Model Support
Works with any model via LiteLLM:
- OpenAI (GPT-4, GPT-3.5)
- Anthropic (Claude)
- Ollama (local models)
- OpenRouter
- Google Gemini
- Azure OpenAI
- And 100+ more...
Each action type can use a different model (planning with GPT-4, execution with cheaper model).
Retro Terminal Experience
Because life's too short for boring UIs:
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ T-AGENT v0.4.1 STARTING ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[-] [12:34:56] INIT: Goal: Translate hello world to Chinese
[#] [12:34:57] PLAN: Generating strategic plan...
[>] [12:34:58] EXECUTE: Using LLM fallback for translation
[+] [12:34:59] SUCCESS: Translation completed!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★ MISSION COMPLETE ★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Architecture Overview
TAgent Framework
├── 🎯 State Machine Controller
│ ├── Deterministic action flow
│ ├── Loop prevention
│ └── Transition validation
├── 🤖 Agent Core
│ ├── Redux-inspired store
│ ├── LLM decision making
│ ├── Tool execution
│ └── Intelligent fallbacks
├── 🛠️ Tool System
│ ├── Pure function interface
│ ├── Dynamic discovery
│ └── Type-safe signatures
└── 📊 Structured Outputs
├── Pydantic validation
├── JSON schema enforcement
└── Type-safe results
Advanced Configuration
Model Configuration
from tagent.model_config import AgentModelConfig
config = AgentModelConfig(
tagent_model="gpt-4o", # Global fallback
tagent_planner_model="gpt-4o-mini", # Planning tasks
tagent_executor_model="gpt-3.5-turbo", # Tool execution
api_key="your-api-key"
)
result = run_agent(
goal="Complex multi-step task",
model=config, # Pass config instead of string
tools=my_tools,
max_iterations=20
)
Environment Variables
export TAGENT_MODEL="gpt-4o-mini"
export TAGENT_PLANNER_MODEL="gpt-4o"
export OPENAI_API_KEY="your-key"
Try It Yourself
# Clone the repository
git clone https://github.com/yourusername/tagent2
cd tagent2
# Install in development mode
pip install -e .
# Run the TabNews example
python examples/tab_news_analyzer/tabnews_code_example.py
Examples Directory
Check out the /examples folder for real implementations:
tab_news_analyzer/- Extract and translate TabNews articlestravel_planning/- Multi-step travel planning agentsimple_qa/- Direct question answering without tools
Each example shows different patterns and use cases.
Roadmap
- CrewAI/LangChain/MCP tool adapters
- Persistent memory system
- Default tool library (web search, file ops)
- Optional web interface
- Multi-agent orchestration
- Tool marketplace/registry
Contributing
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Add tests if applicable
- Commit:
git commit -m "Add amazing feature" - Push:
git push origin feature/amazing-feature - Open a Pull Request
License
MIT License - see LICENSE file for details.
Conclusion
TAgent won't solve all the world's problems, but if you want to create agents without headaches and with code you can understand 6 months later, it might be worth a look.
The framework is small (<2000 lines), focused, and each component has a clear responsibility. Sometimes simple is better.
Repository: https://github.com/yourusername/tagent2
License: MIT
Version: 0.4.1
If you made it this far and found it interesting, leave a star on GitHub. If you didn't like it, open an issue and complain - feedback is always welcome.
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 tagent-0.4.1.tar.gz.
File metadata
- Download URL: tagent-0.4.1.tar.gz
- Upload date:
- Size: 5.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7dbcfb12ee759fe86db96bcf8568de5691a41f6870e9348981f701ac32c3bac5
|
|
| MD5 |
8635d07635317daa36b885dd0a64be11
|
|
| BLAKE2b-256 |
f960f61cc3ed460b6bd253d3f9060a2e1ad56e65780d205d73eeb4ac58e7a044
|
File details
Details for the file tagent-0.4.1-py3-none-any.whl.
File metadata
- Download URL: tagent-0.4.1-py3-none-any.whl
- Upload date:
- Size: 51.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0efca5f7440672ecd7f8fb12fbd53df15613324b1ed1a509953ecb1992bc911
|
|
| MD5 |
c993961abc8aa0792169c7669d6fb635
|
|
| BLAKE2b-256 |
aa5fe0c49936a0ee396081e13f2692fceb93d1536350967f42bc4e2405950833
|