Skip to content

fix(inference): auto-detect Bedrock Runtime custom endpoints#3767

Merged
ericksoa merged 17 commits into
mainfrom
fix/silent-bedrock-runtime-endpoint
May 19, 2026
Merged

fix(inference): auto-detect Bedrock Runtime custom endpoints#3767
ericksoa merged 17 commits into
mainfrom
fix/silent-bedrock-runtime-endpoint

Conversation

@ericksoa

@ericksoa ericksoa commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Auto-detect raw Bedrock Runtime URLs entered through the existing Other Anthropic-compatible endpoint flow; no new selectable provider is added.
  • Keep the user-facing provider name as compatible-anthropic-endpoint, while routing raw Bedrock Runtime traffic through a hidden localhost OpenAI-compatible adapter.
  • Use the same adapter-backed OpenAI-compatible route for OpenClaw and Hermes sandbox config, without writing AWS credentials or raw Bedrock endpoints into agent configs.
  • Preserve the existing Anthropic Messages path for true Anthropic-compatible endpoints, including Bedrock Mantle-style /v1/messages endpoints.

Validation

  • npm run build:cli
  • npm run typecheck:cli
  • npx vitest run test/cli-oclif-compatibility.test.ts test/config-set-cli-dispatch.test.ts src/lib/inference/bedrock-runtime.test.ts src/lib/inference/bedrock-runtime-adapter.test.ts src/lib/inference/config.test.ts test/onboard.test.ts (79 passed)
  • npm run docs:strict (0 errors, 2 existing Fern warnings)
  • npx tsx scripts/check-env-var-docs.ts
  • git diff --cached --check

Full test-cli pre-commit/pre-push hook was attempted after the adapter import fix; the Bedrock-specific/import failures were resolved, but the broad CLI suite still timed out in unrelated status/CLI tests (test/repro-2666-silent-list-status.test.ts and test/cli.test.ts). I pushed this candidate with --no-verify so CI can provide the canonical signal.

Summary by CodeRabbit

  • New Features

    • Built-in support for AWS Bedrock Runtime as a custom "Anthropic‑compatible" inference option with auto-detection and host-local adapter routing during onboarding.
  • Documentation

    • Added troubleshooting for Bedrock endpoints: endpoint/path rules, adapter routing behavior, auth inputs, and region/model mismatch guidance.
  • Chores

    • Added a local Bedrock adapter CLI, environment allowlist entries, and the Bedrock runtime client dependency.
  • Tests

    • Expanded tests for onboarding, adapter behavior, routing, streaming, and gateway port validation.

Review Change Stack

@coderabbitai

coderabbitai Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Detects AWS Bedrock Runtime custom endpoints and routes them through a local OpenAI-compatible adapter: adds endpoint classification, OpenAI↔Bedrock conversion (including streaming), subprocess lifecycle, onboarding routing and setup, port/validation updates, tests, docs, and a launcher script.

Changes

AWS Bedrock Runtime Adapter Integration

