From 6fb6b9e06b48998b44d2eee5a052bbd5f6afb093 Mon Sep 17 00:00:00 2001
From: chanx <1243304602@qq.com>
Date: Thu, 30 Jul 2026 16:50:31 +0800
Subject: [PATCH] fix(setting-model): support field-level autoComplete to
suppress browser autofill (#17559)
---
web/src/components/dynamic-form.tsx | 9 +++++++++
.../field-config/generic-api-key-config.ts | 4 ++++
.../provider-schema/hooks/use-provider-fields.tsx | 7 ++++++-
.../user-setting/setting-model/provider-schema/types.ts | 6 ++++++
4 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/web/src/components/dynamic-form.tsx b/web/src/components/dynamic-form.tsx
index 107109f922..1930ef631a 100644
--- a/web/src/components/dynamic-form.tsx
+++ b/web/src/components/dynamic-form.tsx
@@ -93,6 +93,14 @@ export interface FormFieldConfig {
labelClassName?: string;
className?: string;
disabled?: boolean;
+ /**
+ * HTML `autocomplete` attribute forwarded to the underlying ``.
+ * Use `'new-password'` to suppress browser autofill — Chrome ignores
+ * `'off'` on forms that contain a password field (treats them as login
+ * forms), so `'new-password'` is the reliable value for autofill-prone
+ * fields like api_key / instance_name / base_url / group_id.
+ */
+ autoComplete?: string;
}
// Component props interface
@@ -613,6 +621,7 @@ export const RenderField = ({
type={field.type}
placeholder={field.placeholder}
disabled={field.disabled}
+ autoComplete={field.autoComplete}
/>
);
diff --git a/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts b/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts
index 281df1e0ff..c64b96ba1b 100644
--- a/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts
+++ b/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts
@@ -32,6 +32,7 @@ export const GenericApiKeyConfig: ProviderConfig = {
required: true,
placeholder: 'instanceNameMessage',
tooltip: 'instanceNameTip',
+ autoComplete: 'new-password',
validation: { message: 'instanceNameMessage' },
},
{
@@ -40,6 +41,7 @@ export const GenericApiKeyConfig: ProviderConfig = {
type: FormFieldType.Password,
required: true,
placeholder: 'apiKeyMessage',
+ autoComplete: 'new-password',
validation: { message: 'apiKeyMessage' },
},
{
@@ -64,6 +66,7 @@ export const GenericApiKeyConfig: ProviderConfig = {
return 'openaiBaseUrlPlaceholder';
},
shouldRender: 'showBaseUrl',
+ autoComplete: 'new-password',
},
{
name: 'group_id',
@@ -71,6 +74,7 @@ export const GenericApiKeyConfig: ProviderConfig = {
type: FormFieldType.Text,
required: false,
shouldRender: 'showGroupId',
+ autoComplete: 'new-password',
},
],
verifyTransform: (values) => ({
diff --git a/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx b/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx
index 0e045bb485..f0e6bae3d8 100644
--- a/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx
+++ b/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx
@@ -209,6 +209,7 @@ export const useProviderFields = ({
value: o.value,
})) as any,
defaultValue: field.defaultValue,
+ autoComplete: field.autoComplete,
validation,
shouldRender: resolveShouldRender(field.shouldRender),
// In viewMode, only the model-related fields are editable.
@@ -245,7 +246,11 @@ export const useProviderFields = ({
placeholder={placeholderText}
/>
) : (
-
+
);
},
};
diff --git a/web/src/pages/user-setting/setting-model/provider-schema/types.ts b/web/src/pages/user-setting/setting-model/provider-schema/types.ts
index 66bcbd485e..fcc65fd1e1 100644
--- a/web/src/pages/user-setting/setting-model/provider-schema/types.ts
+++ b/web/src/pages/user-setting/setting-model/provider-schema/types.ts
@@ -85,6 +85,12 @@ export interface FieldConfig {
options?: SelectOption[];
/** Default value */
defaultValue?: any;
+ /**
+ * HTML `autocomplete` attribute forwarded to the underlying ``.
+ * Use `'new-password'` to suppress browser autofill (Chrome ignores
+ * `'off'` on forms containing a password field).
+ */
+ autoComplete?: string;
/**
* Validation rules.
* `message` is treated as an i18n key by the ProviderModal and translated