Skip to content

feat(tavily): Add Tavily tools for framework-neutral usage#1901

Open
lakshyaag-tavily wants to merge 7 commits intoNVIDIA:developfrom
lakshyaag-tavily:feat/tavily-native-tools
Open

feat(tavily): Add Tavily tools for framework-neutral usage#1901
lakshyaag-tavily wants to merge 7 commits intoNVIDIA:developfrom
lakshyaag-tavily:feat/tavily-native-tools

Conversation

@lakshyaag-tavily
Copy link
Copy Markdown

@lakshyaag-tavily lakshyaag-tavily commented Apr 28, 2026

Description

Adds a new nvidia-nat-tavily package that exposes the Tavily Python SDK as framework-neutral NAT functions inside a single function group.

tavily function group (FunctionGroupBaseConfig, name tavily) — five tools, one shared AsyncTavilyClient, one API-key resolution path:

  • tavily__search
  • tavily__extract
  • tavily__crawl
  • tavily__map
  • tavily__research (consumes the /research SSE stream and returns an aggregated {content, sources, model} dict; stream=True is locked internally)

Example workflowexamples/tavily_weather/ adds a config that consumes the group via a single tool_names: [tavily] reference

Wiringpyproject.toml adds the tavily extra, the nvidia-nat-tavily workspace source, and nat_tavily_weather example.

The existing tavily_internet_search in nvidia_nat_langchain is left untouched for backwards compatibility.

Closes #1900.

By Submitting this PR I confirm:

  • I am familiar with the Contributing Guidelines.
  • We require that all contributors "sign-off" on their commits. This certifies that the contribution is your original work, or you have rights to submit it under the same license, or a compatible license.
    • Any contribution which contains commits that are not Signed-Off will not be accepted.
  • When the PR is ready for review, new or existing tests cover these changes.
  • When the PR is ready for review, the documentation is up to date with these changes.

Summary by CodeRabbit

  • New Features

    • Added a Tavily integration subpackage exposing five tools (search, extract, crawl, map, research) and workspace packaging.
  • Documentation

    • New example and README showing a weather smoke-test, setup, required API keys, dependency sync, and run instructions.
    • Added package documentation for the Tavily subpackage.
  • Tests

    • End-to-end tests for tool schemas, streaming aggregation, and API-key validation.
  • Chores

    • Registered a Tavily optional dependency and added the example to workspace config.

@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented Apr 28, 2026

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 28, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new framework-neutral Tavily subpackage and example: implements AsyncTavilyClient construction, SSE research-stream parsing, a tavily FunctionGroup exposing five tools (search, extract, crawl, map, research), plugin registration, tests validating schemas/streaming, packaging metadata, and workspace/example integration. (39 words)

Changes

Cohort / File(s) Summary
Example package
examples/tavily_weather/README.md, examples/tavily_weather/pyproject.toml, examples/tavily_weather/src/nat_tavily_weather/__init__.py
New example README and pyproject; SPDX header added to example package init.
Example config
examples/tavily_weather/src/nat_tavily_weather/configs/config.yml
Adds YAML demonstrating a tavily function group and a ReAct agent using an Anthropic LiteLLM and Tavily tools.
Package metadata & docs
packages/nvidia_nat_tavily/pyproject.toml, packages/nvidia_nat_tavily/src/nat/meta/pypi.md, packages/nvidia_nat_tavily/src/nat/plugins/tavily/__init__.py
New subpackage pyproject, PyPI docs page, workspace source registration, optional dependency extra, and SPDX header.
Client & streaming parser
packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py, packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py
Implements API-key resolution and builder for AsyncTavilyClient; adds SSE stream aggregator for /research producing combined content, sources, model, and optional trace, handling JSON decode errors and SDK error objects.
Plugin registration
packages/nvidia_nat_tavily/src/nat/plugins/tavily/register.py
Registration shim importing the tools module to trigger provider registration on load.
Function group & tools
packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py
Adds TavilyToolsGroupConfig and tavily_tools factory; auto-generates Pydantic input schemas from SDK signatures (dropping hidden params), JSON-list coercion validator, and async handlers that forward to Tavily SDK methods; research uses streaming + aggregator.
Tests
packages/nvidia_nat_tavily/tests/test_tools.py
Adds pytest coverage for schema generation/coercion, routing to SDK methods, API-key validation, and streaming aggregation behavior.
Root integration
pyproject.toml
Adds tavily optional extra and includes it in aggregated extras; registers new workspace source and example.

