{"version":3,"file":"ai.mjs","names":[],"sources":["../src/ai.ts"],"sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { builtinProviders } from \"./core/providers.ts\";\nimport { searchAllDetailed, searchProviderDetailed, searchWithFallback } from \"./core/all.ts\";\nimport { imageSearchProviderNames, searchByImage } from \"./core/image.ts\";\nimport {\n  DEFAULT_AGENT_READ_MAX_CHARS,\n  MAX_AGENT_READ_CHARS,\n  packageCapabilities,\n  readProviderNames,\n  readUrlDetailed,\n} from \"./core/read.ts\";\nimport { MAX_BATCH_ITEMS, readBatchDetailed, searchBatch } from \"./core/batch.ts\";\nimport { deadlineAfterSeconds, MAX_AGENT_TIMEOUT_SECONDS } from \"./core/execution.ts\";\nimport { EmptyQueryError, EmptyUrlError } from \"./core/errors.ts\";\nimport { listProviders } from \"./core/resolve.ts\";\nimport { MAX_SEARCH_CONTINUATION_LENGTH } from \"./core/search-continuation.ts\";\nimport { runtimeInfo } from \"./version.ts\";\n\nconst advertisedSearchProviderNames = [...builtinProviders, \"all\"].join(\", \");\n\nexport const searchTool = tool({\n  description:\n    'Search the web using multiple search engines (Brave, Context.dev, Exa, Firecrawl, Jina, Mojeek, OpenAI Codex, Tavily, TinyFish, SerpAPI, SerpBase, SearXNG). Pass one query or a batch of queries; each batch item returns its own results or error. Use provider \"all\" to query all available providers in parallel and get deduplicated results. Responses report filters the selected provider ignored. Single searches may continue with an opaque token bound to its provider.',\n  inputSchema: z.object({\n    query: z\n      .union([z.string(), z.array(z.string()).min(1).max(MAX_BATCH_ITEMS)])\n      .describe(\"Search query, or a batch of search queries\"),\n    provider: z\n      .string()\n      .optional()\n      .describe(\n        `Provider to use. Built in providers: ${advertisedSearchProviderNames}. Automatic selection tries other configured providers after payment, rate limit, timeout, or server failures. Use \"all\" for parallel search. Registered custom providers are validated at execution time.`,\n      ),\n    maxResults: z.number().int().min(1).max(20).optional().describe(\"Max results (default: 10)\"),\n    continuation: z\n      .string()\n      .max(MAX_SEARCH_CONTINUATION_LENGTH)\n      .optional()\n      .describe(\"Opaque token returned by a previous single search.\"),\n    highlights: z\n      .boolean()\n      .optional()\n      .describe(\"Return passages relevant to the query when supported. Defaults to true.\"),\n    summary: z\n      .boolean()\n      .optional()\n      .describe(\"Request generated summaries or answers when supported. Defaults to false.\"),\n    fullText: z\n      .boolean()\n      .optional()\n      .describe(\"Request full page text when supported. Defaults to false.\"),\n    favicon: z.boolean().optional().describe(\"Include favicon URLs on results. Defaults to false.\"),\n    includeDomains: z\n      .array(z.string())\n      .optional()\n      .describe(\n        'Only return results from these domains (e.g. [\"github.com\", \"stackoverflow.com\"])',\n      ),\n    excludeDomains: z.array(z.string()).optional().describe(\"Exclude results from these domains\"),\n    sources: z\n      .array(z.string())\n      .optional()\n      .describe('Source types when supported (Firecrawl: \"web\", \"news\", \"images\")'),\n    categories: z\n      .array(z.string())\n      .optional()\n      .describe('Category filters when supported (Firecrawl: \"research\", \"pdf\", \"developer\")'),\n    category: z\n      .string()\n      .optional()\n      .describe('Single search category (e.g. \"news\", \"general\"). Provider support varies.'),\n    startPublishedDate: z\n      .string()\n      .optional()\n      .describe('Filter results published after this date (ISO 8601, e.g. \"2024-01-01\")'),\n    endPublishedDate: z\n      .string()\n      .optional()\n      .describe(\"Filter results published before this date (ISO 8601)\"),\n    timeoutSeconds: z\n      .number()\n      .int()\n      .min(1)\n      .max(MAX_AGENT_TIMEOUT_SECONDS)\n      .optional()\n      .describe(\n        \"Give up after this many seconds. Fan-out and batch return what finished by then and report the rest as errors.\",\n      ),\n  }),\n  execute: async (\n    {\n      query,\n      provider: providerName,\n      maxResults,\n      continuation,\n      highlights,\n      summary,\n      fullText,\n      favicon,\n      includeDomains,\n      excludeDomains,\n      sources,\n      categories,\n      category,\n      startPublishedDate,\n      endPublishedDate,\n      timeoutSeconds,\n    },\n    { abortSignal },\n  ) => {\n    const normalizedProvider = providerName === \"auto\" ? undefined : providerName;\n    const searchOptions = {\n      maxResults,\n      continuation,\n      highlights,\n      summary,\n      fullText,\n      favicon: favicon === true,\n      includeDomains,\n      excludeDomains,\n      sources,\n      categories,\n      category,\n      startPublishedDate,\n      endPublishedDate,\n      deadline: deadlineAfterSeconds(timeoutSeconds),\n      signal: abortSignal,\n    };\n\n    if (Array.isArray(query)) {\n      if (continuation !== undefined) {\n        throw new TypeError(\"continuation is only supported for a single query\");\n      }\n      return searchBatch(query, { provider: normalizedProvider, ...searchOptions });\n    }\n    if (!query.trim()) {\n      throw new EmptyQueryError();\n    }\n    if (normalizedProvider === \"all\") {\n      const response = await searchAllDetailed(query, searchOptions);\n      return {\n        ...response,\n        errors: response.errors.map(({ provider, error }) => ({ provider, error: error.message })),\n      };\n    }\n\n    if (normalizedProvider !== undefined) {\n      return searchProviderDetailed(normalizedProvider, query, searchOptions);\n    }\n    return searchWithFallback(query, searchOptions);\n  },\n});\n\nexport const searchImageTool = tool({\n  description:\n    \"Find public pages containing or resembling an image available by URL. Uses a provider with reverse image search support and returns page URLs, matched images, dimensions, and rank metadata.\",\n  inputSchema: z.object({\n    url: z.url().describe(\"Public HTTP or HTTPS image URL\"),\n    provider: z\n      .string()\n      .optional()\n      .describe(\n        `Reverse image search provider. Built in providers: ${imageSearchProviderNames.join(\", \")}. Defaults to SerpAPI Google Lens. Registered custom providers are validated at execution time.`,\n      ),\n    maxResults: z\n      .number()\n      .int()\n      .min(1)\n      .max(20)\n      .optional()\n      .describe(\"Maximum matches to return. Defaults to 10.\"),\n  }),\n  execute: async ({ url, provider, maxResults }, { abortSignal }) =>\n    searchByImage(url, { provider, maxResults, signal: abortSignal }),\n});\n\nexport const readTool = tool({\n  description:\n    \"Read one URL or a batch of URLs into normalized content using Jina, Context.dev, Firecrawl, TinyFish, or Tavily. Automatic reads report the effective provider and every reader tried after fallback. Each batch item returns its own result or error.\",\n  inputSchema: z.object({\n    url: z\n      .union([z.string(), z.array(z.string()).min(1).max(MAX_BATCH_ITEMS)])\n      .describe(\"URL to read, or a batch of URLs\"),\n    provider: z\n      .string()\n      .optional()\n      .describe(\n        `Read provider to use. Built in providers: ${readProviderNames.join(\", \")}. Automatic selection starts with Jina and falls back after eligible payment, conflict, rate limit, timeout, or server failures. Registered custom providers are validated at execution time.`,\n      ),\n    format: z.enum([\"markdown\", \"text\", \"html\"]).optional().describe(\"Preferred content format.\"),\n    maxTokens: z\n      .number()\n      .int()\n      .min(1)\n      .optional()\n      .describe(\"Maximum tokens to return when supported by the provider.\"),\n    maxChars: z\n      .number()\n      .int()\n      .min(1)\n      .max(MAX_AGENT_READ_CHARS)\n      .optional()\n      .describe(\n        `Maximum page content characters to return. Defaults to ${DEFAULT_AGENT_READ_MAX_CHARS}.`,\n      ),\n    continuation: z\n      .string()\n      .max(1024)\n      .optional()\n      .describe(\"Opaque token returned by a truncated read.\"),\n    links: z\n      .boolean()\n      .optional()\n      .describe(\"Include the links found on the page. Defaults to false.\"),\n    images: z\n      .boolean()\n      .optional()\n      .describe(\"Include the image URLs found on the page. Defaults to false.\"),\n    targetSelector: z\n      .string()\n      .optional()\n      .describe(\"CSS selector to target when supported by the provider.\"),\n    removeSelector: z\n      .string()\n      .optional()\n      .describe(\"CSS selector to remove when supported by the provider.\"),\n    timeout: z\n      .number()\n      .int()\n      .min(1)\n      .optional()\n      .describe(\"Provider timeout in seconds when supported.\"),\n    noCache: z.boolean().optional().describe(\"Bypass provider cache when supported.\"),\n    timeoutSeconds: z\n      .number()\n      .int()\n      .min(1)\n      .max(MAX_AGENT_TIMEOUT_SECONDS)\n      .optional()\n      .describe(\n        \"Give up after this many seconds. A batch returns the URLs that finished by then and reports the rest as errors.\",\n      ),\n  }),\n  execute: async (\n    {\n      url,\n      provider,\n      format,\n      maxTokens,\n      maxChars,\n      continuation,\n      links,\n      images,\n      targetSelector,\n      removeSelector,\n      timeout,\n      noCache,\n      timeoutSeconds,\n    },\n    { abortSignal },\n  ) => {\n    if (Array.isArray(url) && continuation !== undefined) {\n      throw new TypeError(\"continuation is only supported for a single URL\");\n    }\n    const normalizedProvider = provider === \"auto\" ? undefined : provider;\n    const readOptions = {\n      provider: normalizedProvider,\n      format,\n      maxTokens,\n      maxChars: maxChars ?? DEFAULT_AGENT_READ_MAX_CHARS,\n      continuation,\n      links,\n      images,\n      targetSelector,\n      removeSelector,\n      timeout,\n      noCache,\n      deadline: deadlineAfterSeconds(timeoutSeconds),\n      signal: abortSignal,\n    };\n    if (Array.isArray(url)) {\n      return readBatchDetailed(url, readOptions);\n    }\n    if (!url.trim()) {\n      throw new EmptyUrlError();\n    }\n\n    return readUrlDetailed(url, readOptions);\n  },\n});\n\nexport const providersTool = tool({\n  description:\n    \"List registered web providers, their complete operation capabilities, configuration, and the running build.\",\n  inputSchema: z.object({}),\n  execute: async () => ({\n    runtime: runtimeInfo,\n    packageCapabilities,\n    providers: listProviders(),\n  }),\n});\n"],"mappings":"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"}