Skip to content

fix(llm): honor legacy llm_override endpoints behind an opt-in flag - #834

Draft
paultranvan wants to merge 5 commits into
developfrom
fix/legacy-llm-override-endpoint
Draft

fix(llm): honor legacy llm_override endpoints behind an opt-in flag#834
paultranvan wants to merge 5 commits into
developfrom
fix/legacy-llm-override-endpoint

Conversation

@paultranvan

@paultranvan paultranvan commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Problem

Before the services refactor, metadata.llm_override honored base_url and
api_key alongside model (components/llm.py, pre-refactor):

base_url = (llm_override.get("base_url") or self._base_url).rstrip("/")
api_key  =  llm_override.get("api_key")  or self._api_key

VLLMClient._resolve_overrides deliberately dropped that — honoring a
client-supplied endpoint is SSRF, and falling back to the server's key would ship
it to the attacker's host.

The removal is right, but it fails silently and misleadingly. model is still
applied while base_url is dropped, so a legacy client's request goes to the
server's endpoint carrying a third party's model name. What the operator sees
is an unrelated-looking 400 from the wrong provider:

LLM streaming error (400): Invalid model name passed in model=gpt-5.1.
Call `/v1/models` to view available models for your key.

Change

Opt-in LLM_OVERRIDE_ALLOW_CUSTOM_ENDPOINT. Unset — the default — changes
nothing: base_url/api_key in an override stay ignored exactly as today, so an
upgrade never turns an untouched deployment into an SSRF surface.

When on, the target URL is unrestricted. This is a deliberate trade, not an
oversight: deployments migrating off pre-refactor clients need arbitrary endpoints
and cannot enumerate them in advance. With the flag on, any caller who can reach
/v1/chat/completions can make the server POST to any URL it can route to —
cloud metadata, internal admin services. .env.example says so in those words,
and test_no_host_restriction_when_enabled asserts it against three such URLs so
the exposure is documented in the test suite rather than discovered later.

Two properties survive the trade:

  • The server's API key is never sent to an overridden endpoint. The override's
    api_key is used, or no Authorization at all — never a fallback to
    self._api_key.
  • http/https only. httpx would reject the rest anyway; failing here turns an
    opaque transport error into a named 4xx, which also keeps with_retry
    (429/502/503/504 only) from re-attempting.

Authorization moved to per-request headers

Required for the first guarantee, and a latent leak on its own. Authorization
was set on the shared httpx.AsyncClient; httpx merges client-level headers into
every request and offers no way to drop one, so the server's key would ride along
to an overridden endpoint whenever the override carried no key of its own. It is
now built per request in _resolve_overrides, which consequently returns a
headers dict rather than Optional. VLLMEmbedder / VLLMVision are untouched —
they take no overrides.

Tests

9 unit tests in TestLegacyEndpointOverride, plus 4 assertion updates in
TestVLLMClientOverrides for the headers-dict return.

Covered: arbitrary endpoint honored with the client key; no host restriction
(parametrized over metadata IP / localhost / userinfo-prefixed host); keyless
override yields no Authorization, asserted both at the resolver and on the wire;
non-http rejected and asserted non-retryable via _is_retryable; disabled by
default; caller metadata not mutated; end-to-end chat landing on the overridden
host with the client's key; and the server key still sent when there is no
override (the regression the header move could have caused).

Full unit suite: no new failures (2204 → 2215 passing).

Summary by CodeRabbit

  • Security
    • Added an opt-in legacy escape hatch for overriding the LLM endpoint.
    • When enabled, validates custom override URLs use only HTTP/HTTPS and rejects invalid schemes as non-retryable errors.
    • Ensures per-request authorization uses the caller-provided API key (and omits it if not provided).
  • Documentation
    • Documented legacy override behavior, SSRF risk, and safer alternatives via named endpoints, plus optional host whitelisting guidance.
  • Tests
    • Expanded unit coverage for both hardened default behavior and opt-in legacy override routing.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4c98a57c-6a87-4731-9f5c-2519ffa88f45

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds an opt-in legacy metadata.llm_override endpoint path for VLLMClient, validates override schemes, resolves per-request credentials, documents the escape hatch, and adds comprehensive unit coverage for enabled and disabled behavior.

