Skip to content

Release v3.7.4 - #1730

Merged
diegosouzapw merged 25 commits into
mainfrom
release/v3.7.4
Apr 28, 2026
Merged

diegosouzapw merged 25 commits into
mainfrom
release/v3.7.4

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Apr 28, 2026 •

Copy link
Copy Markdown
Collaborator

[3.7.4] — 2026-04-28

✨ New Features

🔒 Security

🐛 Bug Fixes

🛠️ Maintenance

  • workflow: add phase 4 release monitoring instructions to /generate-release workflow
  • test: fix typescript compilation errors in unit tests to keep CI typecheck pipeline fully green
  • test: update responses store expectations for empty input arrays

@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 project version to 3.7.4 across various configuration and changelog files. The primary functional change is a bug fix in open-sse/utils/streamReadiness.ts to correctly identify thought and error blocks, as well as executableCode and codeExecutionResult, in Antigravity/Gemini SSE streams. This prevents premature 502 timeouts by enhancing the logic for determining 'useful' stream content. The reviewer suggests further expanding the list of keys to consider for useful content to include thinking, reasoning_content, message, code, and output for improved compatibility with other providers and nested data structures.

Comment on lines +34 to +37
"thought",
"error",
"executableCode",
"codeExecutionResult",

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

The list of keys used to identify useful content in the stream should be expanded to ensure better coverage across different providers and to correctly handle nested objects:

  1. Thought/Reasoning Blocks: Add thinking (used by Anthropic Claude 3.7) and reasoning_content (used by DeepSeek R1). This ensures that reasoning phases are correctly identified as active stream content, preventing premature timeouts for these models.
  2. Gemini Code Execution: In the Gemini API, executableCode and codeExecutionResult are objects containing code and output fields respectively. Adding these internal keys ensures the stream is considered ready even when the content is nested within these objects.
  3. Error Handling: Adding message helps identify error blocks that are structured as objects (common in OpenAI-compatible streams).
    "thought",
    "thinking",
    "reasoning_content",
    "error",
    "message",
    "executableCode",
    "codeExecutionResult",
    "code",
    "output",

@github-actions

github-actions Bot commented Apr 28, 2026 •

Copy link
Copy Markdown
Contributor

CI Coverage Report

  • Coverage job: success
  • PR test policy: success

Coverage artifact was not available for this run.

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cbd8344789

ℹ️ 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".

onClick={openBulkImport}
data-testid="proxy-registry-open-bulk-import"
>
{t("bulkImport")}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Add new proxyRegistry locale keys before rendering them

ProxyRegistryManager now calls t("bulkImport") (and many related bulkImport* keys), but this commit only adds those messages in src/i18n/messages/en.json. I checked src/i18n/messages/*.json and no other locale contains these keys, and NextIntlClientProvider in src/app/layout.tsx is not configured with a missing-message fallback. In non-English locales, opening this settings page will hit missing-message errors at render time and break the page instead of showing the proxy registry UI.

Useful? React with 👍 / 👎.

Comment on lines +5793 to +5794
if (!isValid && data.error) {
validationError = data.error;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Normalize validation errors to a string before saving

data.error is assigned directly to validationError, but /api/providers/validate returns an object ({error: validation.error}) for schema-validation failures. When that object reaches setSaveError(...), the modal later renders saveError as JSX text, which can throw Objects are not valid as a React child (for example, when customUserAgent exceeds schema limits and validation returns 400). This should coerce/extract a message string before storing it in state.

Useful? React with 👍 / 👎.

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ca0956d43b

ℹ️ 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".

// Ref: codex-rs codex-api/src/common.rs:187 — previous_response_id: None
// Ref: CLIProxyAPI codex_executor.go:115 — sjson.DeleteBytes(body, "previous_response_id")
delete body.previous_response_id;
const hasInput = Array.isArray(body.input) && body.input.length > 0;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Treat string/object input as present before keeping response IDs

hasInput only checks for non-empty arrays, but transformRequest is also called with raw Responses payloads (for example, the internal Codex WS bridge passes responseBody directly), where input can be a string or object. In those valid cases, this branch leaves previous_response_id intact even though new input exists, so Codex can return a 404 instead of processing the provided input. The presence check should include non-array input shapes too.

Useful? React with 👍 / 👎.

Comment on lines +1154 to +1156
const hasInput = Array.isArray(body.input) && body.input.length > 0;
if (hasInput) {
delete body.conversation_id;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Remove conversation_id when non-array input is supplied

This hasInput guard only recognizes array input, so requests with valid string/object input keep conversation_id in the body. The same method comment says Codex rejects conversation_id when input is present, so this can turn otherwise valid requests into 400 schema errors for clients that send non-array input. Use an input-presence check that covers all supported input types.

Useful? React with 👍 / 👎.

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5c42f16995

ℹ️ 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".

Comment on lines 1171 to +1172
upstreamBody.prompt = body.prompt || "";
appendOptionalFormValue(formData, "prompt", body.prompt || "");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Always include prompt field for Stability control requests

For sketch/structure/style/style-transfer requests without an explicit prompt, this branch sets upstreamBody.prompt to "" but then appends it via appendOptionalFormValue, which drops empty strings. That means the multipart payload omits prompt entirely, while the previous JSON path sent prompt:""; control endpoints that require the field will now return 400 for otherwise valid image-only edits.

Useful? React with 👍 / 👎.

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4af77efb3b

ℹ️ 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".

Comment thread src/lib/db/proxies.ts
Comment on lines +208 to +210
const existing = db
.prepare("SELECT id FROM proxy_registry WHERE host = ? AND port = ? LIMIT 1")
.get(host, port) as { id?: string } | undefined;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Make proxy upsert atomic to avoid duplicate host/port rows

This upsert does a read (SELECT id ...) and then decides to insert/update in separate statements, so two concurrent bulk-import requests for the same host+port can both miss the row and both insert. That violates the new bulk-import contract (“same host+port will be updated”) and can leave duplicate proxies that make later assignment/maintenance ambiguous. Use an atomic upsert strategy (e.g., unique constraint on host,port plus conflict handling) to preserve idempotency under concurrency.

Useful? React with 👍 / 👎.

return;
}

navigator.serviceWorker.register("/sw.js").catch(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Skip service worker registration outside production builds

The new client hook registers /sw.js unconditionally, including local development. Since public/sw.js uses cache-first behavior for scripts/styles/images, this can serve stale Next assets in dev and make HMR/code changes appear broken until developers manually clear/unregister the worker. Registering only in production avoids introducing persistent cache state into dev sessions.

Useful? React with 👍 / 👎.

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cca9153a17

ℹ️ 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".

function appendImageFormValue(formData, key, source, filename) {
formData.append(
key,
new Blob([source.buffer], {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Use Buffer slices when building multipart image blobs

resolveImageSource returns Node Buffer objects, but this code wraps source.buffer (the backing ArrayBuffer) in a Blob. For pooled Buffers, that backing store is larger than the actual image slice (commonly 8KB), so multipart image/mask uploads include trailing garbage bytes. This can corrupt small base64/remote images and cause Stability edit/control requests to fail validation or process invalid input; append the Buffer itself (or a Uint8Array sliced by byteOffset/byteLength) instead.

Useful? React with 👍 / 👎.

@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
1 Security Hotspot

See analysis details on SonarQube Cloud

@diegosouzapw
diegosouzapw merged commit 0cd388e into main Apr 28, 2026
69 of 70 checks passed
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
* chore(release): v3.7.4 — version bump, openapi and changelog sync

* fix: preserve previous_response_id and conversation_id fields on empty input array (cheaper-inference#1729)

* fix: bypass UI validation block for optional API keys and fix string fallback typing (cheaper-inference#1721)

* fix(proxy): disable HTTP keep-alive and pipelining in Undici proxy dispatcher to prevent socket hang up

* feat(proxy): implement bulk proxy import via pipe-delimited parser with update-or-create logic

* docs: update changelog for v3.7.4 fixes and proxy features

* test: update responses store expectations for empty input arrays

* feat(pwa): add fullscreen installable PWA with manifest, service worker, and cross-platform app icons. (cheaper-inference#1728)

Integrated into release/v3.7.4

* Fix image provider validation and Stability image requests (cheaper-inference#1726)

Integrated into release/v3.7.4

* docs: add PR 1726 and PR 1728 to v3.7.4 changelog

* fix(security): replace insecure Math.random with crypto.getRandomValues for fallback UUID generation

* fix(migrations): intercept 007 migration to use IF NOT EXISTS logic on fresh installs

Fixes cheaper-inference#1733

* test: fix typescript compilation errors in unit tests

* fix(db): reconcile legacy reasoning cache migration

* chore(release): bump to v3.7.4 — changelog, docs, version sync

* fix(cc-compatible): preserve Claude Code system skeleton (cheaper-inference#1740)

Integrated into release/v3.7.4

* docs(changelog): update for PR cheaper-inference#1740 merge

* docs(changelog): include workflow updates

* fix(db): reconcile legacy reasoning cache migration (cheaper-inference#1734)

Integrated into release/v3.7.4

* Add endpoint tunnel visibility settings (cheaper-inference#1743)

Integrated into release/v3.7.4

* Normalize max reasoning effort for Codex routing (cheaper-inference#1744)

Integrated into release/v3.7.4

* Fix Claude Code gateway config helper (cheaper-inference#1745)

Integrated into release/v3.7.4

* Refresh CLI fingerprint provider profiles (cheaper-inference#1746)

Integrated into release/v3.7.4

* Integrated into release/v3.7.4 (PR cheaper-inference#1742)

* docs(changelog): update for PRs 1742-1746

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: Yash Ghule <y.ghule77@gmail.com>
Co-authored-by: backryun <bakryun0718@proton.me>
Co-authored-by: dhaern <manker_lol@hotmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Duncan L <leungd@gmail.com>
Poid-ZA pushed a commit to Poid-ZA/OmniRoute that referenced this pull request Aug 5, 2026
* chore(release): v3.7.4 — version bump, openapi and changelog sync

* fix: preserve previous_response_id and conversation_id fields on empty input array (cheaper-inference#1729)

* fix: bypass UI validation block for optional API keys and fix string fallback typing (cheaper-inference#1721)

* fix(proxy): disable HTTP keep-alive and pipelining in Undici proxy dispatcher to prevent socket hang up

* feat(proxy): implement bulk proxy import via pipe-delimited parser with update-or-create logic

* docs: update changelog for v3.7.4 fixes and proxy features

* test: update responses store expectations for empty input arrays

* feat(pwa): add fullscreen installable PWA with manifest, service worker, and cross-platform app icons. (cheaper-inference#1728)

Integrated into release/v3.7.4

* Fix image provider validation and Stability image requests (cheaper-inference#1726)

Integrated into release/v3.7.4

* docs: add PR 1726 and PR 1728 to v3.7.4 changelog

* fix(security): replace insecure Math.random with crypto.getRandomValues for fallback UUID generation

* fix(migrations): intercept 007 migration to use IF NOT EXISTS logic on fresh installs

Fixes cheaper-inference#1733

* test: fix typescript compilation errors in unit tests

* fix(db): reconcile legacy reasoning cache migration

* chore(release): bump to v3.7.4 — changelog, docs, version sync

* fix(cc-compatible): preserve Claude Code system skeleton (cheaper-inference#1740)

Integrated into release/v3.7.4

* docs(changelog): update for PR cheaper-inference#1740 merge

* docs(changelog): include workflow updates

* fix(db): reconcile legacy reasoning cache migration (cheaper-inference#1734)

Integrated into release/v3.7.4

* Add endpoint tunnel visibility settings (cheaper-inference#1743)

Integrated into release/v3.7.4

* Normalize max reasoning effort for Codex routing (cheaper-inference#1744)

Integrated into release/v3.7.4

* Fix Claude Code gateway config helper (cheaper-inference#1745)

Integrated into release/v3.7.4

* Refresh CLI fingerprint provider profiles (cheaper-inference#1746)

Integrated into release/v3.7.4

* Integrated into release/v3.7.4 (PR cheaper-inference#1742)

* docs(changelog): update for PRs 1742-1746

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: Yash Ghule <y.ghule77@gmail.com>
Co-authored-by: backryun <bakryun0718@proton.me>
Co-authored-by: dhaern <manker_lol@hotmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Duncan L <leungd@gmail.com>
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
* chore(release): v3.7.4 — version bump, openapi and changelog sync

* fix: preserve previous_response_id and conversation_id fields on empty input array (cheaper-inference#1729)

* fix: bypass UI validation block for optional API keys and fix string fallback typing (cheaper-inference#1721)

* fix(proxy): disable HTTP keep-alive and pipelining in Undici proxy dispatcher to prevent socket hang up

* feat(proxy): implement bulk proxy import via pipe-delimited parser with update-or-create logic

* docs: update changelog for v3.7.4 fixes and proxy features

* test: update responses store expectations for empty input arrays

* feat(pwa): add fullscreen installable PWA with manifest, service worker, and cross-platform app icons. (cheaper-inference#1728)

Integrated into release/v3.7.4

* Fix image provider validation and Stability image requests (cheaper-inference#1726)

Integrated into release/v3.7.4

* docs: add PR 1726 and PR 1728 to v3.7.4 changelog

* fix(security): replace insecure Math.random with crypto.getRandomValues for fallback UUID generation

* fix(migrations): intercept 007 migration to use IF NOT EXISTS logic on fresh installs

Fixes cheaper-inference#1733

* test: fix typescript compilation errors in unit tests

* fix(db): reconcile legacy reasoning cache migration

* chore(release): bump to v3.7.4 — changelog, docs, version sync

* fix(cc-compatible): preserve Claude Code system skeleton (cheaper-inference#1740)

Integrated into release/v3.7.4

* docs(changelog): update for PR cheaper-inference#1740 merge

* docs(changelog): include workflow updates

* fix(db): reconcile legacy reasoning cache migration (cheaper-inference#1734)

Integrated into release/v3.7.4

* Add endpoint tunnel visibility settings (cheaper-inference#1743)

Integrated into release/v3.7.4

* Normalize max reasoning effort for Codex routing (cheaper-inference#1744)

Integrated into release/v3.7.4

* Fix Claude Code gateway config helper (cheaper-inference#1745)

Integrated into release/v3.7.4

* Refresh CLI fingerprint provider profiles (cheaper-inference#1746)

Integrated into release/v3.7.4

* Integrated into release/v3.7.4 (PR cheaper-inference#1742)

* docs(changelog): update for PRs 1742-1746

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: Yash Ghule <y.ghule77@gmail.com>
Co-authored-by: backryun <bakryun0718@proton.me>
Co-authored-by: dhaern <manker_lol@hotmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Duncan L <leungd@gmail.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.

6 participants