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 /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" bearer_token: "" 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" # # Legacy/compatibility adapter-backed provider override example: # Use only when explicit adapter instance override or compatibility before compilation is required. # - 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 (recommended) === # 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 and execution fields (Provider-First). # 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[].endpoint / base_url / command — type-specific execution fields. # nodes[].providers[].models — served model names this provider can serve. # nodes[].providers[].health — observed health state string. # nodes[].providers[].capacity — provider-pool max concurrent execution slots; 0 is not dispatchable. # 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. # nodes[].providers[].enabled — on/off dispatch switch; omit or true = enabled, false = excluded from # dispatch pool. Disabled providers appear in status with status=disabled, capacity=0. Does not # stop adapter processes. Classified as live-apply (no restart required) on config refresh. # # Example node with provider pool (Provider-First, recommended): # nodes: # - id: "node-gpu-01" # alias: "gpu-node" # providers: # - id: "vllm-gpu" # type: "vllm" # category: "api" # endpoint: "http://127.0.0.1:8000/v1" # models: # - "nvidia/Qwen3.6-35B-A3B-NVFP4" # health: "healthy" # capacity: 4 # max_queue: 16 # queue_timeout_ms: 30000 # request_timeout_ms: 120000 # lifecycle_capabilities: ["scale_up", "scale_down"] # # enabled: false # set to exclude this provider from dispatch pool (live-apply) # - id: "ollama-local" # type: "ollama" # category: "local_inference" # base_url: "http://127.0.0.1:11434" # models: # - "qwen3.6:35b" # health: "healthy" # capacity: 2 # max_queue: 8 # queue_timeout_ms: 30000 # # # Legacy/compatibility adapter-backed provider override setup (discouraged for new deployments): # - id: "node-vllm-01" # alias: "vllm-gpu-node" # token: "" # adapters: # openai_compat_instances: # - name: "vllm-gpu" # enabled: true # provider: "vllm" # endpoint: "http://127.0.0.1:8000/v1" # capacity: 4 # max_queue: 16 # queue_timeout_ms: 30000 # request_timeout_ms: 120000 # providers: # - id: "vllm-gpu-legacy" # type: "vllm" # category: "api" # adapter: "vllm-gpu" # models: # - "nvidia/Qwen3.6-35B-A3B-NVFP4" 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). # # Provider-First example (recommended): - id: "node-example-01" alias: "example-node" token: "" agent_kind: "generic-node" providers: - id: "claude-tui" type: "cli" category: "cli" command: "claude" args: - "--dangerously-skip-permissions" env: - "TERM=xterm-256color" mode: "persistent-lazy" capacity: 1 - id: "codex" type: "cli" category: "cli" command: "codex" args: - "app-server" mode: "codex-app-server" capacity: 1 - id: "codex-exec" type: "cli" category: "cli" command: "codex" args: - "exec" - "--json" resume_args: - "exec" - "resume" - "--json" output_format: "codex-json" mode: "codex-exec" capacity: 1 # Legacy adapters configuration (compat override example): # adapters: # 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" # mode: "codex-app-server" # codex-exec: # command: "codex" # args: # - "exec" # - "--json" # resume_args: # - "exec" # - "resume" # - "--json" # output_format: "codex-json" # mode: "codex-exec" runtime: concurrency: 1