Changes

Legacy LLM override handling

Layer / File(s) Summary
Override contract and configuration
infra/compose/.env.example, openrag/services/inference/vllm_client.py
Documents metadata.llm_override and the opt-in LLM_OVERRIDE_ALLOW_CUSTOM_ENDPOINT flag, including endpoint security considerations.
Endpoint and authorization resolution
openrag/services/inference/vllm_client.py
Always applies model overrides; conditionally accepts HTTP(S) base_url overrides and derives per-request authorization from the appropriate API key.
Override behavior coverage
tests/unit/services/inference/test_vllm_client.py
Tests default behavior, opt-in routing, authorization headers, invalid schemes, metadata immutability, missing keys, and non-retryable errors.

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

Sequence Diagram(s)

sequenceDiagram
  participant ClientMetadata
  participant VLLMClient
  participant LLMEndpoint
  ClientMetadata->>VLLMClient: Provide metadata.llm_override
  VLLMClient->>VLLMClient: Gate and validate base_url
  VLLMClient->>LLMEndpoint: Send chat request with resolved model and headers
Loading

Possibly related PRs

  • linagora/openrag#467: Directly relates to the handling of legacy metadata.llm_override model, endpoint, and credential overrides.

Suggested labels: fix, documentation

Suggested reviewers: ahmath-gadji, andyne13, thibautchoppy

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: legacy llm_override endpoint overrides are honored only behind an opt-in flag.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/legacy-llm-override-endpoint

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.

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation fix Fix issue labels Jul 28, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (3)
tests/unit/services/inference/test_vllm_client.py (2)

387-397: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Consider adding a malformed-port case here.

test_allowlist_entry_may_pin_a_port is the natural home for https://llm.internal:notaport/v1, which currently escapes _host_key as a ValueError rather than an InferenceError (see the comment on openrag/services/inference/vllm_client.py Line 135-145).

🤖 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 `@tests/unit/services/inference/test_vllm_client.py` around lines 387 - 397,
Add a malformed-port assertion to test_allowlist_entry_may_pin_a_port using a
base URL such as https://llm.internal:notaport/v1, and verify _resolve_overrides
raises InferenceError rather than leaking ValueError. Update the corresponding
_host_key handling in the vLLM client so invalid ports are consistently
converted to InferenceError.

399-410: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Sharpen this test so it pins the no-op contract.

