@neureus/sdk
Version:
Neureus Platform SDK - AI-native, edge-first application platform
1 lines • 17.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/rag.ts"],"names":["ky"],"mappings":"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","file":"rag.cjs","sourcesContent":["/**\n * Neureus RAG (Retrieval-Augmented Generation) SDK Client\n *\n * Provides a simple interface to build and query RAG pipelines on the\n * Neureus platform, handling document ingestion, chunking, embedding,\n * retrieval, and answer generation automatically.\n *\n * @example\n * ```typescript\n * import { RAGClient } from '@neureus/sdk/rag';\n *\n * const rag = new RAGClient({\n * apiKey: 'nru_...',\n * baseUrl: 'https://api.neureus.ai'\n * });\n *\n * // Create a RAG pipeline\n * await rag.pipelines.create({\n * name: 'product-docs',\n * embedding: {\n * model: 'text-embedding-ada-002',\n * provider: 'openai'\n * },\n * generation: {\n * model: 'gpt-4',\n * provider: 'openai'\n * }\n * });\n *\n * // Ingest documents\n * await rag.ingest('product-docs', {\n * source: './docs',\n * type: 'file',\n * format: 'markdown',\n * recursive: true\n * });\n *\n * // Query the pipeline\n * const response = await rag.query('product-docs', {\n * query: 'How do I authenticate users?',\n * topK: 5\n * });\n *\n * console.log(response.answer);\n * console.log(response.sources);\n * ```\n */\n\nimport ky, { type KyInstance } from 'ky';\nimport type {\n RAGConfig,\n IngestionRequest,\n QueryRequest,\n QueryResponse,\n QueryStreamChunk,\n RAGPipelineInfo,\n ProcessingResult,\n BatchProcessingResult,\n} from '@neureus/rag';\n\n// Re-export types from rag for convenience\nexport type {\n RAGConfig,\n IngestionRequest,\n QueryRequest,\n QueryResponse,\n QueryStreamChunk,\n RAGPipelineInfo,\n RAGPipelineStatus,\n ProcessingResult,\n BatchProcessingResult,\n Document,\n DocumentMetadata,\n DocumentFormat,\n DocumentSource,\n Chunk,\n ChunkMetadata,\n ChunkingConfig,\n ChunkingStrategy,\n EmbeddingConfig,\n ContextResult,\n RAGError,\n DocumentProcessingError,\n EmbeddingError,\n RetrievalError,\n GenerationError,\n} from '@neureus/rag';\n\n/**\n * Configuration options for RAGClient\n */\nexport interface RAGClientConfig {\n /**\n * Neureus API key (required)\n * Get your API key from https://app.neureus.ai/settings/api-keys\n */\n apiKey: string;\n\n /**\n * Base URL for the Neureus API\n * @default 'https://api.neureus.ai'\n */\n baseUrl?: string;\n\n /**\n * Request timeout in milliseconds\n * @default 60000 (60 seconds)\n */\n timeout?: number;\n\n /**\n * Number of retry attempts for failed requests\n * @default 3\n */\n retries?: number;\n\n /**\n * User ID for usage tracking (optional)\n * @default ''\n */\n userId?: string;\n\n /**\n * Team ID for usage tracking (optional)\n * @default ''\n */\n teamId?: string;\n}\n\n/**\n * Options for document ingestion\n */\nexport interface IngestOptions extends IngestionRequest {\n /**\n * Wait for ingestion to complete before returning\n * @default false\n */\n waitForCompletion?: boolean;\n}\n\n/**\n * Options for RAG queries\n */\nexport interface QueryOptions extends Omit<QueryRequest, 'streaming'> {\n /**\n * Enable streaming responses\n * @default false\n */\n streaming?: boolean;\n}\n\n/**\n * Main RAG client class\n */\nexport class RAGClient {\n private http: KyInstance;\n private config: Required<RAGClientConfig>;\n\n constructor(config: RAGClientConfig) {\n this.config = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || 'https://api.neureus.ai',\n timeout: config.timeout || 60000,\n retries: config.retries || 3,\n userId: config.userId || '',\n teamId: config.teamId || '',\n };\n\n this.http = ky.create({\n prefixUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n retry: {\n limit: this.config.retries,\n methods: ['get', 'post'],\n statusCodes: [408, 413, 429, 500, 502, 503, 504],\n },\n hooks: {\n beforeRequest: [\n (request) => {\n request.headers.set('Authorization', `Bearer ${this.config.apiKey}`);\n request.headers.set('Content-Type', 'application/json');\n request.headers.set('User-Agent', 'Neureus-SDK/0.2.0');\n },\n ],\n },\n });\n }\n\n /**\n * Pipeline management API\n */\n public pipelines = {\n /**\n * Create a new RAG pipeline\n *\n * @example\n * ```typescript\n * await rag.pipelines.create({\n * name: 'customer-support',\n * description: 'Customer support knowledge base',\n * embedding: {\n * model: 'text-embedding-ada-002',\n * provider: 'openai',\n * dimensions: 1536\n * },\n * chunking: {\n * strategy: 'recursive',\n * size: 512,\n * overlap: 128\n * },\n * generation: {\n * model: 'gpt-4',\n * provider: 'openai',\n * temperature: 0.1\n * }\n * });\n * ```\n */\n create: async (config: RAGConfig): Promise<{ success: boolean; pipeline: RAGPipelineInfo }> => {\n return this.http.post('rag/pipelines', {\n json: config,\n }).json();\n },\n\n /**\n * List all RAG pipelines\n *\n * @example\n * ```typescript\n * const pipelines = await rag.pipelines.list();\n * console.log(pipelines); // [{ name: 'docs', status: 'ready', ... }]\n * ```\n */\n list: async (): Promise<{ pipelines: RAGPipelineInfo[]; count: number }> => {\n return this.http.get('rag/pipelines').json();\n },\n\n /**\n * Get pipeline information\n *\n * @example\n * ```typescript\n * const info = await rag.pipelines.get('product-docs');\n * console.log(info.stats.documentsCount, info.stats.totalQueries);\n * ```\n */\n get: async (pipelineName: string): Promise<RAGPipelineInfo> => {\n return this.http.get(`rag/pipelines/${pipelineName}`).json();\n },\n\n /**\n * Update pipeline configuration\n *\n * @example\n * ```typescript\n * await rag.pipelines.update('product-docs', {\n * generation: {\n * temperature: 0.5\n * }\n * });\n * ```\n */\n update: async (\n pipelineName: string,\n updates: Partial<RAGConfig>\n ): Promise<{ success: boolean; pipeline: RAGPipelineInfo }> => {\n return this.http.patch(`rag/pipelines/${pipelineName}`, {\n json: updates,\n }).json();\n },\n\n /**\n * Delete a pipeline\n *\n * @example\n * ```typescript\n * await rag.pipelines.delete('old-docs');\n * ```\n */\n delete: async (pipelineName: string): Promise<{ success: boolean; message: string }> => {\n return this.http.delete(`rag/pipelines/${pipelineName}`).json();\n },\n };\n\n /**\n * Ingest documents into a RAG pipeline\n *\n * @example\n * ```typescript\n * // Ingest from file\n * await rag.ingest('product-docs', {\n * source: './docs',\n * type: 'file',\n * format: 'markdown',\n * recursive: true\n * });\n *\n * // Ingest from URL\n * await rag.ingest('product-docs', {\n * source: 'https://example.com/docs',\n * type: 'url',\n * format: 'html'\n * });\n *\n * // Ingest text directly\n * await rag.ingest('product-docs', {\n * source: 'This is my document content...',\n * type: 'text',\n * metadata: { title: 'Introduction' }\n * });\n * ```\n */\n async ingest(\n pipelineName: string,\n options: IngestOptions\n ): Promise<ProcessingResult | BatchProcessingResult> {\n const { waitForCompletion, ...ingestionRequest } = options;\n\n if (waitForCompletion) {\n return this.http.post(`rag/pipelines/${pipelineName}/ingest`, {\n json: ingestionRequest,\n searchParams: { wait: 'true' },\n }).json();\n }\n\n return this.http.post(`rag/pipelines/${pipelineName}/ingest`, {\n json: ingestionRequest,\n }).json();\n }\n\n /**\n * Query a RAG pipeline (non-streaming)\n *\n * @example\n * ```typescript\n * const response = await rag.query('product-docs', {\n * query: 'How do I authenticate users?',\n * topK: 5,\n * minSimilarity: 0.7,\n * includeSource: true\n * });\n *\n * console.log('Answer:', response.answer);\n * console.log('Sources:', response.sources);\n * console.log('Performance:', response.performance);\n * ```\n */\n async query(pipelineName: string, options: QueryOptions): Promise<QueryResponse> {\n const { streaming, ...queryRequest } = options;\n\n return this.http.post(`rag/pipelines/${pipelineName}/query`, {\n json: {\n ...queryRequest,\n streaming: false,\n userId: this.config.userId || undefined,\n teamId: this.config.teamId || undefined,\n },\n }).json();\n }\n\n /**\n * Query a RAG pipeline with streaming response\n *\n * @example\n * ```typescript\n * const stream = await rag.queryStream('product-docs', {\n * query: 'Explain the authentication flow',\n * topK: 5\n * });\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'answer') {\n * process.stdout.write(chunk.data.content);\n * } else if (chunk.type === 'complete') {\n * console.log('\\nSources:', chunk.data.sources);\n * }\n * }\n * ```\n */\n async queryStream(\n pipelineName: string,\n options: QueryOptions\n ): Promise<AsyncIterable<QueryStreamChunk>> {\n const { streaming: _, ...queryRequest } = options;\n\n const response = await this.http.post(`rag/pipelines/${pipelineName}/query`, {\n json: {\n ...queryRequest,\n streaming: true,\n userId: this.config.userId || undefined,\n teamId: this.config.teamId || undefined,\n },\n });\n\n return this.parseSSEStream(response.body!);\n }\n\n /**\n * Get pipeline statistics\n *\n * @example\n * ```typescript\n * const stats = await rag.stats('product-docs');\n * console.log(`Documents: ${stats.documentsCount}`);\n * console.log(`Queries: ${stats.totalQueries}`);\n * console.log(`Avg response time: ${stats.avgResponseTime}ms`);\n * ```\n */\n async stats(pipelineName: string): Promise<RAGPipelineInfo['stats']> {\n const info = await this.pipelines.get(pipelineName);\n return info.stats;\n }\n\n /**\n * Clear all documents from a pipeline\n *\n * @example\n * ```typescript\n * await rag.clear('product-docs');\n * ```\n */\n async clear(pipelineName: string): Promise<{ success: boolean; message: string }> {\n return this.http.delete(`rag/pipelines/${pipelineName}/documents`).json();\n }\n\n /**\n * Parse Server-Sent Events stream into async iterable\n */\n private async *parseSSEStream(body: ReadableStream<Uint8Array>): AsyncIterable<QueryStreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed === '') continue;\n if (trimmed.startsWith(':')) continue; // Comment\n if (trimmed === 'data: [DONE]') return;\n\n if (trimmed.startsWith('data: ')) {\n const data = trimmed.slice(6);\n try {\n const chunk = JSON.parse(data) as QueryStreamChunk;\n yield chunk;\n } catch (error) {\n console.error('Failed to parse SSE data:', data, error);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n/**\n * Create a RAG client instance\n *\n * @example\n * ```typescript\n * import { createRAGClient } from '@neureus/sdk/rag';\n *\n * const rag = createRAGClient({\n * apiKey: process.env.NEUREUS_API_KEY\n * });\n * ```\n */\nexport function createRAGClient(config: RAGClientConfig): RAGClient {\n return new RAGClient(config);\n}\n"]}