Skip to content

Commit 49f8ba6

Browse files
authored
config: support Anthropic, OpenAI, Gemini, and OpenCode Zen providers (#20)
1 parent 29d9f81 commit 49f8ba6

8 files changed

Lines changed: 126 additions & 20 deletions

File tree

.env.schema

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,26 @@
99
# ---
1010

1111
# ── LLM Access ───────────────────────────────────────────────────────────────
12+
# Set at least one. Multiple can coexist — switch models at runtime.
1213

13-
# API key for the LLM provider (Anthropic, OpenAI, or a proxy)
14-
# @required @type=string
15-
# @docs(https://docs.anthropic.com/en/api/getting-started)
14+
# Anthropic API key (Claude models)
15+
# @type=string(startsWith=sk-ant-)
16+
# @docs(https://console.anthropic.com/settings/keys)
17+
ANTHROPIC_API_KEY=
18+
19+
# OpenAI API key (GPT, o-series models)
20+
# @type=string(startsWith=sk-)
21+
# @docs(https://platform.openai.com/api-keys)
22+
OPENAI_API_KEY=
23+
24+
# Google Gemini API key
25+
# @type=string
26+
# @docs(https://aistudio.google.com/apikey)
27+
GEMINI_API_KEY=
28+
29+
# OpenCode Zen API key (multi-provider router)
30+
# @type=string
31+
# @docs(https://opencode.ai)
1632
OPENCODE_ZEN_API_KEY=
1733

1834
# ── GitHub ───────────────────────────────────────────────────────────────────

CONFIGURATION.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@ Baudbot uses [Varlock](https://varlock.dev) to validate environment variables at
1212

1313
### LLM Access
1414

15-
| Variable | Description | How to get it |
16-
|----------|-------------|---------------|
17-
| `OPENCODE_ZEN_API_KEY` | API key for the LLM provider | Your LLM provider dashboard (e.g. Anthropic, OpenAI, or a proxy like OpenCode Zen) |
15+
Set at least one. Multiple can coexist — switch models at runtime via `/model`.
16+
17+
| Variable | Provider | How to get it |
18+
|----------|----------|---------------|
19+
| `ANTHROPIC_API_KEY` | Anthropic (Claude) | [console.anthropic.com/settings/keys](https://console.anthropic.com/settings/keys) |
20+
| `OPENAI_API_KEY` | OpenAI (GPT, o-series) | [platform.openai.com/api-keys](https://platform.openai.com/api-keys) |
21+
| `GEMINI_API_KEY` | Google Gemini | [aistudio.google.com/apikey](https://aistudio.google.com/apikey) |
22+
| `OPENCODE_ZEN_API_KEY` | OpenCode Zen (multi-provider router) | [opencode.ai](https://opencode.ai) |
1823

1924
### GitHub
2025

@@ -90,8 +95,11 @@ Set during `setup.sh` via env vars (or edit `~/.gitconfig` after):
9095
## Example `.env` File
9196

9297
```bash
93-
# LLM
94-
OPENCODE_ZEN_API_KEY=sk-...
98+
# LLM (set at least one)
99+
ANTHROPIC_API_KEY=sk-ant-...
100+
# OPENAI_API_KEY=sk-...
101+
# GEMINI_API_KEY=...
102+
# OPENCODE_ZEN_API_KEY=...
95103

96104
# GitHub
97105
GITHUB_TOKEN=ghp_...

bin/ci/setup-arch.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ sudo -u baudbot_admin bash -c 'cd ~/baudbot && git init -q && git config user.em
2020

2121
echo "=== Running install.sh ==="
2222
# Simulate interactive input: admin user, required secrets, skip optionals, decline launch
23-
printf 'baudbot_admin\nsk-test-key\nghp_testtoken\nxoxb-test\nxapp-test\nU01TEST\n\n\n\n\n\nn\n' \
23+
printf 'baudbot_admin\nsk-ant-testkey\n\n\n\nghp_testtoken\nxoxb-test\nxapp-test\nU01TEST\n\n\n\n\n\nn\n' \
2424
| bash /home/baudbot_admin/baudbot/install.sh
2525

2626
echo "=== Verifying install ==="
@@ -32,7 +32,7 @@ test "$(stat -c '%U' /home/baudbot_agent/.config/.env)" = "baudbot_agent"
3232
test -f /home/baudbot_agent/runtime/start.sh
3333
test -d /home/baudbot_agent/.pi/agent/extensions
3434
# Required secrets written
35-
grep -q "OPENCODE_ZEN_API_KEY=sk-test-key" /home/baudbot_agent/.config/.env
35+
grep -q "ANTHROPIC_API_KEY=sk-ant-testkey" /home/baudbot_agent/.config/.env
3636
grep -q "SLACK_BOT_TOKEN=xoxb-test" /home/baudbot_agent/.config/.env
3737
grep -q "BAUDBOT_SOURCE_DIR=" /home/baudbot_agent/.config/.env
3838
echo " ✓ install.sh verification passed"

bin/ci/setup-ubuntu.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ sudo -u baudbot_admin bash -c 'cd ~/baudbot && git init -q && git config user.em
3131

3232
echo "=== Running install.sh ==="
3333
# Simulate interactive input: admin user, required secrets, skip optionals, decline launch
34-
printf 'baudbot_admin\nsk-test-key\nghp_testtoken\nxoxb-test\nxapp-test\nU01TEST\n\n\n\n\n\nn\n' \
34+
printf 'baudbot_admin\nsk-ant-testkey\n\n\n\nghp_testtoken\nxoxb-test\nxapp-test\nU01TEST\n\n\n\n\n\nn\n' \
3535
| bash /home/baudbot_admin/baudbot/install.sh
3636

3737
echo "=== Verifying install ==="
@@ -43,7 +43,7 @@ test "$(stat -c '%U' /home/baudbot_agent/.config/.env)" = "baudbot_agent"
4343
test -f /home/baudbot_agent/runtime/start.sh
4444
test -d /home/baudbot_agent/.pi/agent/extensions
4545
# Required secrets written
46-
grep -q "OPENCODE_ZEN_API_KEY=sk-test-key" /home/baudbot_agent/.config/.env
46+
grep -q "ANTHROPIC_API_KEY=sk-ant-testkey" /home/baudbot_agent/.config/.env
4747
grep -q "SLACK_BOT_TOKEN=xoxb-test" /home/baudbot_agent/.config/.env
4848
grep -q "BAUDBOT_SOURCE_DIR=" /home/baudbot_agent/.config/.env
4949
echo " ✓ install.sh verification passed"

install.sh

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,38 @@ prompt_secret() {
237237
echo -e "${BOLD}Required${RESET} ${DIM}(agent won't start without these)${RESET}"
238238
echo ""
239239

240+
echo -e "${BOLD}LLM provider${RESET} ${DIM}(set at least one)${RESET}"
241+
echo ""
242+
243+
prompt_secret "ANTHROPIC_API_KEY" \
244+
"Anthropic API key" \
245+
"https://console.anthropic.com/settings/keys" \
246+
"" \
247+
"sk-ant-"
248+
249+
prompt_secret "OPENAI_API_KEY" \
250+
"OpenAI API key" \
251+
"https://platform.openai.com/api-keys" \
252+
"" \
253+
"sk-"
254+
255+
prompt_secret "GEMINI_API_KEY" \
256+
"Google Gemini API key" \
257+
"https://aistudio.google.com/apikey"
258+
240259
prompt_secret "OPENCODE_ZEN_API_KEY" \
241-
"LLM API key (Anthropic/OpenAI)" \
242-
"https://docs.anthropic.com/en/api/getting-started" \
243-
"required"
260+
"OpenCode Zen API key (multi-provider router)" \
261+
"https://opencode.ai"
262+
263+
HAS_LLM_KEY=false
264+
for k in ANTHROPIC_API_KEY OPENAI_API_KEY GEMINI_API_KEY OPENCODE_ZEN_API_KEY; do
265+
if [ -n "${ENV_VARS[$k]:-}" ]; then HAS_LLM_KEY=true; break; fi
266+
done
267+
if [ "$HAS_LLM_KEY" = false ]; then
268+
warn "No LLM key set — agent needs at least one to work"
269+
fi
270+
271+
echo ""
244272

245273
prompt_secret "GITHUB_TOKEN" \
246274
"GitHub personal access token" \
@@ -321,6 +349,9 @@ ENV_CONTENT="# Baudbot agent configuration
321349

322350
# Write in a sensible order
323351
ordered_keys=(
352+
ANTHROPIC_API_KEY
353+
OPENAI_API_KEY
354+
GEMINI_API_KEY
324355
OPENCODE_ZEN_API_KEY
325356
GITHUB_TOKEN
326357
SLACK_BOT_TOKEN
@@ -358,7 +389,14 @@ header "Launch"
358389

359390
# Check if we have the minimum required secrets
360391
MISSING=""
361-
for key in OPENCODE_ZEN_API_KEY GITHUB_TOKEN SLACK_BOT_TOKEN SLACK_APP_TOKEN SLACK_ALLOWED_USERS; do
392+
HAS_LLM=false
393+
for k in ANTHROPIC_API_KEY OPENAI_API_KEY GEMINI_API_KEY OPENCODE_ZEN_API_KEY; do
394+
if [ -n "${ENV_VARS[$k]:-}" ]; then HAS_LLM=true; break; fi
395+
done
396+
if [ "$HAS_LLM" = false ]; then
397+
MISSING+=" - LLM key (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OPENCODE_ZEN_API_KEY)\n"
398+
fi
399+
for key in GITHUB_TOKEN SLACK_BOT_TOKEN SLACK_APP_TOKEN SLACK_ALLOWED_USERS; do
362400
if [ -z "${ENV_VARS[$key]:-}" ]; then
363401
MISSING+=" - $key\n"
364402
fi

pi/settings.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
{
22
"lastChangelogVersion": "0.52.12",
3-
"defaultProvider": "opencode-zen",
4-
"defaultModel": "claude-opus-4-6",
53
"skills": [
64
"~/.pi/agent/skills"
75
],

pi/skills/control-agent/SKILL.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,17 @@ If dev-agent reports repeated failures (e.g. CI failing after 3+ fix attempts, o
150150

151151
## Spawning a Dev Agent
152152

153+
Pick the model based on which API key is available (check env vars in this order):
154+
155+
**Coding / orchestration (top-tier):**
156+
157+
| API key | Model |
158+
|---------|-------|
159+
| `ANTHROPIC_API_KEY` | `anthropic/claude-opus-4-6` |
160+
| `OPENAI_API_KEY` | `openai/gpt-5.2-codex` |
161+
| `GEMINI_API_KEY` | `google/gemini-3-pro-preview` |
162+
| `OPENCODE_ZEN_API_KEY` | `opencode-zen/claude-opus-4-6` |
163+
153164
Full procedure for spinning up a task-scoped dev agent:
154165

155166
```bash
@@ -170,7 +181,7 @@ tmux new-session -d -s $SESSION_NAME \
170181
"cd ~/workspace/worktrees/$BRANCH && \
171182
export PATH=\$HOME/.varlock/bin:\$HOME/opt/node-v22.14.0-linux-x64/bin:\$PATH && \
172183
export PI_SESSION_NAME=$SESSION_NAME && \
173-
exec varlock run --path ~/.config/ -- pi --session-control --skill ~/.pi/agent/skills/dev-agent"
184+
exec varlock run --path ~/.config/ -- pi --session-control --skill ~/.pi/agent/skills/dev-agent --model <MODEL_FROM_TABLE_ABOVE>"
174185
```
175186

176187
**Important notes:**
@@ -331,6 +342,27 @@ The script:
331342

332343
**Note**: Dev agents are NOT started at startup. They are spawned on-demand when tasks arrive.
333344

345+
### Spawning sentry-agent
346+
347+
The sentry-agent triages Sentry alerts and investigates critical issues via the Sentry API. It runs on a cheap model to save tokens.
348+
349+
**Triage (cheap):**
350+
351+
| API key | Model |
352+
|---------|-------|
353+
| `ANTHROPIC_API_KEY` | `anthropic/claude-haiku-4-5` |
354+
| `OPENAI_API_KEY` | `openai/gpt-5-mini` |
355+
| `GEMINI_API_KEY` | `google/gemini-3-flash-preview` |
356+
| `OPENCODE_ZEN_API_KEY` | `opencode-zen/claude-haiku-4-5` |
357+
358+
```bash
359+
tmux new-session -d -s sentry-agent "export PATH=\$HOME/.varlock/bin:\$HOME/opt/node-v22.14.0-linux-x64/bin:\$PATH && export PI_SESSION_NAME=sentry-agent && varlock run --path ~/.config/ -- pi --session-control --skill ~/.pi/agent/skills/sentry-agent --model <MODEL_FROM_TABLE_ABOVE>"
360+
```
361+
362+
**Model note**: `github-copilot/*` models reject Personal Access Tokens and will fail in non-interactive sessions.
363+
364+
The sentry-agent operates in **on-demand mode** — it does NOT poll. Sentry alerts arrive via the Slack bridge in real-time and are forwarded by you. The sentry-agent uses `sentry_monitor get <issue_id>` to investigate when asked.
365+
334366
### Starting the Slack Bridge
335367

336368
The Slack bridge (Socket Mode) receives real-time Slack events and forwards them to this session via port 7890.

start.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ umask 077
3636
# Set session name (read by auto-name.ts extension)
3737
export PI_SESSION_NAME="control-agent"
3838

39+
# Pick model based on available API keys (first match wins)
40+
if [ -n "${ANTHROPIC_API_KEY:-}" ]; then
41+
MODEL="anthropic/claude-opus-4-6"
42+
elif [ -n "${OPENAI_API_KEY:-}" ]; then
43+
MODEL="openai/gpt-5.2-codex"
44+
elif [ -n "${GEMINI_API_KEY:-}" ]; then
45+
MODEL="google/gemini-3-pro-preview"
46+
elif [ -n "${OPENCODE_ZEN_API_KEY:-}" ]; then
47+
MODEL="opencode-zen/claude-opus-4-6"
48+
else
49+
echo "❌ No LLM API key found — set ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OPENCODE_ZEN_API_KEY"
50+
exit 1
51+
fi
52+
3953
# Start control-agent
4054
# --session-control: enables inter-session communication (handled by control.ts extension)
41-
pi --session-control --skill ~/.pi/agent/skills/control-agent "/skill:control-agent"
55+
pi --session-control --model "$MODEL" --skill ~/.pi/agent/skills/control-agent "/skill:control-agent"

0 commit comments

Comments
 (0)