Skip to content

fix(antigravity): align tiers, quotas and reasoning translation - #3584

Closed
dhaern wants to merge 2 commits into
cheaper-inference:release/v3.8.21from
dhaern:fix/antigravity-35-flash-tiers
Closed

dhaern wants to merge 2 commits into
cheaper-inference:release/v3.8.21from
dhaern:fix/antigravity-35-flash-tiers

Conversation

@dhaern

@dhaern dhaern commented Jun 10, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Align Antigravity and Agy public model tiers to the clean Low / Medium / High names.
  • Normalize Provider Limits to prefer live quota buckets, reconcile legacy IDs, and refresh after real Antigravity/Agy usage.
  • Fix reasoning text leakage by extracting malformed/open reasoning wrappers into reasoning_content instead of visible assistant text.
  • Preserve tool calls and textual tool-call translation behavior.

Scope

  • Antigravity/Agy model aliases and visible labels
  • Provider quota parsing, normalization and refresh
  • Reasoning text sanitization and Gemini->OpenAI translation

Validation

  • bun test tests/unit/response-sanitizer.test.ts
  • bun test tests/unit/translator-resp-gemini-to-openai.test.ts
  • bun test tests/unit/usage-service-hardening.test.ts

Notes

  • The reasoning-text fix is generic for think/thinking/thought/internal_thought wrappers, not a hardcoded one-off.
  • This PR does not touch OpenCode.

@dhaern
dhaern requested a review from diegosouzapw as a code owner June 10, 2026 16:35

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request updates the Antigravity and agy model catalogs to expose clean Gemini 3.5 Flash tiers (Low, Medium, High) and maps them to legacy upstream IDs. It also improves quota tracking by integrating the retrieveUserQuota endpoint with a local usage fallback, and enhances streaming response sanitization to extract unclosed reasoning tags. The code review provides valuable feedback, pointing out that reasoning tags spanning multiple chunks can leak into user-visible content, SQL token summation can fail due to NULL values, sequential quota fetches should be parallelized to reduce latency, and the agy provider is missing from the cache refresh check.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +285 to +296
const reasoningTag = splitReasoningTagText(accumulated);
if (reasoningTag) {
if (reasoningTag.before && !isIgnorableReasoningTagPrefix(reasoningTag.before)) {
emitTextDelta(reasoningTag.before, state, results, "content");
}
emitTextDelta(reasoningTag.reasoning, state, results, "reasoning_content");
accumulated = reasoningTag.after;
state.textualToolCallBuffer = "";
if (!accumulated) {
continue;
}
}

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.

critical

During streaming, reasoning tags almost always span multiple chunks. Since splitReasoningTagText treats any tag without a closing tag in the same chunk as an unclosed tag, it will immediately emit the partial text as reasoning_content and clear state.textualToolCallBuffer. In the next chunk, the rest of the reasoning text (and the closing tag) will arrive without an opening tag, causing it to bypass the reasoning filter and leak directly into the user-visible content as regular text.

To fix this, we should track whether we are currently inside a reasoning block using a state variable (e.g., state.inReasoning) so that reasoning content can be streamed across multiple chunks until the closing tag is encountered.

        while (accumulated) {
          if (state.inReasoning) {
            const closeMatch = /<\/(?:think|thinking|thought|internal_thought)>/i.exec(accumulated);
            if (closeMatch) {
              const reasoningText = accumulated.slice(0, closeMatch.index);
              if (reasoningText) {
                emitTextDelta(reasoningText, state, results, "reasoning_content");
              }
              state.inReasoning = false;
              accumulated = accumulated.slice(closeMatch.index + closeMatch[0].length);
            } else {
              emitTextDelta(accumulated, state, results, "reasoning_content");
              accumulated = "";
            }
          } else {
            const openMatch = REASONING_TAG_OPEN_REGEX.exec(accumulated);
            if (openMatch) {
              const beforeText = accumulated.slice(0, openMatch.index);
              if (beforeText && !isIgnorableReasoningTagPrefix(beforeText)) {
                emitTextDelta(beforeText, state, results, "content");
              }
              state.inReasoning = true;
              accumulated = accumulated.slice(openMatch.index + openMatch[0].length);
            } else {
              break;
            }
          }
        }
        if (!accumulated) {
          continue;
        }

