# Setup Configure your LLM provider and model selection for ACE. ## Guided Setup (Recommended) The `ace setup` command walks you through configuration interactively — it validates the connection first, and only asks for credentials if needed. ```bash ace setup ``` ``` ACE Setup Step 1: Choose your model Examples: gpt-4o-mini, claude-sonnet-4-20250514, ollama/llama2 Search models: ace models Default model: gpt-4o-mini v Connected! (gpt-4o-mini via openai, 203ms) Using OPENAI_API_KEY Step 2: Role assignment ACE uses three roles. You can assign a different model to each, or use the same model for all (recommended to start). Use this model for all roles? [Y/n]: n Agent (executes tasks) [gpt-4o-mini]: claude-sonnet-4-20250514 ! No credentials found for anthropic ANTHROPIC_API_KEY: sk-ant-... v Connected! (claude-sonnet-4-20250514 via anthropic, 347ms) v Saved credentials to .env Reflector (analyses results) [gpt-4o-mini]: Skill Manager (updates skillbook) [gpt-4o-mini]: v Saved model config to ace.toml Configuration summary: default: gpt-4o-mini agent: claude-sonnet-4-20250514 ``` The wizard tries the connection immediately — if your credentials are already in the environment (via `.env`, exported variables, or cloud auth like AWS), it just works. It only prompts for keys when the connection actually fails. This creates two files: | File | Contains | Commit to git? | |------|----------|----------------| | `.env` | API keys only | No (gitignore it) | | `ace.toml` | Model names per role | Yes (no secrets) | Then in your code: ```python from ace import ACELiteLLM ace = ACELiteLLM.from_setup() answer = ace.ask("What is 2+2?") ``` ## Manual Setup If you prefer not to use the CLI, set environment variables directly. ### 1. Set API keys === "Shell" ```bash export OPENAI_API_KEY="sk-..." export ANTHROPIC_API_KEY="sk-ant-..." ``` === ".env file" ```bash # .env (add to .gitignore) OPENAI_API_KEY=sk-... ANTHROPIC_API_KEY=sk-ant-... ``` ### 2. Use in code ```python from ace import ACELiteLLM # Single model for all roles ace = ACELiteLLM.from_model("gpt-4o-mini") ``` ```python from ace import ACELiteLLM, ACEModelConfig, ModelConfig # Different models per role ace = ACELiteLLM.from_config(ACEModelConfig( default=ModelConfig(model="gpt-4o-mini"), agent=ModelConfig(model="claude-sonnet-4-20250514"), )) ``` ## Per-Role Model Selection ACE has three roles, each making LLM calls. You can assign different models to optimise cost vs quality: | Role | What it does | Recommendation | |------|-------------|----------------| | **Agent** | Executes tasks, produces answers | Strong reasoning model | | **Reflector** | Analyses results, extracts lessons | Good analysis, lower cost OK | | **Skill Manager** | Updates the skillbook | Structured output reliability | Example `ace.toml`: ```toml [default] model = "gpt-4o-mini" [agent] model = "claude-sonnet-4-20250514" max_tokens = 4096 [reflector] model = "gpt-4o-mini" ``` Roles without an explicit section use `[default]`. ## Discovering Models ### Search available models Use multiple terms to narrow results — all terms must match: ```bash ace models claude # All Claude models ace models haiku us # Only US-region Haiku models ace models gpt 4o # GPT-4o variants ace models --provider openai # All OpenAI models ``` Output shows model name, provider, pricing, and whether your API key is configured: ``` Model Provider Input $/M Output $/M Key ------------------------------------------------------------------------------------------ us.anthropic.claude-haiku-4-5-20251001-v1:0 bedrock_converse $1.10 $5.50 v claude-haiku-4-5-20251001 anthropic $1.00 $5.00 x Showing 20 of 40 models. Narrow your search: ace models or use --limit 40 ``` ### Validate a specific model ```bash ace validate us.anthropic.claude-haiku-4-5-20251001-v1:0 ``` Makes a tiny test call (3 tokens) to confirm the key, model, and network all work. ## Supported Providers ACE uses [LiteLLM](https://docs.litellm.ai/) for model access. Any model string LiteLLM supports will work: | Provider | Model Example | Env Variable | |----------|--------------|--------------| | OpenAI | `gpt-4o-mini` | `OPENAI_API_KEY` | | Anthropic | `claude-sonnet-4-20250514` | `ANTHROPIC_API_KEY` | | AWS Bedrock | `us.anthropic.claude-haiku-4-5-20251001-v1:0` | `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` + `AWS_REGION_NAME` | | Google Gemini | `gemini/gemini-2.0-flash` | `GEMINI_API_KEY` | | DeepSeek | `deepseek/deepseek-chat` | `DEEPSEEK_API_KEY` | | Groq | `groq/llama-3.1-70b` | `GROQ_API_KEY` | | Ollama (local) | `ollama/llama2` | --- | | Azure OpenAI | `azure/gpt-4` | `AZURE_API_KEY` | | OpenRouter | `openrouter/anthropic/claude-3.5-sonnet` | `OPENROUTER_API_KEY` | 100+ providers supported. Run `ace models` to search the full catalog. ## Troubleshooting ### "No ace.toml found" Run `ace setup` or use `ACELiteLLM.from_model("gpt-4o-mini")` instead of `from_setup()`. ### "Invalid API key" ```bash # Re-validate ace validate gpt-4o-mini # Re-run setup to fix ace setup ``` ### "Model not found" The model string may have a typo. `ace validate` and `ace setup` suggest alternatives: ```bash ace validate claud-sonnet # x Model 'claud-sonnet' not found at the provider. # Did you mean: # - claude-sonnet-4-20250514 # - claude-3-5-sonnet-20241022 ``` ### "Could not detect a provider" Use the `provider/model-name` format: ```bash # Instead of just "llama2": ollama/llama2 groq/llama-3.1-70b ``` Search for the correct model string: `ace models llama` ## What to Read Next - [Quick Start](quick-start.md) --- build your first self-learning agent - [How ACE Works](../concepts/overview.md) --- understand the three-role architecture - [Integrations](../integrations/index.md) --- LangChain, Browser-Use, Claude Code