Tavily search web search agent support ()

* support tavily search web search agent

* lint

* remove unneeded comments
This commit is contained in:
Sean Hatfield 2024-10-01 14:52:57 -07:00 committed by GitHub
parent 348d9c8285
commit 5ac6020480
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 108 additions and 0 deletions
frontend/src/pages/Admin/Agents/WebSearchSelection
SearchProviderOptions
icons
index.jsx
server
models
utils
agents/aibitat/plugins
helpers

View file

@ -281,3 +281,38 @@ export function SearXNGOptions({ settings }) {
</div>
);
}
export function TavilySearchOptions({ settings }) {
return (
<>
<p className="text-sm text-white/60 my-2">
You can get an API key{" "}
<a
href="https://tavily.com/"
target="_blank"
rel="noreferrer"
className="text-blue-300 underline"
>
from Tavily.
</a>
</p>
<div className="flex gap-x-4">
<div className="flex flex-col w-60">
<label className="text-white text-sm font-semibold block mb-3">
API Key
</label>
<input
type="password"
name="env::AgentTavilyApiKey"
className="border-none bg-zinc-900 text-white placeholder:text-white/20 text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
placeholder="Tavily API Key"
defaultValue={settings?.AgentTavilyApiKey ? "*".repeat(20) : ""}
required={true}
autoComplete="off"
spellCheck={false}
/>
</div>
</div>
</>
);
}

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500" zoomAndPan="magnify" viewBox="0 0 375 374.999991" height="500" preserveAspectRatio="xMidYMid meet" version="1.0"><defs><clipPath id="d0348dc115"><path d="M 109.378906 231.132812 L 146.484375 231.132812 L 146.484375 268.238281 L 109.378906 268.238281 Z M 109.378906 231.132812 " clip-rule="nonzero"/></clipPath><clipPath id="a28b194a7a"><path d="M 127.933594 231.132812 C 117.6875 231.132812 109.378906 239.4375 109.378906 249.6875 C 109.378906 259.933594 117.6875 268.238281 127.933594 268.238281 C 138.179688 268.238281 146.484375 259.933594 146.484375 249.6875 C 146.484375 239.4375 138.179688 231.132812 127.933594 231.132812 Z M 127.933594 231.132812 " clip-rule="nonzero"/></clipPath></defs><path stroke-linecap="round" transform="matrix(0, -2.578223, 2.578223, 0, 113.745458, 254.140061)" fill="none" stroke-linejoin="miter" d="M 5.499573 5.500038 L 79.114962 5.500038 " stroke="#f25022" stroke-width="11" stroke-opacity="1" stroke-miterlimit="4"/><path stroke-linecap="round" transform="matrix(0, -2.578223, 2.578223, 0, 113.745458, 254.140061)" fill="none" stroke-linejoin="round" d="M 59.865692 -10.999336 L 81.864858 5.500038 L 59.865692 21.999412 " stroke="#f25022" stroke-width="11" stroke-opacity="1" stroke-miterlimit="4"/><path stroke-linecap="round" transform="matrix(2.578223, -0.000251357, 0.000251357, 2.578223, 126.828174, 239.987372)" fill="none" stroke-linejoin="miter" d="M 5.500751 5.50068 L 72.398214 5.499627 " stroke="#ffb901" stroke-width="11" stroke-opacity="1" stroke-miterlimit="4"/><path stroke-linecap="round" transform="matrix(2.578223, -0.000251357, 0.000251357, 2.578223, 126.828174, 239.987372)" fill="none" stroke-linejoin="round" d="M 53.149037 -11.000109 L 75.148109 5.499895 L 53.14885 22.000154 " stroke="#ffb901" stroke-width="11" stroke-opacity="1" stroke-miterlimit="4"/><path stroke-linecap="round" transform="matrix(-1.692446, 1.944957, -1.944957, -1.692446, 134.219043, 258.208373)" fill="none" stroke-linejoin="miter" d="M 4.499518 4.49999 L 38.441562 4.500107 " stroke="#04a3ec" stroke-width="9" stroke-opacity="1" stroke-miterlimit="4"/><path stroke-linecap="round" transform="matrix(-1.692446, 1.944957, -1.944957, -1.692446, 134.219043, 258.208373)" fill="none" stroke-linejoin="round" d="M 22.691248 -9.000192 L 40.69038 4.49943 L 22.68978 17.999994 " stroke="#04a3ec" stroke-width="9" stroke-opacity="1" stroke-miterlimit="4"/><g clip-path="url(#d0348dc115)"><g clip-path="url(#a28b194a7a)"><path fill="#32b37f" d="M 109.378906 231.132812 L 146.484375 231.132812 L 146.484375 268.238281 L 109.378906 268.238281 Z M 109.378906 231.132812 " fill-opacity="1" fill-rule="nonzero"/></g></g></svg>