Comment thread open-sse/services/usage.ts Outdated
};
const row = db
.prepare(
`SELECT COALESCE(SUM(tokens_input + tokens_output + tokens_reasoning), 0) AS tokens

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.

high

In SQL, adding a NULL value to any other value results in NULL (e.g., 100 + NULL is NULL). If tokens_reasoning (or any other token column) is NULL for a row in usage_history, the entire addition tokens_input + tokens_output + tokens_reasoning will evaluate to NULL. This causes those rows to be completely excluded from the sum, leading to incorrect local usage tracking.

To prevent this, use COALESCE on each individual column before performing the addition.

Suggested change
`SELECT COALESCE(SUM(tokens_input + tokens_output + tokens_reasoning), 0) AS tokens
`SELECT COALESCE(SUM(COALESCE(tokens_input, 0) + COALESCE(tokens_output, 0) + COALESCE(tokens_reasoning, 0)), 0) AS tokens

Comment thread open-sse/services/usage.ts Outdated
Comment on lines +2461 to +2462
const data = await fetchAntigravityAvailableModelsCached(accessToken, projectId, options);
const userQuotaData = await fetchAntigravityUserQuotaCached(accessToken, projectId, options);

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.

medium

The network requests to fetch available models and user quotas are independent of each other. Awaiting them sequentially introduces unnecessary latency (head-of-line blocking). They should be fetched in parallel using Promise.all to improve performance.

    const [data, userQuotaData] = await Promise.all([
      fetchAntigravityAvailableModelsCached(accessToken, projectId, options),
      fetchAntigravityUserQuotaCached(accessToken, projectId, options),
    ]);

Comment thread src/lib/usage/providerLimits.ts Outdated
cache: ProviderLimitsCacheEntry | undefined
): boolean {
if (!cache?.quotas) return true;
if (connection.provider !== "antigravity") return false;

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.

medium

The "agy" provider is the CLI companion to Antigravity and shares the same backend, executor, and quota logic. However, it is missing from the provider check in shouldRefreshProviderLimitsCache, which means "agy" connections will not trigger automatic cache refreshes when user-quota sources are missing or legacy keys are present.

Add "agy" to the provider check to ensure consistent behavior.

Suggested change
if (connection.provider !== "antigravity") return false;
if (connection.provider !== "antigravity" && connection.provider !== "agy") return false;

@dhaern

dhaern commented Jun 10, 2026 •

Copy link
Copy Markdown
Contributor Author

@gemini-code-assist[bot] Gracias por la revisión. He corregido los 4 puntos:

  1. El cálculo SQL de uso local ahora usa COALESCE por columna para no perder filas con valores NULL.
  2. La obtención de fetchAvailableModels y retrieveUserQuota ahora va en paralelo con Promise.all.
  3. agy entra en la lógica de refresh de Provider Limits cuando faltan fuentes live o hay claves legacy.
  4. El traductor Gemini/OpenAI ahora mantiene reasoning textual abierto entre chunks sin filtrarlo a content, y lo cierra correctamente al llegar el tag final.

Validado con tests focalizados verdes.

@gemini-code-assist

Copy link
Copy Markdown
Contributor

¡Excelente trabajo con estas correcciones, @dhaern! La implementación de COALESCE para la robustez de los datos, el uso de Promise.all para la concurrencia en la obtención de cuotas, la lógica de refresco para Provider Limits y la mejora en el manejo de los tags de razonamiento en el traductor son cambios muy sólidos y bien estructurados.

He verificado los cambios y la lógica parece correcta y alineada con las mejores prácticas. ¡Buen trabajo manteniendo los tests focalizados y pasando!

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Thanks for this, @dhaern — the Antigravity/Agy tier alignment (Low/Medium/High), the live-quota Provider Limits normalization, and especially the generic reasoning-wrapper extraction into reasoning_content are all valuable, and the test coverage (13 test files) is appreciated. 🙏

Before we can merge it, two things need addressing:

1. Conflicts in the Gemini translator hot-path (blocking). This PR conflicts with release/v3.8.21 in open-sse/translator/request/openai-to-gemini.ts and open-sse/translator/response/gemini-to-openai.ts. Those two files were just rewritten in v3.8.20 by #3569: standard Gemini now sends native function calls without a thoughtSignature (validated against the live Gemini API — gemini-2.5-flash:generateContent returns 200 for signatureless historical functionCall, even with tools + thinkingConfig). The previous assumption that standard Gemini rejects signatureless native parts is no longer true. Resolving the conflict incorrectly would silently regress #3569, so could you rebase onto release/v3.8.21 and reconcile against the new behavior? The intended end state is: standard Gemini = native (no sentinel), CLI/Antigravity = skip_thought_signature_validator sentinel bypass.

2. Please split the 4 concerns. This bundles (a) tier renaming, (b) Provider Limits quota normalization, (c) reasoning-text leak fix, and (d) tool-call translation. Splitting them into focused PRs lets us review and validate each independently (the reasoning-leak fix in particular touches the same translator the rebase above affects).

Once rebased (and ideally split), we'll get it in. Leaving this open — not closing. Thanks again!

@dhaern

dhaern commented Jun 11, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review. I split the original #3584 work and rebased the pieces onto release/v3.8.21 as requested.

New focused PRs:

  1. fix(antigravity): normalize Gemini 3.5 Flash tier IDs #3603 — Antigravity/agy Gemini 3.5 Flash tier IDs and executor-side alias normalization.

    • Keeps only catalog/model-id/routing changes.
    • Validation: 26 focused tests passing locally.
  2. fix(usage): normalize Antigravity and agy provider quotas #3604 — Antigravity/agy Provider Quota normalization and refresh behavior.

  3. fix(gemini): isolate textual reasoning wrappers #3605 — Gemini textual reasoning wrapper isolation.

    • Keeps only the sanitizer/streaming translator work for <think>/<thinking>/<thought>/<internal_thought> wrappers.
    • Preserves the current v3.8.21 Gemini tool-call hot path and does not revert the scoped signature-bypass behavior.
    • Validation: 55 focused tests passing locally.

I also tested the combined stack locally on v3.8.21 with omniroute-install-local-build --restart before opening the split PRs.

diegosouzapw pushed a commit that referenced this pull request Jun 11, 2026
Split-out PR C from #3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the #3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
diegosouzapw pushed a commit that referenced this pull request Jun 11, 2026
Split-out PR A from #3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
diegosouzapw pushed a commit that referenced this pull request Jun 11, 2026
Split-out PR B from #3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
@diegosouzapw

Copy link
Copy Markdown
Collaborator

Superseded by the clean split you opened — #3603 (tier IDs), #3604 (provider quotas), and #3605 (reasoning wrappers) — all three merged into release/v3.8.21. Thanks for rebasing and splitting per the earlier review feedback! Leaving this open for you to close at your convenience (so you keep ownership), since the work landed via the split PRs.

@dhaern dhaern closed this Jun 11, 2026
diegosouzapw added a commit that referenced this pull request Jun 11, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (#3572) (#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (#3571) (#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (#3580) (#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (#3498) (#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (#3488) (#3600)

* fix(gamification): add level/badges/badges-earned profile routes (#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (#3578)

* fix: add reasoning token buffer for combo routing (fixes #3587) (#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit #3598 (chatCore modularization) + #3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (#3496) (#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (#3605)

Split-out PR C from #3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the #3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (#3603)

Split-out PR A from #3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (#3606) (#3608)

Integrated into release/v3.8.21 (#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (#3589) (#3609)

Integrated into release/v3.8.21 (#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (#3419) (#3613)

Integrated into release/v3.8.21 (#3419)

* fix(usage): normalize Antigravity and agy provider quotas (#3604)

Split-out PR B from #3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (#3331) (#3614)

Integrated into release/v3.8.21 (#3331)

* docs(changelog): credit #3603 (Flash tier IDs) + #3604 (provider quotas) + #3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 797de43.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (cheaper-inference#3572) (cheaper-inference#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (cheaper-inference#3571) (cheaper-inference#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (cheaper-inference#3580) (cheaper-inference#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (cheaper-inference#3498) (cheaper-inference#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (cheaper-inference#3488) (cheaper-inference#3600)

* fix(gamification): add level/badges/badges-earned profile routes (cheaper-inference#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (cheaper-inference#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (cheaper-inference#3578)

* fix: add reasoning token buffer for combo routing (fixes cheaper-inference#3587) (cheaper-inference#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (cheaper-inference#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit cheaper-inference#3598 (chatCore modularization) + cheaper-inference#3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (cheaper-inference#3496) (cheaper-inference#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (cheaper-inference#3605)

Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (cheaper-inference#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (cheaper-inference#3606) (cheaper-inference#3608)

Integrated into release/v3.8.21 (cheaper-inference#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (cheaper-inference#3589) (cheaper-inference#3609)

Integrated into release/v3.8.21 (cheaper-inference#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (cheaper-inference#3419) (cheaper-inference#3613)

Integrated into release/v3.8.21 (cheaper-inference#3419)

* fix(usage): normalize Antigravity and agy provider quotas (cheaper-inference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (cheaper-inference#3331) (cheaper-inference#3614)

Integrated into release/v3.8.21 (cheaper-inference#3331)

* docs(changelog): credit cheaper-inference#3603 (Flash tier IDs) + cheaper-inference#3604 (provider quotas) + cheaper-inference#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (cheaper-inference#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 6d24708.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
Poid-ZA pushed a commit to Poid-ZA/OmniRoute that referenced this pull request Aug 5, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (cheaper-inference#3572) (cheaper-inference#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (cheaper-inference#3571) (cheaper-inference#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (cheaper-inference#3580) (cheaper-inference#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (cheaper-inference#3498) (cheaper-inference#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (cheaper-inference#3488) (cheaper-inference#3600)

* fix(gamification): add level/badges/badges-earned profile routes (cheaper-inference#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (cheaper-inference#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (cheaper-inference#3578)

* fix: add reasoning token buffer for combo routing (fixes cheaper-inference#3587) (cheaper-inference#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (cheaper-inference#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit cheaper-inference#3598 (chatCore modularization) + cheaper-inference#3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (cheaper-inference#3496) (cheaper-inference#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (cheaper-inference#3605)

Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (cheaper-inference#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (cheaper-inference#3606) (cheaper-inference#3608)

Integrated into release/v3.8.21 (cheaper-inference#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (cheaper-inference#3589) (cheaper-inference#3609)

Integrated into release/v3.8.21 (cheaper-inference#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (cheaper-inference#3419) (cheaper-inference#3613)

Integrated into release/v3.8.21 (cheaper-inference#3419)

* fix(usage): normalize Antigravity and agy provider quotas (cheaper-inference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (cheaper-inference#3331) (cheaper-inference#3614)

Integrated into release/v3.8.21 (cheaper-inference#3331)

* docs(changelog): credit cheaper-inference#3603 (Flash tier IDs) + cheaper-inference#3604 (provider quotas) + cheaper-inference#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (cheaper-inference#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 797de43.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…nce#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…ference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (cheaper-inference#3572) (cheaper-inference#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (cheaper-inference#3571) (cheaper-inference#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (cheaper-inference#3580) (cheaper-inference#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (cheaper-inference#3498) (cheaper-inference#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (cheaper-inference#3488) (cheaper-inference#3600)

* fix(gamification): add level/badges/badges-earned profile routes (cheaper-inference#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (cheaper-inference#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (cheaper-inference#3578)

* fix: add reasoning token buffer for combo routing (fixes cheaper-inference#3587) (cheaper-inference#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (cheaper-inference#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit cheaper-inference#3598 (chatCore modularization) + cheaper-inference#3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (cheaper-inference#3496) (cheaper-inference#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (cheaper-inference#3605)

Split-out PR C from cheaper-inference#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (cheaper-inference#3603)

Split-out PR A from cheaper-inference#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (cheaper-inference#3606) (cheaper-inference#3608)

Integrated into release/v3.8.21 (cheaper-inference#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (cheaper-inference#3589) (cheaper-inference#3609)

Integrated into release/v3.8.21 (cheaper-inference#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (cheaper-inference#3419) (cheaper-inference#3613)

Integrated into release/v3.8.21 (cheaper-inference#3419)

* fix(usage): normalize Antigravity and agy provider quotas (cheaper-inference#3604)

Split-out PR B from cheaper-inference#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (cheaper-inference#3331) (cheaper-inference#3614)

Integrated into release/v3.8.21 (cheaper-inference#3331)

* docs(changelog): credit cheaper-inference#3603 (Flash tier IDs) + cheaper-inference#3604 (provider quotas) + cheaper-inference#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (cheaper-inference#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 408d91a2c.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants