75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
async function webSearchTool(config, args, abortSignal) {
|
|
if (abortSignal && abortSignal.aborted) {
|
|
return { success: false, error: '任务被用户取消', cancelled: true };
|
|
}
|
|
const body = {
|
|
api_key: config.tavily_api_key,
|
|
query: args.query,
|
|
};
|
|
if (args.max_results) body.max_results = args.max_results;
|
|
if (args.topic) body.topic = args.topic;
|
|
if (args.time_range) body.time_range = args.time_range;
|
|
if (args.days) body.days = args.days;
|
|
if (args.start_date) body.start_date = args.start_date;
|
|
if (args.end_date) body.end_date = args.end_date;
|
|
if (args.country) body.country = args.country;
|
|
|
|
try {
|
|
const res = await fetch('https://api.tavily.com/search', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(body),
|
|
signal: abortSignal,
|
|
});
|
|
const json = await res.json();
|
|
if (!res.ok) {
|
|
return { success: false, error: json.error || JSON.stringify(json) };
|
|
}
|
|
return { success: true, ...json, query: args.query, searched_at: new Date().toISOString() };
|
|
} catch (err) {
|
|
if (err && err.name === 'AbortError') {
|
|
return { success: false, error: '任务被用户取消', cancelled: true };
|
|
}
|
|
return { success: false, error: err.message || String(err) };
|
|
}
|
|
}
|
|
|
|
async function extractWebpageTool(config, args, savePath, abortSignal) {
|
|
if (abortSignal && abortSignal.aborted) {
|
|
return { success: false, error: '任务被用户取消', cancelled: true };
|
|
}
|
|
const body = {
|
|
api_key: config.tavily_api_key,
|
|
urls: [args.url],
|
|
include_images: false,
|
|
};
|
|
try {
|
|
const res = await fetch('https://api.tavily.com/extract', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(body),
|
|
signal: abortSignal,
|
|
});
|
|
const json = await res.json();
|
|
if (!res.ok) {
|
|
return { success: false, error: json.error || JSON.stringify(json) };
|
|
}
|
|
const content = (json.results && json.results[0] && json.results[0].content) || '';
|
|
if (args.mode === 'save') {
|
|
const fs = require('fs');
|
|
fs.writeFileSync(savePath, content, 'utf8');
|
|
return { success: true, saved_path: savePath, content, chars: content.length, bytes: Buffer.byteLength(content) };
|
|
}
|
|
return { success: true, content, url: args.url };
|
|
} catch (err) {
|
|
if (err && err.name === 'AbortError') {
|
|
return { success: false, error: '任务被用户取消', cancelled: true };
|
|
}
|
|
return { success: false, error: err.message || String(err) };
|
|
}
|
|
}
|
|
|
|
module.exports = { webSearchTool, extractWebpageTool };
|