From a62225af4acaac5de22e47e00459df589704feea Mon Sep 17 00:00:00 2001 From: Tavily PR Agent Date: Fri, 15 May 2026 15:14:09 +0000 Subject: [PATCH 1/2] feat: add Tavily as configurable search provider in frontend UI --- client/src/components/SettingsView.tsx | 15 +++++++++++++++ client/src/components/SetupWizard.tsx | 1 + 2 files changed, 16 insertions(+) diff --git a/client/src/components/SettingsView.tsx b/client/src/components/SettingsView.tsx index 56488c8..efd6d9c 100644 --- a/client/src/components/SettingsView.tsx +++ b/client/src/components/SettingsView.tsx @@ -51,6 +51,7 @@ export function SettingsView() { const [preferredSearch, setPreferredSearch] = useState('auto'); const [searxngEndpoint, setSearxngEndpoint] = useState('http://localhost:8888/search'); const [braveApiKey, setBraveApiKey] = useState(''); + const [tavilyApiKey, setTavilyApiKey] = useState(''); const [savingSearch, setSavingSearch] = useState(false); const [searchTestResult, setSearchTestResult] = useState(null); @@ -291,6 +292,7 @@ export function SettingsView() { preferred_provider: preferredSearch, searxng_endpoint: searxngEndpoint, brave_api_key: braveApiKey || undefined, + tavily_api_key: tavilyApiKey || undefined, }), }); await fetchSearchProviders(); @@ -673,6 +675,7 @@ export function SettingsView() { +
@@ -695,6 +698,18 @@ export function SettingsView() { onChange={e => setBraveApiKey(e.target.value)} />
+
+ + setTavilyApiKey(e.target.value)} + /> +

+ Get a key at app.tavily.com +

+
{/* Actions */} diff --git a/client/src/components/SetupWizard.tsx b/client/src/components/SetupWizard.tsx index e4d8b9c..62057b5 100644 --- a/client/src/components/SetupWizard.tsx +++ b/client/src/components/SetupWizard.tsx @@ -42,6 +42,7 @@ const INTEGRATIONS = [ { id: 'github', label: 'GitHub', description: 'Create PRs, issues, and manage repos.', keyLabel: 'Personal Access Token', keyHint: 'ghp_...' }, { id: 'notion', label: 'Notion', description: 'Create pages, update databases, search notes.', keyLabel: 'API Key', keyHint: 'secret_...' }, { id: 'brave', label: 'Brave Search', description: 'High-quality web search API.', keyLabel: 'API Key', keyHint: 'BSA...' }, + { id: 'tavily', label: 'Tavily Search', description: 'AI-optimised web search API (optional).', keyLabel: 'API Key', keyHint: 'tvly-...' }, ]; // ─── Helpers ─────────────────────────────────────────────────────────────────── From f4ed38cdc3e5840407c6a9ebc59dc55183e8bd5b Mon Sep 17 00:00:00 2001 From: Tavily PR Agent Date: Fri, 15 May 2026 15:16:01 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20address=20review=20feedback=20(attem?= =?UTF-8?q?pt=202)=20=E2=80=94=20Expose=20Tavily=20as=20a=20configurable?= =?UTF-8?q?=20search=20provider=20in=20the=20frontend=20settings=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/routes/setupRoutes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/routes/setupRoutes.ts b/server/src/routes/setupRoutes.ts index c92e80d..ea39011 100644 --- a/server/src/routes/setupRoutes.ts +++ b/server/src/routes/setupRoutes.ts @@ -211,6 +211,7 @@ router.post('/complete', async (req: Request, res: Response) => { github: 'GITHUB_TOKEN', notion: 'NOTION_API_KEY', brave: 'BRAVE_API_KEY', + tavily: 'TAVILY_API_KEY', serpapi: 'SERPAPI_API_KEY', }; for (const [service, val] of Object.entries(integrations)) {