feat: prepare RAG evidence and compatible chat requests

This commit is contained in:
2026-10-16 20:01:00 +08:00
committed by saint
parent ed8780cacc
commit d91a6808a9
16 changed files with 1066 additions and 5 deletions
+20
View File
@@ -0,0 +1,20 @@
import { apiRequest } from './session'
import type { Chunk } from './indexes'
export type CompletionOptions = { model: string; output_tokens?: number; token_parameter?: 'max_completion_tokens' | 'max_tokens'; instruction_role?: 'system' | 'developer'; temperature?: number | null }
export type PrepareRagContext = { retrieval_run_id: string; completion: CompletionOptions; max_input_characters?: number; max_evidence?: number }
export type RagEvidence = Chunk['provenance'] & { citation_id: string; chunk_id: string; chunk_ordinal: number; retrieval_rank: number; text: string; text_sha256: string; start_offset: number; end_offset: number }
export type ChatCompletionsBody = { model: string; messages: { role: 'system' | 'developer' | 'user'; content: string }[]; stream: false; n: 1; store: false; max_completion_tokens?: number; max_tokens?: number; temperature?: number }
export type RagContext = {
id: string; kind: 'prepared_request'; model_called: false; status: 'prepared' | 'insufficient_evidence';
reason: 'candidates_available' | 'no_candidates' | 'context_budget'; retrieval_run_id: string;
retrieval_mode: 'keyword_chunks' | 'vector' | 'hybrid'; query: string; text_index_version_id: string;
text_generation: number; catalog_revision: number; vector_version_id: string | null; vector_generation: number | null;
corpus_fingerprint: string; prompt_version: 'nalati-evidence-v1'; completion: Required<CompletionOptions>;
max_input_characters: number; input_characters: number; max_evidence: number; evidence: RagEvidence[];
excluded: { chunk_id: string; reason: 'overlap' | 'budget' | 'evidence_limit' }[];
request_body: ChatCompletionsBody | null; request_sha256: string | null; created_at: string;
}
export const prepareRagContext = (payload: PrepareRagContext) => apiRequest<RagContext>('/api/rag/contexts', { method: 'POST', body: JSON.stringify(payload) }, true)
export const getRagContext = (id: string) => apiRequest<RagContext>(`/api/rag/contexts/${encodeURIComponent(id)}`)
export const getRagContexts = (page = 1, pageSize = 20) => apiRequest<{ items: RagContext[]; total: number; page: number; page_size: number }>(`/api/rag/contexts?page=${page}&page_size=${pageSize}`)