@@ -302,12 +302,49 @@ Counters are maintained per level. When a new Level 1 appears, all deeper counte
302302| Build from pages | ` TreeDex.from_pages(pages, llm, **opts) ` | ` await TreeDex.fromPages(pages, llm, opts?) ` | From pre-extracted pages |
303303| Build from tree | ` TreeDex.from_tree(tree, pages, llm) ` | ` TreeDex.fromTree(tree, pages, llm) ` | From existing tree (no LLM) |
304304| Query | ` index.query(q, llm=, agentic=) ` | ` await index.query(q, {llm?, agentic?}) ` | Retrieve relevant sections |
305+ | ** Multi-index query** | ** ` TreeDex.query_all(indexes, q, ...) ` ** | ** ` await TreeDex.queryAll(indexes, q, ...) ` ** | ** Query multiple indexes simultaneously** |
305306| Save | ` index.save(path) ` | ` await index.save(path) ` | Export to JSON |
306307| Load | ` TreeDex.load(path, llm) ` | ` await TreeDex.load(path, llm) ` | Import from JSON |
307308| Show tree | ` index.show_tree() ` | ` index.showTree() ` | Pretty-print |
308309| Stats | ` index.stats() ` | ` index.stats() ` | Return ` {total_pages, total_tokens, ...} ` |
309310| Find large | ` index.find_large_sections(**opts) ` | ` index.findLargeSections(opts?) ` | Nodes exceeding thresholds |
310311
312+ #### ` query_all ` / ` queryAll ` Options
313+
314+ Query multiple TreeDex indexes simultaneously. Indexes are queried in parallel
315+ (Node.js) or sequentially (Python), then results are merged into a single
316+ ` MultiQueryResult ` with ` [Label] ` separators between sources.
317+
318+ | Parameter | Python | Node.js | Default | Description |
319+ | -----------| --------| ---------| ---------| -------------|
320+ | indexes | ` list[TreeDex] ` | ` TreeDex[] ` | required | List of indexes to query |
321+ | question | ` str ` | ` string ` | required | The user's question |
322+ | llm | ` llm= ` | ` { llm? } ` | ` None ` | Shared LLM override; falls back to each index's own LLM |
323+ | agentic | ` agentic= ` | ` { agentic? } ` | ` False ` | Generate a single answer over the combined context |
324+ | labels | ` labels= ` | ` { labels? } ` | ` ["Document 1", ...] ` | Human-readable name per index |
325+
326+ ``` python
327+ multi = TreeDex.query_all(
328+ [index_a, index_b, index_c],
329+ " What are the safety guidelines?" ,
330+ labels = [" Manual A" , " Manual B" , " Manual C" ],
331+ agentic = True ,
332+ )
333+ print (multi.combined_context) # merged context with [Manual A]/[Manual B] headers
334+ print (multi.answer) # single answer over all sources
335+ print (multi.results[0 ].pages_str) # pages from Manual A
336+ ```
337+
338+ ``` typescript
339+ const multi = await TreeDex .queryAll (
340+ [indexA , indexB , indexC ],
341+ " What are the safety guidelines?" ,
342+ { labels: [" Manual A" , " Manual B" , " Manual C" ], agentic: true },
343+ );
344+ console .log (multi .combinedContext );
345+ console .log (multi .answer );
346+ ```
347+
311348#### ` from_file ` Options
312349
313350| Parameter | Python | Node.js | Default | Description |
@@ -331,6 +368,17 @@ Counters are maintained per level. When a new Level 1 appears, all deeper counte
331368| Reasoning | ` .reasoning ` | ` .reasoning ` | ` str ` | LLM's selection explanation |
332369| Answer | ` .answer ` | ` .answer ` | ` str ` | Generated answer (agentic mode only) |
333370
371+ ### MultiQueryResult
372+
373+ Returned by ` TreeDex.query_all() ` / ` TreeDex.queryAll() ` .
374+
375+ | Property | Python | Node.js | Type | Description |
376+ | ----------| --------| ---------| ------| -------------|
377+ | Per-index results | ` .results ` | ` .results ` | ` list[QueryResult] ` | One result per index, in input order |
378+ | Labels | ` .labels ` | ` .labels ` | ` list[str] ` | Human-readable name for each index |
379+ | Combined context | ` .combined_context ` | ` .combinedContext ` | ` str ` | All contexts merged with ` [Label] ` headers and ` --- ` separators |
380+ | Answer | ` .answer ` | ` .answer ` | ` str ` | Single answer over all sources (agentic only) |
381+
334382### Hierarchy Utilities
335383
336384| Function | Python | Node.js | Description |
0 commit comments