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.
Summary
On v0.6.0, a
web_searchbuiltin configured with an explicitsearch_provider(e.g. perplexity) is silently absent from the session when the agent spec pins a bare model string (noprovider/prefix) on a non-OpenAI harness such asclaude-sdk.Root cause (from source)
ToolManager._create_web_search(tools/manager.py:384-393) andrunner/tool_dispatch.py:2633-2639inferllm_providerviallms/routing.py::parse_model_string(spec.executor.model).parse_model_stringdefaults the provider to"openai"when the model string contains no/("for backward compatibility").WebSearchTool._is_openaithen becomes True →get_schema()returns the native{"type": "web_search_preview"}passthrough.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
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-6fixes 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 recognizedprovider/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.