Skip to content

feat(ai-openrouter): expose openrouter:web_fetch as webFetchTool() #603

Description

@tombeckenham

Problem

@tanstack/ai-openrouter exposes OpenRouter's web search server tool via webSearchTool() (packages/typescript/ai-openrouter/src/tools/web-search-tool.ts), but there's no equivalent wrapper for OpenRouter's openrouter:web_fetch server tool.

openrouter:web_fetch lets any tool-calling model retrieve full page content from URLs, executed server-side by OpenRouter. It supports four engines (native, openrouter, exa, parallel) — with engine: "native", requests to Claude models route through Anthropic's native web fetch. Today users have to hand-construct the tool spec and it may not route correctly through the adapter's tool converter.

Proposal

Add a webFetchTool() factory mirroring the existing webSearchTool() pattern:

import { webFetchTool } from '@tanstack/ai-openrouter/tools'

const tool = webFetchTool({
  engine: 'native' | 'openrouter' | 'exa' | 'parallel',
  maxContentTokens: 4000,
  allowedDomains: [...],
  blockedDomains: [...],
})

Implementation outline (parallels web-search-tool.ts):

  • New packages/typescript/ai-openrouter/src/tools/web-fetch-tool.ts with webFetchTool(), WEB_FETCH_TOOL_KIND, isWebFetchTool(), convertWebFetchToolToAdapterFormat().
  • Export from tools/index.ts.
  • Route in tool-converter.ts (convertToolsToProviderFormat) so branded fetch tools are emitted in OpenRouter wire format ({"type": "web_fetch", "web_fetch": {...}} — verify against OpenRouter docs).
  • E2E coverage in testing/e2e/ (per the repo's mandatory E2E policy).

References

  • OpenRouter announcement: https://openrouter.ai/announcements/agentic-web-tools
  • Existing pattern: packages/typescript/ai-openrouter/src/tools/web-search-tool.ts
  • Anthropic-direct equivalent already exists: packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions