Skip to content

fix(runtime): shared Gemma routing, bounded structured reranking, embedding health, and attributed errors - #68

Merged
WilliamAGH merged 12 commits into
mainfrom
dev
Jul 12, 2026
Merged

fix(runtime): shared Gemma routing, bounded structured reranking, embedding health, and attributed errors#68
WilliamAGH merged 12 commits into
mainfrom
dev

Conversation

@WilliamAGH

@WilliamAGHWilliamAGH commented Jul 12, 2026

Copy link
Copy Markdown
Owner

Summary

Java Chat dev routes user-facing chat through the shared gateway's regular Gemma alias while preserving its separate Qwen embedding provider path. The branch also hardens reranking output, embedding-provider health and recovery, request-failure attribution, and enabled live-test startup.

Changes

  • Shared Gemma routing: Gateway setups explicitly select the OpenAI-compatible provider and use the regular gemma-4-26b-a4b alias, which may fail over across configured gateway providers (.env.example, docs/configuration.md).
  • Independent embeddings: Chat gateway settings do not change the explicit Qwen embedding provider, model, or base URL (EmbeddingClient, LocalEmbeddingClient, OpenAiCompatibleEmbeddingClient).
  • Bounded structured reranking: Reranker completions require a JSON object, receive enough output budget for hidden reasoning, and constrain document indices to the supplied candidates (OpenAiRequestFactory, OpenAIStreamingService, RerankerService).
  • Observable embedding recovery: Probes report initializing, ready, slow, and unavailable states through Actuator health, with prompt retries after provider outages (EmbeddingModelKeepAlive).
  • Attributed request failures: API and page failures log bounded, sanitized request metadata with severity appropriate to the failure (CustomErrorController).
  • Constructible live-test contexts: Chat and guided SSE integration contexts satisfy the embedding model-name contract before Spring creates the keep-alive bean (ChatSseIntegrationTest, GuidedSseIntegrationTest).

Verification

  • Repository pre-push build, 261-test suite, and lint gates passed.
  • PR head is pushed to origin/dev.
  • 17 files changed across 11 focused commits.
  • Live Java Chat dev prompt completed and rendered three Oracle JDK source links without browser errors.
  • Live gateway checks passed for alias discovery, strict structured output, strict tool calling, and request correlation.

Deployment notes

Pushing dev triggers the Java Chat dev deployment. User-facing chat uses gemma-4-26b-a4b through the shared gateway; embeddings remain on their existing explicit provider and model configuration.

Related investigation: aventurevc/back-end#1118

Log bounded request metadata and request IDs for API 404s and server errors while keeping browser 404 noise at info.
Document the queued gateway alias and its configured provider failover without changing the application fallback.
Probe latency alone cannot prove a remote model reload, and reporting every slow success as a warning obscured genuine provider failures. Make the lifecycle state explicit so health and logs reflect observed outcomes.
- classify ready, slow, unavailable, repeated, and recovered probes
- expose embedding availability through Actuator health with prompt recovery retries
- attribute events to the configured model and cover state transitions deterministically
Keep lifecycle escalation policy explicit and satisfy the repository magic-literal contract.
- share one domain-qualified threshold across slow and failed probe loops
CopilotAI review requested due to automatic review settings July 12, 2026 20:29
@WilliamAGHWilliamAGH added bug Something isn't working documentation Improvements or additions to documentation enhancement New feature or request java Pull requests that update java code labels Jul 12, 2026
@coderabbitai

coderabbitaiBot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

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

Next review available in:30 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3ab41b93-05e2-482e-aabf-36c4eb20bb34

📥 Commits

Reviewing files that changed from the base of the PR and between 44668ca and ce83029.

📒 Files selected for processing (7)
  • .env.example
  • docs/api.md
  • docs/configuration.md
  • src/main/java/com/williamcallahan/javachat/service/RerankerService.java
  • src/test/java/com/williamcallahan/javachat/service/RerankerServiceTest.java
  • src/test/java/com/williamcallahan/javachat/web/ChatSseIntegrationTest.java
  • src/test/java/com/williamcallahan/javachat/web/GuidedSseIntegrationTest.java
📝 Walkthrough

Walkthrough

The changes add embedding health indicators, enforce JSON-object completion for reranking, structure and sanitize error logs, document gateway failover configuration, and adjust application test mocking.

Changes