After

(image error) Size: 2.7 KiB

View file

@ -7,6 +7,7 @@ import SerperDotDevIcon from "./icons/serper.png";
import BingSearchIcon from "./icons/bing.png";
import SerplySearchIcon from "./icons/serply.png";
import SearXNGSearchIcon from "./icons/searxng.png";
import TavilySearchIcon from "./icons/tavily.svg";
import {
CaretUpDown,
MagnifyingGlass,
@ -22,6 +23,7 @@ import {
BingSearchOptions,
SerplySearchOptions,
SearXNGOptions,
TavilySearchOptions,
} from "./SearchProviderOptions";
const SEARCH_PROVIDERS = [
@ -81,6 +83,14 @@ const SEARCH_PROVIDERS = [
description:
"Free, open-source, internet meta-search engine with no tracking.",
},
{
name: "Tavily Search",
value: "tavily-search",
logo: TavilySearchIcon,
options: (settings) => <TavilySearchOptions settings={settings} />,
description:
"Tavily Search API. Offers a free tier with 1000 queries per month.",
},
];
export default function AgentWebSearchSelection({

View file

@ -103,6 +103,7 @@ const SystemSettings = {
"bing-search",
"serply-engine",
"searxng-engine",
"tavily-search",
].includes(update)
)
throw new Error("Invalid SERP provider.");
@ -242,6 +243,7 @@ const SystemSettings = {
AgentBingSearchApiKey: !!process.env.AGENT_BING_SEARCH_API_KEY || null,
AgentSerplyApiKey: !!process.env.AGENT_SERPLY_API_KEY || null,
AgentSearXNGApiUrl: process.env.AGENT_SEARXNG_API_URL || null,
AgentTavilyApiKey: !!process.env.AGENT_TAVILY_API_KEY || null,
};
},

View file

@ -77,6 +77,9 @@ const webBrowsing = {
case "searxng-engine":
engine = "_searXNGEngine";
break;
case "tavily-search":
engine = "_tavilySearch";
break;
default:
engine = "_googleSearchEngine";
}
@ -436,6 +439,59 @@ const webBrowsing = {
});
});
if (data.length === 0)
return `No information was found online for the search query.`;
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
);
return JSON.stringify(data);
},
_tavilySearch: async function (query) {
if (!process.env.AGENT_TAVILY_API_KEY) {
this.super.introspect(
`${this.caller}: I can't use Tavily searching because the user has not defined the required API key.\nVisit: https://tavily.com/ to create the API key.`
);
return `Search is disabled and no content was found. This functionality is disabled because the user has not set it up yet.`;
}
this.super.introspect(
`${this.caller}: Using Tavily to search for "${
query.length > 100 ? `${query.slice(0, 100)}...` : query
}"`
);
const url = "https://api.tavily.com/search";
const { response, error } = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
api_key: process.env.AGENT_TAVILY_API_KEY,
query: query,
}),
})
.then((res) => res.json())
.then((data) => {
return { response: data, error: null };
})
.catch((e) => {
return { response: null, error: e.message };
});
if (error)
return `There was an error searching for content. ${error}`;
const data = [];
response.results?.forEach((searchResult) => {
const { title, url, content } = searchResult;
data.push({
title,
link: url,
snippet: content,
});
});
if (data.length === 0)
return `No information was found online for the search query.`;
this.super.introspect(

View file

@ -469,6 +469,10 @@ const KEY_MAPPING = {
envKey: "AGENT_SEARXNG_API_URL",
checks: [],
},
AgentTavilyApiKey: {
envKey: "AGENT_TAVILY_API_KEY",
checks: [],
},
// TTS/STT Integration ENVS
TextToSpeechProvider: {