90 lines
8.0 KiB
JavaScript
90 lines
8.0 KiB
JavaScript
import { isArray } from '@polymech/core/primitives';
|
|
import { CONFIG_DEFAULT } from '@polymech/commons';
|
|
import { toolLogger } from '../../index.js';
|
|
export const tools = (target, options) => {
|
|
const logger = toolLogger('search', options);
|
|
return [
|
|
{
|
|
type: 'function',
|
|
function: {
|
|
name: 'google',
|
|
description: 'Searches Google for the given query',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
query: { type: 'string' }
|
|
},
|
|
required: ['query']
|
|
},
|
|
function: async (params) => {
|
|
const { query } = params;
|
|
const config = CONFIG_DEFAULT();
|
|
let apiKey = config?.google?.api_key;
|
|
let cse = config?.google?.cse;
|
|
if (!config || !apiKey || !cse) {
|
|
logger.debug("Config not found in $HOME/.osr/config.json. " +
|
|
"Optionally, export OSR_CONFIG with the path to the configuration file " +
|
|
"");
|
|
return undefined;
|
|
}
|
|
const res = await fetch(`https://www.googleapis.com/customsearch/v1?key=${apiKey}&cx=${cse}&q=${encodeURIComponent(query)}`);
|
|
const data = await res.json();
|
|
let results = data.items?.map((item) => ({
|
|
title: item.title,
|
|
link: item.link,
|
|
snippet: item.snippet,
|
|
...item
|
|
})) ?? [];
|
|
return JSON.stringify(results);
|
|
},
|
|
parse: JSON.parse
|
|
}
|
|
},
|
|
{
|
|
type: 'function',
|
|
function: {
|
|
name: 'serpapi',
|
|
description: 'Searches Serpapi (finds locations (engine:google_local), places on the map (engine:google_maps) ) for the given query',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
query: { type: 'string' },
|
|
engine: { type: 'string', default: 'google' },
|
|
},
|
|
required: ['query']
|
|
},
|
|
function: async (params) => {
|
|
const { query, engine } = params;
|
|
const config = CONFIG_DEFAULT();
|
|
let apiKey = config?.serpapi?.key || config?.serpapi?.api_key;
|
|
if (!config || !apiKey) {
|
|
logger.debug("Config not found in $HOME/.osr/config.json. " +
|
|
"Optionally, export OSR_CONFIG with the path to the configuration file " +
|
|
"");
|
|
return undefined;
|
|
}
|
|
const url = `https://serpapi.com/search?api_key=${apiKey}&engine=${engine || 'google'}&q=${encodeURIComponent(query)}&google_domain=google.com`;
|
|
const res = await fetch(url);
|
|
logger.debug(`Searching ${url}`);
|
|
if (!res.ok) {
|
|
throw new Error(`HTTP error! status: ${res.status}`);
|
|
}
|
|
const data = await res.json();
|
|
let items = data.organic_results || data.local_results || data.place_results || data.places || data.maps_results || [];
|
|
if (items && !isArray(items)) {
|
|
items = [items];
|
|
}
|
|
let results = items.map((item) => ({
|
|
title: item.title,
|
|
link: item.link,
|
|
snippet: item.snippet,
|
|
...item
|
|
})) ?? [];
|
|
return JSON.stringify(results);
|
|
},
|
|
parse: JSON.parse
|
|
}
|
|
}
|
|
];
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90b29scy9zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHM0MsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBYyxFQUFFLE9BQWtCLEVBQWMsRUFBRTtJQUNwRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzVDLE9BQU87UUFDSDtZQUNJLElBQUksRUFBRSxVQUFVO1lBQ2hCLFFBQVEsRUFBRTtnQkFDTixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUscUNBQXFDO2dCQUNsRCxVQUFVLEVBQUU7b0JBQ1IsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsVUFBVSxFQUFFO3dCQUNSLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7cUJBQzVCO29CQUNELFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDdEI7Z0JBQ0QsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFXLEVBQUUsRUFBRTtvQkFDNUIsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQTtvQkFDeEIsTUFBTSxNQUFNLEdBQUcsY0FBYyxFQUFTLENBQUE7b0JBQ3RDLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFBO29CQUNwQyxJQUFJLEdBQUcsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQTtvQkFDN0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDNUIsTUFBTSxDQUFDLEtB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
|