Embedding health lifecycle

Layer / File(s)Summary
Embedding probe contract and health state
src/main/java/.../service/Embedding*Client.java, src/main/java/.../service/EmbeddingModelKeepAlive.java
Embedding clients expose model names, while keep-alive probes track readiness, latency, failures, recovery, and Spring health status.
Embedding lifecycle validation
src/test/java/.../service/EmbeddingModelKeepAliveTest.java
Deterministic tests cover health transitions, probe timing, logging, recovery loops, and unexpected failures.

JSON completion requests

Layer / File(s)Summary
JSON completion request construction
src/main/java/.../service/OpenAiRequestFactory.java, src/test/java/.../service/OpenAiRequestFactoryTest.java
Request construction supports validated JSON-object output while retaining normal completion behavior.
JSON completion service integration
src/main/java/.../service/OpenAIStreamingService.java, src/main/java/.../service/RerankerService.java, src/test/java/.../service/RerankerServiceTest.java
A JSON-specific completion API is routed through provider attempts and used by reranking with its existing token budget.

Structured error logging

Layer / File(s)Summary
Request failure logging
src/main/java/.../web/CustomErrorController.java
Error handling now emits sanitized, bounded request fields with severity selected by status and API usage.
Error logging coverage
src/test/java/.../web/CustomErrorControllerTest.java
MVC tests verify structured fields, query exclusion, log levels, and attached exceptions.

Gateway configuration documentation

Layer / File(s)Summary
Gateway configuration guidance
.env.example, docs/configuration.md
Gateway aliases, provider failover, model fallback, reasoning, timeout, and URL behavior are documented.
Application test context wiring
src/test/java/.../JavaChatApplicationTests.java
The application context mock uses nested mock answers.

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

Sequence Diagram(s)

sequenceDiagram
participant RerankerService
participant OpenAIStreamingService
participant OpenAiRequestFactory
participant LLMProvider
RerankerService->>OpenAIStreamingService: request JSON-object completion
OpenAIStreamingService->>OpenAiRequestFactory: build JSON response request
OpenAiRequestFactory->>LLMProvider: submit provider completion request
LLMProvider-->>OpenAIStreamingService: return completion
OpenAIStreamingService-->>RerankerService: return ranked JSON
Loading

Possibly related PRs

Suggested labels:refactor

Suggested reviewers:copilot

Poem

Probes wake, and gateways sing,
JSON blooms on reranking’s wing.
Logs wear helmets, clean and bright,
Health turns green after the night.
Config whispers, “Failover’s near!”

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 12.82% 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 nameStatusExplanation
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title matches the PR’s main themes and is specific enough to identify the change set.
Description check✅ PassedThe description is clearly related to the implemented routing, reranking, health, and logging changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

@chatgpt-codex-connectorchatgpt-codex-connectorBot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:44668cadaa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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

Pull request overview

This pull request hardens Java Chat’s runtime behavior for a gateway-based chat configuration rollout by enforcing structured reranker outputs, improving embedding provider lifecycle/health reporting, and adding request-attributed error diagnostics, alongside updated gateway documentation and examples.

Changes:

  • Enforce JSON-object response contracts for reranker completions and add focused request factory / reranker tests.
  • Add embedding keep-alive lifecycle tracking (ready/slow/unavailable), expose it via Actuator health, and add shorter recovery retries with tests.
  • Add bounded, sanitized request attribution to error logs and document the shared Gemma gateway configuration in docs and .env.example.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated no comments.

