Fix web search (again)

This commit is contained in:
Frederik Spirgi
2026-09-21 11:54:52 +02:00
parent be28be1430
commit adbc547dfd
4 changed files with 194 additions and 36 deletions
+23 -8
View File
@@ -18,7 +18,7 @@ import {
retryStylePrompts
} from "./chatMessageHelpers.js";
import {SearXNGSearchProvider, WebSearchError, buildWebSearchContext, buildWebSearchQuery} from "./webSearchService.js";
import {SearXNGSearchProvider, WebSearchError, buildWebSearchContext, buildWebSearchQuery, decideWebSearch, selectSearchResults, MAX_CANDIDATES} from "./webSearchService.js";
export function createChatService(repositories, modelService, config, webSearchProvider = new SearXNGSearchProvider(config)) {
const chatGenerationQueues = new Map();
@@ -338,20 +338,35 @@ export function createChatService(repositories, modelService, config, webSearchP
let payload;
const fullReply = await withActiveGeneration(chatId, signal, async (activeSignal) => {
if (webSearch) {
onStatus?.({status: "searching"});
const searchQuery = buildWebSearchQuery(message);
sources = await webSearchProvider.search(searchQuery, {signal: activeSignal, limit: 5});
const searchDecision = decideWebSearch(message);
let searchQuery = null;
let candidateCount = 0;
let selectedCount = 0;
if (searchDecision.needsSearch) {
onStatus?.({status: "searching"});
searchQuery = buildWebSearchQuery(message, searchDecision);
const candidates = await webSearchProvider.search(searchQuery, {
signal: activeSignal,
limit: MAX_CANDIDATES,
...(searchDecision.intent === "news" ? {category: "news"} : {})
});
candidateCount = candidates.length;
sources = selectSearchResults(message, candidates, searchDecision);
selectedCount = sources.length;
onStatus?.({status: "generating", sourceCount: selectedCount});
}
if (config.structuredRequestLoggingEnabled) {
console.log(JSON.stringify({
event: "web_search",
enabled: true,
webSearchRequested: true,
searchNeeded: searchDecision.needsSearch,
query: searchQuery,
resultCount: sources.length,
webContextSupplied: true,
candidateCount,
selectedCount,
webContextSupplied: sources !== null,
model: effectiveModel
}));
}
onStatus?.({status: "generating", sourceCount: sources.length});
}
payload = buildConversationContext({user, chatId, session, message: null, sources});
return payload.activePersona