Sequence Diagram(s)

sequenceDiagram
    participant Agent as Agent / Workflow
    participant FuncGroup as Tavily FunctionGroup
    participant Client as AsyncTavilyClient
    participant SDK as Tavily SDK (HTTP / SSE)
    participant Parser as SSE Aggregator

    Agent->>FuncGroup: invoke tool (e.g., tavily__research)
    FuncGroup->>Client: build/resolve client, call method (stream=True)
    Client->>SDK: open /research SSE stream
    SDK-->>Parser: SSE byte chunks
    Parser-->>FuncGroup: aggregated result (content, sources, model, trace)
    FuncGroup-->>Agent: structured tool result
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 41.38% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main objective: adding Tavily tools as a framework-neutral integration, matching the primary changeset of introducing a new nvidia-nat-tavily package.
Linked Issues check ✅ Passed The PR fully implements all requirements from issue #1900: a new nvidia-nat-tavily package with five tools (search, extract, crawl, map, research) [#1900], framework-neutral design depending only on nvidia-nat-core and tavily-python [#1900], single AsyncTavilyClient per group [#1900], YAML configuration support [#1900], and an example workflow demonstrating usage [#1900].
Out of Scope Changes check ✅ Passed All changes are in-scope: new nvidia-nat-tavily package structure, example workflow, plugin registration, and root pyproject.toml updates to wire the new package and extra. No unrelated changes to existing functionality or other packages detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@lakshyaag-tavily lakshyaag-tavily force-pushed the feat/tavily-native-tools branch from b31a254 to 62485c0 Compare April 28, 2026 15:39
@lakshyaag-tavily lakshyaag-tavily marked this pull request as ready for review April 28, 2026 15:40
@lakshyaag-tavily lakshyaag-tavily requested review from a team as code owners April 28, 2026 15:40
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@examples/tavily_weather/README.md`:
- Line 8: Update the README sentence that currently claims the "full Tavily tool
group (`search`, `extract`, `crawl`, `map`)" to match the shipped example config
by removing the excluded tools (`crawl` and `map`) so it lists only the actual
enabled tools (e.g., `search`, `extract`), and replace any occurrence of the
phrase "NAT functions" with "NeMo Agent Toolkit functions"; target the line
containing the phrase "full Tavily tool group (`search`, `extract`, `crawl`,
`map`)" and any instances of "NAT functions" in the README to make these exact
wording changes.

In `@packages/nvidia_nat_tavily/src/nat/meta/pypi.md`:
- Line 21: Replace the phrase "NAT functions" in the pypi.md prose with the
spelled-out form "NeMo Agent Toolkit functions" (or use a backticked package
identifier if you intended to refer to a package), e.g., change the sentence
that currently reads "It provides framework-neutral NAT functions..." to "It
provides framework-neutral NeMo Agent Toolkit functions..." to comply with the
documentation guideline.

In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py`:
- Around line 25-28: The code currently treats whitespace-only API keys as
valid; update the client initialization in _client.py to strip and validate both
the config value (api_key via get_secret_value) and the environment fallback
(os.environ.get("TAVILY_API_KEY")) before using them: call .strip() on the
returned strings, treat empty or None after stripping as invalid, and only
assign to resolved if the stripped value is non-empty; ensure references to
api_key, get_secret_value, and the resolved variable are updated accordingly so
a whitespace-only key is rejected.