Show a summary per file
FileDescription
src/test/java/com/williamcallahan/javachat/web/CustomErrorControllerTest.javaAdds MVC tests verifying sanitized, attributed error logging behavior.
src/test/java/com/williamcallahan/javachat/service/RerankerServiceTest.javaUpdates reranker tests to require JSON-object completions.
src/test/java/com/williamcallahan/javachat/service/OpenAiRequestFactoryTest.javaAdds coverage asserting JSON-object response format is declared.
src/test/java/com/williamcallahan/javachat/service/EmbeddingModelKeepAliveTest.javaExpands tests for embedding probe lifecycle, logging, health, and recovery.
src/test/java/com/williamcallahan/javachat/JavaChatApplicationTests.javaAdjusts context-load test mocking for the embedding client.
src/main/java/com/williamcallahan/javachat/web/CustomErrorController.javaAdds bounded sanitization and request-attributed logging for failures.
src/main/java/com/williamcallahan/javachat/service/RerankerService.javaSwitches reranking to a JSON-object completion path.
src/main/java/com/williamcallahan/javachat/service/OpenAIStreamingService.javaIntroduces completeJsonObject and plumbs JSON requirement into completion requests.
src/main/java/com/williamcallahan/javachat/service/OpenAiRequestFactory.javaAdds JSON-object completion request builder and response-format declaration.
src/main/java/com/williamcallahan/javachat/service/OpenAiCompatibleEmbeddingClient.javaImplements EmbeddingClient.modelName() for health/lifecycle reporting.
src/main/java/com/williamcallahan/javachat/service/LocalEmbeddingClient.javaImplements EmbeddingClient.modelName() for health/lifecycle reporting.
src/main/java/com/williamcallahan/javachat/service/EmbeddingModelKeepAlive.javaAdds lifecycle tracking, health projection, and recovery retry scheduling.
src/main/java/com/williamcallahan/javachat/service/EmbeddingClient.javaExtends the embedding port with modelName() for diagnostics.
docs/configuration.mdDocuments shared Gemma gateway configuration and provider ordering behavior.
.env.exampleUpdates gateway notes and example values for the shared gateway setup.
Comments suppressed due to low confidence (1)

src/test/java/com/williamcallahan/javachat/JavaChatApplicationTests.java:31

  • EmbeddingModelKeepAlive now requires a non-null EmbeddingClient.modelName() during Spring context startup. @MockitoBean(answers = Answers.RETURNS_MOCKS) does not reliably provide a non-null String return (especially without an inline mock maker), so this context-load test can still fail with an NPE. Explicitly stub modelName() on the mock to guarantee startup.
 @MockitoBean(answers = Answers.RETURNS_MOCKS)
EmbeddingClient embeddingClient;
@MockitoBean
QdrantClient qdrantClient;

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@coderabbitaicoderabbitaiBot 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 (3)
src/test/java/com/williamcallahan/javachat/JavaChatApplicationTests.java (1)

27-28: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Avoid broad RETURNS_MOCKS behavior in the context smoke test.

This can make unstubbed embedding interactions appear valid by returning mocks/defaults, weakening the test’s ability to catch broken startup contracts. Prefer the default mock plus explicit stubbing for the exact embedding calls required by context initialization. Mockito documents RETURNS_MOCKS as returning mocks for unstubbed invocations. (javadoc.io)

🤖 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/test/java/com/williamcallahan/javachat/JavaChatApplicationTests.java`
around lines 27 - 28, Replace the broad Answers.RETURNS_MOCKS configuration on
the embeddingClient test mock with the default mock behavior, then explicitly
stub the exact embedding interactions required during context initialization.
Keep the context smoke test focused on those known calls so unexpected unstubbed
interactions still fail.
src/main/java/com/williamcallahan/javachat/web/CustomErrorController.java (1)

98-99: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Reduce logRequestFailure parameter count and align boolean naming

The helper takes 5 positional parameters (request, statusCode, uri, apiRequest, exception), exceeding the >4 parameter limit. Since statusCode, uri, isApiRequest, and exception are all derivable from HttpServletRequest attributes, consider reducing the signature to just request and computing the rest internally — the derivation is a few one-liners and keeps the method self-contained.

Additionally, the apiRequest parameter diverges from the isApiRequest local variable in handleError for the same boolean concept. Use isApiRequest consistently across the call chain.

As per coding guidelines: ">4 parameters use parameter object or builder; never add 5th positional argument (Long Params)" and "The same concept uses the same name across method signatures, variable assignments, log messages, and documentation; do not alias the same thing with different names in the same scope or call chain (Alias Consistency)."

♻️ Proposed refactor
- private void logRequestFailure(- HttpServletRequest request, int statusCode, String uri, boolean apiRequest, Object exception) {+ private void logRequestFailure(HttpServletRequest request) {+ Object statusAttribute = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);+ int statusCode = statusAttribute instanceof Integer integerStatus ? integerStatus : 500;+ Object requestUriAttribute = request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);+ String uri = requestUriAttribute != null ? requestUriAttribute.toString() : request.getRequestURI();+ boolean isApiRequest = uri.equals("/api") || uri.startsWith("/api/");+ Object exception = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);+
String method = safeLogField(request.getMethod());
String canonicalUri = safeLogField(uri.split("[?#]", 2)[0]);
String serverHost = safeLogField(request.getServerName());
String userAgent = safeLogField(request.getHeader("User-Agent"));
String requestId = safeLogField(request.getRequestId());
String source = safeLogField(request.getAttribute(RequestDispatcher.ERROR_SERVLET_NAME));
String diagnostic = "Request failed status={} source={} method={} uri={} host={} userAgent={} requestId={}";

And update the call site:

- logRequestFailure(request, statusCode, uri, isApiRequest, exception);+ logRequestFailure(request);
🤖 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/main/java/com/williamcallahan/javachat/web/CustomErrorController.java`
around lines 98 - 99, Refactor CustomErrorController.logRequestFailure to accept
only HttpServletRequest, deriving statusCode, uri, isApiRequest, and exception
from the request attributes inside the helper. Update handleError and all call
sites to use the consistent isApiRequest name throughout the call chain while
preserving the existing logging behavior.

