Skip to content

fix(deploy): harden Quadlet review findings and dev safety net#347

Merged
sheepdestroyer merged 8 commits into
masterfrom
fix/quadlet-review-safety-net
Jul 22, 2026
Merged

fix(deploy): harden Quadlet review findings and dev safety net#347
sheepdestroyer merged 8 commits into
masterfrom
fix/quadlet-review-safety-net

Conversation

@sheepdestroyer

@sheepdestroyer sheepdestroyer commented Jul 22, 2026

Copy link
Copy Markdown
Owner

Quadlet deployment hardening and dev local-model safety net

Fresh replacement for #346 after addressing every actionable review item.

Review fixes

  • Stage and validate every Quadlet render before replacing live units. A bad template or unresolved placeholder now preserves the prior working unit set.
  • Treat systemd start/restart errors as deployment failures and show a non-paged diagnostic command.
  • Centralize the Quadlet pod unit name, eliminating lifecycle/ownership drift.
  • Recompute derived external URLs before restart/deploy summaries.
  • Normalize scheme-less PUBLIC_BASE_URL values while retaining router path components in canonical verifier GET and POST URLs.
  • Keep the dev local-model safety net on its actual host-networked listener (127.0.0.1:8083), removing the unreachable production hostname from dev configuration.

Validation

  • bash -n start-stack.sh
  • python3 -m py_compile scripts/verification/verify_canonical_endpoints.py
  • python3 -m pytest tests/ router/tests/ -x -q → 202 passed; one existing third-party deprecation warning.
  • bash start-dev.sh --full-rebuild → succeeded; all nine application containers healthy, MinIO bucket provisioning passed, and full router pipeline health passed.
  • Post-deploy canonical verifier: all infrastructure, Langfuse session/leak isolation, and all eight canonical HTTPS checks passed. The two remaining auto-route timeouts are isolated to exhausted OpenRouter free-tier capacity and local llama.cpp load contention, tracked in fix(dev): restore fallback capacity for canonical E2E chat verification #345.

Closes #346
Related: #345

Scope

Only review findings, canonical URL normalization, the dev safety-net upstream, regression coverage, and matching documentation are included.

Summary by Sourcery

Harden Quadlet-based deployment of the LLM routing stack, centralize service URL derivation, normalize canonical URLs, and extend tests and docs to cover the new deployment model and URL scheme.

Enhancements:

  • Introduce Quadlet-aware stack ownership detection and lifecycle management in start-stack.sh using a single canonical llm-routing-pod systemd unit name.
  • Render Quadlet templates into per-user systemd config with staged, owner-only units, failing safely on unresolved placeholders and treating systemd start/restart errors as deployment failures.
  • Centralize derivation of external service URLs (router, LiteLLM, Langfuse, llama.cpp) so pod YAML and Quadlet rendering share consistent, scheme- and host-normalized values, and update restart/deploy summaries to use them.
  • Refine resolve_external_urls to generate service-specific subdomain URLs while preserving configured ports and handling malformed netlocs more robustly.
  • Update upgrade-prod.sh to include quadlets/ in release sync and dry-run checks.

Documentation:

  • Update README and scripts/README.md to describe the Quadlet/systemd-managed deployment flow, container counts, canonical URL expectations, and dev local-model safety-net configuration.
  • Clarify canonical URL verification behavior and required PUBLIC_BASE_URL settings, including derived service subdomains and local-model safety-net listener.

Tests:

  • Add static deployment-contract tests for Quadlet templates and their integration with start-stack.sh and upgrade-prod.sh.
  • Adjust and extend URL resolution tests to reflect new subdomain-based canonical URLs and behavior with/without explicit ports.

Summary by CodeRabbit

  • New Features

    • Added a systemd-managed deployment stack supporting routing, LiteLLM, Langfuse, databases, caching, and local model services.
    • Service links now use dedicated subdomains for clearer access to dashboards, APIs, and health checks.
    • Added local development endpoint configuration for improved local-model support.
  • Documentation

    • Expanded startup, restart, rebuild, logging, status, and endpoint verification instructions.
  • Bug Fixes

    • Improved service URL generation, including hostname validation and preservation of configured ports.

boy added 6 commits July 22, 2026 23:46
…lets

