@tavily/core
Version:
Official JavaScript library for Tavily.
541 lines (534 loc) • 16.4 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __objRest = (source, exclude) => {
var target = {};
for (var prop in source)
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
target[prop] = source[prop];
if (source != null && __getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(source)) {
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
target[prop] = source[prop];
}
return target;
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/search.ts
import { AxiosError } from "axios";
// src/utils.ts
import axios from "axios";
import { encodingForModel } from "js-tiktoken";
import { HttpsProxyAgent } from "https-proxy-agent";
var BASE_URL = "https://api.tavily.com";
var DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo";
var DEFAULT_MAX_TOKENS = 4e3;
function post(endpoint, body, apiKey, proxies, timeout = 60) {
return __async(this, null, function* () {
const url = `${BASE_URL}/${endpoint}`;
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
"X-Client-Source": "tavily-js"
};
const timeoutInMillis = timeout * 1e3;
const config = { headers, timeout: timeoutInMillis };
if (proxies) {
if (proxies.http) {
config.httpAgent = new HttpsProxyAgent(proxies.http);
}
if (proxies.https) {
config.httpsAgent = new HttpsProxyAgent(proxies.https);
}
}
return axios.post(url, body, config);
});
}
function getTotalTokensFromString(str, encodingName = DEFAULT_MODEL_ENCODING) {
const encoding = encodingForModel(encodingName);
return encoding.encode(str).length;
}
function getMaxTokensFromList(data, maxTokens = DEFAULT_MAX_TOKENS) {
var result = [];
let currentTokens = 0;
for (let item of data) {
let itemString = JSON.stringify(item);
let newTotalTokens = currentTokens + getTotalTokensFromString(itemString);
if (newTotalTokens > maxTokens) {
break;
}
result.push(item);
currentTokens = newTotalTokens;
}
return JSON.stringify(result);
}
function handleRequestError(res) {
var _a, _b, _c, _d;
const status = res.status;
const message = (_b = (_a = res.data) == null ? void 0 : _a.detail) == null ? void 0 : _b.error;
if (!message) {
throw new Error(`${status} Error: ${JSON.stringify(res.data)}`);
}
throw new Error(`${(_d = (_c = res.data) == null ? void 0 : _c.detail) == null ? void 0 : _d.error}`);
}
function handleTimeoutError(timeout) {
throw new Error(`Request timed out after ${timeout} seconds.`);
}
// src/search.ts
function _search(apiKey, proxies) {
return function search(_0) {
return __async(this, arguments, function* (query, options = {}) {
const _a = options, {
searchDepth,
topic,
days,
maxResults,
includeImages,
includeImageDescriptions,
includeAnswer,
includeRawContent,
includeDomains,
excludeDomains,
timeRange,
chunksPerSource,
country,
timeout
} = _a, kwargs = __objRest(_a, [
"searchDepth",
"topic",
"days",
"maxResults",
"includeImages",
"includeImageDescriptions",
"includeAnswer",
"includeRawContent",
"includeDomains",
"excludeDomains",
"timeRange",
"chunksPerSource",
"country",
"timeout"
]);
const requestTimeout = timeout ? Math.min(timeout, 120) : 60;
try {
const response = yield post(
"search",
__spreadValues({
query,
search_depth: searchDepth,
topic,
days,
max_results: maxResults,
include_images: includeImages,
include_image_descriptions: includeImageDescriptions,
include_answer: includeAnswer,
include_raw_content: includeRawContent,
include_domains: includeDomains,
exclude_domains: excludeDomains,
time_range: timeRange,
chunks_per_source: chunksPerSource,
country
}, kwargs),
apiKey,
proxies,
requestTimeout
);
return {
query,
responseTime: response.data.response_time,
images: response.data.images.map((image) => {
return {
url: (image == null ? void 0 : image.url) || image,
description: image.description
};
}),
results: response.data.results.map((result) => {
return {
title: result.title,
url: result.url,
content: result.content,
rawContent: result.raw_content,
score: result.score,
publishedDate: result.published_date
};
}),
answer: response.data.answer
};
} catch (err) {
if (err instanceof AxiosError) {
if (err.code === "ECONNABORTED") {
handleTimeoutError(requestTimeout);
}
if (err.response) {
handleRequestError(err.response);
}
}
throw new Error(
`An unexpected error occurred while making the request. Error: ${err}`
);
}
});
};
}
function _searchQNA(apiKey, proxies) {
return function searchQNA(_0) {
return __async(this, arguments, function* (query, options = {}) {
var _a;
const requestTimeout = (options == null ? void 0 : options.timeout) ? Math.min(options.timeout, 120) : 60;
try {
const response = yield post(
"search",
{
query,
search_depth: (_a = options.searchDepth) != null ? _a : "advanced",
topic: options.topic,
days: options.days,
max_results: options.maxResults,
include_answer: true,
include_domains: options.includeDomains,
exclude_domains: options.excludeDomains,
chunks_per_source: options.chunksPerSource
},
apiKey,
proxies,
requestTimeout
);
const answer = response.data.answer;
return answer;
} catch (err) {
if (err instanceof AxiosError) {
if (err.code === "ECONNABORTED") {
handleTimeoutError(requestTimeout);
}
if (err.response) {
handleRequestError(err.response);
}
}
throw new Error(
`An unexpected error occurred while making the request. Error: ${err}`
);
}
});
};
}
function _searchContext(apiKey, proxies) {
return function searchContext(_0) {
return __async(this, arguments, function* (query, options = {}) {
var _a, _b;
const timeout = (options == null ? void 0 : options.timeout) ? Math.min(options.timeout, 120) : 60;
try {
const response = yield post(
"search",
{
query,
search_depth: options.searchDepth,
topic: options.topic,
days: options.days,
max_results: options.maxResults,
include_domains: options.includeDomains,
exclude_domains: options.excludeDomains,
chunks_per_source: options.chunksPerSource
},
apiKey,
proxies,
timeout
);
const sources = ((_a = response.data) == null ? void 0 : _a.results) || [];
const context = sources.map((source) => {
return {
url: source.url,
content: source.content
};
});
return JSON.stringify(
getMaxTokensFromList(context, (_b = options.maxTokens) != null ? _b : DEFAULT_MAX_TOKENS)
);
} catch (err) {
if (err instanceof AxiosError) {
if (err.code === "ECONNABORTED") {
handleTimeoutError(timeout);
}
if (err.response) {
handleRequestError(err.response);
}
}
throw new Error(
`An unexpected error occurred while making the request. Error: ${err}`
);
}
});
};
}
// src/extract.ts
import { AxiosError as AxiosError2 } from "axios";
function _extract(apiKey, proxies) {
return function extract(_0) {
return __async(this, arguments, function* (urls, options = {}) {
const _a = options, { includeImages, extractDepth, format, timeout } = _a, kwargs = __objRest(_a, ["includeImages", "extractDepth", "format", "timeout"]);
const requestTimeout = timeout ? Math.min(timeout, 120) : 60;
try {
const response = yield post(
"extract",
__spreadValues({
urls,
include_images: includeImages,
extract_depth: extractDepth,
format
}, kwargs),
apiKey,
proxies,
requestTimeout
);
return {
responseTime: response.data.response_time,
results: response.data.results.map((result) => {
return {
url: result.url,
rawContent: result.raw_content,
images: result.images
};
}),
failedResults: response.data.failed_results.map((result) => {
return {
url: result.url,
error: result.error
};
})
};
} catch (err) {
if (err instanceof AxiosError2) {
if (err.code === "ECONNABORTED") {
handleTimeoutError(requestTimeout);
}
if (err.response) {
handleRequestError(err.response);
}
}
throw new Error(
`An unexpected error occurred while making the request. Error: ${err}`
);
}
});
};
}
// src/crawl.ts
import { AxiosError as AxiosError3 } from "axios";
function _crawl(apiKey, proxies) {
return function crawl(_0) {
return __async(this, arguments, function* (url, options = {}) {
const _a = options, {
maxDepth,
maxBreadth,
limit,
extractDepth,
selectPaths,
selectDomains,
excludePaths,
excludeDomains,
allowExternal,
includeImages,
categories,
instructions,
format,
timeout
} = _a, kwargs = __objRest(_a, [
"maxDepth",
"maxBreadth",
"limit",
"extractDepth",
"selectPaths",
"selectDomains",
"excludePaths",
"excludeDomains",
"allowExternal",
"includeImages",
"categories",
"instructions",
"format",
"timeout"
]);
const requestTimeout = timeout ? Math.min(timeout, 120) : 60;
try {
const response = yield post(
"crawl",
__spreadValues({
url,
max_depth: maxDepth,
max_breadth: maxBreadth,
limit,
extract_depth: extractDepth,
select_paths: selectPaths,
select_domains: selectDomains,
exclude_paths: excludePaths,
exclude_domains: excludeDomains,
allow_external: allowExternal,
include_images: includeImages,
categories,
instructions,
format
}, kwargs),
apiKey,
proxies,
requestTimeout
);
return {
responseTime: response.data.response_time,
baseUrl: response.data.base_url,
results: response.data.results.map((item) => {
return {
url: item.url,
rawContent: item.raw_content,
images: item.images
};
})
};
} catch (err) {
if (err instanceof AxiosError3) {
if (err.code === "ECONNABORTED") {
handleTimeoutError(requestTimeout);
}
if (err.response) {
handleRequestError(err.response);
}
}
throw new Error(
`An unexpected error occurred while making the request. Error: ${err}`
);
}
});
};
}
// src/map.ts
import { AxiosError as AxiosError4 } from "axios";
function _map(apiKey, proxies) {
return function map(_0) {
return __async(this, arguments, function* (url, options = {}) {
const _a = options, {
maxDepth,
maxBreadth,
limit,
selectPaths,
selectDomains,
excludePaths,
excludeDomains,
allowExternal,
categories,
instructions,
timeout
} = _a, kwargs = __objRest(_a, [
"maxDepth",
"maxBreadth",
"limit",
"selectPaths",
"selectDomains",
"excludePaths",
"excludeDomains",
"allowExternal",
"categories",
"instructions",
"timeout"
]);
const requestTimeout = timeout ? Math.min(timeout, 120) : 60;
try {
const response = yield post(
"map",
__spreadValues({
url,
max_depth: maxDepth,
max_breadth: maxBreadth,
limit,
select_paths: selectPaths,
select_domains: selectDomains,
exclude_paths: excludePaths,
exclude_domains: excludeDomains,
allow_external: allowExternal,
categories,
instructions
}, kwargs),
apiKey,
proxies,
requestTimeout
);
return {
responseTime: response.data.response_time,
baseUrl: response.data.base_url,
results: response.data.results
};
} catch (err) {
if (err instanceof AxiosError4) {
if (err.code === "ECONNABORTED") {
handleTimeoutError(requestTimeout);
}
if (err.response) {
handleRequestError(err.response);
}
}
throw new Error(
`An unexpected error occurred while making the request. Error: ${err}`
);
}
});
};
}
// src/client.ts
function tavily(options) {
const apiKey = (options == null ? void 0 : options.apiKey) || process.env.TAVILY_API_KEY;
const proxies = (() => {
var _a, _b;
const http = ((_a = options == null ? void 0 : options.proxies) == null ? void 0 : _a.http) || process.env.TAVILY_HTTP_PROXY;
const https = ((_b = options == null ? void 0 : options.proxies) == null ? void 0 : _b.https) || process.env.TAVILY_HTTPS_PROXY;
const result = {};
if (http) result.http = http;
if (https) result.https = https;
return Object.keys(result).length > 0 ? result : void 0;
})();
if (!apiKey) {
throw new Error(
"No API key provided. Please provide the api_key attribute or set the TAVILY_API_KEY environment variable."
);
}
return {
search: _search(apiKey, proxies),
extract: _extract(apiKey, proxies),
searchQNA: _searchQNA(apiKey, proxies),
searchContext: _searchContext(apiKey, proxies),
crawl: _crawl(apiKey, proxies),
map: _map(apiKey, proxies)
};
}
export {
tavily
};
//# sourceMappingURL=index.mjs.map