In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py`:
- Around line 67-107: The loop over chunks can leave a final SSE block in buffer
when the stream ends without a trailing "\n\n", so after the async for finishes,
if buffer is non-empty call _parse_sse_block(buffer) and run the same handling
logic used inside the loop: inspect event_type (handle "done" by returning
_finalize_research), skip if payload is None, raise on payload.object ==
"error", set model if None, extract delta and append content to content_parts or
assign structured_content, update sources when "sources" present and
"tool_calls" not present, and append tool_calls to trace when include_trace is
set; then proceed to the existing final return calling _finalize_research with
content_parts, structured_content, sources, model, trace and include_trace.
- Around line 1-5: This file is missing the required SPDX Apache-2.0 header; add
the repository's standard SPDX license header as the very first lines of
packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py (above all
imports) so the file begins with the Apache-2.0 SPDX block before imports like
json, logging, and symbols such as logger and any functions in this module.

In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py`:
- Line 175: The public async generator tavily_tools currently lacks a return
type hint; update its signature to declare the return type as
AsyncIterator[FunctionGroup] (i.e., async def tavily_tools(config:
TavilyToolsGroupConfig, _builder: Builder) -> AsyncIterator[FunctionGroup]:),
and add the necessary import for AsyncIterator (from typing import
AsyncIterator) and ensure FunctionGroup is imported from its defining module so
the annotation resolves; keep the existing parameter types
(TavilyToolsGroupConfig, Builder) unchanged.
- Around line 58-60: The function _annotation_accepts_list currently only treats
typing.Union as a union origin, so PEP 604 unions (X | Y) are not recognized;
update the union check to accept both typing.Union and types.UnionType (or
otherwise detect PEP 604 unions) so the branch `if origin is Union:` also fires
for `types.UnionType`; specifically, import types and change the condition that
inspects `origin` (used alongside `typing.get_args(annotation)`) to accept
either `typing.Union` or `types.UnionType` so annotations like `list[str] | str`
are detected as list-compatible and fallback JSON list coercion runs.

In `@packages/nvidia_nat_tavily/tests/test_tools.py`:
- Line 69: Remove the unnecessary `@pytest.mark.asyncio` decorators from the async
test definitions in this test module: search for and delete every occurrence of
the "@pytest.mark.asyncio" decorator used above async test functions (they are
redundant because the async test runner auto-detects async tests); ensure the
async test function definitions remain unchanged (keep their async def names)
and run the test suite to verify no behavior changed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 72494b49-1a4a-4452-b1a1-c4bc6a7e21e2

📥 Commits

Reviewing files that changed from the base of the PR and between d219357 and 7012926.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (13)
  • examples/tavily_weather/README.md
  • examples/tavily_weather/pyproject.toml
  • examples/tavily_weather/src/nat_tavily_weather/__init__.py
  • examples/tavily_weather/src/nat_tavily_weather/configs/config.yml
  • packages/nvidia_nat_tavily/pyproject.toml
  • packages/nvidia_nat_tavily/src/nat/meta/pypi.md
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/__init__.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/register.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py
  • packages/nvidia_nat_tavily/tests/test_tools.py
  • pyproject.toml

Comment thread examples/tavily_weather/README.md Outdated
Comment thread packages/nvidia_nat_tavily/src/nat/meta/pypi.md Outdated
Comment thread packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py Outdated
Comment thread packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py Outdated
Comment thread packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py Outdated
Comment thread packages/nvidia_nat_tavily/tests/test_tools.py Outdated
@bbednarski9 bbednarski9 self-assigned this Apr 28, 2026
@bbednarski9 bbednarski9 added external This issue was filed by someone outside of the NeMo Agent toolkit team improvement Improvement to existing functionality DO NOT MERGE PR should not be merged; see PR for details labels Apr 28, 2026
@coderabbitai coderabbitai Bot removed the DO NOT MERGE PR should not be merged; see PR for details label Apr 28, 2026
@lakshyaag-tavily lakshyaag-tavily force-pushed the feat/tavily-native-tools branch from b83b2e9 to d953f6f Compare April 28, 2026 17:28
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py`:
- Around line 164-167: The research_timeout_seconds Field currently permits
negative numbers; update its Pydantic validation to only allow positive floats
or None by adding a constraint (e.g., use Field(default=900.0, gt=0,
description=...) or replace the annotation with confloat(gt=0) | None) so
research_timeout_seconds rejects non-positive values while still allowing None;
adjust the Field declaration named research_timeout_seconds in the same module
accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 9ee035ed-d47d-4b39-bea1-36d7fa7b21cf

📥 Commits

Reviewing files that changed from the base of the PR and between 7012926 and b83b2e9.

📒 Files selected for processing (6)
  • examples/tavily_weather/README.md
  • packages/nvidia_nat_tavily/src/nat/meta/pypi.md
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py
  • packages/nvidia_nat_tavily/tests/test_tools.py
✅ Files skipped from review due to trivial changes (2)
  • packages/nvidia_nat_tavily/src/nat/meta/pypi.md
  • examples/tavily_weather/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/nvidia_nat_tavily/tests/test_tools.py

Comment thread packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py (1)

164-167: ⚠️ Potential issue | 🟡 Minor

Reject non-positive research_timeout_seconds in the model.

0 and negative values are accepted today and only fail later when the HTTP client consumes them. Add a field constraint so invalid config is rejected at parse time.

🛡️ Proposed fix
     research_timeout_seconds: float | None = Field(
         default=900.0,
+        gt=0,
         description="HTTP timeout for the research SSE stream. None disables the client-side cap.",
     )

As per coding guidelines: "Validate and sanitise all user input, especially in web or CLI interfaces."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py` around lines 164
- 167, The model currently accepts zero or negative values for the
research_timeout_seconds Field; reject non-positive values at parse time by
adding a constraint (e.g. set gt=0 on the Field) or a Pydantic validator for the
research_timeout_seconds attribute so only None or numbers > 0 are allowed;
update the Field declaration for research_timeout_seconds (or add a `@validator`
on the containing model) and include a clear error message if validation fails.
🧹 Nitpick comments (1)
packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py (1)

54-55: Align the trace annotation with the actual payload shape.

tool_calls is appended as one list per SSE event, so trace is effectively list[list[dict]], not list[dict]. Tightening the annotation here will make the accumulator contract match what the code returns.

♻️ Proposed fix
 def _finalize_research(
     *,
     content_parts: list[str],
     structured_content: dict | None,
     sources: list[dict],
     model: str | None,
-    trace: list[dict],
+    trace: list[list[dict]],
     include_trace: bool,
 ) -> dict:
@@
-    trace: list[dict] = []
+    trace: list[list[dict]] = []

Also applies to: 79-80, 109-110

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py` around
lines 54 - 55, The type annotation for the parameter named "trace" is incorrect:
update its type from list[dict] to list[list[dict]] wherever it's declared (the
function signatures in this module that accept a trace parameter) so the
accumulator contract matches that tool_calls are appended as one list per SSE
event; adjust all occurrences (including the signatures where include_trace is
present) to use list[list[dict]].
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/nvidia_nat_tavily/tests/test_tools.py`:
- Around line 1-3: Replace the short two-line SPDX pair at the top of the test
module with the repository's full standard Apache-2.0 SPDX header template: add
the complete multi-line header block (including copyright notice line,
SPDX-License-Identifier, and any required boilerplate lines) at the very start
of packages/nvidia_nat_tavily/tests/test_tools.py so the file begins with the
canonical Apache-2.0 header template instead of just the two SPDX lines.

---

Duplicate comments:
In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py`:
- Around line 164-167: The model currently accepts zero or negative values for
the research_timeout_seconds Field; reject non-positive values at parse time by
adding a constraint (e.g. set gt=0 on the Field) or a Pydantic validator for the
research_timeout_seconds attribute so only None or numbers > 0 are allowed;
update the Field declaration for research_timeout_seconds (or add a `@validator`
on the containing model) and include a clear error message if validation fails.

---

Nitpick comments:
In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py`:
- Around line 54-55: The type annotation for the parameter named "trace" is
incorrect: update its type from list[dict] to list[list[dict]] wherever it's
declared (the function signatures in this module that accept a trace parameter)
so the accumulator contract matches that tool_calls are appended as one list per
SSE event; adjust all occurrences (including the signatures where include_trace
is present) to use list[list[dict]].
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 38f523cf-e1d0-430d-b7bb-30eb2f3e274e