Source: Coding guidelines

src/test/java/com/williamcallahan/javachat/web/CustomErrorControllerTest.java (1)

59-117: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add tests for 5xx-without-exception and safeLogField edge cases

The three tests cover the main log paths well — INFO 404 non-API, WARN 404 API, and ERROR 500 with exception. Three gaps remain:

  1. 5xx without exception (controller lines 120–122): This is a distinct branch that logs at ERROR without a throwable. A 500 where ERROR_EXCEPTION is absent exercises it.
  2. safeLogField truncation: No test sends a field exceeding 512 characters to verify MAX_LOG_FIELD_LENGTH is enforced. A long User-Agent header would confirm the bound.
  3. safeLogField null → "unknown": No test omits the User-Agent header to verify the "unknown" default appears in the log.

All three are low-effort additions that close meaningful coverage gaps.

🧪 Suggested additional tests
`@Test`
voidlogs_server_error_without_exception_at_error() throwsException {
mvc.perform(errorRequest(HttpStatus.INTERNAL_SERVER_ERROR, "/page")
.requestAttr(RequestDispatcher.ERROR_SERVLET_NAME, "dispatcherServlet"))
.andExpect(status().isInternalServerError());
ILoggingEventevent = onlyLogEvent();
assertEquals(Level.ERROR, event.getLevel());
assertNull(event.getThrowableProxy());
}
`@Test`
voidtruncates_long_user_agent_to_max_log_field_length() throwsException {
StringlongUserAgent = "A".repeat(1024);
mvc.perform(errorRequest(HttpStatus.NOT_FOUND, "/missing")
.header("User-Agent", longUserAgent))
.andExpect(status().isNotFound());
ILoggingEventevent = onlyLogEvent();
Stringmessage = event.getFormattedMessage();
intuserAgentStart = message.indexOf("userAgent=") + "userAgent=".length();
intuserAgentEnd = message.indexOf(" requestId=", userAgentStart);
StringloggedUserAgent = message.substring(userAgentStart, userAgentEnd);
assertEquals(512, loggedUserAgent.length());
}
`@Test`
voidsubstitutes_unknown_for_missing_user_agent() throwsException {
mvc.perform(errorRequest(HttpStatus.NOT_FOUND, "/missing"))
.andExpect(status().isNotFound());
ILoggingEventevent = onlyLogEvent();
assertTrue(event.getFormattedMessage().contains("userAgent=unknown"));
}
🤖 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/test/java/com/williamcallahan/javachat/web/CustomErrorControllerTest.java`
around lines 59 - 117, Add three tests to CustomErrorControllerTest covering the
missing branches: verify a 5xx request without ERROR_EXCEPTION logs at ERROR
with no throwable, verify a 1024-character User-Agent is truncated to 512
characters in the message, and verify an omitted User-Agent logs as "unknown".
Reuse errorRequest and onlyLogEvent, and preserve the existing log-level and
response assertions.
🤖 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 @.env.example:
- Around line 30-33: Update the Researchly shared LLM gateway example in
.env.example to include LLM_PRIMARY_PROVIDER=openai alongside the gateway URL,
model, and key settings, matching the explicit provider selection documented in
configuration guidance.
---
Nitpick comments:
In `@src/main/java/com/williamcallahan/javachat/web/CustomErrorController.java`:
- Around line 98-99: Refactor CustomErrorController.logRequestFailure to accept
only HttpServletRequest, deriving statusCode, uri, isApiRequest, and exception
from the request attributes inside the helper. Update handleError and all call
sites to use the consistent isApiRequest name throughout the call chain while
preserving the existing logging behavior.
In `@src/test/java/com/williamcallahan/javachat/JavaChatApplicationTests.java`:
- Around line 27-28: Replace the broad Answers.RETURNS_MOCKS configuration on
the embeddingClient test mock with the default mock behavior, then explicitly
stub the exact embedding interactions required during context initialization.
Keep the context smoke test focused on those known calls so unexpected unstubbed
interactions still fail.
In
`@src/test/java/com/williamcallahan/javachat/web/CustomErrorControllerTest.java`:
- Around line 59-117: Add three tests to CustomErrorControllerTest covering the
missing branches: verify a 5xx request without ERROR_EXCEPTION logs at ERROR
with no throwable, verify a 1024-character User-Agent is truncated to 512
characters in the message, and verify an omitted User-Agent logs as "unknown".
Reuse errorRequest and onlyLogEvent, and preserve the existing log-level and
response assertions.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 161585e5-fd0a-49cc-bd6d-da3b6d351c61

📥 Commits

Reviewing files that changed from the base of the PR and between 6f1ac4d and 44668ca.

📒 Files selected for processing (15)
  • .env.example
  • docs/configuration.md
  • src/main/java/com/williamcallahan/javachat/service/EmbeddingClient.java
  • src/main/java/com/williamcallahan/javachat/service/EmbeddingModelKeepAlive.java
  • src/main/java/com/williamcallahan/javachat/service/LocalEmbeddingClient.java
  • src/main/java/com/williamcallahan/javachat/service/OpenAIStreamingService.java
  • src/main/java/com/williamcallahan/javachat/service/OpenAiCompatibleEmbeddingClient.java
  • src/main/java/com/williamcallahan/javachat/service/OpenAiRequestFactory.java
  • src/main/java/com/williamcallahan/javachat/service/RerankerService.java
  • src/main/java/com/williamcallahan/javachat/web/CustomErrorController.java
  • src/test/java/com/williamcallahan/javachat/JavaChatApplicationTests.java
  • src/test/java/com/williamcallahan/javachat/service/EmbeddingModelKeepAliveTest.java
  • src/test/java/com/williamcallahan/javachat/service/OpenAiRequestFactoryTest.java
  • src/test/java/com/williamcallahan/javachat/service/RerankerServiceTest.java
  • src/test/java/com/williamcallahan/javachat/web/CustomErrorControllerTest.java

Comment thread.env.example Outdated
@WilliamAGHWilliamAGH changed the title fix(runtime): structured reranking, embedding health, attributed errors, and Gemma gateway docsfix(runtime): cloud-ready Gemma routing, structured reranking, embedding health, and attributed errorsJul 12, 2026
The keep-alive health bean reads the embedding model name while Spring creates the application context. Give the integration mock a non-null String default so enabled live tests reach their assertions without weakening production validation.
- align the chat SSE embedding mock with the application context fixture
The guided live-test context creates the embedding keep-alive bean before test methods can stub the provider. Supply a non-null String default at mock creation so the context honors the embedding port contract.
- align the guided SSE embedding mock with the application context fixture
The shared-gateway instructions named its URL, model, and key but did not repeat the provider-selection setting required when GitHub credentials are also present. Keep the general defaults unchanged while making the gateway setup self-contained.
- require LLM_PRIMARY_PROVIDER=openai in the gateway instruction block
@WilliamAGHWilliamAGH changed the title fix(runtime): cloud-ready Gemma routing, structured reranking, embedding health, and attributed errorsfix(runtime): regular Gemma routing, structured reranking, embedding health, and attributed errorsJul 12, 2026
@WilliamAGHWilliamAGH changed the title fix(runtime): regular Gemma routing, structured reranking, embedding health, and attributed errorsfix(runtime): shared Gemma routing, bounded structured reranking, embedding health, and attributed errorsJul 12, 2026
Co-authored-by: detail-app[bot] <180357370+detail-app[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugSomething isn't workingdocumentationImprovements or additions to documentationenhancementNew feature or requestjavaPull requests that update java coderefactorCode refactoring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@WilliamAGH