@@ -77,14 +77,13 @@ export async function POST(request: NextRequest) {
7777 ? validatedData . knowledgeBaseIds
7878 : [ validatedData . knowledgeBaseIds ]
7979
80- // Check access permissions for each knowledge base using proper workspace-based permissions
81- const accessibleKbIds : string [ ] = [ ]
82- for ( const kbId of knowledgeBaseIds ) {
83- const accessCheck = await checkKnowledgeBaseAccess ( kbId , userId )
84- if ( accessCheck . hasAccess ) {
85- accessibleKbIds . push ( kbId )
86- }
87- }
80+ // Check access permissions in parallel for performance
81+ const accessChecks = await Promise . all (
82+ knowledgeBaseIds . map ( ( kbId ) => checkKnowledgeBaseAccess ( kbId , userId ) )
83+ )
84+ const accessibleKbIds : string [ ] = knowledgeBaseIds . filter (
85+ ( _ , idx ) => accessChecks [ idx ] ?. hasAccess
86+ )
8887
8988 // Map display names to tag slots for filtering
9089 let mappedFilters : Record < string , string > = { }
@@ -137,7 +136,10 @@ export async function POST(request: NextRequest) {
137136
138137 // Generate query embedding only if query is provided
139138 const hasQuery = validatedData . query && validatedData . query . trim ( ) . length > 0
140- const queryEmbedding = hasQuery ? await generateSearchEmbedding ( validatedData . query ! ) : null
139+ // Start embedding generation early and await when needed
140+ const queryEmbeddingPromise = hasQuery
141+ ? generateSearchEmbedding ( validatedData . query ! )
142+ : Promise . resolve ( null )
141143
142144 // Check if any requested knowledge bases were not accessible
143145 const inaccessibleKbIds = knowledgeBaseIds . filter ( ( id ) => ! accessibleKbIds . includes ( id ) )
@@ -165,7 +167,7 @@ export async function POST(request: NextRequest) {
165167 // Tag + Vector search
166168 logger . debug ( `[${ requestId } ] Executing tag + vector search with filters:` , mappedFilters )
167169 const strategy = getQueryStrategy ( accessibleKbIds . length , validatedData . topK )
168- const queryVector = JSON . stringify ( queryEmbedding )
170+ const queryVector = JSON . stringify ( await queryEmbeddingPromise )
169171
170172 results = await handleTagAndVectorSearch ( {
171173 knowledgeBaseIds : accessibleKbIds ,
@@ -178,7 +180,7 @@ export async function POST(request: NextRequest) {
178180 // Vector-only search
179181 logger . debug ( `[${ requestId } ] Executing vector-only search` )
180182 const strategy = getQueryStrategy ( accessibleKbIds . length , validatedData . topK )
181- const queryVector = JSON . stringify ( queryEmbedding )
183+ const queryVector = JSON . stringify ( await queryEmbeddingPromise )
182184
183185 results = await handleVectorOnlySearch ( {
184186 knowledgeBaseIds : accessibleKbIds ,
@@ -213,24 +215,28 @@ export async function POST(request: NextRequest) {
213215 }
214216
215217 // Fetch tag definitions for display name mapping (reuse the same fetch from filtering)
218+ const tagDefsResults = await Promise . all (
219+ accessibleKbIds . map ( async ( kbId ) => {
220+ try {
221+ const tagDefs = await getDocumentTagDefinitions ( kbId )
222+ const map : Record < string , string > = { }
223+ tagDefs . forEach ( ( def ) => {
224+ map [ def . tagSlot ] = def . displayName
225+ } )
226+ return { kbId, map }
227+ } catch ( error ) {
228+ logger . warn (
229+ `[${ requestId } ] Failed to fetch tag definitions for display mapping:` ,
230+ error
231+ )
232+ return { kbId, map : { } as Record < string , string > }
233+ }
234+ } )
235+ )
216236 const tagDefinitionsMap : Record < string , Record < string , string > > = { }
217- for ( const kbId of accessibleKbIds ) {
218- try {
219- const tagDefs = await getDocumentTagDefinitions ( kbId )
220-
221- tagDefinitionsMap [ kbId ] = { }
222- tagDefs . forEach ( ( def ) => {
223- tagDefinitionsMap [ kbId ] [ def . tagSlot ] = def . displayName
224- } )
225- logger . debug (
226- `[${ requestId } ] Display mapping - KB ${ kbId } tag definitions:` ,
227- tagDefinitionsMap [ kbId ]
228- )
229- } catch ( error ) {
230- logger . warn ( `[${ requestId } ] Failed to fetch tag definitions for display mapping:` , error )
231- tagDefinitionsMap [ kbId ] = { }
232- }
233- }
237+ tagDefsResults . forEach ( ( { kbId, map } ) => {
238+ tagDefinitionsMap [ kbId ] = map
239+ } )
234240
235241 return NextResponse . json ( {
236242 success : true ,
@@ -260,6 +266,7 @@ export async function POST(request: NextRequest) {
260266 id : result . id ,
261267 content : result . content ,
262268 documentId : result . documentId ,
269+ documentName : ( result as any ) . documentName || undefined ,
263270 chunkIndex : result . chunkIndex ,
264271 tags, // Clean display name mapped tags
265272 similarity : hasQuery ? 1 - result . distance : 1 , // Perfect similarity for tag-only searches
0 commit comments