tagent


Nametagent JSON
Version 0.5.5 PyPI version JSON
download
home_pageNone
SummaryTAgent - Modular AI Agent Framework with Dynamic Tool Discovery
upload_time2025-07-15 00:22:26
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords ai agent llm automation framework
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # TAgent - When You're Tired of Unnecessarily Complex Agent Frameworks

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Version](https://img.shields.io/badge/version-0.5.0-green.svg)](https://github.com/yourusername/tagent2)

> **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.

![gif](https://vhs.charm.sh/vhs-dujKmiVTP09yg9gOXAbs5.gif)

## 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

```bash
pip install -e .
```

```python
from tagent import run_agent
from tagent.config import TAgentConfig

# Simple usage with configuration
config = TAgentConfig(
    model="gpt-4o-mini",
    max_iterations=3,
    verbose=True
)

result = run_agent(
    goal="Translate 'Hello world' to Chinese",
    config=config
)

print(result.get("raw_data", {}).get("llm_direct_response"))
# Output: 你好世界
```

## Configuration System

TAgent v0.5.0 introduces a comprehensive configuration system that centralizes all agent settings. You can configure UI style, model settings, execution parameters, and more.

### Basic Configuration

```python
from tagent import run_agent
from tagent.config import TAgentConfig
from tagent.ui.factory import UIStyle

# Create configuration
config = TAgentConfig(
    model="gpt-4o-mini",
    max_iterations=10,
    verbose=True,
    ui_style=UIStyle.INSTITUTIONAL,  # or UIStyle.ANIMATED
    api_key="your-api-key"
)

# Use configuration
result = run_agent("Your goal here", config=config)
```

### Environment Variables

Configure TAgent using environment variables:

```bash
export TAGENT_MODEL="gpt-4o-mini"
export TAGENT_MAX_ITERATIONS=20
export TAGENT_VERBOSE=true
export TAGENT_UI_STYLE=institutional  # or animated
export TAGENT_API_KEY="your-api-key"
```

### UI Styles

TAgent supports two UI styles:

#### Animated UI (Matrix-style)
- Retro terminal effects with typing animations
- Blinking cursor and thinking animations
- Colorful output perfect for demonstrations

#### Institutional UI (Server-focused)
- Clean, structured logging: `timestamp [LEVEL] COMPONENT: message`
- No animations, optimized for server environments
- Perfect for production and log analysis

```python
# Set UI style programmatically
from tagent.ui import set_ui_style
from tagent.ui.factory import UIStyle

set_ui_style(UIStyle.INSTITUTIONAL)
```

### CLI Tool Configuration

TAgent provides a CLI for running agents with dynamic tool discovery:

```bash
# Run without tools (uses LLM knowledge only)
python -m tagent "What is 2+2?" --model gpt-4o-mini

# Run with tools from specific directory
python -m tagent "Analyze recent articles" --search-dir ./examples/tab_news_analyzer

# Run with specific tool files
python -m tagent "Plan a trip" --tools ./travel/tagent.tools.py --tools ./weather/tagent.tools.py
```

### Tool Discovery Options

The CLI supports several ways to configure tool loading:

- **`--tools`** - Specify exact paths to `tagent.tools.py` files
- **`--search-dir`** - Search directories for tool files (supports multiple directories)
- **`--recursive`** - Search directories recursively (default: True)
- **`--no-recursive`** - Disable recursive search
- **`--output`** - Specify path to `tagent.output.py` for structured outputs

### Default Behavior

**Important**: When no tool configuration is provided, TAgent runs **without tools** and uses LLM knowledge only. This prevents unwanted recursive searches in your entire file system.

```bash
# These run without tools:
python -m tagent "Simple question"
python -m tagent "Calculate something" --model gpt-4o-mini

# These search for tools:
python -m tagent "Complex task" --search-dir .
python -m tagent "Use specific tool" --tools ./my_tools/tagent.tools.py
```

### Tool File Structure

Tools must be in files named `tagent.tools.py` with this signature:

```python
def my_tool(state: Dict[str, Any], args: Dict[str, Any]) -> Optional[Tuple[str, Any]]:
    """
    Tool description here.
    
    Args:
        state: Current agent state
        args: Tool arguments from LLM
        
    Returns:
        Tuple of (key, value) for state update
    """
    # Your tool logic here
    return ("result_key", result_value)
```

### Examples

```bash
# Run with tools from current directory (recursive search)
python -m tagent "Analyze data" --search-dir . --recursive

# Run with tools from specific directories only
python -m tagent "Multi-step task" --search-dir ./tools --search-dir ./integrations

# Run with exact tool files and custom output format
python -m tagent "Generate report" --tools ./reporting/tagent.tools.py --output ./reporting/tagent.output.py

# Run without any tools (LLM knowledge only)
python -m tagent "Simple calculation" --model gpt-4o-mini
```

## 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.

## State Machine Architecture (v0.5.0)

TAgent v0.5.0 implements a sophisticated state machine that ensures predictable execution flow and prevents infinite loops. The architecture follows strict transition rules while giving the AI strategic decision points.

### Complete State Flow Diagram

```
                    🚀 INITIAL
                        │
                        │ (automatic)
                        ▼
                       PLAN ◄──────────────────────┐
                        │                          │
                        │ (automatic)              │
                        ▼                          │
                       EXECUTE                     │
                        │                          │
                        │ (AI chooses)             │
                        ├─────────────┐            │
                        │             │            │
                        ▼             ▼            │
                       EXECUTE        SUMMARIZE    │
                       (loop)         │            │
                                      │(automatic) │
                                      ▼            │
                                   EVALUATE        │
                                      │            │
                                      │(automatic) │
                                      └────────────┘
```

### State Transition Rules

#### Mandatory Transitions (Automatic)
These transitions happen automatically without AI choice:

- **INITIAL → PLAN**: Agent must start by creating a plan
- **PLAN → EXECUTE**: Plans must be executed
- **SUMMARIZE → EVALUATE**: Summaries trigger evaluation
- **EVALUATE → PLAN**: Evaluations trigger re-planning

#### AI Decision Points
The AI can choose between multiple options at these states:

- **EXECUTE**: Can choose to:
  - Continue with another **EXECUTE** action (tool usage, data processing)
  - Move to **SUMMARIZE** when ready to conclude

### Execution Flow Examples

#### Simple Task Flow
```
INITIAL → PLAN → EXECUTE → SUMMARIZE → EVALUATE → PLAN (goal achieved)
```

#### Complex Multi-Step Task
```
INITIAL → PLAN → EXECUTE → EXECUTE → EXECUTE → SUMMARIZE → EVALUATE → PLAN → EXECUTE → SUMMARIZE → EVALUATE (complete)
```

#### Failed Execution Recovery
```
INITIAL → PLAN → EXECUTE (fails) → EXECUTE (retry) → SUMMARIZE → EVALUATE (needs replanning) → PLAN → EXECUTE → SUMMARIZE → EVALUATE (success)
```

### State Descriptions

#### 🚀 INITIAL
- **Purpose**: Entry point for the agent
- **Behavior**: Automatically transitions to PLAN
- **Duration**: Instantaneous

#### 📋 PLAN
- **Purpose**: Create strategic plan based on goal and current state
- **Behavior**: Automatically transitions to EXECUTE
- **LLM Task**: Generate actionable steps and identify required tools
- **Output**: Structured plan with next actions

#### ⚡ EXECUTE
- **Purpose**: Perform actions, use tools, process data
- **Behavior**: AI chooses next state (EXECUTE again or SUMMARIZE)
- **LLM Task**: Execute tools, process information, make progress
- **Decision Logic**:
  - Choose **EXECUTE** if more work needed
  - Choose **SUMMARIZE** if ready to conclude

#### 📊 SUMMARIZE
- **Purpose**: Consolidate results and prepare evaluation
- **Behavior**: Automatically transitions to EVALUATE
- **LLM Task**: Synthesize all work done and results achieved
- **Output**: Comprehensive summary of progress

#### 🔍 EVALUATE
- **Purpose**: Assess if goal is achieved and determine next steps
- **Behavior**: Automatically transitions to PLAN
- **LLM Task**: Determine if goal is met or what needs to be done next
- **Decision Logic**:
  - If goal achieved: Mark as complete
  - If more work needed: Continue with new planning cycle

### Loop Prevention Mechanisms

The state machine implements several mechanisms to prevent infinite loops:

#### 1. **Max Iterations Control**
```python
config = TAgentConfig(max_iterations=10)  # Limits total EXECUTE actions
```

#### 2. **State Transition Validation**
- Prevents invalid transitions (e.g., SUMMARIZE → SUMMARIZE)
- Enforces mandatory paths
- Validates state consistency

#### 3. **Progress Tracking**
- Monitors if agent is making meaningful progress
- Detects repetitive behaviors
- Triggers intervention when stuck

#### 4. **Strategic Choice Points**
- AI only has decision power at specific moments
- Reduces unpredictable behavior
- Maintains deterministic flow

### Implementation Benefits

#### 🎯 **Predictable Execution**
- Every agent run follows the same pattern
- Debugging is straightforward
- Behavior is reproducible

#### 🚫 **Loop Prevention**
- Impossible to get stuck in SUMMARIZE loops
- EVALUATE always returns to productive work
- Maximum iteration limits prevent runaway execution

#### 🔄 **Self-Correction**
- Failed executions trigger re-planning
- Agent can adapt strategy based on results
- Built-in recovery mechanisms

#### 📊 **Progress Visibility**
- Clear state indicators show agent progress
- Easy to understand where agent is in the process
- Helpful for debugging and monitoring

### Advanced State Management

#### State Persistence
```python
# State is maintained throughout execution
state = {
    "goal": "Original user goal",
    "current_state": "EXECUTE",
    "iteration": 3,
    "tools_used": ["search", "translate"],
    "results": {...}
}
```

#### State Validation
```python
# Each transition is validated
def validate_transition(current_state: str, next_state: str) -> bool:
    valid_transitions = {
        "INITIAL": ["PLAN"],
        "PLAN": ["EXECUTE"],
        "EXECUTE": ["EXECUTE", "SUMMARIZE"],
        "SUMMARIZE": ["EVALUATE"],
        "EVALUATE": ["PLAN"]
    }
    return next_state in valid_transitions.get(current_state, [])
```

This architecture ensures TAgent remains controllable and predictable while still allowing the AI to make intelligent decisions about execution flow.

### Structured Outputs Over Function Calling
No function calling dependency. The LLM returns structured JSON validated with Pydantic:

```json
{
  "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.

```python
# Tool not found? No problem!
# Agent automatically uses LLM knowledge instead
```

## Real-World Example

Here's an agent that extracts and translates TabNews articles:

```python
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 with configuration
config = TAgentConfig(
    model="gpt-4o-mini",
    max_iterations=15,
    tools={
        "extract_tabnews_articles": extract_tabnews_articles,
        "load_url_content": load_url_content,
        "translate": translate
    },
    verbose=True
)

result = run_agent(
    goal="Get 1 TabNews article, load content, summarize and translate to Chinese",
    config=config
)
```

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).

## UI Styles in Action

### Animated UI (Matrix-style)
Perfect for demonstrations and interactive use:

```
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓                 T-AGENT v0.5.0 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                     ★ 
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
```

### Institutional UI (Server-focused)
Clean, structured logging for production environments:

```
2025-07-14 12:34:56 [INFO ] SYSTEM: Banner: T-AGENT v0.5.0 STARTING
2025-07-14 12:34:56 [INFO ] AGENT: INIT: Goal: Translate hello world to Chinese
2025-07-14 12:34:57 [INFO ] PLANNER: Plan: Generate strategic plan for translation
2025-07-14 12:34:58 [INFO ] EXECUTE: Using LLM fallback for translation
2025-07-14 12:34:59 [INFO ] AGENT: SUCCESS: Translation completed!
```

Choose the style that fits your environment:

```python
from tagent.config import TAgentConfig
from tagent.ui.factory import UIStyle

# For development/demos
config = TAgentConfig(ui_style=UIStyle.ANIMATED)

# For production/servers
config = TAgentConfig(ui_style=UIStyle.INSTITUTIONAL)
```

## 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
```python
from tagent.config import TAgentConfig
from tagent.model_config import AgentModelConfig

# Advanced model configuration with step-specific models
model_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"
)

config = TAgentConfig(
    model=model_config,  # Pass advanced model config
    max_iterations=20,
    verbose=True,
    ui_style=UIStyle.INSTITUTIONAL
)

result = run_agent(
    goal="Complex multi-step task",
    config=config
)
```

### Configuration File Support
```python
from tagent.config import load_config

# Load from JSON file
config = load_config("config.json")

# Load from YAML file (requires PyYAML)
config = load_config("config.yaml")

# Load with environment override
config = load_config("config.json", env_override=True)
```

### Configuration Merging
```python
from tagent.config import TAgentConfig

# Base configuration
base_config = TAgentConfig(
    model="gpt-4o-mini",
    max_iterations=10
)

# Override specific settings
prod_config = TAgentConfig(
    ui_style=UIStyle.INSTITUTIONAL,
    verbose=False
)

# Merge configurations
final_config = base_config.merge(prod_config)
```

### Environment Variables
```bash
export TAGENT_MODEL="gpt-4o-mini"
export TAGENT_PLANNER_MODEL="gpt-4o"
export TAGENT_MAX_ITERATIONS=20
export TAGENT_VERBOSE=true
export TAGENT_UI_STYLE=institutional
export TAGENT_API_KEY="your-key"
```

## Try It Yourself

```bash
# Clone the repository
git clone https://github.com/yourusername/tagent2
cd tagent2

# Install in development mode
pip install -e .

# Try without tools (uses LLM knowledge only)
python -m tagent "What is the capital of France?" --model gpt-4o-mini

# Try with tools from an example
python -m tagent "Get recent TabNews articles" --search-dir ./examples/tab_news_analyzer

# Run the TabNews example programmatically
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 articles
- **`travel_planning/`** - Multi-step travel planning agent
- **`simple_qa/`** - Direct question answering without tools

Each example shows different patterns and use cases.

## What's New in v0.5.0

### Configuration System
- ✅ Centralized configuration via `TAgentConfig`
- ✅ Environment variable support
- ✅ Configuration file support (JSON/YAML)
- ✅ Configuration merging and inheritance

### UI System Redesign
- ✅ Modular UI architecture with strategy pattern
- ✅ **Animated UI**: Matrix-style terminal effects
- ✅ **Institutional UI**: Clean structured logging
- ✅ Runtime UI style switching

### Developer Experience
- ✅ Better error handling and diagnostics
- ✅ Improved debugging capabilities
- ✅ Type-safe configuration system
- ✅ Comprehensive documentation

## 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

1. Fork the repository
2. Create a feature branch: `git checkout -b feature/amazing-feature`
3. Make your changes
4. Add tests if applicable
5. Commit: `git commit -m "Add amazing feature"`
6. Push: `git push origin feature/amazing-feature`
7. Open a Pull Request

## License

MIT License - see [LICENSE](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.5.0

*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.*

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "tagent",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "TAgent Development Team <tagent@example.com>",
    "keywords": "ai, agent, llm, automation, framework",
    "author": null,
    "author_email": "TAgent Development Team <tagent@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/0d/58/df71e8a196d176207942c52751bef9d2cd8f380c7735b11287ac10fbf233/tagent-0.5.5.tar.gz",
    "platform": null,
    "description": "# TAgent - When You're Tired of Unnecessarily Complex Agent Frameworks\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Version](https://img.shields.io/badge/version-0.5.0-green.svg)](https://github.com/yourusername/tagent2)\n\n> **A minimalist, Redux-inspired framework for AI agents that actually makes sense**\n\nFed 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.\n\n![gif](https://vhs.charm.sh/vhs-dujKmiVTP09yg9gOXAbs5.gif)\n\n## Why TAgent?\n\nTAgent follows a simple philosophy: **state-controlled execution with LLM fallbacks**. Instead of complex function calling or massive dependency trees, you get:\n\n- **Redux-inspired Architecture**: Predictable state management with centralized store\n- **State Machine Control**: Prevents infinite loops and unpredictable behavior  \n- **Structured Outputs**: Works with any LLM via JSON, not function calling\n- **Intelligent Fallbacks**: When tools don't exist, uses LLM knowledge directly\n- **Zero Boilerplate**: Get started with 3 lines of code\n\n## Quick Start\n\n```bash\npip install -e .\n```\n\n```python\nfrom tagent import run_agent\nfrom tagent.config import TAgentConfig\n\n# Simple usage with configuration\nconfig = TAgentConfig(\n    model=\"gpt-4o-mini\",\n    max_iterations=3,\n    verbose=True\n)\n\nresult = run_agent(\n    goal=\"Translate 'Hello world' to Chinese\",\n    config=config\n)\n\nprint(result.get(\"raw_data\", {}).get(\"llm_direct_response\"))\n# Output: \u4f60\u597d\u4e16\u754c\n```\n\n## Configuration System\n\nTAgent v0.5.0 introduces a comprehensive configuration system that centralizes all agent settings. You can configure UI style, model settings, execution parameters, and more.\n\n### Basic Configuration\n\n```python\nfrom tagent import run_agent\nfrom tagent.config import TAgentConfig\nfrom tagent.ui.factory import UIStyle\n\n# Create configuration\nconfig = TAgentConfig(\n    model=\"gpt-4o-mini\",\n    max_iterations=10,\n    verbose=True,\n    ui_style=UIStyle.INSTITUTIONAL,  # or UIStyle.ANIMATED\n    api_key=\"your-api-key\"\n)\n\n# Use configuration\nresult = run_agent(\"Your goal here\", config=config)\n```\n\n### Environment Variables\n\nConfigure TAgent using environment variables:\n\n```bash\nexport TAGENT_MODEL=\"gpt-4o-mini\"\nexport TAGENT_MAX_ITERATIONS=20\nexport TAGENT_VERBOSE=true\nexport TAGENT_UI_STYLE=institutional  # or animated\nexport TAGENT_API_KEY=\"your-api-key\"\n```\n\n### UI Styles\n\nTAgent supports two UI styles:\n\n#### Animated UI (Matrix-style)\n- Retro terminal effects with typing animations\n- Blinking cursor and thinking animations\n- Colorful output perfect for demonstrations\n\n#### Institutional UI (Server-focused)\n- Clean, structured logging: `timestamp [LEVEL] COMPONENT: message`\n- No animations, optimized for server environments\n- Perfect for production and log analysis\n\n```python\n# Set UI style programmatically\nfrom tagent.ui import set_ui_style\nfrom tagent.ui.factory import UIStyle\n\nset_ui_style(UIStyle.INSTITUTIONAL)\n```\n\n### CLI Tool Configuration\n\nTAgent provides a CLI for running agents with dynamic tool discovery:\n\n```bash\n# Run without tools (uses LLM knowledge only)\npython -m tagent \"What is 2+2?\" --model gpt-4o-mini\n\n# Run with tools from specific directory\npython -m tagent \"Analyze recent articles\" --search-dir ./examples/tab_news_analyzer\n\n# Run with specific tool files\npython -m tagent \"Plan a trip\" --tools ./travel/tagent.tools.py --tools ./weather/tagent.tools.py\n```\n\n### Tool Discovery Options\n\nThe CLI supports several ways to configure tool loading:\n\n- **`--tools`** - Specify exact paths to `tagent.tools.py` files\n- **`--search-dir`** - Search directories for tool files (supports multiple directories)\n- **`--recursive`** - Search directories recursively (default: True)\n- **`--no-recursive`** - Disable recursive search\n- **`--output`** - Specify path to `tagent.output.py` for structured outputs\n\n### Default Behavior\n\n**Important**: When no tool configuration is provided, TAgent runs **without tools** and uses LLM knowledge only. This prevents unwanted recursive searches in your entire file system.\n\n```bash\n# These run without tools:\npython -m tagent \"Simple question\"\npython -m tagent \"Calculate something\" --model gpt-4o-mini\n\n# These search for tools:\npython -m tagent \"Complex task\" --search-dir .\npython -m tagent \"Use specific tool\" --tools ./my_tools/tagent.tools.py\n```\n\n### Tool File Structure\n\nTools must be in files named `tagent.tools.py` with this signature:\n\n```python\ndef my_tool(state: Dict[str, Any], args: Dict[str, Any]) -> Optional[Tuple[str, Any]]:\n    \"\"\"\n    Tool description here.\n    \n    Args:\n        state: Current agent state\n        args: Tool arguments from LLM\n        \n    Returns:\n        Tuple of (key, value) for state update\n    \"\"\"\n    # Your tool logic here\n    return (\"result_key\", result_value)\n```\n\n### Examples\n\n```bash\n# Run with tools from current directory (recursive search)\npython -m tagent \"Analyze data\" --search-dir . --recursive\n\n# Run with tools from specific directories only\npython -m tagent \"Multi-step task\" --search-dir ./tools --search-dir ./integrations\n\n# Run with exact tool files and custom output format\npython -m tagent \"Generate report\" --tools ./reporting/tagent.tools.py --output ./reporting/tagent.output.py\n\n# Run without any tools (LLM knowledge only)\npython -m tagent \"Simple calculation\" --model gpt-4o-mini\n```\n\n## How It Works Under the Hood\n\n### Deterministic State Machine\nInstead of letting the LLM do whatever it wants, the agent follows a controlled flow:\n\n```\nINITIAL \u2192 PLAN \u2192 EXECUTE \u2192 EVALUATE \u2192 (loop until goal achieved)\n```\n\nEach transition is validated, preventing infinite loops and unpredictable behaviors.\n\n## State Machine Architecture (v0.5.0)\n\nTAgent v0.5.0 implements a sophisticated state machine that ensures predictable execution flow and prevents infinite loops. The architecture follows strict transition rules while giving the AI strategic decision points.\n\n### Complete State Flow Diagram\n\n```\n                    \ud83d\ude80 INITIAL\n                        \u2502\n                        \u2502 (automatic)\n                        \u25bc\n                       PLAN \u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                        \u2502                          \u2502\n                        \u2502 (automatic)              \u2502\n                        \u25bc                          \u2502\n                       EXECUTE                     \u2502\n                        \u2502                          \u2502\n                        \u2502 (AI chooses)             \u2502\n                        \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u2502\n                        \u2502             \u2502            \u2502\n                        \u25bc             \u25bc            \u2502\n                       EXECUTE        SUMMARIZE    \u2502\n                       (loop)         \u2502            \u2502\n                                      \u2502(automatic) \u2502\n                                      \u25bc            \u2502\n                                   EVALUATE        \u2502\n                                      \u2502            \u2502\n                                      \u2502(automatic) \u2502\n                                      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n### State Transition Rules\n\n#### Mandatory Transitions (Automatic)\nThese transitions happen automatically without AI choice:\n\n- **INITIAL \u2192 PLAN**: Agent must start by creating a plan\n- **PLAN \u2192 EXECUTE**: Plans must be executed\n- **SUMMARIZE \u2192 EVALUATE**: Summaries trigger evaluation\n- **EVALUATE \u2192 PLAN**: Evaluations trigger re-planning\n\n#### AI Decision Points\nThe AI can choose between multiple options at these states:\n\n- **EXECUTE**: Can choose to:\n  - Continue with another **EXECUTE** action (tool usage, data processing)\n  - Move to **SUMMARIZE** when ready to conclude\n\n### Execution Flow Examples\n\n#### Simple Task Flow\n```\nINITIAL \u2192 PLAN \u2192 EXECUTE \u2192 SUMMARIZE \u2192 EVALUATE \u2192 PLAN (goal achieved)\n```\n\n#### Complex Multi-Step Task\n```\nINITIAL \u2192 PLAN \u2192 EXECUTE \u2192 EXECUTE \u2192 EXECUTE \u2192 SUMMARIZE \u2192 EVALUATE \u2192 PLAN \u2192 EXECUTE \u2192 SUMMARIZE \u2192 EVALUATE (complete)\n```\n\n#### Failed Execution Recovery\n```\nINITIAL \u2192 PLAN \u2192 EXECUTE (fails) \u2192 EXECUTE (retry) \u2192 SUMMARIZE \u2192 EVALUATE (needs replanning) \u2192 PLAN \u2192 EXECUTE \u2192 SUMMARIZE \u2192 EVALUATE (success)\n```\n\n### State Descriptions\n\n#### \ud83d\ude80 INITIAL\n- **Purpose**: Entry point for the agent\n- **Behavior**: Automatically transitions to PLAN\n- **Duration**: Instantaneous\n\n#### \ud83d\udccb PLAN\n- **Purpose**: Create strategic plan based on goal and current state\n- **Behavior**: Automatically transitions to EXECUTE\n- **LLM Task**: Generate actionable steps and identify required tools\n- **Output**: Structured plan with next actions\n\n#### \u26a1 EXECUTE\n- **Purpose**: Perform actions, use tools, process data\n- **Behavior**: AI chooses next state (EXECUTE again or SUMMARIZE)\n- **LLM Task**: Execute tools, process information, make progress\n- **Decision Logic**:\n  - Choose **EXECUTE** if more work needed\n  - Choose **SUMMARIZE** if ready to conclude\n\n#### \ud83d\udcca SUMMARIZE\n- **Purpose**: Consolidate results and prepare evaluation\n- **Behavior**: Automatically transitions to EVALUATE\n- **LLM Task**: Synthesize all work done and results achieved\n- **Output**: Comprehensive summary of progress\n\n#### \ud83d\udd0d EVALUATE\n- **Purpose**: Assess if goal is achieved and determine next steps\n- **Behavior**: Automatically transitions to PLAN\n- **LLM Task**: Determine if goal is met or what needs to be done next\n- **Decision Logic**:\n  - If goal achieved: Mark as complete\n  - If more work needed: Continue with new planning cycle\n\n### Loop Prevention Mechanisms\n\nThe state machine implements several mechanisms to prevent infinite loops:\n\n#### 1. **Max Iterations Control**\n```python\nconfig = TAgentConfig(max_iterations=10)  # Limits total EXECUTE actions\n```\n\n#### 2. **State Transition Validation**\n- Prevents invalid transitions (e.g., SUMMARIZE \u2192 SUMMARIZE)\n- Enforces mandatory paths\n- Validates state consistency\n\n#### 3. **Progress Tracking**\n- Monitors if agent is making meaningful progress\n- Detects repetitive behaviors\n- Triggers intervention when stuck\n\n#### 4. **Strategic Choice Points**\n- AI only has decision power at specific moments\n- Reduces unpredictable behavior\n- Maintains deterministic flow\n\n### Implementation Benefits\n\n#### \ud83c\udfaf **Predictable Execution**\n- Every agent run follows the same pattern\n- Debugging is straightforward\n- Behavior is reproducible\n\n#### \ud83d\udeab **Loop Prevention**\n- Impossible to get stuck in SUMMARIZE loops\n- EVALUATE always returns to productive work\n- Maximum iteration limits prevent runaway execution\n\n#### \ud83d\udd04 **Self-Correction**\n- Failed executions trigger re-planning\n- Agent can adapt strategy based on results\n- Built-in recovery mechanisms\n\n#### \ud83d\udcca **Progress Visibility**\n- Clear state indicators show agent progress\n- Easy to understand where agent is in the process\n- Helpful for debugging and monitoring\n\n### Advanced State Management\n\n#### State Persistence\n```python\n# State is maintained throughout execution\nstate = {\n    \"goal\": \"Original user goal\",\n    \"current_state\": \"EXECUTE\",\n    \"iteration\": 3,\n    \"tools_used\": [\"search\", \"translate\"],\n    \"results\": {...}\n}\n```\n\n#### State Validation\n```python\n# Each transition is validated\ndef validate_transition(current_state: str, next_state: str) -> bool:\n    valid_transitions = {\n        \"INITIAL\": [\"PLAN\"],\n        \"PLAN\": [\"EXECUTE\"],\n        \"EXECUTE\": [\"EXECUTE\", \"SUMMARIZE\"],\n        \"SUMMARIZE\": [\"EVALUATE\"],\n        \"EVALUATE\": [\"PLAN\"]\n    }\n    return next_state in valid_transitions.get(current_state, [])\n```\n\nThis architecture ensures TAgent remains controllable and predictable while still allowing the AI to make intelligent decisions about execution flow.\n\n### Structured Outputs Over Function Calling\nNo function calling dependency. The LLM returns structured JSON validated with Pydantic:\n\n```json\n{\n  \"action\": \"execute\",\n  \"params\": {\"tool\": \"search\", \"args\": {\"query\": \"python\"}},\n  \"reasoning\": \"Need to search for Python information\"\n}\n```\n\n### Intelligent Fallback System\nIf a tool doesn't exist, the agent uses the LLM's own knowledge as fallback. No crashes, no errors - it just works.\n\n```python\n# Tool not found? No problem!\n# Agent automatically uses LLM knowledge instead\n```\n\n## Real-World Example\n\nHere's an agent that extracts and translates TabNews articles:\n\n```python\ndef extract_tabnews_articles(state, args):\n    \"\"\"Extract recent articles from TabNews RSS\"\"\"\n    response = requests.get(\"https://www.tabnews.com.br/recentes/rss\")\n    root = ET.fromstring(response.content)\n    \n    articles = []\n    for item in root.findall('.//item'):\n        articles.append({\n            \"url\": item.find('link').text,\n            \"title\": item.find('title').text,\n            \"publication_date\": item.find('pubDate').text\n        })\n    \n    return (\"articles\", articles)\n\ndef translate(state, args):\n    \"\"\"Translate text using direct LLM call\"\"\"\n    text = args.get(\"text\", \"\")\n    target = args.get(\"target_language\", \"\")\n    \n    response = litellm.completion(\n        model=\"gpt-4o-mini\",\n        messages=[\n            {\"role\": \"system\", \"content\": \"You are a professional translator.\"},\n            {\"role\": \"user\", \"content\": f\"Translate to {target}: {text}\"}\n        ]\n    )\n    \n    return (\"translation\", {\"translation\": response.choices[0].message.content})\n\n# Run the agent with configuration\nconfig = TAgentConfig(\n    model=\"gpt-4o-mini\",\n    max_iterations=15,\n    tools={\n        \"extract_tabnews_articles\": extract_tabnews_articles,\n        \"load_url_content\": load_url_content,\n        \"translate\": translate\n    },\n    verbose=True\n)\n\nresult = run_agent(\n    goal=\"Get 1 TabNews article, load content, summarize and translate to Chinese\",\n    config=config\n)\n```\n\nThe agent plans, executes tools in the correct order, and delivers structured results.\n\n## Tool Ecosystem & Extensibility\n\nCurrently no default tools (keeping it minimal), but adapters are being developed for:\n- **CrewAI** tools\n- **LangChain** tools  \n- **Model Context Protocol (MCP)** tools\n\nThe idea is to leverage existing ecosystems without being locked into them.\n\n## Why Redux for Agents?\n\n- **Predictable State**: Always know what's happening\n- **Debug Friendly**: Every step is logged and inspectable\n- **Composition**: Tools are pure functions, easy to test\n- **Extensible**: Adding new actions is trivial\n- **Time Travel**: Replay actions for debugging\n\n## Performance & Model Support\n\nWorks with any model via LiteLLM:\n- OpenAI (GPT-4, GPT-3.5)\n- Anthropic (Claude)\n- Ollama (local models)\n- OpenRouter\n- Google Gemini\n- Azure OpenAI\n- And 100+ more...\n\nEach action type can use a different model (planning with GPT-4, execution with cheaper model).\n\n## UI Styles in Action\n\n### Animated UI (Matrix-style)\nPerfect for demonstrations and interactive use:\n\n```\n\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\n\u2593                 T-AGENT v0.5.0 STARTING                  \u2593 \n\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\n[-] [12:34:56] INIT: Goal: Translate hello world to Chinese\n[#] [12:34:57] PLAN: Generating strategic plan...\n[>] [12:34:58] EXECUTE: Using LLM fallback for translation\n[+] [12:34:59] SUCCESS: Translation completed!\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\n\u2605                     MISSION COMPLETE                     \u2605 \n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\n```\n\n### Institutional UI (Server-focused)\nClean, structured logging for production environments:\n\n```\n2025-07-14 12:34:56 [INFO ] SYSTEM: Banner: T-AGENT v0.5.0 STARTING\n2025-07-14 12:34:56 [INFO ] AGENT: INIT: Goal: Translate hello world to Chinese\n2025-07-14 12:34:57 [INFO ] PLANNER: Plan: Generate strategic plan for translation\n2025-07-14 12:34:58 [INFO ] EXECUTE: Using LLM fallback for translation\n2025-07-14 12:34:59 [INFO ] AGENT: SUCCESS: Translation completed!\n```\n\nChoose the style that fits your environment:\n\n```python\nfrom tagent.config import TAgentConfig\nfrom tagent.ui.factory import UIStyle\n\n# For development/demos\nconfig = TAgentConfig(ui_style=UIStyle.ANIMATED)\n\n# For production/servers\nconfig = TAgentConfig(ui_style=UIStyle.INSTITUTIONAL)\n```\n\n## Architecture Overview\n\n```\nTAgent Framework\n\u251c\u2500\u2500 \ud83c\udfaf State Machine Controller\n\u2502   \u251c\u2500\u2500 Deterministic action flow\n\u2502   \u251c\u2500\u2500 Loop prevention\n\u2502   \u2514\u2500\u2500 Transition validation\n\u251c\u2500\u2500 \ud83e\udd16 Agent Core\n\u2502   \u251c\u2500\u2500 Redux-inspired store\n\u2502   \u251c\u2500\u2500 LLM decision making\n\u2502   \u251c\u2500\u2500 Tool execution\n\u2502   \u2514\u2500\u2500 Intelligent fallbacks\n\u251c\u2500\u2500 \ud83d\udee0\ufe0f Tool System\n\u2502   \u251c\u2500\u2500 Pure function interface\n\u2502   \u251c\u2500\u2500 Dynamic discovery\n\u2502   \u2514\u2500\u2500 Type-safe signatures\n\u2514\u2500\u2500 \ud83d\udcca Structured Outputs\n    \u251c\u2500\u2500 Pydantic validation\n    \u251c\u2500\u2500 JSON schema enforcement\n    \u2514\u2500\u2500 Type-safe results\n```\n\n## Advanced Configuration\n\n### Model Configuration\n```python\nfrom tagent.config import TAgentConfig\nfrom tagent.model_config import AgentModelConfig\n\n# Advanced model configuration with step-specific models\nmodel_config = AgentModelConfig(\n    tagent_model=\"gpt-4o\",  # Global fallback\n    tagent_planner_model=\"gpt-4o-mini\",  # Planning tasks\n    tagent_executor_model=\"gpt-3.5-turbo\",  # Tool execution\n    api_key=\"your-api-key\"\n)\n\nconfig = TAgentConfig(\n    model=model_config,  # Pass advanced model config\n    max_iterations=20,\n    verbose=True,\n    ui_style=UIStyle.INSTITUTIONAL\n)\n\nresult = run_agent(\n    goal=\"Complex multi-step task\",\n    config=config\n)\n```\n\n### Configuration File Support\n```python\nfrom tagent.config import load_config\n\n# Load from JSON file\nconfig = load_config(\"config.json\")\n\n# Load from YAML file (requires PyYAML)\nconfig = load_config(\"config.yaml\")\n\n# Load with environment override\nconfig = load_config(\"config.json\", env_override=True)\n```\n\n### Configuration Merging\n```python\nfrom tagent.config import TAgentConfig\n\n# Base configuration\nbase_config = TAgentConfig(\n    model=\"gpt-4o-mini\",\n    max_iterations=10\n)\n\n# Override specific settings\nprod_config = TAgentConfig(\n    ui_style=UIStyle.INSTITUTIONAL,\n    verbose=False\n)\n\n# Merge configurations\nfinal_config = base_config.merge(prod_config)\n```\n\n### Environment Variables\n```bash\nexport TAGENT_MODEL=\"gpt-4o-mini\"\nexport TAGENT_PLANNER_MODEL=\"gpt-4o\"\nexport TAGENT_MAX_ITERATIONS=20\nexport TAGENT_VERBOSE=true\nexport TAGENT_UI_STYLE=institutional\nexport TAGENT_API_KEY=\"your-key\"\n```\n\n## Try It Yourself\n\n```bash\n# Clone the repository\ngit clone https://github.com/yourusername/tagent2\ncd tagent2\n\n# Install in development mode\npip install -e .\n\n# Try without tools (uses LLM knowledge only)\npython -m tagent \"What is the capital of France?\" --model gpt-4o-mini\n\n# Try with tools from an example\npython -m tagent \"Get recent TabNews articles\" --search-dir ./examples/tab_news_analyzer\n\n# Run the TabNews example programmatically\npython examples/tab_news_analyzer/tabnews_code_example.py\n```\n\n## Examples Directory\n\nCheck out the `/examples` folder for real implementations:\n\n- **`tab_news_analyzer/`** - Extract and translate TabNews articles\n- **`travel_planning/`** - Multi-step travel planning agent\n- **`simple_qa/`** - Direct question answering without tools\n\nEach example shows different patterns and use cases.\n\n## What's New in v0.5.0\n\n### Configuration System\n- \u2705 Centralized configuration via `TAgentConfig`\n- \u2705 Environment variable support\n- \u2705 Configuration file support (JSON/YAML)\n- \u2705 Configuration merging and inheritance\n\n### UI System Redesign\n- \u2705 Modular UI architecture with strategy pattern\n- \u2705 **Animated UI**: Matrix-style terminal effects\n- \u2705 **Institutional UI**: Clean structured logging\n- \u2705 Runtime UI style switching\n\n### Developer Experience\n- \u2705 Better error handling and diagnostics\n- \u2705 Improved debugging capabilities\n- \u2705 Type-safe configuration system\n- \u2705 Comprehensive documentation\n\n## Roadmap\n\n- [ ] CrewAI/LangChain/MCP tool adapters\n- [ ] Persistent memory system\n- [ ] Default tool library (web search, file ops)\n- [ ] Optional web interface\n- [ ] Multi-agent orchestration\n- [ ] Tool marketplace/registry\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/amazing-feature`\n3. Make your changes\n4. Add tests if applicable\n5. Commit: `git commit -m \"Add amazing feature\"`\n6. Push: `git push origin feature/amazing-feature`\n7. Open a Pull Request\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Conclusion\n\nTAgent 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.\n\nThe framework is small (<2000 lines), focused, and each component has a clear responsibility. Sometimes simple is better.\n\n---\n\n**Repository:** https://github.com/yourusername/tagent2  \n**License:** MIT  \n**Version:** 0.5.0\n\n*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.*\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "TAgent - Modular AI Agent Framework with Dynamic Tool Discovery",
    "version": "0.5.5",
    "project_urls": {
        "Bug Tracker": "https://github.com/yourusername/tagent2/issues",
        "Documentation": "https://github.com/yourusername/tagent2",
        "Homepage": "https://github.com/yourusername/tagent2",
        "Repository": "https://github.com/yourusername/tagent2.git"
    },
    "split_keywords": [
        "ai",
        " agent",
        " llm",
        " automation",
        " framework"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bea275e5134065070cc4a4ff7773ef79450c63b2ca785f507fb849ae0b69619f",
                "md5": "dc210e5b5c257b867acfbed24b396914",
                "sha256": "148c0b5eef3d3672e3fe6acaa587845ea94bd41b80c2dc218deab5b8da7cd74a"
            },
            "downloads": -1,
            "filename": "tagent-0.5.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "dc210e5b5c257b867acfbed24b396914",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 69271,
            "upload_time": "2025-07-15T00:22:24",
            "upload_time_iso_8601": "2025-07-15T00:22:24.464646Z",
            "url": "https://files.pythonhosted.org/packages/be/a2/75e5134065070cc4a4ff7773ef79450c63b2ca785f507fb849ae0b69619f/tagent-0.5.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0d58df71e8a196d176207942c52751bef9d2cd8f380c7735b11287ac10fbf233",
                "md5": "dbaec8be4895a7c94ca1597a6d826693",
                "sha256": "5fdd2f7b970e83df07a6908c61da98099db31853a9d17becb35d192526eb6e43"
            },
            "downloads": -1,
            "filename": "tagent-0.5.5.tar.gz",
            "has_sig": false,
            "md5_digest": "dbaec8be4895a7c94ca1597a6d826693",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 2576675,
            "upload_time": "2025-07-15T00:22:26",
            "upload_time_iso_8601": "2025-07-15T00:22:26.390368Z",
            "url": "https://files.pythonhosted.org/packages/0d/58/df71e8a196d176207942c52751bef9d2cd8f380c7735b11287ac10fbf233/tagent-0.5.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-15 00:22:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "tagent2",
    "github_not_found": true,
    "lcname": "tagent"
}
        
Elapsed time: 0.47891s