Replace 'podman play kube' with declarative Quadlet units rendered from
quadlets/*.pod + quadlets/*.container templates into
~/.config/containers/systemd/llm-routing/. systemd's podman-user-generator
turns them into llm-routing-*.service units, making systemd the single
supervisor: boot auto-start (WantedBy=default.target + linger) and crash
recovery (Restart=always) now come from systemd instead of podman's
restartPolicy.

Key points:
- Templates use the same _PLACEHOLDER convention as pod.yaml; a new
  render_quadlets() in start-stack.sh reuses the existing env-derived
  values (ports, secrets, DATA_ROOT, POD_NAME) so dev/prod parity is
  preserved with plain string replacement (bare scalars, not YAML).
- deploy_fresh_pod() now: render configs -> render quadlets ->
  daemon-reload -> start/restart llm-routing-pod.service. The bare
  'restart existing' path and safe_pod_teardown() detect systemd-managed
  stacks and route through systemctl accordingly.
- Entrypoint semantics: Quadlet Exec= only sets args (appended to the
  image entrypoint), so containers where pod.yaml used command: now set
  Entrypoint= explicitly (litellm venv python, valkey-server,
  redis-server, /bin/sh for the router). MinIO keeps its image
  entrypoint with Exec= providing the server args, matching pod.yaml
  args: behavior.
- AddHost=<POD_NAME>:127.0.0.1 on all containers replicates the
  /etc/hosts entry play kube injected, required by langfuse 3.222+
  which resolves the pod hostname at startup.
- Healthchecks ported from livenessProbe exec commands (HealthCmd,
  HealthStartPeriod maps initialDelaySeconds).

Verified on dev: all 9 containers healthy, 193/193 unit tests pass,
crash recovery (kill -> systemd auto-restart <12s), canonical HTTPS
endpoints green (model timeouts on free tier are pre-existing,
identical on prod play-kube).
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@sourcery-ai

sourcery-ai Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Replaces direct podman play kube deployment with a hardened systemd Quadlet-based stack, centralizes external URL derivation and canonical verification behavior, and adds tests/docs/upgrade tooling to keep Quadlet templates consistent and safe for production and dev use.

File-Level Changes

Change Details Files
Introduce Quadlet-based deployment with staged rendering, ownership detection, and systemd-driven lifecycle instead of plain podman pod management.
  • Define a single Quadlet pod unit name used for ownership detection, lifecycle operations, and diagnostics
  • Add stack_ownership() helper that inspects PODMAN_SYSTEMD_UNIT labels and user units to classify the stack as quadlet/legacy/absent
  • Require a reachable systemd --user manager before Quadlet deployment
  • Implement render_quadlets() to render quadlets/*.pod and *.container templates into a private config dir with placeholder validation, Environment= quoting, and atomic staging
  • Implement deploy_quadlets() to daemon-reload, then start or restart the Quadlet pod unit and treat systemd failures as deployment failures
  • Change deploy_fresh_pod() and main restart path to use Quadlet deployment/restart for Quadlet-owned stacks while preserving legacy pod restart behavior
start-stack.sh
Unify external service URL derivation and adjust router URL resolution semantics to use service subdomains while preserving router paths and ports.
  • Add derive_external_service_urls shell helper to normalize PUBLIC_BASE_URL (including scheme-less values) and compute derived PROXY_BASE_URL/NEXTAUTH_URL for both legacy and Quadlet rendering paths and success messages
  • Update pod.yaml rendering to consume PROXY_BASE_URL_DERIVED and NEXTAUTH_URL_DERIVED instead of recomputing from PUBLIC_BASE_URL
  • Change LiteLLM Admin UI success messages to use the derived proxy URL rather than assuming PUBLIC_BASE_URL/litellm/ui
  • Modify resolve_external_urls() to produce langfuse./litellm./llama. service subdomains, normalize dashboard/litellm/langfuse/llama host variants, and preserve explicit public ports with logging on invalid ports
start-stack.sh
router/main.py
Harden canonical URL verifier to handle scheme-less PUBLIC_BASE_URL and to validate canonical service endpoints derived from the router host.
  • Normalize PUBLIC_BASE_URL into a full URL (adding default https scheme when missing) and extract router_base that preserves any configured path prefix
  • Switch canonical checks to target router_base for router endpoints and service subdomains for LiteLLM/Langfuse/llama.cpp, including a dedicated llama health check
  • Keep graceful skip behavior when PUBLIC_BASE_URL lacks a host and update test expectations to the new URL forms
scripts/verification/verify_canonical_endpoints.py
router/tests/test_resolve_external_urls.py
Document the Quadlet-based deployment model, canonical URLs, and dev local-model safety net, and ensure upgrade tooling syncs Quadlet templates.
  • Update main README and scripts/README to describe Quadlet-managed stack lifecycle, systemd/journalctl diagnostics, new start-stack.sh semantics, and canonical URL behavior including service hostnames
  • Clarify container count in the pod and explain dev local-model safety net using host-networked 127.0.0.1:8083 without depending on TLS-terminated hostnames
  • Extend upgrade-prod.sh to treat quadlets/ as a runtime directory: verify presence, include it in dry-run diffs, confirmation messaging, and rsync sync with --delete
README.md
scripts/README.md
scripts/upgrade-prod.sh
Add static tests to enforce Quadlet template integrity, deployment contracts, and rendering behavior.
  • Introduce tests ensuring exactly nine Quadlet containers exist, all belong to llm-routing.pod and follow naming conventions
  • Assert all Quadlet containers have health checks, use HealthOnFailure=kill and Restart=always, and contain only placeholders (no embedded secrets)
  • Verify upgrade-prod.sh syncs quadlets/ and that start-stack.sh enforces secure permissions, uses the expected Quadlet unit name, quotes Environment= lines, stages renders before replacing live units, and reports systemd failures
tests/test_quadlet_templates.py
quadlets/llm-routing.pod
quadlets/llm-routing-*.container

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@github-actions github-actions Bot added documentation Improvements or additions to documentation router scripts tests labels Jul 22, 2026
@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@sheepdestroyer, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 38 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ad71d548-a6fc-4b8a-ab97-442706cbabd6

📥 Commits

Reviewing files that changed from the base of the PR and between f65b89e and dcbf6d7.

📒 Files selected for processing (5)
  • quadlets/llm-routing-router.container
  • router/main.py
  • scripts/verification/verify_canonical_endpoints.py
  • start-stack.sh
  • tests/test_quadlet_templates.py
📝 Walkthrough

Walkthrough

This PR migrates stack deployment to systemd Quadlets, adds container units and lifecycle handling, changes canonical service URLs to subdomains, updates development endpoints, and expands deployment, endpoint verification, documentation, and regression tests.

Changes

Quadlet deployment and canonical routing

Layer / File(s) Summary
Canonical service URL routing and verification
.env.dev, router/..., scripts/verification/..., README.md
Development endpoints now target local llama.cpp listeners, while router and verifier logic construct Langfuse, LiteLLM, and llama subdomain URLs and preserve explicit ports.
Quadlet pod and service definitions
quadlets/*
Adds the Quadlet pod plus PostgreSQL, ClickHouse, Valkey, MinIO, Langfuse, LiteLLM, and router container units with dependencies, environment wiring, volumes, health checks, and restart policies.
Quadlet rendering, lifecycle, and deployment validation
start-stack.sh, scripts/upgrade-prod.sh, scripts/README.md, tests/test_quadlet_templates.py, README.md
Adds Quadlet rendering, ownership-aware systemd lifecycle management, atomic installation, production synchronization, updated usage documentation, and static deployment contract tests.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant StartStack as start-stack.sh
  participant Systemd as User systemd manager
  participant Podman as Quadlet-managed pod
  participant Services as Application containers
  Operator->>StartStack: run stack deployment or restart
  StartStack->>StartStack: derive service URLs and render units
  StartStack->>Systemd: daemon-reload and start/restart pod unit
  Systemd->>Podman: create or reconcile pod
  Podman->>Services: start dependent containers
  Services-->>StartStack: expose health endpoints
Loading

Possibly related issues

  • #345: Covers the dev local-model fallback URLs and canonical verifier behavior changed by this PR.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.43% 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 accurately summarizes the Quadlet deployment hardening and dev safety-net changes.
Linked Issues check ✅ Passed The PR implements the Quadlet lifecycle, URL routing, verification, docs, and test updates required by #346.
Out of Scope Changes check ✅ Passed The changes stay within deployment hardening, canonical routing, dev safety-net, docs, and regression coverage.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/quadlet-review-safety-net

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

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

Hey - I've left some high level feedback:

  • The environment export lists for render_pod_yaml and render_quadlets are very similar but not identical; consider centralizing the shared variable set (or generating it once) to reduce drift risk when adding/removing config keys.
  • derive_external_service_urls is invoked multiple times and shells out to Python each time; you might want to compute and export PROXY_BASE_URL_DERIVED/NEXTAUTH_URL_DERIVED once after loading .env and reuse them to avoid repeated subprocess work and keep behavior consistent across code paths.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The environment export lists for `render_pod_yaml` and `render_quadlets` are very similar but not identical; consider centralizing the shared variable set (or generating it once) to reduce drift risk when adding/removing config keys.
- `derive_external_service_urls` is invoked multiple times and shells out to Python each time; you might want to compute and export `PROXY_BASE_URL_DERIVED`/`NEXTAUTH_URL_DERIVED` once after loading `.env` and reuse them to avoid repeated subprocess work and keep behavior consistent across code paths.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@sheepdestroyer

Copy link
Copy Markdown
Owner Author

The dev local safety-net upstream has been corrected and redeployed: rendered LiteLLM config now uses http://127.0.0.1:8083/v1 rather than the unreachable x570 hostname. The remaining local completion delay is llama-router load contention, while OpenRouter free quota remains exhausted; the detailed current evidence is tracked in #345.

@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: 4

Caution

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

⚠️ Outside diff range comments (1)
router/main.py (1)

3515-3523: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the external-host regex character class.

r"^[a-zA-Z0-9.-:]+$" treats .-: as a range from . to :, so hyphenated hostnames fail the sanity check while / is accepted. This makes common values like my-router.example.com fall back to request.base_url.hostname unnecessarily.

🐛 Proposed fix
-    if not isinstance(external_host, str) or not re.match(r"^[a-zA-Z0-9.-:]+$", external_host):
+    if not isinstance(external_host, str) or not re.match(r"^[a-zA-Z0-9.:-]+$", external_host):
🤖 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 `@router/main.py` around lines 3515 - 3523, Fix the character class in the
external_host validation within the request handling flow so hyphens are treated
literally rather than forming a range with adjacent characters. Preserve support
for valid hostname characters while rejecting slash, ensuring values such as
hyphenated hostnames do not unnecessarily fall back to
request.base_url.hostname.
🧹 Nitpick comments (2)
scripts/verification/verify_canonical_endpoints.py (1)

610-621: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Unused label in the endpoints loop.

label (e.g. "router models", "dashboard", "LiteLLM admin UI") is never used in the loop body — check() only receives the raw url, so failure/pass output loses the human-readable description. Since this script exists purely for diagnostics, incorporating the label improves triage.

♻️ Proposed fix
-    for url, label in endpoints:
+    for url, label in endpoints:
         total += 1
         try:
             r = httpx.get(url, timeout=15, follow_redirects=True,
                           headers={"Authorization": f"Bearer {cfg['router_api_key']}"})
             ok = r.status_code == 200
-            passed += check(f"GET {url}", ok, f"HTTP {r.status_code}")
+            passed += check(f"GET {url} ({label})", ok, f"HTTP {r.status_code}")
🤖 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 `@scripts/verification/verify_canonical_endpoints.py` around lines 610 - 621,
Update the endpoints loop in the verification flow so each endpoint’s
human-readable label is passed into the existing check/reporting path alongside
its URL. Replace the unused label binding with the appropriate check invocation
or diagnostic output, preserving the endpoint count and URL validation behavior
while ensuring failures and passes identify the labeled endpoint.

Source: Linters/SAST tools

start-stack.sh (1)

676-687: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Stop using unreachable render Pod_yaml branch or restore it.

render_pod_yaml() remains defined, but every deploy_fresh_pod() path now calls deploy_quadlets() directly, and render_pod_yaml() has no caller. This dead branch can confuse maintenance while render_quadlets() now carries all deployment cases.

🤖 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 `@start-stack.sh` around lines 676 - 687, Remove the unused render_pod_yaml
function, including its environment exports and derive_external_service_urls
call, since deploy_fresh_pod now routes all deployment cases through
deploy_quadlets and render_quadlets. Do not alter the active quadlet deployment
flow.
🤖 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 `@start-stack.sh`:
- Around line 976-984: Enforce the result of require_user_systemd in the
STACK_OWNERSHIP == "quadlet" restart path before running systemctl --user
reset-failed or restart. Update this guard to terminate when the prerequisite
fails, while preserving the existing restart error handling and messages.
- Around line 810-823: Handle the return status from
derive_external_service_urls in render_quadlets before rendering continues. If
the helper fails, stop this live rendering path and propagate a clear error
instead of proceeding to the later environment-variable lookups that can produce
a misleading KeyError.
- Around line 985-988: Update the legacy restart branch around podman pod
restart to check its exit status and exit 1 when the restart fails, matching the
failure handling in the sibling Quadlet-owned branch. Ensure
setup_minio_buckets, verify_stack_health, and the success message are reached
only after a successful restart.
- Around line 921-946: Update deploy_quadlets to enforce the return status of
require_user_systemd: immediately stop and return a failure when that guard
fails, before executing render_quadlets or any systemctl commands. Preserve the
existing explicit error handling for daemon-reload, restart, and start.

---

Outside diff comments:
In `@router/main.py`:
- Around line 3515-3523: Fix the character class in the external_host validation
within the request handling flow so hyphens are treated literally rather than
forming a range with adjacent characters. Preserve support for valid hostname
characters while rejecting slash, ensuring values such as hyphenated hostnames
do not unnecessarily fall back to request.base_url.hostname.

---

Nitpick comments:
In `@scripts/verification/verify_canonical_endpoints.py`:
- Around line 610-621: Update the endpoints loop in the verification flow so
each endpoint’s human-readable label is passed into the existing check/reporting
path alongside its URL. Replace the unused label binding with the appropriate
check invocation or diagnostic output, preserving the endpoint count and URL
validation behavior while ensuring failures and passes identify the labeled
endpoint.

In `@start-stack.sh`:
- Around line 676-687: Remove the unused render_pod_yaml function, including its
environment exports and derive_external_service_urls call, since
deploy_fresh_pod now routes all deployment cases through deploy_quadlets and
render_quadlets. Do not alter the active quadlet deployment flow.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: f56cf165-36e8-4b85-b65c-318a622b0a3f

📥 Commits

Reviewing files that changed from the base of the PR and between 7d42cc4 and f65b89e.

📒 Files selected for processing (19)
  • .env.dev
  • README.md
  • quadlets/llm-routing-clickhouse.container
  • quadlets/llm-routing-langfuse-web.container
  • quadlets/llm-routing-langfuse-worker.container
  • quadlets/llm-routing-litellm.container
  • quadlets/llm-routing-minio.container
  • quadlets/llm-routing-postgres.container
  • quadlets/llm-routing-router.container
  • quadlets/llm-routing-valkey-cache.container
  • quadlets/llm-routing-valkey-lf.container
  • quadlets/llm-routing.pod
  • router/main.py
  • router/tests/test_resolve_external_urls.py
  • scripts/README.md
  • scripts/upgrade-prod.sh
  • scripts/verification/verify_canonical_endpoints.py
  • start-stack.sh
  • tests/test_quadlet_templates.py

Comment thread start-stack.sh
Comment thread start-stack.sh
Comment thread start-stack.sh
Comment thread start-stack.sh
@sheepdestroyer

Copy link
Copy Markdown
Owner Author

Follow-up to the independent-review finding: fixed and redeployed in commit 05b69f9. The Exec command now reasserts the dev llama URLs after sourcing /config/.env; verified in the live dev router that both LLAMA_CLASSIFIER_URL and LLAMA_SERVER_URL are http://127.0.0.1:8083. Full tests (203) and the dev full rebuild passed.

@sheepdestroyer

Copy link
Copy Markdown
Owner Author

Final review round complete: addressed valid CodeRabbit findings (enforced systemd/URL-derivation guards, legacy restart failure handling, corrected host validation regex, labeled canonical verifier checks, and removed obsolete pod.yaml renderer). The independent review’s dev-overlay finding is also fixed. CI is green; current dev deployment is healthy and effective router llama URLs are both http://127.0.0.1:8083. The remaining capacity/load E2E limitation remains documented in #345.

@sheepdestroyer
sheepdestroyer merged commit 8e7eb90 into master Jul 22, 2026
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation router scripts tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant