@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.
Files changed (49) hide show
  1. package/agent/instructions.md +1 -2
  2. package/bin/plasm-agent.mjs +5 -7
  3. package/package.json +26 -19
  4. package/scripts/plasm-cli.ts +4 -3
  5. package/scripts/run-plasm-cli.mjs +41 -0
  6. package/src/cli/init-scaffold.ts +198 -0
  7. package/src/cli/init.ts +16 -278
  8. package/src/cli/nitro-dev.ts +2 -6
  9. package/src/cli/node-dev-imports.ts +14 -0
  10. package/src/package-version.ts +14 -0
  11. package/src/project-info.ts +2 -1
  12. package/templates/mcp-radar/.vercelignore +3 -0
  13. package/templates/mcp-radar/README.md +139 -0
  14. package/templates/mcp-radar/agent/agent.ts +38 -0
  15. package/templates/mcp-radar/agent/catalogs/hackernews/README.md +23 -0
  16. package/templates/mcp-radar/agent/catalogs/hackernews/domain.yaml +329 -0
  17. package/templates/mcp-radar/agent/catalogs/hackernews/eval/cases.yaml +112 -0
  18. package/templates/mcp-radar/agent/catalogs/hackernews/mappings.yaml +129 -0
  19. package/templates/mcp-radar/agent/catalogs/tavily/README.md +218 -0
  20. package/templates/mcp-radar/agent/catalogs/tavily/domain.yaml +373 -0
  21. package/templates/mcp-radar/agent/catalogs/tavily/eval/cases.yaml +56 -0
  22. package/templates/mcp-radar/agent/catalogs/tavily/eval/google-gemma-3-4b-it.latest.human.txt +67 -0
  23. package/templates/mcp-radar/agent/catalogs/tavily/eval/google-gemma-3-4b-it.latest.json +363 -0
  24. package/templates/mcp-radar/agent/catalogs/tavily/mappings.yaml +171 -0
  25. package/templates/mcp-radar/agent/channels/mcp-radar.ts +85 -0
  26. package/templates/mcp-radar/agent/hooks/proof-audit.ts +10 -0
  27. package/templates/mcp-radar/agent/instructions.md +24 -0
  28. package/templates/mcp-radar/agent/research/mcp-innovations-proof.md +4 -0
  29. package/templates/mcp-radar/agent/schedules/mcp-radar-scan.ts +14 -0
  30. package/templates/mcp-radar/agent/skills/mcp-proof-format.md +19 -0
  31. package/templates/mcp-radar/api/[[...path]].ts +23 -0
  32. package/templates/mcp-radar/evals/mcp-radar-discover.eval.ts +14 -0
  33. package/templates/mcp-radar/lib/proof-store.ts +265 -0
  34. package/templates/mcp-radar/lib/run-radar.ts +214 -0
  35. package/templates/mcp-radar/nitro.config.ts +17 -0
  36. package/templates/mcp-radar/package.json +14 -0
  37. package/templates/mcp-radar/public/index.html +10 -0
  38. package/templates/mcp-radar/routes/[...path].ts +29 -0
  39. package/templates/mcp-radar/scripts/run-evals.ts +46 -0
  40. package/templates/mcp-radar/scripts/smoke-channel.ts +66 -0
  41. package/templates/mcp-radar/vercel.json +15 -0
  42. package/templates/scaffold/.vercelignore +3 -0
  43. package/templates/scaffold/api/[[...path]].ts +23 -0
  44. package/templates/scaffold/nitro.config.ts +17 -0
  45. package/templates/scaffold/public/index.html +10 -0
  46. package/templates/scaffold/public/index.mcp-radar.html +10 -0
  47. package/templates/scaffold/routes/[...path].ts +29 -0
  48. package/templates/scaffold/vercel.default.json +4 -0
  49. 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]