Skip to content

web_search: bare executor.model strings are inferred as provider 'openai' → passthrough schema emitted on non-OpenAI harnesses → tool silently absent #3236

Description

@klatt42

Summary

On v0.6.0, a web_search builtin configured with an explicit search_provider (e.g. perplexity) is silently absent from the session when the agent spec pins a bare model string (no provider/ prefix) on a non-OpenAI harness such as claude-sdk.

Root cause (from source)

  • ToolManager._create_web_search (tools/manager.py:384-393) and runner/tool_dispatch.py:2633-2639 infer llm_provider via llms/routing.py::parse_model_string(spec.executor.model).
  • parse_model_string defaults the provider to "openai" when the model string contains no / ("for backward compatibility").
  • WebSearchTool._is_openai then becomes True → get_schema() returns the native {"type": "web_search_preview"} passthrough.
  • The claude-sdk harness logs skipping tool schema with no name: {'type': 'web_search_preview'} and drops the tool. The agent has no web_search and typically falls back to training knowledge silently.

Repro

executor:
  type: omnigent
  model: claude-sonnet-4-6        # bare — no anthropic/ prefix
  config:
    harness: claude-sdk
tools:
  builtins:
    - name: web_search
      search_provider: perplexity
      api_key: ${PERPLEXITY_API_KEY}

Conduct a session and ask the agent to call web_search → tool not present; runner log shows the skipped passthrough schema.

Why the obvious workaround fails

Pinning model: anthropic/claude-sonnet-4-6 fixes the inference, but the model string is passed verbatim to the Claude SDK (HARNESS_CLAUDE_SDK_MODEL, no prefix stripping), and the claude CLI rejects vendor-prefixed model ids ("There's an issue with the selected model (anthropic/claude-haiku-4-5)"). So specs on claude-sdk cannot express a prefixed model.

Suggested fix

Provider inference for web_search should consult the spec's harness (e.g. executor.config.harness) rather than defaulting bare model strings to openai — or strip a recognized provider/ prefix before handing the model to harnesses so specs can disambiguate. Related history: #2631 fixed the non-OpenAI backend path itself; this is the residual selection bug in front of it.

Observed on omnigent 0.6.0 (built 2026-07-21), macOS arm64, uv tool install.

Metadata

Metadata

Assignees

Labels

BugSomething isn't workingP1-highPriority: major feature broken, no workaroundcomp:harnessesComponent: SDK harnesses (Claude, Cursor, etc.)comp:runnerComponent: agent runner, execution enginehelp wantedExtra attention is neededtriagedIssue has been triaged by the bot

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions