684 lines
21 KiB
Markdown
684 lines
21 KiB
Markdown
# Developer Guide
|
|
|
|
This guide covers everything you need to know to develop with the Aden Agent Framework.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Repository Overview](#repository-overview)
|
|
2. [Initial Setup](#initial-setup)
|
|
3. [Project Structure](#project-structure)
|
|
4. [Building Agents](#building-agents)
|
|
5. [Running Agents](#running-agents)
|
|
6. [Testing Agents](#testing-agents)
|
|
7. [Code Style & Conventions](#code-style--conventions)
|
|
8. [Git Workflow](#git-workflow)
|
|
9. [Common Tasks](#common-tasks)
|
|
10. [Troubleshooting](#troubleshooting)
|
|
|
|
---
|
|
|
|
## Repository Overview
|
|
|
|
Aden Agent Framework is a Python-based system for building goal-driven, self-improving AI agents.
|
|
|
|
| Package | Directory | Description | Tech Stack |
|
|
| ------------- | ---------- | ----------------------------------------- | ------------ |
|
|
| **framework** | `/core` | Core runtime, graph executor, protocols | Python 3.11+ |
|
|
| **tools** | `/tools` | MCP tools for agent capabilities | Python 3.11+ |
|
|
| **exports** | `/exports` | Agent packages (user-created, gitignored) | Python 3.11+ |
|
|
| **skills** | `.claude`, `.agents`, `.agent` | Shared skills for Claude/Codex/other coding agents | Markdown |
|
|
| **codex** | `.codex` | Codex CLI project configuration (MCP servers) | TOML |
|
|
|
|
### Key Principles
|
|
|
|
- **Goal-Driven Development**: Define objectives, framework generates agent graphs
|
|
- **Self-Improving**: Agents adapt and evolve based on failures
|
|
- **SDK-Wrapped Nodes**: Built-in memory, monitoring, and tool access
|
|
- **Human-in-the-Loop**: Intervention points for human oversight
|
|
- **Production-Ready**: Evaluation, testing, and deployment infrastructure
|
|
|
|
---
|
|
|
|
## Initial Setup
|
|
|
|
See [environment-setup.md](./environment-setup.md) for the full setup guide, including Windows, Alpine Linux, and troubleshooting.
|
|
|
|
### Quick Start
|
|
|
|
```bash
|
|
git clone https://github.com/adenhq/hive.git
|
|
cd hive
|
|
./quickstart.sh
|
|
```
|
|
|
|
### Verify Setup
|
|
|
|
```bash
|
|
uv run python -c "import framework; print('OK')"
|
|
uv run python -c "import aden_tools; print('OK')"
|
|
uv run python -c "import litellm; print('OK')"
|
|
```
|
|
|
|
---
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
hive/ # Repository root
|
|
│
|
|
├── .github/ # GitHub configuration
|
|
│ ├── workflows/
|
|
│ │ ├── ci.yml # Lint, test, validate on every PR
|
|
│ │ ├── release.yml # Runs on tags
|
|
│ │ ├── pr-requirements.yml # PR requirement checks
|
|
│ │ ├── pr-check-command.yml # PR check commands
|
|
│ │ ├── claude-issue-triage.yml # Automated issue triage
|
|
│ │ └── auto-close-duplicates.yml # Close duplicate issues
|
|
│ ├── ISSUE_TEMPLATE/ # Bug report & feature request templates
|
|
│ ├── PULL_REQUEST_TEMPLATE.md # PR description template
|
|
│ └── CODEOWNERS # Auto-assign reviewers
|
|
│
|
|
├── .codex/ # Codex CLI project config
|
|
│ └── config.toml # Codex MCP server definitions
|
|
│
|
|
├── core/ # CORE FRAMEWORK PACKAGE
|
|
│ ├── framework/ # Main package code
|
|
│ │ ├── agents/ # Agent definitions and helpers
|
|
│ │ ├── builder/ # Agent builder utilities
|
|
│ │ ├── credentials/ # Credential management
|
|
│ │ ├── debugger/ # Debugging tools
|
|
│ │ ├── graph/ # GraphExecutor - executes node graphs
|
|
│ │ ├── llm/ # LLM provider integrations (Anthropic, OpenAI, OpenRouter, Hive, etc.)
|
|
│ │ ├── mcp/ # MCP server integration
|
|
│ │ ├── monitoring/ # Runtime monitoring
|
|
│ │ ├── observability/ # Structured logging - human-readable and machine-parseable tracing
|
|
│ │ ├── runner/ # AgentRunner - loads and runs agents
|
|
│ │ ├── runtime/ # Runtime environment
|
|
│ │ ├── schemas/ # Data schemas
|
|
│ │ ├── server/ # HTTP API server
|
|
│ │ ├── skills/ # Skill definitions
|
|
│ │ ├── storage/ # File-based persistence
|
|
│ │ ├── testing/ # Testing utilities
|
|
│ │ ├── tools/ # Built-in tool implementations
|
|
│ │ ├── tui/ # Terminal UI dashboard
|
|
│ │ └── utils/ # Shared utilities
|
|
│ ├── tests/ # Unit and E2E tests (including dummy agents)
|
|
│ ├── pyproject.toml # Package metadata and dependencies
|
|
│ ├── README.md # Framework documentation
|
|
│ └── MCP_INTEGRATION_GUIDE.md # MCP server integration guide
|
|
│
|
|
├── tools/ # TOOLS PACKAGE (MCP tools)
|
|
│ ├── src/
|
|
│ │ └── aden_tools/
|
|
│ │ ├── tools/ # Individual tool implementations
|
|
│ │ │ ├── web_search_tool/
|
|
│ │ │ ├── web_scrape_tool/
|
|
│ │ │ ├── file_system_toolkits/
|
|
│ │ │ └── ... # Additional tools
|
|
│ │ ├── mcp_server.py # HTTP MCP server
|
|
│ │ └── __init__.py
|
|
│ ├── pyproject.toml # Package metadata
|
|
│ └── README.md # Tools documentation
|
|
│
|
|
├── exports/ # AGENT PACKAGES (user-created, gitignored)
|
|
│ └── your_agent_name/ # Created via coder-tools workflow
|
|
│
|
|
├── examples/ # Example agents
|
|
│ └── templates/ # Pre-built template agents
|
|
│
|
|
├── docs/ # Documentation
|
|
│ ├── getting-started.md # Quick start guide
|
|
│ ├── configuration.md # Configuration reference
|
|
│ ├── architecture/ # System architecture
|
|
│ ├── articles/ # Technical articles
|
|
│ ├── quizzes/ # Developer quizzes
|
|
│ └── i18n/ # Translations
|
|
│
|
|
├── scripts/ # Utility scripts
|
|
│ └── auto-close-duplicates.ts # GitHub duplicate issue closer
|
|
│
|
|
├── .agent/ # Antigravity IDE: mcp_config.json + skills (symlinks)
|
|
├── quickstart.sh # Interactive setup wizard
|
|
├── README.md # Project overview
|
|
├── CONTRIBUTING.md # Contribution guidelines
|
|
├── LICENSE # Apache 2.0 License
|
|
├── docs/CODE_OF_CONDUCT.md # Community guidelines
|
|
└── SECURITY.md # Security policy
|
|
```
|
|
|
|
---
|
|
|
|
## Building Agents
|
|
|
|
### Using Coder Tools Workflow
|
|
|
|
The fastest way to build agents is with the configured MCP workflow:
|
|
|
|
```bash
|
|
# Install dependencies (one-time)
|
|
./quickstart.sh
|
|
|
|
# Build a new agent
|
|
Use the coder-tools MCP tools from your IDE agent chat (e.g., initialize_and_build_agent)
|
|
```
|
|
|
|
### Agent Development Workflow
|
|
|
|
1. **Define Your Goal**
|
|
|
|
```
|
|
Use the coder-tools initialize_and_build_agent tool
|
|
Enter goal: "Build an agent that processes customer support tickets"
|
|
```
|
|
|
|
2. **Design the Workflow**
|
|
|
|
- The workflow guides you through defining nodes
|
|
- Each node is a unit of work (LLM call with event_loop)
|
|
- Edges define how execution flows
|
|
|
|
3. **Generate the Agent**
|
|
|
|
- The workflow generates a complete Python package in `exports/`
|
|
- Includes: `agent.json`, `tools.py`, `README.md`
|
|
|
|
4. **Validate the Agent**
|
|
|
|
```bash
|
|
PYTHONPATH=exports uv run python -m your_agent_name validate
|
|
```
|
|
|
|
5. **Test the Agent**
|
|
Run tests with:
|
|
```bash
|
|
PYTHONPATH=exports uv run python -m your_agent_name test
|
|
```
|
|
|
|
### Manual Agent Development
|
|
|
|
If you prefer to build agents manually:
|
|
|
|
```jsonc
|
|
// exports/my_agent/agent.json
|
|
{
|
|
"agent": {
|
|
"id": "my_agent",
|
|
"name": "Support Ticket Handler",
|
|
"version": "1.0.0",
|
|
"description": "Process customer support tickets"
|
|
},
|
|
"graph": {
|
|
"id": "my_agent-graph",
|
|
"goal_id": "support_ticket",
|
|
"entry_node": "analyze",
|
|
"terminal_nodes": ["analyze"],
|
|
"nodes": [
|
|
{
|
|
"id": "analyze",
|
|
"name": "Analyze Ticket",
|
|
"description": "Categorize and prioritize the support ticket",
|
|
"node_type": "event_loop",
|
|
"system_prompt": "Analyze this support ticket...",
|
|
"input_keys": ["ticket_content"],
|
|
"output_keys": ["category", "priority"]
|
|
}
|
|
],
|
|
"edges": []
|
|
},
|
|
"goal": {
|
|
"id": "support_ticket",
|
|
"name": "Support Ticket Handler",
|
|
"description": "Process customer support tickets",
|
|
"success_criteria": [
|
|
{
|
|
"id": "sc-categorized",
|
|
"description": "Ticket is categorized and prioritized correctly"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Running Agents
|
|
|
|
### Using the `hive` CLI
|
|
|
|
```bash
|
|
# Open the browser dashboard (Recommended for interactive use)
|
|
hive open
|
|
|
|
# Run a specific agent
|
|
hive run exports/my_agent --input '{"ticket_content": "My login is broken", "customer_id": "CUST-123"}'
|
|
|
|
# Run with input from a file
|
|
hive run exports/my_agent --input-file input.json
|
|
|
|
# Run and write output to file
|
|
hive run exports/my_agent -i '{...}' -o result.json
|
|
|
|
# Resume a previous session
|
|
hive run exports/my_agent --resume-session <session_id>
|
|
|
|
# Resume from a specific checkpoint
|
|
hive run exports/my_agent --resume-session <session_id> --checkpoint <checkpoint>
|
|
|
|
# Use a specific LLM model
|
|
hive run exports/my_agent --model claude-sonnet-4-20250514
|
|
```
|
|
|
|
### CLI Command Reference
|
|
|
|
| Command | Description |
|
|
| ---------------------- | ----------------------------------------------------------------------- |
|
|
| `hive run <path>` | Execute an agent (see flags below) |
|
|
| `hive shell [path]` | Interactive REPL (`--no-approve`) |
|
|
| `hive serve` | Start HTTP API server |
|
|
| `hive open` | Start server + open dashboard in browser |
|
|
| `hive info <path>` | Show agent details |
|
|
| `hive validate <path>` | Validate agent structure |
|
|
| `hive list [dir]` | List available agents |
|
|
|
|
### `hive run` flags
|
|
|
|
| Flag | Description |
|
|
| --------------------- | ---------------------------------------------------- |
|
|
| `-i, --input` | Input context as JSON string |
|
|
| `-f, --input-file` | Input context from JSON file |
|
|
| `-o, --output` | Write results to file instead of stdout |
|
|
| `-m, --model` | LLM model to use (any LiteLLM-compatible name) |
|
|
| `-q, --quiet` | Only output the final result JSON (log level: ERROR) |
|
|
| `-v, --verbose` | Show execution logs (log level: INFO) |
|
|
| `--debug` | Show all debug-level logs (log level: DEBUG) |
|
|
| `--resume-session` | Resume from a specific session ID |
|
|
| `--checkpoint` | Resume from a specific checkpoint (requires --resume-session) |
|
|
|
|
### `hive serve` / `hive open` flags
|
|
|
|
| Flag | Description |
|
|
| ----------------- | -------------------------------------------------- |
|
|
| `--host` | Host to bind (default: 127.0.0.1) |
|
|
| `-p, --port` | Port to listen on (default: 8787) |
|
|
| `-a, --agent` | Agent path to preload (repeatable) |
|
|
| `-m, --model` | LLM model for preloaded agents |
|
|
| `--open` | Open dashboard in browser after server starts (serve only) |
|
|
| `-v, --verbose` | Enable INFO log level |
|
|
| `--debug` | Enable DEBUG log level |
|
|
|
|
### Log levels
|
|
|
|
All commands support three verbosity tiers:
|
|
|
|
```bash
|
|
# Quiet — errors only
|
|
hive run exports/my_agent -q -i '{...}'
|
|
|
|
# Verbose — execution steps, LLM calls
|
|
hive run -v exports/my_agent -i '{...}'
|
|
|
|
# Debug — everything including internal subsystems (memory reflection, recall)
|
|
hive run --debug exports/my_agent -i '{...}'
|
|
```
|
|
|
|
The same flags work for `hive serve` and `hive open`:
|
|
|
|
```bash
|
|
hive open --debug # Start with full debug logging
|
|
hive serve --debug -p 9090 # Custom port with debug logs
|
|
```
|
|
|
|
### Using Python Directly
|
|
|
|
```bash
|
|
PYTHONPATH=exports uv run python -m agent_name run --input '{...}'
|
|
```
|
|
|
|
---
|
|
|
|
## Testing Agents
|
|
|
|
### Agent Tests
|
|
|
|
```bash
|
|
# Run tests for an agent
|
|
PYTHONPATH=exports uv run python -m agent_name test
|
|
|
|
# Run specific test type
|
|
PYTHONPATH=exports uv run python -m agent_name test --type constraint
|
|
PYTHONPATH=exports uv run python -m agent_name test --type success
|
|
|
|
# Run with parallel execution
|
|
PYTHONPATH=exports uv run python -m agent_name test --parallel 4
|
|
|
|
# Fail fast (stop on first failure)
|
|
PYTHONPATH=exports uv run python -m agent_name test --fail-fast
|
|
```
|
|
|
|
### Framework Tests
|
|
|
|
```bash
|
|
# Run all unit tests (core + tools)
|
|
make test
|
|
|
|
# Run linting and format checks
|
|
make check
|
|
```
|
|
|
|
### Dummy Agent Tests (E2E)
|
|
|
|
The repository includes end-to-end dummy agent tests under `core/tests/dummy_agents/` that run real LLM calls against deterministic graph structures. These are **not** part of CI — run them manually to verify the executor works with real providers.
|
|
|
|
```bash
|
|
cd core && uv run python tests/dummy_agents/run_all.py
|
|
```
|
|
|
|
The script detects available LLM credentials and prompts you to pick a provider. For verbose output:
|
|
|
|
```bash
|
|
cd core && uv run python tests/dummy_agents/run_all.py --verbose
|
|
```
|
|
|
|
See [environment-setup.md](./environment-setup.md#testing-with-dummy-agents) for the full list of covered agents and details.
|
|
|
|
### Writing Custom Tests
|
|
|
|
```python
|
|
# exports/my_agent/tests/test_custom.py
|
|
import pytest
|
|
from framework.runner import AgentRunner
|
|
|
|
def test_ticket_categorization():
|
|
"""Test that tickets are categorized correctly"""
|
|
runner = AgentRunner.from_file("exports/my_agent/agent.json")
|
|
|
|
result = runner.run({
|
|
"ticket_content": "I can't log in to my account"
|
|
})
|
|
|
|
assert result["category"] == "authentication"
|
|
assert result["priority"] in ["high", "medium", "low"]
|
|
```
|
|
|
|
---
|
|
|
|
## Code Style & Conventions
|
|
|
|
### Python Code Style
|
|
|
|
- **PEP 8** - Follow Python style guide
|
|
- **Type hints** - Use for function signatures and class attributes
|
|
- **Docstrings** - Document classes and public functions
|
|
- **Ruff** - Linter and formatter (run with `make check`)
|
|
|
|
```python
|
|
# Good
|
|
from typing import Optional, Dict, Any
|
|
|
|
def process_ticket(
|
|
ticket_content: str,
|
|
customer_id: str,
|
|
priority: Optional[str] = None
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Process a customer support ticket.
|
|
|
|
Args:
|
|
ticket_content: The content of the ticket
|
|
customer_id: The customer's ID
|
|
priority: Optional priority override
|
|
|
|
Returns:
|
|
Dictionary with processing results
|
|
"""
|
|
# Implementation
|
|
return {"status": "processed", "id": ticket_id}
|
|
|
|
# Avoid
|
|
def process_ticket(ticket_content, customer_id, priority=None):
|
|
# No types, no docstring
|
|
return {"status": "processed", "id": ticket_id}
|
|
```
|
|
|
|
### Agent Package Structure
|
|
|
|
```
|
|
my_agent/
|
|
├── __init__.py # Package initialization
|
|
├── __main__.py # CLI entry point
|
|
├── agent.json # Agent definition (nodes, edges, goal)
|
|
├── tools.py # Custom tools (optional)
|
|
├── mcp_servers.json # MCP server config (optional)
|
|
├── README.md # Agent documentation
|
|
└── tests/ # Test files
|
|
├── __init__.py
|
|
├── test_constraint.py # Constraint tests
|
|
└── test_success.py # Success criteria tests
|
|
```
|
|
|
|
### File Naming
|
|
|
|
| Type | Convention | Example |
|
|
| ------------------- | ---------------- | ------------------------ |
|
|
| Modules | snake_case | `ticket_handler.py` |
|
|
| Classes | PascalCase | `TicketHandler` |
|
|
| Functions/Variables | snake_case | `process_ticket()` |
|
|
| Constants | UPPER_SNAKE_CASE | `MAX_RETRIES = 3` |
|
|
| Test files | `test_` prefix | `test_ticket_handler.py` |
|
|
| Agent packages | snake_case | `support_ticket_agent/` |
|
|
|
|
### Import Order
|
|
|
|
1. Standard library
|
|
2. Third-party packages
|
|
3. Framework imports
|
|
4. Local imports
|
|
|
|
```python
|
|
# Standard library
|
|
import json
|
|
from typing import Dict, Any
|
|
|
|
# Third-party
|
|
import litellm
|
|
from pydantic import BaseModel
|
|
|
|
# Framework
|
|
from framework.runner import AgentRunner
|
|
from framework.context import NodeContext
|
|
|
|
# Local
|
|
from .tools import custom_tool
|
|
```
|
|
|
|
---
|
|
|
|
## Git Workflow
|
|
|
|
### Branch Naming
|
|
|
|
```
|
|
feature/add-user-authentication
|
|
bugfix/fix-login-redirect
|
|
hotfix/security-patch
|
|
chore/update-dependencies
|
|
docs/improve-readme
|
|
```
|
|
|
|
### Commit Messages
|
|
|
|
Follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
|
|
```
|
|
<type>(<scope>): <description>
|
|
|
|
[optional body]
|
|
|
|
[optional footer]
|
|
```
|
|
|
|
**Types:**
|
|
|
|
- `feat` - New feature
|
|
- `fix` - Bug fix
|
|
- `docs` - Documentation only
|
|
- `style` - Formatting, missing semicolons, etc.
|
|
- `refactor` - Code change that neither fixes a bug nor adds a feature
|
|
- `test` - Adding or updating tests
|
|
- `chore` - Maintenance tasks
|
|
|
|
**Examples:**
|
|
|
|
```
|
|
feat(auth): add JWT authentication
|
|
|
|
fix(api): handle null response from external service
|
|
|
|
docs(readme): update installation instructions
|
|
|
|
chore(deps): update React to 18.2.0
|
|
```
|
|
|
|
### Pull Request Process
|
|
|
|
1. Create a feature branch from `main`
|
|
2. Make your changes with clear commits
|
|
3. Run tests locally: `make test`
|
|
4. Run linting: `make check`
|
|
5. Push and create a PR
|
|
6. Fill out the PR template
|
|
7. Request review from CODEOWNERS
|
|
8. Address feedback
|
|
9. Squash and merge when approved
|
|
|
|
---
|
|
|
|
## Common Tasks
|
|
|
|
### Adding Python Dependencies
|
|
|
|
```bash
|
|
# Add to core framework
|
|
cd core
|
|
uv add <package>
|
|
|
|
# Add to tools package
|
|
cd tools
|
|
uv add <package>
|
|
```
|
|
|
|
### Creating a New Agent
|
|
|
|
```bash
|
|
# Option 1: Use Claude Code skill (recommended)
|
|
Use the coder-tools initialize_and_build_agent tool
|
|
|
|
# Option 2: Create manually
|
|
# Note: exports/ is initially empty (gitignored). Create your agent directory:
|
|
mkdir -p exports/my_new_agent
|
|
cd exports/my_new_agent
|
|
# Create agent.json, tools.py, README.md (see Agent Package Structure below)
|
|
|
|
# Option 3: Use the coder-tools MCP tools (advanced)
|
|
# See core/MCP_BUILDER_TOOLS_GUIDE.md
|
|
```
|
|
|
|
### Adding Custom Tools to an Agent
|
|
|
|
```python
|
|
# exports/my_agent/tools.py
|
|
from typing import Dict, Any
|
|
|
|
def my_custom_tool(param1: str, param2: int) -> Dict[str, Any]:
|
|
"""
|
|
Description of what this tool does.
|
|
|
|
Args:
|
|
param1: Description of param1
|
|
param2: Description of param2
|
|
|
|
Returns:
|
|
Dictionary with tool results
|
|
"""
|
|
# Implementation
|
|
return {"result": "success", "data": ...}
|
|
|
|
# Register tool in agent.json (inside "graph" → "nodes")
|
|
{
|
|
"graph": {
|
|
"nodes": [
|
|
{
|
|
"id": "use_tool",
|
|
"node_type": "event_loop",
|
|
"tools": ["my_custom_tool"]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Adding MCP Server Integration
|
|
|
|
```bash
|
|
# 1. Create mcp_servers.json in your agent package
|
|
# exports/my_agent/mcp_servers.json
|
|
{
|
|
"tools": {
|
|
"transport": "stdio",
|
|
"command": "python",
|
|
"args": ["-m", "aden_tools.mcp_server"],
|
|
"cwd": "tools/",
|
|
"description": "File system and web tools"
|
|
}
|
|
}
|
|
|
|
# 2. Reference tools in agent.json (inside "graph" → "nodes")
|
|
{
|
|
"graph": {
|
|
"nodes": [
|
|
{
|
|
"id": "search",
|
|
"tools": ["web_search", "web_scrape"]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Setting Environment Variables
|
|
|
|
```bash
|
|
# Add to your shell profile (~/.bashrc, ~/.zshrc, etc.)
|
|
export ANTHROPIC_API_KEY="your-key-here"
|
|
export OPENAI_API_KEY="your-key-here"
|
|
export OPENROUTER_API_KEY="your-key-here"
|
|
export HIVE_API_KEY="your-key-here"
|
|
export BRAVE_SEARCH_API_KEY="your-key-here"
|
|
|
|
# Or create .env file (not committed to git)
|
|
echo 'ANTHROPIC_API_KEY=your-key-here' >> .env
|
|
```
|
|
|
|
### Debugging Agent Execution
|
|
|
|
```bash
|
|
# Run with verbose output
|
|
hive run exports/my_agent --verbose --input '{"task": "..."}'
|
|
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
See [environment-setup.md](./environment-setup.md#troubleshooting) for common setup issues (module not found errors, broken installations, PEP 668, etc.).
|
|
|
|
---
|
|
|
|
## Getting Help
|
|
|
|
- **Documentation**: Check the `/docs` folder
|
|
- **Issues**: Search [existing issues](https://github.com/adenhq/hive/issues)
|
|
- **Discord**: Join our [community](https://discord.com/invite/MXE49hrKDk)
|
|
- **Code Review**: Tag a maintainer on your PR
|