/** * Shared RAG query utility for the Drafting Engine. * * Queries the DSFA RAG corpus via klausur-service for relevant legal context. * Used by both chat and draft routes. */ const KLAUSUR_SERVICE_URL = process.env.KLAUSUR_SERVICE_URL || 'http://klausur-service:8086' /** * Query the RAG corpus for relevant legal documents. * * @param query - The search query (e.g. "DSFA Art. 35 DSGVO") * @param topK - Number of results to return (default: 3) * @returns Formatted string of legal context, or empty string on error */ export async function queryRAG(query: string, topK = 3): Promise { try { const url = `${KLAUSUR_SERVICE_URL}/api/v1/dsfa-rag/search?query=${encodeURIComponent(query)}&top_k=${topK}` const res = await fetch(url, { headers: { 'Content-Type': 'application/json' }, signal: AbortSignal.timeout(10000), }) if (!res.ok) return '' const data = await res.json() if (data.results?.length > 0) { return data.results .map( (r: { source_name?: string; source_code?: string; content?: string }, i: number) => `[Quelle ${i + 1}: ${r.source_name || r.source_code || 'Unbekannt'}]\n${r.content || ''}` ) .join('\n\n---\n\n') } return '' } catch { return '' } }