{"_id":"@agntk/search","_rev":"3-1c43aca5b2cf117dbb0842d7d51841f8","name":"@agntk/search","dist-tags":{"latest":"1.2.7"},"versions":{"1.0.0":{"name":"@agntk/search","version":"1.0.0","keywords":["web-search","ai-agent","duckduckgo","searxng","tavily"],"license":"MIT","_id":"@agntk/search@1.0.0","maintainers":[{"name":"agntk","email":"randyrowanwilson@gmail.com"}],"homepage":"https://github.com/agntk/agntk#readme","bugs":{"url":"https://github.com/agntk/agntk/issues"},"dist":{"shasum":"47e4c00597e9d13abe0dee628c91594e14da6e0b","tarball":"https://registry.npmjs.org/@agntk/search/-/search-1.0.0.tgz","fileCount":50,"integrity":"sha512-X4ypQuv/0OJFwfSALFxGPro9Rd4GjMSX4sQOBfPw/ES6yshMUKETvokxsaFVwav7h3nH9YEogRKhGJb06hUOVQ==","signatures":[{"sig":"MEQCICakJOYkkHNUQ9YrmQtw0v5Ik0qXJGYJ04OIPgpMc4zGAiBrxDb9rnhR0B4YD7HYLAJilq7aFogSQJISP/ENZI3eUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73940},"main":"./dist/index.js","type":"module","_from":"file:agntk-search-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./extract":{"types":"./dist/extract.d.ts","import":"./dist/extract.js","default":"./dist/extract.js"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","default":"./dist/providers/index.js"}},"scripts":{"dev":"tsc --watch","test":"vitest","build":"tsc && node ../../scripts/fix-esm-imports.mjs ./dist","clean":"rm -rf dist"},"_npmUser":{"name":"agntk","email":"randyrowanwilson@gmail.com"},"_resolved":"/private/var/folders/rf/5xryjvbd4n96mdl5n7swnzzc0000gn/T/e05642d589cbdf2c834bb8f566532b77/agntk-search-1.0.0.tgz","_integrity":"sha512-X4ypQuv/0OJFwfSALFxGPro9Rd4GjMSX4sQOBfPw/ES6yshMUKETvokxsaFVwav7h3nH9YEogRKhGJb06hUOVQ==","repository":{"url":"git+https://github.com/agntk/agntk.git","type":"git","directory":"packages/search"},"_npmVersion":"10.8.2","description":"Multi-provider web search with fallback chain for AI agents","directories":{},"_nodeVersion":"22.6.0","dependencies":{"zod":"^3.25.76","cheerio":"^1.0.0","@agntk/logger":"1.0.0","duck-duck-scrape":"^2.2.7"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.3","typescript":"^5.7.3","@types/node":"^20.17.19","@agntk/config-typescript":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/search_1.0.0_1772627152904_0.564364980696886","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@agntk/search","version":"1.0.3","keywords":["web-search","ai-agent","duckduckgo","searxng","tavily"],"license":"MIT","_id":"@agntk/search@1.0.3","maintainers":[{"name":"agntk","email":"randyrowanwilson@gmail.com"}],"homepage":"https://github.com/agntk/agntk#readme","bugs":{"url":"https://github.com/agntk/agntk/issues"},"dist":{"shasum":"c4638fdb115cb03d67f9c098f9a5361374930c23","tarball":"https://registry.npmjs.org/@agntk/search/-/search-1.0.3.tgz","fileCount":51,"integrity":"sha512-rYJCK17vgB/KQLLEB70zBOZhj9gpjGABs9787zMdJftwhrTYnjVrMhNpCVdObyo36kowsgyZEJXBUVbT3ME8Xg==","signatures":[{"sig":"MEUCIEpx/I1jC/uCgvv4V8YXr6rcU0vL8HKhfjifMH3lAcFGAiEAvZ9vJPDZ5feOUsKTRBGUeLnFqkmk6aaxmL9/tGpI2tM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77759},"main":"./dist/index.js","type":"module","_from":"file:agntk-search-1.0.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./extract":{"types":"./dist/extract.d.ts","import":"./dist/extract.js","default":"./dist/extract.js"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","default":"./dist/providers/index.js"}},"scripts":{"dev":"tsc --watch","test":"vitest","build":"tsc && node ../../scripts/fix-esm-imports.mjs ./dist","clean":"rm -rf dist"},"_npmUser":{"name":"agntk","email":"randyrowanwilson@gmail.com"},"_resolved":"/private/var/folders/rf/5xryjvbd4n96mdl5n7swnzzc0000gn/T/fe9fa412b7f37dd66aff83ad7e1737e6/agntk-search-1.0.3.tgz","_integrity":"sha512-rYJCK17vgB/KQLLEB70zBOZhj9gpjGABs9787zMdJftwhrTYnjVrMhNpCVdObyo36kowsgyZEJXBUVbT3ME8Xg==","repository":{"url":"git+https://github.com/agntk/agntk.git","type":"git","directory":"packages/search"},"_npmVersion":"10.9.4","description":"Multi-provider web search with fallback chain for AI agents","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","cheerio":"^1.2.0","@agntk/logger":"1.2.5","duck-duck-scrape":"^2.2.7"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.1","typescript":"^5.7.3","@types/node":"^25.5.0","@agntk/config-typescript":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/search_1.0.3_1774487185015_0.05451635312826819","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"@agntk/search","version":"1.2.7","type":"module","description":"Multi-provider web search with fallback chain for AI agents","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./providers":{"types":"./dist/providers/index.d.ts","import":"./dist/providers/index.js","default":"./dist/providers/index.js"},"./extract":{"types":"./dist/extract.d.ts","import":"./dist/extract.js","default":"./dist/extract.js"}},"dependencies":{"cheerio":"^1.2.0","duck-duck-scrape":"^2.2.7","zod":"^4.3.6","@agntk/logger":"1.2.7"},"devDependencies":{"@types/node":"^25.5.0","typescript":"^5.7.3","vitest":"^4.1.2","@agntk/config-typescript":"0.1.0"},"repository":{"type":"git","url":"git+https://github.com/Phoenixrr2113/agntk.git","directory":"packages/search"},"homepage":"https://github.com/Phoenixrr2113/agntk#readme","bugs":{"url":"https://github.com/Phoenixrr2113/agntk/issues"},"engines":{"node":">=20.0.0"},"keywords":["web-search","ai-agent","duckduckgo","searxng","tavily"],"license":"MIT","scripts":{"build":"tsc && node ../../scripts/fix-esm-imports.mjs ./dist","dev":"tsc --watch","test":"vitest","clean":"rm -rf dist"},"_id":"@agntk/search@1.2.7","_integrity":"sha512-mYXEpxuHJUOXNZiDEfP4clehByzY0QGg4uE8lLHrOJ8Xj72hzjmzzL1jgwdJ3E6qfLhaRjWc/SXDbPFmoSpV5A==","_resolved":"/tmp/27c93b1d0c81118a0dea8ca2ebcfd202/agntk-search-1.2.7.tgz","_from":"file:agntk-search-1.2.7.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-mYXEpxuHJUOXNZiDEfP4clehByzY0QGg4uE8lLHrOJ8Xj72hzjmzzL1jgwdJ3E6qfLhaRjWc/SXDbPFmoSpV5A==","shasum":"141386b8e48aee3bd44bd69c60eeb8d4c949c7ab","tarball":"https://registry.npmjs.org/@agntk/search/-/search-1.2.7.tgz","fileCount":51,"unpackedSize":77783,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGQdkER8VJiqMC0kvbczm+bNBS608bcjqj44B1in3f9dAiBXmDuildw9bQg1xZ+ewc7Z9LsmEKoGk5aSCccb0WA4GQ=="}]},"_npmUser":{"name":"agntk","email":"randyrowanwilson@gmail.com"},"directories":{},"maintainers":[{"name":"agntk","email":"randyrowanwilson@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/search_1.2.7_1775307407606_0.35638466825864445"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-04T12:25:52.754Z","modified":"2026-04-04T12:56:47.868Z","1.0.0":"2026-03-04T12:25:53.053Z","1.0.3":"2026-03-26T01:06:25.164Z","1.2.7":"2026-04-04T12:56:47.761Z"},"bugs":{"url":"https://github.com/Phoenixrr2113/agntk/issues"},"license":"MIT","homepage":"https://github.com/Phoenixrr2113/agntk#readme","keywords":["web-search","ai-agent","duckduckgo","searxng","tavily"],"repository":{"type":"git","url":"git+https://github.com/Phoenixrr2113/agntk.git","directory":"packages/search"},"description":"Multi-provider web search with fallback chain for AI agents","maintainers":[{"name":"agntk","email":"randyrowanwilson@gmail.com"}],"readme":"# @agntk/search\n\n[![npm version](https://img.shields.io/npm/v/@agntk/search.svg)](https://www.npmjs.com/package/@agntk/search)\n[![license](https://img.shields.io/npm/l/@agntk/search.svg)](https://github.com/agntk/agntk/blob/main/LICENSE)\n\nMulti-provider web search with automatic fallback chain. Works out of the box with DuckDuckGo (no API key needed) and falls back across providers when one fails.\n\n## Installation\n\n```bash\npnpm add @agntk/search\n```\n\n## Quick Start\n\n```typescript\nimport { search } from '@agntk/search';\n\nconst response = await search('node.js best practices 2026');\nconsole.log(response.results); // [{ title, url, snippet, source }]\nconsole.log(response.provider); // 'duckduckgo'\n```\n\n## Search Client\n\nFor more control, create a client with custom configuration:\n\n```typescript\nimport { createSearchClient } from '@agntk/search';\n\nconst client = createSearchClient({\n  provider: 'tavily', // explicit provider\n  defaults: { maxResults: 5, safeSearch: 'strict' },\n});\n\n// Search\nconst results = await client.search('AI agent frameworks');\n\n// Search + extract page content\nconst { results, extracted } = await client.searchAndExtract('typescript patterns', {\n  extractTop: 3, // extract content from top 3 results\n});\n\n// Extract a single URL\nconst content = await client.extract('https://example.com/article');\nconsole.log(content.content); // cleaned text\nconsole.log(content.estimatedTokens); // ~token count\n```\n\n## Providers\n\nProviders are auto-detected based on available API keys and resolved in fallback order:\n\n| Provider   | API Key Required | Env Variable     | Default Priority |\n| ---------- | ---------------- | ---------------- | ---------------- |\n| DuckDuckGo | No               | —                | 1st              |\n| Brave      | Yes              | `BRAVE_API_KEY`  | 2nd              |\n| Tavily     | Yes              | `TAVILY_API_KEY` | 3rd              |\n| SearXNG    | No (self-hosted) | `SEARXNG_URL`    | 4th              |\n\nForce a specific provider:\n\n```bash\nexport SEARCH_PROVIDER=tavily\nexport TAVILY_API_KEY=tvly-...\n```\n\nOr configure programmatically:\n\n```typescript\nconst client = createSearchClient({\n  provider: 'brave',\n  providers: {\n    brave: { apiKey: 'BSA...' },\n  },\n});\n```\n\n## Search Options\n\n```typescript\ninterface SearchOptions {\n  maxResults?: number; // default: 10\n  region?: string; // e.g. 'us-en'\n  safeSearch?: 'off' | 'moderate' | 'strict'; // default: 'moderate'\n  timeRange?: 'day' | 'week' | 'month' | 'year';\n  timeout?: number; // default: 15000ms\n}\n```\n\n## Content Extraction\n\nExtract and clean page content from any URL:\n\n```typescript\nimport { extractContent } from '@agntk/search';\n\nconst page = await extractContent('https://example.com/docs', {\n  maxLength: 50000, // max characters (default: 50000)\n  timeout: 10000, // fetch timeout ms\n});\n\nconsole.log(page.title);\nconsole.log(page.content); // cleaned text, scripts/nav/ads removed\nconsole.log(page.estimatedTokens);\n```\n\n## Exports\n\n| Export Path               | Contents                                                                    |\n| ------------------------- | --------------------------------------------------------------------------- |\n| `@agntk/search`           | `search`, `createSearchClient`, `extractContent`, provider factories, types |\n| `@agntk/search/providers` | Individual provider factories                                               |\n| `@agntk/search/extract`   | `extractContent` standalone                                                 |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}