fix: infra: agents-llama (local-Qwen dev agent) is hand-added to docker-compose.yml — move into lib/generators.sh as a flagged service (#769)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
be463c5b43
commit
0104ac06a8
5 changed files with 120 additions and 0 deletions
|
|
@ -94,6 +94,13 @@ FORWARD_AUTH_SECRET= # [SECRET] Shared secret for Caddy ↔
|
||||||
# Store all project secrets here so formulas reference env vars, never hardcode.
|
# Store all project secrets here so formulas reference env vars, never hardcode.
|
||||||
BASE_RPC_URL= # [SECRET] on-chain RPC endpoint
|
BASE_RPC_URL= # [SECRET] on-chain RPC endpoint
|
||||||
|
|
||||||
|
# ── Local Qwen dev agent (optional) ──────────────────────────────────────
|
||||||
|
# Set ENABLE_LLAMA_AGENT=1 to emit agents-llama in docker-compose.yml.
|
||||||
|
# Requires a running llama-server reachable at ANTHROPIC_BASE_URL.
|
||||||
|
# See docs/agents-llama.md for details.
|
||||||
|
ENABLE_LLAMA_AGENT=0 # [CONFIG] 1 = enable agents-llama service
|
||||||
|
ANTHROPIC_BASE_URL= # [CONFIG] e.g. http://host.docker.internal:8081
|
||||||
|
|
||||||
# ── Tuning ────────────────────────────────────────────────────────────────
|
# ── Tuning ────────────────────────────────────────────────────────────────
|
||||||
CLAUDE_TIMEOUT=7200 # [CONFIG] max seconds per Claude invocation
|
CLAUDE_TIMEOUT=7200 # [CONFIG] max seconds per Claude invocation
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ bash dev/phase-test.sh
|
||||||
| Reproduce | `docker/reproduce/` | Bug reproduction using Playwright MCP | `formulas/reproduce.toml` |
|
| Reproduce | `docker/reproduce/` | Bug reproduction using Playwright MCP | `formulas/reproduce.toml` |
|
||||||
| Triage | `docker/reproduce/` | Deep root cause analysis | `formulas/triage.toml` |
|
| Triage | `docker/reproduce/` | Deep root cause analysis | `formulas/triage.toml` |
|
||||||
| Edge dispatcher | `docker/edge/` | Polls ops repo for vault actions, executes via Claude sessions | `docker/edge/dispatcher.sh` |
|
| Edge dispatcher | `docker/edge/` | Polls ops repo for vault actions, executes via Claude sessions | `docker/edge/dispatcher.sh` |
|
||||||
|
| agents-llama | `docker/agents/` (same image) | Local-Qwen dev agent (`AGENT_ROLES=dev`), gated on `ENABLE_LLAMA_AGENT=1` | [docs/agents-llama.md](docs/agents-llama.md) |
|
||||||
|
|
||||||
> **Vault:** Being redesigned as a PR-based approval workflow (issues #73-#77).
|
> **Vault:** Being redesigned as a PR-based approval workflow (issues #73-#77).
|
||||||
> See [docs/VAULT.md](docs/VAULT.md) for the vault PR workflow details.
|
> See [docs/VAULT.md](docs/VAULT.md) for the vault PR workflow details.
|
||||||
|
|
|
||||||
13
bin/disinto
13
bin/disinto
|
|
@ -890,6 +890,19 @@ p.write_text(text)
|
||||||
echo "Config: CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 saved to .env"
|
echo "Config: CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 saved to .env"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Write local-Qwen dev agent env keys with safe defaults (#769)
|
||||||
|
if ! grep -q '^ENABLE_LLAMA_AGENT=' "$env_file" 2>/dev/null; then
|
||||||
|
cat >> "$env_file" <<'LLAMAENVEOF'
|
||||||
|
|
||||||
|
# Local Qwen dev agent (optional) — set to 1 to enable
|
||||||
|
ENABLE_LLAMA_AGENT=0
|
||||||
|
FORGE_TOKEN_LLAMA=
|
||||||
|
FORGE_PASS_LLAMA=
|
||||||
|
ANTHROPIC_BASE_URL=
|
||||||
|
LLAMAENVEOF
|
||||||
|
echo "Config: ENABLE_LLAMA_AGENT keys written to .env (disabled by default)"
|
||||||
|
fi
|
||||||
|
|
||||||
# Create labels on remote
|
# Create labels on remote
|
||||||
create_labels "$forge_repo" "$forge_url"
|
create_labels "$forge_repo" "$forge_url"
|
||||||
|
|
||||||
|
|
|
||||||
42
docs/agents-llama.md
Normal file
42
docs/agents-llama.md
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# agents-llama — Local-Qwen Dev Agent
|
||||||
|
|
||||||
|
The `agents-llama` service is an optional compose service that runs a dev agent
|
||||||
|
backed by a local llama-server instance (e.g. Qwen) instead of the Anthropic
|
||||||
|
API. It uses the same Docker image as the main `agents` service but connects to
|
||||||
|
a local inference endpoint via `ANTHROPIC_BASE_URL`.
|
||||||
|
|
||||||
|
## Enabling
|
||||||
|
|
||||||
|
Set `ENABLE_LLAMA_AGENT=1` in `.env` (or `.env.enc`) and provide the required
|
||||||
|
credentials:
|
||||||
|
|
||||||
|
```env
|
||||||
|
ENABLE_LLAMA_AGENT=1
|
||||||
|
FORGE_TOKEN_LLAMA=<dev-qwen API token>
|
||||||
|
FORGE_PASS_LLAMA=<dev-qwen password>
|
||||||
|
ANTHROPIC_BASE_URL=http://host.docker.internal:8081 # llama-server endpoint
|
||||||
|
```
|
||||||
|
|
||||||
|
Then regenerate the compose file (`disinto init ...`) and bring the stack up.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- **llama-server** (or compatible OpenAI-API endpoint) running on the host,
|
||||||
|
reachable from inside Docker at the URL set in `ANTHROPIC_BASE_URL`.
|
||||||
|
- A Forgejo bot user (e.g. `dev-qwen`) with its own API token and password,
|
||||||
|
stored as `FORGE_TOKEN_LLAMA` / `FORGE_PASS_LLAMA`.
|
||||||
|
|
||||||
|
## Behaviour
|
||||||
|
|
||||||
|
- `AGENT_ROLES=dev` — the llama agent only picks up dev work.
|
||||||
|
- `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=60` — more aggressive compaction for smaller
|
||||||
|
context windows.
|
||||||
|
- `depends_on: forgejo (service_healthy)` — does **not** depend on Woodpecker
|
||||||
|
(the llama agent doesn't need CI).
|
||||||
|
- Serialises on the llama-server's single KV cache (AD-002).
|
||||||
|
|
||||||
|
## Disabling
|
||||||
|
|
||||||
|
Set `ENABLE_LLAMA_AGENT=0` (or leave it unset) and regenerate. The service
|
||||||
|
block is omitted entirely from `docker-compose.yml`; the stack starts cleanly
|
||||||
|
without it.
|
||||||
|
|
@ -381,6 +381,63 @@ services:
|
||||||
networks:
|
networks:
|
||||||
- disinto-net
|
- disinto-net
|
||||||
|
|
||||||
|
COMPOSEEOF
|
||||||
|
|
||||||
|
# ── Conditional agents-llama block (ENABLE_LLAMA_AGENT=1) ──────────────
|
||||||
|
# Local-Qwen dev agent — gated on ENABLE_LLAMA_AGENT so factories without
|
||||||
|
# a local llama endpoint don't try to start it. See docs/agents-llama.md.
|
||||||
|
if [ "${ENABLE_LLAMA_AGENT:-0}" = "1" ]; then
|
||||||
|
cat >> "$compose_file" <<'LLAMAEOF'
|
||||||
|
|
||||||
|
agents-llama:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: docker/agents/Dockerfile
|
||||||
|
container_name: disinto-agents-llama
|
||||||
|
restart: unless-stopped
|
||||||
|
security_opt:
|
||||||
|
- apparmor=unconfined
|
||||||
|
volumes:
|
||||||
|
- agent-data:/home/agent/data
|
||||||
|
- project-repos:/home/agent/repos
|
||||||
|
- ${CLAUDE_SHARED_DIR:-/var/lib/disinto/claude-shared}:${CLAUDE_SHARED_DIR:-/var/lib/disinto/claude-shared}
|
||||||
|
- ${HOME}/.claude.json:/home/agent/.claude.json:ro
|
||||||
|
- CLAUDE_BIN_PLACEHOLDER:/usr/local/bin/claude:ro
|
||||||
|
- ${HOME}/.ssh:/home/agent/.ssh:ro
|
||||||
|
- ${HOME}/.config/sops/age:/home/agent/.config/sops/age:ro
|
||||||
|
- woodpecker-data:/woodpecker-data:ro
|
||||||
|
environment:
|
||||||
|
FORGE_URL: http://forgejo:3000
|
||||||
|
FORGE_REPO: ${FORGE_REPO:-disinto-admin/disinto}
|
||||||
|
FORGE_TOKEN: ${FORGE_TOKEN_LLAMA:-}
|
||||||
|
FORGE_PASS: ${FORGE_PASS_LLAMA:-}
|
||||||
|
FORGE_BOT_USERNAMES: ${FORGE_BOT_USERNAMES:-}
|
||||||
|
WOODPECKER_TOKEN: ${WOODPECKER_TOKEN:-}
|
||||||
|
CLAUDE_TIMEOUT: ${CLAUDE_TIMEOUT:-7200}
|
||||||
|
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: ${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-1}
|
||||||
|
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE: "60"
|
||||||
|
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
||||||
|
ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-}
|
||||||
|
FORGE_ADMIN_PASS: ${FORGE_ADMIN_PASS:-}
|
||||||
|
DISINTO_CONTAINER: "1"
|
||||||
|
PROJECT_NAME: ${PROJECT_NAME:-project}
|
||||||
|
PROJECT_REPO_ROOT: /home/agent/repos/${PROJECT_NAME:-project}
|
||||||
|
WOODPECKER_DATA_DIR: /woodpecker-data
|
||||||
|
WOODPECKER_REPO_ID: "PLACEHOLDER_WP_REPO_ID"
|
||||||
|
CLAUDE_CONFIG_DIR: ${CLAUDE_CONFIG_DIR:-/var/lib/disinto/claude-shared/config}
|
||||||
|
POLL_INTERVAL: ${POLL_INTERVAL:-300}
|
||||||
|
AGENT_ROLES: dev
|
||||||
|
depends_on:
|
||||||
|
forgejo:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- disinto-net
|
||||||
|
LLAMAEOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Resume the rest of the compose file (runner onward)
|
||||||
|
cat >> "$compose_file" <<'COMPOSEEOF'
|
||||||
|
|
||||||
runner:
|
runner:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue