103 lines
3.6 KiB
TypeScript
103 lines
3.6 KiB
TypeScript
import { type Client } from '@botpress/client'
|
|
import { z } from '@bpinternal/zui'
|
|
import { Tool } from 'llmz'
|
|
|
|
/** Search information on the web. You need to browse to that page to get the full content of the page. */
|
|
export const webSearch = (client: Client) =>
|
|
new Tool({
|
|
name: 'browser_webSearch',
|
|
description: 'Search information on the web. You need to browse to that page to get the full content of the page.',
|
|
input: z
|
|
.object({
|
|
query: z.string().min(1, undefined).max(1000, undefined).describe('What are we searching for?'),
|
|
includeSites: z
|
|
.optional(
|
|
z
|
|
.array(
|
|
z
|
|
.string()
|
|
.regex(/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/, undefined)
|
|
.min(3, undefined)
|
|
.max(50, undefined)
|
|
)
|
|
.max(20, undefined)
|
|
.describe('Include only these domains in the search (max 20)')
|
|
)
|
|
.describe('Include only these domains in the search (max 20)'),
|
|
excludeSites: z
|
|
.optional(
|
|
z
|
|
.array(
|
|
z
|
|
.string()
|
|
.regex(/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/, undefined)
|
|
.min(3, undefined)
|
|
.max(50, undefined)
|
|
)
|
|
.max(20, undefined)
|
|
.describe('Exclude these domains from the search (max 20)')
|
|
)
|
|
.describe('Exclude these domains from the search (max 20)'),
|
|
count: z
|
|
.default(
|
|
z
|
|
.number()
|
|
.min(1, undefined)
|
|
.max(20, undefined)
|
|
.describe('Number of search results to return (default: 10)'),
|
|
10
|
|
)
|
|
.describe('Number of search results to return (default: 10)'),
|
|
freshness: z
|
|
.optional(z.enum(['Day', 'Week', 'Month']).describe('Only consider results from the last day, week or month'))
|
|
.describe('Only consider results from the last day, week or month'),
|
|
browsePages: z
|
|
|
|
.boolean()
|
|
// .default(false)
|
|
.describe('Whether to browse to the pages to get the full content'),
|
|
})
|
|
.catchall(z.never()),
|
|
output: z
|
|
.object({
|
|
results: z.array(
|
|
z
|
|
.object({
|
|
name: z.string().describe('Title of the page'),
|
|
url: z.string().describe('URL of the page'),
|
|
snippet: z.string().describe('A short summary of the page'),
|
|
links: z
|
|
.optional(
|
|
z
|
|
.array(
|
|
z
|
|
.object({
|
|
name: z.string(),
|
|
url: z.string(),
|
|
})
|
|
.catchall(z.never())
|
|
)
|
|
.describe('Useful links on the page')
|
|
)
|
|
.describe('Useful links on the page'),
|
|
page: z.optional(
|
|
z
|
|
.object({
|
|
url: z.string(),
|
|
content: z.string(),
|
|
favicon: z.optional(z.string()),
|
|
title: z.optional(z.string()),
|
|
description: z.optional(z.string()),
|
|
})
|
|
.catchall(z.never())
|
|
),
|
|
})
|
|
.catchall(z.never())
|
|
),
|
|
})
|
|
.catchall(z.never()),
|
|
handler: async (input) => {
|
|
return client.callAction({ type: 'browser:webSearch', input }).then(({ output }) => output) as any
|
|
},
|
|
})
|