feat(server): remove context prefetch & integrate context search (#12956)

fix AI-173
This commit is contained in:
DarkSky
2025-06-27 23:45:49 +08:00
committed by GitHub
parent ad306edcf1
commit e6f91cced6
9 changed files with 88 additions and 70 deletions
@@ -4,14 +4,20 @@ import { z } from 'zod';
import type { AccessController } from '../../../core/permission';
import type { ChunkSimilarity } from '../../../models';
import type { CopilotContextService } from '../context';
import type { ContextSession } from '../context/session';
import type { CopilotChatOptions } from '../providers';
import { toolError } from './error';
export const buildDocSearchGetter = (
ac: AccessController,
context: CopilotContextService
context: CopilotContextService,
docContext: ContextSession | null
) => {
const searchDocs = async (options: CopilotChatOptions, query?: string) => {
const searchDocs = async (
options: CopilotChatOptions,
query?: string,
abortSignal?: AbortSignal
) => {
if (!options || !query?.trim() || !options.user || !options.workspace) {
return undefined;
}
@@ -20,7 +26,11 @@ export const buildDocSearchGetter = (
.workspace(options.workspace)
.can('Workspace.Read');
if (!canAccess) return undefined;
const chunks = await context.matchWorkspaceAll(options.workspace, query);
const [chunks, contextChunks] = await Promise.all([
context.matchWorkspaceAll(options.workspace, query, 10, abortSignal),
docContext?.matchFiles(query, 10, abortSignal) ?? [],
]);
const docChunks = await ac
.user(options.user)
.workspace(options.workspace)
@@ -29,6 +39,9 @@ export const buildDocSearchGetter = (
'Doc.Read'
);
const fileChunks = chunks.filter(c => 'fileId' in c);
if (contextChunks.length) {
fileChunks.push(...contextChunks);
}
if (!docChunks.length && !fileChunks.length) return undefined;
return [...fileChunks, ...docChunks];
};
@@ -36,17 +49,24 @@ export const buildDocSearchGetter = (
};
export const createDocSemanticSearchTool = (
searchDocs: (query: string) => Promise<ChunkSimilarity[] | undefined>
searchDocs: (
query: string,
abortSignal?: AbortSignal
) => Promise<ChunkSimilarity[] | undefined>
) => {
return tool({
description:
'Semantic search for relevant documents in the current workspace',
parameters: z.object({
query: z.string().describe('The query to search for.'),
query: z
.string()
.describe(
'The query statement to search for, e.g. "What is the capital of France?"'
),
}),
execute: async ({ query }) => {
execute: async ({ query }, options) => {
try {
return await searchDocs(query);
return await searchDocs(query, options.abortSignal);
} catch (e: any) {
return toolError('Doc Semantic Search Failed', e.message);
}