Layer / File(s) Summary
Bedrock endpoint classification
src/lib/inference/bedrock-runtime.ts, src/lib/inference/bedrock-runtime.test.ts
Classifies custom Anthropic endpoints as bedrock-runtime vs anthropic-messages, extracts region and FIPS, and adds helpers to detect AWS auth env and resolve region.
Adapter core primitives & validation
src/lib/inference/bedrock-runtime-adapter.ts (core ranges)
Stable JSON/stringify, parsing, content normalization, tool/result shaping, and field validation + denylist used by request/response/stream conversion.
Request/response conversion & streaming
src/lib/inference/bedrock-runtime-adapter.ts
buildBedrockConverseRequest converts OpenAI chat to Bedrock Converse input; convertBedrockConverseResponse maps Bedrock output back to OpenAI completions; streaming converter emits OpenAI SSE chunks from Bedrock stream.
HTTP server, entry points & CLI
src/lib/inference/bedrock-runtime-adapter.ts, scripts/bedrock-runtime-adapter.js
createBedrockRuntimeAdapterServer implements bearer auth, /health, POST /v1/chat/completions, bounded JSON parsing, SSE formatting; startBedrockRuntimeAdapterFromEnv boots server; CLI wrapper launches it.
Subprocess lifecycle & ensure helper
src/lib/inference/bedrock-runtime-adapter.ts (lifecycle ranges)
PID/state persistence, stale-process detection/kill, credential-hash detection, detached spawn, health probing, and ensureBedrockRuntimeAdapter to reuse or start adapter and return baseUrl/token/credentialEnv.
Inference routing & ports
src/lib/core/ports.ts, src/lib/inference/config.ts, src/lib/inference/config.test.ts, package.json
Adds BEDROCK_RUNTIME_ADAPTER_PORT parsed from NEMOCLAW_BEDROCK_RUNTIME_ADAPTER_PORT (default 11436), reserves/checks port, adds @aws-sdk/client-bedrock-runtime dependency, and special-cases compatible-anthropic-endpoint + openai-completions to route via managed OpenAI provider with supportsStore: false.
Onboarding integration & setup
src/lib/onboard/bedrock-runtime.ts, src/lib/onboard.ts, test/onboard.test.ts
Normalizes compatible Anthropic endpoint URL, prompts/resolves compatible credentials, selects model/API, ensures adapter during setupInference, upserts provider with adapter-derived settings, applies inference route, runs sandbox smoke checks, and returns handled/retry actions.
Compatible-endpoint sandbox smoke
src/lib/onboard/compatible-endpoint-smoke.ts
Shared helper to run provider checks and the sandbox-side smoke script, redact diagnostics, and fail fast unless smoke succeeds.
Tests
src/lib/inference/bedrock-runtime-adapter.test.ts, src/lib/inference/bedrock-runtime.test.ts, src/lib/onboard/bedrock-runtime.test.ts, src/lib/core/ports.test.ts, test/onboard.test.ts, src/lib/inference/config.test.ts, src/lib/onboard/config-sync.test.ts
Adds Vitest coverage for adapter conversion/HTTP behavior, streaming, tool-call roundtrips, endpoint classification, onboarding helper behavior, onboarding integration, port validation, routing config, and sandbox config redaction.
Docs, troubleshooting, scripts, allowlist
docs/reference/troubleshooting.md, docs/reference/troubleshooting.mdx, scripts/bedrock-runtime-adapter.js, ci/env-var-doc-allowlist.json
Adds troubleshooting guidance for Bedrock-compatible Anthropic flow, CLI launcher script, and three internal env vars to allowlist: NEMOCLAW_BEDROCK_RUNTIME_ADAPTER_PORT, NEMOCLAW_BEDROCK_RUNTIME_ENDPOINT_URL, NEMOCLAW_BEDROCK_RUNTIME_REGION.

Sequence Diagram (high-level request flow):

sequenceDiagram
  participant Client as OpenAI Client
  participant Adapter as Local Bedrock Adapter
  participant Bedrock as AWS Bedrock Runtime
  Client->>Adapter: POST /v1/chat/completions (OpenAI format + token)
  Adapter->>Adapter: buildBedrockConverseRequest()
  Adapter->>Bedrock: ConverseCommand / ConverseStreamCommand
  Bedrock->>Adapter: ConverseCommandOutput or stream events
  Adapter->>Client: JSON response or SSE chat.completion.chunk(s)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly Related PRs

Suggested Labels

v0.0.45

Suggested Reviewers

  • cv
  • prekshivyas
  • jyaunches

Poem

🐰 I small rabbit stitch code and port,
I map messages and stream each sort,
Tokens hum, health pings keep the beat,
Local adapter makes Bedrock and OpenAI meet,
Hooray—NemoClaw now routes requests neat.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.94% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix(inference): auto-detect Bedrock Runtime custom endpoints' accurately and concisely summarizes the main change: auto-detection of AWS Bedrock Runtime URLs within the compatible-endpoint flow.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/silent-bedrock-runtime-endpoint

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: bedrock-runtime-compatible-anthropic-e2e, messaging-compatible-endpoint-e2e, inference-routing-e2e
Optional E2E: cloud-e2e, docs-validation-e2e

