Fix xAI sentiment: use Agent Tools web_search (Live Search deprecated)
Deploy / lint (push) Successful in 5s
Deploy / test (push) Successful in 31s
Deploy / deploy (push) Successful in 23s

xAI returned 410 — search_parameters/Live Search is retired. Route xAI
through the Responses API web_search tool instead (same path as OpenAI):
- OpenAISentimentProvider parametrized with base_url / tool_type / source
- xAI builds it against https://api.x.ai/v1 with the web_search tool
- Drop the dead Live Search code from the generic compatible provider
- Frontend label: "xAI Grok — web search"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-13 14:30:45 +02:00
parent 126c3b3c17
commit ffb609d38f
5 changed files with 45 additions and 69 deletions
+10 -11
View File
@@ -39,12 +39,10 @@ PROVIDER_BASE_URLS: dict[str, str] = {
}
# Providers grounded in live web search. The rest score from model knowledge.
# xAI grounds via Live Search (search_parameters); OpenAI/Gemini via their tools.
# xAI and OpenAI ground via the Responses API web-search tool; Gemini via its
# own search grounding.
WEB_SEARCH_PROVIDERS = {"openai", "gemini", "xai"}
# xAI Live Search: auto mode lets Grok search web + X when the query needs it.
_XAI_SEARCH_PARAMETERS = {"mode": "auto", "return_citations": True}
# Providers needing a user-supplied base URL (generic compatible endpoints).
CUSTOM_BASE_URL_PROVIDERS = {"openai_compatible"}
@@ -181,16 +179,17 @@ async def build_sentiment_provider(db: AsyncSession):
if provider == "gemini":
from app.providers.gemini_sentiment import GeminiSentimentProvider
return GeminiSentimentProvider(api_key, model)
if provider in {"deepseek", "xai", "openai_compatible"}:
if provider == "xai":
# xAI grounds via the Responses API web_search tool (the former Live
# Search / search_parameters API is deprecated).
from app.providers.openai_sentiment import OpenAISentimentProvider
return OpenAISentimentProvider(
api_key, model, base_url=base_url, tool_type="web_search", source="xai",
)
if provider in {"deepseek", "openai_compatible"}:
if not base_url:
raise ProviderError(f"No base_url configured for sentiment provider '{provider}'")
from app.providers.openai_compatible_sentiment import OpenAICompatibleSentimentProvider
if provider == "xai":
return OpenAICompatibleSentimentProvider(
api_key, model, base_url, source="xai",
live_search=True,
extra_body={"search_parameters": _XAI_SEARCH_PARAMETERS},
)
return OpenAICompatibleSentimentProvider(api_key, model, base_url, source=provider)
raise ProviderError(f"Unsupported sentiment provider '{provider}'")