Service node: a server kept running on a worker (openpanel V2)

- `service` node type: command, port, worker label, health path, env and
  weights (an artifact digest the worker fetches as {weights}). Its flow
  starts it; it restarts with backoff, reads degraded while starting or
  without a worker and down after three starts that never got healthy, and
  publishes http://<worker>:<port> once /health answers 200, "" when it ends.
- Worker protocol 3: a `serve` call, every call in its own process group,
  killed when the engine ends the call, the socket drops or the agent gets
  SIGTERM. `--service-host` overrides the address the engine sees.
- Services and compiles take no `--parallel` slot, and a flow's detail is
  built off the event loop, so a save no longer stalls the engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ljdk7nDaguh9Uhi3zhcSjn
This commit is contained in:
Melvin Strobl
2026-10-19 18:43:04 +02:00
co-authored by Claude Opus 5.5
parent 23b0861a9b
commit 560c19962a
16 changed files with 757 additions and 34 deletions
+5
View File
@@ -335,6 +335,11 @@ the local engine when none is attached. Code is compiled on the selected
machine, which needs the packages your node imports. See
[Remote workers](workers.md) for setup and resource requests.
Each call runs in a fresh process that ends with the call, so a model loaded
in a node is loaded again on the next message. To keep one loaded, serve it
from a [Service node](../reference/node-types.md#service) and call it over
HTTP.
## Sharing code between flows
Promote a node's source to the shared library from its panel. Other flows can