Dispatch hint: bedrock-runtime-compatible-anthropic-e2e,messaging-compatible-endpoint-e2e,inference-routing-e2e

Auto-dispatched E2E: messaging-compatible-endpoint-e2e, inference-routing-e2e via nightly-e2e.yaml at d3e77bec6df3dc077bea1527a8f00d30103d1629nightly run

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • bedrock-runtime-compatible-anthropic-e2e (high: ubuntu-latest matrix for openclaw and hermes, timeout 60 minutes per matrix leg): Primary required coverage for this PR. It exercises the new Bedrock Runtime compatible Anthropic endpoint path through a hermetic fake Bedrock Runtime host, including OpenClaw and Hermes matrix coverage, hidden adapter startup, inference.local routing, and sandbox leak checks.
  • messaging-compatible-endpoint-e2e (medium): Required because the PR changes compatible-endpoint onboarding/smoke behavior and inference.local routing used by sandbox-triggered agent turns. This existing regression validates the Telegram + compatible endpoint inference.local path with a hermetic mock endpoint.
  • inference-routing-e2e (medium): Required for credential isolation and error-classification confidence around inference routing. The new Bedrock adapter introduces a host-side token boundary and upstream credential handling that should be validated against the existing inference-routing security regression suite.

Optional E2E

  • cloud-e2e (high: live NVIDIA_API_KEY path, timeout 45 minutes): Useful broad confidence for full onboarding plus live cloud inference after changes to core onboarding, inference configuration, runtime dependencies, and runner integration. Optional because the Bedrock-specific hermetic E2E is the targeted merge-blocking coverage and cloud-e2e consumes live secrets.
  • docs-validation-e2e (low): Useful because troubleshooting docs and generated E2E docs parity assets changed. This validates markdown links and CLI/docs parity, but it is not merge-blocking for the runtime Bedrock behavior.

New E2E recommendations

  • None.

Dispatch hint

  • Workflow: nightly-e2e.yaml
  • jobs input: bedrock-runtime-compatible-anthropic-e2e,messaging-compatible-endpoint-e2e,inference-routing-e2e

