From 88d5e27fe8f2211ef2b4222b4e4f4d13ee7f445b Mon Sep 17 00:00:00 2001 From: Garfield Dai Date: Mon, 15 Sep 2025 14:49:23 +0800 Subject: [PATCH] Release/e-1.8.1 (#25613) Co-authored-by: zxhlyh Co-authored-by: GareArc Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: hjlarry --- ...dd_credential_status_for_provider_table.py | 33 +++++++++++++++ .../enterprise/plugin_manager_service.py | 6 +-- .../model-auth/authorized/credential-item.tsx | 6 +-- .../switch-credential-in-load-balancing.tsx | 41 +++++++++++-------- .../model-provider-page/model-modal/index.tsx | 8 ++-- .../plugin-auth/authorized-in-node.tsx | 20 ++++++++- .../plugins/plugin-auth/authorized/index.tsx | 3 +- web/hooks/use-document-title.ts | 20 +++++++++ web/i18n/en-US/plugin.ts | 1 + web/i18n/zh-Hans/plugin.ts | 1 + 10 files changed, 109 insertions(+), 30 deletions(-) create mode 100644 api/migrations/versions/2025_09_11_1537-cf7c38a32b2d_add_credential_status_for_provider_table.py diff --git a/api/migrations/versions/2025_09_11_1537-cf7c38a32b2d_add_credential_status_for_provider_table.py b/api/migrations/versions/2025_09_11_1537-cf7c38a32b2d_add_credential_status_for_provider_table.py new file mode 100644 index 0000000000..17467e6495 --- /dev/null +++ b/api/migrations/versions/2025_09_11_1537-cf7c38a32b2d_add_credential_status_for_provider_table.py @@ -0,0 +1,33 @@ +"""Add credential status for provider table + +Revision ID: cf7c38a32b2d +Revises: c20211f18133 +Create Date: 2025-09-11 15:37:17.771298 + +""" +from alembic import op +import models as models +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'cf7c38a32b2d' +down_revision = 'c20211f18133' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('providers', schema=None) as batch_op: + batch_op.add_column(sa.Column('credential_status', sa.String(length=20), server_default=sa.text("'active'::character varying"), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('providers', schema=None) as batch_op: + batch_op.drop_column('credential_status') + + # ### end Alembic commands ### \ No newline at end of file diff --git a/api/services/enterprise/plugin_manager_service.py b/api/services/enterprise/plugin_manager_service.py index ee8a932ded..1065d3842a 100644 --- a/api/services/enterprise/plugin_manager_service.py +++ b/api/services/enterprise/plugin_manager_service.py @@ -9,9 +9,9 @@ from services.errors.base import BaseServiceError logger = logging.getLogger(__name__) -class PluginCredentialType(enum.IntEnum): - MODEL = enum.auto() - TOOL = enum.auto() +class PluginCredentialType(enum.Enum): + MODEL = 0 # must be 0 for API contract compatibility + TOOL = 1 # must be 1 for API contract compatibility def to_number(self): return self.value diff --git a/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/credential-item.tsx b/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/credential-item.tsx index 2d792d1705..0aa4ac6fbc 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/credential-item.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-auth/authorized/credential-item.tsx @@ -92,10 +92,10 @@ const CredentialItem = ({ ) } { - showAction && ( + showAction && !credential.from_enterprise && (
{ - !disableEdit && !credential.not_allowed_to_use && !credential.from_enterprise && ( + !disableEdit && !credential.not_allowed_to_use && ( { const { t } = useTranslation() - + const notAllowCustomCredential = provider.allow_custom_token === false const handleItemClick = useCallback((credential: Credential) => { setCustomModelCredential(credential) }, [setCustomModelCredential]) const renderTrigger = useCallback(() => { const selectedCredentialId = customModelCredential?.credential_id - const authRemoved = !selectedCredentialId && !!credentials?.length + const currentCredential = credentials?.find(c => c.credential_id === selectedCredentialId) + const empty = !credentials?.length + const authRemoved = selectedCredentialId && !currentCredential && !empty + const unavailable = currentCredential?.not_allowed_to_use + let color = 'green' - if (authRemoved && !customModelCredential?.not_allowed_to_use) + if (authRemoved || unavailable) color = 'red' - if (customModelCredential?.not_allowed_to_use) - color = 'gray' const Item = ( ) - if (customModelCredential?.not_allowed_to_use) { + if (empty && notAllowCustomCredential) { return ( ) } diff --git a/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx b/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx index 4ffbc8f191..9916fbbf04 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-modal/index.tsx @@ -114,7 +114,7 @@ const ModelModal: FC = ({ const formRef1 = useRef(null) const [selectedCredential, setSelectedCredential] = useState() const formRef2 = useRef(null) - const isEditMode = !!Object.keys(formValues).filter((key) => { + const isEditMode = !!credential && !!Object.keys(formSchemasValue || {}).filter((key) => { return key !== '__model_name' && key !== '__model_type' && !!formValues[key] }).length && isCurrentWorkspaceManager @@ -376,16 +376,16 @@ const ModelModal: FC = ({ !provider.help.url && e.preventDefault()} > {provider.help.title?.[language] || provider.help.url[language] || provider.help.title?.en_US || provider.help.url.en_US} - + ) :
} -
+
{ isEditMode && (