Overview
A well-organized project structure is key to maintainable and deployable AI agents. This guide covers the standard RunAgent project layout and best practices.
Basic Structure
my-agent/
├── agent.py # Main agent implementation
├── runagent.config.json # RunAgent configuration
├── requirements.txt # Python dependencies
├── .env # Environment variables (local only)
├── .env.example # Example environment template
├── .gitignore # Git ignore rules
├── README.md # Project documentation
└── tests/ # Unit tests (optional)
Core Files
agent.py
Your main agent implementation:
# agent.py
def invoke(input_data: dict) -> dict:
"""Main entrypoint for request/response"""
# Your agent logic
return {"response": processed_result}
def stream(input_data: dict):
"""Optional streaming entrypoint"""
for chunk in process_streaming(input_data):
yield chunk
runagent.config.json
Configuration file that tells RunAgent how to run your agent:
{
"agent_name": "my-agent",
"framework": "langgraph",
"version": "1.0.0",
"agent_architecture": {
"entrypoints": [
{
"file": "agent.py",
"module": "invoke",
"type": "generic"
}
]
}
}
requirements.txt
All Python dependencies:
openai>=1.0.0
langchain>=0.1.0
python-dotenv>=1.0.0
# Your other dependencies
Advanced Structure
For larger projects:
my-agent/
├── src/
│ ├── __init__.py
│ ├── agent.py # Main agent
│ ├── models.py # Data models
│ ├── tools.py # Agent tools
│ └── utils.py # Utilities
├── prompts/
│ ├── system.txt # System prompts
│ └── templates.py # Prompt templates
├── config/
│ ├── development.json # Dev config
│ └── production.json # Prod config
├── tests/
│ ├── test_agent.py
│ └── test_tools.py
├── docs/
│ └── API.md
├── runagent.config.json
├── requirements.txt
├── requirements-dev.txt # Dev dependencies
├── Makefile # Common commands
└── README.md
Framework-Specific Structures
LangGraph Projects
langgraph-agent/
├── agents.py # Graph definition
├── nodes/ # Graph nodes
│ ├── __init__.py
│ ├── process.py
│ └── analyze.py
├── edges.py # Edge logic
├── state.py # State schema
├── tools.py # Custom tools
└── runagent.config.json
CrewAI Projects
crewai-project/
├── crew.py # Crew definition
├── agents/ # Individual agents
│ ├── researcher.py
│ ├── writer.py
│ └── reviewer.py
├── tasks/ # Task definitions
│ └── tasks.py
├── tools/ # Shared tools
└── runagent.config.json
File Organization Best Practices
1. Separate Concerns
# Good: Separated modules
# models.py
class InputModel:
pass
# tools.py
def search_tool():
pass
# agent.py
from models import InputModel
from tools import search_tool
2. Configuration Management
# config.py
import os
from typing import Dict
def get_config() -> Dict:
env = os.getenv("ENVIRONMENT", "development")
configs = {
"development": {
"debug": True,
"timeout": 60
},
"production": {
"debug": False,
"timeout": 30
}
}
return configs[env]
3. Modular Entrypoints
# entrypoints.py
from src.agent import Agent
agent = Agent()
def invoke(input_data: dict) -> dict:
return agent.process(input_data)
def stream(input_data: dict):
yield from agent.stream(input_data)
Environment Management
Development
.env
file (never commit):
OPENAI_API_KEY=sk-...
DATABASE_URL=postgresql://...
DEBUG=true
Production
Use RunAgent’s environment variable management:
{
"env_vars": {
"OPENAI_API_KEY": "${OPENAI_API_KEY}",
"DATABASE_URL": "${DATABASE_URL}",
"DEBUG": "false"
}
}
Testing Structure
tests/
├── conftest.py # Pytest configuration
├── fixtures/ # Test data
│ └── sample_input.json
├── unit/ # Unit tests
│ ├── test_agent.py
│ └── test_tools.py
└── integration/ # Integration tests
└── test_api.py
Deployment Files
.gitignore
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
env/
# Environment
.env
.env.local
# IDE
.vscode/
.idea/
*.swp
# OS
.DS_Store
Thumbs.db
# RunAgent
.runagent/
logs/
Makefile
.PHONY: install test run deploy
install:
pip install -r requirements.txt
test:
pytest tests/
run:
runagent serve .
deploy:
runagent deploy .
clean:
find . -type d -name "__pycache__" -exec rm -rf {} +
find . -type f -name "*.pyc" -delete
See Also