Files
apress/deploy/uno-q/config.template.toml
T
Omar SobhandClaude Opus 4.8 89602064c6 feat(deploy): Uno Q workshop-node provisioning kit
Codify the verified board setup into a repeatable kit under deploy/uno-q/:

- config.template.toml — the tested node config: cloud / cloud+fallback /
  on-board-Qwen providers, three agents (default / cloud / local) on the
  hardware risk profile, gateway, peripherals. Secrets stripped; cloud
  endpoint substituted at provision time.
- provision-uno-q.sh — one-shot adb-driven provisioner (no root): install
  config, start llama-server + `zeroclaw daemon`, pair for a bearer token,
  and POST /nodes to APESS.
- systemd/{zeroclaw-llama,zeroclaw-daemon}.service — production units
  (daemon, not `gateway start`, so peripheral tools register).
- README.md — dev (adb) and production (systemd + LAN bind) runbooks.

The individual steps are hardware-verified: all three agent aliases resolve
and route correctly on the board (local→Qwen, cloud→cloud, default→cloud
with Qwen fallback). Full script orchestration + live phone-home land once
the api (with /nodes) is redeployed.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-07-03 06:50:06 -07:00

94 lines
3.3 KiB
TOML

schema_version = 3
# ---------------------------------------------------------------------------
# Providers
# ---------------------------------------------------------------------------
# "cloud" primary. During bring-up this points at the local claude_shim
# (adb-reverse tunnel on :8090). For a real fleet, swap in a shared cloud
# endpoint + key, e.g.:
# uri = "https://api.anthropic.com/v1" (or an OpenRouter/LiteLLM gateway)
# api_key = "..." (prefer an env-injected key)
[providers.models.custom.cloud]
uri = "__CLOUD_URI__"
model = "__CLOUD_MODEL__"
native_tools = false
# Same cloud endpoint, but with an on-board Qwen fallback ("cloud first,
# local if it fails"). Used by the `default` agent.
[providers.models.custom.claude]
uri = "__CLOUD_URI__"
model = "__CLOUD_MODEL__"
native_tools = false
fallback = ["llamacpp.local"]
[providers.models.llamacpp]
# On-board Qwen via llama-server (see zeroclaw-llama.service).
[providers.models.llamacpp.local]
uri = "http://127.0.0.1:8083/v1"
model = "qwen"
native_tools = false
[providers.models.custom]
# ---------------------------------------------------------------------------
# Hardware — the Uno Q's onboard MCU over the GPIO bridge.
# ---------------------------------------------------------------------------
[[peripherals.boards]]
board = "arduino-uno-q"
transport = "bridge"
[peripherals]
enabled = true
# ---------------------------------------------------------------------------
# Gateway — the HTTP/WS/SSE surface APESS talks to.
# ---------------------------------------------------------------------------
[gateway]
port = 8080
# Bind 0.0.0.0 + allow_public_bind for a real LAN fleet (participants reach the
# board's WiFi IP). Leave default (localhost) when reaching it over adb-forward.
# host = "0.0.0.0"
# allow_public_bind = true
# paired_tokens are added by the pairing flow (see provision-uno-q.sh); never
# commit a real token.
[skills]
prompt_injection_mode = "compact"
# ---------------------------------------------------------------------------
# Risk profile — only the on-board hardware tools, auto-approved so the agent
# can flash without a human in the loop.
# ---------------------------------------------------------------------------
[risk_profiles.default]
level = "supervised"
allowed_tools = ["uno_q_flash", "sysfs_led", "camera", "network", "i2cdetect"]
auto_approve = ["uno_q_flash", "sysfs_led", "camera", "network", "i2cdetect", "file_read", "content_search"]
[runtime_profiles.unoq]
agentic = true
max_tool_iterations = 6
strict_tool_parsing = false
# ---------------------------------------------------------------------------
# Agents — one per provider strategy. The APESS harness choice routes here via
# ?agent= (see harnessToAgent in src/lib/harness.ts).
# ---------------------------------------------------------------------------
[agents.default] # cloud + on-board Qwen fallback
enabled = true
model_provider = "custom.claude"
risk_profile = "default"
runtime_profile = "unoq"
[agents.cloud] # cloud only, no fallback
enabled = true
model_provider = "custom.cloud"
risk_profile = "default"
runtime_profile = "unoq"
[agents.local] # on-board Qwen only (fully offline)
enabled = true
model_provider = "llamacpp.local"
risk_profile = "default"
runtime_profile = "unoq"