Skip to navigation

Health Checks

View as Markdown

Use Fabric.check() to check the health of a runtime server, an agent runtime, or an OpenClaw Gateway service. NVIDIA NeMo Fabric returns an immutable CheckReport with the selected target, outcome, individual observations, timestamps, and elapsed time. The Python SDK guide shows runtime and service examples.

Choose the Scope

The scope selects the component that must answer the check:

ScopeTargetExecution ModesEvidence
serverThe runtime server in the supplied environment.OpenShell SDK routing or fabric-agent-ctl check inside the sandbox. Local SDK server checks return unsupported/unsupported_scope.The runtime server responds through its command transport and reports whether shutdown has started.
runtimeThe exact runtime_id in the supplied environment.Local SDK execution, or the OpenShell command bridge to the local SDK inside the sandbox.The selected adapter’s native observations, described below.
serviceThe exact service_id in the supplied process-local ServiceHandle.Local SDK service checks for a prepared or attached OpenClaw Gateway.Gateway HTTP responses. A Gateway can be checked before any runtime starts.

Server checks do not take a health level. Runtime and service checks default to live. The sandbox command bridge supports server and runtime targets; service checks require the local SDK service handle.

To select a runtime through the command bridge, provide both the agent name and runtime ID:

fabric-agent-ctl check --agent researcher --runtime-id R1 --ready --timeout-seconds 3

Refer to the runtime server command guide for command syntax.

Read the Levels and Outcomes

The levels describe progressively stronger observations of the selected target:

LevelQuestion
liveDoes the adapter have current evidence that the owned agent or session is alive?
activeDoes the native request interface meet the adapter’s qualified availability check?
readyDoes the native readiness response, or the adapter’s qualified equivalent, pass?

Checks are cumulative: ready evaluates live, then active, then ready. Evaluation stops at the first result that does not pass. The report’s checks list shows which observations ran. Different adapters use different native evidence; the same level does not promise identical behavior across harnesses.

The report uses one of these outcomes:

OutcomeMeaning
passedThe requested observations passed for the selected target.
failedAn observation found a stopped agent, closed session, failed native health response, or another concrete failure.
unknownThe check could not establish the result, for example because of a timeout, unavailable target, invalid native response, or ownership change.
unsupportedThe installed adapter or execution mode does not provide the requested check.

Runtime activity is separate from health. A runtime can report busy and pass every supported level while an invocation waits for a model response. Activity describes NeMo Fabric invocations; activity does not establish that an agent will accept a second concurrent prompt.

Native Evidence by Adapter

The table covers all runtime adapters and the OpenClaw Gateway service. Each row lists native evidence and unsupported levels, with links to qualification tests or capability descriptors. Support depends on the installed adapter version and its descriptor. Check the installed adapter’s advertised health levels before selecting a level.