The override here is byte-identical to the configured endpoint, so the assertion passes whether the implementation returns self._endpoint or the client string. Using a differing path (e.g. http://default:8000/internal/admin) would surface the path-forwarding gap flagged on openrag/services/inference/vllm_client.py Line 245-249.

🤖 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 `@tests/unit/services/inference/test_vllm_client.py` around lines 399 - 410,
Update test_own_endpoint_host_needs_no_allowlist_and_keeps_server_key to use a
same-host override with a different path, such as
http://default:8000/internal/admin, while preserving the existing model and
header assertions. Assert that _resolve_overrides forwards the override URL
unchanged, pinning the no-op behavior and exposing any path loss.
openrag/services/inference/vllm_client.py (1)

123-132: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Allowlist entries are only lowercased, not normalized.

An operator writing https://api.openai.com or api.openai.com/ (both plausible given the env var holds URLs elsewhere in the file) silently never matches, and every override is rejected with a message that looks like the host isn't listed. Also worth documenting: llm.internal:443 won't match https://llm.internal/v1 because the default port is implicit.

Stripping a scheme prefix and trailing slashes at parse time, or logging a warning for entries containing / or ://, would make misconfiguration self-evident.

🤖 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 `@openrag/services/inference/vllm_client.py` around lines 123 - 132, Update
_allowed_override_hosts to normalize allowlist entries by removing an optional
URL scheme and trailing slashes before lowercasing and storing them, so values
such as https://api.openai.com and api.openai.com/ match host comparisons.
Preserve explicit ports as entered and document or warn that entries like
llm.internal:443 do not match URLs using an implicit default port.
🤖 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 `@openrag/services/inference/vllm_client.py`:
- Around line 245-249: Update the self-endpoint branch in the override
validation logic to return the configured self._endpoint rather than the
client-controlled candidate, while retaining the existing no-op detection based
on matching host and port. Preserve the existing None return and allow the
byte-identical endpoint test to continue passing.
- Around line 135-145: Normalize malformed candidate URL parsing failures into
the documented non-retryable 400 LLM_OVERRIDE_REJECTED response. Update the
candidate URL validation path around _host_key so it catches ValueError from
urlsplit or parts.port and routes the candidate through the existing rejection
handling, while avoiding conversion of self._endpoint configuration errors into
client-facing 400 responses.

---

Nitpick comments:
In `@openrag/services/inference/vllm_client.py`:
- Around line 123-132: Update _allowed_override_hosts to normalize allowlist
entries by removing an optional URL scheme and trailing slashes before
lowercasing and storing them, so values such as https://api.openai.com and
api.openai.com/ match host comparisons. Preserve explicit ports as entered and
document or warn that entries like llm.internal:443 do not match URLs using an
implicit default port.

In `@tests/unit/services/inference/test_vllm_client.py`:
- Around line 387-397: Add a malformed-port assertion to
test_allowlist_entry_may_pin_a_port using a base URL such as
https://llm.internal:notaport/v1, and verify _resolve_overrides raises
InferenceError rather than leaking ValueError. Update the corresponding
_host_key handling in the vLLM client so invalid ports are consistently
converted to InferenceError.
- Around line 399-410: Update
test_own_endpoint_host_needs_no_allowlist_and_keeps_server_key to use a
same-host override with a different path, such as
http://default:8000/internal/admin, while preserving the existing model and
header assertions. Assert that _resolve_overrides forwards the override URL
unchanged, pinning the no-op behavior and exposing any path loss.
🪄 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: Pro Plus

Run ID: f27c2af0-1206-44a9-852d-0096fee243b3

📥 Commits

Reviewing files that changed from the base of the PR and between db3482c and 0800609.

📒 Files selected for processing (3)
  • infra/compose/.env.example
  • openrag/services/inference/vllm_client.py
  • tests/unit/services/inference/test_vllm_client.py

Comment on lines +135 to +145
def _host_key(url: str) -> tuple[str, str, str]:
"""Split *url* into ``(scheme, host, host:port)``, lowercased.

``urlsplit().hostname`` is what makes the allowlist safe against userinfo
smuggling: for ``https://api.openai.com@evil.tld/v1`` it returns ``evil.tld``,
the host the request would actually reach, not the reassuring prefix.
"""
parts = urlsplit(url)
host = (parts.hostname or "").lower()
hostport = f"{host}:{parts.port}" if parts.port else host
return parts.scheme.lower(), host, hostport

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

urlsplit(...).port can raise ValueError, escaping the 4xx contract.

parts.port raises ValueError for a non-numeric or out-of-range port (https://api.openai.com:notaport/v1, https://api.openai.com:99999/v1), and urlsplit itself raises for malformed IPv6 literals (http://[::1/v1). Since base_url is client-supplied via metadata.llm_override, this propagates out of chat/generate as an unhandled ValueError (500, unstructured) instead of the documented non-retryable 400 LLM_OVERRIDE_REJECTED.

🛡️ Proposed fix: normalize parse failures into the rejection path
-    parts = urlsplit(url)
-    host = (parts.hostname or "").lower()
-    hostport = f"{host}:{parts.port}" if parts.port else host
-    return parts.scheme.lower(), host, hostport
+    try:
+        parts = urlsplit(url)
+        port = parts.port
+    except ValueError as exc:
+        raise InferenceError(
+            f"llm_override.base_url {url!r} is not a valid URL",
+            code="LLM_OVERRIDE_REJECTED",
+            status_code=400,
+        ) from exc
+    host = (parts.hostname or "").lower()
+    hostport = f"{host}:{port}" if port else host
+    return parts.scheme.lower(), host, hostport

Note _host_key is also called on self._endpoint (Line 248); a server misconfiguration would then surface as a 400, so you may prefer to wrap only the candidate call site instead.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def _host_key(url: str) -> tuple[str, str, str]:
"""Split *url* into ``(scheme, host, host:port)``, lowercased.
``urlsplit().hostname`` is what makes the allowlist safe against userinfo
smuggling: for ``https://api.openai.com@evil.tld/v1`` it returns ``evil.tld``,
the host the request would actually reach, not the reassuring prefix.
"""
parts = urlsplit(url)
host = (parts.hostname or "").lower()
hostport = f"{host}:{parts.port}" if parts.port else host
return parts.scheme.lower(), host, hostport
def _host_key(url: str) -> tuple[str, str, str]:
"""Split *url* into ``(scheme, host, host:port)``, lowercased.
``urlsplit().hostname`` is what makes the allowlist safe against userinfo
smuggling: for ``https://api.openai.com@evil.tld/v1`` it returns ``evil.tld``,
the host the request would actually reach, not the reassuring prefix.
"""
try:
parts = urlsplit(url)
port = parts.port
except ValueError as exc:
raise InferenceError(
f"llm_override.base_url {url!r} is not a valid URL",
code="LLM_OVERRIDE_REJECTED",
status_code=400,
) from exc
host = (parts.hostname or "").lower()
hostport = f"{host}:{port}" if port else host
return parts.scheme.lower(), host, hostport
🤖 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 `@openrag/services/inference/vllm_client.py` around lines 135 - 145, Normalize
malformed candidate URL parsing failures into the documented non-retryable 400
LLM_OVERRIDE_REJECTED response. Update the candidate URL validation path around
_host_key so it catches ValueError from urlsplit or parts.port and routes the
candidate through the existing rejection handling, while avoiding conversion of
self._endpoint configuration errors into client-facing 400 responses.

Comment on lines +245 to +249
# Pointing the override at the endpoint the server would have used anyway
# is a no-op, so it needs no allowlist entry and keeps the server's key —
# no third party is involved and nothing is disclosed.
if (host, hostport) == _host_key(self._endpoint)[1:]:
return candidate, None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Self-endpoint "no-op" branch still forwards a client-controlled path with the server's key.

The host/port match makes this a no-op only at the host level — the path is still attacker-controlled. base_url = "http://default:8000/internal/admin" passes this branch, needs no allowlist entry, and the request goes out with the server's Authorization header to an arbitrary path on the internal LLM host. If it's genuinely a no-op, return the configured endpoint.

🔒️ Proposed fix
-        if (host, hostport) == _host_key(self._endpoint)[1:]:
-            return candidate, None
+        if (host, hostport) == _host_key(self._endpoint)[1:]:
+            return self._endpoint, None

tests/unit/services/inference/test_vllm_client.py:399-410 still passes, since the override there is byte-identical to the configured endpoint.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Pointing the override at the endpoint the server would have used anyway
# is a no-op, so it needs no allowlist entry and keeps the server's key —
# no third party is involved and nothing is disclosed.
if (host, hostport) == _host_key(self._endpoint)[1:]:
return candidate, None
# Pointing the override at the endpoint the server would have used anyway
# is a no-op, so it needs no allowlist entry and keeps the server's key —
# no third party is involved and nothing is disclosed.
if (host, hostport) == _host_key(self._endpoint)[1:]:
return self._endpoint, None
🤖 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 `@openrag/services/inference/vllm_client.py` around lines 245 - 249, Update the
self-endpoint branch in the override validation logic to return the configured
self._endpoint rather than the client-controlled candidate, while retaining the
existing no-op detection based on matching host and port. Preserve the existing
None return and allow the byte-identical endpoint test to continue passing.

@paultranvan paultranvan changed the title fix(llm): allow legacy llm_override endpoint on an allowlist fix(llm): honor legacy llm_override endpoints behind an opt-in flag Jul 28, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
openrag/services/inference/vllm_client.py (1)

237-245: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Malformed override URLs are neither handled nor tested. urlsplit raises ValueError on inputs like http://[::1/v1, and no test covers that path, so the gap between the documented 400 LLM_OVERRIDE_REJECTED contract and the actual 500 goes unnoticed.

  • openrag/services/inference/vllm_client.py#L237-L245: wrap the urlsplit(candidate) call in try/except ValueError and re-raise as InferenceError(code="LLM_OVERRIDE_REJECTED", status_code=400).
  • tests/unit/services/inference/test_vllm_client.py#L390-L400: add a case alongside the file:// test asserting base_url="http://[::1/v1" also yields a non-retryable 400.
🤖 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 `@openrag/services/inference/vllm_client.py` around lines 237 - 245, Malformed
override URLs currently escape the documented rejection path. In
openrag/services/inference/vllm_client.py lines 237-245, update the base_url
parsing around urlsplit in the LLM override validation to catch ValueError and
re-raise InferenceError with code LLM_OVERRIDE_REJECTED and status_code 400; in
tests/unit/services/inference/test_vllm_client.py lines 390-400, add a case
alongside the file:// test for base_url="http://[::1/v1" that asserts a
non-retryable 400 rejection.
🧹 Nitpick comments (1)
tests/unit/services/inference/test_vllm_client.py (1)

259-264: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Make TestVLLMClientOverrides hermetic w.r.t. the new env flag.

test_client_base_url_and_api_key_override_ignored asserts the disabled behavior but never clears LLM_OVERRIDE_ALLOW_CUSTOM_ENDPOINT, so it fails if a developer or CI image has the variable exported. TestLegacyEndpointOverride already delenvs it.

♻️ Proposed fix
-    def _make_client(self):
+    def _make_client(self, monkeypatch):
+        monkeypatch.delenv("LLM_OVERRIDE_ALLOW_CUSTOM_ENDPOINT", raising=False)
         return VLLMClient(
             endpoint="http://default:8000/v1",
             model_name="default-model",
             api_key="default-key",
         )

Each test in the class then takes monkeypatch and passes it through, or use an autouse fixture on the class to avoid touching every signature.

🤖 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 `@tests/unit/services/inference/test_vllm_client.py` around lines 259 - 264,
Make TestVLLMClientOverrides hermetic by ensuring
LLM_OVERRIDE_ALLOW_CUSTOM_ENDPOINT is cleared before each test, preferably via
an autouse fixture on the class or by applying monkeypatch in every test.
Preserve the existing disabled-override assertions and avoid changing
_make_client’s default client configuration.
🤖 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 `@openrag/services/inference/vllm_client.py`:
- Around line 247-250: Sanitize the legacy override endpoint before the debug
log in the llm_override handling flow, using the existing urlsplit result rather
than reparsing candidate. Keep parsing and parts.port access inside the existing
guarded error handling, and log a form that excludes userinfo and credentials
while preserving the safe endpoint details.

---

Outside diff comments:
In `@openrag/services/inference/vllm_client.py`:
- Around line 237-245: Malformed override URLs currently escape the documented
rejection path. In openrag/services/inference/vllm_client.py lines 237-245,
update the base_url parsing around urlsplit in the LLM override validation to
catch ValueError and re-raise InferenceError with code LLM_OVERRIDE_REJECTED and
status_code 400; in tests/unit/services/inference/test_vllm_client.py lines
390-400, add a case alongside the file:// test for base_url="http://[::1/v1"
that asserts a non-retryable 400 rejection.

---

Nitpick comments:
In `@tests/unit/services/inference/test_vllm_client.py`:
- Around line 259-264: Make TestVLLMClientOverrides hermetic by ensuring
LLM_OVERRIDE_ALLOW_CUSTOM_ENDPOINT is cleared before each test, preferably via
an autouse fixture on the class or by applying monkeypatch in every test.
Preserve the existing disabled-override assertions and avoid changing
_make_client’s default client configuration.
🪄 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: Pro Plus

Run ID: df051a1b-8c20-4f43-9e9d-ed9b9f4742fb

📥 Commits

Reviewing files that changed from the base of the PR and between 0800609 and 31e0985.

📒 Files selected for processing (3)
  • infra/compose/.env.example
  • openrag/services/inference/vllm_client.py
  • tests/unit/services/inference/test_vllm_client.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • infra/compose/.env.example

Comment thread openrag/services/inference/vllm_client.py
@paultranvan
paultranvan marked this pull request as draft July 29, 2026 07:02
@paultranvan
paultranvan force-pushed the fix/legacy-llm-override-endpoint branch from 6a4c6ba to b489bb2 Compare July 29, 2026 15:54
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 fix Fix issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant