@plasm_lang/vercel-agent 0.3.78 → 0.3.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/instructions.md +1 -2
- package/bin/plasm-agent.mjs +5 -7
- package/package.json +26 -19
- package/scripts/plasm-cli.ts +4 -3
- package/scripts/run-plasm-cli.mjs +41 -0
- package/src/cli/init-scaffold.ts +198 -0
- package/src/cli/init.ts +16 -278
- package/src/cli/nitro-dev.ts +2 -6
- package/src/cli/node-dev-imports.ts +14 -0
- package/src/package-version.ts +14 -0
- package/src/project-info.ts +2 -1
- package/templates/mcp-radar/.vercelignore +3 -0
- package/templates/mcp-radar/README.md +139 -0
- package/templates/mcp-radar/agent/agent.ts +38 -0
- package/templates/mcp-radar/agent/catalogs/hackernews/README.md +23 -0
- package/templates/mcp-radar/agent/catalogs/hackernews/domain.yaml +329 -0
- package/templates/mcp-radar/agent/catalogs/hackernews/eval/cases.yaml +112 -0
- package/templates/mcp-radar/agent/catalogs/hackernews/mappings.yaml +129 -0
- package/templates/mcp-radar/agent/catalogs/tavily/README.md +218 -0
- package/templates/mcp-radar/agent/catalogs/tavily/domain.yaml +373 -0
- package/templates/mcp-radar/agent/catalogs/tavily/eval/cases.yaml +56 -0
- package/templates/mcp-radar/agent/catalogs/tavily/eval/google-gemma-3-4b-it.latest.human.txt +67 -0
- package/templates/mcp-radar/agent/catalogs/tavily/eval/google-gemma-3-4b-it.latest.json +363 -0
- package/templates/mcp-radar/agent/catalogs/tavily/mappings.yaml +171 -0
- package/templates/mcp-radar/agent/channels/mcp-radar.ts +85 -0
- package/templates/mcp-radar/agent/hooks/proof-audit.ts +10 -0
- package/templates/mcp-radar/agent/instructions.md +24 -0
- package/templates/mcp-radar/agent/research/mcp-innovations-proof.md +4 -0
- package/templates/mcp-radar/agent/schedules/mcp-radar-scan.ts +14 -0
- package/templates/mcp-radar/agent/skills/mcp-proof-format.md +19 -0
- package/templates/mcp-radar/api/[[...path]].ts +23 -0
- package/templates/mcp-radar/evals/mcp-radar-discover.eval.ts +14 -0
- package/templates/mcp-radar/lib/proof-store.ts +265 -0
- package/templates/mcp-radar/lib/run-radar.ts +214 -0
- package/templates/mcp-radar/nitro.config.ts +17 -0
- package/templates/mcp-radar/package.json +14 -0
- package/templates/mcp-radar/public/index.html +10 -0
- package/templates/mcp-radar/routes/[...path].ts +29 -0
- package/templates/mcp-radar/scripts/run-evals.ts +46 -0
- package/templates/mcp-radar/scripts/smoke-channel.ts +66 -0
- package/templates/mcp-radar/vercel.json +15 -0
- package/templates/scaffold/.vercelignore +3 -0
- package/templates/scaffold/api/[[...path]].ts +23 -0
- package/templates/scaffold/nitro.config.ts +17 -0
- package/templates/scaffold/public/index.html +10 -0
- package/templates/scaffold/public/index.mcp-radar.html +10 -0
- package/templates/scaffold/routes/[...path].ts +29 -0
- package/templates/scaffold/vercel.default.json +4 -0
- package/templates/scaffold/vercel.mcp-radar.json +15 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Tavily REST API — Plasm CGS Schema
|
|
2
|
+
|
|
3
|
+
A [Plasm](../../README.md) domain model for the [Tavily API](https://docs.tavily.com/), covering the full current surface: web search, URL extraction, site crawling, and async deep research.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
export TAVILY_API_TOKEN=tvly-... # in /Users/ryan/code/plasm/.env
|
|
7
|
+
source /Users/ryan/code/plasm/.env
|
|
8
|
+
|
|
9
|
+
cargo run --bin plasm -- \
|
|
10
|
+
--schema apis/tavily \
|
|
11
|
+
--backend https://api.tavily.com \
|
|
12
|
+
--repl
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## What is implemented
|
|
18
|
+
|
|
19
|
+
### Entities
|
|
20
|
+
|
|
21
|
+
| Entity | Key | Fields |
|
|
22
|
+
|--------|-----|--------|
|
|
23
|
+
| `SearchResult` | `url` | url, title, content, score, raw_content, favicon |
|
|
24
|
+
| `ExtractResult` | `url` | url, raw_content, favicon |
|
|
25
|
+
| `ResearchTask` | `request_id` | request_id, status, input, model, created_at, content, sources, response_time |
|
|
26
|
+
|
|
27
|
+
`ExtractResult` is shared between `/extract` and `/crawl` — both endpoints return the same `{url, raw_content, favicon}` shape.
|
|
28
|
+
|
|
29
|
+
### Capabilities
|
|
30
|
+
|
|
31
|
+
| Capability | Kind | CLI | Endpoint | Tested |
|
|
32
|
+
|------------|------|-----|----------|--------|
|
|
33
|
+
| `web_search` | search | `searchresult search --query "..."` | `POST /search` | ✓ Live |
|
|
34
|
+
| `url_extract` | query | `extractresult query --urls https://...` | `POST /extract` | ✓ Live |
|
|
35
|
+
| `site_crawl` | query | `extractresult site-crawl --url https://...` | `POST /crawl` | ✓ Live |
|
|
36
|
+
| `research_create` | create | `researchtask research-create --input "..."` | `POST /research` | ✓ Live |
|
|
37
|
+
| `research_get` | get | `researchtask <request_id>` | `GET /research/{id}` | ✓ Live |
|
|
38
|
+
|
|
39
|
+
`site_map` (`POST /map`) is deferred — see Known Limitations.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## CLI examples
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
BASE="--schema apis/tavily --backend https://api.tavily.com"
|
|
47
|
+
|
|
48
|
+
# Web search — basic
|
|
49
|
+
plasm $BASE searchresult search \
|
|
50
|
+
--query "Rust async runtime comparison 2025" \
|
|
51
|
+
--max_results 5
|
|
52
|
+
|
|
53
|
+
# News search with LLM answer
|
|
54
|
+
plasm $BASE searchresult search \
|
|
55
|
+
--query "AI agent frameworks latest releases" \
|
|
56
|
+
--topic news \
|
|
57
|
+
--include_answer \
|
|
58
|
+
--max_results 5
|
|
59
|
+
|
|
60
|
+
# Date-bounded search
|
|
61
|
+
plasm $BASE searchresult search \
|
|
62
|
+
--query "Rust 1.94 release notes" \
|
|
63
|
+
--start_date 2026-01-01 \
|
|
64
|
+
--end_date 2026-03-31 \
|
|
65
|
+
--max_results 3
|
|
66
|
+
|
|
67
|
+
# Domain-filtered search
|
|
68
|
+
plasm $BASE searchresult search \
|
|
69
|
+
--query "Rust async tutorial" \
|
|
70
|
+
--include_domains docs.rs \
|
|
71
|
+
--include_domains blog.rust-lang.org \
|
|
72
|
+
--max_results 5
|
|
73
|
+
|
|
74
|
+
# Fast search with auto parameter selection
|
|
75
|
+
plasm $BASE searchresult search \
|
|
76
|
+
--query "latest OpenClaw features" \
|
|
77
|
+
--search_depth fast \
|
|
78
|
+
--auto_parameters \
|
|
79
|
+
--max_results 3
|
|
80
|
+
|
|
81
|
+
# Extract a single URL
|
|
82
|
+
plasm $BASE extractresult query \
|
|
83
|
+
--urls https://docs.tavily.com/documentation/about
|
|
84
|
+
|
|
85
|
+
# Extract multiple URLs
|
|
86
|
+
plasm $BASE extractresult query \
|
|
87
|
+
--urls https://blog.rust-lang.org/ \
|
|
88
|
+
--urls https://doc.rust-lang.org/book/ \
|
|
89
|
+
--extract_depth advanced \
|
|
90
|
+
--format markdown
|
|
91
|
+
|
|
92
|
+
# Crawl a website
|
|
93
|
+
plasm $BASE extractresult site-crawl \
|
|
94
|
+
--url https://docs.tavily.com \
|
|
95
|
+
--max_depth 2 \
|
|
96
|
+
--limit 10
|
|
97
|
+
|
|
98
|
+
# Crawl with instructions
|
|
99
|
+
plasm $BASE extractresult site-crawl \
|
|
100
|
+
--url https://docs.tavily.com \
|
|
101
|
+
--instructions "Find all pages about the Python SDK" \
|
|
102
|
+
--limit 5
|
|
103
|
+
|
|
104
|
+
# Start async research task
|
|
105
|
+
plasm $BASE researchtask research-create \
|
|
106
|
+
--input "What is Plasm, the Rust typed agent CLI for REST APIs?" \
|
|
107
|
+
--model mini \
|
|
108
|
+
--citation_format numbered
|
|
109
|
+
|
|
110
|
+
# Poll research status (returns content when completed)
|
|
111
|
+
plasm $BASE researchtask ec406c91-e2e9-45cd-8f07-0d5725472c1a
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Authentication
|
|
117
|
+
|
|
118
|
+
Set `TAVILY_API_TOKEN` to your Tavily API key. The schema reads from this variable:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
export TAVILY_API_TOKEN=tvly-your_key_here
|
|
122
|
+
# or source the project .env:
|
|
123
|
+
source /Users/ryan/code/plasm/.env
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## search_depth values (updated Dec 2025)
|
|
129
|
+
|
|
130
|
+
The `search_depth` parameter now has four options:
|
|
131
|
+
|
|
132
|
+
| Value | Cost | Latency | Content |
|
|
133
|
+
|-------|------|---------|---------|
|
|
134
|
+
| `basic` | 1 credit | balanced | 1 NLP summary per URL |
|
|
135
|
+
| `fast` (BETA) | 1 credit | low | multiple relevant snippets per URL |
|
|
136
|
+
| `ultra-fast` (BETA) | 1 credit | lowest | 1 NLP summary per URL |
|
|
137
|
+
| `advanced` | 2 credits | high | multiple high-precision snippets |
|
|
138
|
+
|
|
139
|
+
Earlier snapshots of this schema only exposed `basic` and `advanced` for `search_depth`. The current `apis/tavily` schema includes all four values above.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Integration testing (live, March 2026)
|
|
144
|
+
|
|
145
|
+
All capabilities tested against the real Tavily API with the dev token.
|
|
146
|
+
|
|
147
|
+
### web_search
|
|
148
|
+
|
|
149
|
+
1. **Basic search**: `--query "Plasm Rust REST API typed agent" --max_results 3` → 3 ranked results, correct score and content fields decoded. ✓
|
|
150
|
+
2. **News + answer**: `--topic news --include_answer --max_results 3` → news results from past week including OpenClaw surge coverage. ✓
|
|
151
|
+
3. **Date range** (`start_date`/`end_date` are new params): `--start_date 2026-01-01 --end_date 2026-03-31` → results limited to Q1 2026, including Rust 1.94.1 release blog. ✓
|
|
152
|
+
4. **fast depth + auto_parameters** (both new params): returns results with `auto_parameters` flag set. ✓
|
|
153
|
+
|
|
154
|
+
### url_extract
|
|
155
|
+
|
|
156
|
+
- Single URL extraction: `https://docs.tavily.com/documentation/about` → full `raw_content` field decoded (1,900+ char markdown). ✓
|
|
157
|
+
|
|
158
|
+
### site_crawl
|
|
159
|
+
|
|
160
|
+
- `--url https://docs.tavily.com --max_depth 1 --limit 3` → 3 crawled pages (`/`, `/changelog`, `/welcome`) decoded as `ExtractResult` entities. ✓
|
|
161
|
+
|
|
162
|
+
**Note:** A runtime bug was found and fixed during testing. Scope parameters whose names match entity field names (e.g. `url` in `site_crawl` matching `ExtractResult.url`) were incorrectly applied as client-side result filters, returning 0 results. The fix adds scope/search parameter awareness to `entity_field_predicate_scoped` in `execution.rs` — only true field predicates (not scope params) are applied client-side. This fix also benefits GitHub `issue_query` (owner/repo scope params) and Jira `comment_query` (issueIdOrKey scope param).
|
|
163
|
+
|
|
164
|
+
### research_create + research_get
|
|
165
|
+
|
|
166
|
+
- `POST /research` with `--input "What is Plasm...?" --model mini` → request_id `ec406c91...`, status `pending`. ✓
|
|
167
|
+
- `GET /research/{request_id}` after ~35 seconds → status `completed`, `content` field with 530-char report. ✓
|
|
168
|
+
|
|
169
|
+
**Note during testing:** The research GET response uses `content` (not `report`) for the generated text. The initial schema used `report` — corrected to `content`.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Design notes
|
|
174
|
+
|
|
175
|
+
### All capabilities use POST body
|
|
176
|
+
|
|
177
|
+
Unlike REST APIs that use query params for GET requests, Tavily puts all parameters in the JSON request body (even for non-mutating operations). The CML `body:` block is used for `web_search`, `url_extract`, and `site_crawl`. Only `research_get` uses a GET with no body.
|
|
178
|
+
|
|
179
|
+
### url_extract and site_crawl as `kind: query`
|
|
180
|
+
|
|
181
|
+
Both capabilities POST a body and return a list of entities — the same execution path as any paginated query. Using `kind: query` means:
|
|
182
|
+
- CLI generates repeatable/typed flags from `parameters:`
|
|
183
|
+
- Parameters flow through predicate compilation into the CML env
|
|
184
|
+
- Response decoded as a collection via `response: {items: results}`
|
|
185
|
+
|
|
186
|
+
### research_create as `kind: create`
|
|
187
|
+
|
|
188
|
+
The async research endpoint creates a task (HTTP 201) and returns `{request_id, status: pending, ...}`. The `kind: create` capability collects flags via `args_to_input` into a Value::Object, then `body: {type: var, name: input}` sends that whole object as the request body. The create response is decoded as a single `ResearchTask` entity.
|
|
189
|
+
|
|
190
|
+
### Scope params excluded from client-side filtering
|
|
191
|
+
|
|
192
|
+
Capabilities like `site_crawl` (with `url: role: scope`) and `url_extract` (with `urls: role: scope`) need their scope param predicates excluded from client-side entity filtering. The runtime now calls `capability_non_filter_params()` to get the set of scope/search params and exclude them in `entity_field_predicate_scoped()`.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Known limitations
|
|
197
|
+
|
|
198
|
+
### site_map deferred
|
|
199
|
+
|
|
200
|
+
`POST /map` returns `{results: ["url1", "url2", ...]}` — a bare string array. The Plasm decoder expects JSON objects with named fields; it cannot decode bare string items as entities. This is a decoder gap. Once the decoder supports "use the bare string value as the id field", `site_map` can be modelled.
|
|
201
|
+
|
|
202
|
+
Workaround: use `site_crawl` when you need page content, or call the map endpoint directly with `curl`.
|
|
203
|
+
|
|
204
|
+
### research polling is manual
|
|
205
|
+
|
|
206
|
+
The research workflow requires two steps: `research_create` (start task) → wait → `research_get` (poll). There is no automatic polling loop. Agents must poll manually by re-running `researchtask <request_id>`. A future `kind: async_job` capability kind with built-in polling would improve this.
|
|
207
|
+
|
|
208
|
+
### Large `content` field
|
|
209
|
+
|
|
210
|
+
Research `content` can be thousands of characters. In table output format, it's truncated. Use `--output json` or `--output compact` to get the full text.
|
|
211
|
+
|
|
212
|
+
### `include_domains` / `exclude_domains` in body
|
|
213
|
+
|
|
214
|
+
For web search, `include_domains` and `exclude_domains` are sent as JSON arrays in the body (not repeated query params). Tavily's body parser handles them correctly. They appear in the CLI as repeatable flags: `--include_domains reuters.com --include_domains bbc.com`.
|
|
215
|
+
|
|
216
|
+
### `answer` field not on SearchResult entity
|
|
217
|
+
|
|
218
|
+
The search response includes a top-level `answer` string (LLM-generated summary) separate from the individual results. This field is NOT decoded into `SearchResult` entities because it's a response-level field that doesn't belong to any individual result. Agents requesting the answer should use `--include_answer` and read the raw JSON output.
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
http_backend: https://api.tavily.com
|
|
3
|
+
entities:
|
|
4
|
+
SearchResult:
|
|
5
|
+
id_field: url
|
|
6
|
+
description: A ranked web search result from Tavily Search.
|
|
7
|
+
fields:
|
|
8
|
+
url:
|
|
9
|
+
required: true
|
|
10
|
+
value_ref: nv_search_result_url
|
|
11
|
+
title:
|
|
12
|
+
required: false
|
|
13
|
+
value_ref: nv_search_result_title
|
|
14
|
+
content:
|
|
15
|
+
required: false
|
|
16
|
+
value_ref: nv_search_result_content
|
|
17
|
+
score:
|
|
18
|
+
required: false
|
|
19
|
+
value_ref: nv_search_result_score
|
|
20
|
+
raw_content:
|
|
21
|
+
required: false
|
|
22
|
+
value_ref: nv_search_result_raw_content
|
|
23
|
+
favicon:
|
|
24
|
+
required: false
|
|
25
|
+
value_ref: nv_search_result_favicon
|
|
26
|
+
ExtractResult:
|
|
27
|
+
id_field: url
|
|
28
|
+
description: Extracted or crawled page content from Tavily Extract / Crawl.
|
|
29
|
+
fields:
|
|
30
|
+
url:
|
|
31
|
+
required: true
|
|
32
|
+
value_ref: nv_extract_result_url
|
|
33
|
+
raw_content:
|
|
34
|
+
required: false
|
|
35
|
+
value_ref: nv_extract_result_raw_content
|
|
36
|
+
favicon:
|
|
37
|
+
required: false
|
|
38
|
+
value_ref: nv_extract_result_favicon
|
|
39
|
+
ResearchTask:
|
|
40
|
+
id_field: request_id
|
|
41
|
+
description: An async Tavily Research task.
|
|
42
|
+
fields:
|
|
43
|
+
request_id:
|
|
44
|
+
required: true
|
|
45
|
+
value_ref: nv_research_task_request_id
|
|
46
|
+
status:
|
|
47
|
+
required: false
|
|
48
|
+
value_ref: nv_research_task_status
|
|
49
|
+
input:
|
|
50
|
+
required: false
|
|
51
|
+
value_ref: nv_research_task_input
|
|
52
|
+
model:
|
|
53
|
+
required: false
|
|
54
|
+
value_ref: nv_research_task_model
|
|
55
|
+
created_at:
|
|
56
|
+
required: false
|
|
57
|
+
value_ref: nv_research_task_created_at
|
|
58
|
+
content:
|
|
59
|
+
required: false
|
|
60
|
+
value_ref: nv_research_task_content
|
|
61
|
+
response_time:
|
|
62
|
+
required: false
|
|
63
|
+
value_ref: nv_research_task_response_time
|
|
64
|
+
sources:
|
|
65
|
+
required: false
|
|
66
|
+
value_ref: nv_research_task_sources
|
|
67
|
+
capabilities:
|
|
68
|
+
web_search:
|
|
69
|
+
kind: search
|
|
70
|
+
entity: SearchResult
|
|
71
|
+
description: AI-powered web search. Returns ranked results with optional LLM answer.
|
|
72
|
+
parameters:
|
|
73
|
+
- name: query
|
|
74
|
+
value_ref: nv_wire_str_short
|
|
75
|
+
required: true
|
|
76
|
+
role: search
|
|
77
|
+
- name: search_depth
|
|
78
|
+
value_ref: nv_web_search_search_depth
|
|
79
|
+
required: false
|
|
80
|
+
role: response_control
|
|
81
|
+
- name: chunks_per_source
|
|
82
|
+
value_ref: nv_wire_int
|
|
83
|
+
required: false
|
|
84
|
+
role: response_control
|
|
85
|
+
- name: max_results
|
|
86
|
+
value_ref: nv_wire_int
|
|
87
|
+
required: false
|
|
88
|
+
role: response_control
|
|
89
|
+
- name: topic
|
|
90
|
+
value_ref: nv_web_search_topic
|
|
91
|
+
required: false
|
|
92
|
+
- name: time_range
|
|
93
|
+
value_ref: nv_web_search_time_range
|
|
94
|
+
required: false
|
|
95
|
+
- name: start_date
|
|
96
|
+
value_ref: nv_wire_str_short
|
|
97
|
+
required: false
|
|
98
|
+
- name: end_date
|
|
99
|
+
value_ref: nv_wire_str_short
|
|
100
|
+
required: false
|
|
101
|
+
- name: include_answer
|
|
102
|
+
value_ref: nv_wire_bool
|
|
103
|
+
required: false
|
|
104
|
+
role: response_control
|
|
105
|
+
- name: include_raw_content
|
|
106
|
+
value_ref: nv_wire_bool
|
|
107
|
+
required: false
|
|
108
|
+
role: response_control
|
|
109
|
+
- name: include_images
|
|
110
|
+
value_ref: nv_wire_bool
|
|
111
|
+
required: false
|
|
112
|
+
role: response_control
|
|
113
|
+
- name: include_favicon
|
|
114
|
+
value_ref: nv_wire_bool
|
|
115
|
+
required: false
|
|
116
|
+
role: response_control
|
|
117
|
+
- name: include_domains
|
|
118
|
+
value_ref: nv_web_search_include_domains
|
|
119
|
+
required: false
|
|
120
|
+
- name: exclude_domains
|
|
121
|
+
value_ref: nv_web_search_exclude_domains
|
|
122
|
+
required: false
|
|
123
|
+
- name: country
|
|
124
|
+
value_ref: nv_wire_str_short
|
|
125
|
+
required: false
|
|
126
|
+
- name: auto_parameters
|
|
127
|
+
value_ref: nv_wire_bool
|
|
128
|
+
required: false
|
|
129
|
+
role: response_control
|
|
130
|
+
- name: exact_match
|
|
131
|
+
value_ref: nv_wire_bool
|
|
132
|
+
required: false
|
|
133
|
+
url_extract:
|
|
134
|
+
kind: query
|
|
135
|
+
entity: ExtractResult
|
|
136
|
+
description: Extract cleaned content from one or more URLs.
|
|
137
|
+
parameters:
|
|
138
|
+
- name: urls
|
|
139
|
+
value_ref: nv_url_extract_urls
|
|
140
|
+
required: true
|
|
141
|
+
- name: query
|
|
142
|
+
value_ref: nv_wire_str_short
|
|
143
|
+
required: false
|
|
144
|
+
- name: extract_depth
|
|
145
|
+
value_ref: nv_url_extract_extract_depth
|
|
146
|
+
required: false
|
|
147
|
+
role: response_control
|
|
148
|
+
- name: format
|
|
149
|
+
value_ref: nv_url_extract_format
|
|
150
|
+
required: false
|
|
151
|
+
role: response_control
|
|
152
|
+
- name: chunks_per_source
|
|
153
|
+
value_ref: nv_wire_int
|
|
154
|
+
required: false
|
|
155
|
+
role: response_control
|
|
156
|
+
- name: include_images
|
|
157
|
+
value_ref: nv_wire_bool
|
|
158
|
+
required: false
|
|
159
|
+
role: response_control
|
|
160
|
+
- name: include_favicon
|
|
161
|
+
value_ref: nv_wire_bool
|
|
162
|
+
required: false
|
|
163
|
+
role: response_control
|
|
164
|
+
site_crawl:
|
|
165
|
+
kind: query
|
|
166
|
+
entity: ExtractResult
|
|
167
|
+
description: Graph-based website traversal — crawl multiple pages in parallel.
|
|
168
|
+
parameters:
|
|
169
|
+
- name: url
|
|
170
|
+
value_ref: nv_wire_str_short
|
|
171
|
+
required: true
|
|
172
|
+
role: scope
|
|
173
|
+
- name: instructions
|
|
174
|
+
value_ref: nv_wire_str_short
|
|
175
|
+
required: false
|
|
176
|
+
- name: max_depth
|
|
177
|
+
value_ref: nv_wire_int
|
|
178
|
+
required: false
|
|
179
|
+
role: response_control
|
|
180
|
+
- name: max_breadth
|
|
181
|
+
value_ref: nv_wire_int
|
|
182
|
+
required: false
|
|
183
|
+
role: response_control
|
|
184
|
+
- name: limit
|
|
185
|
+
value_ref: nv_wire_int
|
|
186
|
+
required: false
|
|
187
|
+
role: response_control
|
|
188
|
+
- name: chunks_per_source
|
|
189
|
+
value_ref: nv_wire_int
|
|
190
|
+
required: false
|
|
191
|
+
role: response_control
|
|
192
|
+
- name: include_images
|
|
193
|
+
value_ref: nv_wire_bool
|
|
194
|
+
required: false
|
|
195
|
+
role: response_control
|
|
196
|
+
research_create:
|
|
197
|
+
kind: create
|
|
198
|
+
entity: ResearchTask
|
|
199
|
+
description: Start an async deep research task (returns request_id for polling).
|
|
200
|
+
provides:
|
|
201
|
+
- request_id
|
|
202
|
+
- created_at
|
|
203
|
+
- status
|
|
204
|
+
- input
|
|
205
|
+
- model
|
|
206
|
+
parameters:
|
|
207
|
+
- name: input
|
|
208
|
+
value_ref: nv_wire_str_short
|
|
209
|
+
required: true
|
|
210
|
+
- name: model
|
|
211
|
+
value_ref: nv_research_create_model
|
|
212
|
+
required: false
|
|
213
|
+
- name: citation_format
|
|
214
|
+
value_ref: nv_research_create_citation_format
|
|
215
|
+
required: false
|
|
216
|
+
research_get:
|
|
217
|
+
kind: get
|
|
218
|
+
entity: ResearchTask
|
|
219
|
+
description: Poll the status and retrieve the report for a research task.
|
|
220
|
+
provides:
|
|
221
|
+
- request_id
|
|
222
|
+
- status
|
|
223
|
+
- input
|
|
224
|
+
- model
|
|
225
|
+
- created_at
|
|
226
|
+
- content
|
|
227
|
+
- response_time
|
|
228
|
+
- sources
|
|
229
|
+
auth:
|
|
230
|
+
scheme: bearer_token
|
|
231
|
+
env: TAVILY_API_TOKEN
|
|
232
|
+
hosted_kv: plasm:outbound:v1:catalog:tavily
|
|
233
|
+
values:
|
|
234
|
+
nv_extract_result_favicon:
|
|
235
|
+
type: string
|
|
236
|
+
string_semantics: short
|
|
237
|
+
description: Favicon URL for the page's domain.
|
|
238
|
+
nv_extract_result_raw_content:
|
|
239
|
+
type: string
|
|
240
|
+
string_semantics: markdown
|
|
241
|
+
description: Full extracted page content (markdown or plain text).
|
|
242
|
+
nv_extract_result_url:
|
|
243
|
+
type: string
|
|
244
|
+
string_semantics: short
|
|
245
|
+
description: URL of the extracted page.
|
|
246
|
+
nv_research_create_citation_format:
|
|
247
|
+
type: select
|
|
248
|
+
allowed_values:
|
|
249
|
+
- numbered
|
|
250
|
+
- mla
|
|
251
|
+
- apa
|
|
252
|
+
- chicago
|
|
253
|
+
nv_research_create_model:
|
|
254
|
+
type: select
|
|
255
|
+
allowed_values:
|
|
256
|
+
- mini
|
|
257
|
+
- pro
|
|
258
|
+
- auto
|
|
259
|
+
nv_research_task_content:
|
|
260
|
+
type: string
|
|
261
|
+
string_semantics: markdown
|
|
262
|
+
description: Full research content/report (populated when status=completed).
|
|
263
|
+
nv_research_task_created_at:
|
|
264
|
+
type: date
|
|
265
|
+
value_format: rfc3339
|
|
266
|
+
description: Timestamp when the task was created.
|
|
267
|
+
nv_research_task_input:
|
|
268
|
+
type: string
|
|
269
|
+
string_semantics: short
|
|
270
|
+
description: The research question submitted.
|
|
271
|
+
nv_research_task_model:
|
|
272
|
+
type: select
|
|
273
|
+
allowed_values:
|
|
274
|
+
- mini
|
|
275
|
+
- pro
|
|
276
|
+
- auto
|
|
277
|
+
description: Research agent model used.
|
|
278
|
+
nv_research_task_request_id:
|
|
279
|
+
type: string
|
|
280
|
+
string_semantics: short
|
|
281
|
+
description: Unique identifier for the research task (use to poll status).
|
|
282
|
+
nv_research_task_response_time:
|
|
283
|
+
type: number
|
|
284
|
+
description: Time in seconds for the research task to complete.
|
|
285
|
+
nv_research_task_status:
|
|
286
|
+
type: select
|
|
287
|
+
allowed_values:
|
|
288
|
+
- pending
|
|
289
|
+
- running
|
|
290
|
+
- completed
|
|
291
|
+
- failed
|
|
292
|
+
description: Current execution status of the task.
|
|
293
|
+
nv_search_result_content:
|
|
294
|
+
type: string
|
|
295
|
+
string_semantics: markdown
|
|
296
|
+
description: Relevance snippet or chunked content from the page.
|
|
297
|
+
nv_search_result_favicon:
|
|
298
|
+
type: string
|
|
299
|
+
string_semantics: short
|
|
300
|
+
description: Favicon URL for the result's domain.
|
|
301
|
+
nv_search_result_raw_content:
|
|
302
|
+
type: string
|
|
303
|
+
string_semantics: markdown
|
|
304
|
+
description: Full cleaned page content (only when include_raw_content=true).
|
|
305
|
+
nv_search_result_score:
|
|
306
|
+
type: number
|
|
307
|
+
description: Relevance score (0–1).
|
|
308
|
+
nv_search_result_title:
|
|
309
|
+
type: string
|
|
310
|
+
string_semantics: short
|
|
311
|
+
description: Title of the source page.
|
|
312
|
+
nv_search_result_url:
|
|
313
|
+
type: string
|
|
314
|
+
string_semantics: short
|
|
315
|
+
description: URL of the source page.
|
|
316
|
+
nv_url_extract_extract_depth:
|
|
317
|
+
type: select
|
|
318
|
+
allowed_values:
|
|
319
|
+
- basic
|
|
320
|
+
- advanced
|
|
321
|
+
nv_url_extract_format:
|
|
322
|
+
type: select
|
|
323
|
+
allowed_values:
|
|
324
|
+
- markdown
|
|
325
|
+
- text
|
|
326
|
+
nv_web_search_search_depth:
|
|
327
|
+
type: select
|
|
328
|
+
allowed_values:
|
|
329
|
+
- basic
|
|
330
|
+
- fast
|
|
331
|
+
- ultra-fast
|
|
332
|
+
- advanced
|
|
333
|
+
nv_web_search_time_range:
|
|
334
|
+
type: select
|
|
335
|
+
allowed_values:
|
|
336
|
+
- day
|
|
337
|
+
- week
|
|
338
|
+
- month
|
|
339
|
+
- year
|
|
340
|
+
- d
|
|
341
|
+
- w
|
|
342
|
+
- m
|
|
343
|
+
- y
|
|
344
|
+
nv_web_search_topic:
|
|
345
|
+
type: select
|
|
346
|
+
allowed_values:
|
|
347
|
+
- general
|
|
348
|
+
- news
|
|
349
|
+
- finance
|
|
350
|
+
nv_wire_bool:
|
|
351
|
+
type: boolean
|
|
352
|
+
nv_wire_int:
|
|
353
|
+
type: integer
|
|
354
|
+
nv_wire_str_short:
|
|
355
|
+
type: string
|
|
356
|
+
string_semantics: short
|
|
357
|
+
nv_research_task_sources:
|
|
358
|
+
type: array
|
|
359
|
+
items:
|
|
360
|
+
value_ref: nv_wire_str_short
|
|
361
|
+
description: Cited sources (populated when status=completed).
|
|
362
|
+
nv_url_extract_urls:
|
|
363
|
+
type: array
|
|
364
|
+
items:
|
|
365
|
+
value_ref: nv_wire_str_short
|
|
366
|
+
nv_web_search_exclude_domains:
|
|
367
|
+
type: array
|
|
368
|
+
items:
|
|
369
|
+
value_ref: nv_wire_str_short
|
|
370
|
+
nv_web_search_include_domains:
|
|
371
|
+
type: array
|
|
372
|
+
items:
|
|
373
|
+
value_ref: nv_wire_str_short
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Tavily — `SearchResult`, `ExtractResult`, `ResearchTask` (search, query, create, get).
|
|
2
|
+
- id: tv-01
|
|
3
|
+
schema: tavily
|
|
4
|
+
goal: "Research briefing: what are the main risks of LLM prompt injection in 2025?"
|
|
5
|
+
tags: [search]
|
|
6
|
+
covers: [search_text]
|
|
7
|
+
expect:
|
|
8
|
+
entities_any: [SearchResult]
|
|
9
|
+
|
|
10
|
+
- id: tv-02
|
|
11
|
+
schema: tavily
|
|
12
|
+
goal: "Extract readable text from these documentation URLs for offline notes"
|
|
13
|
+
tags: [extract]
|
|
14
|
+
covers: [query_filtered]
|
|
15
|
+
expect:
|
|
16
|
+
entities_any: [ExtractResult]
|
|
17
|
+
|
|
18
|
+
- id: tv-03
|
|
19
|
+
schema: tavily
|
|
20
|
+
goal: "Crawl the product marketing site up to depth 2 for a competitive summary"
|
|
21
|
+
tags: [crawl]
|
|
22
|
+
covers: [query_filtered]
|
|
23
|
+
expect:
|
|
24
|
+
entities_any: [ExtractResult]
|
|
25
|
+
|
|
26
|
+
- id: tv-04
|
|
27
|
+
schema: tavily
|
|
28
|
+
goal: "Start a deep research job on quantum error correction and save the request id"
|
|
29
|
+
tags: [create]
|
|
30
|
+
covers: [create]
|
|
31
|
+
expect:
|
|
32
|
+
entities_any: [ResearchTask]
|
|
33
|
+
|
|
34
|
+
- id: tv-05
|
|
35
|
+
schema: tavily
|
|
36
|
+
goal: "Poll research task req_abc123 until the report body is ready"
|
|
37
|
+
tags: [get]
|
|
38
|
+
covers: [get]
|
|
39
|
+
expect:
|
|
40
|
+
entities_any: [ResearchTask]
|
|
41
|
+
|
|
42
|
+
- id: tv-06
|
|
43
|
+
schema: tavily
|
|
44
|
+
goal: "Kick off async research on a topic, then fetch status when the user returns"
|
|
45
|
+
tags: [multi_step]
|
|
46
|
+
covers: [multi_step, create, get]
|
|
47
|
+
expect:
|
|
48
|
+
entities_any: [ResearchTask]
|
|
49
|
+
|
|
50
|
+
- id: tv-07
|
|
51
|
+
schema: tavily
|
|
52
|
+
goal: "Web search for 'rust async' but return only titles and URLs in the result list"
|
|
53
|
+
tags: [search, projection]
|
|
54
|
+
covers: [search_text, projection]
|
|
55
|
+
expect:
|
|
56
|
+
entities_any: [SearchResult]
|