Files
2026-07-13 13:34:48 +08:00

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
},
})