feat(webui): add BYOK web search settings

Let WebUI users configure the single web search provider credential from BYOK while keeping saved secrets masked and hot-reloaded for new searches.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Xubin Ren
2026-05-09 14:52:48 +08:00
committed by Xubin Ren
co-authored by Cursor
parent 7c1aa5ae31
commit 56eee06736
19 changed files with 861 additions and 66 deletions
+22 -1
View File
@@ -123,7 +123,28 @@
"hideApiKey": "Hide API key",
"noConfiguredProviders": "No configured providers",
"configureFirst": "Configure a provider in BYOK first.",
"openByok": "Open BYOK"
"openByok": "Open BYOK",
"tabs": {
"ariaLabel": "BYOK credential type",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "Search provider",
"providerHelp": "Choose the backend used by the web search tool.",
"selectProvider": "Select provider",
"credentials": "Credentials",
"noCredentialRequired": "No key required",
"noCredentialHelp": "DuckDuckGo works without a saved API key.",
"apiKeyHelp": "Stored in config and masked after saving.",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG needs the URL of your own instance.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "API key is required for this search provider.",
"baseUrlRequired": "Base URL is required for SearXNG.",
"missingCredential": "Add the required credential before saving.",
"saveHint": "Changes apply to new web search requests."
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "Ocultar API key",
"noConfiguredProviders": "No hay proveedores configurados",
"configureFirst": "Configura primero un proveedor en BYOK.",
"openByok": "Abrir BYOK"
"openByok": "Abrir BYOK",
"tabs": {
"ariaLabel": "Tipo de credencial BYOK",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "Proveedor de búsqueda",
"providerHelp": "Elige el backend que usará la herramienta web search.",
"selectProvider": "Seleccionar proveedor",
"credentials": "Credenciales",
"noCredentialRequired": "No requiere key",
"noCredentialHelp": "DuckDuckGo funciona sin guardar una API key.",
"apiKeyHelp": "Se guarda en config y se muestra enmascarada después de guardar.",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG necesita la URL de tu propia instancia.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "Este proveedor de búsqueda requiere una API key.",
"baseUrlRequired": "SearXNG requiere una Base URL.",
"missingCredential": "Añade la credencial requerida antes de guardar.",
"saveHint": "Los cambios se aplican a nuevas solicitudes de web search."
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "Masquer l'API key",
"noConfiguredProviders": "Aucun fournisseur configuré",
"configureFirst": "Configurez d'abord un fournisseur dans BYOK.",
"openByok": "Ouvrir BYOK"
"openByok": "Ouvrir BYOK",
"tabs": {
"ariaLabel": "Type d'identifiants BYOK",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "Fournisseur de recherche",
"providerHelp": "Choisissez le backend utilisé par l'outil web search.",
"selectProvider": "Choisir un fournisseur",
"credentials": "Identifiants",
"noCredentialRequired": "Aucune key requise",
"noCredentialHelp": "DuckDuckGo fonctionne sans API key enregistrée.",
"apiKeyHelp": "Enregistrée dans la config et masquée après l'enregistrement.",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG nécessite l'URL de votre propre instance.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "Ce fournisseur de recherche nécessite une API key.",
"baseUrlRequired": "SearXNG nécessite une Base URL.",
"missingCredential": "Ajoutez l'identifiant requis avant d'enregistrer.",
"saveHint": "Les changements s'appliquent aux nouvelles requêtes web search."
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "Sembunyikan API key",
"noConfiguredProviders": "Belum ada provider terkonfigurasi",
"configureFirst": "Konfigurasikan provider di BYOK terlebih dahulu.",
"openByok": "Buka BYOK"
"openByok": "Buka BYOK",
"tabs": {
"ariaLabel": "Jenis kredensial BYOK",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "Search provider",
"providerHelp": "Pilih backend yang digunakan alat web search.",
"selectProvider": "Pilih provider",
"credentials": "Kredensial",
"noCredentialRequired": "Tidak perlu key",
"noCredentialHelp": "DuckDuckGo berfungsi tanpa menyimpan API key.",
"apiKeyHelp": "Disimpan di config dan ditampilkan tersamarkan setelah disimpan.",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG memerlukan URL instance Anda sendiri.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "Provider pencarian ini memerlukan API key.",
"baseUrlRequired": "SearXNG memerlukan Base URL.",
"missingCredential": "Tambahkan kredensial yang diperlukan sebelum menyimpan.",
"saveHint": "Perubahan berlaku untuk permintaan web search baru."
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "API key を隠す",
"noConfiguredProviders": "設定済み provider がありません",
"configureFirst": "先に BYOK で provider を設定してください。",
"openByok": "BYOK を開く"
"openByok": "BYOK を開く",
"tabs": {
"ariaLabel": "BYOK 認証情報タイプ",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "検索 provider",
"providerHelp": "web search ツールで使うバックエンドを選択します。",
"selectProvider": "provider を選択",
"credentials": "認証情報",
"noCredentialRequired": "key は不要",
"noCredentialHelp": "DuckDuckGo は API key を保存せずに使えます。",
"apiKeyHelp": "config に保存され、保存後はマスク表示されます。",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG には自分のインスタンス URL が必要です。",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "この検索 provider には API key が必要です。",
"baseUrlRequired": "SearXNG には Base URL が必要です。",
"missingCredential": "保存する前に必要な認証情報を入力してください。",
"saveHint": "変更は新しい web search リクエストに適用されます。"
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "API key 숨기기",
"noConfiguredProviders": "설정된 provider가 없습니다",
"configureFirst": "먼저 BYOK에서 provider를 설정하세요.",
"openByok": "BYOK 열기"
"openByok": "BYOK 열기",
"tabs": {
"ariaLabel": "BYOK 자격 증명 유형",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "검색 provider",
"providerHelp": "web search 도구가 사용할 백엔드를 선택합니다.",
"selectProvider": "provider 선택",
"credentials": "자격 증명",
"noCredentialRequired": "key 필요 없음",
"noCredentialHelp": "DuckDuckGo는 API key를 저장하지 않고 사용할 수 있습니다.",
"apiKeyHelp": "config에 저장되며 저장 후에는 마스킹되어 표시됩니다.",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG에는 자체 인스턴스 URL이 필요합니다.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "이 검색 provider에는 API key가 필요합니다.",
"baseUrlRequired": "SearXNG에는 Base URL이 필요합니다.",
"missingCredential": "저장하기 전에 필요한 자격 증명을 입력하세요.",
"saveHint": "변경 사항은 새 web search 요청에 적용됩니다."
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "Ẩn API key",
"noConfiguredProviders": "Chưa có provider đã cấu hình",
"configureFirst": "Hãy cấu hình provider trong BYOK trước.",
"openByok": "Mở BYOK"
"openByok": "Mở BYOK",
"tabs": {
"ariaLabel": "Loại thông tin xác thực BYOK",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "Search provider",
"providerHelp": "Chọn backend mà công cụ web search sẽ dùng.",
"selectProvider": "Chọn provider",
"credentials": "Thông tin xác thực",
"noCredentialRequired": "Không cần key",
"noCredentialHelp": "DuckDuckGo hoạt động mà không cần lưu API key.",
"apiKeyHelp": "Được lưu trong config và chỉ hiện dạng che sau khi lưu.",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG cần URL instance của bạn.",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "Provider tìm kiếm này cần API key.",
"baseUrlRequired": "SearXNG cần Base URL.",
"missingCredential": "Thêm thông tin bắt buộc trước khi lưu.",
"saveHint": "Thay đổi áp dụng cho các yêu cầu web search mới."
}
}
},
"chat": {
+22 -1
View File
@@ -111,7 +111,28 @@
"hideApiKey": "隐藏 API key",
"noConfiguredProviders": "没有已配置的 provider",
"configureFirst": "请先在 BYOK 里配置 provider。",
"openByok": "打开 BYOK"
"openByok": "打开 BYOK",
"tabs": {
"ariaLabel": "BYOK 凭证类型",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "搜索 provider",
"providerHelp": "选择 web search 工具使用的后端。",
"selectProvider": "选择 provider",
"credentials": "凭证",
"noCredentialRequired": "无需 key",
"noCredentialHelp": "DuckDuckGo 不需要保存 API key。",
"apiKeyHelp": "保存到 config 后只显示掩码提示。",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG 需要你自己的实例地址。",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "这个搜索 provider 需要 API key。",
"baseUrlRequired": "SearXNG 需要 Base URL。",
"missingCredential": "填写所需凭证后才能保存。",
"saveHint": "改动会应用到新的 web search 请求。"
}
}
},
"chat": {
+22 -1
View File
@@ -104,7 +104,28 @@
"hideApiKey": "隱藏 API key",
"noConfiguredProviders": "沒有已設定的 provider",
"configureFirst": "請先在 BYOK 設定 provider。",
"openByok": "開啟 BYOK"
"openByok": "開啟 BYOK",
"tabs": {
"ariaLabel": "BYOK 憑證類型",
"llm": "LLM",
"webSearch": "Web Search"
},
"webSearch": {
"provider": "搜尋 provider",
"providerHelp": "選擇 web search 工具使用的後端。",
"selectProvider": "選擇 provider",
"credentials": "憑證",
"noCredentialRequired": "不需要 key",
"noCredentialHelp": "DuckDuckGo 不需要儲存 API key。",
"apiKeyHelp": "儲存到 config 後只顯示遮罩提示。",
"baseUrl": "Base URL",
"baseUrlHelp": "SearXNG 需要你自己的實例網址。",
"baseUrlPlaceholder": "https://search.example.com",
"apiKeyRequired": "此搜尋 provider 需要 API key。",
"baseUrlRequired": "SearXNG 需要 Base URL。",
"missingCredential": "填寫必要憑證後才能儲存。",
"saveHint": "變更會套用到新的 web search 請求。"
}
}
},
"chat": {