20 lines
2.0 KiB
TypeScript
20 lines
2.0 KiB
TypeScript
import { apiRequest } from './session'
|
|
import type { RetrievalHit, RetrievalResult } from '../api'
|
|
import type { IndexVersion } from './indexes'
|
|
import type { EmbeddingSpace } from './vectors'
|
|
|
|
type ChunkHit = RetrievalHit & { chunk_id: string; chunk_ordinal: number }
|
|
type ChunkConfig = { ranking_unit: 'chunk'; lexical: RetrievalResult['config']; chunking: IndexVersion['config']; tie_break: 'knowledge_id,chunk_ordinal,chunk_id' }
|
|
type ChunkSnapshot = { run_id: string; query: string; status: 'ok' | 'no_evidence'; top_k: number; category: string | null; query_terms: string[]; text_index_version_id: string; text_generation: number; catalog_revision: number; corpus_fingerprint: string; corpus_size: number; total_hits: number; elapsed_ms: number; created_at: string }
|
|
export type ChunkKeywordResult = ChunkSnapshot & { mode: 'keyword_chunks'; results: ChunkHit[]; config: ChunkConfig }
|
|
export type RankedCandidate = { chunk_id: string; rank: number; score: number }
|
|
export type HybridResult = ChunkSnapshot & {
|
|
mode: 'hybrid'; vector_version_id: string; generation: number; lexical_total_hits: number; vector_total_hits: number;
|
|
lexical_candidates: RankedCandidate[]; vector_candidates: RankedCandidate[];
|
|
results: (ChunkHit & { lexical_rank: number | null; lexical_score: number | null; vector_rank: number | null; vector_score: number | null; lexical_contribution: number; vector_contribution: number })[];
|
|
config: ChunkConfig & { scorer: 'rrf-v1'; rrf_k: 60; weights: [1, 1]; candidate_k: number; vector_scorer: 'pgvector-cosine-exact-v1'; space: EmbeddingSpace }
|
|
}
|
|
type Request = { query: string; top_k?: number; category?: string }
|
|
export const retrieveKeywordChunks = (payload: Request & { mode?: 'keyword_chunks' }) => apiRequest<ChunkKeywordResult>('/api/retrieval/chunks', { method: 'POST', body: JSON.stringify(payload) })
|
|
export const retrieveHybrid = (payload: Request & { mode?: 'hybrid'; candidate_k?: number }) => apiRequest<HybridResult>('/api/retrieval/hybrid', { method: 'POST', body: JSON.stringify(payload) })
|