test(e2e): drop the bedrock web search server-tool test

The test can only pass on a gateway whose config.yaml declares the
websearch_interception callback, its params block, and a search_tools backend.
An e2e test that depends on editing the deployed proxy config is not one we can
keep green: it has been red in the nightly since it landed, and it fails with
the gateway's own BadRequestError telling us interception is off rather than
with anything about the behavior under test.

The registry row stays, so the cell reads as an uncovered gap instead of
silently disappearing.
This commit is contained in:
Yassin Kortam 2026-08-11 16:55:37 -07:00
parent bea31871fc
commit 8e8321eba2

View file

@ -1,102 +0,0 @@
"""Live e2e: the Anthropic web_search server tool over Bedrock Invoke.
Bedrock hosts none of Anthropic's ``web_search_*`` server tools, so a
``/v1/messages`` request carrying one is rejected outright with
400 "The provided request is not valid" if it reaches AWS unchanged. What makes
it work is web-search interception: the hooks rewrite the native tool into
LiteLLM's own search tool before the upstream call, Bedrock calls that tool, the
gateway runs the search, and the agentic loop feeds the results back for the
model to synthesize. The response is then rebuilt in the native shape, so a
client's citations panel sees ``server_tool_use`` and ``web_search_tool_result``
exactly as it would from Anthropic direct.
This cell pins that whole path. Nothing else covers it: the ``web_search`` cells
in the Claude Code compat matrix drive the CLI's *client-side* ``WebSearch``
tool, an ordinary custom tool the CLI executes and feeds back as a
``tool_result``, and the CLI never emits a ``web_search_20250305`` definition.
Prerequisites beyond AWS credentials: the proxy config must switch interception
on and declare a search backend. The callback entry is load-bearing; the params
block alone does not activate it.
litellm_settings:
callbacks: ["websearch_interception"]
websearch_interception_params:
enabled_providers: ["bedrock"]
search_tool_name: e2e-search
search_tools:
- search_tool_name: e2e-search
litellm_params:
search_provider: searxng
api_base: http://127.0.0.1:8391
"""
from __future__ import annotations
import pytest
from e2e_config import unique_marker
from e2e_http import unwrap
from endpoints_client import EndpointsClient
from lifecycle import ResourceManager
from models import (
AnthropicMessagesBody,
AnthropicWebSearchTool,
ChatMessage,
LiteLLMParamsBody,
)
pytestmark = pytest.mark.e2e
BEDROCK_INVOKE_BACKEND = "bedrock/invoke/us.anthropic.claude-haiku-4-5-20251001-v1:0"
WEB_SEARCH_TOOL = AnthropicWebSearchTool(
type="web_search_20250305",
name="web_search",
max_uses=3,
)
SEARCH_PROMPT = "Use web search to tell me one recent news headline about Anthropic."
class TestBedrockWebSearchServerTool:
@pytest.mark.covers("llm.messages.bedrock_invoke.web_search_server_tool.nonstream.works")
def test_web_search_server_tool_is_served(
self, endpoints_client: EndpointsClient, resources: ResourceManager
) -> None:
"""A bedrock deployment must answer a web_search server-tool request
instead of handing the tool to AWS and returning its 400."""
model = f"e2e-bedrock-websearch-{unique_marker()}"
model_id = endpoints_client.create_model(
model,
LiteLLMParamsBody(
model=BEDROCK_INVOKE_BACKEND,
aws_region_name="us-east-1",
),
)
resources.defer(lambda: endpoints_client.delete_model(model_id))
key = resources.key()
response = unwrap(
endpoints_client.proxy.messages(
key,
AnthropicMessagesBody(
model=model,
max_tokens=512,
tools=[WEB_SEARCH_TOOL],
messages=[ChatMessage(role="user", content=SEARCH_PROMPT)],
),
)
)
assert response.content, f"no content blocks in response: {response}"
block_types = [block.type for block in response.content]
assert "web_search_tool_result" in block_types, (
"the answer carries no web_search_tool_result block, so the search "
"either never ran or its results were not returned in the native shape "
f"a citations panel reads. blocks={block_types}"
)
assert "text" in block_types, (
"the model never synthesized an answer over the search results, so the "
f"agentic loop stopped early. blocks={block_types}"
)