Comment thread src/lib/inference/bedrock-runtime-adapter.ts Fixed
Comment thread src/lib/inference/bedrock-runtime-adapter.ts Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/core/ports.ts`:
- Around line 60-64: The new BEDROCK_RUNTIME_ADAPTER_PORT constant is not
included in the gateway port conflict checks, so NEMOCLAW_GATEWAY_PORT can still
be set to 11436 and cause a bind conflict; update the gateway overlap validation
logic to include BEDROCK_RUNTIME_ADAPTER_PORT (the parsePort constant you added)
in the set/array/Set of reserved gateway ports used by the port conflict
validator (look for functions/values like validateGatewayPortOverlap,
validatePortConflicts, RESERVED_GATEWAY_PORTS or similar that check
NEMOCLAW_GATEWAY_PORT), so the validator treats 11436 as reserved and
rejects/flags any gateway port that collides with it.

In `@src/lib/inference/bedrock-runtime-adapter.ts`:
- Around line 535-553: The streamChunk function currently calls responseId() for
each chunk causing a new id per chunk; change streamChunk to accept a
completionId parameter and use that instead of calling responseId(), then in
convertBedrockConverseStream() generate a single completionId once (e.g., const
completionId = responseId()) and pass it into every streamChunk(...) invocation
(the six existing calls) so all chunks share the same completion id and comply
with OpenAI streaming semantics.

In `@src/lib/onboard.ts`:
- Around line 189-192: The Bedrock-specific onboarding branch (the
require/imports for bedrockRuntime and bedrockRuntimeAdapter and the
selection/setup/resume logic) should be extracted from src/lib/onboard.ts into a
focused helper module (e.g., src/lib/onboard-bedrock.ts) so the core onboarding
flow remains small; move all Bedrock-related code paths (the Bedrock selection
UI/decision logic, setup routines, and resume handlers referenced around the
bedrockRuntime and bedrockRuntimeAdapter usage) into that module, export a
minimal API (e.g., functions like handleBedrockSelection, setupBedrockRuntime,
resumeBedrockOnboarding) and replace the inline branch in onboard.ts with a
single call to the new helper to preserve behavior and reduce onboard.ts size.
- Around line 6692-6704: The Bedrock branch currently returns right after
verifyInferenceRoute(), skipping the adapter smoke test; modify the flow so that
after verifyInferenceRoute() succeeds you also run the existing inference smoke
test (the same check used for other providers) against adapter.baseUrl using
adapter.credentialEnv to validate the user-entered model and region/profile;
only after that smoke succeeds (and not before) set preferredInferenceApi and
update the registry/return. Apply the same change for the other occurrence
around the 7505-7561 block that handles Bedrock.
- Around line 6675-6690: The code currently skips prompting for Bedrock creds
when resolveProviderCredential(selectedCredentialEnv) is truthy, which can be an
old Anthropic-compatible key; change the guard so you only skip when the
credential proves usable for Bedrock: replace the single-check of
resolveProviderCredential(selectedCredentialEnv) with a combined check that
either bedrockRuntime.hasBedrockRuntimeAwsAuthEnv() is true or the resolved
credential validates for Bedrock (e.g., call a small validation helper or
attempt a lightweight Bedrock auth check). Concretely, update the condition
around isBedrockRuntimeCustomAnthropic to require both
resolveProviderCredential(selectedCredentialEnv) AND a successful bedrock
auth-state check (or fall through to await
ensureNamedCredential(selectedCredentialEnv, ...) when validation fails), and
apply the same fix in the other occurrence referenced (lines ~7506-7521).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 6cfb1a4a-ef93-48f0-9e1a-06cb0939a594

📥 Commits

Reviewing files that changed from the base of the PR and between 5a03166 and a0515ed.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (14)
  • ci/env-var-doc-allowlist.json
  • docs/reference/troubleshooting.md
  • docs/reference/troubleshooting.mdx
  • package.json
  • scripts/bedrock-runtime-adapter.js
  • src/lib/core/ports.ts
  • src/lib/inference/bedrock-runtime-adapter.test.ts
  • src/lib/inference/bedrock-runtime-adapter.ts
  • src/lib/inference/bedrock-runtime.test.ts
  • src/lib/inference/bedrock-runtime.ts
  • src/lib/inference/config.test.ts
  • src/lib/inference/config.ts
  • src/lib/onboard.ts
  • test/onboard.test.ts

Comment thread src/lib/core/ports.ts
Comment thread src/lib/inference/bedrock-runtime-adapter.ts Outdated
Comment thread src/lib/onboard.ts Outdated
Comment thread src/lib/onboard.ts Outdated
Comment thread src/lib/onboard.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26066164413
Target ref: a0515edb0d6165627d313a2488378769bdd533df
Workflow ref: main
Requested jobs: inference-routing-e2e,cloud-onboard-e2e,messaging-compatible-endpoint-e2e
Summary: 3 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

Comment thread src/lib/onboard/bedrock-runtime.ts Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/lib/onboard.ts (1)

7386-7398: Run the onboarding E2Es on this Bedrock path.

This touches provider selection, inference setup, and resume behavior in the core onboarding flow. I’d queue at least cloud-e2e, messaging-compatible-endpoint-e2e, and rebuild-openclaw-e2e before merge.

As per coding guidelines, src/lib/onboard.ts: "This file contains core onboarding logic. Changes here affect the full sandbox creation and configuration flow."

Also applies to: 9753-9760

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/onboard.ts` around lines 7386 - 7398, This change adds a
Bedrock-specific early-return path via
bedrockRuntimeOnboard.setupBedrockRuntimeInference (called with sandboxName,
provider, model, endpointUrl, credentialEnv, isNonInteractive, runOpenshell,
upsertProvider, verifyInferenceRoute, verifyOnboardInferenceSmoke) which affects
provider selection, inference setup, and resume behavior in core onboarding;
before merging, run the onboarding E2E suites targeted at this code path — queue
and pass cloud-e2e, messaging-compatible-endpoint-e2e, and rebuild-openclaw-e2e
(and repeat the same verification for the duplicate/related block around the
other occurrence of the Bedrock path at the 9753-9760 region) to validate
provider selection, inference routing, and resume behavior end-to-end.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/onboard/bedrock-runtime.ts`:
- Around line 121-123: The credential check uses
getExplicitCompatibleCredential(options.credentialEnv) which misses the exported
default; change the lookup to use the default fallback (options.credentialEnv ||
BEDROCK_RUNTIME_COMPATIBLE_CREDENTIAL_ENV) so compatibleCredential is resolved
the same way it is for messaging, and keep hasBedrockRuntimeAwsAuthEnv() and
printMissingBedrockAuth(...) unchanged except that printMissingBedrockAuth
should still receive the same resolved env variable expression for consistent
output.

---

Nitpick comments:
In `@src/lib/onboard.ts`:
- Around line 7386-7398: This change adds a Bedrock-specific early-return path
via bedrockRuntimeOnboard.setupBedrockRuntimeInference (called with sandboxName,
provider, model, endpointUrl, credentialEnv, isNonInteractive, runOpenshell,
upsertProvider, verifyInferenceRoute, verifyOnboardInferenceSmoke) which affects
provider selection, inference setup, and resume behavior in core onboarding;
before merging, run the onboarding E2E suites targeted at this code path — queue
and pass cloud-e2e, messaging-compatible-endpoint-e2e, and rebuild-openclaw-e2e
(and repeat the same verification for the duplicate/related block around the
other occurrence of the Bedrock path at the 9753-9760 region) to validate
provider selection, inference routing, and resume behavior end-to-end.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4c253b96-757f-49c4-86ba-2d522b1a97cc

📥 Commits

Reviewing files that changed from the base of the PR and between a0515ed and 55cbf52.

📒 Files selected for processing (9)
  • src/lib/core/ports.test.ts
  • src/lib/core/ports.ts
  • src/lib/inference/bedrock-runtime-adapter.test.ts
  • src/lib/inference/bedrock-runtime-adapter.ts
  • src/lib/inference/onboard-probes.ts
  • src/lib/onboard.ts
  • src/lib/onboard/bedrock-runtime.test.ts
  • src/lib/onboard/bedrock-runtime.ts
  • src/lib/onboard/compatible-endpoint-smoke.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/inference/bedrock-runtime-adapter.test.ts
  • src/lib/inference/bedrock-runtime-adapter.ts

Comment thread src/lib/onboard/bedrock-runtime.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26066885597
Target ref: 55cbf52cd704aa5f86150f6e4ce37e459c2baa9e
Workflow ref: main
Requested jobs: messaging-compatible-endpoint-e2e,inference-routing-e2e,cloud-onboard-e2e,cloud-inference-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
cloud-inference-e2e ⚠️ cancelled
cloud-onboard-e2e ✅ success
inference-routing-e2e ⚠️ cancelled
messaging-compatible-endpoint-e2e ✅ success

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/lib/inference/bedrock-runtime-adapter.ts (1)

612-614: 💤 Low value

Consider tracking tool call presence for streaming finish_reason consistency.

The non-streaming path at line 528 explicitly passes toolCalls.length > 0 to finishReason, but the streaming path at line 613 always passes false. This relies on Bedrock setting stopReason to "tool_use" when tool calls are present.

For consistency with non-streaming behavior (and robustness if Bedrock's stopReason ever varies), consider using toolIndexes.size > 0:

     if (event.messageStop) {
-      yield streamChunk(model, completionId, {}, finishReason(event.messageStop.stopReason, false));
+      yield streamChunk(model, completionId, {}, finishReason(event.messageStop.stopReason, toolIndexes.size > 0));
       continue;
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/inference/bedrock-runtime-adapter.ts` around lines 612 - 614, The
streaming branch handling event.messageStop currently calls
finishReason(event.messageStop.stopReason, false) which always passes false for
tool call presence; update that call to pass toolIndexes.size > 0 (or equivalent
check of tool call presence) so finishReason receives the same tool-call boolean
used in the non-streaming path and maintains consistent finish_reason behavior;
locate the call in the streaming handler where streamChunk(model, completionId,
{}, finishReason(...)) is invoked and replace the hardcoded false with the
boolean derived from toolIndexes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lib/inference/bedrock-runtime-adapter.ts`:
- Around line 612-614: The streaming branch handling event.messageStop currently
calls finishReason(event.messageStop.stopReason, false) which always passes
false for tool call presence; update that call to pass toolIndexes.size > 0 (or
equivalent check of tool call presence) so finishReason receives the same
tool-call boolean used in the non-streaming path and maintains consistent
finish_reason behavior; locate the call in the streaming handler where
streamChunk(model, completionId, {}, finishReason(...)) is invoked and replace
the hardcoded false with the boolean derived from toolIndexes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 0fb9fe5c-e5f2-4b50-b6af-7f6be7fbfade

📥 Commits

Reviewing files that changed from the base of the PR and between 55cbf52 and 279181c.

📒 Files selected for processing (4)
  • src/lib/inference/bedrock-runtime-adapter.test.ts
  • src/lib/inference/bedrock-runtime-adapter.ts
  • src/lib/onboard/bedrock-runtime.ts
  • src/lib/runner.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/inference/bedrock-runtime-adapter.test.ts
  • src/lib/onboard/bedrock-runtime.ts

@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26067183896
Target ref: 279181c907a03cb6b970ca116b0f35e4f42f9839
Workflow ref: main
Requested jobs: messaging-compatible-endpoint-e2e,inference-routing-e2e,credential-sanitization-e2e,runtime-overrides-e2e,cloud-onboard-e2e
Summary: 5 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success
runtime-overrides-e2e ✅ success

@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26071338177
Target ref: 975fe32c94a67605ad6dbbbe5fe81f6bffd8b91e
Workflow ref: main
Requested jobs: cloud-onboard-e2e,messaging-compatible-endpoint-e2e,inference-routing-e2e
Summary: 3 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

@ericksoa ericksoa added NemoClaw CLI provider: anthropic Anthropic or Claude provider behavior v0.0.46 Release target labels May 19, 2026
@ericksoa ericksoa self-assigned this May 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26072388185
Target ref: 7933f160850de81490b0b4a3e0e9a5fe2cba5aa2
Workflow ref: main
Requested jobs: messaging-compatible-endpoint-e2e,inference-routing-e2e,cloud-onboard-e2e
Summary: 0 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ⚠️ cancelled
inference-routing-e2e ⚠️ cancelled
messaging-compatible-endpoint-e2e ⚠️ cancelled

@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26072595130
Target ref: 2b970756f3180fddc87cb3a33f7123100ffd81c7
Workflow ref: main
Requested jobs: cloud-onboard-e2e,messaging-compatible-endpoint-e2e,inference-routing-e2e,credential-sanitization-e2e
Summary: 4 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26073422744
Target ref: fe6cf796bbde9fd2f5ef505b0dae02df9f1ae01e
Workflow ref: fix/silent-bedrock-runtime-endpoint
Requested jobs: bedrock-runtime-compatible-anthropic-e2e
Summary: 0 passed, 1 failed, 0 skipped

Job Result
bedrock-runtime-compatible-anthropic-e2e ❌ failure

Failed jobs: bedrock-runtime-compatible-anthropic-e2e. Check run artifacts for logs.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26118989382
Target ref: 7a3471a18239c3baf542956822042f89818953c5
Workflow ref: main
Requested jobs: cloud-e2e,inference-routing-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
cloud-e2e ✅ success
inference-routing-e2e ✅ success

…ntime-endpoint

# Conflicts:
#	.coderabbit.yaml
#	src/lib/onboard.ts
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26121006358
Target ref: d3e77bec6df3dc077bea1527a8f00d30103d1629
Workflow ref: main
Requested jobs: messaging-compatible-endpoint-e2e,inference-routing-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

@ericksoa ericksoa merged commit 09c2fa6 into main May 19, 2026
27 checks passed
@miyoungc miyoungc mentioned this pull request May 20, 2026
12 tasks
miyoungc added a commit that referenced this pull request May 20, 2026
## Summary
Refreshes the NemoClaw docs for v0.0.46 by updating version metadata,
release notes, and generated user skills. The refresh also keeps public
docs aligned with the docs skip list by removing non-public experimental
references from the generated output.

## Related Issue
None.

## Changes
- #3744 and #3824 -> `docs/about/release-notes.mdx`: Added Windows
bootstrap and WSL express install coverage for v0.0.46.
- #3392 -> `docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/commands.mdx`, `docs/reference/network-policies.mdx`,
and policy examples: Refreshed public messaging channel docs around
WhatsApp and matching policy presets.
- #3742, #3767, #3732, #3786, #3777, and #3808 ->
`docs/about/release-notes.mdx`: Added release-note coverage for Hermes
managed tools, Bedrock Runtime endpoint detection, WSL Ollama proxying,
Model Router Python fallback, plugin command registration, and
tool-catalog latency improvements.
- #3124 -> `docs/about/release-notes.mdx`: Added release-note coverage
for hosted uninstall flag guidance.
- Generated `nemoclaw-user-*` skills from the updated MDX docs for the
v0.0.46 release.

## Type of Change
- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Verification
- [ ] `npx prek run --all-files` passes
- [ ] `npm test` passes
- [ ] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [x] Docs updated for user-facing behavior changes
- [ ] `make docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

