@scavio/ai-sdk 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,10 +16,11 @@ Trends, AI Mode). To reach all of them, point your agent at the
|
|
|
16
16
|
191 tools over every endpoint, nothing to vendor.
|
|
17
17
|
|
|
18
18
|
Credits are not uniform: most calls cost 1, YouTube search costs 2 and
|
|
19
|
-
transcript costs 5, Instagram costs
|
|
19
|
+
transcript costs 5, Instagram costs 1 or 2 depending on the endpoint (up to 10
|
|
20
|
+
when a request needs extra work), and
|
|
20
21
|
`scavio_extract` is priced by the `mode` you ask for (1 / 1 / 2), not per call.
|
|
21
22
|
|
|
22
|
-
> **Amazon changed (breaking).** The
|
|
23
|
+
> **Amazon changed (breaking).** The Amazon endpoint changed in 2026-07:
|
|
23
24
|
> `domain` is replaced by `country`, a two-letter marketplace code (`us`, `gb`
|
|
24
25
|
> -- the UK is `gb`, not `uk` -- `de`, `jp`, ...), and `sort_by`, `pages`,
|
|
25
26
|
> `category_id`, `merchant_id`, `language`, `currency`, `device`, `zip_code`
|
|
@@ -76,7 +77,7 @@ const res2 = await generateText({
|
|
|
76
77
|
| `scavioAmazonOffers` | `scavio_amazon_offers` | Amazon seller offers for one ASIN (1 credit) |
|
|
77
78
|
| `scavioWalmartSearch` | `scavio_walmart_search` | Walmart products (1 credit) |
|
|
78
79
|
| `scavioTiktokSearch` | `scavio_tiktok_search` | TikTok videos (1 credit) |
|
|
79
|
-
| `scavioInstagramSearch` | `scavio_instagram_search` | Instagram users (
|
|
80
|
+
| `scavioInstagramSearch` | `scavio_instagram_search` | Instagram users (2 credits) |
|
|
80
81
|
| `scavioMapWebsite` | `scavio_map_website` | A site's page URLs from its sitemaps and start page, `/api/v1/extract/map` (1 credit on `normal`) |
|
|
81
82
|
| `scavioCrawlWebsite` | `scavio_crawl_website` | Crawl a site from one URL, every page as Markdown / text / HTML (per successful page) |
|
|
82
83
|
| `scavioCrawlStatus` | `scavio_crawl_status` | A crawl's progress and page results, cursor-paged (free) |
|
package/dist/index.cjs
CHANGED
|
@@ -249,7 +249,7 @@ function scavioInstagramSearch(config) {
|
|
|
249
249
|
const c = client(config);
|
|
250
250
|
const max = config?.maxResults ?? 10;
|
|
251
251
|
return (0, import_ai.tool)({
|
|
252
|
-
description: "Search Instagram for users by keyword via the Scavio API (
|
|
252
|
+
description: "Search Instagram for users by keyword via the Scavio API (2 credits). Users come back under `data.users`.",
|
|
253
253
|
inputSchema: import_zod.z.object({
|
|
254
254
|
keyword: import_zod.z.string().describe("The search keyword.")
|
|
255
255
|
}),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { Scavio, type ScavioConfig, type GoogleSearchOptions } from \"scavio\";\n\nexport interface ScavioToolConfig extends ScavioConfig {\n /**\n * Max number of items to keep in the tool's result list. Defaults to 10.\n * Trimmed inside `data` on every platform except Google, whose body is flat.\n * Ignored by `scavioExtract`, which returns page content rather than a list.\n */\n maxResults?: number;\n /**\n * Add the five website tools (map, crawl, crawl status, batch extract, batch\n * status) to `scavioTools()`. Off by default: a crawl bills per page. The\n * individual factories (`scavioCrawlWebsite` and friends) work regardless.\n */\n enableCrawl?: boolean;\n /** Milliseconds between progress polls while a crawl or batch tool waits. Default 3000. */\n pollIntervalMs?: number;\n}\n\nfunction client(config?: ScavioToolConfig): Scavio {\n return new Scavio({ apiKey: config?.apiKey });\n}\n\n/**\n * Google is the ONLY family with a flat body: `organic_results` and friends sit\n * at the top level, next to `response_time` / `credits_used` / `credits_remaining`.\n */\nfunction trimFlat(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const list = res[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, [key]: list.slice(0, max) };\n }\n return res;\n}\n\n/**\n * Every non-Google endpoint nests its payload under `data` - the response is\n * `{ data: { products: [...] }, response_time, credits_used, credits_remaining }`.\n * Trimming the top level is therefore a silent no-op, so those tools trim\n * inside `data`.\n */\nfunction trimData(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const data = res.data;\n if (!data || typeof data !== \"object\") return res;\n const list = (data as Record<string, unknown>)[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, data: { ...(data as Record<string, unknown>), [key]: list.slice(0, max) } };\n }\n return res;\n}\n\n/**\n * Read any URL (/api/v1/extract).\n *\n * The one tool here that is not tied to a platform, and the only one `maxResults`\n * does not touch: extract returns page CONTENT, not a result list, so there is\n * nothing to trim and the body is returned whole. `extract` is a TOP-LEVEL\n * method on the SDK client - `c.extract({ url })`, never `c.extract.extract()`.\n *\n * Credits are a function of `mode`, not a per-call constant: \"normal\" 1,\n * \"advanced\" 1, \"ultra\" 2. Only a successful read is billed.\n */\nexport function scavioExtract(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read any web page via the Scavio API and get it back as clean Markdown (default), plain text, or raw HTML. Use it on any URL, including one returned by the search tools. Returns `data.content` alongside `data.url`, `data.format`, `data.mode` and `data.content_length`. Cost depends on `mode`: 1 credit on 'normal' and 'advanced', 2 on 'ultra'; a dead link, bot wall or timeout is not billed.\",\n inputSchema: z.object({\n url: z\n .string()\n .describe(\n \"The page to read (1-2048 characters). http(s) only; a bare host is upgraded to https, and loopback, private, link-local and metadata hosts are rejected.\",\n ),\n format: z\n .enum([\"html\", \"markdown\", \"text\"])\n .optional()\n .describe(\n \"Output format (default 'markdown'): 'markdown' is a readability extraction with page chrome stripped, 'text' is that flattened to plain text, 'html' is the raw page.\",\n ),\n mode: z\n .enum([\"normal\", \"advanced\", \"ultra\"])\n .optional()\n .describe(\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is a plain fetch and costs 1 credit, 'advanced' renders JavaScript-built pages and costs 1, 'ultra' reaches the hardest pages and costs 2. Start on 'normal'.\",\n ),\n }),\n execute: async ({ url, format, mode }) => c.extract({ url, format, mode }),\n });\n}\n\n/** Google web search (/api/v2/google, 1 credit). */\nexport function scavioSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search the web with Google via the Scavio API (1 credit). Returns real-time organic search results, each with a title, link, and snippet, under `organic_results`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n countryCode: z.string().optional().describe('Two-letter country code to localize results, e.g. \"us\".'),\n language: z.string().optional().describe('Two-letter UI language code, e.g. \"en\".'),\n page: z.number().int().optional().describe(\"1-based result page; page 2 starts at result 10.\"),\n device: z.enum([\"desktop\", \"mobile\"]).optional().describe(\"Device to emulate.\"),\n nfpr: z.boolean().optional().describe(\"Disable spelling auto-correction / similar-result substitution when true.\"),\n }),\n execute: async ({ query, countryCode, language, page, device, nfpr }) => {\n const params: GoogleSearchOptions = { query };\n if (countryCode) params.gl = countryCode;\n if (language) params.hl = language;\n if (page && page > 1) params.start = (page - 1) * 10;\n if (device) params.device = device;\n if (nfpr !== undefined) params.nfpr = nfpr;\n return trimFlat(await c.google.search(params), \"organic_results\", max);\n },\n });\n}\n\n/** YouTube video search (2 credits). */\nexport function scavioYoutubeSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search YouTube for videos, channels, or playlists via the Scavio API (2 credits). Videos come back under `data.results`, with `data.channels` and `data.playlists` alongside.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n upload_date: z.string().optional().describe(\"Upload date filter, e.g. 'today', 'this_week', 'this_month'.\"),\n type: z.string().optional().describe(\"Result type: 'video', 'channel', 'playlist', 'movie'.\"),\n duration: z.string().optional().describe(\"Duration filter: 'short', 'medium', 'long'.\"),\n sort_by: z.string().optional().describe(\"Sort order: 'relevance', 'date', 'view_count', 'rating'.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, upload_date, type, duration, sort_by, cursor }) =>\n trimData(\n await c.youtube.search({ query, upload_date, type, duration, sort_by, cursor } as Parameters<\n typeof c.youtube.search\n >[0]),\n \"results\",\n max,\n ),\n });\n}\n\n/** YouTube video details (1 credit). */\nexport function scavioYoutubeVideo(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch full details for a YouTube video (title, author, view count, description, captions, chapters) via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n }),\n execute: async ({ video_id }) => c.youtube.video({ video_id }),\n });\n}\n\n/** YouTube video transcript / subtitles (5 credits). */\nexport function scavioYoutubeTranscript(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube video's transcript or timed subtitles via the Scavio API (5 credits).\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n language: z.string().optional().describe(\"Transcript language code (default 'en').\"),\n format: z.enum([\"text\", \"srt\"]).optional().describe(\"'text' for a plain transcript, 'srt' for timed subtitles.\"),\n }),\n execute: async ({ video_id, language, format }) =>\n c.youtube.transcript({ video_id, language, format } as Parameters<typeof c.youtube.transcript>[0]),\n });\n}\n\n/** YouTube video comments (1 credit). */\nexport function scavioYoutubeComments(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"List comments on a YouTube video via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n cursor: z.string().optional().describe(\"Pagination cursor.\"),\n }),\n execute: async ({ video_id, cursor }) =>\n trimData(\n await c.youtube.comments({ video_id, cursor } as Parameters<typeof c.youtube.comments>[0]),\n \"comments\",\n max,\n ),\n });\n}\n\n/** YouTube channel details (1 credit). */\nexport function scavioYoutubeChannel(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube channel's details (subscribers, video count, views, links) via the Scavio API.\",\n inputSchema: z.object({\n channel_id: z.string().describe(\"YouTube channel id, @handle, or channel URL.\"),\n }),\n execute: async ({ channel_id }) => c.youtube.channel({ channel_id }),\n });\n}\n\n/**\n * Reddit post search (1 credit).\n *\n * The endpoint takes `query` and `cursor` and nothing else - it cannot sort or\n * filter by type, so no such input is offered. The API silently ignores those\n * params, which would leave a model believing it had filtered when it had not.\n */\nexport function scavioRedditSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Reddit posts via the Scavio API (1 credit). Returns matching posts under `data.results` with `data.next_cursor` for the next page. Results cannot be sorted or filtered by type.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, cursor }) => trimData(await c.reddit.search({ query, cursor }), \"results\", max),\n });\n}\n\n/**\n * Amazon product search.\n *\n * `domain` was dropped in favour of `country`, a two-letter marketplace code -\n * the upstream provider changed in 2026-07 and no longer takes a domain\n * suffix. It still works on the wire as a deprecated alias, but a model should\n * only ever see one spelling of a param.\n */\nexport function scavioAmazonSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Amazon for products via the Scavio API. Results are unsorted and cannot be filtered by category, merchant or price.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ query, country }) =>\n trimData(await c.amazon.search({ query, country }), \"products\", max),\n });\n}\n\n/** Every seller offer for one Amazon ASIN. */\nexport function scavioAmazonOffers(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"List every seller offer for one Amazon ASIN via the Scavio API: price, seller, condition, shipping, and which offer holds the buy box. Page 1 only.\",\n inputSchema: z.object({\n asin: z.string().describe(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ asin, country }) =>\n trimData(await c.amazon.offers({ asin, country }), \"offers\", max),\n });\n}\n\n/** Walmart product search. */\nexport function scavioWalmartSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"Search Walmart for products via the Scavio API. Products come back under `data.products`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n }),\n execute: async ({ query }) => trimData(await c.walmart.search({ query }), \"products\", max),\n });\n}\n\n/** TikTok video search. */\nexport function scavioTiktokSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search TikTok for videos by keyword via the Scavio API. Videos come back under `data.aweme_list`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n sort_type: z.enum([\"0\", \"1\"]).optional().describe(\"Sort order: '0' relevance, '1' most likes.\"),\n publish_time: z\n .enum([\"0\", \"1\", \"7\", \"30\", \"90\", \"180\"])\n .optional()\n .describe(\"Publish window in days: '0' all time, '1', '7', '30', '90', '180'.\"),\n }),\n execute: async ({ keyword, sort_type, publish_time }) =>\n trimData(\n await c.tiktok.searchVideos({\n keyword,\n sort_type,\n publish_time,\n } as Parameters<typeof c.tiktok.searchVideos>[0]),\n \"aweme_list\",\n max,\n ),\n });\n}\n\n/** Instagram user search. */\nexport function scavioInstagramSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Instagram for users by keyword via the Scavio API (10 credits). Users come back under `data.users`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n }),\n execute: async ({ keyword }) => trimData(await c.instagram.searchUsers({ keyword }), \"users\", max),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Website map, crawl and batch: the multi-page members of the Extract family.\n//\n// Map answers in one call. Crawl and batch are background jobs: the start tools\n// post the job, then wait up to wait_seconds (default 45, max 300) for it to\n// finish, polling progress without page content, and return the job's status\n// with its first page of results either way. A job still running when the wait\n// ends keeps going server-side; read the rest with the matching status tool.\n// ---------------------------------------------------------------------------\n\nconst JOB_POLL_INTERVAL_MS = 3_000;\nconst JOB_WAIT_DEFAULT_SECONDS = 45;\nconst JOB_WAIT_MAX_SECONDS = 300;\nconst JOB_RESULTS_DEFAULT_LIMIT = 10;\nconst JOB_TERMINAL = new Set([\"completed\", \"failed\", \"cancelled\"]);\n\ntype JobQuery = {\n cursor?: string;\n limit?: number;\n status?: \"succeeded\" | \"failed\" | \"skipped\";\n include_content?: boolean;\n};\ntype JobPayload = { data?: { id?: string; status?: string } } & Record<string, unknown>;\ntype JobStatusFn = (id: string, query: JobQuery) => Promise<unknown>;\n\n// lib is ES2022 only (no DOM or Node types); every runtime this targets has setTimeout.\ndeclare const setTimeout: (callback: () => void, ms: number) => unknown;\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n\n/** Poll a job (content-free) until it finishes or the wait runs out, then read one results page. */\nasync function waitForJob(\n status: JobStatusFn,\n id: string,\n waitSeconds: number,\n pollMs: number,\n query: JobQuery,\n): Promise<Record<string, unknown>> {\n const deadline = Date.now() + Math.max(0, Math.min(waitSeconds, JOB_WAIT_MAX_SECONDS)) * 1000;\n for (;;) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(pollMs, remaining));\n const probe = (await status(id, { limit: 1, include_content: false })) as JobPayload;\n if (JOB_TERMINAL.has(String(probe?.data?.status))) break;\n }\n return (await status(id, query)) as Record<string, unknown>;\n}\n\n/** Start a job, then wait for it (bounded). wait_seconds 0 returns the 202 payload. */\nasync function startAndWait(\n start: () => Promise<unknown>,\n status: JobStatusFn,\n input: { wait_seconds?: number; limit?: number; include_content?: boolean },\n pollMs: number,\n): Promise<Record<string, unknown>> {\n const created = (await start()) as JobPayload;\n const id = created?.data?.id;\n const wait = input.wait_seconds ?? JOB_WAIT_DEFAULT_SECONDS;\n if (!id || wait <= 0) return created;\n const query: JobQuery = { limit: input.limit ?? JOB_RESULTS_DEFAULT_LIMIT };\n if (input.include_content !== undefined) query.include_content = input.include_content;\n return waitForJob(status, id, wait, pollMs, query);\n}\n\nconst MODE_DESCRIPTION =\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is the standard fetch, 'advanced' renders JavaScript-built pages, 'ultra' reaches the hardest pages.\";\nconst PATHS_DESCRIPTION =\n \"Path globs (max 20). '*' matches within one path segment, '**' across segments; a pattern without wildcards matches that path and everything under it. Example: ['/blog/**'].\";\nconst JOB_PRICE =\n \"Billed per SUCCESSFUL page at Extract's price for the mode: 'normal' and 'advanced' 1 credit, 'ultra' 2. Failed and skipped pages are free, and if the balance runs out the job stops cleanly.\";\n\nconst jobFields = {\n format: z.enum([\"html\", \"markdown\", \"text\"]).optional().describe(\"Format for each page, as on extract (default 'markdown').\"),\n mode: z.enum([\"normal\", \"advanced\", \"ultra\"]).optional().describe(MODE_DESCRIPTION),\n wait_seconds: z\n .number()\n .int()\n .min(0)\n .max(JOB_WAIT_MAX_SECONDS)\n .optional()\n .describe(\"Seconds to wait for the job to finish before returning, 0-300 (default 45). 0 returns the job id at once. A job still running when the wait ends keeps going; read it later with its status tool.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Results per response, 1-100 (default 10, to keep page content inside the context window); page on with next_cursor.\"),\n include_content: z.boolean().optional().describe(\"Set false to list results without their page content (default true).\"),\n};\n\nconst jobStatusSchema = z.object({\n id: z.string().describe(\"Job id returned when the job was started (data.id).\"),\n cursor: z.string().optional().describe(\"next_cursor from the previous response, to read the next page.\"),\n limit: jobFields.limit,\n status: z.enum([\"succeeded\", \"failed\", \"skipped\"]).optional().describe(\"Only results with this status.\"),\n include_content: jobFields.include_content,\n});\n\n/** Map a website's URLs (/api/v1/extract/map). 1 credit on 'normal'. */\nexport function scavioMapWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"List a website's page URLs via the Scavio API, gathered from its sitemaps and its start page, deduplicated, filtered by path or search words and limited: `data.links` [{ url, source, lastmod }], `data.total_found`, `data.truncated`. Pages the site's robots.txt disallows are left out. Use it to find the right pages before extracting or crawling. Costs 1 credit on 'normal'; up to 2 on 'advanced' and up to 10 on 'ultra', priced by what the call needed.\",\n inputSchema: z.object({\n url: z.string().describe(\"The site to map. A bare host is upgraded to https.\"),\n search: z.string().optional().describe(\"Only return URLs containing every word of this text (case-insensitive).\"),\n limit: z.number().int().min(1).max(5000).optional().describe(\"Maximum links to return, 1-5000. Default 1000 (or the plan's limit if lower: Free 500, PAYG 1,000, paid plans 5,000).\"),\n sitemap: z.enum([\"include\", \"only\", \"skip\"]).optional().describe(\"'include' combines the site's sitemaps with the start page's links (default); 'only' uses sitemaps alone; 'skip' uses page links alone.\"),\n include_subdomains: z.boolean().optional().describe(\"Also return URLs on subdomains of the site (default false).\"),\n include_paths: z.array(z.string()).optional().describe(\"Keep only URLs matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Drop URLs matching these. \" + PATHS_DESCRIPTION),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one URL (default true).\"),\n mode: jobFields.mode,\n }),\n execute: async (input) =>\n (await c.extract.map(input as Parameters<typeof c.extract.map>[0])) as unknown as Record<string, unknown>,\n });\n}\n\n/** Crawl a website (/api/v1/extract/crawl), then wait (bounded) for it. */\nexport function scavioCrawlWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Crawl a website from one start URL via the Scavio API: same-site pages are discovered and extracted breadth-first within the page, depth and path limits, each returned as Markdown, text or HTML. Pages the site's robots.txt disallows are skipped. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_crawl_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n url: z.string().describe(\"Where the crawl starts. Only pages on the same site are crawled.\"),\n max_pages: z.number().int().min(1).max(10000).optional().describe(\"Maximum pages to fetch. Default 100. Plan limits: Free 10, PAYG 100, Project 500, Bootstrap 2,000, Startup 5,000, Growth 10,000.\"),\n max_depth: z.number().int().min(0).max(10).optional().describe(\"How many links away from the start page to follow, 0-10 (default 3). 0 fetches only the start page.\"),\n include_paths: z.array(z.string()).optional().describe(\"Crawl only paths matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Skip paths matching these. \" + PATHS_DESCRIPTION),\n allow_subdomains: z.boolean().optional().describe(\"Also crawl subdomains of the site (default false).\"),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one page (default true).\"),\n sitemap: z.enum([\"include\", \"skip\", \"only\"]).optional().describe(\"'include' also starts from the site's sitemap (default); 'skip' follows links only; 'only' fetches sitemap pages without following links.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.crawl(body as Parameters<typeof c.extract.crawl>[0]),\n (id, q) => c.extract.crawlStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A crawl's progress and page results (GET /api/v1/extract/crawl/{id}). Free. */\nexport function scavioCrawlStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a crawl's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, stopped_reason, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the crawl finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.crawlStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/** Extract a list of URLs in one job (/api/v1/extract/batch), then wait (bounded). */\nexport function scavioBatchExtract(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Extract a list of URLs (up to 1,000, plan-limited) in one job via the Scavio API, each returned as Markdown, text or HTML exactly like scavio_extract. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_batch_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(1000).describe(\"The pages to extract (duplicates removed). Plan limits: Free 10, PAYG 50, Project 100, Bootstrap 500, Startup and Growth 1,000.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.batch(body as Parameters<typeof c.extract.batch>[0]),\n (id, q) => c.extract.batchStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A batch's progress and page results (GET /api/v1/extract/batch/{id}). Free. */\nexport function scavioBatchStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a batch extract's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the batch finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.batchStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/**\n * All Scavio tools as an object keyed by tool name, ready to spread into the\n * `tools` option of `generateText` / `streamText`.\n */\nexport function scavioTools(config?: ScavioToolConfig) {\n return {\n scavio_extract: scavioExtract(config),\n scavio_search: scavioSearch(config),\n scavio_youtube_search: scavioYoutubeSearch(config),\n scavio_youtube_video: scavioYoutubeVideo(config),\n scavio_youtube_transcript: scavioYoutubeTranscript(config),\n scavio_youtube_comments: scavioYoutubeComments(config),\n scavio_youtube_channel: scavioYoutubeChannel(config),\n scavio_reddit_search: scavioRedditSearch(config),\n scavio_amazon_search: scavioAmazonSearch(config),\n scavio_amazon_offers: scavioAmazonOffers(config),\n scavio_walmart_search: scavioWalmartSearch(config),\n scavio_tiktok_search: scavioTiktokSearch(config),\n scavio_instagram_search: scavioInstagramSearch(config),\n ...(config?.enableCrawl\n ? {\n scavio_map_website: scavioMapWebsite(config),\n scavio_crawl_website: scavioCrawlWebsite(config),\n scavio_crawl_status: scavioCrawlStatus(config),\n scavio_batch_extract: scavioBatchExtract(config),\n scavio_batch_status: scavioBatchStatus(config),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { Scavio, type ScavioConfig, type GoogleSearchOptions } from \"scavio\";\n\nexport interface ScavioToolConfig extends ScavioConfig {\n /**\n * Max number of items to keep in the tool's result list. Defaults to 10.\n * Trimmed inside `data` on every platform except Google, whose body is flat.\n * Ignored by `scavioExtract`, which returns page content rather than a list.\n */\n maxResults?: number;\n /**\n * Add the five website tools (map, crawl, crawl status, batch extract, batch\n * status) to `scavioTools()`. Off by default: a crawl bills per page. The\n * individual factories (`scavioCrawlWebsite` and friends) work regardless.\n */\n enableCrawl?: boolean;\n /** Milliseconds between progress polls while a crawl or batch tool waits. Default 3000. */\n pollIntervalMs?: number;\n}\n\nfunction client(config?: ScavioToolConfig): Scavio {\n return new Scavio({ apiKey: config?.apiKey });\n}\n\n/**\n * Google is the ONLY family with a flat body: `organic_results` and friends sit\n * at the top level, next to `response_time` / `credits_used` / `credits_remaining`.\n */\nfunction trimFlat(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const list = res[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, [key]: list.slice(0, max) };\n }\n return res;\n}\n\n/**\n * Every non-Google endpoint nests its payload under `data` - the response is\n * `{ data: { products: [...] }, response_time, credits_used, credits_remaining }`.\n * Trimming the top level is therefore a silent no-op, so those tools trim\n * inside `data`.\n */\nfunction trimData(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const data = res.data;\n if (!data || typeof data !== \"object\") return res;\n const list = (data as Record<string, unknown>)[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, data: { ...(data as Record<string, unknown>), [key]: list.slice(0, max) } };\n }\n return res;\n}\n\n/**\n * Read any URL (/api/v1/extract).\n *\n * The one tool here that is not tied to a platform, and the only one `maxResults`\n * does not touch: extract returns page CONTENT, not a result list, so there is\n * nothing to trim and the body is returned whole. `extract` is a TOP-LEVEL\n * method on the SDK client - `c.extract({ url })`, never `c.extract.extract()`.\n *\n * Credits are a function of `mode`, not a per-call constant: \"normal\" 1,\n * \"advanced\" 1, \"ultra\" 2. Only a successful read is billed.\n */\nexport function scavioExtract(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read any web page via the Scavio API and get it back as clean Markdown (default), plain text, or raw HTML. Use it on any URL, including one returned by the search tools. Returns `data.content` alongside `data.url`, `data.format`, `data.mode` and `data.content_length`. Cost depends on `mode`: 1 credit on 'normal' and 'advanced', 2 on 'ultra'; a dead link, bot wall or timeout is not billed.\",\n inputSchema: z.object({\n url: z\n .string()\n .describe(\n \"The page to read (1-2048 characters). http(s) only; a bare host is upgraded to https, and loopback, private, link-local and metadata hosts are rejected.\",\n ),\n format: z\n .enum([\"html\", \"markdown\", \"text\"])\n .optional()\n .describe(\n \"Output format (default 'markdown'): 'markdown' is a readability extraction with page chrome stripped, 'text' is that flattened to plain text, 'html' is the raw page.\",\n ),\n mode: z\n .enum([\"normal\", \"advanced\", \"ultra\"])\n .optional()\n .describe(\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is a plain fetch and costs 1 credit, 'advanced' renders JavaScript-built pages and costs 1, 'ultra' reaches the hardest pages and costs 2. Start on 'normal'.\",\n ),\n }),\n execute: async ({ url, format, mode }) => c.extract({ url, format, mode }),\n });\n}\n\n/** Google web search (/api/v2/google, 1 credit). */\nexport function scavioSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search the web with Google via the Scavio API (1 credit). Returns real-time organic search results, each with a title, link, and snippet, under `organic_results`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n countryCode: z.string().optional().describe('Two-letter country code to localize results, e.g. \"us\".'),\n language: z.string().optional().describe('Two-letter UI language code, e.g. \"en\".'),\n page: z.number().int().optional().describe(\"1-based result page; page 2 starts at result 10.\"),\n device: z.enum([\"desktop\", \"mobile\"]).optional().describe(\"Device to emulate.\"),\n nfpr: z.boolean().optional().describe(\"Disable spelling auto-correction / similar-result substitution when true.\"),\n }),\n execute: async ({ query, countryCode, language, page, device, nfpr }) => {\n const params: GoogleSearchOptions = { query };\n if (countryCode) params.gl = countryCode;\n if (language) params.hl = language;\n if (page && page > 1) params.start = (page - 1) * 10;\n if (device) params.device = device;\n if (nfpr !== undefined) params.nfpr = nfpr;\n return trimFlat(await c.google.search(params), \"organic_results\", max);\n },\n });\n}\n\n/** YouTube video search (2 credits). */\nexport function scavioYoutubeSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search YouTube for videos, channels, or playlists via the Scavio API (2 credits). Videos come back under `data.results`, with `data.channels` and `data.playlists` alongside.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n upload_date: z.string().optional().describe(\"Upload date filter, e.g. 'today', 'this_week', 'this_month'.\"),\n type: z.string().optional().describe(\"Result type: 'video', 'channel', 'playlist', 'movie'.\"),\n duration: z.string().optional().describe(\"Duration filter: 'short', 'medium', 'long'.\"),\n sort_by: z.string().optional().describe(\"Sort order: 'relevance', 'date', 'view_count', 'rating'.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, upload_date, type, duration, sort_by, cursor }) =>\n trimData(\n await c.youtube.search({ query, upload_date, type, duration, sort_by, cursor } as Parameters<\n typeof c.youtube.search\n >[0]),\n \"results\",\n max,\n ),\n });\n}\n\n/** YouTube video details (1 credit). */\nexport function scavioYoutubeVideo(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch full details for a YouTube video (title, author, view count, description, captions, chapters) via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n }),\n execute: async ({ video_id }) => c.youtube.video({ video_id }),\n });\n}\n\n/** YouTube video transcript / subtitles (5 credits). */\nexport function scavioYoutubeTranscript(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube video's transcript or timed subtitles via the Scavio API (5 credits).\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n language: z.string().optional().describe(\"Transcript language code (default 'en').\"),\n format: z.enum([\"text\", \"srt\"]).optional().describe(\"'text' for a plain transcript, 'srt' for timed subtitles.\"),\n }),\n execute: async ({ video_id, language, format }) =>\n c.youtube.transcript({ video_id, language, format } as Parameters<typeof c.youtube.transcript>[0]),\n });\n}\n\n/** YouTube video comments (1 credit). */\nexport function scavioYoutubeComments(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"List comments on a YouTube video via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n cursor: z.string().optional().describe(\"Pagination cursor.\"),\n }),\n execute: async ({ video_id, cursor }) =>\n trimData(\n await c.youtube.comments({ video_id, cursor } as Parameters<typeof c.youtube.comments>[0]),\n \"comments\",\n max,\n ),\n });\n}\n\n/** YouTube channel details (1 credit). */\nexport function scavioYoutubeChannel(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube channel's details (subscribers, video count, views, links) via the Scavio API.\",\n inputSchema: z.object({\n channel_id: z.string().describe(\"YouTube channel id, @handle, or channel URL.\"),\n }),\n execute: async ({ channel_id }) => c.youtube.channel({ channel_id }),\n });\n}\n\n/**\n * Reddit post search (1 credit).\n *\n * The endpoint takes `query` and `cursor` and nothing else - it cannot sort or\n * filter by type, so no such input is offered. The API silently ignores those\n * params, which would leave a model believing it had filtered when it had not.\n */\nexport function scavioRedditSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Reddit posts via the Scavio API (1 credit). Returns matching posts under `data.results` with `data.next_cursor` for the next page. Results cannot be sorted or filtered by type.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, cursor }) => trimData(await c.reddit.search({ query, cursor }), \"results\", max),\n });\n}\n\n/**\n * Amazon product search.\n *\n * `domain` was dropped in favour of `country`, a two-letter marketplace code -\n * the Amazon endpoint changed in 2026-07 and no longer takes a domain\n * suffix. It still works on the wire as a deprecated alias, but a model should\n * only ever see one spelling of a param.\n */\nexport function scavioAmazonSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Amazon for products via the Scavio API. Results are unsorted and cannot be filtered by category, merchant or price.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ query, country }) =>\n trimData(await c.amazon.search({ query, country }), \"products\", max),\n });\n}\n\n/** Every seller offer for one Amazon ASIN. */\nexport function scavioAmazonOffers(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"List every seller offer for one Amazon ASIN via the Scavio API: price, seller, condition, shipping, and which offer holds the buy box. Page 1 only.\",\n inputSchema: z.object({\n asin: z.string().describe(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ asin, country }) =>\n trimData(await c.amazon.offers({ asin, country }), \"offers\", max),\n });\n}\n\n/** Walmart product search. */\nexport function scavioWalmartSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"Search Walmart for products via the Scavio API. Products come back under `data.products`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n }),\n execute: async ({ query }) => trimData(await c.walmart.search({ query }), \"products\", max),\n });\n}\n\n/** TikTok video search. */\nexport function scavioTiktokSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search TikTok for videos by keyword via the Scavio API. Videos come back under `data.aweme_list`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n sort_type: z.enum([\"0\", \"1\"]).optional().describe(\"Sort order: '0' relevance, '1' most likes.\"),\n publish_time: z\n .enum([\"0\", \"1\", \"7\", \"30\", \"90\", \"180\"])\n .optional()\n .describe(\"Publish window in days: '0' all time, '1', '7', '30', '90', '180'.\"),\n }),\n execute: async ({ keyword, sort_type, publish_time }) =>\n trimData(\n await c.tiktok.searchVideos({\n keyword,\n sort_type,\n publish_time,\n } as Parameters<typeof c.tiktok.searchVideos>[0]),\n \"aweme_list\",\n max,\n ),\n });\n}\n\n/** Instagram user search. */\nexport function scavioInstagramSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Instagram for users by keyword via the Scavio API (2 credits). Users come back under `data.users`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n }),\n execute: async ({ keyword }) => trimData(await c.instagram.searchUsers({ keyword }), \"users\", max),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Website map, crawl and batch: the multi-page members of the Extract family.\n//\n// Map answers in one call. Crawl and batch are background jobs: the start tools\n// post the job, then wait up to wait_seconds (default 45, max 300) for it to\n// finish, polling progress without page content, and return the job's status\n// with its first page of results either way. A job still running when the wait\n// ends keeps going server-side; read the rest with the matching status tool.\n// ---------------------------------------------------------------------------\n\nconst JOB_POLL_INTERVAL_MS = 3_000;\nconst JOB_WAIT_DEFAULT_SECONDS = 45;\nconst JOB_WAIT_MAX_SECONDS = 300;\nconst JOB_RESULTS_DEFAULT_LIMIT = 10;\nconst JOB_TERMINAL = new Set([\"completed\", \"failed\", \"cancelled\"]);\n\ntype JobQuery = {\n cursor?: string;\n limit?: number;\n status?: \"succeeded\" | \"failed\" | \"skipped\";\n include_content?: boolean;\n};\ntype JobPayload = { data?: { id?: string; status?: string } } & Record<string, unknown>;\ntype JobStatusFn = (id: string, query: JobQuery) => Promise<unknown>;\n\n// lib is ES2022 only (no DOM or Node types); every runtime this targets has setTimeout.\ndeclare const setTimeout: (callback: () => void, ms: number) => unknown;\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n\n/** Poll a job (content-free) until it finishes or the wait runs out, then read one results page. */\nasync function waitForJob(\n status: JobStatusFn,\n id: string,\n waitSeconds: number,\n pollMs: number,\n query: JobQuery,\n): Promise<Record<string, unknown>> {\n const deadline = Date.now() + Math.max(0, Math.min(waitSeconds, JOB_WAIT_MAX_SECONDS)) * 1000;\n for (;;) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(pollMs, remaining));\n const probe = (await status(id, { limit: 1, include_content: false })) as JobPayload;\n if (JOB_TERMINAL.has(String(probe?.data?.status))) break;\n }\n return (await status(id, query)) as Record<string, unknown>;\n}\n\n/** Start a job, then wait for it (bounded). wait_seconds 0 returns the 202 payload. */\nasync function startAndWait(\n start: () => Promise<unknown>,\n status: JobStatusFn,\n input: { wait_seconds?: number; limit?: number; include_content?: boolean },\n pollMs: number,\n): Promise<Record<string, unknown>> {\n const created = (await start()) as JobPayload;\n const id = created?.data?.id;\n const wait = input.wait_seconds ?? JOB_WAIT_DEFAULT_SECONDS;\n if (!id || wait <= 0) return created;\n const query: JobQuery = { limit: input.limit ?? JOB_RESULTS_DEFAULT_LIMIT };\n if (input.include_content !== undefined) query.include_content = input.include_content;\n return waitForJob(status, id, wait, pollMs, query);\n}\n\nconst MODE_DESCRIPTION =\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is the standard fetch, 'advanced' renders JavaScript-built pages, 'ultra' reaches the hardest pages.\";\nconst PATHS_DESCRIPTION =\n \"Path globs (max 20). '*' matches within one path segment, '**' across segments; a pattern without wildcards matches that path and everything under it. Example: ['/blog/**'].\";\nconst JOB_PRICE =\n \"Billed per SUCCESSFUL page at Extract's price for the mode: 'normal' and 'advanced' 1 credit, 'ultra' 2. Failed and skipped pages are free, and if the balance runs out the job stops cleanly.\";\n\nconst jobFields = {\n format: z.enum([\"html\", \"markdown\", \"text\"]).optional().describe(\"Format for each page, as on extract (default 'markdown').\"),\n mode: z.enum([\"normal\", \"advanced\", \"ultra\"]).optional().describe(MODE_DESCRIPTION),\n wait_seconds: z\n .number()\n .int()\n .min(0)\n .max(JOB_WAIT_MAX_SECONDS)\n .optional()\n .describe(\"Seconds to wait for the job to finish before returning, 0-300 (default 45). 0 returns the job id at once. A job still running when the wait ends keeps going; read it later with its status tool.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Results per response, 1-100 (default 10, to keep page content inside the context window); page on with next_cursor.\"),\n include_content: z.boolean().optional().describe(\"Set false to list results without their page content (default true).\"),\n};\n\nconst jobStatusSchema = z.object({\n id: z.string().describe(\"Job id returned when the job was started (data.id).\"),\n cursor: z.string().optional().describe(\"next_cursor from the previous response, to read the next page.\"),\n limit: jobFields.limit,\n status: z.enum([\"succeeded\", \"failed\", \"skipped\"]).optional().describe(\"Only results with this status.\"),\n include_content: jobFields.include_content,\n});\n\n/** Map a website's URLs (/api/v1/extract/map). 1 credit on 'normal'. */\nexport function scavioMapWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"List a website's page URLs via the Scavio API, gathered from its sitemaps and its start page, deduplicated, filtered by path or search words and limited: `data.links` [{ url, source, lastmod }], `data.total_found`, `data.truncated`. Pages the site's robots.txt disallows are left out. Use it to find the right pages before extracting or crawling. Costs 1 credit on 'normal'; up to 2 on 'advanced' and up to 10 on 'ultra', priced by what the call needed.\",\n inputSchema: z.object({\n url: z.string().describe(\"The site to map. A bare host is upgraded to https.\"),\n search: z.string().optional().describe(\"Only return URLs containing every word of this text (case-insensitive).\"),\n limit: z.number().int().min(1).max(5000).optional().describe(\"Maximum links to return, 1-5000. Default 1000 (or the plan's limit if lower: Free 500, PAYG 1,000, paid plans 5,000).\"),\n sitemap: z.enum([\"include\", \"only\", \"skip\"]).optional().describe(\"'include' combines the site's sitemaps with the start page's links (default); 'only' uses sitemaps alone; 'skip' uses page links alone.\"),\n include_subdomains: z.boolean().optional().describe(\"Also return URLs on subdomains of the site (default false).\"),\n include_paths: z.array(z.string()).optional().describe(\"Keep only URLs matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Drop URLs matching these. \" + PATHS_DESCRIPTION),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one URL (default true).\"),\n mode: jobFields.mode,\n }),\n execute: async (input) =>\n (await c.extract.map(input as Parameters<typeof c.extract.map>[0])) as unknown as Record<string, unknown>,\n });\n}\n\n/** Crawl a website (/api/v1/extract/crawl), then wait (bounded) for it. */\nexport function scavioCrawlWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Crawl a website from one start URL via the Scavio API: same-site pages are discovered and extracted breadth-first within the page, depth and path limits, each returned as Markdown, text or HTML. Pages the site's robots.txt disallows are skipped. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_crawl_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n url: z.string().describe(\"Where the crawl starts. Only pages on the same site are crawled.\"),\n max_pages: z.number().int().min(1).max(10000).optional().describe(\"Maximum pages to fetch. Default 100. Plan limits: Free 10, PAYG 100, Project 500, Bootstrap 2,000, Startup 5,000, Growth 10,000.\"),\n max_depth: z.number().int().min(0).max(10).optional().describe(\"How many links away from the start page to follow, 0-10 (default 3). 0 fetches only the start page.\"),\n include_paths: z.array(z.string()).optional().describe(\"Crawl only paths matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Skip paths matching these. \" + PATHS_DESCRIPTION),\n allow_subdomains: z.boolean().optional().describe(\"Also crawl subdomains of the site (default false).\"),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one page (default true).\"),\n sitemap: z.enum([\"include\", \"skip\", \"only\"]).optional().describe(\"'include' also starts from the site's sitemap (default); 'skip' follows links only; 'only' fetches sitemap pages without following links.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.crawl(body as Parameters<typeof c.extract.crawl>[0]),\n (id, q) => c.extract.crawlStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A crawl's progress and page results (GET /api/v1/extract/crawl/{id}). Free. */\nexport function scavioCrawlStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a crawl's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, stopped_reason, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the crawl finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.crawlStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/** Extract a list of URLs in one job (/api/v1/extract/batch), then wait (bounded). */\nexport function scavioBatchExtract(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Extract a list of URLs (up to 1,000, plan-limited) in one job via the Scavio API, each returned as Markdown, text or HTML exactly like scavio_extract. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_batch_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(1000).describe(\"The pages to extract (duplicates removed). Plan limits: Free 10, PAYG 50, Project 100, Bootstrap 500, Startup and Growth 1,000.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.batch(body as Parameters<typeof c.extract.batch>[0]),\n (id, q) => c.extract.batchStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A batch's progress and page results (GET /api/v1/extract/batch/{id}). Free. */\nexport function scavioBatchStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a batch extract's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the batch finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.batchStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/**\n * All Scavio tools as an object keyed by tool name, ready to spread into the\n * `tools` option of `generateText` / `streamText`.\n */\nexport function scavioTools(config?: ScavioToolConfig) {\n return {\n scavio_extract: scavioExtract(config),\n scavio_search: scavioSearch(config),\n scavio_youtube_search: scavioYoutubeSearch(config),\n scavio_youtube_video: scavioYoutubeVideo(config),\n scavio_youtube_transcript: scavioYoutubeTranscript(config),\n scavio_youtube_comments: scavioYoutubeComments(config),\n scavio_youtube_channel: scavioYoutubeChannel(config),\n scavio_reddit_search: scavioRedditSearch(config),\n scavio_amazon_search: scavioAmazonSearch(config),\n scavio_amazon_offers: scavioAmazonOffers(config),\n scavio_walmart_search: scavioWalmartSearch(config),\n scavio_tiktok_search: scavioTiktokSearch(config),\n scavio_instagram_search: scavioInstagramSearch(config),\n ...(config?.enableCrawl\n ? {\n scavio_map_website: scavioMapWebsite(config),\n scavio_crawl_website: scavioCrawlWebsite(config),\n scavio_crawl_status: scavioCrawlStatus(config),\n scavio_batch_extract: scavioBatchExtract(config),\n scavio_batch_status: scavioBatchStatus(config),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -85,7 +85,7 @@ declare function scavioRedditSearch(config?: ScavioToolConfig): ai.Tool<{
|
|
|
85
85
|
* Amazon product search.
|
|
86
86
|
*
|
|
87
87
|
* `domain` was dropped in favour of `country`, a two-letter marketplace code -
|
|
88
|
-
* the
|
|
88
|
+
* the Amazon endpoint changed in 2026-07 and no longer takes a domain
|
|
89
89
|
* suffix. It still works on the wire as a deprecated alias, but a model should
|
|
90
90
|
* only ever see one spelling of a param.
|
|
91
91
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -85,7 +85,7 @@ declare function scavioRedditSearch(config?: ScavioToolConfig): ai.Tool<{
|
|
|
85
85
|
* Amazon product search.
|
|
86
86
|
*
|
|
87
87
|
* `domain` was dropped in favour of `country`, a two-letter marketplace code -
|
|
88
|
-
* the
|
|
88
|
+
* the Amazon endpoint changed in 2026-07 and no longer takes a domain
|
|
89
89
|
* suffix. It still works on the wire as a deprecated alias, but a model should
|
|
90
90
|
* only ever see one spelling of a param.
|
|
91
91
|
*/
|
package/dist/index.js
CHANGED
|
@@ -207,7 +207,7 @@ function scavioInstagramSearch(config) {
|
|
|
207
207
|
const c = client(config);
|
|
208
208
|
const max = config?.maxResults ?? 10;
|
|
209
209
|
return tool({
|
|
210
|
-
description: "Search Instagram for users by keyword via the Scavio API (
|
|
210
|
+
description: "Search Instagram for users by keyword via the Scavio API (2 credits). Users come back under `data.users`.",
|
|
211
211
|
inputSchema: z.object({
|
|
212
212
|
keyword: z.string().describe("The search keyword.")
|
|
213
213
|
}),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { Scavio, type ScavioConfig, type GoogleSearchOptions } from \"scavio\";\n\nexport interface ScavioToolConfig extends ScavioConfig {\n /**\n * Max number of items to keep in the tool's result list. Defaults to 10.\n * Trimmed inside `data` on every platform except Google, whose body is flat.\n * Ignored by `scavioExtract`, which returns page content rather than a list.\n */\n maxResults?: number;\n /**\n * Add the five website tools (map, crawl, crawl status, batch extract, batch\n * status) to `scavioTools()`. Off by default: a crawl bills per page. The\n * individual factories (`scavioCrawlWebsite` and friends) work regardless.\n */\n enableCrawl?: boolean;\n /** Milliseconds between progress polls while a crawl or batch tool waits. Default 3000. */\n pollIntervalMs?: number;\n}\n\nfunction client(config?: ScavioToolConfig): Scavio {\n return new Scavio({ apiKey: config?.apiKey });\n}\n\n/**\n * Google is the ONLY family with a flat body: `organic_results` and friends sit\n * at the top level, next to `response_time` / `credits_used` / `credits_remaining`.\n */\nfunction trimFlat(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const list = res[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, [key]: list.slice(0, max) };\n }\n return res;\n}\n\n/**\n * Every non-Google endpoint nests its payload under `data` - the response is\n * `{ data: { products: [...] }, response_time, credits_used, credits_remaining }`.\n * Trimming the top level is therefore a silent no-op, so those tools trim\n * inside `data`.\n */\nfunction trimData(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const data = res.data;\n if (!data || typeof data !== \"object\") return res;\n const list = (data as Record<string, unknown>)[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, data: { ...(data as Record<string, unknown>), [key]: list.slice(0, max) } };\n }\n return res;\n}\n\n/**\n * Read any URL (/api/v1/extract).\n *\n * The one tool here that is not tied to a platform, and the only one `maxResults`\n * does not touch: extract returns page CONTENT, not a result list, so there is\n * nothing to trim and the body is returned whole. `extract` is a TOP-LEVEL\n * method on the SDK client - `c.extract({ url })`, never `c.extract.extract()`.\n *\n * Credits are a function of `mode`, not a per-call constant: \"normal\" 1,\n * \"advanced\" 1, \"ultra\" 2. Only a successful read is billed.\n */\nexport function scavioExtract(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read any web page via the Scavio API and get it back as clean Markdown (default), plain text, or raw HTML. Use it on any URL, including one returned by the search tools. Returns `data.content` alongside `data.url`, `data.format`, `data.mode` and `data.content_length`. Cost depends on `mode`: 1 credit on 'normal' and 'advanced', 2 on 'ultra'; a dead link, bot wall or timeout is not billed.\",\n inputSchema: z.object({\n url: z\n .string()\n .describe(\n \"The page to read (1-2048 characters). http(s) only; a bare host is upgraded to https, and loopback, private, link-local and metadata hosts are rejected.\",\n ),\n format: z\n .enum([\"html\", \"markdown\", \"text\"])\n .optional()\n .describe(\n \"Output format (default 'markdown'): 'markdown' is a readability extraction with page chrome stripped, 'text' is that flattened to plain text, 'html' is the raw page.\",\n ),\n mode: z\n .enum([\"normal\", \"advanced\", \"ultra\"])\n .optional()\n .describe(\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is a plain fetch and costs 1 credit, 'advanced' renders JavaScript-built pages and costs 1, 'ultra' reaches the hardest pages and costs 2. Start on 'normal'.\",\n ),\n }),\n execute: async ({ url, format, mode }) => c.extract({ url, format, mode }),\n });\n}\n\n/** Google web search (/api/v2/google, 1 credit). */\nexport function scavioSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search the web with Google via the Scavio API (1 credit). Returns real-time organic search results, each with a title, link, and snippet, under `organic_results`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n countryCode: z.string().optional().describe('Two-letter country code to localize results, e.g. \"us\".'),\n language: z.string().optional().describe('Two-letter UI language code, e.g. \"en\".'),\n page: z.number().int().optional().describe(\"1-based result page; page 2 starts at result 10.\"),\n device: z.enum([\"desktop\", \"mobile\"]).optional().describe(\"Device to emulate.\"),\n nfpr: z.boolean().optional().describe(\"Disable spelling auto-correction / similar-result substitution when true.\"),\n }),\n execute: async ({ query, countryCode, language, page, device, nfpr }) => {\n const params: GoogleSearchOptions = { query };\n if (countryCode) params.gl = countryCode;\n if (language) params.hl = language;\n if (page && page > 1) params.start = (page - 1) * 10;\n if (device) params.device = device;\n if (nfpr !== undefined) params.nfpr = nfpr;\n return trimFlat(await c.google.search(params), \"organic_results\", max);\n },\n });\n}\n\n/** YouTube video search (2 credits). */\nexport function scavioYoutubeSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search YouTube for videos, channels, or playlists via the Scavio API (2 credits). Videos come back under `data.results`, with `data.channels` and `data.playlists` alongside.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n upload_date: z.string().optional().describe(\"Upload date filter, e.g. 'today', 'this_week', 'this_month'.\"),\n type: z.string().optional().describe(\"Result type: 'video', 'channel', 'playlist', 'movie'.\"),\n duration: z.string().optional().describe(\"Duration filter: 'short', 'medium', 'long'.\"),\n sort_by: z.string().optional().describe(\"Sort order: 'relevance', 'date', 'view_count', 'rating'.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, upload_date, type, duration, sort_by, cursor }) =>\n trimData(\n await c.youtube.search({ query, upload_date, type, duration, sort_by, cursor } as Parameters<\n typeof c.youtube.search\n >[0]),\n \"results\",\n max,\n ),\n });\n}\n\n/** YouTube video details (1 credit). */\nexport function scavioYoutubeVideo(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch full details for a YouTube video (title, author, view count, description, captions, chapters) via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n }),\n execute: async ({ video_id }) => c.youtube.video({ video_id }),\n });\n}\n\n/** YouTube video transcript / subtitles (5 credits). */\nexport function scavioYoutubeTranscript(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube video's transcript or timed subtitles via the Scavio API (5 credits).\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n language: z.string().optional().describe(\"Transcript language code (default 'en').\"),\n format: z.enum([\"text\", \"srt\"]).optional().describe(\"'text' for a plain transcript, 'srt' for timed subtitles.\"),\n }),\n execute: async ({ video_id, language, format }) =>\n c.youtube.transcript({ video_id, language, format } as Parameters<typeof c.youtube.transcript>[0]),\n });\n}\n\n/** YouTube video comments (1 credit). */\nexport function scavioYoutubeComments(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"List comments on a YouTube video via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n cursor: z.string().optional().describe(\"Pagination cursor.\"),\n }),\n execute: async ({ video_id, cursor }) =>\n trimData(\n await c.youtube.comments({ video_id, cursor } as Parameters<typeof c.youtube.comments>[0]),\n \"comments\",\n max,\n ),\n });\n}\n\n/** YouTube channel details (1 credit). */\nexport function scavioYoutubeChannel(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube channel's details (subscribers, video count, views, links) via the Scavio API.\",\n inputSchema: z.object({\n channel_id: z.string().describe(\"YouTube channel id, @handle, or channel URL.\"),\n }),\n execute: async ({ channel_id }) => c.youtube.channel({ channel_id }),\n });\n}\n\n/**\n * Reddit post search (1 credit).\n *\n * The endpoint takes `query` and `cursor` and nothing else - it cannot sort or\n * filter by type, so no such input is offered. The API silently ignores those\n * params, which would leave a model believing it had filtered when it had not.\n */\nexport function scavioRedditSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Reddit posts via the Scavio API (1 credit). Returns matching posts under `data.results` with `data.next_cursor` for the next page. Results cannot be sorted or filtered by type.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, cursor }) => trimData(await c.reddit.search({ query, cursor }), \"results\", max),\n });\n}\n\n/**\n * Amazon product search.\n *\n * `domain` was dropped in favour of `country`, a two-letter marketplace code -\n * the upstream provider changed in 2026-07 and no longer takes a domain\n * suffix. It still works on the wire as a deprecated alias, but a model should\n * only ever see one spelling of a param.\n */\nexport function scavioAmazonSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Amazon for products via the Scavio API. Results are unsorted and cannot be filtered by category, merchant or price.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ query, country }) =>\n trimData(await c.amazon.search({ query, country }), \"products\", max),\n });\n}\n\n/** Every seller offer for one Amazon ASIN. */\nexport function scavioAmazonOffers(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"List every seller offer for one Amazon ASIN via the Scavio API: price, seller, condition, shipping, and which offer holds the buy box. Page 1 only.\",\n inputSchema: z.object({\n asin: z.string().describe(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ asin, country }) =>\n trimData(await c.amazon.offers({ asin, country }), \"offers\", max),\n });\n}\n\n/** Walmart product search. */\nexport function scavioWalmartSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"Search Walmart for products via the Scavio API. Products come back under `data.products`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n }),\n execute: async ({ query }) => trimData(await c.walmart.search({ query }), \"products\", max),\n });\n}\n\n/** TikTok video search. */\nexport function scavioTiktokSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search TikTok for videos by keyword via the Scavio API. Videos come back under `data.aweme_list`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n sort_type: z.enum([\"0\", \"1\"]).optional().describe(\"Sort order: '0' relevance, '1' most likes.\"),\n publish_time: z\n .enum([\"0\", \"1\", \"7\", \"30\", \"90\", \"180\"])\n .optional()\n .describe(\"Publish window in days: '0' all time, '1', '7', '30', '90', '180'.\"),\n }),\n execute: async ({ keyword, sort_type, publish_time }) =>\n trimData(\n await c.tiktok.searchVideos({\n keyword,\n sort_type,\n publish_time,\n } as Parameters<typeof c.tiktok.searchVideos>[0]),\n \"aweme_list\",\n max,\n ),\n });\n}\n\n/** Instagram user search. */\nexport function scavioInstagramSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Instagram for users by keyword via the Scavio API (10 credits). Users come back under `data.users`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n }),\n execute: async ({ keyword }) => trimData(await c.instagram.searchUsers({ keyword }), \"users\", max),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Website map, crawl and batch: the multi-page members of the Extract family.\n//\n// Map answers in one call. Crawl and batch are background jobs: the start tools\n// post the job, then wait up to wait_seconds (default 45, max 300) for it to\n// finish, polling progress without page content, and return the job's status\n// with its first page of results either way. A job still running when the wait\n// ends keeps going server-side; read the rest with the matching status tool.\n// ---------------------------------------------------------------------------\n\nconst JOB_POLL_INTERVAL_MS = 3_000;\nconst JOB_WAIT_DEFAULT_SECONDS = 45;\nconst JOB_WAIT_MAX_SECONDS = 300;\nconst JOB_RESULTS_DEFAULT_LIMIT = 10;\nconst JOB_TERMINAL = new Set([\"completed\", \"failed\", \"cancelled\"]);\n\ntype JobQuery = {\n cursor?: string;\n limit?: number;\n status?: \"succeeded\" | \"failed\" | \"skipped\";\n include_content?: boolean;\n};\ntype JobPayload = { data?: { id?: string; status?: string } } & Record<string, unknown>;\ntype JobStatusFn = (id: string, query: JobQuery) => Promise<unknown>;\n\n// lib is ES2022 only (no DOM or Node types); every runtime this targets has setTimeout.\ndeclare const setTimeout: (callback: () => void, ms: number) => unknown;\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n\n/** Poll a job (content-free) until it finishes or the wait runs out, then read one results page. */\nasync function waitForJob(\n status: JobStatusFn,\n id: string,\n waitSeconds: number,\n pollMs: number,\n query: JobQuery,\n): Promise<Record<string, unknown>> {\n const deadline = Date.now() + Math.max(0, Math.min(waitSeconds, JOB_WAIT_MAX_SECONDS)) * 1000;\n for (;;) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(pollMs, remaining));\n const probe = (await status(id, { limit: 1, include_content: false })) as JobPayload;\n if (JOB_TERMINAL.has(String(probe?.data?.status))) break;\n }\n return (await status(id, query)) as Record<string, unknown>;\n}\n\n/** Start a job, then wait for it (bounded). wait_seconds 0 returns the 202 payload. */\nasync function startAndWait(\n start: () => Promise<unknown>,\n status: JobStatusFn,\n input: { wait_seconds?: number; limit?: number; include_content?: boolean },\n pollMs: number,\n): Promise<Record<string, unknown>> {\n const created = (await start()) as JobPayload;\n const id = created?.data?.id;\n const wait = input.wait_seconds ?? JOB_WAIT_DEFAULT_SECONDS;\n if (!id || wait <= 0) return created;\n const query: JobQuery = { limit: input.limit ?? JOB_RESULTS_DEFAULT_LIMIT };\n if (input.include_content !== undefined) query.include_content = input.include_content;\n return waitForJob(status, id, wait, pollMs, query);\n}\n\nconst MODE_DESCRIPTION =\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is the standard fetch, 'advanced' renders JavaScript-built pages, 'ultra' reaches the hardest pages.\";\nconst PATHS_DESCRIPTION =\n \"Path globs (max 20). '*' matches within one path segment, '**' across segments; a pattern without wildcards matches that path and everything under it. Example: ['/blog/**'].\";\nconst JOB_PRICE =\n \"Billed per SUCCESSFUL page at Extract's price for the mode: 'normal' and 'advanced' 1 credit, 'ultra' 2. Failed and skipped pages are free, and if the balance runs out the job stops cleanly.\";\n\nconst jobFields = {\n format: z.enum([\"html\", \"markdown\", \"text\"]).optional().describe(\"Format for each page, as on extract (default 'markdown').\"),\n mode: z.enum([\"normal\", \"advanced\", \"ultra\"]).optional().describe(MODE_DESCRIPTION),\n wait_seconds: z\n .number()\n .int()\n .min(0)\n .max(JOB_WAIT_MAX_SECONDS)\n .optional()\n .describe(\"Seconds to wait for the job to finish before returning, 0-300 (default 45). 0 returns the job id at once. A job still running when the wait ends keeps going; read it later with its status tool.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Results per response, 1-100 (default 10, to keep page content inside the context window); page on with next_cursor.\"),\n include_content: z.boolean().optional().describe(\"Set false to list results without their page content (default true).\"),\n};\n\nconst jobStatusSchema = z.object({\n id: z.string().describe(\"Job id returned when the job was started (data.id).\"),\n cursor: z.string().optional().describe(\"next_cursor from the previous response, to read the next page.\"),\n limit: jobFields.limit,\n status: z.enum([\"succeeded\", \"failed\", \"skipped\"]).optional().describe(\"Only results with this status.\"),\n include_content: jobFields.include_content,\n});\n\n/** Map a website's URLs (/api/v1/extract/map). 1 credit on 'normal'. */\nexport function scavioMapWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"List a website's page URLs via the Scavio API, gathered from its sitemaps and its start page, deduplicated, filtered by path or search words and limited: `data.links` [{ url, source, lastmod }], `data.total_found`, `data.truncated`. Pages the site's robots.txt disallows are left out. Use it to find the right pages before extracting or crawling. Costs 1 credit on 'normal'; up to 2 on 'advanced' and up to 10 on 'ultra', priced by what the call needed.\",\n inputSchema: z.object({\n url: z.string().describe(\"The site to map. A bare host is upgraded to https.\"),\n search: z.string().optional().describe(\"Only return URLs containing every word of this text (case-insensitive).\"),\n limit: z.number().int().min(1).max(5000).optional().describe(\"Maximum links to return, 1-5000. Default 1000 (or the plan's limit if lower: Free 500, PAYG 1,000, paid plans 5,000).\"),\n sitemap: z.enum([\"include\", \"only\", \"skip\"]).optional().describe(\"'include' combines the site's sitemaps with the start page's links (default); 'only' uses sitemaps alone; 'skip' uses page links alone.\"),\n include_subdomains: z.boolean().optional().describe(\"Also return URLs on subdomains of the site (default false).\"),\n include_paths: z.array(z.string()).optional().describe(\"Keep only URLs matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Drop URLs matching these. \" + PATHS_DESCRIPTION),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one URL (default true).\"),\n mode: jobFields.mode,\n }),\n execute: async (input) =>\n (await c.extract.map(input as Parameters<typeof c.extract.map>[0])) as unknown as Record<string, unknown>,\n });\n}\n\n/** Crawl a website (/api/v1/extract/crawl), then wait (bounded) for it. */\nexport function scavioCrawlWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Crawl a website from one start URL via the Scavio API: same-site pages are discovered and extracted breadth-first within the page, depth and path limits, each returned as Markdown, text or HTML. Pages the site's robots.txt disallows are skipped. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_crawl_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n url: z.string().describe(\"Where the crawl starts. Only pages on the same site are crawled.\"),\n max_pages: z.number().int().min(1).max(10000).optional().describe(\"Maximum pages to fetch. Default 100. Plan limits: Free 10, PAYG 100, Project 500, Bootstrap 2,000, Startup 5,000, Growth 10,000.\"),\n max_depth: z.number().int().min(0).max(10).optional().describe(\"How many links away from the start page to follow, 0-10 (default 3). 0 fetches only the start page.\"),\n include_paths: z.array(z.string()).optional().describe(\"Crawl only paths matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Skip paths matching these. \" + PATHS_DESCRIPTION),\n allow_subdomains: z.boolean().optional().describe(\"Also crawl subdomains of the site (default false).\"),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one page (default true).\"),\n sitemap: z.enum([\"include\", \"skip\", \"only\"]).optional().describe(\"'include' also starts from the site's sitemap (default); 'skip' follows links only; 'only' fetches sitemap pages without following links.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.crawl(body as Parameters<typeof c.extract.crawl>[0]),\n (id, q) => c.extract.crawlStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A crawl's progress and page results (GET /api/v1/extract/crawl/{id}). Free. */\nexport function scavioCrawlStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a crawl's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, stopped_reason, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the crawl finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.crawlStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/** Extract a list of URLs in one job (/api/v1/extract/batch), then wait (bounded). */\nexport function scavioBatchExtract(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Extract a list of URLs (up to 1,000, plan-limited) in one job via the Scavio API, each returned as Markdown, text or HTML exactly like scavio_extract. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_batch_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(1000).describe(\"The pages to extract (duplicates removed). Plan limits: Free 10, PAYG 50, Project 100, Bootstrap 500, Startup and Growth 1,000.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.batch(body as Parameters<typeof c.extract.batch>[0]),\n (id, q) => c.extract.batchStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A batch's progress and page results (GET /api/v1/extract/batch/{id}). Free. */\nexport function scavioBatchStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a batch extract's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the batch finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.batchStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/**\n * All Scavio tools as an object keyed by tool name, ready to spread into the\n * `tools` option of `generateText` / `streamText`.\n */\nexport function scavioTools(config?: ScavioToolConfig) {\n return {\n scavio_extract: scavioExtract(config),\n scavio_search: scavioSearch(config),\n scavio_youtube_search: scavioYoutubeSearch(config),\n scavio_youtube_video: scavioYoutubeVideo(config),\n scavio_youtube_transcript: scavioYoutubeTranscript(config),\n scavio_youtube_comments: scavioYoutubeComments(config),\n scavio_youtube_channel: scavioYoutubeChannel(config),\n scavio_reddit_search: scavioRedditSearch(config),\n scavio_amazon_search: scavioAmazonSearch(config),\n scavio_amazon_offers: scavioAmazonOffers(config),\n scavio_walmart_search: scavioWalmartSearch(config),\n scavio_tiktok_search: scavioTiktokSearch(config),\n scavio_instagram_search: scavioInstagramSearch(config),\n ...(config?.enableCrawl\n ? {\n scavio_map_website: scavioMapWebsite(config),\n scavio_crawl_website: scavioCrawlWebsite(config),\n scavio_crawl_status: scavioCrawlStatus(config),\n scavio_batch_extract: scavioBatchExtract(config),\n scavio_batch_status: scavioBatchStatus(config),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport { Scavio, type ScavioConfig, type GoogleSearchOptions } from \"scavio\";\n\nexport interface ScavioToolConfig extends ScavioConfig {\n /**\n * Max number of items to keep in the tool's result list. Defaults to 10.\n * Trimmed inside `data` on every platform except Google, whose body is flat.\n * Ignored by `scavioExtract`, which returns page content rather than a list.\n */\n maxResults?: number;\n /**\n * Add the five website tools (map, crawl, crawl status, batch extract, batch\n * status) to `scavioTools()`. Off by default: a crawl bills per page. The\n * individual factories (`scavioCrawlWebsite` and friends) work regardless.\n */\n enableCrawl?: boolean;\n /** Milliseconds between progress polls while a crawl or batch tool waits. Default 3000. */\n pollIntervalMs?: number;\n}\n\nfunction client(config?: ScavioToolConfig): Scavio {\n return new Scavio({ apiKey: config?.apiKey });\n}\n\n/**\n * Google is the ONLY family with a flat body: `organic_results` and friends sit\n * at the top level, next to `response_time` / `credits_used` / `credits_remaining`.\n */\nfunction trimFlat(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const list = res[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, [key]: list.slice(0, max) };\n }\n return res;\n}\n\n/**\n * Every non-Google endpoint nests its payload under `data` - the response is\n * `{ data: { products: [...] }, response_time, credits_used, credits_remaining }`.\n * Trimming the top level is therefore a silent no-op, so those tools trim\n * inside `data`.\n */\nfunction trimData(res: Record<string, unknown>, key: string, max: number): Record<string, unknown> {\n const data = res.data;\n if (!data || typeof data !== \"object\") return res;\n const list = (data as Record<string, unknown>)[key];\n if (Array.isArray(list) && list.length > max) {\n return { ...res, data: { ...(data as Record<string, unknown>), [key]: list.slice(0, max) } };\n }\n return res;\n}\n\n/**\n * Read any URL (/api/v1/extract).\n *\n * The one tool here that is not tied to a platform, and the only one `maxResults`\n * does not touch: extract returns page CONTENT, not a result list, so there is\n * nothing to trim and the body is returned whole. `extract` is a TOP-LEVEL\n * method on the SDK client - `c.extract({ url })`, never `c.extract.extract()`.\n *\n * Credits are a function of `mode`, not a per-call constant: \"normal\" 1,\n * \"advanced\" 1, \"ultra\" 2. Only a successful read is billed.\n */\nexport function scavioExtract(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read any web page via the Scavio API and get it back as clean Markdown (default), plain text, or raw HTML. Use it on any URL, including one returned by the search tools. Returns `data.content` alongside `data.url`, `data.format`, `data.mode` and `data.content_length`. Cost depends on `mode`: 1 credit on 'normal' and 'advanced', 2 on 'ultra'; a dead link, bot wall or timeout is not billed.\",\n inputSchema: z.object({\n url: z\n .string()\n .describe(\n \"The page to read (1-2048 characters). http(s) only; a bare host is upgraded to https, and loopback, private, link-local and metadata hosts are rejected.\",\n ),\n format: z\n .enum([\"html\", \"markdown\", \"text\"])\n .optional()\n .describe(\n \"Output format (default 'markdown'): 'markdown' is a readability extraction with page chrome stripped, 'text' is that flattened to plain text, 'html' is the raw page.\",\n ),\n mode: z\n .enum([\"normal\", \"advanced\", \"ultra\"])\n .optional()\n .describe(\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is a plain fetch and costs 1 credit, 'advanced' renders JavaScript-built pages and costs 1, 'ultra' reaches the hardest pages and costs 2. Start on 'normal'.\",\n ),\n }),\n execute: async ({ url, format, mode }) => c.extract({ url, format, mode }),\n });\n}\n\n/** Google web search (/api/v2/google, 1 credit). */\nexport function scavioSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search the web with Google via the Scavio API (1 credit). Returns real-time organic search results, each with a title, link, and snippet, under `organic_results`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n countryCode: z.string().optional().describe('Two-letter country code to localize results, e.g. \"us\".'),\n language: z.string().optional().describe('Two-letter UI language code, e.g. \"en\".'),\n page: z.number().int().optional().describe(\"1-based result page; page 2 starts at result 10.\"),\n device: z.enum([\"desktop\", \"mobile\"]).optional().describe(\"Device to emulate.\"),\n nfpr: z.boolean().optional().describe(\"Disable spelling auto-correction / similar-result substitution when true.\"),\n }),\n execute: async ({ query, countryCode, language, page, device, nfpr }) => {\n const params: GoogleSearchOptions = { query };\n if (countryCode) params.gl = countryCode;\n if (language) params.hl = language;\n if (page && page > 1) params.start = (page - 1) * 10;\n if (device) params.device = device;\n if (nfpr !== undefined) params.nfpr = nfpr;\n return trimFlat(await c.google.search(params), \"organic_results\", max);\n },\n });\n}\n\n/** YouTube video search (2 credits). */\nexport function scavioYoutubeSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search YouTube for videos, channels, or playlists via the Scavio API (2 credits). Videos come back under `data.results`, with `data.channels` and `data.playlists` alongside.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n upload_date: z.string().optional().describe(\"Upload date filter, e.g. 'today', 'this_week', 'this_month'.\"),\n type: z.string().optional().describe(\"Result type: 'video', 'channel', 'playlist', 'movie'.\"),\n duration: z.string().optional().describe(\"Duration filter: 'short', 'medium', 'long'.\"),\n sort_by: z.string().optional().describe(\"Sort order: 'relevance', 'date', 'view_count', 'rating'.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, upload_date, type, duration, sort_by, cursor }) =>\n trimData(\n await c.youtube.search({ query, upload_date, type, duration, sort_by, cursor } as Parameters<\n typeof c.youtube.search\n >[0]),\n \"results\",\n max,\n ),\n });\n}\n\n/** YouTube video details (1 credit). */\nexport function scavioYoutubeVideo(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch full details for a YouTube video (title, author, view count, description, captions, chapters) via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n }),\n execute: async ({ video_id }) => c.youtube.video({ video_id }),\n });\n}\n\n/** YouTube video transcript / subtitles (5 credits). */\nexport function scavioYoutubeTranscript(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube video's transcript or timed subtitles via the Scavio API (5 credits).\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n language: z.string().optional().describe(\"Transcript language code (default 'en').\"),\n format: z.enum([\"text\", \"srt\"]).optional().describe(\"'text' for a plain transcript, 'srt' for timed subtitles.\"),\n }),\n execute: async ({ video_id, language, format }) =>\n c.youtube.transcript({ video_id, language, format } as Parameters<typeof c.youtube.transcript>[0]),\n });\n}\n\n/** YouTube video comments (1 credit). */\nexport function scavioYoutubeComments(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"List comments on a YouTube video via the Scavio API.\",\n inputSchema: z.object({\n video_id: z.string().describe(\"YouTube video id or a full watch URL.\"),\n cursor: z.string().optional().describe(\"Pagination cursor.\"),\n }),\n execute: async ({ video_id, cursor }) =>\n trimData(\n await c.youtube.comments({ video_id, cursor } as Parameters<typeof c.youtube.comments>[0]),\n \"comments\",\n max,\n ),\n });\n}\n\n/** YouTube channel details (1 credit). */\nexport function scavioYoutubeChannel(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Fetch a YouTube channel's details (subscribers, video count, views, links) via the Scavio API.\",\n inputSchema: z.object({\n channel_id: z.string().describe(\"YouTube channel id, @handle, or channel URL.\"),\n }),\n execute: async ({ channel_id }) => c.youtube.channel({ channel_id }),\n });\n}\n\n/**\n * Reddit post search (1 credit).\n *\n * The endpoint takes `query` and `cursor` and nothing else - it cannot sort or\n * filter by type, so no such input is offered. The API silently ignores those\n * params, which would leave a model believing it had filtered when it had not.\n */\nexport function scavioRedditSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Reddit posts via the Scavio API (1 credit). Returns matching posts under `data.results` with `data.next_cursor` for the next page. Results cannot be sorted or filtered by type.\",\n inputSchema: z.object({\n query: z.string().describe(\"The search query.\"),\n cursor: z.string().optional().describe(\"Pagination cursor (`next_cursor`) from a prior response.\"),\n }),\n execute: async ({ query, cursor }) => trimData(await c.reddit.search({ query, cursor }), \"results\", max),\n });\n}\n\n/**\n * Amazon product search.\n *\n * `domain` was dropped in favour of `country`, a two-letter marketplace code -\n * the Amazon endpoint changed in 2026-07 and no longer takes a domain\n * suffix. It still works on the wire as a deprecated alias, but a model should\n * only ever see one spelling of a param.\n */\nexport function scavioAmazonSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Amazon for products via the Scavio API. Results are unsorted and cannot be filtered by category, merchant or price.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ query, country }) =>\n trimData(await c.amazon.search({ query, country }), \"products\", max),\n });\n}\n\n/** Every seller offer for one Amazon ASIN. */\nexport function scavioAmazonOffers(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"List every seller offer for one Amazon ASIN via the Scavio API: price, seller, condition, shipping, and which offer holds the buy box. Page 1 only.\",\n inputSchema: z.object({\n asin: z.string().describe(\"Amazon Standard Identification Number (ASIN) of the product.\"),\n country: z\n .string()\n .optional()\n .describe(\n \"Marketplace country code (ISO 3166-1 alpha-2), not a domain: us (default), gb (the UK is gb, not uk), de, fr, jp, ... An unknown code falls back to us.\"\n ),\n }),\n execute: async ({ asin, country }) =>\n trimData(await c.amazon.offers({ asin, country }), \"offers\", max),\n });\n}\n\n/** Walmart product search. */\nexport function scavioWalmartSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description: \"Search Walmart for products via the Scavio API. Products come back under `data.products`.\",\n inputSchema: z.object({\n query: z.string().describe(\"The product search query.\"),\n }),\n execute: async ({ query }) => trimData(await c.walmart.search({ query }), \"products\", max),\n });\n}\n\n/** TikTok video search. */\nexport function scavioTiktokSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search TikTok for videos by keyword via the Scavio API. Videos come back under `data.aweme_list`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n sort_type: z.enum([\"0\", \"1\"]).optional().describe(\"Sort order: '0' relevance, '1' most likes.\"),\n publish_time: z\n .enum([\"0\", \"1\", \"7\", \"30\", \"90\", \"180\"])\n .optional()\n .describe(\"Publish window in days: '0' all time, '1', '7', '30', '90', '180'.\"),\n }),\n execute: async ({ keyword, sort_type, publish_time }) =>\n trimData(\n await c.tiktok.searchVideos({\n keyword,\n sort_type,\n publish_time,\n } as Parameters<typeof c.tiktok.searchVideos>[0]),\n \"aweme_list\",\n max,\n ),\n });\n}\n\n/** Instagram user search. */\nexport function scavioInstagramSearch(config?: ScavioToolConfig) {\n const c = client(config);\n const max = config?.maxResults ?? 10;\n return tool({\n description:\n \"Search Instagram for users by keyword via the Scavio API (2 credits). Users come back under `data.users`.\",\n inputSchema: z.object({\n keyword: z.string().describe(\"The search keyword.\"),\n }),\n execute: async ({ keyword }) => trimData(await c.instagram.searchUsers({ keyword }), \"users\", max),\n });\n}\n\n// ---------------------------------------------------------------------------\n// Website map, crawl and batch: the multi-page members of the Extract family.\n//\n// Map answers in one call. Crawl and batch are background jobs: the start tools\n// post the job, then wait up to wait_seconds (default 45, max 300) for it to\n// finish, polling progress without page content, and return the job's status\n// with its first page of results either way. A job still running when the wait\n// ends keeps going server-side; read the rest with the matching status tool.\n// ---------------------------------------------------------------------------\n\nconst JOB_POLL_INTERVAL_MS = 3_000;\nconst JOB_WAIT_DEFAULT_SECONDS = 45;\nconst JOB_WAIT_MAX_SECONDS = 300;\nconst JOB_RESULTS_DEFAULT_LIMIT = 10;\nconst JOB_TERMINAL = new Set([\"completed\", \"failed\", \"cancelled\"]);\n\ntype JobQuery = {\n cursor?: string;\n limit?: number;\n status?: \"succeeded\" | \"failed\" | \"skipped\";\n include_content?: boolean;\n};\ntype JobPayload = { data?: { id?: string; status?: string } } & Record<string, unknown>;\ntype JobStatusFn = (id: string, query: JobQuery) => Promise<unknown>;\n\n// lib is ES2022 only (no DOM or Node types); every runtime this targets has setTimeout.\ndeclare const setTimeout: (callback: () => void, ms: number) => unknown;\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n\n/** Poll a job (content-free) until it finishes or the wait runs out, then read one results page. */\nasync function waitForJob(\n status: JobStatusFn,\n id: string,\n waitSeconds: number,\n pollMs: number,\n query: JobQuery,\n): Promise<Record<string, unknown>> {\n const deadline = Date.now() + Math.max(0, Math.min(waitSeconds, JOB_WAIT_MAX_SECONDS)) * 1000;\n for (;;) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(pollMs, remaining));\n const probe = (await status(id, { limit: 1, include_content: false })) as JobPayload;\n if (JOB_TERMINAL.has(String(probe?.data?.status))) break;\n }\n return (await status(id, query)) as Record<string, unknown>;\n}\n\n/** Start a job, then wait for it (bounded). wait_seconds 0 returns the 202 payload. */\nasync function startAndWait(\n start: () => Promise<unknown>,\n status: JobStatusFn,\n input: { wait_seconds?: number; limit?: number; include_content?: boolean },\n pollMs: number,\n): Promise<Record<string, unknown>> {\n const created = (await start()) as JobPayload;\n const id = created?.data?.id;\n const wait = input.wait_seconds ?? JOB_WAIT_DEFAULT_SECONDS;\n if (!id || wait <= 0) return created;\n const query: JobQuery = { limit: input.limit ?? JOB_RESULTS_DEFAULT_LIMIT };\n if (input.include_content !== undefined) query.include_content = input.include_content;\n return waitForJob(status, id, wait, pollMs, query);\n}\n\nconst MODE_DESCRIPTION =\n \"Fetch tier, and the parameter that sets the price: 'normal' (default) is the standard fetch, 'advanced' renders JavaScript-built pages, 'ultra' reaches the hardest pages.\";\nconst PATHS_DESCRIPTION =\n \"Path globs (max 20). '*' matches within one path segment, '**' across segments; a pattern without wildcards matches that path and everything under it. Example: ['/blog/**'].\";\nconst JOB_PRICE =\n \"Billed per SUCCESSFUL page at Extract's price for the mode: 'normal' and 'advanced' 1 credit, 'ultra' 2. Failed and skipped pages are free, and if the balance runs out the job stops cleanly.\";\n\nconst jobFields = {\n format: z.enum([\"html\", \"markdown\", \"text\"]).optional().describe(\"Format for each page, as on extract (default 'markdown').\"),\n mode: z.enum([\"normal\", \"advanced\", \"ultra\"]).optional().describe(MODE_DESCRIPTION),\n wait_seconds: z\n .number()\n .int()\n .min(0)\n .max(JOB_WAIT_MAX_SECONDS)\n .optional()\n .describe(\"Seconds to wait for the job to finish before returning, 0-300 (default 45). 0 returns the job id at once. A job still running when the wait ends keeps going; read it later with its status tool.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Results per response, 1-100 (default 10, to keep page content inside the context window); page on with next_cursor.\"),\n include_content: z.boolean().optional().describe(\"Set false to list results without their page content (default true).\"),\n};\n\nconst jobStatusSchema = z.object({\n id: z.string().describe(\"Job id returned when the job was started (data.id).\"),\n cursor: z.string().optional().describe(\"next_cursor from the previous response, to read the next page.\"),\n limit: jobFields.limit,\n status: z.enum([\"succeeded\", \"failed\", \"skipped\"]).optional().describe(\"Only results with this status.\"),\n include_content: jobFields.include_content,\n});\n\n/** Map a website's URLs (/api/v1/extract/map). 1 credit on 'normal'. */\nexport function scavioMapWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"List a website's page URLs via the Scavio API, gathered from its sitemaps and its start page, deduplicated, filtered by path or search words and limited: `data.links` [{ url, source, lastmod }], `data.total_found`, `data.truncated`. Pages the site's robots.txt disallows are left out. Use it to find the right pages before extracting or crawling. Costs 1 credit on 'normal'; up to 2 on 'advanced' and up to 10 on 'ultra', priced by what the call needed.\",\n inputSchema: z.object({\n url: z.string().describe(\"The site to map. A bare host is upgraded to https.\"),\n search: z.string().optional().describe(\"Only return URLs containing every word of this text (case-insensitive).\"),\n limit: z.number().int().min(1).max(5000).optional().describe(\"Maximum links to return, 1-5000. Default 1000 (or the plan's limit if lower: Free 500, PAYG 1,000, paid plans 5,000).\"),\n sitemap: z.enum([\"include\", \"only\", \"skip\"]).optional().describe(\"'include' combines the site's sitemaps with the start page's links (default); 'only' uses sitemaps alone; 'skip' uses page links alone.\"),\n include_subdomains: z.boolean().optional().describe(\"Also return URLs on subdomains of the site (default false).\"),\n include_paths: z.array(z.string()).optional().describe(\"Keep only URLs matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Drop URLs matching these. \" + PATHS_DESCRIPTION),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one URL (default true).\"),\n mode: jobFields.mode,\n }),\n execute: async (input) =>\n (await c.extract.map(input as Parameters<typeof c.extract.map>[0])) as unknown as Record<string, unknown>,\n });\n}\n\n/** Crawl a website (/api/v1/extract/crawl), then wait (bounded) for it. */\nexport function scavioCrawlWebsite(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Crawl a website from one start URL via the Scavio API: same-site pages are discovered and extracted breadth-first within the page, depth and path limits, each returned as Markdown, text or HTML. Pages the site's robots.txt disallows are skipped. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_crawl_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n url: z.string().describe(\"Where the crawl starts. Only pages on the same site are crawled.\"),\n max_pages: z.number().int().min(1).max(10000).optional().describe(\"Maximum pages to fetch. Default 100. Plan limits: Free 10, PAYG 100, Project 500, Bootstrap 2,000, Startup 5,000, Growth 10,000.\"),\n max_depth: z.number().int().min(0).max(10).optional().describe(\"How many links away from the start page to follow, 0-10 (default 3). 0 fetches only the start page.\"),\n include_paths: z.array(z.string()).optional().describe(\"Crawl only paths matching these. \" + PATHS_DESCRIPTION),\n exclude_paths: z.array(z.string()).optional().describe(\"Skip paths matching these. \" + PATHS_DESCRIPTION),\n allow_subdomains: z.boolean().optional().describe(\"Also crawl subdomains of the site (default false).\"),\n ignore_query_parameters: z.boolean().optional().describe(\"Treat URLs that differ only by query string as one page (default true).\"),\n sitemap: z.enum([\"include\", \"skip\", \"only\"]).optional().describe(\"'include' also starts from the site's sitemap (default); 'skip' follows links only; 'only' fetches sitemap pages without following links.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.crawl(body as Parameters<typeof c.extract.crawl>[0]),\n (id, q) => c.extract.crawlStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A crawl's progress and page results (GET /api/v1/extract/crawl/{id}). Free. */\nexport function scavioCrawlStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a crawl's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, stopped_reason, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the crawl finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.crawlStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/** Extract a list of URLs in one job (/api/v1/extract/batch), then wait (bounded). */\nexport function scavioBatchExtract(config?: ScavioToolConfig) {\n const c = client(config);\n const pollMs = config?.pollIntervalMs ?? JOB_POLL_INTERVAL_MS;\n return tool({\n description:\n \"Extract a list of URLs (up to 1,000, plan-limited) in one job via the Scavio API, each returned as Markdown, text or HTML exactly like scavio_extract. Waits up to wait_seconds (default 45) and returns `data` { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio_batch_status with the id later. \" +\n JOB_PRICE,\n inputSchema: z.object({\n urls: z.array(z.string()).min(1).max(1000).describe(\"The pages to extract (duplicates removed). Plan limits: Free 10, PAYG 50, Project 100, Bootstrap 500, Startup and Growth 1,000.\"),\n ...jobFields,\n }),\n execute: async (input) => {\n const { wait_seconds, limit, include_content, ...body } = input;\n return startAndWait(\n () => c.extract.batch(body as Parameters<typeof c.extract.batch>[0]),\n (id, q) => c.extract.batchStatus(id, q),\n { wait_seconds, limit, include_content },\n pollMs,\n );\n },\n });\n}\n\n/** A batch's progress and page results (GET /api/v1/extract/batch/{id}). Free. */\nexport function scavioBatchStatus(config?: ScavioToolConfig) {\n const c = client(config);\n return tool({\n description:\n \"Read a batch extract's progress and its page results by job id via the Scavio API, paged by cursor: `data` { status, pages, credits_used, results: [{ url, status, content }], next_cursor }. Results are kept for 3 days after the batch finishes. Free: reading a job costs 0 credits.\",\n inputSchema: jobStatusSchema,\n execute: async ({ id, limit, ...q }) =>\n (await c.extract.batchStatus(id, { ...q, limit: limit ?? JOB_RESULTS_DEFAULT_LIMIT })) as unknown as Record<string, unknown>,\n });\n}\n\n/**\n * All Scavio tools as an object keyed by tool name, ready to spread into the\n * `tools` option of `generateText` / `streamText`.\n */\nexport function scavioTools(config?: ScavioToolConfig) {\n return {\n scavio_extract: scavioExtract(config),\n scavio_search: scavioSearch(config),\n scavio_youtube_search: scavioYoutubeSearch(config),\n scavio_youtube_video: scavioYoutubeVideo(config),\n scavio_youtube_transcript: scavioYoutubeTranscript(config),\n scavio_youtube_comments: scavioYoutubeComments(config),\n scavio_youtube_channel: scavioYoutubeChannel(config),\n scavio_reddit_search: scavioRedditSearch(config),\n scavio_amazon_search: scavioAmazonSearch(config),\n scavio_amazon_offers: scavioAmazonOffers(config),\n scavio_walmart_search: scavioWalmartSearch(config),\n scavio_tiktok_search: scavioTiktokSearch(config),\n scavio_instagram_search: scavioInstagramSearch(config),\n ...(config?.enableCrawl\n ? {\n scavio_map_website: scavioMapWebsite(config),\n scavio_crawl_website: scavioCrawlWebsite(config),\n scavio_crawl_status: scavioCrawlStatus(config),\n scavio_batch_extract: scavioBatchExtract(config),\n scavio_batch_status: scavioBatchStatus(config),\n }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scavio/ai-sdk",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "Scavio search, URL-extraction and website crawl tools for the Vercel AI SDK (extract any URL, map, crawl and batch-extract sites, plus Google, YouTube, Reddit, Amazon, Walmart, TikTok, Instagram).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|