Adapterlive Evidenceactive Evidenceready EvidenceQualification Tests / Capability Evidence
PiCompleted initialization, unchanged native session identity, and a fresh extensionRunner.createContext().isIdle() response; idle and busy both pass.Completed extension binding and an available native request interface after liveness passes.The selected model remains configured, required tools remain available, and required MCP transports have no observed error or closure.Tests
OpenClaw RuntimeValid GET /healthz response; an owned Gateway process must also remain running.GET /startupz confirms startup, authenticated GET /v1/models includes the selected agent, and GET /v1/chat/completions returns the expected 405 with Allow: POST.GET /readyz reports ready: true, including configured channel health.Tests
OpenClaw Gateway ServiceValid GET /healthz response.Authenticated GET /v1/models returns a valid inventory.GET /readyz reports native Gateway readiness, including configured channel health.Tests
CodexThe owned app-server process has not exited.A fresh native thread read confirms that the selected thread is loaded.The fresh thread response reports idle or active; systemError fails readiness.Tests
Claude CodeThe owned Claude CLI process has not exited.A fresh, valid native get_mcp_status() response.The same native status operation establishes initialized CLI responsiveness. Reported MCP connection failures do not themselves fail readiness.Tests
LangChain Deep AgentsA fresh read from the owned checkpoint connection with SELECT 1.The compiled graph exposes its message input schema and invocation interface.Native aget_state() returns valid state for the exact owned LangGraph thread.Tests
HermesThe owned native agent is not closed, session database ownership is unchanged, and a fresh diagnostic response is valid.The initialized run_conversation() interface remains available after the earlier checks.A fresh, valid get_activity_summary() response serves as the native readiness equivalent.Tests
OpenHandsThe owned LocalConversation native closure flags show that the conversation remains open.The native lazy-initialization flag confirms that the request interface has initialized. Before initialization, returns unknown/capabilities_unverified.Unsupported.Tests
OpenCodeA fresh sessions.get({ sessionID }) response identifies the exact, unarchived native session.The same native session-read operation.The same native session-read operation establishes narrow session readiness.Tests
Qwen CodeA fresh native Query.supportedCommands() response from the owned CLI query.The same native control operation.The same native control operation establishes initialized CLI responsiveness.Tests
Factory DroidA fresh native DroidSession.listTools() response from the selected subprocess.Unsupported.Unsupported.Tests
Kilo CodeThe owned Kilo server process has not exited.Native session.get() identifies the selected session.Native global.health() reports healthy: true.Tests
KiroThe owned ACP child process has a process identifier and has not exited or terminated by a signal.Unsupported.Unsupported.Tests
AWS StrandsThe owned ACP child process has not exited or terminated by a signal.Unsupported.Unsupported.Tests
ClineThe local host retains the same resident session and agent identity, and the native agent has not shut down.Native canStartRun() and running state establish availability; a running invocation remains healthy.A fresh ClineCore.get() response identifies the owned resident session with an idle, running, or pending status.Tests
mini-SWE-agentUnsupported.Unsupported.Unsupported.Descriptor
NOOA InteractiveAgentUnsupported.Unsupported.Unsupported.Descriptor
NOOA BenchAgentUnsupported.Unsupported.Unsupported.Descriptor
Remote AgentUnsupported.Unsupported.Unsupported.Descriptor

mini-SWE-agent, NOOA InteractiveAgent, NOOA BenchAgent, and Remote Agent advertise no runtime health levels. A health check for a running runtime using one of these adapters returns unsupported/unsupported_adapter. This outcome describes check support rather than an agent failure. Server checks remain available in OpenShell environments.

Pi readiness checks configured model, tool, and MCP state. Those observations do not perform a model request or execute a tool. OpenClaw readiness follows the Gateway’s channel policies and can use the Gateway’s cached observations. The linked OpenClaw endpoint tests use controlled Gateway HTTP responses.

Passing a health check does not establish successful inference, valid model credentials, provider availability, or successful tool execution unless the particular probe verifies that property. For example, Claude’s readiness response does not require connected MCP servers, and Qwen’s command response does not test model access. The linked qualification tests hold a local model response to verify that health checks can complete during invocation; those tests provide separate invocation evidence rather than changing what the health result means.

Deadlines and Concurrent Invocations

One positive, finite timeout covers routing, worker queues, transport, all evaluated levels, and response decoding. The default is three seconds. A deadline is not restarted for each level. An expired check returns unknown/probe_timeout; the health timeout leaves the invocation running.

Some native SDK requests cannot be cancelled safely. A caller timeout can therefore leave a native health request pending. Adapters with this behavior bound their pending native work. A later check either waits within its own remaining deadline before obtaining a fresh response, or returns unknown/probe_timeout while the earlier request remains pending. A delayed response is not reused as fresh evidence for a later check.

Checks observe the selected native runtime through a health connection that is independent of the invocation request. A successful health response while an invocation is pending does not prove that the invocation will eventually succeed. Stop, release, and session replacement invalidate observations collected for an earlier owner.

Maintain the Evidence Table

When an adapter changes its advertised levels or native probe, update this table, the adapter guide, and its qualification tests together. Keep native response details in the adapter documentation and preserve the shared report schema across harnesses.