agent-Specialization/easyagent/src/tools/web_search.js

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 };