Configuration
This page covers all configuration options for Anvil.
Environment Variables
Section titled “Environment Variables”LLM Provider Keys
Section titled “LLM Provider Keys”| Variable | Provider | Description |
|---|---|---|
ANTHROPIC_API_KEY | Anthropic | Claude API key |
OPENAI_API_KEY | OpenAI | GPT-4 API key |
XAI_API_KEY | xAI | Grok API key |
Optional Keys
Section titled “Optional Keys”| Variable | Description |
|---|---|
FIRECRAWL_API_KEY | For fetching API documentation |
Setting Variables
Section titled “Setting Variables”# In terminalexport ANTHROPIC_API_KEY="sk-ant-..."
# In .env fileANTHROPIC_API_KEY=sk-ant-...FIRECRAWL_API_KEY=fc-...Anvil Constructor Options
Section titled “Anvil Constructor Options”Basic Options
Section titled “Basic Options”from anvil import Anvil
anvil = Anvil( # LLM Provider provider="anthropic", # "anthropic", "openai", "grok" model=None, # Provider-specific default if None api_key=None, # From environment if None
# Tool Storage tools_dir="./anvil_tools", # Where to save generated tools)Self-Healing Options
Section titled “Self-Healing Options”anvil = Anvil( self_healing=True, # Enable automatic regeneration max_heal_attempts=2, # Max retries before giving up)Generator Mode
Section titled “Generator Mode”anvil = Anvil( mode="local", # "local", "stub", or "cloud" use_stub=False, # Shorthand for mode="stub")| Mode | Description |
|---|---|
local | Use LLM to generate tools (default) |
stub | Generate placeholder tools (no LLM) |
cloud | Use Anvil Cloud (coming soon) |
Credential Options
Section titled “Credential Options”anvil = Anvil( interactive_credentials=True, # Prompt for missing keys env_file=".env", # Where to save credentials)Security Options
Section titled “Security Options”from anvil.sandbox import SecurityPolicy
anvil = Anvil( verified_mode=True, # Verify code in sandbox security_policy=SecurityPolicy( # Custom policy allow_network=True, allow_subprocess=False, ),)Logging Options
Section titled “Logging Options”anvil = Anvil( log_file="./anvil.log", # Enable file logging)SecurityPolicy Options
Section titled “SecurityPolicy Options”from anvil.sandbox import SecurityPolicy
policy = SecurityPolicy( # Network allow_network=False, allowed_hosts=None, # ["api.example.com"]
# Filesystem allow_filesystem_read=True, allow_filesystem_write=False, allowed_paths=None, # ["/tmp", "./data"]
# System allow_subprocess=False, allow_env_access=True,
# Resource Limits max_memory_mb=256, max_cpu_seconds=30.0, max_output_size_kb=1024,
# Custom Blocks blocked_imports=None, # Additional imports to block blocked_functions=None, # Additional functions to block)InputParam Options
Section titled “InputParam Options”from anvil import InputParam
param = InputParam( name="query", # Parameter name param_type="str", # "str", "int", "float", "bool", "list" required=True, # Is this required? description="Search query", # Help text default=None, # Default value)Default Models
Section titled “Default Models”When model=None, these defaults are used:
| Provider | Default Model |
|---|---|
| Anthropic | claude-sonnet-4-20250514 |
| OpenAI | gpt-4o |
| Grok | grok-2-latest |
File Structure
Section titled “File Structure”After initialization, your project structure:
my-project/├── .env # API keys (gitignored)├── .gitignore # Protects .env├── anvil_tools/│ ├── __init__.py│ ├── tool_registry.json # Tool metadata│ ├── search_github.py # Generated tool│ └── get_weather.py # Generated tool├── anvil.log # Event log (if enabled)└── main.py # Your codeTool Registry Format
Section titled “Tool Registry Format”anvil_tools/tool_registry.json:
{ "search_github": { "name": "search_github", "intent": "Search GitHub repositories", "docs_url": "https://docs.github.com/...", "hash": "a1b2c3d4e5f6", "version": "1.0", "status": "active", "created_at": "2025-01-18T10:00:00Z", "last_generated": "2025-01-18T10:00:00Z", "error_count": 0 }}Generated Tool Format
Section titled “Generated Tool Format”anvil_tools/search_github.py:
# ---# ANVIL-MANAGED: true# INTENT-HASH: a1b2c3d4e5f6# ---
import requests
def run(query: str, **kwargs) -> dict: """Search GitHub repositories.""" response = requests.get( "https://api.github.com/search/repositories", params={"q": query} ) response.raise_for_status() return response.json()Log File Format
Section titled “Log File Format”JSON Lines format (one JSON object per line):
{"timestamp": "2025-01-18T10:00:00Z", "event_type": "tool_generated", "tool_name": "search_github", "duration_ms": 1250.5, "metadata": {}}{"timestamp": "2025-01-18T10:00:01Z", "event_type": "tool_executed", "tool_name": "search_github", "duration_ms": 150.2, "metadata": {}}Recommended Configurations
Section titled “Recommended Configurations”Development
Section titled “Development”anvil = Anvil( tools_dir="./anvil_tools", self_healing=True, interactive_credentials=True,)Testing
Section titled “Testing”anvil = Anvil( use_stub=True, # No LLM calls self_healing=False,)Production
Section titled “Production”anvil = Anvil( tools_dir="/app/tools", self_healing=True, max_heal_attempts=1, verified_mode=True, interactive_credentials=False, log_file="/var/log/anvil/anvil.log",)anvil = Anvil( use_stub=True, interactive_credentials=False,)