feat(crewai-tools): add SerpdiveSearchTool#6594
Conversation
Web search over the SERPdive Search API. Returns a JSON string whose results carry the extracted, answer-ready text of each page (url, title, date, content), plus an optional synthesized answer. Sync and async via the official serpdive SDK, exported from crewai_tools, with a serpdive optional dependency group, stubbed unit tests, a docs page under tools/search-research, and the regenerated tool.specs.json. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughChangesSERPdive Search Tool
Sequence Diagram(s)sequenceDiagram
participant Agent
participant SerpdiveSearchTool
participant SERPdive
Agent->>SerpdiveSearchTool: Submit query
SerpdiveSearchTool->>SERPdive: Execute search with configured parameters
SERPdive-->>SerpdiveSearchTool: Return search response
SerpdiveSearchTool-->>Agent: Return formatted JSON
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Update while this is open: SERPdive now has a free tier, which changes the calculus for this integration.
Why it matters here: the usual objection to adding a search provider is that reviewers and users need a paid key just to try it. That objection is gone — anyone can run this integration end to end for free, including whoever reviews this PR. Nothing in this PR needs to change for that: the default stays |
SERPdive serves three models; this tool documented two, so the free one was invisible from here. `krill` is free and unlimited under fair use — no card, no credits — returning a smaller set of the same sentences, one request at a time, at low priority, with no written answer. The field default stays `mako`, so existing crews are unchanged. tool.specs.json carries the two regenerated descriptions verbatim from the Field definitions, the way generate_tool_specs.py writes them.
Add SerpdiveSearchTool
Adds a search tool for SERPdive, an AI search API that returns answer-ready web content: every result carries the actual text of the page (url, title, date, content), already extracted, cleaned, and sized for LLM consumption, so agents can quote and cite straight from the tool output. On a public, replayable 1,000-question benchmark, SERPdive runs at the same speed as Tavily, feeds your LLM 20.2% fewer tokens, and wins 60.7% of decided quality duels.
What's included
lib/crewai-tools/src/crewai_tools/tools/serpdive_search_tool/:SerpdiveSearchTool(sync_run+ async_arun) over the officialserpdiveSDK, following the structure and current style of the existing search tools (import guard,package_dependencies,env_vars, JSON string output) + tool READMEcrewai_tools/__init__.pyandcrewai_tools/tools/__init__.py(imports and__all__),serpdiveoptional dependency group inlib/crewai-tools/pyproject.tomllib/crewai-tools/tests/tools/serpdive_search_tool_test.py: 4 stubbed unit tests (no network), passing locally; the tool was also run live against the production APIdocs/edge/en/tools/search-research/serpdivesearchtool.mdx+ overview card +docs/docs.jsonnav entry (edge only, no frozendocs/v*touched)lib/crewai-tools/tool.specs.jsonregenerated withgenerate_tool_specs.py: the diff is additive only (the new tool's entry), no existing entry changedNotes
SERPDIVE_API_KEY(free key, no card required). No country or locale parameter: the language of the query picks where the search runs automatically.exclude-newer = "3 days": theserpdiveSDK's latest release was published on 2026-07-18, souv sync --all-extrasresolves it once the release is more than 3 days old. No config change is included; if CI runs before then and you prefer, we can add a temporaryexclude-newer-packageoverride instead.