diff --git a/frontend/src/lib/queries.tsx b/frontend/src/lib/queries.tsx index eaed72b..ae6cfd0 100644 --- a/frontend/src/lib/queries.tsx +++ b/frontend/src/lib/queries.tsx @@ -1,7 +1,7 @@ import React from 'react' import { QueryClient, QueryClientProvider, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { queryDocument, queryDocumentStream, ingestDocument, listDocuments, listChunks, deleteDocument, deleteChunk, listPromptProfiles, getPromptProfile, activatePromptProfile, updatePrompt, updateAllPrompts, resetPrompts, listQueryHistory, getQueryHistoryDetail, deleteQueryHistory, clearQueryHistory, getHistoryStats } from './api' -import type { QueryRequest, QueryResponse, QueryStreamEvent, SourceMetadata, IngestResponse, DocumentListResponse, ChunkInfo, DeleteResponse, PromptProfileListResponse, PromptSetResponse, PromptUpdateRequest, PromptBatchUpdateRequest, PromptActivateResponse, PromptStatusResponse, QueryHistoryList, QueryHistoryDetail, HistoryStats, HistoryDeleteResponse } from '../types' +import type { QueryRequest, QueryResponse, QueryStreamEvent, SourceMetadata, SubQuestionSources, IngestResponse, DocumentListResponse, ChunkInfo, DeleteResponse, PromptProfileListResponse, PromptSetResponse, PromptUpdateRequest, PromptBatchUpdateRequest, PromptActivateResponse, PromptStatusResponse, QueryHistoryList, QueryHistoryDetail, HistoryStats, HistoryDeleteResponse } from '../types' import { useState, useCallback, useRef } from 'react' export const queryClient = new QueryClient() @@ -16,6 +16,7 @@ export interface QueryStreamState { extractedQuestions: string[] | null answer: string | null sources: SourceMetadata[] | null + subQuestionSources: SubQuestionSources[] | null phase: 'idle' | 'decomposing' | 'retrieving' | 'filtering' | 'generating' | 'completed' | 'error' error: Error | null } @@ -25,6 +26,7 @@ export const useQueryDocumentStream = () => { extractedQuestions: null, answer: null, sources: null, + subQuestionSources: null, phase: 'idle', error: null, }) @@ -35,6 +37,7 @@ export const useQueryDocumentStream = () => { extractedQuestions: null, answer: null, sources: null, + subQuestionSources: null, phase: 'decomposing', error: null, }) @@ -60,11 +63,15 @@ export const useQueryDocumentStream = () => { case 'generating': setState(prev => ({ ...prev, phase: 'generating' })) break + case 'generating_subquestion': + setState(prev => ({ ...prev, phase: 'generating' })) + break case 'completed': setState(prev => ({ ...prev, answer: event.answer ?? null, sources: event.sources ?? null, + subQuestionSources: event.sub_question_sources ?? null, phase: 'completed', })) break @@ -96,6 +103,7 @@ export const useQueryDocumentStream = () => { extractedQuestions: null, answer: null, sources: null, + subQuestionSources: null, phase: 'idle', error: null, }) diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index c0005e0..3e9cf99 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -7,6 +7,12 @@ export interface SourceMetadata { chunk_file_path: string | null } +export interface SubQuestionSources { + sub_question_index: number + sub_question_text: string + sources: SourceMetadata[] +} + export interface QueryRequest { question: string } @@ -14,16 +20,18 @@ export interface QueryRequest { export interface QueryResponse { extracted_questions: string[] answer: string + sub_question_sources?: SubQuestionSources[] sources: SourceMetadata[] } -export interface QueryStreamEvent { - phase: 'decomposed' | 'retrieving' | 'filtering' | 'generating' | 'completed' | 'error' - extracted_questions?: string[] - answer?: string - sources?: SourceMetadata[] - message?: string -} +export type QueryStreamEvent = + | { phase: 'decomposed'; extracted_questions: string[] } + | { phase: 'retrieving' } + | { phase: 'filtering' } + | { phase: 'generating' } + | { phase: 'generating_subquestion'; sub_question_index: number; sub_question_text: string } + | { phase: 'completed'; answer: string; sub_question_sources?: SubQuestionSources[]; sources?: SourceMetadata[] } + | { phase: 'error'; message: string } export interface IngestResponse { document_id: string