From efbf4276318fd94d2d7f8b8dbf519c7df19a0e81 Mon Sep 17 00:00:00 2001 From: Andrew Ginns Date: Mon, 8 Dec 2025 18:17:25 +0000 Subject: [PATCH] feat: add xhigh reasoning effort for gpt-5.1-codex-max (#9900) * feat: add xhigh reasoning effort for gpt-5.1-codex-max * fix: Address openai-native.spec.ts test failure * chore: Localisation of 'Extra high' * chore: revert unrelated CustomModesManager refactoring --------- Co-authored-by: Hannes Rudolph --- packages/types/src/model.ts | 6 +-- packages/types/src/providers/openai.ts | 2 +- .../providers/__tests__/openai-native.spec.ts | 40 +++++++++++++++++++ webview-ui/src/i18n/locales/ca/settings.json | 1 + webview-ui/src/i18n/locales/de/settings.json | 1 + webview-ui/src/i18n/locales/en/settings.json | 3 +- webview-ui/src/i18n/locales/es/settings.json | 1 + webview-ui/src/i18n/locales/fr/settings.json | 1 + webview-ui/src/i18n/locales/hi/settings.json | 1 + webview-ui/src/i18n/locales/id/settings.json | 1 + webview-ui/src/i18n/locales/it/settings.json | 1 + webview-ui/src/i18n/locales/ja/settings.json | 1 + webview-ui/src/i18n/locales/ko/settings.json | 1 + webview-ui/src/i18n/locales/nl/settings.json | 1 + webview-ui/src/i18n/locales/pl/settings.json | 1 + .../src/i18n/locales/pt-BR/settings.json | 1 + webview-ui/src/i18n/locales/ru/settings.json | 1 + webview-ui/src/i18n/locales/tr/settings.json | 1 + webview-ui/src/i18n/locales/vi/settings.json | 1 + .../src/i18n/locales/zh-CN/settings.json | 1 + .../src/i18n/locales/zh-TW/settings.json | 1 + 21 files changed, 63 insertions(+), 5 deletions(-) diff --git a/packages/types/src/model.ts b/packages/types/src/model.ts index bcdf5681e1..6c7d0a4b4b 100644 --- a/packages/types/src/model.ts +++ b/packages/types/src/model.ts @@ -22,7 +22,7 @@ export type ReasoningEffortWithMinimal = z.infer { ) }) + it("should support xhigh reasoning effort for GPT-5.1 Codex Max", async () => { + // Mock fetch for Responses API + const mockFetch = vitest.fn().mockResolvedValue({ + ok: true, + body: new ReadableStream({ + start(controller) { + controller.enqueue( + new TextEncoder().encode( + 'data: {"type":"response.output_item.added","item":{"type":"text","text":"XHigh effort"}}\n\n', + ), + ) + controller.enqueue(new TextEncoder().encode("data: [DONE]\n\n")) + controller.close() + }, + }), + }) + global.fetch = mockFetch as any + + // Mock SDK to fail + mockResponsesCreate.mockRejectedValue(new Error("SDK not available")) + + handler = new OpenAiNativeHandler({ + ...mockOptions, + apiModelId: "gpt-5.1-codex-max", + reasoningEffort: "xhigh", + }) + + const stream = handler.createMessage(systemPrompt, messages) + for await (const _chunk of stream) { + // drain + } + + expect(mockFetch).toHaveBeenCalledWith( + "https://api.openai.com/v1/responses", + expect.objectContaining({ + body: expect.stringContaining('"effort":"xhigh"'), + }), + ) + }) + it("should omit reasoning when selection is 'disable'", async () => { // Mock fetch for Responses API const mockFetch = vitest.fn().mockResolvedValue({ diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 1d2124b6fb..87f1112a53 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -506,6 +506,7 @@ "none": "Cap", "minimal": "Mínim (el més ràpid)", "high": "Alt", + "xhigh": "Molt alt", "medium": "Mitjà", "low": "Baix" }, diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 53799baca6..b1463e58ac 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -506,6 +506,7 @@ "none": "Keine", "minimal": "Minimal (schnellste)", "high": "Hoch", + "xhigh": "Sehr hoch", "medium": "Mittel", "low": "Niedrig" }, diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 6dd07ca411..89a3f7150d 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -512,7 +512,8 @@ "minimal": "Minimal (Fastest)", "low": "Low", "medium": "Medium", - "high": "High" + "high": "High", + "xhigh": "Extra High" }, "verbosity": { "label": "Output Verbosity", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 25a7ee2128..3cf4c9a5b5 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -506,6 +506,7 @@ "none": "Ninguno", "minimal": "Mínimo (el más rápido)", "high": "Alto", + "xhigh": "Muy alto", "medium": "Medio", "low": "Bajo" }, diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index f53715ec1e..b03b2d9bf3 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -506,6 +506,7 @@ "none": "Aucun", "minimal": "Minimal (le plus rapide)", "high": "Élevé", + "xhigh": "Très élevé", "medium": "Moyen", "low": "Faible" }, diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 3d6ab6969c..0baba60d19 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -506,6 +506,7 @@ "none": "कोई नहीं", "minimal": "न्यूनतम (सबसे तेज़)", "high": "उच्च", + "xhigh": "बहुत उच्च", "medium": "मध्यम", "low": "निम्न" }, diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index c519f0dccb..e0ba9f1b99 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -510,6 +510,7 @@ "none": "Tidak Ada", "minimal": "Minimal (Tercepat)", "high": "Tinggi", + "xhigh": "Sangat tinggi", "medium": "Sedang", "low": "Rendah" }, diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 568cf19d47..83af1aa57e 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -506,6 +506,7 @@ "none": "Nessuno", "minimal": "Minimo (più veloce)", "high": "Alto", + "xhigh": "Molto alto", "medium": "Medio", "low": "Basso" }, diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 00b4538630..1a534c6bb5 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -506,6 +506,7 @@ "none": "なし", "minimal": "最小 (最速)", "high": "高", + "xhigh": "非常に高い", "medium": "中", "low": "低" }, diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index fcbda4aceb..f5d40d7ecd 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -506,6 +506,7 @@ "none": "없음", "minimal": "최소 (가장 빠름)", "high": "높음", + "xhigh": "매우 높음", "medium": "중간", "low": "낮음" }, diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 404e35e0da..d15bd799b8 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -506,6 +506,7 @@ "none": "Geen", "minimal": "Minimaal (Snelst)", "high": "Hoog", + "xhigh": "Zeer hoog", "medium": "Middel", "low": "Laag" }, diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 08225847b9..80ee0a1949 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -506,6 +506,7 @@ "none": "Brak", "minimal": "Minimalny (najszybszy)", "high": "Wysoki", + "xhigh": "Bardzo wysoki", "medium": "Średni", "low": "Niski" }, diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index a1f4155a87..74a9842574 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -506,6 +506,7 @@ "none": "Nenhum", "minimal": "Mínimo (mais rápido)", "high": "Alto", + "xhigh": "Muito alto", "medium": "Médio", "low": "Baixo" }, diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index e71ddfd936..a6ab580510 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -506,6 +506,7 @@ "none": "Нет", "minimal": "Минимальный (самый быстрый)", "high": "Высокие", + "xhigh": "Очень высокие", "medium": "Средние", "low": "Низкие" }, diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 0e17e1a6cc..0d07eec888 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -506,6 +506,7 @@ "none": "Yok", "minimal": "Minimal (en hızlı)", "high": "Yüksek", + "xhigh": "Çok yüksek", "medium": "Orta", "low": "Düşük" }, diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index f164db9ac9..f0dc935fa0 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -506,6 +506,7 @@ "none": "Không", "minimal": "Tối thiểu (nhanh nhất)", "high": "Cao", + "xhigh": "Rất cao", "medium": "Trung bình", "low": "Thấp" }, diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 2c9327c94d..873f9d2e87 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -506,6 +506,7 @@ "none": "无", "minimal": "最小 (最快)", "high": "高", + "xhigh": "超高", "medium": "中", "low": "低" }, diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 67957e87af..ca584a606e 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -506,6 +506,7 @@ "none": "無", "minimal": "最小 (最快)", "high": "高", + "xhigh": "超高", "medium": "中", "low": "低" },