feat: add Responses API tip for GPT-5.6 and later models in multiple languages (#39188)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Wu Tianwei 2026-07-17 15:34:38 +08:00 committed by GitHub
parent 38045078dc
commit 2f3c785f27
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 97 additions and 0 deletions

View File

@ -1,5 +1,6 @@
import type * as React from 'react'
import type { Credential, CredentialFormSchema, ModelProvider } from '../../declarations'
import type { FormSchema } from '@/app/components/base/form/types'
import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'
import {
ConfigurationMethodEnum,
@ -125,8 +126,10 @@ vi.mock('@/app/components/base/form/form-scenarios/auth', async () => {
const AuthForm = React.forwardRef(
(
{
formSchemas,
onChange,
}: {
formSchemas: FormSchema[]
onChange?: (field: string, value: string) => void
},
ref: React.ForwardedRef<{
@ -141,6 +144,12 @@ vi.mock('@/app/components/base/form/form-scenarios/auth', async () => {
}))
return (
<div>
{formSchemas.map(
(schema) =>
typeof schema.description === 'string' && (
<div key={schema.name}>{schema.description}</div>
),
)}
<button type="button" onClick={() => onChange?.('__model_name', 'updated-model')}>
Model Name Change
</button>
@ -281,6 +290,61 @@ describe('ModelModal', () => {
expect(screen.getByText('common.modelProvider.auth.modelCredential'))!.toBeInTheDocument()
})
it('should show the Responses API tip only for official OpenAI credential forms', () => {
const tip = 'common.modelProvider.auth.openAIResponsesAPITip'
mockState.formSchemas = [
{ variable: 'api_protocol', type: 'select' } as unknown as CredentialFormSchema,
]
const officialOpenAI = renderModal({
provider: createProvider({ provider: 'langgenius/openai/openai' }),
})
expect(screen.getByText(tip))!.toBeInTheDocument()
officialOpenAI.unmount()
const legacyOpenAI = renderModal()
expect(screen.getByText(tip))!.toBeInTheDocument()
legacyOpenAI.unmount()
mockState.formSchemas = []
const openAIWithoutProtocolField = renderModal()
expect(screen.queryByText(tip)).not.toBeInTheDocument()
openAIWithoutProtocolField.unmount()
mockState.formSchemas = [
{ variable: 'api_protocol', type: 'select' } as unknown as CredentialFormSchema,
]
renderModal({
provider: createProvider({ provider: 'langgenius/azure_openai/azure_openai' }),
})
expect(screen.queryByText(tip)).not.toBeInTheDocument()
})
it('should show the Responses API tip when adding a new custom model credential', () => {
const tip = 'common.modelProvider.auth.openAIResponsesAPITip'
mockState.formSchemas = [
{ variable: 'api_protocol', type: 'select' } as unknown as CredentialFormSchema,
]
const customModel = renderModal({ mode: ModelModalModeEnum.configCustomModel })
expect(screen.getByText(tip))!.toBeInTheDocument()
customModel.unmount()
const modelCredential = renderModal({
mode: ModelModalModeEnum.configModelCredential,
model: { model: 'gpt-5.6', model_type: ModelTypeEnum.textGeneration },
})
expect(screen.getByText(tip))!.toBeInTheDocument()
modelCredential.unmount()
renderModal({ mode: ModelModalModeEnum.addCustomModelToModelList })
expect(screen.queryByText(tip)).not.toBeInTheDocument()
fireEvent.click(screen.getByText('Add New'))
expect(screen.getByText(tip))!.toBeInTheDocument()
})
it('should call onCancel when the cancel button is clicked', () => {
const { onCancel } = renderModal()

View File

@ -30,6 +30,7 @@ import {
import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
import { useCredentialPermissions } from '@/hooks/use-credential-permissions'
import { useRenderI18nObject } from '@/hooks/use-i18n'
import { ModelProviderQuotaGetPaid } from '@/types/model-provider'
import { ConfigurationMethodEnum, FormTypeEnum, ModelModalModeEnum } from '../declarations'
import { useLanguage } from '../hooks'
import { CredentialSelector } from '../model-auth'
@ -285,6 +286,8 @@ const ModelModal: FC<ModelModalProps> = ({
if (getForm()) getForm()?.setFieldValue(field, value)
}, [])
const notAllowCustomCredential = provider.allow_custom_token === false
const isOfficialOpenAIProvider =
provider.provider === ModelProviderQuotaGetPaid.OPENAI || provider.provider === 'openai'
const handleOpenChange = useCallback(
(open: boolean) => {
@ -357,6 +360,13 @@ const ModelModal: FC<ModelModalProps> = ({
...formSchema,
name: formSchema.variable,
showRadioUI: formSchema.type === FormTypeEnum.radio,
...(isOfficialOpenAIProvider && formSchema.variable === 'api_protocol'
? {
description: t(($) => $['modelProvider.auth.openAIResponsesAPITip'], {
ns: 'common',
}),
}
: {}),
}
}) as FormSchema[]
}

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "إدارة بيانات الاعتماد",
"modelProvider.auth.modelCredential": "بيانات اعتماد النموذج",
"modelProvider.auth.modelCredentials": "بيانات اعتماد النموذج",
"modelProvider.auth.openAIResponsesAPITip": "بالنسبة إلى نماذج GPT-5.6 والإصدارات الأحدث، نوصي باستخدام Responses API.",
"modelProvider.auth.providerManaged": "مدار من قبل المزود",
"modelProvider.auth.providerManagedTip": "يتم استضافة التكوين الحالي بواسطة المزود.",
"modelProvider.auth.removeModel": "إزالة النموذج",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Anmeldeinformationen verwalten",
"modelProvider.auth.modelCredential": "Zeugnis des Modells",
"modelProvider.auth.modelCredentials": "Modellanmeldeinformationen",
"modelProvider.auth.openAIResponsesAPITip": "Für GPT-5.6 und neuere Modelle empfehlen wir die Verwendung der Responses API.",
"modelProvider.auth.providerManaged": "Anbieter verwaltet",
"modelProvider.auth.providerManagedTip": "Die aktuelle Konfiguration wird vom Anbieter gehostet.",
"modelProvider.auth.removeModel": "Modell entfernen",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Manage Credentials",
"modelProvider.auth.modelCredential": "Model credential",
"modelProvider.auth.modelCredentials": "Model credentials",
"modelProvider.auth.openAIResponsesAPITip": "For GPT-5.6 and later models, we recommend using the Responses API.",
"modelProvider.auth.providerManaged": "Provider managed",
"modelProvider.auth.providerManagedTip": "The current configuration is hosted by the provider.",
"modelProvider.auth.removeModel": "Remove Model",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Administrar credenciales",
"modelProvider.auth.modelCredential": "Credencial modelo",
"modelProvider.auth.modelCredentials": "Credenciales del modelo",
"modelProvider.auth.openAIResponsesAPITip": "Para GPT-5.6 y modelos posteriores, recomendamos usar la API Responses.",
"modelProvider.auth.providerManaged": "Proveedor gestionado",
"modelProvider.auth.providerManagedTip": "La configuración actual es hospedada por el proveedor.",
"modelProvider.auth.removeModel": "Eliminar modelo",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "مدیریت اعتبارنامه ها",
"modelProvider.auth.modelCredential": "اعتبار مدل",
"modelProvider.auth.modelCredentials": "مدل اعتبارنامه",
"modelProvider.auth.openAIResponsesAPITip": "برای مدل‌های GPT-5.6 و جدیدتر، استفاده از Responses API را توصیه می‌کنیم.",
"modelProvider.auth.providerManaged": "مدیریت شده توسط ارائه‌دهنده",
"modelProvider.auth.providerManagedTip": "تنظیمات فعلی توسط ارائه‌دهنده میزبانی می‌شود.",
"modelProvider.auth.removeModel": "حذف مدل",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Gérer les informations didentification",
"modelProvider.auth.modelCredential": "Références du modèle",
"modelProvider.auth.modelCredentials": "Informations d'identification du modèle",
"modelProvider.auth.openAIResponsesAPITip": "Pour GPT-5.6 et les modèles ultérieurs, nous recommandons dutiliser lAPI Responses.",
"modelProvider.auth.providerManaged": "Fournisseur géré",
"modelProvider.auth.providerManagedTip": "La configuration actuelle est hébergée par le fournisseur.",
"modelProvider.auth.removeModel": "Supprimer le modèle",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "क्रेडेंशियल्स प्रबंधित करें",
"modelProvider.auth.modelCredential": "मॉडल क्रेडेंशियल",
"modelProvider.auth.modelCredentials": "मॉडल क्रेडेंशियल्स",
"modelProvider.auth.openAIResponsesAPITip": "GPT-5.6 और बाद के मॉडल के लिए, हम Responses API का उपयोग करने की सलाह देते हैं।",
"modelProvider.auth.providerManaged": "प्रदाता द्वारा प्रबंधित",
"modelProvider.auth.providerManagedTip": "वर्तमान कॉन्फ़िगरेशन प्रदाता द्वारा होस्ट किया गया है।",
"modelProvider.auth.removeModel": "मॉडल हटाएं",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Kelola Kredensial",
"modelProvider.auth.modelCredential": "Kredensial model",
"modelProvider.auth.modelCredentials": "Kredensial model",
"modelProvider.auth.openAIResponsesAPITip": "Untuk GPT-5.6 dan model yang lebih baru, kami menyarankan penggunaan Responses API.",
"modelProvider.auth.providerManaged": "Penyedia dikelola",
"modelProvider.auth.providerManagedTip": "Konfigurasi saat ini dihosting oleh penyedia.",
"modelProvider.auth.removeModel": "Hapus Model",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Gestisci credenziali",
"modelProvider.auth.modelCredential": "Credenziale del modello",
"modelProvider.auth.modelCredentials": "Credenziali del modello",
"modelProvider.auth.openAIResponsesAPITip": "Per GPT-5.6 e modelli successivi, consigliamo di utilizzare la Responses API.",
"modelProvider.auth.providerManaged": "Fornitore gestito",
"modelProvider.auth.providerManagedTip": "La configurazione attuale è ospitata dal fornitore.",
"modelProvider.auth.removeModel": "Rimuovi modello",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "認証情報を管理",
"modelProvider.auth.modelCredential": "モデルの資格情報",
"modelProvider.auth.modelCredentials": "モデルの資格情報",
"modelProvider.auth.openAIResponsesAPITip": "GPT-5.6 以降のモデルでは、Responses API の使用をお勧めします。",
"modelProvider.auth.providerManaged": "プロバイダー管理",
"modelProvider.auth.providerManagedTip": "現在の設定はプロバイダーによってホストされています。",
"modelProvider.auth.removeModel": "モデルを削除",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "자격 증명 관리",
"modelProvider.auth.modelCredential": "모델 자격 증명",
"modelProvider.auth.modelCredentials": "모델 자격 증명",
"modelProvider.auth.openAIResponsesAPITip": "GPT-5.6 이상 모델에서는 Responses API 사용을 권장합니다.",
"modelProvider.auth.providerManaged": "제공자가 관리하는",
"modelProvider.auth.providerManagedTip": "현재 구성은 제공업체에 의해 호스팅되고 있습니다.",
"modelProvider.auth.removeModel": "모델 제거",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Manage Credentials",
"modelProvider.auth.modelCredential": "Model credential",
"modelProvider.auth.modelCredentials": "Model credentials",
"modelProvider.auth.openAIResponsesAPITip": "Voor GPT-5.6 en nieuwere modellen raden we het gebruik van de Responses API aan.",
"modelProvider.auth.providerManaged": "Provider managed",
"modelProvider.auth.providerManagedTip": "The current configuration is hosted by the provider.",
"modelProvider.auth.removeModel": "Remove Model",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Zarządzanie poświadczeniami",
"modelProvider.auth.modelCredential": "Poświadczenie modelu",
"modelProvider.auth.modelCredentials": "Uprawnienia modelu",
"modelProvider.auth.openAIResponsesAPITip": "W przypadku modelu GPT-5.6 i nowszych zalecamy korzystanie z interfejsu Responses API.",
"modelProvider.auth.providerManaged": "Zarządzane przez dostawcę",
"modelProvider.auth.providerManagedTip": "Bieżąca konfiguracja jest hostowana przez dostawcę.",
"modelProvider.auth.removeModel": "Usuń model",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Gerenciar credenciais",
"modelProvider.auth.modelCredential": "Credencial de modelo",
"modelProvider.auth.modelCredentials": "Credenciais do modelo",
"modelProvider.auth.openAIResponsesAPITip": "Para o GPT-5.6 e modelos posteriores, recomendamos usar a API Responses.",
"modelProvider.auth.providerManaged": "Provedor gerenciado",
"modelProvider.auth.providerManagedTip": "A configuração atual é hospedada pelo provedor.",
"modelProvider.auth.removeModel": "Remover modelo",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Gestionați acreditările",
"modelProvider.auth.modelCredential": "Model de acreditare",
"modelProvider.auth.modelCredentials": "Credențiale model",
"modelProvider.auth.openAIResponsesAPITip": "Pentru GPT-5.6 și modelele ulterioare, recomandăm utilizarea API-ului Responses.",
"modelProvider.auth.providerManaged": "Gestionat de furnizor",
"modelProvider.auth.providerManagedTip": "Configurarea curentă este găzduită de furnizor.",
"modelProvider.auth.removeModel": "Eliminați modelul",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Управление учетными данными",
"modelProvider.auth.modelCredential": "Удостоверение модели",
"modelProvider.auth.modelCredentials": "Учетные данные модели",
"modelProvider.auth.openAIResponsesAPITip": "Для GPT-5.6 и более новых моделей рекомендуется использовать Responses API.",
"modelProvider.auth.providerManaged": "Управляемый провайдером",
"modelProvider.auth.providerManagedTip": "Текущая конфигурация размещена у провайдера.",
"modelProvider.auth.removeModel": "Удалить модель",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Upravljanje poverilnic",
"modelProvider.auth.modelCredential": "Poverilnice modela",
"modelProvider.auth.modelCredentials": "Model akreditivi",
"modelProvider.auth.openAIResponsesAPITip": "Za GPT-5.6 in novejše modele priporočamo uporabo Responses API.",
"modelProvider.auth.providerManaged": "Zagotavlja upravljano",
"modelProvider.auth.providerManagedTip": "Trenutna konfiguracija je gostovana pri ponudniku.",
"modelProvider.auth.removeModel": "Odstrani model",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "จัดการข้อมูลประจําตัว",
"modelProvider.auth.modelCredential": "ข้อมูลประจําตัวของรุ่น",
"modelProvider.auth.modelCredentials": "ข้อมูลรับรองโมเดล",
"modelProvider.auth.openAIResponsesAPITip": "สำหรับ GPT-5.6 และโมเดลที่ใหม่กว่า เราขอแนะนำให้ใช้ Responses API",
"modelProvider.auth.providerManaged": "ผู้ให้บริการจัดการ",
"modelProvider.auth.providerManagedTip": "การกำหนดค่าปัจจุบันถูกโฮสต์โดยผู้ให้บริการ.",
"modelProvider.auth.removeModel": "ลบโมเดล",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Kimlik Bilgilerini Yönet",
"modelProvider.auth.modelCredential": "Model kimlik bilgileri",
"modelProvider.auth.modelCredentials": "Model kimlik bilgileri",
"modelProvider.auth.openAIResponsesAPITip": "GPT-5.6 ve sonraki modeller için Responses API'yi kullanmanızı öneririz.",
"modelProvider.auth.providerManaged": "Sağlayıcı yönetimi",
"modelProvider.auth.providerManagedTip": "Mevcut yapılandırma sağlayıcı tarafından barındırılmaktadır.",
"modelProvider.auth.removeModel": "Modeli Kaldır",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Керування обліковими даними",
"modelProvider.auth.modelCredential": "Облікові дані моделі",
"modelProvider.auth.modelCredentials": "Модельні облікові дані",
"modelProvider.auth.openAIResponsesAPITip": "Для GPT-5.6 і новіших моделей рекомендуємо використовувати Responses API.",
"modelProvider.auth.providerManaged": "Постачальник управляє",
"modelProvider.auth.providerManagedTip": "Поточна конфігурація розміщується провайдером.",
"modelProvider.auth.removeModel": "Видалити модель",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "Quản lý thông tin đăng nhập",
"modelProvider.auth.modelCredential": "Thông tin đăng nhập mô hình",
"modelProvider.auth.modelCredentials": "Chứng chỉ của mô hình",
"modelProvider.auth.openAIResponsesAPITip": "Đối với GPT-5.6 và các mô hình mới hơn, chúng tôi khuyên dùng Responses API.",
"modelProvider.auth.providerManaged": "Nhà cung cấp đã được quản lý",
"modelProvider.auth.providerManagedTip": "Cấu hình hiện tại được lưu trữ bởi nhà cung cấp.",
"modelProvider.auth.removeModel": "Loại bỏ mô hình",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "管理凭据",
"modelProvider.auth.modelCredential": "模型凭据",
"modelProvider.auth.modelCredentials": "模型凭据",
"modelProvider.auth.openAIResponsesAPITip": "使用 GPT-5.6 及以上模型时,建议使用 Responses API。",
"modelProvider.auth.providerManaged": "由模型供应商管理",
"modelProvider.auth.providerManagedTip": "使用模型供应商提供的单组凭据。",
"modelProvider.auth.removeModel": "移除模型",

View File

@ -332,6 +332,7 @@
"modelProvider.auth.manageCredentials": "管理憑證",
"modelProvider.auth.modelCredential": "模型認證",
"modelProvider.auth.modelCredentials": "模型憑證",
"modelProvider.auth.openAIResponsesAPITip": "使用 GPT-5.6 及以上模型時,建議使用 Responses API。",
"modelProvider.auth.providerManaged": "供應商管理",
"modelProvider.auth.providerManagedTip": "當前的配置由提供者主辦。",
"modelProvider.auth.removeModel": "移除模型",