- Add configrefresh package for config classification, request handling - Add bootstrap refresh_admin.go for admin-level config refresh - Add edgevalidate package for config validation - Update edge bootstrap runtime with refresh capabilities - Update edge service layer with config refresh integration - Update openai layer routes/chat_handler/server for config refresh - Update edgecmd config handling with refresh support - Update input manager, transport server, status provider - Add edge.yaml config updates and go/config package changes - Add hostsetup templates and test updates - Update roadmap and phase documentation for runtime-reconnect-config-refresh
307 lines
10 KiB
YAML
307 lines
10 KiB
YAML
edge:
|
|
id: "edge-example"
|
|
name: "Example Edge"
|
|
|
|
server:
|
|
listen: "0.0.0.0:9090"
|
|
# advertise_host is the host other components (Node bootstrap, OpenAI client)
|
|
# use to reach this edge. Empty means resolve automatically from interfaces.
|
|
advertise_host: ""
|
|
|
|
# bootstrap is the artifact/bootstrap channel iop-edge can render in
|
|
# bootstrap commands and `env` output. Leave artifact_base_url empty until a
|
|
# field channel is provisioned.
|
|
bootstrap:
|
|
artifact_base_url: ""
|
|
|
|
tls:
|
|
enabled: false
|
|
|
|
logging:
|
|
level: "info"
|
|
pretty: true
|
|
# path is the edge log file. Empty falls back to <binary-dir>/logs/edge.log
|
|
# for the bundled dev binary; explicit values win.
|
|
path: ""
|
|
|
|
metrics:
|
|
port: 19092
|
|
|
|
# control_plane connects this Edge to a Control Plane instance.
|
|
# Set enabled: true and wire_addr to the Control Plane TCP endpoint to
|
|
# activate the outbound connector. Leave enabled: false (default) for
|
|
# standalone / local-only Edge deployments.
|
|
control_plane:
|
|
enabled: false
|
|
wire_addr: ""
|
|
reconnect_interval_sec: 5
|
|
|
|
# refresh enables the Edge-local admin API used by `iop-edge config refresh`.
|
|
# Keep it loopback-only unless an operator-specific access control layer is added.
|
|
refresh:
|
|
enabled: false
|
|
listen: "127.0.0.1:19093"
|
|
|
|
a2a:
|
|
enabled: false
|
|
listen: "0.0.0.0:8081"
|
|
path: "/a2a"
|
|
node: ""
|
|
adapter: "cli"
|
|
session_id: "a2a"
|
|
timeout_sec: 120
|
|
bearer_token: ""
|
|
|
|
openai:
|
|
enabled: false
|
|
listen: "0.0.0.0:18081"
|
|
node: ""
|
|
adapter: "ollama"
|
|
target: ""
|
|
models: []
|
|
# model_routes is the current compatibility route catalog. It maps external
|
|
# model ids to internal adapter/target routing.
|
|
# When set, /v1/models exposes these ids and /v1/chat/completions + /v1/responses
|
|
# resolve adapter/target per-entry. Entries not matched fall back to target/adapter above.
|
|
# workspace_required: true marks CLI agent routes that require a workspace path from the caller.
|
|
# max_queue and queue_timeout_ms configure the Edge-owned queue policy for the model alias.
|
|
#
|
|
# Provider-pool migration direction:
|
|
# - Keep the external model id as the future models[].id canonical routing key.
|
|
# - Represent a 1:1 model_route as one models[] entry with one provider id.
|
|
# - Use the route target as models[].providers[provider_id], the concrete served model.
|
|
# - Continue sending adapter + target to Node after Edge rewrites the selected provider target.
|
|
# model_routes (legacy/adapter/type reference):
|
|
# - model: "codex"
|
|
# adapter: "cli"
|
|
# target: "codex"
|
|
# workspace_required: true
|
|
# - model: "llama3"
|
|
# adapter: "ollama"
|
|
# target: "llama3:8b"
|
|
# max_queue: 10
|
|
# queue_timeout_ms: 30000
|
|
#
|
|
# # adapter: "vllm" — legacy path: node runs the built-in vllm adapter
|
|
# # (direct HTTP-to-vLLM-engine). Deprecated/discouraged for new deploys.
|
|
# # New deploys should use openai_compat adapter with provider="vllm"
|
|
# # instead, so that auth/headers/options can be configured per-route.
|
|
# - model: "qwen3"
|
|
# adapter: "vllm" # legacy — prefer openai_compat+provider:vllm
|
|
# target: "qwen3-72b"
|
|
# node: "node-gpu-01"
|
|
#
|
|
# - model: "lemonade"
|
|
# adapter: "openai_compat"
|
|
# target: "lemonade-served-model"
|
|
# node: "node-lemonade-01"
|
|
#
|
|
# vLLM OpenAI-compatible provider example (recommended for new deploys):
|
|
# 1. Define the route alias in model_routes with adapter="openai_compat"
|
|
# and target set to the served model id (no provider field here).
|
|
# 2. Define the vLLM instance in nodes[].adapters.openai_compat_instances
|
|
# with provider="vllm", endpoint, and queue policy.
|
|
# - alias: "qwen3.6:35b", served model: "nvidia/Qwen3.6-35B-A3B-NVFP4"
|
|
# model_routes:
|
|
# - model: "qwen3.6:35b"
|
|
# adapter: "openai_compat"
|
|
# target: "nvidia/Qwen3.6-35B-A3B-NVFP4"
|
|
# node: "node-vllm-01"
|
|
# max_queue: 10
|
|
# queue_timeout_ms: 30000
|
|
#
|
|
# === Provider-pool (models[] / nodes[].providers[]) example ===
|
|
# Top-level models[] defines canonical routing keys and their provider-pool mapping.
|
|
# Each entry id is the external model id; providers map maps provider id → served model.
|
|
# models:
|
|
# - id: "qwen3.6:35b"
|
|
# display_name: "Qwen 3.6 35B"
|
|
# providers:
|
|
# vllm-gpu: "nvidia/Qwen3.6-35B-A3B-NVFP4"
|
|
# ollama-local: "qwen3.6:35b"
|
|
#
|
|
# nodes[].providers[] defines each provider candidate with catalog fields.
|
|
# nodes[].providers[].id is the stable provider identity referenced by models[].providers keys.
|
|
# nodes[].providers[].type — runtime type (vllm, ollama, lemonade, sglang, openai_api, cli).
|
|
# nodes[].providers[].category — "api", "cli", or "local_inference".
|
|
# nodes[].providers[].adapter — concrete adapter instance key used by edge to dispatch.
|
|
# nodes[].providers[].models — served model names this provider can serve.
|
|
# nodes[].providers[].health — observed health state string.
|
|
# nodes[].providers[].capacity — max concurrent execution slots.
|
|
# nodes[].providers[].max_queue — max queue depth (per-provider).
|
|
# nodes[].providers[].queue_timeout_ms — queue timeout in milliseconds.
|
|
# nodes[].providers[].lifecycle_capabilities — coarse lifecycle capabilities list.
|
|
#
|
|
# Example node with provider pool:
|
|
# nodes:
|
|
# - id: "node-gpu-01"
|
|
# alias: "gpu-node"
|
|
# providers:
|
|
# - id: "vllm-gpu"
|
|
# type: "vllm"
|
|
# category: "api"
|
|
# adapter: "vllm-gpu"
|
|
# models:
|
|
# - "nvidia/Qwen3.6-35B-A3B-NVFP4"
|
|
# health: "healthy"
|
|
# capacity: 4
|
|
# max_queue: 16
|
|
# queue_timeout_ms: 30000
|
|
# lifecycle_capabilities: ["scale_up", "scale_down"]
|
|
# - id: "ollama-local"
|
|
# type: "ollama"
|
|
# category: "local_inference"
|
|
# adapter: "ollama-local"
|
|
# models:
|
|
# - "qwen3.6:35b"
|
|
# health: "healthy"
|
|
# capacity: 2
|
|
# max_queue: 8
|
|
# queue_timeout_ms: 30000
|
|
# - id: "node-vllm-01"
|
|
# alias: "vllm-gpu-node"
|
|
# token: "<node-token>"
|
|
# adapters:
|
|
# openai_compat_instances:
|
|
# - name: "vllm-gpu"
|
|
# enabled: true
|
|
# provider: "vllm"
|
|
# endpoint: "http://127.0.0.1:8000/v1"
|
|
# # headers: no default auth (use proxy/credential path)
|
|
# capacity: 4
|
|
# max_queue: 16
|
|
# queue_timeout_ms: 30000
|
|
# request_timeout_ms: 120000
|
|
session_id: "openai"
|
|
timeout_sec: 120
|
|
strict_output: true
|
|
strict_stream_buffer: false
|
|
|
|
console:
|
|
adapter: "cli"
|
|
target: "codex"
|
|
session_id: "default"
|
|
background: false
|
|
timeout_sec: 240
|
|
|
|
nodes:
|
|
# id is the stable node identity; omitting it falls back to an auto UUID (dev only).
|
|
# agent_kind selects the registration kind; omitting it defaults to "generic-node".
|
|
# Allowed values: "generic-node" (default).
|
|
#
|
|
# Single-adapter example (legacy style — still supported):
|
|
- id: "node-example-01"
|
|
alias: "example-node"
|
|
token: "<node-token>"
|
|
agent_kind: "generic-node"
|
|
adapters:
|
|
ollama:
|
|
enabled: false
|
|
base_url: ""
|
|
context_size: 0
|
|
# capacity is the per-node concurrent execution slot limit.
|
|
capacity: 0
|
|
# max_queue and queue_timeout_ms are fallbacks used only if not specified in route-level queue policy.
|
|
max_queue: 0
|
|
queue_timeout_ms: 0
|
|
request_timeout_ms: 0
|
|
vllm:
|
|
enabled: false
|
|
endpoint: ""
|
|
capacity: 0
|
|
max_queue: 0
|
|
queue_timeout_ms: 0
|
|
request_timeout_ms: 0
|
|
cli:
|
|
enabled: true
|
|
profiles:
|
|
claude-tui:
|
|
command: "claude"
|
|
args:
|
|
- "--dangerously-skip-permissions"
|
|
env:
|
|
- "TERM=xterm-256color"
|
|
persistent: true
|
|
terminal: true
|
|
response_idle_timeout_ms: 5000
|
|
startup_idle_timeout_ms: 5000
|
|
mode: "persistent-lazy"
|
|
codex:
|
|
command: "codex"
|
|
args:
|
|
- "app-server"
|
|
env: []
|
|
persistent: false
|
|
terminal: false
|
|
mode: "codex-app-server"
|
|
codex-exec:
|
|
command: "codex"
|
|
args:
|
|
- "exec"
|
|
- "--json"
|
|
resume_args:
|
|
- "exec"
|
|
- "resume"
|
|
- "--json"
|
|
env: []
|
|
persistent: false
|
|
terminal: false
|
|
output_format: "codex-json"
|
|
mode: "codex-exec"
|
|
runtime:
|
|
concurrency: 1
|
|
workspace_root: ""
|
|
|
|
# Multi-adapter example: two Ollama instances + CLI profiles on one node.
|
|
# Each ollama_instances entry requires a unique "name" within the node.
|
|
# - id: "node-multi-01"
|
|
# alias: "multi-engine-node"
|
|
# token: "<node-token>"
|
|
# adapters:
|
|
# ollama_instances:
|
|
# - name: "ollama-local"
|
|
# enabled: true
|
|
# base_url: "http://127.0.0.1:11434"
|
|
# context_size: 131072
|
|
# # capacity is the per-node concurrent execution slot limit.
|
|
# capacity: 4
|
|
# # max_queue and queue_timeout_ms are fallbacks used only if not specified in route-level queue policy.
|
|
# max_queue: 16
|
|
# queue_timeout_ms: 30000
|
|
# request_timeout_ms: 300000
|
|
# - name: "ollama-dgx"
|
|
# enabled: true
|
|
# base_url: "http://192.168.0.91:11434"
|
|
# context_size: 262144
|
|
# capacity: 8
|
|
# max_queue: 32
|
|
# queue_timeout_ms: 30000
|
|
# request_timeout_ms: 300000
|
|
# vllm_instances:
|
|
# - name: "vllm-a100"
|
|
# enabled: true
|
|
# endpoint: "http://10.0.0.5:8000"
|
|
# capacity: 8
|
|
# max_queue: 32
|
|
# queue_timeout_ms: 30000
|
|
# request_timeout_ms: 300000
|
|
# cli:
|
|
# enabled: true
|
|
# profiles:
|
|
# claude:
|
|
# command: "claude"
|
|
# mode: "antigravity-print"
|
|
# openai_compat_instances:
|
|
# - name: "lemonade"
|
|
# enabled: true
|
|
# provider: "lemonade"
|
|
# endpoint: "http://127.0.0.1:13305"
|
|
# headers:
|
|
# Authorization: "Bearer <lemonade-api-key-placeholder>"
|
|
# capacity: 4
|
|
# max_queue: 16
|
|
# queue_timeout_ms: 30000
|
|
# request_timeout_ms: 300000
|
|
# runtime:
|
|
# concurrency: 4
|
|
# workspace_root: "/workspace"
|