1192 lines
36 KiB
Markdown
1192 lines
36 KiB
Markdown
# Contributing to Aden Hive
|
|
|
|
> **"The best way to predict the future is to invent it."** — Alan Kay
|
|
|
|
Welcome to Aden Hive, an open-source AI agent framework built for developers who demand production-grade reliability, cross-platform support, and real-world performance. This guide will help you contribute effectively, whether you're fixing bugs, adding features, improving documentation, or building new tools.
|
|
|
|
Thank you for your interest in contributing! We're especially looking for help building tools, integrations ([check #2805](https://github.com/aden-hive/hive/issues/2805)), and example agents for the framework.
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
1. [Code of Conduct](#code-of-conduct)
|
|
2. [Philosophy: Why We Build in the Open](#philosophy-why-we-build-in-the-open)
|
|
3. [Issue Assignment Policy](#issue-assignment-policy)
|
|
4. [Getting Started](#getting-started)
|
|
5. [OS Support: Write Once, Run Everywhere](#os-support-write-once-run-everywhere)
|
|
6. [Development Setup & Tooling](#development-setup--tooling)
|
|
7. [Tooling & Skills Required](#tooling--skills-required)
|
|
8. [LLM Models & Providers](#llm-models--providers)
|
|
9. [Sample Prompts & Agent Examples](#sample-prompts--agent-examples)
|
|
10. [Performance Metrics & Benchmarking](#performance-metrics--benchmarking)
|
|
11. [Commit Convention](#commit-convention)
|
|
12. [Pull Request Process](#pull-request-process)
|
|
13. [Code Style & Standards](#code-style--standards)
|
|
14. [Testing Philosophy](#testing-philosophy)
|
|
15. [Priority Contribution Areas](#priority-contribution-areas)
|
|
16. [Troubleshooting](#troubleshooting)
|
|
17. [Questions & Community](#questions--community)
|
|
|
|
---
|
|
|
|
## Code of Conduct
|
|
|
|
By participating in this project, you agree to abide by our [Code of Conduct](docs/CODE_OF_CONDUCT.md).
|
|
|
|
We follow the [Contributor Covenant](https://www.contributor-covenant.org/). In short:
|
|
- Be welcoming and inclusive
|
|
- Respect differing viewpoints
|
|
- Accept constructive criticism gracefully
|
|
- Focus on what's best for the community
|
|
- Show empathy towards others
|
|
|
|
---
|
|
|
|
## Philosophy: Why We Build in the Open
|
|
|
|
Like Linux, TypeScript, and PSPDFKit, **Aden Hive is built by practitioners for practitioners**. We believe:
|
|
|
|
- **Quality over speed**: A well-tested feature beats a rushed release
|
|
- **Transparency over mystery**: Every decision is documented and reviewable
|
|
- **Community over ego**: The best idea wins, regardless of who suggests it
|
|
- **Performance matters**: Agents should be fast, efficient, and measurable
|
|
- **Cross-platform is non-negotiable**: If it doesn't work on Windows, macOS, and Linux, it's not done
|
|
|
|
Our goal is to deliver **developer success** through:
|
|
1. **Reliability** — Agents that work consistently across platforms
|
|
2. **Observability** — Clear insights into what agents are doing and why
|
|
3. **Extensibility** — Easy to add new tools, models, and capabilities
|
|
4. **Performance** — Fast execution with measurable metrics
|
|
|
|
---
|
|
|
|
## Issue Assignment Policy
|
|
|
|
To prevent duplicate work and respect contributors' time, we require issue assignment before submitting PRs.
|
|
|
|
### How to Claim an Issue
|
|
|
|
1. **Find an Issue:** Browse existing issues or create a new one
|
|
2. **Claim It:** Leave a comment (e.g., *"I'd like to work on this!"*)
|
|
3. **Wait for Assignment:** A maintainer will assign you within 24 hours. Issues with reproducible steps or proposals are prioritized.
|
|
4. **Submit Your PR:** Once assigned, you're ready to contribute
|
|
|
|
> **Note:** PRs for unassigned issues may be delayed or closed if someone else was already assigned.
|
|
|
|
### Exceptions (No Assignment Needed)
|
|
|
|
You may submit PRs without prior assignment for:
|
|
- **Documentation:** Fixing typos or clarifying instructions — add the `documentation` label or include `doc`/`docs` in your PR title to bypass the linked issue requirement
|
|
- **Micro-fixes:** Add the `micro-fix` label or include `micro-fix` in your PR title to bypass the linked issue requirement. Micro-fixes must meet **all** qualification criteria:
|
|
|
|
| Qualifies | Disqualifies |
|
|
|-----------|--------------|
|
|
| < 20 lines changed | Any functional bug fix |
|
|
| Typos & Documentation & Linting | Refactoring for "clean code" |
|
|
| No logic/API/DB changes | New features (even tiny ones) |
|
|
|
|
---
|
|
|
|
## Getting Started
|
|
|
|
### Quick Setup
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone https://github.com/aden-hive/hive.git
|
|
cd hive
|
|
|
|
# Automated setup (installs uv, dependencies, and runs tests)
|
|
./quickstart.sh
|
|
|
|
# Or manual setup
|
|
uv venv
|
|
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
uv sync
|
|
```
|
|
|
|
### Fork and Branch Workflow
|
|
|
|
1. Fork the repository
|
|
2. Clone your fork: `git clone https://github.com/YOUR_USERNAME/hive.git`
|
|
3. Add the upstream repository: `git remote add upstream https://github.com/aden-hive/hive.git`
|
|
4. Sync with upstream to ensure you're starting from the latest code:
|
|
```bash
|
|
git fetch upstream
|
|
git checkout main
|
|
git merge upstream/main
|
|
```
|
|
5. Create a feature branch: `git checkout -b feature/your-feature-name`
|
|
6. Make your changes
|
|
7. Run checks and tests:
|
|
```bash
|
|
make check # Lint and format checks
|
|
make test # Core tests
|
|
```
|
|
On Windows (no make), run directly:
|
|
```powershell
|
|
uv run ruff check core/ tools/
|
|
uv run ruff format --check core/ tools/
|
|
uv run pytest core/tests/
|
|
```
|
|
8. Commit your changes following our commit conventions
|
|
9. Push to your fork and submit a Pull Request
|
|
|
|
### Verify Installation
|
|
|
|
```bash
|
|
# Run core tests
|
|
uv run pytest core/tests/
|
|
|
|
# Run tool tests (mocked, no real API calls)
|
|
uv run pytest tools/tests/
|
|
|
|
# Run linter
|
|
uv run ruff check .
|
|
|
|
# Run formatter
|
|
uv run ruff format .
|
|
```
|
|
|
|
---
|
|
|
|
## OS Support: Write Once, Run Everywhere
|
|
|
|
Aden Hive runs on **macOS, Windows, and Linux** with platform-specific optimizations.
|
|
|
|
### Current OS Support Matrix
|
|
|
|
| Feature | macOS | Windows | Linux | Notes |
|
|
|---------|-------|---------|-------|-------|
|
|
| Core Framework | ✅ | ✅ | ✅ | Fully tested |
|
|
| CLI Runner | ✅ | ✅ | ✅ | Platform-aware terminal handling |
|
|
| File Operations | ✅ | ✅ | ✅ | Atomic writes with ACL preservation (Windows) |
|
|
| Browser Automation | ✅ | ✅ | ✅ | Playwright-based |
|
|
| Process Spawning | ✅ | ✅ | ✅ | subprocess + asyncio |
|
|
| Credential Storage | ✅ | ✅ | ✅ | `~/.hive/credentials` |
|
|
| Web Dashboard | ✅ | ✅ | ✅ | React + FastAPI |
|
|
|
|
### Platform-Specific Code
|
|
|
|
**Windows Support** (`core/framework/credentials/_win32_atomic.py`)
|
|
- Uses `ReplaceFileW` API for atomic file replacement
|
|
- Preserves NTFS DACL (Discretionary Access Control Lists)
|
|
- Handles FAT32 vs NTFS volume detection
|
|
|
|
**macOS Support**
|
|
- Uses `open` command for browser launching
|
|
- Native terminal support with ANSI colors
|
|
|
|
**Linux Support**
|
|
- Uses `xdg-open` for browser launching
|
|
- Full systemd integration for daemon mode (future)
|
|
|
|
### Cross-Platform Best Practices
|
|
|
|
Use `pathlib.Path` for all file operations:
|
|
|
|
```python
|
|
from pathlib import Path
|
|
|
|
# ✅ Good: Cross-platform
|
|
config_path = Path.home() / ".hive" / "config.json"
|
|
|
|
# ❌ Bad: Unix-only
|
|
config_path = "~/.hive/config.json"
|
|
```
|
|
|
|
Use platform checks when needed:
|
|
|
|
```python
|
|
import sys
|
|
if sys.platform == "win32":
|
|
# Windows-specific code
|
|
elif sys.platform == "darwin":
|
|
# macOS-specific code
|
|
else: # linux
|
|
# Linux-specific code
|
|
```
|
|
|
|
### Priority Areas for OS Contributions
|
|
|
|
- [ ] **Windows WSL2 optimization** — Better detection and native integration
|
|
- [ ] **Linux systemd service** — Daemon mode for long-running agents
|
|
- [ ] **macOS app bundle** — `.app` distribution with proper sandboxing
|
|
- [ ] **Windows installer** — `.msi` or `.exe` installer with PATH setup
|
|
- [ ] **Docker images** — Official multi-arch images (amd64, arm64)
|
|
|
|
---
|
|
|
|
## Development Setup & Tooling
|
|
|
|
### Prerequisites
|
|
|
|
- **Python 3.11+** (3.12 or 3.13 recommended)
|
|
- **Git** for version control
|
|
- **uv** for package management (installed automatically by quickstart)
|
|
- **Node.js 18+** (optional, for frontend development)
|
|
|
|
> **Windows Users:**
|
|
> Native Windows is supported. Use `.\quickstart.ps1` for setup and `.\hive.ps1` to run (PowerShell 5.1+). Disable "App Execution Aliases" in Windows settings to avoid Python path conflicts. WSL is also an option but not required.
|
|
|
|
> **Tip:** Installing Claude Code skills is optional for running existing agents, but required if you plan to **build new agents**.
|
|
|
|
### Package Management with `uv`
|
|
|
|
`uv` is a fast Python package installer and resolver (replaces pip + venv):
|
|
|
|
```bash
|
|
# Install uv
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
|
# Install/sync dependencies
|
|
uv sync
|
|
|
|
# Add a new dependency
|
|
uv add <package>
|
|
|
|
# Run Python scripts
|
|
uv run python -m your_module
|
|
|
|
# Run pytest
|
|
uv run pytest
|
|
```
|
|
|
|
### Code Quality Tools
|
|
|
|
**ruff** — Fast Python linter and formatter (replaces black, isort, flake8)
|
|
|
|
```bash
|
|
# Format code
|
|
uv run ruff format .
|
|
|
|
# Check linting issues
|
|
uv run ruff check .
|
|
|
|
# Auto-fix linting issues
|
|
uv run ruff check . --fix
|
|
```
|
|
|
|
Configuration in `pyproject.toml`:
|
|
```toml
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py311"
|
|
```
|
|
|
|
### Makefile Targets
|
|
|
|
```bash
|
|
make lint # Run ruff format + check
|
|
make check # CI-safe checks (no modifications)
|
|
make test # Run all tests
|
|
make test-tools # Run tool tests only
|
|
make test-live # Run live API integration tests (requires credentials)
|
|
```
|
|
|
|
### Recommended IDE Setup
|
|
|
|
**VS Code** (`.vscode/settings.json`)
|
|
```json
|
|
{
|
|
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
|
|
"python.linting.enabled": true,
|
|
"python.linting.ruffEnabled": true,
|
|
"python.formatting.provider": "none",
|
|
"[python]": {
|
|
"editor.defaultFormatter": "charliermarsh.ruff",
|
|
"editor.formatOnSave": true,
|
|
"editor.codeActionsOnSave": {
|
|
"source.fixAll": true,
|
|
"source.organizeImports": true
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**PyCharm**
|
|
- Enable ruff plugin
|
|
- Set Python interpreter to `.venv/bin/python`
|
|
- Enable pytest as test runner
|
|
|
|
---
|
|
|
|
## Tooling & Skills Required
|
|
|
|
### Required Skills by Contribution Type
|
|
|
|
**Core Framework Development**
|
|
- **Python 3.11+** with asyncio, type hints, and Pydantic
|
|
- **Graph theory** basics (nodes, edges, DAG traversal)
|
|
- **LLM fundamentals** (prompting, context windows, streaming)
|
|
- **Testing** with pytest, mocking, and async tests
|
|
|
|
**Tool Development** (99+ tools available)
|
|
- **API integration** (REST, GraphQL, WebSocket)
|
|
- **OAuth flows** (OAuth2, PKCE, refresh tokens)
|
|
- **MCP (Model Context Protocol)** for tool registration
|
|
- **Error handling** and retry logic
|
|
|
|
**Frontend Development** (Optional)
|
|
- **React 18+** with TypeScript
|
|
- **WebSocket** for real-time updates
|
|
- **Tailwind CSS** for styling
|
|
|
|
### Frontend Dev Workflow
|
|
|
|
> **Note:** `./quickstart.sh` handles the full setup including the web UI.
|
|
> The commands below are for contributors iterating on the frontend code after
|
|
> initial setup is complete.
|
|
|
|
```bash
|
|
# Start the backend server
|
|
hive serve
|
|
|
|
# In a separate terminal, run the frontend dev server with hot-reload
|
|
cd core/frontend
|
|
npm install # only needed after dependency changes
|
|
npm run dev
|
|
```
|
|
|
|
### Useful Development Commands
|
|
|
|
```bash
|
|
# Run tests with coverage
|
|
uv run pytest --cov=core --cov-report=html
|
|
|
|
# Run tests in parallel
|
|
uv run pytest -n auto
|
|
|
|
# Run only fast tests (skip live API tests)
|
|
uv run pytest -m "not live"
|
|
|
|
# Run linter with auto-fix
|
|
uv run ruff check . --fix
|
|
|
|
# Format code
|
|
uv run ruff format .
|
|
|
|
# Type checking (if using mypy)
|
|
uv run mypy core/
|
|
|
|
# Run a specific agent
|
|
uv run python -m exports.ai_outreach_architect
|
|
```
|
|
|
|
### Skills by Contribution Level
|
|
|
|
**Beginner-Friendly**
|
|
- Writing sample prompts (see `/examples/recipes/`)
|
|
- Fixing documentation typos
|
|
- Adding tool integrations (use existing tools as templates)
|
|
- Writing unit tests for existing code
|
|
|
|
**Intermediate**
|
|
- Building custom agents
|
|
- Adding new LLM provider support
|
|
- Improving error messages
|
|
- Adding new node types
|
|
|
|
**Advanced**
|
|
- Optimizing graph execution performance
|
|
- Building new judge evaluation methods
|
|
- Implementing cross-agent memory sharing
|
|
- Adding distributed execution support
|
|
|
|
---
|
|
|
|
## LLM Models & Providers
|
|
|
|
Aden Hive supports **100+ LLM providers** via LiteLLM, giving users maximum flexibility.
|
|
|
|
### Supported Providers
|
|
|
|
| Provider | Models | Notes |
|
|
|----------|--------|-------|
|
|
| **Anthropic** | Claude 3.5 Sonnet, Haiku, Opus | Default provider, best for reasoning |
|
|
| **OpenAI** | GPT-4, GPT-4 Turbo, GPT-4o | Function calling, vision |
|
|
| **OpenRouter** | Any OpenRouter catalog model | Uses `OPENROUTER_API_KEY` and `https://openrouter.ai/api/v1` |
|
|
| **Hive LLM** | `queen`, `kimi-k2.5`, `GLM-5` | Uses `HIVE_API_KEY` and the Hive-managed endpoint |
|
|
| **Google** | Gemini 1.5 Pro, Flash | Long context windows |
|
|
| **DeepSeek** | DeepSeek V3 | Cost-effective, strong reasoning |
|
|
| **Mistral** | Mistral Large, Medium, Small | Open weights, EU hosting |
|
|
| **Groq** | Llama 3, Mixtral | Ultra-fast inference |
|
|
| **Ollama** | Any local model | Privacy-first, no API costs |
|
|
| **Azure OpenAI** | GPT-4, GPT-3.5 | Enterprise SSO, compliance |
|
|
| **Cohere** | Command, Command Light | Strong embeddings |
|
|
| **Together AI** | Open-source models | Flexible hosting |
|
|
| **Bedrock** | AWS-hosted models | Enterprise integration |
|
|
|
|
### Default Configuration
|
|
|
|
```python
|
|
# core/framework/llm/provider.py
|
|
DEFAULT_MODEL = "claude-haiku-4-5-20251001"
|
|
```
|
|
|
|
### Model Selection Guidelines
|
|
|
|
**For Production Agents**
|
|
- **Reliability**: Claude 3.5 Sonnet (best reasoning)
|
|
- **Speed**: Claude Haiku or GPT-4o-mini (fast responses)
|
|
- **Cost**: DeepSeek or Gemini Flash (budget-conscious)
|
|
- **Privacy**: Ollama with local models (no data leaves server)
|
|
|
|
**Provider-Specific Notes**
|
|
- **OpenRouter**: store `provider` as `openrouter`, use the raw OpenRouter model ID in `model` (for example `x-ai/grok-4.20-beta`), and use `OPENROUTER_API_KEY`
|
|
- **Hive LLM**: store `provider` as `hive`, use Hive model names such as `queen`, `kimi-k2.5`, or `GLM-5`, and use `HIVE_API_KEY`
|
|
|
|
**For Development**
|
|
- Use cheaper/faster models (Haiku, GPT-4o-mini)
|
|
- Test with multiple providers to catch provider-specific issues
|
|
- Mock LLM calls in unit tests
|
|
|
|
### How to Add a New LLM Provider
|
|
|
|
1. **Check if LiteLLM supports it** (most providers already work out of the box)
|
|
2. **Add credential handling** in `core/framework/credentials/`
|
|
3. **Add provider-specific configuration** in `core/framework/llm/`
|
|
4. **Write tests** in `core/tests/test_llm_provider.py`
|
|
5. **Update documentation** in `README.md`, `docs/configuration.md`, and any setup guides that mention provider configuration
|
|
|
|
**Example: Testing LLM Integration**
|
|
|
|
```python
|
|
# core/tests/test_llm_provider.py
|
|
import pytest
|
|
from framework.llm.anthropic import AnthropicProvider
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_anthropic_provider_basic():
|
|
provider = AnthropicProvider(api_key="test_key", model="claude-3-5-sonnet-20241022")
|
|
response = await provider.generate([{"role": "user", "content": "Hello"}])
|
|
assert response.content
|
|
assert response.model == "claude-3-5-sonnet-20241022"
|
|
|
|
@pytest.mark.live
|
|
@pytest.mark.asyncio
|
|
async def test_anthropic_provider_real(anthropic_api_key):
|
|
"""Live test with real API (requires credentials)"""
|
|
provider = AnthropicProvider(api_key=anthropic_api_key)
|
|
response = await provider.generate([{"role": "user", "content": "What is 2+2?"}])
|
|
assert "4" in response.content
|
|
```
|
|
|
|
### Priority Areas for LLM Contributions
|
|
|
|
- [ ] **Cost tracking per agent** — Track spend by agent/workflow
|
|
- [ ] **Model degradation policies** — Auto-fallback to cheaper models
|
|
- [ ] **Context window optimization** — Smart truncation strategies
|
|
- [ ] **Streaming improvements** — Better UX for long-running tasks
|
|
- [ ] **Vision model support** — Standardized image input handling
|
|
- [ ] **Local model fine-tuning** — Tools for fine-tuning Llama/Mistral models
|
|
- [ ] **Provider benchmarks** — Speed, quality, cost comparison dashboard
|
|
|
|
---
|
|
|
|
## Sample Prompts & Agent Examples
|
|
|
|
We provide **100+ sample prompts** covering real-world use cases.
|
|
|
|
### Where to Find Sample Prompts
|
|
|
|
**1. Recipe Prompts** (`/examples/recipes/sample_prompts_for_use_cases.md`)
|
|
- 100 production-ready agent prompts
|
|
- Categories: Marketing, Sales, Operations, Engineering, Finance
|
|
- Copy-paste ready for quick experimentation
|
|
|
|
**2. Template Agents** (`/examples/templates/`)
|
|
- Competitive Intelligence Agent
|
|
- Deep Research Agent
|
|
- Tech News Reporter
|
|
- Vulnerability Assessment
|
|
- Email Inbox Management
|
|
- Job Hunter
|
|
|
|
**3. Exported Agents** (`/exports/`)
|
|
- 17+ production agents built by the community
|
|
- AI Outreach Architect
|
|
- Financial AI Auditor
|
|
- Gmail Star Drafter
|
|
- GitHub Reply Agent
|
|
|
|
### Agent Prompt Structure
|
|
|
|
Every agent prompt should include:
|
|
|
|
1. **Role definition** — "You are a [role]..."
|
|
2. **Goal statement** — "Your job is to..."
|
|
3. **Step-by-step process** — Clear, numbered instructions
|
|
4. **Output format** — JSON schema or structured format
|
|
5. **Edge cases** — How to handle failures, missing data, etc.
|
|
|
|
**Example: High-Quality Agent Prompt**
|
|
|
|
```markdown
|
|
You are an elite Competitive Intelligence Analyst.
|
|
|
|
Your job is to monitor competitor websites, extract pricing and feature updates,
|
|
and produce a weekly intelligence report.
|
|
|
|
**STEP 1 — Discovery**
|
|
1. Use web_search to find the competitor's pricing page, changelog, and blog
|
|
2. Try queries like: "{competitor_name} pricing 2025"
|
|
3. If no results, navigate directly to their known domain
|
|
|
|
**STEP 2 — Extraction**
|
|
1. Use web_scrape on each relevant URL
|
|
2. Extract: pricing tiers, feature changes, announcement dates
|
|
3. Format as JSON: {competitor, category, update, source, date}
|
|
|
|
**STEP 3 — Analysis**
|
|
1. Compare current data with last week's snapshot (load_data)
|
|
2. Flag significant changes (>10% price change, new features)
|
|
3. Save current snapshot (save_data)
|
|
|
|
**STEP 4 — Reporting**
|
|
1. Generate HTML report with key highlights
|
|
2. Include comparison table and trend analysis
|
|
3. Call serve_file_to_user to deliver the report
|
|
|
|
**Important:**
|
|
- Be factual — only report what you actually see
|
|
- Skip URLs that fail to load
|
|
- Prioritize recent content (last 7 days)
|
|
```
|
|
|
|
### How to Contribute Sample Prompts
|
|
|
|
1. **Test your prompt** with a real agent first
|
|
2. **Document the use case** clearly
|
|
3. **Include expected tools** needed (web_search, save_data, etc.)
|
|
4. **Add to the appropriate category** in `/examples/recipes/sample_prompts_for_use_cases.md`
|
|
5. **Submit a PR** with title: `docs: add sample prompt for [use case]`
|
|
|
|
### Prompt Quality Checklist
|
|
|
|
- [ ] Role is clearly defined
|
|
- [ ] Steps are numbered and actionable
|
|
- [ ] Output format is specified (JSON schema preferred)
|
|
- [ ] Edge cases are handled (failures, missing data, rate limits)
|
|
- [ ] Tools are explicitly mentioned
|
|
- [ ] Tested with at least one real execution
|
|
|
|
### Priority Areas for Prompt Contributions
|
|
|
|
- [ ] **Industry-specific agents** — Healthcare, Legal, Finance, Education
|
|
- [ ] **Multilingual prompts** — Non-English agent templates
|
|
- [ ] **Error recovery patterns** — How agents should handle failures
|
|
- [ ] **Human-in-the-loop prompts** — When to ask for approval
|
|
- [ ] **Multi-agent coordination** — How agents delegate to sub-agents
|
|
|
|
---
|
|
|
|
## Performance Metrics & Benchmarking
|
|
|
|
**Performance is a feature.** Slow agents frustrate users. We measure everything.
|
|
|
|
### Key Performance Metrics
|
|
|
|
| Metric | Target | How to Measure |
|
|
|--------|--------|----------------|
|
|
| **Agent Latency** | <30s for simple tasks | `RuntimeLogger.log_execution_time()` |
|
|
| **LLM Token Usage** | <10K tokens/task | `LiteLLM.track_cost()` |
|
|
| **Tool Call Success Rate** | >95% | `ToolExecutor.success_rate()` |
|
|
| **Judge Accuracy** | >90% agreement with human | Manual evaluation |
|
|
| **Memory Usage** | <500MB per agent | `psutil.Process().memory_info()` |
|
|
| **Concurrent Agents** | 10+ agents on 4-core CPU | Load testing |
|
|
|
|
### Current Monitoring Tools
|
|
|
|
**Runtime Performance**
|
|
```python
|
|
# core/framework/runtime/runtime_logger.py
|
|
class RuntimeLogger:
|
|
def log_node_execution(self, node_id: str, duration: float, tokens: int):
|
|
# Tracks per-node performance
|
|
pass
|
|
|
|
def log_tool_call(self, tool_name: str, duration: float, success: bool):
|
|
# Tracks tool latency and reliability
|
|
pass
|
|
```
|
|
|
|
**LLM Cost Tracking**
|
|
```python
|
|
# LiteLLM automatically tracks cost per request
|
|
from litellm import completion_cost
|
|
cost = completion_cost(model="claude-3-5-sonnet-20241022", messages=[...])
|
|
```
|
|
|
|
### How to Add Performance Metrics
|
|
|
|
**1. Instrument your code**
|
|
```python
|
|
import time
|
|
from framework.runtime.runtime_logger import RuntimeLogger
|
|
|
|
logger = RuntimeLogger()
|
|
|
|
start = time.time()
|
|
result = await expensive_operation()
|
|
duration = time.time() - start
|
|
|
|
logger.log_execution_time("expensive_operation", duration)
|
|
```
|
|
|
|
**2. Add tests with performance assertions**
|
|
```python
|
|
@pytest.mark.asyncio
|
|
async def test_agent_performance():
|
|
start = time.time()
|
|
result = await run_agent(...)
|
|
duration = time.time() - start
|
|
|
|
assert duration < 30.0, f"Agent took {duration}s (expected <30s)"
|
|
assert result.total_tokens < 10000, f"Used {result.total_tokens} tokens (expected <10K)"
|
|
```
|
|
|
|
**3. Create benchmark scripts** (`/benchmarks/`)
|
|
```python
|
|
# benchmarks/bench_agent_latency.py
|
|
import asyncio
|
|
import statistics
|
|
from exports.my_agent import MyAgent
|
|
|
|
async def benchmark_agent(iterations: int = 100):
|
|
durations = []
|
|
for i in range(iterations):
|
|
start = time.time()
|
|
await MyAgent().run("test input")
|
|
durations.append(time.time() - start)
|
|
|
|
print(f"Mean: {statistics.mean(durations):.2f}s")
|
|
print(f"P50: {statistics.median(durations):.2f}s")
|
|
print(f"P99: {statistics.quantiles(durations, n=100)[98]:.2f}s")
|
|
|
|
asyncio.run(benchmark_agent())
|
|
```
|
|
|
|
### Performance Optimization Tips
|
|
|
|
**1. Reduce LLM Calls**
|
|
- Cache repetitive responses
|
|
- Use cheaper models for simple tasks (Haiku vs Sonnet)
|
|
- Batch multiple questions into one prompt
|
|
|
|
**2. Optimize Tool Calls**
|
|
- Run independent tool calls in parallel (`asyncio.gather`)
|
|
- Cache API responses when appropriate
|
|
- Use webhooks instead of polling
|
|
|
|
**3. Memory Management**
|
|
- Use streaming for large files (don't load entire file into memory)
|
|
- Clear conversation history periodically
|
|
- Use database for large datasets (not in-memory)
|
|
|
|
**4. Graph Execution**
|
|
- Minimize sequential dependencies (more parallelism)
|
|
- Use conditional edges to skip unnecessary nodes
|
|
- Set appropriate timeouts
|
|
|
|
### Priority Areas for Performance Contributions
|
|
|
|
- [ ] **Comprehensive benchmark suite** — Standard tasks across providers
|
|
- [ ] **Real-time performance dashboard** — Live monitoring during execution
|
|
- [ ] **Cost tracking per agent/workflow** — Budget management
|
|
- [ ] **Provider comparison dashboard** — Speed, quality, cost metrics
|
|
- [ ] **Automatic performance regression detection** — CI integration
|
|
|
|
---
|
|
|
|
## Commit Convention
|
|
|
|
We follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
|
|
```
|
|
type(scope): description
|
|
|
|
[optional body]
|
|
|
|
[optional footer]
|
|
```
|
|
|
|
**Types:**
|
|
- `feat`: New feature
|
|
- `fix`: Bug fix
|
|
- `docs`: Documentation changes
|
|
- `style`: Code style changes (formatting, etc.)
|
|
- `refactor`: Code refactoring
|
|
- `test`: Adding or updating tests
|
|
- `chore`: Maintenance tasks
|
|
- `perf`: Performance improvements
|
|
|
|
**Examples:**
|
|
```
|
|
feat(auth): add OAuth2 login support
|
|
fix(api): handle null response from external service
|
|
docs(readme): update installation instructions
|
|
test(graph): add integration tests for graph executor
|
|
perf(llm): reduce token usage by 30% with prompt caching
|
|
```
|
|
|
|
---
|
|
|
|
## Pull Request Process
|
|
|
|
1. **Get assigned to the issue first** (see [Issue Assignment Policy](#issue-assignment-policy))
|
|
2. Update documentation if needed
|
|
3. Add tests for new functionality
|
|
4. Ensure `make check` and `make test` pass
|
|
5. Request review from maintainers
|
|
|
|
### PR Title Format
|
|
|
|
Follow the same convention as commits:
|
|
```
|
|
feat(component): add new feature description
|
|
```
|
|
|
|
### PR Template
|
|
|
|
```markdown
|
|
## Description
|
|
Brief description of what this PR does.
|
|
|
|
## Motivation
|
|
Why is this change needed?
|
|
|
|
## Changes
|
|
- Added X
|
|
- Fixed Y
|
|
- Updated Z
|
|
|
|
## Testing
|
|
- [ ] Unit tests added/updated
|
|
- [ ] Integration tests added/updated
|
|
- [ ] Tested on macOS
|
|
- [ ] Tested on Windows
|
|
- [ ] Tested on Linux
|
|
|
|
## Checklist
|
|
- [ ] Code follows style guidelines (ruff)
|
|
- [ ] Self-review completed
|
|
- [ ] Documentation updated
|
|
- [ ] No breaking changes (or documented if unavoidable)
|
|
|
|
Closes #123
|
|
```
|
|
|
|
---
|
|
|
|
## Code Style & Standards
|
|
|
|
### Project Structure
|
|
|
|
- `core/` - Core framework (agent runtime, graph executor, protocols)
|
|
- `tools/` - MCP Tools Package (tools for agent capabilities)
|
|
- `exports/` - Agent packages and examples
|
|
- `docs/` - Documentation
|
|
- `scripts/` - Build and utility scripts
|
|
- `.claude/` - Claude Code skills for building/testing agents
|
|
|
|
### Python Style Guidelines
|
|
|
|
- Use Python 3.11+ for all new code
|
|
- Follow PEP 8 style guide
|
|
- Add type hints to function signatures
|
|
- Write docstrings for classes and public functions
|
|
- Use meaningful variable and function names
|
|
- Keep functions focused and small
|
|
- **Line length**: 100 characters
|
|
- **Formatting**: Use `ruff format` (no manual formatting)
|
|
- **Linting**: Use `ruff check` (no warnings tolerated)
|
|
|
|
For linting and formatting (Ruff, pre-commit hooks), see [Linting & Formatting Setup](docs/contributing-lint-setup.md).
|
|
|
|
### Example: Good Code
|
|
|
|
```python
|
|
from typing import Optional
|
|
from pydantic import BaseModel
|
|
|
|
class AgentConfig(BaseModel):
|
|
"""Configuration for agent execution.
|
|
|
|
Attributes:
|
|
model: LLM model name (e.g., "claude-3-5-sonnet-20241022")
|
|
max_tokens: Maximum tokens for completion (default: 4096)
|
|
temperature: Sampling temperature 0.0-1.0 (default: 0.7)
|
|
"""
|
|
model: str
|
|
max_tokens: int = 4096
|
|
temperature: float = 0.7
|
|
|
|
async def run_agent(config: AgentConfig, timeout: Optional[float] = None) -> dict:
|
|
"""Run an agent with the given configuration.
|
|
|
|
Args:
|
|
config: Agent configuration
|
|
timeout: Optional timeout in seconds (default: no timeout)
|
|
|
|
Returns:
|
|
Dictionary containing agent results and metadata
|
|
|
|
Raises:
|
|
TimeoutError: If execution exceeds timeout
|
|
ValueError: If config is invalid
|
|
"""
|
|
# Implementation
|
|
pass
|
|
```
|
|
|
|
### Architecture Principles
|
|
|
|
1. **Separation of concerns** — One class, one responsibility
|
|
2. **Dependency injection** — Pass dependencies explicitly (no global state)
|
|
3. **Async by default** — Use `async/await` for I/O operations
|
|
4. **Error handling** — Catch specific exceptions, log errors, fail gracefully
|
|
5. **Immutability** — Prefer immutable data structures (Pydantic models)
|
|
|
|
### Code Review Checklist
|
|
|
|
**For Authors**
|
|
- [ ] Self-review your diff before submitting
|
|
- [ ] All tests pass locally
|
|
- [ ] No commented-out code or debug prints
|
|
- [ ] No breaking changes (or documented if unavoidable)
|
|
- [ ] Documentation updated
|
|
- [ ] Conventional commit format used
|
|
|
|
**For Reviewers**
|
|
- [ ] Does the code solve the stated problem?
|
|
- [ ] Is the code readable and maintainable?
|
|
- [ ] Are there tests covering the new code?
|
|
- [ ] Are edge cases handled?
|
|
- [ ] Is performance acceptable?
|
|
- [ ] Does it follow existing patterns in the codebase?
|
|
|
|
---
|
|
|
|
## Testing Philosophy
|
|
|
|
> **"If it's not tested, it's broken."** — Linus Torvalds
|
|
|
|
### Test Pyramid
|
|
|
|
```
|
|
/\
|
|
/ \ End-to-End Tests (5%)
|
|
/----\ Integration Tests (15%)
|
|
/ \ Unit Tests (80%)
|
|
/________\
|
|
```
|
|
|
|
### Types of Tests
|
|
|
|
**Unit Tests** (80% of tests)
|
|
- Test individual functions/classes in isolation
|
|
- Fast (<1ms per test)
|
|
- No external dependencies (mock everything)
|
|
- Live in `/core/tests/` and `/tools/tests/`
|
|
|
|
**Integration Tests** (15% of tests)
|
|
- Test multiple components together
|
|
- Moderate speed (<1s per test)
|
|
- May use test databases or mock APIs
|
|
- Live in `/core/tests/integration/`
|
|
|
|
**Live Tests** (5% of tests)
|
|
- Test against real external APIs
|
|
- Slow (>1s per test)
|
|
- Require credentials
|
|
- Marked with `@pytest.mark.live` (skipped by default)
|
|
|
|
### Running Tests
|
|
|
|
> **Note:** When testing agents in `exports/`, always set PYTHONPATH:
|
|
>
|
|
> ```bash
|
|
> PYTHONPATH=exports uv run python -m agent_name test
|
|
> ```
|
|
|
|
```bash
|
|
# Run lint and format checks (mirrors CI lint job)
|
|
make check
|
|
|
|
# Run core framework tests (mirrors CI test job)
|
|
make test
|
|
|
|
# Or run tests directly
|
|
cd core && pytest tests/ -v
|
|
|
|
# Run tools package tests (when contributing to tools/)
|
|
cd tools && uv run pytest tests/ -v
|
|
|
|
# Run tests for a specific agent
|
|
PYTHONPATH=exports uv run python -m agent_name test
|
|
|
|
# Run specific test file
|
|
uv run pytest core/tests/test_graph_executor.py
|
|
|
|
# Run specific test function
|
|
uv run pytest core/tests/test_graph_executor.py::test_simple_execution
|
|
|
|
# Run with coverage
|
|
uv run pytest --cov=core --cov-report=html
|
|
|
|
# Run in parallel
|
|
uv run pytest -n auto
|
|
|
|
# Run live tests (requires credentials)
|
|
uv run pytest -m live
|
|
|
|
# Run only fast tests
|
|
uv run pytest -m "not live"
|
|
```
|
|
|
|
> **CI also validates** that all exported agent JSON files (`exports/*/agent.json`) are well-formed JSON. Ensure your agent exports are valid before submitting.
|
|
|
|
### Test Coverage Goals
|
|
|
|
- **Core framework**: >90% coverage
|
|
- **Tools**: >80% coverage (some tools are hard to mock)
|
|
- **Critical paths**: 100% coverage (graph execution, credential handling, LLM calls)
|
|
|
|
### Example: Writing Tests
|
|
|
|
**Unit Test**
|
|
```python
|
|
import pytest
|
|
from framework.orchestrator import NodeSpec as Node
|
|
|
|
def test_node_creation():
|
|
node = Node(id="test", name="Test Node", node_type="event_loop")
|
|
assert node.id == "test"
|
|
assert node.name == "Test Node"
|
|
assert node.node_type == "event_loop"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_node_execution():
|
|
node = Node(id="test", name="Test Node", node_type="event_loop")
|
|
result = await node.execute({"input": "test"})
|
|
assert result["status"] == "success"
|
|
```
|
|
|
|
**Integration Test**
|
|
```python
|
|
import pytest
|
|
from framework.orchestrator.orchestrator import Orchestrator as GraphExecutor
|
|
from framework.orchestrator import NodeSpec as Node
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_graph_execution_with_multiple_nodes():
|
|
nodes = [
|
|
Node(id="node1", ...),
|
|
Node(id="node2", ...),
|
|
]
|
|
edges = [...]
|
|
|
|
executor = GraphExecutor(nodes, edges)
|
|
result = await executor.run({"input": "test"})
|
|
|
|
assert result["status"] == "success"
|
|
assert "node1" in result["executed_nodes"]
|
|
assert "node2" in result["executed_nodes"]
|
|
```
|
|
|
|
**Live Test**
|
|
```python
|
|
import pytest
|
|
import os
|
|
|
|
@pytest.mark.live
|
|
@pytest.mark.asyncio
|
|
async def test_anthropic_real_api():
|
|
"""Test against real Anthropic API (requires ANTHROPIC_API_KEY)"""
|
|
api_key = os.getenv("ANTHROPIC_API_KEY")
|
|
if not api_key:
|
|
pytest.skip("ANTHROPIC_API_KEY not set")
|
|
|
|
provider = AnthropicProvider(api_key=api_key)
|
|
response = await provider.generate([{"role": "user", "content": "What is 2+2?"}])
|
|
|
|
assert "4" in response.content
|
|
```
|
|
|
|
---
|
|
|
|
## Priority Contribution Areas
|
|
|
|
### High-Priority Areas
|
|
|
|
**1. Cross-Platform Support**
|
|
- [ ] Windows installer (`.msi` or `.exe`)
|
|
- [ ] Linux systemd service for daemon mode
|
|
- [ ] macOS app bundle (`.app` distribution)
|
|
- [ ] Docker images (multi-arch: amd64, arm64)
|
|
|
|
**2. Performance & Monitoring**
|
|
- [ ] Comprehensive benchmark suite
|
|
- [ ] Real-time performance dashboard
|
|
- [ ] Cost tracking per agent/workflow
|
|
- [ ] Provider comparison dashboard
|
|
|
|
**3. Developer Experience**
|
|
- [ ] Interactive agent builder CLI
|
|
- [ ] Visual graph editor (web-based)
|
|
- [ ] Improved error messages with suggestions
|
|
- [ ] Auto-generated agent documentation
|
|
|
|
**4. Tool Ecosystem**
|
|
- [ ] More database connectors (ClickHouse, TimescaleDB)
|
|
- [ ] More communication tools (WhatsApp, SMS)
|
|
- [ ] Cloud platform integrations (GCP, Azure)
|
|
- [ ] Developer tools (Figma, Linear, Notion)
|
|
|
|
**5. LLM & AI**
|
|
- [ ] Fine-tuning pipeline for local models
|
|
- [ ] Context window optimization strategies
|
|
- [ ] Multi-modal support (vision, audio)
|
|
- [ ] Embedding-based memory search
|
|
|
|
**6. Testing & Quality**
|
|
- [ ] Increase test coverage to >90%
|
|
- [ ] Add property-based testing (Hypothesis)
|
|
- [ ] Add mutation testing
|
|
- [ ] Add fuzzing for security-critical code
|
|
|
|
**7. Documentation**
|
|
- [ ] Video tutorials for common workflows
|
|
- [ ] Interactive playground (try agents in browser)
|
|
- [ ] Architecture decision records (ADRs)
|
|
- [ ] Case studies from production users
|
|
|
|
### Beginner-Friendly Contributions
|
|
|
|
- [ ] Add sample prompts to `/examples/recipes/`
|
|
- [ ] Improve error messages with helpful hints
|
|
- [ ] Add docstrings to undocumented functions
|
|
- [ ] Write tutorial blog posts
|
|
- [ ] Fix typos in documentation
|
|
- [ ] Add more unit tests to increase coverage
|
|
- [ ] Create visual diagrams for architecture docs
|
|
|
|
### Intermediate Contributions
|
|
|
|
- [ ] Add new tool integrations
|
|
- [ ] Build example agents for specific industries
|
|
- [ ] Optimize slow graph execution paths
|
|
- [ ] Add new LLM provider support
|
|
- [ ] Improve CLI UX with better prompts/colors
|
|
- [ ] Add integration tests for critical workflows
|
|
|
|
### Advanced Contributions
|
|
|
|
- [ ] Design and implement distributed execution
|
|
- [ ] Build advanced judge evaluation methods
|
|
- [ ] Add cross-agent memory sharing
|
|
- [ ] Implement automatic graph optimization
|
|
- [ ] Add support for multi-agent coordination
|
|
- [ ] Build real-time collaboration features
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### `make: command not found`
|
|
Install `make` using:
|
|
|
|
```bash
|
|
sudo apt install make
|
|
```
|
|
|
|
### `uv: command not found`
|
|
Install `uv` using:
|
|
|
|
```bash
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
source ~/.bashrc
|
|
```
|
|
|
|
### `ruff: not found`
|
|
If linting fails due to a missing `ruff` command, install it with:
|
|
|
|
```bash
|
|
uv tool install ruff
|
|
```
|
|
|
|
### WSL Path Recommendation
|
|
When using WSL, it is recommended to clone the repository inside your Linux home directory (e.g., ~/hive) instead of under /mnt/c/... to avoid potential performance and permission issues.
|
|
|
|
### Test Failures
|
|
If tests fail locally but pass in CI:
|
|
1. Make sure you're using Python 3.11+
|
|
2. Run `uv sync` to ensure dependencies are up-to-date
|
|
3. Clear pytest cache: `rm -rf .pytest_cache`
|
|
4. Run tests in verbose mode: `pytest -vv`
|
|
|
|
---
|
|
|
|
## Questions & Community
|
|
|
|
### Where to Get Help
|
|
|
|
- **GitHub Issues** — Bug reports, feature requests
|
|
- **GitHub Discussions** — Questions, ideas, showcase
|
|
- **Discord** — Real-time chat ([join here](https://discord.com/invite/MXE49hrKDk))
|
|
- **Documentation** — `/docs/` and README files
|
|
- **Email** — team@adenhq.com (for security issues only)
|
|
|
|
### Communication Guidelines
|
|
|
|
1. **Be respectful** — We're all here to build something great
|
|
2. **Be patient** — Maintainers are volunteers with day jobs
|
|
3. **Be clear** — Provide context, examples, and reproduction steps
|
|
4. **Be constructive** — Suggest solutions, not just problems
|
|
5. **Be thankful** — Recognize contributions from others
|
|
|
|
### Recognition
|
|
|
|
We recognize contributors through:
|
|
- **Changelog mentions** — Every PR is credited in releases
|
|
- **Leaderboard** — Weekly recognition of top contributors
|
|
- **README credits** — Major contributors listed in README
|
|
- **Swag** — Stickers, t-shirts for significant contributions
|
|
|
|
---
|
|
|
|
## Contributor License Agreement
|
|
|
|
By submitting a Pull Request, you agree that your contributions will be licensed under the Aden Agent Framework license (Apache 2.0).
|
|
|
|
---
|
|
|
|
## Final Thoughts
|
|
|
|
Building open-source software is a marathon, not a sprint. **Quality beats quantity.** We'd rather merge 10 well-tested, thoughtfully-designed features than 100 rushed, buggy ones.
|
|
|
|
As Peter Steinberger (PSPDFKit) says: *"The best code is code that doesn't exist."* Before adding a feature, ask:
|
|
- Is this really needed?
|
|
- Can we solve this with existing tools?
|
|
- Will users actually use this?
|
|
- Can we make it simpler?
|
|
|
|
As Linus Torvalds (Linux) says: *"Talk is cheap. Show me the code."* We value:
|
|
- Working code over lengthy discussions
|
|
- Tests over promises
|
|
- Documentation over assumptions
|
|
- Benchmarks over claims
|
|
|
|
As Anders Hejlsberg (TypeScript) says: *"Make it work, make it right, make it fast."* In that order:
|
|
- First, get it working (pass tests)
|
|
- Then, get it right (clean code, good design)
|
|
- Finally, get it fast (optimize hot paths only)
|
|
|
|
---
|
|
|
|
**Thank you for contributing to Aden Hive.** Together, we're building the most reliable, performant, and developer-friendly AI agent framework in the world.
|
|
|
|
Now go build something amazing. 🚀
|