{"id":"3355e798-f8aa-4bc4-92ed-24ab6347ed83","entityType":"agent","slug":"clawhub-barneyjm-tavily-best-practices","name":"Tavily Best Practices","canonicalUrl":"https://www.xpersona.co/agent/clawhub-barneyjm-tavily-best-practices","canonicalPath":"/agent/clawhub-barneyjm-tavily-best-practices","generatedAt":"2026-10-10T07:42:36.473Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":null},"description":"Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents. Skill: Tavily Best Practices Owner: barneyjm Summary: Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents. Tags: latest:0.1.0 Version history: v0.1.0 | 2026-02-03T15:27:32.248Z | auto","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s175g00ed7n2ej0r13jbm8m3k18842ww:tavily-best-practices","sourceUrl":"https://clawhub.ai/barneyjm/tavily-best-practices","homepage":"https://clawhub.ai/barneyjm/skills/tavily-best-practices","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/barneyjm/tavily-best-practices","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/barneyjm/skills/tavily-best-practices","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, et"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":null},"stars":null,"forks":null,"downloads":1733,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T03:29:59.974Z","lastCrawledAt":"2026-10-10T03:29:59.974Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T03:29:59.974Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-02-03T15:27:32.248Z","changelog":"- Initial release of tavily-best-practices skill. - Provides reference documentation for production-ready Tavily integrations, including best practices. - Covers usage for web search, content extraction, crawling, research, and agentic workflows. - Includes SDK quickstart and parameter guides for Python and JavaScript. - Links to detailed guides for search, extraction, crawling, research, and integrations.","fileCount":8,"zipByteSize":24288}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s175g00ed7n2ej0r13jbm8m3k18842ww:tavily-best-practices","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T07:42:36.472Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-barneyjm-tavily-best-practices/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":null},"readme":"Skill: Tavily Best Practices\n\nOwner: barneyjm\n\nSummary: Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents.\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-02-03T15:27:32.248Z | auto\n\n- Initial release of tavily-best-practices skill.\n- Provides reference documentation for production-ready Tavily integrations, including best practices.\n- Covers usage for web search, content extraction, crawling, research, and agentic workflows.\n- Includes SDK quickstart and parameter guides for Python and JavaScript.\n- Links to detailed guides for search, extraction, crawling, research, and integrations.\n\nArchive index:\n\nArchive v0.1.0: 8 files, 24288 bytes\n\nFiles: references/crawl.md (10204b), references/extract.md (7381b), references/integrations.md (9182b), references/research.md (10090b), references/sdk.md (8353b), references/search.md (12689b), SKILL.md (5005b), _meta.json (140b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: tavily-best-practices\ndescription: \"Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents.\"\n---\n\n# Tavily\n\nTavily is a search API designed for LLMs, enabling AI applications to access real-time web data.\n\n## Prerequisites\n\n**Tavily API Key Required** - Get your key at https://app.tavily.com (1,000 free API credits/month, no credit card required)\n\nAdd to `~/.claude/settings.json`:\n```json\n{\n  \"env\": {\n    \"TAVILY_API_KEY\": \"tvly-YOUR_API_KEY\"\n  }\n}\n```\n\nRestart Claude Code after adding your API key.\n\n## Installation\n\n**Python:**\n```bash\npip install tavily-python\n```\n\n**JavaScript:**\n```bash\nnpm install @tavily/core\n```\n\nSee **[references/sdk.md](references/sdk.md)** for complete SDK reference.\n\n## Client Initialization\n\n```python\nfrom tavily import TavilyClient\n\n# Option 1: Uses TAVILY_API_KEY env var (recommended)\nclient = TavilyClient()\n\n# Option 2: Explicit API key\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\")\n\n# Option 3: With project tracking (for usage organization)\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\", project_id=\"your-project-id\")\n\n# Async client for parallel queries\nfrom tavily import AsyncTavilyClient\nasync_client = AsyncTavilyClient()\n```\n\n## Choosing the Right Method\n\n**For custom agents/workflows:**\n\n| Need | Method |\n|------|--------|\n| Web search results | `search()` |\n| Content from specific URLs | `extract()` |\n| Content from entire site | `crawl()` |\n| URL discovery from site | `map()` |\n\n**For out-of-the-box research:**\n\n| Need | Method |\n|------|--------|\n| End-to-end research with AI synthesis | `research()` |\n\n## Quick Reference\n\n### search() - Web Search\n\n```python\nresponse = client.search(\n    query=\"quantum computing breakthroughs\",  # Keep under 400 chars\n    max_results=10,\n    search_depth=\"advanced\",  # 2 credits, highest relevance\n    topic=\"general\"  # or \"news\", \"finance\"\n)\n\nfor result in response[\"results\"]:\n    print(f\"{result['title']}: {result['score']}\")\n```\n\nKey parameters: `query`, `max_results`, `search_depth` (ultra-fast/fast/basic/advanced), `topic`, `include_domains`, `exclude_domains`, `time_range`\n\n### extract() - URL Content Extraction\n\n```python\n# Two-step pattern (recommended for control)\nsearch_results = client.search(query=\"Python async best practices\")\nurls = [r[\"url\"] for r in search_results[\"results\"] if r[\"score\"] > 0.5]\nextracted = client.extract(\n    urls=urls[:20],\n    query=\"async patterns\",  # Reranks chunks by relevance\n    chunks_per_source=3  # Prevents context explosion\n)\n```\n\nKey parameters: `urls` (max 20), `extract_depth`, `query`, `chunks_per_source` (1-5)\n\n### crawl() - Site-Wide Extraction\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    instructions=\"Find API documentation pages\",  # Semantic focus\n    chunks_per_source=3,  # Token optimization\n    select_paths=[\"/docs/.*\", \"/api/.*\"]\n)\n```\n\nKey parameters: `url`, `max_depth`, `max_breadth`, `limit`, `instructions`, `chunks_per_source`, `select_paths`, `exclude_paths`\n\n### map() - URL Discovery\n\n```python\nresponse = client.map(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    instructions=\"Find all API and guide pages\"\n)\napi_docs = [url for url in response[\"results\"] if \"/api/\" in url]\n```\n\n### research() - AI-Powered Research\n\n```python\nimport time\n\n# For comprehensive multi-topic research\nresult = client.research(\n    input=\"Analyze competitive landscape for X in SMB market\",\n    model=\"pro\"  # or \"mini\" for focused queries, \"auto\" when unsure\n)\nrequest_id = result[\"request_id\"]\n\n# Poll until completed\nresponse = client.get_research(request_id)\nwhile response[\"status\"] not in [\"completed\", \"failed\"]:\n    time.sleep(10)\n    response = client.get_research(request_id)\n\nprint(response[\"content\"])  # The research report\n```\n\nKey parameters: `input`, `model` (\"mini\"/\"pro\"/\"auto\"), `stream`, `output_schema`, `citation_format`\n\n## Detailed Guides\n\nFor complete parameters, response fields, patterns, and examples:\n\n- **[references/sdk.md](references/sdk.md)** - Python & JavaScript SDK reference, async patterns, Hybrid RAG\n- **[references/search.md](references/search.md)** - Query optimization, search depth selection, domain filtering, async patterns, post-filtering\n- **[references/extract.md](references/extract.md)** - One-step vs two-step extraction, query/chunks for targeting, advanced mode\n- **[references/crawl.md](references/crawl.md)** - Crawl vs Map, instructions for semantic focus, use cases, Map-then-Extract pattern\n- **[references/research.md](references/research.md)** - Prompting best practices, model selection, streaming, structured output schemas\n- **[references/integrations.md](references/integrations.md)** - LangChain, LlamaIndex, CrewAI, Vercel AI SDK, and framework integrations\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7e3j3w1x5et0yppacy4m90y18084ba\",\n  \"slug\": \"tavily-best-practices\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1770132452248\n}\n\nFile v0.1.0:references/crawl.md\n\n# Crawl & Map API Reference\n\n## Table of Contents\n\n- [Crawl vs Map](#crawl-vs-map)\n- [Key Parameters](#key-parameters)\n- [Instructions and Chunks](#instructions-and-chunks)\n- [Path and Domain Filtering](#path-and-domain-filtering)\n- [Use Cases](#use-cases)\n- [Map then Extract Pattern](#map-then-extract-pattern)\n- [Performance Optimization](#performance-optimization)\n- [Common Pitfalls](#common-pitfalls)\n- [Response Fields](#response-fields)\n- [Summary](#summary)\n\n---\n\n## Crawl vs Map\n\n| Feature | Crawl | Map |\n|---------|-------|-----|\n| **Returns** | Full content | URLs only |\n| **Speed** | Slower | Faster |\n| **Best for** | RAG, deep analysis, documentation | Site structure discovery, URL collection |\n\n**Use Crawl when:**\n- Full content extraction needed\n- Building RAG systems\n- Processing paginated/nested content\n- Integration with knowledge bases\n\n**Use Map when:**\n- Quick site structure discovery\n- URL collection without content\n- Planning before crawling\n- Sitemap generation\n\n---\n\n## Key Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | string | Required | Root URL to begin |\n| `max_depth` | integer | 1 | Levels deep to crawl (1-5). **Start with 1-2** |\n| `max_breadth` | integer | 20 | Links per page. 50-100 for focused crawls |\n| `limit` | integer | 50 | Total pages cap |\n| `instructions` | string | null | Natural language guidance (2 credits/10 pages) |\n| `chunks_per_source` | integer | 3 | Chunks per page (1-5). Only with `instructions` |\n| `extract_depth` | enum | `\"basic\"` | `\"basic\"` (1 credit/5 URLs) or `\"advanced\"` (2 credits/5 URLs) |\n| `format` | enum | `\"markdown\"` | `\"markdown\"` or `\"text\"` |\n| `select_paths` | array | null | Regex patterns to include |\n| `exclude_paths` | array | null | Regex patterns to exclude |\n| `select_domains` | array | null | Regex for domains to include |\n| `exclude_domains` | array | null | Regex for domains to exclude |\n| `allow_external` | boolean | true (crawl) / false (map) | Include external domain links |\n| `include_images` | boolean | false | Include images (crawl only) |\n| `include_favicon` | boolean | false | Include favicon URL (crawl only) |\n| `include_usage` | boolean | false | Include credit usage info |\n| `timeout` | float | 150 | Max wait (10-150 seconds) |\n\n---\n\n## Instructions and Chunks\n\nUse `instructions` and `chunks_per_source` for semantic focus and token optimization:\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    instructions=\"Find all documentation about authentication and security\",\n    chunks_per_source=3  # Only top 3 relevant chunks per page\n)\n```\n\n**Key benefits:**\n- `instructions` guides crawler semantically, focusing on relevant content\n- `chunks_per_source` returns only relevant snippets (max 500 chars each)\n- Prevents context window explosion in agentic use cases\n- Chunks appear in `raw_content` as: `<chunk 1> [...] <chunk 2> [...] <chunk 3>`\n\n**Note:** `chunks_per_source` only works when `instructions` is provided.\n\n---\n\n## Path and Domain Filtering\n\n### Path patterns (regex)\n\n```python\n# Target specific sections\nresponse = client.crawl(\n    url=\"https://example.com\",\n    select_paths=[\"/docs/.*\", \"/api/.*\", \"/guides/.*\"],\n    exclude_paths=[\"/blog/.*\", \"/changelog/.*\", \"/private/.*\"]\n)\n\n# Paginated content\nresponse = client.crawl(\n    url=\"https://example.com/blog\",\n    max_depth=2,\n    select_paths=[\"/blog/.*\", \"/blog/page/.*\"],\n    exclude_paths=[\"/blog/tag/.*\"]\n)\n```\n\n### Domain control (regex)\n\n```python\n# Stay within subdomain\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    select_domains=[\"^docs.example.com$\"],\n    max_depth=2\n)\n\n# Exclude specific domains\nresponse = client.crawl(\n    url=\"https://example.com\",\n    exclude_domains=[\"^ads.example.com$\", \"^tracking.example.com$\"]\n)\n```\n\n---\n\n## Use Cases\n\n### 1. Deep/Unlinked Content\nDeeply nested pages, paginated archives, internal search-only content.\n\n```python\nresponse = client.crawl(\n    url=\"https://example.com\",\n    max_depth=3,\n    max_breadth=50,\n    limit=200,\n    select_paths=[\"/blog/.*\", \"/changelog/.*\"],\n    exclude_paths=[\"/private/.*\", \"/admin/.*\"]\n)\n```\n\n### 2. Documentation/Structured Content\nDocumentation, changelogs, FAQs with nonstandard markup.\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    extract_depth=\"advanced\",\n    select_paths=[\"/docs/.*\"]\n)\n```\n\n### 3. Multi-modal/Cross-referencing\nCombining information from multiple sections.\n\n```python\nresponse = client.crawl(\n    url=\"https://example.com\",\n    max_depth=2,\n    instructions=\"Find all documentation pages that link to API reference docs\",\n    extract_depth=\"advanced\"\n)\n```\n\n### 4. Rapidly Changing Content\nAPI docs, product announcements, news sections.\n\n```python\nresponse = client.crawl(\n    url=\"https://api.example.com\",\n    max_depth=1,\n    max_breadth=100\n)\n```\n\n### 5. RAG/Knowledge Base Integration\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    extract_depth=\"advanced\",\n    include_images=True,\n    instructions=\"Extract all technical documentation and code examples\"\n)\n```\n\n### 6. Compliance/Auditing\nComprehensive content analysis for legal checks.\n\n```python\nresponse = client.crawl(\n    url=\"https://example.com\",\n    max_depth=3,\n    max_breadth=100,\n    limit=1000,\n    extract_depth=\"advanced\",\n    instructions=\"Find all mentions of GDPR and data protection policies\"\n)\n```\n\n### 7. Known URL Patterns\nSitemap-based crawling, section-specific extraction.\n\n```python\nresponse = client.crawl(\n    url=\"https://example.com\",\n    max_depth=1,\n    select_paths=[\"/docs/.*\", \"/api/.*\", \"/guides/.*\"],\n    exclude_paths=[\"/private/.*\", \"/admin/.*\"]\n)\n```\n\n---\n\n## Map then Extract Pattern\n\nConsider using Map before Crawl/Extract to plan your strategy:\n\n1. **Use Map** to get site structure\n2. **Analyze** paths and patterns\n3. **Configure** Crawl or Extract with discovered paths\n4. **Execute** focused extraction\n\n```python\n# Step 1: Map to discover structure\nmap_result = client.map(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    instructions=\"Find all API docs and guides\"\n)\n\n# Step 2: Filter discovered URLs\napi_docs = [url for url in map_result[\"results\"] if \"/api/\" in url]\nguides = [url for url in map_result[\"results\"] if \"/guides/\" in url]\nprint(f\"Found {len(api_docs)} API docs, {len(guides)} guides\")\n\n# Step 3: Extract from filtered URLs\ntarget_urls = api_docs + guides\nresponse = client.extract(\n    urls=target_urls[:20],  # Max 20 per extract call\n    extract_depth=\"advanced\",\n    query=\"API endpoints and usage examples\",\n    chunks_per_source=3\n)\n```\n\n**Benefits:**\n- Discover site structure before committing to full crawl\n- Identify relevant path patterns\n- Avoid unnecessary extraction\n- More control over what gets extracted\n\n---\n\n## Performance Optimization\n\n### Depth vs Performance\n\nEach depth level increases crawl time exponentially:\n\n| Depth | Typical Pages | Time |\n|-------|---------------|------|\n| 1 | 10-50 | Seconds |\n| 2 | 50-500 | Minutes |\n| 3 | 500-5000 | Many minutes |\n\n**Best practices:**\n- Start with `max_depth=1` and increase only if needed\n- Use `max_breadth` to control horizontal expansion\n- Set appropriate `limit` to prevent excessive crawling\n- Process results incrementally rather than waiting for full crawl\n\n### Rate Limiting\n\n- Respect site's robots.txt\n- Monitor API usage and limits\n- Use appropriate error handling for rate limits\n- Consider delays between large crawl operations\n\n### Conservative vs Comprehensive\n\n```python\n# Conservative (start here)\nresponse = client.crawl(\n    url=\"https://example.com\",\n    max_depth=1,\n    max_breadth=20,\n    limit=20\n)\n\n# Comprehensive (use carefully)\nresponse = client.crawl(\n    url=\"https://example.com\",\n    max_depth=3,\n    max_breadth=100,\n    limit=500\n)\n```\n\n---\n\n## Common Pitfalls\n\n| Problem | Impact | Solution |\n|---------|--------|----------|\n| Excessive depth (`max_depth=4+`) | Exponential time, unnecessary pages | Start with 1-2, increase if needed |\n| Unfocused crawling | Wasted resources, irrelevant content, context explosion | Use `instructions` to focus semantically |\n| Missing limits | Runaway crawls, unexpected costs | Always set reasonable `limit` value |\n| Ignoring `failed_results` | Incomplete data, missed content | Monitor and adjust parameters |\n| Full content without chunks | Context window explosion | Use `instructions` + `chunks_per_source` |\n\n---\n\n## Response Fields\n\n### Crawl Response\n\n| Field | Description |\n|-------|-------------|\n| `base_url` | The URL you started the crawl from |\n| `results` | List of crawled pages |\n| `results[].url` | Page URL |\n| `results[].raw_content` | Extracted content (or chunks if instructions provided) |\n| `results[].images` | Image URLs extracted from the page |\n| `results[].favicon` | Favicon URL (if `include_favicon=True`) |\n| `response_time` | Time in seconds |\n| `request_id` | Unique identifier for support reference |\n\n### Map Response\n\n| Field | Description |\n|-------|-------------|\n| `base_url` | The URL you started the mapping from |\n| `results` | List of discovered URLs |\n| `response_time` | Time in seconds |\n| `request_id` | Unique identifier for support reference |\n\n---\n\n## Summary\n\n1. **Use instructions and chunks_per_source** for focused, relevant results in agentic use cases\n2. **Start conservative** (`max_depth=1`, `max_breadth=20`) and scale up as needed\n3. **Use path patterns** to focus crawling on relevant content\n4. **Choose appropriate extract_depth** based on content complexity\n5. **Always set a limit** to prevent runaway crawls and unexpected costs\n6. **Monitor failed_results** and adjust patterns accordingly\n7. **Use Map first** to understand site structure before committing to full crawl\n8. **Implement error handling** for rate limits and failures\n9. **Respect robots.txt** and site policies\n\n> Crawling is powerful but resource-intensive. Focus your crawls, start small, monitor results, and scale gradually based on actual needs.\n\nFor more details, see the [full API reference](https://docs.tavily.com/documentation/api-reference/endpoint/crawl)\n\nFile v0.1.0:references/extract.md\n\n# Extract API Reference\n\n## Table of Contents\n\n- [Extraction Approaches](#extraction-approaches)\n- [Key Parameters](#key-parameters)\n- [Query and Chunks](#query-and-chunks)\n- [Extract Depth](#extract-depth)\n- [Advanced Filtering Strategies](#advanced-filtering-strategies)\n- [Response Fields](#response-fields)\n- [Summary](#summary)\n\n---\n\n## Extraction Approaches\n\n### Search with include_raw_content\n\nGet search results and content in one call:\n\n```python\nresponse = client.search(\n    query=\"AI healthcare applications\",\n    include_raw_content=True,\n    max_results=5\n)\n```\n\n**When to use:**\n- Quick prototyping\n- Simple queries where search results are likely relevant\n- Single API call convenience\n\n### Direct Extract API (Recommended)\n\nTwo-step pattern for more control:\n\n```python\n# Step 1: Search\nsearch_results = client.search(\n    query=\"Python async best practices\",\n    max_results=10\n)\n\n# Step 2: Filter by relevance score\nrelevant_urls = [\n    r[\"url\"] for r in search_results[\"results\"]\n    if r[\"score\"] > 0.5\n]\n\n# Step 3: Extract with targeting\nextracted = client.extract(\n    urls=relevant_urls[:20],\n    query=\"async patterns and concurrency\",  # Reranks chunks\n    chunks_per_source=3  # Prevents context explosion\n)\n\nfor item in extracted[\"results\"]:\n    print(f\"URL: {item['url']}\")\n    print(f\"Content: {item['raw_content'][:500]}...\")\n```\n\n**When to use:**\n- You want control over which URLs to extract\n- You need to filter/curate URLs before extraction\n- You want targeted extraction with query and chunks_per_source\n\n---\n\n## Key Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `urls` | string/array | Required | Single URL or list (max 20) |\n| `extract_depth` | enum | `\"basic\"` | `\"basic\"` or `\"advanced\"` (for complex/JS pages) |\n| `query` | string | null | Reranks chunks by relevance to this query |\n| `chunks_per_source` | integer | 3 | Chunks per source (1-5, max 500 chars each). Only with `query` |\n| `format` | enum | `\"markdown\"` | Output: `\"markdown\"` or `\"text\"` |\n| `include_images` | boolean | false | Include image URLs |\n| `include_favicon` | boolean | false | Include favicon URL |\n| `include_usage` | boolean | false | Include credit consumption data in response |\n| `timeout` | float | varies | Max wait time (1.0-60.0 seconds) |\n\n---\n\n## Query and Chunks\n\nUse `query` and `chunks_per_source` to get only relevant content and prevent context window explosion:\n\n```python\nextracted = client.extract(\n    urls=[\n        \"https://example.com/ml-healthcare\",\n        \"https://example.com/ai-diagnostics\",\n        \"https://example.com/medical-ai\"\n    ],\n    query=\"AI diagnostic tools accuracy\",\n    chunks_per_source=2  # 2 most relevant chunks per URL\n)\n```\n\n**When to use query:**\n- To extract only relevant portions of long documents\n- When you need focused content instead of full page extraction\n- For targeted information retrieval from specific URLs\n\n**Key benefits of chunks_per_source:**\n- Returns only relevant snippets (max 500 chars each) instead of full page\n- Chunks appear in `raw_content` as: `<chunk 1> [...] <chunk 2> [...] <chunk 3>`\n- Prevents context window from exploding in agentic use cases\n\n**Note:** `chunks_per_source` only works when `query` is provided.\n\n---\n\n## Extract Depth\n\n| Depth | When to use |\n|-------|-------------|\n| `basic` (default) | Simple text extraction, faster |\n| `advanced` | Dynamic/JS-rendered pages, tables, structured data, embedded media |\n\n```python\n# For complex pages\nextracted = client.extract(\n    urls=[\"https://example.com/complex-page\"],\n    extract_depth=\"advanced\"\n)\n```\n\n**Fallback strategy:** If `basic` fails, retry with `advanced`:\n\n```python\nresult = client.extract(urls=[url], extract_depth=\"basic\")\nif url in [f[\"url\"] for f in result.get(\"failed_results\", [])]:\n    result = client.extract(urls=[url], extract_depth=\"advanced\")\n```\n\n**Timeout tuning:** If latency isn't critical, set `timeout=60.0` for better success on slow pages.\n\n---\n\n## Advanced Filtering Strategies\n\nBeyond query-based filtering, consider these approaches before extraction:\n\n| Strategy | When to use |\n|----------|-------------|\n| Score-based | Filter search results by relevance score |\n| Domain-based | Filter by trusted domains |\n| Re-ranking | Use dedicated re-ranking models for precision |\n| LLM-based | Let an LLM assess relevance before extraction |\n| Clustering | Group similar documents, extract from clusters |\n\n### Optimal Workflow\n\n1. **Search** to discover relevant URLs\n2. **Filter** by relevance score, domain, or content snippet\n3. **Re-rank** if needed using specialized models\n4. **Extract** from top-ranked sources with query and chunks_per_source\n5. **Validate** extracted content quality\n6. **Process** for your AI application\n\n### Example: Complete Pipeline\n\n```python\nimport asyncio\nfrom tavily import AsyncTavilyClient\n\nclient = AsyncTavilyClient()\n\nasync def content_pipeline(topic):\n    # 1. Search with sub-queries for breadth\n    queries = [\n        f\"{topic} overview\",\n        f\"{topic} best practices\",\n        f\"{topic} recent developments\"\n    ]\n    responses = await asyncio.gather(\n        *(client.search(q, search_depth=\"advanced\", max_results=10) for q in queries)\n    )\n\n    # 2. Filter and aggregate by score\n    urls = []\n    for response in responses:\n        urls.extend([\n            r['url'] for r in response['results']\n            if r['score'] > 0.5\n        ])\n\n    # 3. Deduplicate\n    urls = list(set(urls))[:20]\n\n    # 4. Extract with error handling\n    extracted = await asyncio.gather(\n        *(client.extract(urls=[url], query=topic, extract_depth=\"advanced\")\n          for url in urls),\n        return_exceptions=True\n    )\n\n    # 5. Filter successful extractions\n    return [e for e in extracted if not isinstance(e, Exception)]\n\nasyncio.run(content_pipeline(\"machine learning in healthcare\"))\n```\n\n---\n\n## Response Fields\n\n**Top-level response:**\n\n| Field | Description |\n|-------|-------------|\n| `results` | Array of successfully extracted content |\n| `failed_results` | Array of URLs that failed extraction |\n| `response_time` | Time in seconds |\n| `request_id` | Unique identifier for support reference |\n| `usage` | Credit usage info (if `include_usage=True`) |\n\n**Each result object:**\n\n| Field | Description |\n|-------|-------------|\n| `url` | The URL extracted from |\n| `raw_content` | Full content, or top-ranked chunks joined by `[...]` when `query` provided |\n| `images` | Array of image URLs (if `include_images=true`) |\n| `favicon` | Favicon URL (if `include_favicon=true`) |\n\n**Each failed_results object:**\n\n| Field | Description |\n|-------|-------------|\n| `url` | The URL that failed |\n| `error` | Error message |\n\n---\n\n## Summary\n\n1. **Use query and chunks_per_source** for targeted, focused extraction\n2. **Choose Extract API** when you need control over which URLs to extract from\n3. **Filter URLs** before extraction using scores, re-ranking, or domain trust\n4. **Choose appropriate extract_depth** based on content complexity\n5. **Process URLs concurrently** with async operations for better performance\n6. **Implement error handling** to manage failed extractions gracefully\n7. **Validate extracted content** before downstream processing\n\nFor more details, see the [full API reference](https://docs.tavily.com/documentation/api-reference/endpoint/extract)\n\nFile v0.1.0:references/integrations.md\n\n# Framework Integrations\n\n## Table of Contents\n\n- [LangChain](#langchain)\n- [LlamaIndex](#llamaindex)\n- [OpenAI Function Calling](#openai-function-calling)\n- [Anthropic Tool Use](#anthropic-tool-use)\n- [Vercel AI SDK](#vercel-ai-sdk)\n- [CrewAI](#crewai)\n- [No-Code Platforms](#no-code-platforms)\n\n---\n\n## LangChain\n\nThe `langchain-tavily` package is the official LangChain integration supporting Search, Extract, Map, Crawl, and Research.\n\n### Installation\n\n```bash\npip install -U langchain-tavily\n```\n\n### Search\n\n```python\nfrom langchain_tavily import TavilySearch\n\ntool = TavilySearch(\n    max_results=5,\n    topic=\"general\",  # or \"news\", \"finance\"\n    # search_depth=\"basic\",\n    # include_answer=False,\n    # include_raw_content=False,\n)\n\n# Direct invocation\nresult = tool.invoke({\"query\": \"What happened at Wimbledon?\"})\n\n# With agent\nfrom langchain.agents import create_agent\nfrom langchain_openai import ChatOpenAI\n\nagent = create_agent(\n    model=ChatOpenAI(model=\"gpt-4\"),\n    tools=[tool],\n    system_prompt=\"You are a helpful research assistant.\"\n)\nresponse = agent.invoke({\n    \"messages\": [{\"role\": \"user\", \"content\": \"What are the latest AI trends?\"}]\n})\n```\n\n**Dynamic parameters at invocation:**\n- `include_images`, `search_depth`, `time_range`, `include_domains`, `exclude_domains`, `start_date`, `end_date`\n\n### Extract\n\n```python\nfrom langchain_tavily import TavilyExtract\n\ntool = TavilyExtract(\n    extract_depth=\"basic\",  # or \"advanced\"\n    # include_images=False\n)\n\nresult = tool.invoke({\n    \"urls\": [\"https://en.wikipedia.org/wiki/Lionel_Messi\"]\n})\n```\n\n### Map\n\n```python\nfrom langchain_tavily import TavilyMap\n\ntool = TavilyMap()\n\nresult = tool.invoke({\n    \"url\": \"https://docs.example.com\",\n    \"instructions\": \"Find all documentation and tutorial pages\"\n})\n# Returns: {\"base_url\": ..., \"results\": [urls...], \"response_time\": ...}\n```\n\n### Crawl\n\n```python\nfrom langchain_tavily import TavilyCrawl\n\ntool = TavilyCrawl()\n\nresult = tool.invoke({\n    \"url\": \"https://docs.example.com\",\n    \"instructions\": \"Extract API documentation and code examples\"\n})\n# Returns: {\"base_url\": ..., \"results\": [{url, raw_content}...], \"response_time\": ...}\n```\n\n### Research\n\n```python\nfrom langchain_tavily import TavilyResearch, TavilyGetResearch\n\n# Start research\nresearch_tool = TavilyResearch(model=\"mini\")\nresult = research_tool.invoke({\n    \"input\": \"Research the latest developments in AI\",\n    \"citation_format\": \"apa\"\n})\n\n# Get results\nget_tool = TavilyGetResearch()\nfinal = get_tool.invoke({\"request_id\": result[\"request_id\"]})\n```\n\n---\n\n## LlamaIndex\n\n```python\nfrom llama_index.tools.tavily_research import TavilyToolSpec\n\n# Initialize tools\ntavily_tool = TavilyToolSpec(api_key=\"tvly-YOUR_API_KEY\")\ntools = tavily_tool.to_tool_list()\n\n# Use with agent\nfrom llama_index.agent.openai import OpenAIAgent\n\nagent = OpenAIAgent.from_tools(tools)\nresponse = agent.chat(\"What are the latest AI developments?\")\n```\n\n---\n\n## OpenAI Function Calling\n\nDefine Tavily as an OpenAI function:\n\n```python\nfrom openai import OpenAI\nfrom tavily import TavilyClient\nimport json\n\nopenai_client = OpenAI()\ntavily_client = TavilyClient()\n\ntools = [{\n    \"type\": \"function\",\n    \"function\": {\n        \"name\": \"web_search\",\n        \"description\": \"Search the web for current information\",\n        \"parameters\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"query\": {\n                    \"type\": \"string\",\n                    \"description\": \"The search query\"\n                }\n            },\n            \"required\": [\"query\"]\n        }\n    }\n}]\n\ndef handle_tool_call(tool_call):\n    if tool_call.function.name == \"web_search\":\n        args = json.loads(tool_call.function.arguments)\n        return tavily_client.search(args[\"query\"])\n\n# Chat completion with tools\nresponse = openai_client.chat.completions.create(\n    model=\"gpt-4\",\n    messages=[{\"role\": \"user\", \"content\": \"What are the latest AI trends?\"}],\n    tools=tools\n)\n\nif response.choices[0].message.tool_calls:\n    tool_call = response.choices[0].message.tool_calls[0]\n    search_results = handle_tool_call(tool_call)\n\n    # Continue conversation with results\n    messages = [\n        {\"role\": \"user\", \"content\": \"What are the latest AI trends?\"},\n        response.choices[0].message,\n        {\"role\": \"tool\", \"tool_call_id\": tool_call.id, \"content\": json.dumps(search_results)}\n    ]\n    final = openai_client.chat.completions.create(\n        model=\"gpt-4\",\n        messages=messages\n    )\n```\n\n---\n\n## Anthropic Tool Use\n\nDefine Tavily as an Anthropic tool:\n\n```python\nfrom anthropic import Anthropic\nfrom tavily import TavilyClient\nimport json\n\nanthropic_client = Anthropic()\ntavily_client = TavilyClient()\n\ntools = [{\n    \"name\": \"web_search\",\n    \"description\": \"Search the web for current information using Tavily\",\n    \"input_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n            \"query\": {\n                \"type\": \"string\",\n                \"description\": \"The search query\"\n            }\n        },\n        \"required\": [\"query\"]\n    }\n}]\n\ndef process_tool_use(tool_use):\n    if tool_use.name == \"web_search\":\n        return tavily_client.search(tool_use.input[\"query\"])\n\n# Initial request\nresponse = anthropic_client.messages.create(\n    model=\"claude-sonnet-4-20250514\",\n    max_tokens=1024,\n    tools=tools,\n    messages=[{\"role\": \"user\", \"content\": \"What are the latest AI trends?\"}]\n)\n\n# Handle tool use\nif response.stop_reason == \"tool_use\":\n    tool_use = next(b for b in response.content if b.type == \"tool_use\")\n    search_results = process_tool_use(tool_use)\n\n    # Continue with results\n    final = anthropic_client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        max_tokens=1024,\n        tools=tools,\n        messages=[\n            {\"role\": \"user\", \"content\": \"What are the latest AI trends?\"},\n            {\"role\": \"assistant\", \"content\": response.content},\n            {\"role\": \"user\", \"content\": [\n                {\"type\": \"tool_result\", \"tool_use_id\": tool_use.id, \"content\": json.dumps(search_results)}\n            ]}\n        ]\n    )\n```\n\n---\n\n## Vercel AI SDK\n\nThe `@tavily/ai-sdk` package provides pre-built tools for Vercel AI SDK v5.\n\n### Installation\n\n```bash\nnpm install ai @ai-sdk/openai @tavily/ai-sdk\n```\n\n### Usage\n\n```typescript\nimport { tavilySearch, tavilyCrawl } from \"@tavily/ai-sdk\";\nimport { generateText } from \"ai\";\nimport { openai } from \"@ai-sdk/openai\";\n\n// Search\nconst result = await generateText({\n  model: openai(\"gpt-4\"),\n  prompt: \"What are the latest AI developments?\",\n  tools: {\n    tavilySearch: tavilySearch({\n      maxResults: 5,\n      searchDepth: \"advanced\",\n    }),\n  },\n});\n\n// Crawl\nconst crawlResult = await generateText({\n  model: openai(\"gpt-4\"),\n  prompt: \"Crawl tavily.com and summarize their features\",\n  tools: {\n    tavilyCrawl: tavilyCrawl({\n      maxDepth: 2,\n      limit: 50,\n    }),\n  },\n});\n```\n\n**Available tools:** `tavilySearch`, `tavilyExtract`, `tavilyCrawl`, `tavilyMap`\n\n---\n\n## CrewAI\n\nCrewAI provides built-in Tavily tools for multi-agent workflows.\n\n### Installation\n\n```bash\npip install 'crewai[tools]'\n```\n\n### Usage\n\n```python\nimport os\nfrom crewai import Agent, Task, Crew\nfrom crewai_tools import TavilySearchTool, TavilyExtractTool\n\nos.environ[\"TAVILY_API_KEY\"] = \"your-api-key\"\n\n# Search tool\nsearch_tool = TavilySearchTool()\n\n# Create agent with Tavily\nresearcher = Agent(\n    role=\"Research Analyst\",\n    goal=\"Find and analyze information on given topics\",\n    tools=[search_tool],\n    backstory=\"Expert at finding relevant information online\"\n)\n\ntask = Task(\n    description=\"Research the latest developments in quantum computing\",\n    expected_output=\"A comprehensive summary with sources\",\n    agent=researcher\n)\n\ncrew = Crew(agents=[researcher], tasks=[task])\nresult = crew.kickoff()\n```\n\n---\n\n## No-Code Platforms\n\nTavily integrates with popular no-code automation platforms:\n\n| Platform | Features | Best For |\n|----------|----------|----------|\n| **Zapier** | Search, Extract | CRM enrichment, automated research |\n| **Make** | Search, Extract | Complex workflows, multi-step automations |\n| **n8n** | Search, Extract, AI Agent tool | Self-hosted, AI agent workflows |\n| **Dify** | Search, Extract | No-code AI apps, chatflows |\n| **FlowiseAI** | Search | Visual LLM builders, RAG systems |\n| **Langflow** | Search, Extract | Visual agent building |\n\n### Common Use Cases\n\n- **Lead enrichment**: Trigger on new CRM record → Search company info → Update record\n- **Market monitoring**: Schedule → Search industry news → Send digest\n- **Content research**: Trigger → Multi-search → LLM summarize → Store results\n\n---\n\n## Additional Integrations\n\n| Framework | Package/Tool | Notes |\n|-----------|--------------|-------|\n| Pydantic AI | `pydantic-ai-slim[tavily]` | Type-safe AI agents |\n| Google ADK | MCP Server | Gemini-powered agents |\n| Composio | Composio platform | Multi-tool orchestration |\n| Agno | `agno` + `tavily-python` | Lightweight agent framework |\n| Tines | Native integration | Security automation |\n\nSee the [full integrations documentation](https://docs.tavily.com/documentation/integrations) for complete guides.\n\nFile v0.1.0:references/research.md\n\n# Research API Reference\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Prompting Best Practices](#prompting-best-practices)\n- [Model Selection](#model-selection)\n- [Key Parameters](#key-parameters)\n- [Basic Usage](#basic-usage)\n- [Streaming vs Polling](#streaming-vs-polling)\n- [Structured Output vs Report](#structured-output-vs-report)\n- [Response Fields](#response-fields)\n- [Summary](#summary)\n\n---\n\n## Overview\n\nThe Research API conducts comprehensive research on any topic with automatic source gathering, analysis, and response generation with citations. It's an end-to-end solution when you need AI-powered research without building your own pipeline.\n\n---\n\n## Prompting Best Practices\n\nDefine a **clear goal** with all **details** and **direction**.\n\n**Guidelines:**\n- **Be specific when you can.** Include known details: target market, competitors, geography, constraints\n- **Stay open-ended only for discovery.** Make it explicit: \"tell me about the most impactful AI innovations in healthcare in 2025\"\n- **Avoid contradictions.** Don't include conflicting constraints or goals\n- **Share what's already known.** Include prior assumptions so research doesn't repeat existing knowledge\n- **Keep prompts clean and directed.** Clear task + essential context + desired output format\n\n### Example Queries\n\n**Company research:**\n```\nResearch the company ____ and its 2026 outlook. Provide a brief overview\nof the company, its products, services, and market position.\n```\n\n**Competitive analysis:**\n```\nConduct a competitive analysis of ____ in 2026. Identify their main\ncompetitors, compare market positioning, and analyze key differentiators.\n```\n\n**With prior context:**\n```\nWe're evaluating Notion as a potential partner. We already know they\nprimarily serve SMB and mid-market teams, expanded their AI features\nsignificantly in 2025, and most often compete with Confluence and ClickUp.\nResearch Notion's 2026 outlook, including market position, growth risks,\nand where a partnership could be most valuable. Include citations.\n```\n\n---\n\n## Model Selection\n\n| Model | Best For |\n|-------|----------|\n| `pro` | Comprehensive, multi-agent research for complex, multi-domain topics |\n| `mini` | Targeted, efficient research for narrow or well-scoped questions |\n| `auto` | When unsure how complex research will be (default) |\n\n### Pro Model\n\nMulti-agent research suited for complex topics spanning multiple subtopics or domains. Use for deeper analysis, thorough reports, or maximum accuracy.\n\n```python\nresult = client.research(\n    input=\"Analyze the competitive landscape for ____ in the SMB market, \"\n          \"including key competitors, positioning, pricing models, customer \"\n          \"segments, recent product moves, and defensible advantages or risks \"\n          \"over the next 2-3 years.\",\n    model=\"pro\"\n)\n```\n\n### Mini Model\n\nOptimized for targeted, efficient research. Best for narrow or well-scoped questions where you still benefit from agentic searching and synthesis.\n\n```python\nresult = client.research(\n    input=\"What are the top 5 competitors to ____ in the SMB market, and how do they differentiate?\",\n    model=\"mini\"\n)\n```\n\n---\n\n## Key Parameters\n\n### research()\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `input` | string | Required | The research topic or question |\n| `model` | enum | `\"auto\"` | `\"mini\"`, `\"pro\"`, or `\"auto\"` |\n| `stream` | boolean | false | Enable streaming responses |\n| `output_schema` | object | null | JSON Schema for structured output |\n| `citation_format` | enum | `\"numbered\"` | `\"numbered\"`, `\"mla\"`, `\"apa\"`, `\"chicago\"` |\n\n### get_research()\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `request_id` | string | Task ID from `research()` response |\n\n---\n\n## Basic Usage\n\nResearch tasks are two-step: initiate with `research()`, retrieve with `get_research()`.\n\n```python\nimport time\nfrom tavily import TavilyClient\n\nclient = TavilyClient()\n\n# Step 1: Start research task\nresult = client.research(\n    input=\"Latest developments in quantum computing and their practical applications\",\n    model=\"pro\"\n)\nrequest_id = result[\"request_id\"]\n\n# Step 2: Poll until completed\nresponse = client.get_research(request_id)\nwhile response[\"status\"] not in [\"completed\", \"failed\"]:\n    print(f\"Status: {response['status']}... polling again in 10 seconds\")\n    time.sleep(10)\n    response = client.get_research(request_id)\n\n# Step 3: Handle result\nif response[\"status\"] == \"failed\":\n    raise RuntimeError(f\"Research failed: {response.get('error', 'Unknown error')}\")\n\nreport = response[\"content\"]\nsources = response[\"sources\"]\n```\n\n---\n\n## Streaming vs Polling\n\n**Streaming** — Best for user interfaces where you want real-time updates.\n**Polling** — Best for background processes where you check status periodically.\n\n### Streaming\n\nEnable real-time progress monitoring with `stream=True`.\n\n```python\nstream = client.research(\n    input=\"Latest developments in quantum computing\",\n    model=\"pro\",\n    stream=True\n)\n\nfor chunk in stream:\n    print(chunk.decode('utf-8'))\n```\n\n### Event Types\n\n| Event Type | Description |\n|------------|-------------|\n| **Tool Call** | Agent initiates action (Planning, WebSearch, etc.) |\n| **Tool Response** | Results after tool execution with sources |\n| **Content** | Research report streamed as markdown (or JSON with `output_schema`) |\n| **Sources** | Complete list of sources, emitted after content |\n| **Done** | Signals completion |\n\n### Tool Types\n\n| Tool | Description | Models |\n|------|-------------|--------|\n| `Planning` | Initializes research strategy | mini, pro |\n| `WebSearch` | Executes web searches | mini, pro |\n| `Generating` | Creates final report | mini, pro |\n| `ResearchSubtopic` | Deep research on subtopics | pro only |\n\n### Typical Flow\n\n1. `Planning` tool_call → tool_response\n2. `WebSearch` tool_call → tool_response (with sources)\n3. `ResearchSubtopic` cycles (Pro mode only)\n4. `Generating` tool_call → tool_response\n5. `Content` chunks (markdown or structured JSON)\n6. `Sources` event\n7. `Done` event\n\nSee [streaming cookbook](https://github.com/tavily-ai/tavily-cookbook/blob/main/cookbooks/research/streaming.ipynb) and [polling cookbook](https://github.com/tavily-ai/tavily-cookbook/blob/main/cookbooks/research/polling.ipynb) for complete examples.\n\n---\n\n## Structured Output vs. Report\n\n| Format | Best For |\n|--------|----------|\n| **Report** (default) | Reading, sharing, or displaying verbatim (chat interfaces, briefs, newsletters) |\n| **Structured Output** | Data enrichment, pipelines, or powering UIs with specific fields |\n\n## Structured Output\n\nUse `output_schema` to receive research in a predefined JSON structure.\n\n```python\nschema = {\n    \"properties\": {\n        \"summary\": {\n            \"type\": \"string\",\n            \"description\": \"Executive summary of findings\"\n        },\n        \"key_points\": {\n            \"type\": \"array\",\n            \"items\": {\"type\": \"string\"},\n            \"description\": \"Main takeaways from the research\"\n        },\n        \"metrics\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"market_size\": {\"type\": \"string\", \"description\": \"Total market size\"},\n                \"growth_rate\": {\"type\": \"number\", \"description\": \"Annual growth percentage\"}\n            }\n        }\n    },\n    \"required\": [\"summary\", \"key_points\"]\n}\n\nresult = client.research(\n    input=\"Electric vehicle market analysis 2024\",\n    output_schema=schema\n)\n```\n\n### Schema Best Practices\n\n- **Write clear field descriptions.** 1-3 sentences explaining what the field should contain\n- **Match the structure you need.** Use arrays, objects, enums appropriately (e.g., `competitors: string[]`, not `\"A, B, C\"`)\n- **Avoid duplicate fields.** Keep each field unique and specific\n- **Use `required` arrays** to enforce mandatory fields at any nesting level\n\n**Supported types:** `object`, `string`, `integer`, `number`, `array`\n\n### Streaming with Structured Output\n\nWhen `output_schema` is provided, content arrives as structured JSON:\n\n```python\nstream = client.research(\n    input=\"AI agent frameworks comparison\",\n    model=\"mini\",\n    stream=True,\n    output_schema={\n        \"properties\": {\n            \"summary\": {\"type\": \"string\", \"description\": \"Executive summary\"},\n            \"key_points\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}}\n        },\n        \"required\": [\"summary\", \"key_points\"]\n    }\n)\n\nfor chunk in stream:\n    data = chunk.decode('utf-8')\n    print(data)  # Content chunks will be structured JSON\n```\n\n---\n\n## Response Fields\n\n### research() Response\n\n| Field | Description |\n|-------|-------------|\n| `request_id` | Unique identifier for tracking |\n| `created_at` | Timestamp when task was created |\n| `status` | Initial status |\n| `input` | The research topic submitted |\n| `model` | Model used by research agent |\n\n### get_research() Response\n\n| Field | Description |\n|-------|-------------|\n| `status` | `\"pending\"`, `\"processing\"`, `\"completed\"`, `\"failed\"` |\n| `content` | Generated research report (when completed) |\n| `sources` | Array of source citations |\n| `response_time` | Time in seconds |\n\n### Source Object\n\n| Field | Description |\n|-------|-------------|\n| `url` | Source URL |\n| `title` | Source title |\n| `citation` | Formatted citation string |\n\n---\n\n## Summary\n\n1. **Be specific in prompts** — Include known details: target market, competitors, geography, constraints\n2. **Share prior context** — Include what you already know to avoid repetition\n3. **Choose the right model** — `mini` for focused queries, `pro` for comprehensive multi-domain analysis\n4. **Use streaming for UX** — Display real-time progress during long research tasks\n5. **Use structured output for pipelines** — Define schemas for consistent, parseable responses\n6. **Use reports for reading** — Default format is best for chat interfaces and sharing\n\nFor more examples, see the [Tavily Cookbook](https://github.com/tavily-ai/tavily-cookbook/tree/main/research) and [live demo](https://chat-research.tavily.com/).\n\nFile v0.1.0:references/sdk.md\n\n# SDK Reference\n\n## Table of Contents\n\n- [Python SDK](#python-sdk)\n- [JavaScript SDK](#javascript-sdk)\n- [Async Patterns](#async-patterns)\n- [Hybrid RAG](#hybrid-rag)\n\n---\n\n## Python SDK\n\n### Installation\n\n```bash\npip install tavily-python\n```\n\n### Client Initialization\n\n```python\nfrom tavily import TavilyClient\n\n# Uses TAVILY_API_KEY env var (recommended)\nclient = TavilyClient()\n\n# Explicit API key\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\")\n\n# With project tracking\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\", project_id=\"your-project-id\")\n\n# With proxies\nproxies = {\"http\": \"<proxy>\", \"https\": \"<proxy>\"}\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\", proxies=proxies)\n```\n\n### Async Client\n\n```python\nfrom tavily import AsyncTavilyClient\n\nasync_client = AsyncTavilyClient()\n\n# Parallel queries\nimport asyncio\nresponses = await asyncio.gather(\n    async_client.search(\"query 1\"),\n    async_client.search(\"query 2\"),\n    async_client.search(\"query 3\")\n)\n```\n\n### Methods\n\n#### search()\n\n```python\nresponse = client.search(\n    query=\"quantum computing breakthroughs\",\n    search_depth=\"advanced\",      # \"basic\" | \"advanced\"\n    topic=\"general\",              # \"general\" | \"news\" | \"finance\"\n    max_results=10,               # 0-20\n    include_answer=False,         # bool | \"basic\" | \"advanced\"\n    include_raw_content=False,    # bool | \"markdown\" | \"text\"\n    include_images=False,\n    time_range=\"week\",            # \"day\" | \"week\" | \"month\" | \"year\"\n    include_domains=[\"arxiv.org\"],\n    exclude_domains=[\"reddit.com\"],\n    country=\"united states\"\n)\n```\n\n#### extract()\n\n```python\nresponse = client.extract(\n    urls=[\"https://example.com/page1\", \"https://example.com/page2\"],\n    extract_depth=\"basic\",        # \"basic\" | \"advanced\"\n    format=\"markdown\",            # \"markdown\" | \"text\"\n    include_images=False,\n    query=\"focus query\",          # Reranks chunks by relevance\n    chunks_per_source=3           # 1-5, requires query\n)\n```\n\n#### crawl()\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,                  # 1-5\n    max_breadth=20,\n    limit=50,\n    instructions=\"Find API documentation\",\n    chunks_per_source=3,          # 1-5, requires instructions\n    select_paths=[\"/docs/.*\"],\n    exclude_paths=[\"/blog/.*\"],\n    extract_depth=\"basic\",\n    format=\"markdown\",\n    allow_external=True\n)\n```\n\n#### map()\n\n```python\nresponse = client.map(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    max_breadth=20,\n    limit=50,\n    instructions=\"Find all API pages\",\n    select_paths=[\"/api/.*\"],\n    allow_external=False\n)\n```\n\n#### research()\n\n```python\n# Start research task\nresult = client.research(\n    input=\"Analyze competitive landscape for X\",\n    model=\"pro\",                  # \"mini\" | \"pro\" | \"auto\"\n    stream=False,\n    output_schema=None,           # JSON schema for structured output\n    citation_format=\"numbered\"    # \"numbered\" | \"mla\" | \"apa\" | \"chicago\"\n)\n\n# Poll for results\nimport time\nresponse = client.get_research(result[\"request_id\"])\nwhile response[\"status\"] not in [\"completed\", \"failed\"]:\n    time.sleep(10)\n    response = client.get_research(result[\"request_id\"])\n```\n\n---\n\n## JavaScript SDK\n\n### Installation\n\n```bash\nnpm install @tavily/core\n```\n\n### Client Initialization\n\n```javascript\nconst { tavily } = require(\"@tavily/core\");\n\n// Basic initialization\nconst client = tavily({ apiKey: \"tvly-YOUR_API_KEY\" });\n\n// With project tracking\nconst client = tavily({\n  apiKey: \"tvly-YOUR_API_KEY\",\n  projectId: \"your-project-id\"\n});\n\n// With proxies\nconst client = tavily({\n  apiKey: \"tvly-YOUR_API_KEY\",\n  proxies: {\n    http: \"<proxy>\",\n    https: \"<proxy>\"\n  }\n});\n```\n\n### Methods\n\n#### search()\n\n```javascript\nconst response = await client.search(\"quantum computing\", {\n  searchDepth: \"advanced\",      // \"basic\" | \"advanced\"\n  topic: \"general\",             // \"general\" | \"news\" | \"finance\"\n  maxResults: 10,               // 0-20\n  includeAnswer: false,         // boolean | \"basic\" | \"advanced\"\n  includeRawContent: false,     // boolean | \"markdown\" | \"text\"\n  includeImages: false,\n  timeRange: \"week\",            // \"day\" | \"week\" | \"month\" | \"year\"\n  includeDomains: [\"arxiv.org\"],\n  excludeDomains: [\"reddit.com\"],\n  country: \"united states\"\n});\n```\n\n#### extract()\n\n```javascript\nconst response = await client.extract([\n  \"https://example.com/page1\",\n  \"https://example.com/page2\"\n], {\n  extractDepth: \"basic\",        // \"basic\" | \"advanced\"\n  format: \"markdown\",           // \"markdown\" | \"text\"\n  includeImages: false,\n  query: \"focus query\"          // Reranks chunks\n});\n```\n\n#### crawl()\n\n```javascript\nconst response = await client.crawl(\"https://docs.example.com\", {\n  maxDepth: 2,\n  maxBreadth: 20,\n  limit: 50,\n  instructions: \"Find API documentation\",\n  selectPaths: [\"/docs/.*\"],\n  excludePaths: [\"/blog/.*\"],\n  extractDepth: \"basic\",\n  format: \"markdown\"\n});\n```\n\n#### map()\n\n```javascript\nconst response = await client.map(\"https://docs.example.com\", {\n  maxDepth: 2,\n  maxBreadth: 20,\n  limit: 50,\n  instructions: \"Find all API pages\"\n});\n```\n\n---\n\n## Async Patterns\n\n### Python Parallel Queries\n\n```python\nimport asyncio\nfrom tavily import AsyncTavilyClient\n\nclient = AsyncTavilyClient()\n\nasync def parallel_search():\n    queries = [\n        \"AI trends 2025\",\n        \"machine learning best practices\",\n        \"LLM deployment strategies\"\n    ]\n\n    responses = await asyncio.gather(\n        *(client.search(q, search_depth=\"advanced\") for q in queries),\n        return_exceptions=True\n    )\n\n    for query, response in zip(queries, responses):\n        if isinstance(response, Exception):\n            print(f\"Failed: {query}\")\n        else:\n            print(f\"{query}: {len(response['results'])} results\")\n\nasyncio.run(parallel_search())\n```\n\n### JavaScript Parallel Queries\n\n```javascript\nconst queries = [\"AI trends\", \"ML practices\", \"LLM strategies\"];\n\nconst responses = await Promise.all(\n  queries.map(q => client.search(q, { searchDepth: \"advanced\" }))\n);\n\nresponses.forEach((response, i) => {\n  console.log(`${queries[i]}: ${response.results.length} results`);\n});\n```\n\n---\n\n## Hybrid RAG\n\nCombine web search with local database retrieval.\n\n### Python\n\n```python\nfrom tavily import TavilyHybridClient\nfrom pymongo import MongoClient\n\n# Connect to MongoDB\ndb = MongoClient(\"mongodb+srv://URI\")[\"DB_NAME\"]\n\n# Initialize hybrid client\nhybrid_client = TavilyHybridClient(\n    api_key=\"tvly-YOUR_API_KEY\",\n    db_provider=\"mongodb\",\n    collection=db.get_collection(\"documents\"),\n    embeddings_field=\"embeddings\",\n    content_field=\"content\"\n)\n\n# Search across web + local DB\nresults = hybrid_client.search(\n    query=\"quantum computing advances\",\n    max_results=10,\n    max_local=5,      # Results from local DB\n    max_foreign=5,    # Results from web\n    save_foreign=True # Store web results in DB\n)\n```\n\n**Environment Variables:**\n- `TAVILY_PROJECT`: Default project ID\n- `TAVILY_HTTP_PROXY` / `TAVILY_HTTPS_PROXY`: Proxy configuration\n- `CO_API_KEY`: Cohere API key for embeddings\n\n---\n\n## Response Structures\n\n### Search Response\n\n```python\n{\n    \"query\": str,\n    \"results\": [\n        {\n            \"title\": str,\n            \"url\": str,\n            \"content\": str,\n            \"score\": float,\n            \"favicon\": str\n        }\n    ],\n    \"response_time\": float,\n    \"request_id\": str,\n    \"answer\": str,      # if include_answer\n    \"images\": list      # if include_images\n}\n```\n\n### Extract Response\n\n```python\n{\n    \"results\": [\n        {\n            \"url\": str,\n            \"raw_content\": str,\n            \"images\": list,\n            \"favicon\": str\n        }\n    ],\n    \"failed_results\": [\n        {\"url\": str, \"error\": str}\n    ],\n    \"response_time\": float,\n    \"request_id\": str\n}\n```\n\n### Crawl Response\n\n```python\n{\n    \"base_url\": str,\n    \"results\": [\n        {\n            \"url\": str,\n            \"raw_content\": str,\n            \"images\": list,\n            \"favicon\": str\n        }\n    ],\n    \"response_time\": float,\n    \"request_id\": str\n}\n```\n\n### Map Response\n\n```python\n{\n    \"base_url\": str,\n    \"results\": [str],  # List of URLs\n    \"response_time\": float,\n    \"request_id\": str\n}\n```\n\n---\n\nFor full API documentation, see:\n- [Python SDK Reference](https://docs.tavily.com/sdk/python/reference)\n- [JavaScript SDK Reference](https://docs.tavily.com/sdk/javascript/reference)\n\nFile v0.1.0:references/search.md\n\n# Search API Reference\n\n## Table of Contents\n\n- [Query Optimization](#query-optimization)\n- [Search Depth](#search-depth)\n- [Key Parameters](#key-parameters)\n- [Basic Usage](#basic-usage)\n- [Filtering Results](#filtering-results)\n- [Async Patterns](#async-patterns)\n- [Response Fields](#response-fields)\n- [Post-Filtering Strategies](#post-filtering-strategies)\n\n---\n\n## Query Optimization\n\n**Keep queries under 400 characters.** Think search query, not long-form prompt.\n\n**Break complex queries into sub-queries:**\n```python\n# Instead of one massive query, break it down:\nqueries = [\n    \"Competitors of company ABC\",\n    \"Financial performance of company ABC\",\n    \"Recent developments of company ABC\"\n]\nresponses = await asyncio.gather(*(client.search(q) for q in queries))\n```\n\n## Search Depth\n\nControls the latency vs. relevance tradeoff:\n\n| Depth | Latency | Relevance | Content Type |\n|-------|---------|-----------|--------------|\n| `ultra-fast` | Lowest | Lower | Content (NLP summary) |\n| `fast` | Low | Good | Chunks |\n| `basic` | Medium | High | Content (NLP summary) |\n| `advanced` | Higher | Highest | Chunks |\n\n**Content types:**\n- **Content**: NLP-based summary of the page, providing general context\n- **Chunks**: Short snippets (max 500 chars) reranked by relevance to your query\n\n**When to use each:** \n- `ultra-fast`: Latency-critical (real-time chat, autocomplete)\n- `fast`: Need chunks but latency matters\n- `basic`: General-purpose, balanced relevance and latency\n- `advanced`: Specific information queries, precision matters - default (Still fast and suitable for almost all use cases) \n\n## Key Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `query` | string | Required | Search query (keep under 400 chars) |\n| `search_depth` | enum | `\"basic\"` | `\"ultra-fast\"`, `\"fast\"`, `\"basic\"`, `\"advanced\"` |\n| `topic` | enum | `\"general\"` | `\"general\"`, `\"news\"` (adds `published_date`), `\"finance\"` |\n| `chunks_per_source` | integer | 3 | Chunks per source (advanced/fast depth only) |\n| `max_results` | integer | 5 | Maximum results (0-20) |\n| `time_range` | enum | null | `\"day\"`, `\"week\"`, `\"month\"`, `\"year\"` |\n| `start_date` | string | null | Results after date (YYYY-MM-DD) |\n| `end_date` | string | null | Results before date (YYYY-MM-DD) |\n| `include_domains` | array | [] | Domains to include (max 300, supports wildcards like `*.com`) |\n| `exclude_domains` | array | [] | Domains to exclude (max 150) |\n| `country` | enum | null | Boost results from country (general topic only) |\n| `include_answer` | bool/enum | false | `true`/`\"basic\"` or `\"advanced\"` for LLM answer |\n| `include_raw_content` | bool/enum | false | `true`/`\"markdown\"` or `\"text\"` for full page |\n| `include_images` | boolean | false | Include image results |\n| `include_image_descriptions` | boolean | false | AI descriptions for images |\n| `include_favicon` | boolean | false | Favicon URL per result |\n| `auto_parameters` | boolean | false | Auto-configure based on query intent |\n| `include_usage` | boolean | false | Include credit usage info |\n\n**Notes:**\n\n- **`include_answer`**: Only use if you don't want to bring your own LLM. Most users bring their own model.\n\n- **`auto_parameters`**: May set `search_depth=\"advanced\"` (2 credits). Set `search_depth` manually to control cost.\n\n- **`topic=\"news\"`**: Returns `published_date` metadata. Use for current events, politics, sports.\n\n\n## Basic Usage\n\n```python\nfrom tavily import TavilyClient\n\nclient = TavilyClient()\n\nresponse = client.search(\n    query=\"latest developments in quantum computing\",\n    max_results=10,\n    search_depth=\"advanced\",\n    chunks_per_source=5\n)\n\nfor result in response[\"results\"]:\n    print(f\"{result['title']}: {result['url']}\")\n    print(f\"Score: {result['score']}\")\n```\n\n\n## Filtering Results\n\n### By domain\n\n```python\n# Only search trusted sources\nresponse = client.search(\n    query=\"machine learning best practices\",\n    include_domains=[\"arxiv.org\", \"github.com\", \"pytorch.org\"],\n)\n\n# Exclude specific domains\nresponse = client.search(\n    query=\"openai product reviews\",\n    exclude_domains=[\"reddit.com\", \"quora.com\"]\n)\n\n# Wildcard: limit to .com, exclude specific site\nresponse = client.search(\n    query=\"AI news\",\n    include_domains=[\"*.com\"],\n    exclude_domains=[\"example.com\"]\n)\n\n# Restrict to LinkedIn profiles\nresponse = client.search(\n    query=\"CEO background at Google\",\n    include_domains=[\"linkedin.com/in\"]\n)\n```\n\n### By date\n\n```python\n# Relative time range\nresponse = client.search(query=\"latest ML trends\", time_range=\"month\")\n\n# Specific date range\nresponse = client.search(\n    query=\"AI news\",\n    start_date=\"2025-01-01\",\n    end_date=\"2025-02-01\"\n)\n```\n\n### By topic\n\n```python\n# News sources (includes published_date)\nresponse = client.search(query=\"What happened today in NY?\", topic=\"news\")\n\n# Finance-focused\nresponse = client.search(query=\"AAPL earnings\", topic=\"finance\")\n```\n\n### By country\n\n```python\n# Boost results from specific country\nresponse = client.search(query=\"tech startup funding\", country=\"united states\")\n```\n\n## Async Patterns\n\nLeveraging the async client enables scaled search with higher breadth and reach by running multiple queries in parallel. This is the best practice for agentic systems where you need to gather comprehensive information quickly before passing it to a model for analysis.\n\n```python\nimport asyncio\nfrom tavily import AsyncTavilyClient\n\n# Initialize Tavily client\ntavily_client = AsyncTavilyClient(\"tvly-YOUR_API_KEY\")\n\nasync def fetch_and_gather():\n    queries = [\"latest AI trends\", \"future of quantum computing\"]\n\n    # Perform search and continue even if one query fails (using return_exceptions=True)\n    try:\n        responses = await asyncio.gather(*(tavily_client.search(q) for q in queries), return_exceptions=True)\n\n        # Handle responses and print\n        for response in responses:\n            if isinstance(response, Exception):\n                print(f\"Search query failed: {response}\")\n            else:\n                print(response)\n\n    except Exception as e:\n        print(f\"Error during search queries: {e}\")\n\n# Run the function\nasyncio.run(fetch_and_gather())\n```\n\n\n## Response Fields\n\n**Top-level response:**\n\n| Field | Description |\n|-------|-------------|\n| `query` | The original search query |\n| `answer` | AI-generated answer (if `include_answer` enabled) |\n| `results` | Array of search result objects |\n| `images` | Array of image results (if `include_images=True`) |\n\n**Each result object:**\n\n| Field | Description |\n|-------|-------------|\n| `title` | Page title |\n| `url` | Source URL |\n| `content` | Extracted text snippet(s) |\n| `score` | Semantic relevance score (0-1) |\n| `raw_content` | Full page content (if `include_raw_content` enabled) |\n| `published_date` | Publication date (if `topic=\"news\"`) |\n| `favicon` | Favicon URL (if `include_favicon=True`) |\n\n**Top-level response also includes:**\n\n| Field | Description |\n|-------|-------------|\n| `request_id` | Unique identifier for support reference |\n| `response_time` | Response time in seconds |\n\n**Each image object (if `include_images=True`):**\n\n| Field | Description |\n|-------|-------------|\n| `url` | Image URL |\n| `description` | AI-generated description (if `include_image_descriptions=True`) |\n\n---\n\n## Post-Filtering Strategies\n\nSince Tavily provides raw web data, you have full configurability to implement filtering and post-processing to meet your specific requirements.\n\nThe `score` field measures query relevance, but doesn't guarantee the result matches specific criteria (e.g., correct person, exact product, specific company). Use post-filtering to validate results against strict requirements.\n\n### Score-Based Filtering\n\nSimple threshold filtering based on relevance score:\n\n```python\nresults = response[\"results\"]\n\n# Filter by score threshold\nhigh_quality = [r for r in results if r[\"score\"] > 0.7]\n\n# Sort by score\nsorted_results = sorted(results, key=lambda x: x[\"score\"], reverse=True)\n\n# Top N above threshold\ntop_relevant = sorted(\n    [r for r in results if r[\"score\"] > 0.5],\n    key=lambda x: x[\"score\"],\n    reverse=True\n)[:3]\n```\n\n**Limitation:** Score indicates relevance to query, not accuracy of match to specific criteria.\n\n### Regex Filtering\n\nFast, deterministic filtering using pattern matching. Use for:\n- URL pattern validation\n- Required keywords/phrases\n- Structural requirements\n\n```python\nimport re\n\ndef regex_filter(result, criteria: dict) -> dict:\n    \"\"\"\n    Filter a search result using regex checks.\n\n    Args:\n        result: Search result dict with url, content, title, raw_content\n        criteria: Dict with patterns to match:\n            - url_pattern: Regex for URL validation\n            - required_terms: List of terms that must appear in content\n            - excluded_terms: List of terms that must NOT appear\n\n    Returns:\n        dict with check results and validity\n    \"\"\"\n    url = result.get(\"url\", \"\")\n    content = result.get(\"content\", \"\") or \"\"\n    title = result.get(\"title\", \"\") or \"\"\n    raw_content = result.get(\"raw_content\", \"\") or \"\"\n\n    full_text = f\"{content} {title} {raw_content}\".lower()\n\n    checks = {}\n\n    # URL pattern check\n    if \"url_pattern\" in criteria:\n        checks[\"url_valid\"] = bool(re.search(criteria[\"url_pattern\"], url.lower()))\n\n    # Required terms check\n    if \"required_terms\" in criteria:\n        checks[\"required_found\"] = all(\n            re.search(re.escape(term.lower()), full_text)\n            for term in criteria[\"required_terms\"]\n        )\n\n    # Excluded terms check\n    if \"excluded_terms\" in criteria:\n        checks[\"excluded_absent\"] = not any(\n            re.search(re.escape(term.lower()), full_text)\n            for term in criteria[\"excluded_terms\"]\n        )\n\n    # Valid if all checks pass\n    is_valid = all(checks.values()) if checks else True\n\n    return {\"checks\": checks, \"is_valid\": is_valid, \"url\": url}\n```\n\n**Example: LinkedIn Profile Search**\n\n```python\ncriteria = {\n    \"url_pattern\": r\"linkedin\\.com/in/\",  # Profile URL, not company page\n    \"required_terms\": [\"Jane Smith\", \"Acme Corp\"],\n    \"excluded_terms\": [\"job posting\", \"careers\"]\n}\n\nfor result in response[\"results\"]:\n    validation = regex_filter(result, criteria)\n    if validation[\"is_valid\"]:\n        print(f\"Valid: {validation['url']}\")\n```\n\n**Example: GitHub Repository Search**\n\n```python\ncriteria = {\n    \"url_pattern\": r\"github\\.com/[\\w-]+/[\\w-]+$\",  # Repo URL, not file\n    \"required_terms\": [\"MIT License\"],\n    \"excluded_terms\": [\"archived\", \"deprecated\"]\n}\n```\n\n### LLM Verification\n\nSemantic validation using an LLM. Use for:\n- Synonym/abbreviation matching (\"FDE\" = \"Forward Deployed Engineer\")\n- Context-aware validation\n- Confidence scoring with reasoning\n\n```python\nfrom openai import OpenAI\nimport json\n\ndef llm_verify(result, target_description: str, validation_criteria: list[str]) -> dict:\n    \"\"\"\n    Use LLM to verify if a search result matches target criteria.\n\n    Args:\n        result: Search result dict\n        target_description: What you're looking for\n        validation_criteria: List of criteria to check\n\n    Returns:\n        dict with is_match, confidence (high/medium/low), reasoning\n    \"\"\"\n    content = result.get(\"content\", \"\") or \"\"\n    title = result.get(\"title\", \"\") or \"\"\n    url = result.get(\"url\", \"\")\n\n    criteria_text = \"\\n\".join(f\"- {c}\" for c in validation_criteria)\n\n    prompt = f\"\"\"Verify if this search result matches the target.\n\nTarget: {target_description}\n\nValidation Criteria:\n{criteria_text}\n\nSearch Result:\nURL: {url}\nTitle: {title}\nContent: {content}\n\nDoes this result match ALL criteria?\n\nRespond with JSON only:\n{{\"is_match\": true/false, \"confidence\": \"high/medium/low\", \"reasoning\": \"brief explanation\"}}\"\"\"\n\n    client = OpenAI()\n    response = client.chat.completions.create(\n        model=\"gpt-4o-mini\",\n        messages=[{\"role\": \"user\", \"content\": prompt}],\n        response_format={\"type\": \"json_object\"}\n    )\n\n    return json.loads(response.choices[0].message.content)\n```\n\n**Example: Profile Verification**\n\n```python\nresult = llm_verify(\n    result=search_result,\n    target_description=\"Jane Smith, Software Engineer at Acme Corp\",\n    validation_criteria=[\n        \"Name matches Jane Smith\",\n        \"Currently works at Acme Corp (or recently)\",\n        \"Role is software engineering related\",\n        \"Professional customer-facing experience\"\n    ]\n)\n\nif result[\"is_match\"] and result[\"confidence\"] in [\"high\", \"medium\"]:\n    print(f\"Verified: {result['reasoning']}\")\n```\n\nFor more details, please read the [full API reference](https://docs.tavily.com/documentation/api-reference/endpoint/search)","readmeExcerpt":"Skill: Tavily Best Practices Owner: barneyjm Summary: Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents. Tags: latest:0.1.0 Version history: v0.1.0 | 2026-02-03T15:27:32.248Z | auto ","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"env\": {\n    \"TAVILY_API_KEY\": \"tvly-YOUR_API_KEY\"\n  }\n}"},{"language":"bash","snippet":"pip install tavily-python"},{"language":"bash","snippet":"npm install @tavily/core"},{"language":"python","snippet":"from tavily import TavilyClient\n\n# Option 1: Uses TAVILY_API_KEY env var (recommended)\nclient = TavilyClient()\n\n# Option 2: Explicit API key\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\")\n\n# Option 3: With project tracking (for usage organization)\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\", project_id=\"your-project-id\")\n\n# Async client for parallel queries\nfrom tavily import AsyncTavilyClient\nasync_client = AsyncTavilyClient()"},{"language":"python","snippet":"response = client.search(\n    query=\"quantum computing breakthroughs\",  # Keep under 400 chars\n    max_results=10,\n    search_depth=\"advanced\",  # 2 credits, highest relevance\n    topic=\"general\"  # or \"news\", \"finance\"\n)\n\nfor result in response[\"results\"]:\n    print(f\"{result['title']}: {result['score']}\")"},{"language":"python","snippet":"# Two-step pattern (recommended for control)\nsearch_results = client.search(query=\"Python async best practices\")\nurls = [r[\"url\"] for r in search_results[\"results\"] if r[\"score\"] > 0.5]\nextracted = client.extract(\n    urls=urls[:20],\n    query=\"async patterns\",  # Reranks chunks by relevance\n    chunks_per_source=3  # Prevents context explosion\n)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: tavily-best-practices\ndescription: \"Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents.\"\n---\n\n# Tavily\n\nTavily is a search API designed for LLMs, enabling AI applications to access real-time web data.\n\n## Prerequisites\n\n**Tavily API Key Required** - Get your key at https://app.tavily.com (1,000 free API credits/month, no credit card required)\n\nAdd to `~/.claude/settings.json`:\n```json\n{\n  \"env\": {\n    \"TAVILY_API_KEY\": \"tvly-YOUR_API_KEY\"\n  }\n}\n```\n\nRestart Claude Code after adding your API key.\n\n## Installation\n\n**Python:**\n```bash\npip install tavily-python\n```\n\n**JavaScript:**\n```bash\nnpm install @tavily/core\n```\n\nSee **[references/sdk.md](references/sdk.md)** for complete SDK reference.\n\n## Client Initialization\n\n```python\nfrom tavily import TavilyClient\n\n# Option 1: Uses TAVILY_API_KEY env var (recommended)\nclient = TavilyClient()\n\n# Option 2: Explicit API key\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\")\n\n# Option 3: With project tracking (for usage organization)\nclient = TavilyClient(api_key=\"tvly-YOUR_API_KEY\", project_id=\"your-project-id\")\n\n# Async client for parallel queries\nfrom tavily import AsyncTavilyClient\nasync_client = AsyncTavilyClient()\n```\n\n## Choosing the Right Method\n\n**For custom agents/workflows:**\n\n| Need | Method |\n|------|--------|\n| Web search results | `search()` |\n| Content from specific URLs | `extract()` |\n| Content from entire site | `crawl()` |\n| URL discovery from site | `map()` |\n\n**For out-of-the-box research:**\n\n| Need | Method |\n|------|--------|\n| End-to-end research with AI synthesis | `research()` |\n\n## Quick Reference\n\n### search() - Web Search\n\n```python\nresponse = client.search(\n    query=\"quantum computing breakthroughs\",  # Keep under 400 chars\n    max_results=10,\n    search_depth=\"advanced\",  # 2 credits, highest relevance\n    topic=\"general\"  # or \"news\", \"finance\"\n)\n\nfor result in response[\"results\"]:\n    print(f\"{result['title']}: {result['score']}\")\n```\n\nKey parameters: `query`, `max_results`, `search_depth` (ultra-fast/fast/basic/advanced), `topic`, `include_domains`, `exclude_domains`, `time_range`\n\n### extract() - URL Content Extraction\n\n```python\n# Two-step pattern (recommended for control)\nsearch_results = client.search(query=\"Python async best practices\")\nurls = [r[\"url\"] for r in search_results[\"results\"] if r[\"score\"] > 0.5]\nextracted = client.extract(\n    urls=urls[:20],\n    query=\"async patterns\",  # Reranks chunks by relevance\n    chunks_per_source=3  # Prevents context explosion\n)\n```\n\nKey parameters: `urls` (max 20), `extract_depth`, `query`, `chunks_per_source` (1-5)\n\n### crawl() - Site-Wide Extraction\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    instructions=\"Find API documentation pages"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7e3j3w1x5et0yppacy4m90y18084ba\",\n  \"slug\": \"tavily-best-practices\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1770132452248\n}"},{"path":"references/crawl.md","content":"# Crawl & Map API Reference\n\n## Table of Contents\n\n- [Crawl vs Map](#crawl-vs-map)\n- [Key Parameters](#key-parameters)\n- [Instructions and Chunks](#instructions-and-chunks)\n- [Path and Domain Filtering](#path-and-domain-filtering)\n- [Use Cases](#use-cases)\n- [Map then Extract Pattern](#map-then-extract-pattern)\n- [Performance Optimization](#performance-optimization)\n- [Common Pitfalls](#common-pitfalls)\n- [Response Fields](#response-fields)\n- [Summary](#summary)\n\n---\n\n## Crawl vs Map\n\n| Feature | Crawl | Map |\n|---------|-------|-----|\n| **Returns** | Full content | URLs only |\n| **Speed** | Slower | Faster |\n| **Best for** | RAG, deep analysis, documentation | Site structure discovery, URL collection |\n\n**Use Crawl when:**\n- Full content extraction needed\n- Building RAG systems\n- Processing paginated/nested content\n- Integration with knowledge bases\n\n**Use Map when:**\n- Quick site structure discovery\n- URL collection without content\n- Planning before crawling\n- Sitemap generation\n\n---\n\n## Key Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `url` | string | Required | Root URL to begin |\n| `max_depth` | integer | 1 | Levels deep to crawl (1-5). **Start with 1-2** |\n| `max_breadth` | integer | 20 | Links per page. 50-100 for focused crawls |\n| `limit` | integer | 50 | Total pages cap |\n| `instructions` | string | null | Natural language guidance (2 credits/10 pages) |\n| `chunks_per_source` | integer | 3 | Chunks per page (1-5). Only with `instructions` |\n| `extract_depth` | enum | `\"basic\"` | `\"basic\"` (1 credit/5 URLs) or `\"advanced\"` (2 credits/5 URLs) |\n| `format` | enum | `\"markdown\"` | `\"markdown\"` or `\"text\"` |\n| `select_paths` | array | null | Regex patterns to include |\n| `exclude_paths` | array | null | Regex patterns to exclude |\n| `select_domains` | array | null | Regex for domains to include |\n| `exclude_domains` | array | null | Regex for domains to exclude |\n| `allow_external` | boolean | true (crawl) / false (map) | Include external domain links |\n| `include_images` | boolean | false | Include images (crawl only) |\n| `include_favicon` | boolean | false | Include favicon URL (crawl only) |\n| `include_usage` | boolean | false | Include credit usage info |\n| `timeout` | float | 150 | Max wait (10-150 seconds) |\n\n---\n\n## Instructions and Chunks\n\nUse `instructions` and `chunks_per_source` for semantic focus and token optimization:\n\n```python\nresponse = client.crawl(\n    url=\"https://docs.example.com\",\n    max_depth=2,\n    instructions=\"Find all documentation about authentication and security\",\n    chunks_per_source=3  # Only top 3 relevant chunks per page\n)\n```\n\n**Key benefits:**\n- `instructions` guides crawler semantically, focusing on relevant content\n- `chunks_per_source` returns only relevant snippets (max 500 chars each)\n- Prevents context window explosion in agentic use cases\n- Chunks appear in `raw_content` as: `<chunk 1> [...] <chunk 2> [...] <chunk 3>`\n\n**Note:** `chunks_pe"},{"path":"references/extract.md","content":"# Extract API Reference\n\n## Table of Contents\n\n- [Extraction Approaches](#extraction-approaches)\n- [Key Parameters](#key-parameters)\n- [Query and Chunks](#query-and-chunks)\n- [Extract Depth](#extract-depth)\n- [Advanced Filtering Strategies](#advanced-filtering-strategies)\n- [Response Fields](#response-fields)\n- [Summary](#summary)\n\n---\n\n## Extraction Approaches\n\n### Search with include_raw_content\n\nGet search results and content in one call:\n\n```python\nresponse = client.search(\n    query=\"AI healthcare applications\",\n    include_raw_content=True,\n    max_results=5\n)\n```\n\n**When to use:**\n- Quick prototyping\n- Simple queries where search results are likely relevant\n- Single API call convenience\n\n### Direct Extract API (Recommended)\n\nTwo-step pattern for more control:\n\n```python\n# Step 1: Search\nsearch_results = client.search(\n    query=\"Python async best practices\",\n    max_results=10\n)\n\n# Step 2: Filter by relevance score\nrelevant_urls = [\n    r[\"url\"] for r in search_results[\"results\"]\n    if r[\"score\"] > 0.5\n]\n\n# Step 3: Extract with targeting\nextracted = client.extract(\n    urls=relevant_urls[:20],\n    query=\"async patterns and concurrency\",  # Reranks chunks\n    chunks_per_source=3  # Prevents context explosion\n)\n\nfor item in extracted[\"results\"]:\n    print(f\"URL: {item['url']}\")\n    print(f\"Content: {item['raw_content'][:500]}...\")\n```\n\n**When to use:**\n- You want control over which URLs to extract\n- You need to filter/curate URLs before extraction\n- You want targeted extraction with query and chunks_per_source\n\n---\n\n## Key Parameters\n\n| Parameter | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `urls` | string/array | Required | Single URL or list (max 20) |\n| `extract_depth` | enum | `\"basic\"` | `\"basic\"` or `\"advanced\"` (for complex/JS pages) |\n| `query` | string | null | Reranks chunks by relevance to this query |\n| `chunks_per_source` | integer | 3 | Chunks per source (1-5, max 500 chars each). Only with `query` |\n| `format` | enum | `\"markdown\"` | Output: `\"markdown\"` or `\"text\"` |\n| `include_images` | boolean | false | Include image URLs |\n| `include_favicon` | boolean | false | Include favicon URL |\n| `include_usage` | boolean | false | Include credit consumption data in response |\n| `timeout` | float | varies | Max wait time (1.0-60.0 seconds) |\n\n---\n\n## Query and Chunks\n\nUse `query` and `chunks_per_source` to get only relevant content and prevent context window explosion:\n\n```python\nextracted = client.extract(\n    urls=[\n        \"https://example.com/ml-healthcare\",\n        \"https://example.com/ai-diagnostics\",\n        \"https://example.com/medical-ai\"\n    ],\n    query=\"AI diagnostic tools accuracy\",\n    chunks_per_source=2  # 2 most relevant chunks per URL\n)\n```\n\n**When to use query:**\n- To extract only relevant portions of long documents\n- When you need focused content instead of full page extraction\n- For targeted information retrieval from specific URLs\n\n**Key benefits of chunks_per_source:**\n- Retu"},{"path":"references/integrations.md","content":"# Framework Integrations\n\n## Table of Contents\n\n- [LangChain](#langchain)\n- [LlamaIndex](#llamaindex)\n- [OpenAI Function Calling](#openai-function-calling)\n- [Anthropic Tool Use](#anthropic-tool-use)\n- [Vercel AI SDK](#vercel-ai-sdk)\n- [CrewAI](#crewai)\n- [No-Code Platforms](#no-code-platforms)\n\n---\n\n## LangChain\n\nThe `langchain-tavily` package is the official LangChain integration supporting Search, Extract, Map, Crawl, and Research.\n\n### Installation\n\n```bash\npip install -U langchain-tavily\n```\n\n### Search\n\n```python\nfrom langchain_tavily import TavilySearch\n\ntool = TavilySearch(\n    max_results=5,\n    topic=\"general\",  # or \"news\", \"finance\"\n    # search_depth=\"basic\",\n    # include_answer=False,\n    # include_raw_content=False,\n)\n\n# Direct invocation\nresult = tool.invoke({\"query\": \"What happened at Wimbledon?\"})\n\n# With agent\nfrom langchain.agents import create_agent\nfrom langchain_openai import ChatOpenAI\n\nagent = create_agent(\n    model=ChatOpenAI(model=\"gpt-4\"),\n    tools=[tool],\n    system_prompt=\"You are a helpful research assistant.\"\n)\nresponse = agent.invoke({\n    \"messages\": [{\"role\": \"user\", \"content\": \"What are the latest AI trends?\"}]\n})\n```\n\n**Dynamic parameters at invocation:**\n- `include_images`, `search_depth`, `time_range`, `include_domains`, `exclude_domains`, `start_date`, `end_date`\n\n### Extract\n\n```python\nfrom langchain_tavily import TavilyExtract\n\ntool = TavilyExtract(\n    extract_depth=\"basic\",  # or \"advanced\"\n    # include_images=False\n)\n\nresult = tool.invoke({\n    \"urls\": [\"https://en.wikipedia.org/wiki/Lionel_Messi\"]\n})\n```\n\n### Map\n\n```python\nfrom langchain_tavily import TavilyMap\n\ntool = TavilyMap()\n\nresult = tool.invoke({\n    \"url\": \"https://docs.example.com\",\n    \"instructions\": \"Find all documentation and tutorial pages\"\n})\n# Returns: {\"base_url\": ..., \"results\": [urls...], \"response_time\": ...}\n```\n\n### Crawl\n\n```python\nfrom langchain_tavily import TavilyCrawl\n\ntool = TavilyCrawl()\n\nresult = tool.invoke({\n    \"url\": \"https://docs.example.com\",\n    \"instructions\": \"Extract API documentation and code examples\"\n})\n# Returns: {\"base_url\": ..., \"results\": [{url, raw_content}...], \"response_time\": ...}\n```\n\n### Research\n\n```python\nfrom langchain_tavily import TavilyResearch, TavilyGetResearch\n\n# Start research\nresearch_tool = TavilyResearch(model=\"mini\")\nresult = research_tool.invoke({\n    \"input\": \"Research the latest developments in AI\",\n    \"citation_format\": \"apa\"\n})\n\n# Get results\nget_tool = TavilyGetResearch()\nfinal = get_tool.invoke({\"request_id\": result[\"request_id\"]})\n```\n\n---\n\n## LlamaIndex\n\n```python\nfrom llama_index.tools.tavily_research import TavilyToolSpec\n\n# Initialize tools\ntavily_tool = TavilyToolSpec(api_key=\"tvly-YOUR_API_KEY\")\ntools = tavily_tool.to_tool_list()\n\n# Use with agent\nfrom llama_index.agent.openai import OpenAIAgent\n\nagent = OpenAIAgent.from_tools(tools)\nresponse = agent.chat(\"What are the latest AI developments?\")\n```\n\n---\n\n## OpenAI Function Calling\n\nDefine Tavily as an OpenAI functi"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents. Skill: Tavily Best Practices Owner: barneyjm Summary: Build production-ready Tavily integrations with best practices baked in. Reference documentation for developers using coding assistants (Claude Code, Cursor, etc.) to implement web search, content extraction, crawling, and research in agentic workflows, RAG systems, or autonomous agents. Tags: latest:0.1.0 Version history: v0.1.0 | 2026-02-03T15:27:32.248Z | auto","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1073,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:29:59.974Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:42:36.473Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}