Skip to content

feat(#4541): nlwebSearch tool — query an NLWeb endpoint#208

Merged
Skobeltsyn merged 1 commit into
mainfrom
feat/4541-nlweb-search
Jun 15, 2026
Merged

feat(#4541): nlwebSearch tool — query an NLWeb endpoint#208
Skobeltsyn merged 1 commit into
mainfrom
feat/4541-nlweb-search

Conversation

@Skobeltsyn

Copy link
Copy Markdown
Contributor

First slice of the agent↔web-content layer (epic #4539, PRD §12.9). tools { +nlwebSearchTool(baseUrl) } lets an agent on its own model query an NLWeb endpoint — a website's natural-language interface over its schema.org-structured content — and fold the ranked, typed results into context.

  • Mirrors perplexitySearch: untrustedOutput = true (fetched web content wrapped in {trusted:false}, treated as data not instructions, #642).
  • Posts to <baseUrl>/askno API key (NLWeb endpoints are public). NlWebSearchOptions(site, mode = LIST/SUMMARIZE/GENERATE).
  • Pure buildNlWebAskBody / parseNlWebResponse wire helpers + injectable NlWebSearchBackend seam.
  • Results render as a numbered list of schema.org matches (name, @type, description, url) + any summarize/generate answer.
  • Types one-per-file (#3199), 9 new source files.

Also corrected a stale README release-truth line the 0.8.0 truth-surface sweep missed ("Seven LLM providers... Gemini on the roadmap" → eight, Gemini shipped).

8 tests; detekt + one-type-per-file + full build green. Docs: README, PRD §12.9 (client-side → SHIPPED), CHANGELOG, internals adjunct.

(Every NLWeb endpoint is also an MCP server, so an NLWeb /mcp URL is equally consumable through the existing MCP client — this tool is the zero-wiring /ask-over-HTTP path.)

🤖 Generated with Claude Code

First slice of the agent↔web-content layer (epic #4539). `tools { +nlwebSearchTool(
baseUrl) }` lets an agent on its own model query an NLWeb endpoint — a website's
natural-language interface over its schema.org-structured content — and fold the
ranked, typed results into context.

- Mirrors perplexitySearch: untrustedOutput=true (#642 — fetched web content is
  wrapped in {trusted:false} and treated as data, not instructions).
- Posts to <baseUrl>/ask (no API key — NLWeb endpoints are public);
  NlWebSearchOptions(site, mode = LIST/SUMMARIZE/GENERATE).
- Pure buildNlWebAskBody / parseNlWebResponse wire helpers + injectable
  NlWebSearchBackend seam (default HttpNlWebSearchBackend).
- Results render as a numbered list of schema.org matches (name, @type,
  description, url) + any summarize/generate answer.
- Types one-per-file (#3199): NlWebSearchArgs / NlWebMode / NlWebSearchOptions /
  NlWebResult / NlWebSearchResult / NlWebSearchBackend / HttpNlWebSearchBackend /
  NlWebSearchException.

Also corrected a stale README line ("Seven LLM providers... Gemini on the roadmap"
-> eight, Gemini shipped #1917) that the 0.8.0 truth-surface sweep missed.

8 tests. detekt + one-type-per-file + full build green. Docs: README, PRD §12.9
(client-side SHIPPED), CHANGELOG, internals-agent/model/NlWebSearch.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Skobeltsyn Skobeltsyn merged commit d88cc01 into main Jun 15, 2026
3 of 4 checks passed
@Skobeltsyn Skobeltsyn deleted the feat/4541-nlweb-search branch June 15, 2026 06:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant