Repository navigation
Release v3.7.4 - #1730
Release v3.7.4#1730
Conversation
There was a problem hiding this comment.
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.
| "thought", | ||
| "error", | ||
| "executableCode", | ||
| "codeExecutionResult", |
There was a problem hiding this comment.
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:
- Thought/Reasoning Blocks: Add
thinking(used by Anthropic Claude 3.7) andreasoning_content(used by DeepSeek R1). This ensures that reasoning phases are correctly identified as active stream content, preventing premature timeouts for these models. - Gemini Code Execution: In the Gemini API,
executableCodeandcodeExecutionResultare objects containingcodeandoutputfields respectively. Adding these internal keys ensures the stream is considered ready even when the content is nested within these objects. - Error Handling: Adding
messagehelps identify error blocks that are structured as objects (common in OpenAI-compatible streams).
"thought",
"thinking",
"reasoning_content",
"error",
"message",
"executableCode",
"codeExecutionResult",
"code",
"output",
CI Coverage Report
Coverage artifact was not available for this run. |
There was a problem hiding this comment.
💡 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")} |
There was a problem hiding this comment.
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 👍 / 👎.
| if (!isValid && data.error) { | ||
| validationError = data.error; |
There was a problem hiding this comment.
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 👍 / 👎.
…er, and cross-platform app icons. (#1728) Integrated into release/v3.7.4
Integrated into release/v3.7.4
…es for fallback UUID generation
There was a problem hiding this comment.
💡 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; |
There was a problem hiding this comment.
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 👍 / 👎.
| const hasInput = Array.isArray(body.input) && body.input.length > 0; | ||
| if (hasInput) { | ||
| delete body.conversation_id; |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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".
| upstreamBody.prompt = body.prompt || ""; | ||
| appendOptionalFormValue(formData, "prompt", body.prompt || ""); |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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".
| const existing = db | ||
| .prepare("SELECT id FROM proxy_registry WHERE host = ? AND port = ? LIMIT 1") | ||
| .get(host, port) as { id?: string } | undefined; |
There was a problem hiding this comment.
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(() => { |
There was a problem hiding this comment.
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 👍 / 👎.
Integrated into release/v3.7.4
There was a problem hiding this comment.
💡 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], { |
There was a problem hiding this comment.
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 👍 / 👎.
Integrated into release/v3.7.4
Integrated into release/v3.7.4
Integrated into release/v3.7.4
Integrated into release/v3.7.4
Integrated into release/v3.7.4
|
* 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>
* 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>
* 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>


[3.7.4] — 2026-04-28
✨ New Features
🔒 Security
Math.randomwithcrypto.getRandomValuesfor fallback UUID generation to resolve CodeQL CWE-338 finding (deps: bump the development group with 2 updates #182)🐛 Bug Fixes
create_reasoning_cachemigration tracking to prevent version shadowing on032and resolve startup warnings (fix(db): reconcile legacy reasoning cache migration #1734)007migration to use idempotentIF NOT EXISTSlogic viaPRAGMA table_info, preventing syntax crashes on fresh installs ([BUG] Problematic Migration #1733)multipart/form-datainstead of JSON (Fix image provider validation and Stability image requests #1726)previous_response_idandconversation_idfields when input array is empty to prevent schema validation errors ([BUG] [ERROR] [400]: One of "input" or "previous_response_id"or 'prompt'or 'conversation_id' must be provided. #1729)apiKeyOptionalis true and fix typing errors in provider dashboard to allow saving search providers without credentials ([BUG] searXNG search provider #1721)thoughtanderrorblocks in Antigravity/Gemini SSE streams to prevent premature 502 timeouts (Intermittent 502 “Stream ended before producing useful content” with antigravity/claude-opus-4-6-thinking #1725, [BUG] Stream ended before ... on antigravity provider #1705)🛠️ Maintenance
/generate-releaseworkflow