From f8a4468616d1887451bcf97abc33417986bb71d0 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Sun, 13 Sep 2026 19:23:26 +0800 Subject: [PATCH] Add Responses API support with cancellation-safe fallback Allow OpenAI-compatible providers and Azure deployments to opt into Responses while preserving explicit endpoints, queries, provider edits, secret materialization, and configuration migration. Handle streamed and complete responses, reject malformed, failed, or empty answers, and preserve structured-output metadata. Only retry unsupported routes against a valid configured Chat endpoint. Share cancellation through configuration loading and fallback so stopped requests cannot restart or save answers. Preserve unchanged dormant Responses settings during explicit Chat edits without accepting new invalid endpoints. Include editor evidence and regression coverage for protocol selection, persistence, fallback, cancellation, schema metadata, and Azure temperature policy. --- screenshots/provider-responses-editor.png | Bin 0 -> 64138 bytes src/_locales/en/main.json | 12 + src/config/index.mjs | 9 + src/popup/sections/AdvancedPart.jsx | 14 + src/popup/sections/ApiModes.jsx | 134 ++-- src/popup/sections/GeneralPart.jsx | 12 + .../sections/api-modes-provider-utils.mjs | 70 +- src/popup/sections/provider-secret-utils.mjs | 6 + src/services/apis/azure-openai-api.mjs | 81 ++- src/services/apis/openai-api.mjs | 151 +++- src/services/apis/openai-compatible-core.mjs | 69 +- src/services/apis/openai-responses-core.mjs | 354 ++++++++++ src/services/apis/provider-registry.mjs | 140 ++++ src/services/apis/shared.mjs | 10 + src/utils/fetch-sse.mjs | 95 ++- .../unit/config/migrate-user-config.test.mjs | 108 +++ .../popup/provider-responses-edit.test.mjs | 658 ++++++++++++++++++ .../apis/azure-openai-temperature.test.mjs | 40 ++ .../openai-cancellation-lifecycle.test.mjs | 464 ++++++++++++ .../apis/openai-responses-core.test.mjs | 484 +++++++++++++ .../apis/openai-responses-fallback.test.mjs | 154 ++++ .../openai-responses-online-review.test.mjs | 307 ++++++++ .../apis/openai-responses-protocol.test.mjs | 538 ++++++++++++++ ...enai-responses-review-regressions.test.mjs | 413 +++++++++++ tests/unit/utils/fetch-sse.test.mjs | 300 ++++++++ 25 files changed, 4495 insertions(+), 128 deletions(-) create mode 100644 screenshots/provider-responses-editor.png create mode 100644 src/services/apis/openai-responses-core.mjs create mode 100644 tests/unit/popup/provider-responses-edit.test.mjs create mode 100644 tests/unit/services/apis/openai-cancellation-lifecycle.test.mjs create mode 100644 tests/unit/services/apis/openai-responses-core.test.mjs create mode 100644 tests/unit/services/apis/openai-responses-fallback.test.mjs create mode 100644 tests/unit/services/apis/openai-responses-online-review.test.mjs create mode 100644 tests/unit/services/apis/openai-responses-protocol.test.mjs create mode 100644 tests/unit/services/apis/openai-responses-review-regressions.test.mjs diff --git a/screenshots/provider-responses-editor.png b/screenshots/provider-responses-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1cb85b11cf18fe16bf30bbe4f86ea929805f0b GIT binary patch literal 64138 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 WG%k@Nj&9!E@BCTUGxgtJ{`p^}@>5O# literal 0 HcmV?d00001 diff --git a/src/_locales/en/main.json b/src/_locales/en/main.json index 445148a56..99a160c92 100644 --- a/src/_locales/en/main.json +++ b/src/_locales/en/main.json @@ -125,6 +125,18 @@ "The temperature parameter is not sent. The provider or model default is used.": "The temperature parameter is not sent. The provider or model default is used.", "The current model does not accept a custom temperature. The parameter will not be sent.": "The current model does not accept a custom temperature. The parameter will not be sent.", "API Url": "API Url", + "API Protocol": "API Protocol", + "Chat Completions URL": "Chat Completions URL", + "Responses URL": "Responses URL", + "Default protocol": "Default protocol", + "Use the global OpenAI setting where applicable; otherwise use Chat Completions.": "Use the global OpenAI setting where applicable; otherwise use Chat Completions.", + "Optional when Responses has an explicit URL.": "Optional when Responses has an explicit URL.", + "Leave empty to derive from the Chat Completions URL.": "Leave empty to derive from the Chat Completions URL.", + "Please enter a valid HTTP(S) Responses URL": "Please enter a valid HTTP(S) Responses URL", + "Chat Completions": "Chat Completions", + "Responses": "Responses", + "OpenAI API Protocol": "OpenAI API Protocol", + "Use Responses API (Azure preview)": "Use Responses API (Azure preview)", "Provider": "Provider", "Others": "Others", "API Modes": "API Modes", diff --git a/src/config/index.mjs b/src/config/index.mjs index 6267ef67c..94d6af771 100644 --- a/src/config/index.mjs +++ b/src/config/index.mjs @@ -19,6 +19,7 @@ import { canonicalizeModelKeyArray, } from './model-key-migrations.mjs' import { getNavigatorLanguage, resolvePreferredLanguageKey } from './language-data.mjs' +import { normalizeExplicitApiProtocol } from '../services/apis/provider-registry.mjs' export { getNavigatorLanguage } @@ -842,6 +843,8 @@ export const defaultConfig = { customChatGptWebApiUrl: 'https://chatgpt.com', customChatGptWebApiPath: '/backend-api/conversation', customOpenAiApiUrl: 'https://api.openai.com', + openaiApiProtocol: 'chat', + azureUseResponses: false, customAnthropicApiUrl: 'https://api.anthropic.com', disableWebModeHistory: true, hideContextMenu: false, @@ -1165,10 +1168,14 @@ function normalizeCustomProviderForStorage(provider, index, providerIdSet) { ) const completionsPath = ensureLeadingSlash(provider.completionsPath, '/v1/completions') const normalizedLegacyProviderIds = legacyProviderIds.length > 0 ? legacyProviderIds : undefined + const apiProtocol = normalizeExplicitApiProtocol(provider.apiProtocol) + const responsesUrl = normalizeText(provider.responsesUrl) const storageShapeChanged = (normalizeText(provider.chatCompletionsPath) || '/v1/chat/completions') !== chatCompletionsPath || (normalizeText(provider.completionsPath) || '/v1/completions') !== completionsPath || + provider.apiProtocol !== (apiProtocol || undefined) || + provider.responsesUrl !== (responsesUrl || undefined) || JSON.stringify(provider.legacyProviderIds) !== JSON.stringify(normalizedLegacyProviderIds) return { originalId, @@ -1186,6 +1193,8 @@ function normalizeCustomProviderForStorage(provider, index, providerIdSet) { completionsUrl: normalizeText(provider.completionsUrl), enabled: provider.enabled !== false, allowLegacyResponseField: provider.allowLegacyResponseField !== false, + ...(apiProtocol ? { apiProtocol } : {}), + ...(responsesUrl ? { responsesUrl } : {}), ...(sourceProviderId ? { sourceProviderId } : {}), ...(normalizedLegacyProviderIds ? { legacyProviderIds: normalizedLegacyProviderIds } : {}), }, diff --git a/src/popup/sections/AdvancedPart.jsx b/src/popup/sections/AdvancedPart.jsx index 017b9191f..38351bcb5 100644 --- a/src/popup/sections/AdvancedPart.jsx +++ b/src/popup/sections/AdvancedPart.jsx @@ -136,6 +136,20 @@ function ApiUrl({ config, updateConfig }) { }} /> +