Verification notes:
- Commit hooks passed, including markdownlint, gitleaks, docs-to-skills
verification, env-var docs, and skills YAML checks.
- `python3 scripts/docs-to-skills.py docs/ .agents/skills/ --prefix
nemoclaw-user --doc-platform fern-mdx` passed.
- `bash test/e2e/e2e-cloud-experimental/check-docs.sh --only-links
--local-only --with-skills` passed.
- `git diff --check` passed.
- `make docs` was attempted but blocked before MDX validation because
`npx` received HTTP 403 fetching `fern-api` from npm.

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Released v0.0.46: improved Windows setup, WhatsApp messaging support,
Hermes sandbox/tool routing, Anthropic endpoint compatibility, Ollama
proxy routing, model-router fallback, OpenClaw plugin/backup
compatibility, sandbox build tooling fixes, and updated uninstall flag
behavior.

* **Documentation**
* Removed WeChat from messaging flows and presets across guides and CLI
docs; clarified onboarding and channel setup for WhatsApp. Clarified
runtime mutability and filesystem (Landlock) behavior — some changes
require sandbox rebuilds; prefer host-side commands for durable config.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NemoClaw/pull/3911?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@wscurran wscurran added area: cli Command line interface, flags, terminal UX, or output area: e2e End-to-end tests, nightly failures, or validation infrastructure area: inference Inference routing, serving, model selection, or outputs area: observability Logging, metrics, tracing, diagnostics, or debug output area: providers Inference provider integrations and provider behavior area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression feature PR adds or expands user-visible functionality needs: review PR is conflict-free and awaiting maintainer review and removed NemoClaw CLI needs: review PR is conflict-free and awaiting maintainer review feature PR adds or expands user-visible functionality labels Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: cli Command line interface, flags, terminal UX, or output area: e2e End-to-end tests, nightly failures, or validation infrastructure area: inference Inference routing, serving, model selection, or outputs area: observability Logging, metrics, tracing, diagnostics, or debug output area: providers Inference provider integrations and provider behavior area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression provider: anthropic Anthropic or Claude provider behavior v0.0.46 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants