Skip to content

fix(onboard): clean up invalid llama.cpp port state - #8565

Merged
ericksoa merged 7 commits into
mainfrom
fix/llama-cpp-lifecycle-host-port-validation
Aug 7, 2026
Merged

fix(onboard): clean up invalid llama.cpp port state#8565
ericksoa merged 7 commits into
mainfrom
fix/llama-cpp-lifecycle-host-port-validation

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

The managed llama.cpp installer publishes the fixed loopback host port that every downstream endpoint assumes, while the lifecycle validator required a dynamic host-port assignment, so the inspection that follows container creation always rejected the container the installer had just created and managed onboarding could never finish. The validator now compares the configured host port against the port the bindings pin, and the lifecycle input requires that port rather than accepting a dynamic binding.

Since #8564 landed the primary fixed-port behavior, this PR now carries the distinct rollback protection: malformed, non-loopback, or drifting endpoint metadata can be rejected while strongly authenticated managed containers, networks, and journals are still cleaned up for a safe retry.

Related Issue

Fixes #8544

Changes

  • parseInspection in src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts compared the configured HostPort against "", which requires Docker to choose the port. The only caller, lifecycleFor in src/lib/inference/llama-cpp/managed-installer.ts, always pins LLAMA_CPP_PORT, so buildLlamaCppHostLocalDockerArgv emits --publish 127.0.0.1:8081:8081 and Docker reports HostPort: "8081". The two requirements could not both hold.
  • The loopback check and the port check are now separate. A HostIp that is not 127.0.0.1 still reports Docker llama.cpp configured host port is not loopback-only.; a port that disagrees with the bindings reports that instead. The previous single condition raised the loopback message for a correct 127.0.0.1 binding, which is what the issue reported.
  • parseInspection and inspectContainer take the runtime bindings rather than a bare network name, so the expected host port travels with the network identity it is checked alongside. The ten call sites already passed options.bindings.network.name.
  • Rollback now uses a cleanup inspection mode after an endpoint mismatch. It skips only endpoint validation, still requires the recorded container ownership and hardening to match before deletion, verifies container and network absence, and retires the journal so a retry can proceed.
  • HostLocalLlamaCppLifecycleInput.bindings in src/lib/onboard/runtime-provider/host-local-inference.ts now requires hostPort. The shared bindings type leaves it optional because buildLlamaCppHostLocalDockerArgv is also called directly by scripts/checks/run-llama-cpp-dgx-spark-qualification.mts, which legitimately omits it and never enters this lifecycle. Requiring it at the lifecycle boundary states that the managed path publishes a fixed port and makes a dynamic binding a compile error rather than a runtime check. npm run typecheck:cli passes unchanged, which confirms no current caller omits it.
  • The fix is on the lifecycle, not the installer. Publishing a dynamic port would satisfy the old condition and then break onboarding silently: providers.ts and setup-nim-flow.ts set endpointUrl from the hardcoded LLAMA_CPP_HOST_OPENAI_BASE_URL, llama-cpp/index.ts refuses attachment on any other port, and core/ports.ts reserves 8081 against env-var conflicts. The configured endpoint would point at 8081 while the container listened elsewhere.

Tests

  • src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts ran a configuration the product never produces: its bindings omitted hostPort and its Docker inspection fixture hard-coded HostPort: "" with an ephemeral published port. Pinning LLAMA_CPP_PORT in the bindings and moving the fixture to the shape Docker returns for that binding makes the existing suite cover the shipped path. Reverting only the source change and rerunning the suite fails 22 of 34 tests with the exact error from the issue.
  • The host-port mismatch regression now proves rejection, journal retirement, an idempotent recovery pass, and a successful fresh start. The retry would fail at the existing container-name or network-name checks if either resource remained. It distinguishes configured-port and published-port diagnostics and includes an isolated non-loopback case with no simultaneous port drift.
  • src/lib/inference/llama-cpp/host-local-runtime.test.ts asserted only the dynamic 127.0.0.1::8081 publish argument. A case now covers the pinned 127.0.0.1:8081:8081 form the product uses.
  • src/lib/inference/llama-cpp/managed-installer.test.ts now asserts that the bindings handed to the lifecycle pin LLAMA_CPP_PORT, so the installer and the validator cannot drift apart again without a test failing.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: no flag, prompt, configuration key, default, or success-path output changes. The published documentation already describes the pinned behavior this change restores: docs/inference/choose-local-inference-server.mdx states that onboarding "Publishes port 8081 on 127.0.0.1" and that "The Docker port output must contain 127.0.0.1:8081", and docs/reference/commands.mdx records that port 8081 is reserved for the managed llama.cpp runtime. Those statements were correct and unreachable; they are now reachable. No documented error string changes, and docs/reference/troubleshooting.mdx has no llama.cpp entry to keep consistent.
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Codex Desktop independently completed all nine security categories on the current branch revision; no findings.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: No documentation paths changed. The independent review confirmed that existing managed llama.cpp documentation already specifies the fixed 127.0.0.1:8081 endpoint, authenticated unfinished-journal rollback, and retry behavior; the completed change restores those documented contracts without adding a user-facing surface.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: npx vitest run --project cli src/lib/onboard/runtime-provider src/lib/inference/llama-cpp — 295 passed across 18 files. npx vitest run --project integration test/cli/list-share-live-inference.test.ts test/sandbox-connect-inference — 23 passed. npx vitest run --project e2e-support — 2142 passed, 10 skipped. npm run typecheck:cli — clean. test/e2e/live/llama-cpp-dgx-spark-qualification.test.ts needs DGX Spark hardware and was not run. Maintainer follow-up on the current branch revision: the three directly affected files pass 76/76 tests, CLI type-checking passes, and npm run validate:pr passes.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: not applicable. This changes one validator and one lifecycle input type; it adds no harness mechanics, Vitest config, project glob, or registration topology. npm run checks:repository passed, including the layer import boundary and the source architecture budget with zero cycles.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Tinson Lai tinsonl@nvidia.com

Summary by CodeRabbit

  • Bug Fixes
    • Improved llama.cpp container lifecycle handling for malformed, non-loopback, duplicate, or unexpectedly changed published ports.
    • Ensured cleanup and recovery flows reliably remove affected containers and networks.
    • Enforced consistent use of the configured local host port during runtime validation and Docker publishing.

The managed installer pins the fixed loopback host port that every
downstream llama.cpp endpoint assumes, while the lifecycle validator
required a dynamic assignment, so managed onboarding always failed on
the inspection that follows container creation. The validator now
compares the configured host port against the port the bindings pin,
and the lifecycle input requires that port instead of accepting a
dynamic binding.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

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

The lifecycle validates Docker’s loopback host port against LLAMA_CPP_PORT. Cleanup inspections skip runtime port validation. Rollback and destroy flows pass complete lifecycle bindings. Tests cover port publishing and cleanup after binding drift.

Changes

Managed llama.cpp port handling

Layer / File(s) Summary
Shared host-port contract
src/lib/onboard/runtime-provider/host-local-inference.ts, src/lib/inference/llama-cpp/host-local-runtime.test.ts, src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts
Lifecycle bindings require a numeric hostPort. Test fixtures and Docker argument tests use the shared LLAMA_CPP_PORT contract.
Container inspection validation
src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts
Runtime inspection requires exactly one loopback host port that matches bindings.hostPort. Inspection call sites pass complete lifecycle bindings.
Cleanup and drift recovery
src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts, src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts
Rollback and destroy use cleanup inspection mode. Drift tests verify journal cleanup and removal of the container and network.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Startup
  participant inspectContainer
  participant Docker
  Startup->>inspectContainer: inspect with lifecycle bindings
  inspectContainer->>Docker: read container network and port bindings
  Docker-->>inspectContainer: return published host port
  inspectContainer-->>Startup: accept matching loopback port or report mismatch
Loading

Possibly related PRs

  • NVIDIA/NemoClaw#8448: This change extends the managed llama.cpp lifecycle and host-local runtime bindings introduced there.
  • NVIDIA/NemoClaw#8564: Both changes modify llama.cpp Docker lifecycle port binding and validation behavior.

Suggested labels: area: inference, area: local-models, platform: dgx-spark

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes align lifecycle validation with the installer’s fixed loopback port and address the onboarding failure described in [#8544].
Out of Scope Changes check ✅ Passed The changes are limited to llama.cpp lifecycle validation, cleanup behavior, type requirements, and related tests.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: correcting invalid llama.cpp port state during onboarding cleanup.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/llama-cpp-lifecycle-host-port-validation

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

@laitingsheng laitingsheng added area: integrations Third-party service integration behavior area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression labels Aug 7, 2026
@github-code-quality

github-code-quality Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 4428002 in the fix/llama-cpp-lifecy... branch remains at 96%, unchanged from commit 272cc64 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit 4428002 in the fix/llama-cpp-lifecy... branch remains at 81%, unchanged from commit 272cc64 in the main branch.

Show a code coverage summary of the most impacted files.
File main 272cc64 fix/llama-cpp-lifecy... 4428002 +/-
src/lib/core/pr...mpt-activity.ts 92% 67% -25%
src/lib/credentials/store.ts 55% 56% +1%
src/lib/onboard...ed-lifecycle.ts 75% 76% +1%
src/lib/trace.ts 90% 94% +4%
src/lib/messagi...onfig-parser.ts 93% 97% +4%
src/lib/messagi...ate-resolver.ts 95% 100% +5%
src/lib/messagi...ate-resolver.ts 88% 94% +6%
src/lib/messagi...onfig-parser.ts 93% 100% +7%
src/lib/messagi...ink-base-url.ts 90% 100% +10%
src/lib/messagi...onfig-parser.ts 86% 100% +14%

Updated August 07, 2026 17:12 UTC

@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

🤖 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/runtime-provider/docker-llama-cpp-managed-lifecycle.ts`:
- Around line 312-317: Add a cleanup inspection mode to parseInspection that
skips only configured host/port endpoint checks while preserving ownership and
hardening validation. Update rollbackExact and its post-create mismatch path to
use this mode so managed containers and networks can always be removed and the
creating journal cleared. Extend the mismatch test to verify container, network,
and journal cleanup, and ensure resume/repair bridge handling remains idempotent
and converges through the same authoritative path.
🪄 Autofix

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: a6e1ddda-4a09-4848-aab3-848733a818aa

📥 Commits

Reviewing files that changed from the base of the PR and between aae23eb and 6b6dcf3.

📒 Files selected for processing (5)
  • src/lib/inference/llama-cpp/host-local-runtime.test.ts
  • src/lib/inference/llama-cpp/managed-installer.test.ts
  • src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts
  • src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts
  • src/lib/onboard/runtime-provider/host-local-inference.ts

Comment thread src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts Outdated
@apurvvkumaria apurvvkumaria self-assigned this Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: Review the warnings below.
Findings: 0 blockers · 1 warning · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 1 warning · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · low confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized terminology decisions differ; normalized E2E selections differ; Nemotron reported the same number of blockers, 1 fewer warning, the same number of suggestions.
5 terminology differences from the second opinion

Advisory only. These are normalized differences from the primary terminology receipt.

  • declared binding at src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts:339: selected only by the second-opinion lane as established.
  • configured port at src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts:308: selected only by the second-opinion lane as established.
  • published port at src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts:306: selected only by the second-opinion lane as established.
  • bound host port at src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts:321: selected only by the second-opinion lane as established.
  • DockerContainerInspectionMode at src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts:121: selected only by the second-opinion lane as define.
1 additional E2E selection from the second opinion

Advisory only. The primary lane did not select these E2E jobs or targets.

  • spark-install: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests.

1 semantic terminology decision

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • established — fixed loopback host port at src/lib/inference/llama-cpp/host-local-runtime.test.ts:163: Retain the established term in the test title.

E2E guidance

Advisory only. A maintainer can dispatch the default E2E suite against this exact revision.

Recommended E2E: managed-image-multiarch-startup, managed-image-protected-runtime, inference-routing, network-policy, onboard-repair, onboard-resume, cloud-onboard

1 optional E2E recommendation
  • llama-cpp-dgx-spark-qualification
1 warning · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Cover a successful retry after invalid port cleanup

  • Location: src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts:828
  • Category: tests
  • Problem: The new port-drift and malformed-binding cases assert rollback removal and journal retirement, but do not start the lifecycle again after the invalid binding is corrected.
  • Impact: A regression that leaves a stale container, network, or port reservation after port-validation failure can block the next managed onboarding attempt without this test detecting it.
  • Recommendation: Extend one invalid-binding case to restore the fixed loopback binding, call start again, and assert a finalized journal and receipt endpoint at LLAMA_CPP_PORT.
  • Verification: Inspect the port-failure cases at lines 828-858 and confirm no case performs a second successful start after cleanup.
  • Test coverage: A lifecycle test that fails start with a mismatched or malformed binding, restores the correct fixed loopback binding, then verifies a fresh start finalizes the journal and returns the fixed-port receipt.
  • Evidence: src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts:828-840 asserts drift failure, exact container/network removal, and an empty journal. src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts:842-858 asserts the same cleanup for malformed, non-loopback, and duplicate bindings without a subsequent start.

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

apurvvkumaria and others added 3 commits August 7, 2026 08:51
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@copy-pr-bot

copy-pr-bot Bot commented Aug 7, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts (1)

842-856: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add an isolated non-loopback binding case.

The 0.0.0.0 case also sets the published port to "8082". The lifecycle can reject that fixture only for port drift. This test does not prove that a non-loopback published binding is rejected.

Add a case where both configured and published ports equal HOST_PORT, but publishedHostIp is "0.0.0.0".

Proposed test input
   for (const args of [
+    [HOST_PORT, HOST_PORT, "0.0.0.0", 1],
     ["8081", "8082", "0.0.0.0", 1],
     ["8081", "invalid", "127.0.0.1", 1],

As per path instructions, tests must prove the claimed behavior through observable outcomes.

🤖 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/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts`
around lines 842 - 856, Add an isolated fixture case in the parameterized inputs
for the lifecycle test where the configured and published ports both equal
HOST_PORT (8081) while publishedHostIp is "0.0.0.0". Keep the existing rejection
and cleanup assertions unchanged so the test specifically verifies rejection of
the non-loopback binding without port drift.

Source: Path instructions

🤖 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.

Outside diff comments:
In `@src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts`:
- Around line 842-856: Add an isolated fixture case in the parameterized inputs
for the lifecycle test where the configured and published ports both equal
HOST_PORT (8081) while publishedHostIp is "0.0.0.0". Keep the existing rejection
and cleanup assertions unchanged so the test specifically verifies rejection of
the non-loopback binding without port drift.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 7f8dbbc2-66e0-4755-94da-3ed79810175b

📥 Commits

Reviewing files that changed from the base of the PR and between 2e2100a and 9e7fa37.

📒 Files selected for processing (2)
  • src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.test.ts
  • src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/onboard/runtime-provider/docker-llama-cpp-managed-lifecycle.ts

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria apurvvkumaria changed the title fix(onboard): accept the fixed llama.cpp loopback host port fix(onboard): clean up invalid llama.cpp port state Aug 7, 2026
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Addressed the current outside-diff review finding. The cleanup regression now includes an isolated 127.0.0.1:8081:8081 publication whose reported host IP is 0.0.0.0, while retaining the existing combined drift case, so rejection cannot be attributed only to a port mismatch. I also aligned the configured-port and published-port assertions with the distinct diagnostics inherited from main after the conflict resolution. The three directly affected suites pass 76/76, CLI type-check and normal hooks pass, and the final independent security review found no issue across all nine categories. The residual change requires no documentation update.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa
ericksoa merged commit 71a7e7c into main Aug 7, 2026
64 of 68 checks passed
@ericksoa
ericksoa deleted the fix/llama-cpp-lifecycle-host-port-validation branch August 7, 2026 17:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: integrations Third-party service integration behavior area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression release-target v0.0.105 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DGX Spark][Onboard] nemoclaw onboard install-llama-cpp always fails: "Docker llama.cpp configured host port is not loopback-only"

3 participants