📥 Commits

Reviewing files that changed from the base of the PR and between b83b2e9 and d953f6f.

📒 Files selected for processing (6)
  • examples/tavily_weather/README.md
  • packages/nvidia_nat_tavily/src/nat/meta/pypi.md
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/parse_streaming.py
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py
  • packages/nvidia_nat_tavily/tests/test_tools.py
✅ Files skipped from review due to trivial changes (2)
  • packages/nvidia_nat_tavily/src/nat/meta/pypi.md
  • examples/tavily_weather/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/_client.py

Comment thread packages/nvidia_nat_tavily/tests/test_tools.py
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py (1)

1-24: Add a module docstring for this public plugin module.

This file exposes a public integration module, but it currently starts straight with imports after the SPDX header. Please add a short Google-style module docstring describing that it builds the framework-neutral tavily function group and reflects Tavily SDK signatures into NAT tool schemas.

As per coding guidelines, "Provide Google-style docstrings for every public module, class, function and CLI command."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py` around lines 1 -
24, Add a Google-style module docstring at the top of this public plugin module
(immediately after the SPDX header and before imports) that briefly describes
the module's purpose: it builds the framework-neutral tavily function group and
reflects Tavily SDK signatures into NAT tool schemas for use by the NAT
integration; mention that this module exposes the public tavily API surface and
any important usage notes or exported symbols (e.g., the tavily function group)
so documentation tools and linters recognize the module as documented.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py`:
- Around line 181-208: The wrapper coroutines _search, _extract, _crawl, _map,
and _research are registered via group.add_function but have empty __doc__
strings, so the LLM-facing tool descriptions are missing; update each wrapper's
docstring (assign or declare a docstring on
_search/_extract/_crawl/_map/_research) to the matching entry from _DESCRIPTIONS
(and ensure the text describes the LLM-facing parameters/result format rather
than internal wrapper args) before calling group.add_function so the registered
tool descriptions are populated.

---

Nitpick comments:
In `@packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py`:
- Around line 1-24: Add a Google-style module docstring at the top of this
public plugin module (immediately after the SPDX header and before imports) that
briefly describes the module's purpose: it builds the framework-neutral tavily
function group and reflects Tavily SDK signatures into NAT tool schemas for use
by the NAT integration; mention that this module exposes the public tavily API
surface and any important usage notes or exported symbols (e.g., the tavily
function group) so documentation tools and linters recognize the module as
documented.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 2cbbd327-caef-42e4-a2db-f2369fbc2b77

📥 Commits

Reviewing files that changed from the base of the PR and between d953f6f and 3c3f089.

📒 Files selected for processing (1)
  • packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py

Comment thread packages/nvidia_nat_tavily/src/nat/plugins/tavily/tools.py
@lakshyaag-tavily lakshyaag-tavily force-pushed the feat/tavily-native-tools branch 2 times, most recently from 4c7a10e to 708e6c2 Compare April 30, 2026 15:25
This commit introduces the `nvidia-nat-tavily` package, which integrates Tavily with the NeMo Agent Toolkit. It includes a new example workflow for weather queries using Tavily and LangChain, demonstrating the functionality of the new package.

Key changes:
- Added `nvidia-nat-tavily` package with necessary configurations and dependencies.
- Created example workflow `nat_tavily_weather` showcasing Tavily's web search capabilities.
- Updated `pyproject.toml` and `uv.lock` to include the new package.
- Added tests for the Tavily search functionality to ensure proper integration.

Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
…ction group

This commit updates the Tavily integration by consolidating the search, extract, crawl, and map functionalities into a single function group.

Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
Signed-off-by: Lakshya Agarwal <lakshya.agarwal@tavily.com>
@lakshyaag-tavily lakshyaag-tavily force-pushed the feat/tavily-native-tools branch from 708e6c2 to e9d6ae1 Compare April 30, 2026 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

external This issue was filed by someone outside of the NeMo Agent toolkit team improvement Improvement to existing functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Tavily tools as a package for framework-neutral usage

2 participants