From 8fd59e89de63dfb8e70649c095babd2e4fb7aeb8 Mon Sep 17 00:00:00 2001 From: SuYao Date: Tue, 8 Jul 2025 17:11:43 +0800 Subject: [PATCH] feat: provider custom header (#7874) * feat: provider custom header * fix: state update dependency * refactor: migrate to code editor onBlur * fix: lint * fix: migrate --- .../ProviderSettings/ProviderSetting.tsx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx b/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx index 4f693aaacb..da28985c0c 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ProviderSetting.tsx @@ -1,6 +1,7 @@ import { CheckOutlined, CloseCircleFilled, LoadingOutlined } from '@ant-design/icons' import { isOpenAIProvider } from '@renderer/aiCore/clients/ApiClientFactory' import OpenAIAlert from '@renderer/components/Alert/OpenAIAlert' +import CodeEditor from '@renderer/components/CodeEditor' import { StreamlineGoodHealthAndWellBeing } from '@renderer/components/Icons/SVGIcon' import { HStack } from '@renderer/components/Layout' import { ApiKeyConnectivity, ApiKeyListPopup } from '@renderer/components/Popups/ApiKeyListPopup' @@ -79,6 +80,8 @@ const ProviderSetting: FC = ({ providerId }) => { checking: false }) + const [headerText, setHeaderText] = useState(JSON.stringify(provider.extra_headers || {}, null, 2)) + // eslint-disable-next-line react-hooks/exhaustive-deps const debouncedUpdateApiKey = useCallback( debounce((value) => { @@ -308,6 +311,16 @@ const ProviderSetting: FC = ({ providerId }) => { setApiHost(provider.apiHost) }, [provider.apiHost, provider.id]) + const onUpdateHeaders = useCallback(() => { + try { + const headers = headerText.trim() ? JSON.parse(headerText) : {} + updateProvider({ ...provider, extra_headers: headers }) + window.message.success({ content: t('message.save.success.title') }) + } catch (error) { + window.message.error({ content: t('settings.provider.copilot.invalid_json') }) + } + }, [headerText, provider, updateProvider, t]) + return ( @@ -424,6 +437,32 @@ const ProviderSetting: FC = ({ providerId }) => { )} )} + {provider.id !== 'copilot' && ( + <> + + {t('settings.provider.copilot.custom_headers')} + + + {t('settings.provider.copilot.headers_description')} + setHeaderText(value)} + onBlur={onUpdateHeaders} + placeholder={`{\n "Header-Name": "Header-Value"\n}`} + options={{ + lint: true, + collapsible: false, + wrappable: true, + lineNumbers: true, + foldGutter: true, + highlightActiveLine: true, + keymap: true + }} + /> + + + )} )} {isAzureOpenAI && (