Deploy: migrate k3s → Docker; search logic → master-agents-svc
- deploy/k3s удалён, deploy/docker добавлен (Caddyfile, docker-compose, searxng) - chat-svc: agents/models/prompts удалены, использует llm-svc (LLMClient, EmbeddingClient) - master-agents-svc: SearchOrchestrator, classifier, researcher, actions, widgets - web-svc: ChatModelSelector, Optimization, Sources удалены; InputBarPlus; UnregisterSW - geo-device-svc, localization-svc: Dockerfiles - docs: 02-k3s-services-spec.md, RUNBOOK/TELEMETRY/WORKING удалены Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
80
services/master-agents-svc/src/lib/actions/web_search.ts
Normal file
80
services/master-agents-svc/src/lib/actions/web_search.ts
Normal file
@@ -0,0 +1,80 @@
|
||||
import z from 'zod';
|
||||
import type { ResearchAction } from './types.js';
|
||||
import type { Chunk, SearchResultsResearchBlock } from '../types.js';
|
||||
import { searchSearxng } from '../searxng.js';
|
||||
|
||||
const schema = z.object({
|
||||
queries: z.array(z.string()).describe('An array of search queries to perform web searches for.'),
|
||||
});
|
||||
|
||||
const webSearchAction: ResearchAction<typeof schema> = {
|
||||
name: 'web_search',
|
||||
schema,
|
||||
getToolDescription: () =>
|
||||
'Use this tool to perform web searches based on the provided queries. You can provide up to 3 queries at a time.',
|
||||
getDescription: () =>
|
||||
'Use this tool to perform web searches. Your queries should be targeted and specific, SEO-friendly keywords. You can search for 3 queries in one go.',
|
||||
enabled: (config) =>
|
||||
config.sources.includes('web') && config.classification.classification.skipSearch === false,
|
||||
execute: async (input, additionalConfig) => {
|
||||
input.queries = input.queries.slice(0, 3);
|
||||
|
||||
const researchBlock = additionalConfig.session.getBlock(additionalConfig.researchBlockId);
|
||||
|
||||
if (researchBlock && researchBlock.type === 'research') {
|
||||
researchBlock.data.subSteps.push({
|
||||
id: crypto.randomUUID(),
|
||||
type: 'searching',
|
||||
searching: input.queries,
|
||||
});
|
||||
additionalConfig.session.updateBlock(additionalConfig.researchBlockId, [
|
||||
{ op: 'replace', path: '/data/subSteps', value: researchBlock.data.subSteps },
|
||||
]);
|
||||
}
|
||||
|
||||
const searchResultsBlockId = crypto.randomUUID();
|
||||
let searchResultsEmitted = false;
|
||||
const results: Chunk[] = [];
|
||||
|
||||
const search = async (q: string) => {
|
||||
let res: { results: { content?: string; title: string; url: string }[] };
|
||||
try {
|
||||
res = await searchSearxng(q);
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
const resultChunks: Chunk[] = res.results.map((r) => ({
|
||||
content: r.content || r.title,
|
||||
metadata: { title: r.title, url: r.url },
|
||||
}));
|
||||
results.push(...resultChunks);
|
||||
|
||||
if (!searchResultsEmitted && researchBlock && researchBlock.type === 'research') {
|
||||
searchResultsEmitted = true;
|
||||
researchBlock.data.subSteps.push({
|
||||
id: searchResultsBlockId,
|
||||
type: 'search_results',
|
||||
reading: resultChunks,
|
||||
});
|
||||
additionalConfig.session.updateBlock(additionalConfig.researchBlockId, [
|
||||
{ op: 'replace', path: '/data/subSteps', value: researchBlock.data.subSteps },
|
||||
]);
|
||||
} else if (searchResultsEmitted && researchBlock && researchBlock.type === 'research') {
|
||||
const subStepIndex = researchBlock.data.subSteps.findIndex((s) => s.id === searchResultsBlockId);
|
||||
const subStep = researchBlock.data.subSteps[subStepIndex] as SearchResultsResearchBlock | undefined;
|
||||
if (subStep) {
|
||||
subStep.reading.push(...resultChunks);
|
||||
additionalConfig.session.updateBlock(additionalConfig.researchBlockId, [
|
||||
{ op: 'replace', path: '/data/subSteps', value: researchBlock.data.subSteps },
|
||||
]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
await Promise.all(input.queries.map(search));
|
||||
|
||||
return { type: 'search_results', results };
|
||||
},
|
||||
};
|
||||
|
||||
export default webSearchAction;
|
||||
Reference in New Issue
Block a user