openrag-sdk 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ The SDK can be configured via environment variables or constructor arguments:
|
|
|
33
33
|
| Environment Variable | Constructor Option | Description |
|
|
34
34
|
|---------------------|-------------------|-------------|
|
|
35
35
|
| `OPENRAG_API_KEY` | `apiKey` | API key for authentication (required) |
|
|
36
|
-
| `OPENRAG_URL` | `baseUrl` | Base URL for the
|
|
36
|
+
| `OPENRAG_URL` | `baseUrl` | Base URL for the OpenRAG frontend (default: `http://localhost:3000`) |
|
|
37
37
|
|
|
38
38
|
```typescript
|
|
39
39
|
// Using environment variables
|
package/dist/index.d.mts
CHANGED
|
@@ -474,7 +474,7 @@ interface RequestOptions {
|
|
|
474
474
|
*
|
|
475
475
|
* The client can be configured via constructor arguments or environment variables:
|
|
476
476
|
* - OPENRAG_API_KEY: API key for authentication
|
|
477
|
-
* - OPENRAG_URL: Base URL for the OpenRAG
|
|
477
|
+
* - OPENRAG_URL: Base URL for the OpenRAG frontend (default: http://localhost:3000)
|
|
478
478
|
*
|
|
479
479
|
* @example
|
|
480
480
|
* ```typescript
|
package/dist/index.d.ts
CHANGED
|
@@ -474,7 +474,7 @@ interface RequestOptions {
|
|
|
474
474
|
*
|
|
475
475
|
* The client can be configured via constructor arguments or environment variables:
|
|
476
476
|
* - OPENRAG_API_KEY: API key for authentication
|
|
477
|
-
* - OPENRAG_URL: Base URL for the OpenRAG
|
|
477
|
+
* - OPENRAG_URL: Base URL for the OpenRAG frontend (default: http://localhost:3000)
|
|
478
478
|
*
|
|
479
479
|
* @example
|
|
480
480
|
* ```typescript
|
package/dist/index.js
CHANGED
|
@@ -404,7 +404,7 @@ var KnowledgeFiltersClient = class {
|
|
|
404
404
|
description: options.description ?? "",
|
|
405
405
|
queryData: JSON.stringify(options.queryData)
|
|
406
406
|
};
|
|
407
|
-
const response = await this.client._request("POST", "/knowledge-
|
|
407
|
+
const response = await this.client._request("POST", "/api/v1/knowledge-filters", {
|
|
408
408
|
body: JSON.stringify(body)
|
|
409
409
|
});
|
|
410
410
|
const data = await response.json();
|
|
@@ -428,7 +428,7 @@ var KnowledgeFiltersClient = class {
|
|
|
428
428
|
};
|
|
429
429
|
const response = await this.client._request(
|
|
430
430
|
"POST",
|
|
431
|
-
"/knowledge-
|
|
431
|
+
"/api/v1/knowledge-filters/search",
|
|
432
432
|
{
|
|
433
433
|
body: JSON.stringify(body)
|
|
434
434
|
}
|
|
@@ -449,7 +449,7 @@ var KnowledgeFiltersClient = class {
|
|
|
449
449
|
try {
|
|
450
450
|
const response = await this.client._request(
|
|
451
451
|
"GET",
|
|
452
|
-
`/knowledge-
|
|
452
|
+
`/api/v1/knowledge-filters/${filterId}`
|
|
453
453
|
);
|
|
454
454
|
const data = await response.json();
|
|
455
455
|
if (!data.success || !data.filter) {
|
|
@@ -480,7 +480,7 @@ var KnowledgeFiltersClient = class {
|
|
|
480
480
|
}
|
|
481
481
|
const response = await this.client._request(
|
|
482
482
|
"PUT",
|
|
483
|
-
`/knowledge-
|
|
483
|
+
`/api/v1/knowledge-filters/${filterId}`,
|
|
484
484
|
{
|
|
485
485
|
body: JSON.stringify(body)
|
|
486
486
|
}
|
|
@@ -497,7 +497,7 @@ var KnowledgeFiltersClient = class {
|
|
|
497
497
|
async delete(filterId) {
|
|
498
498
|
const response = await this.client._request(
|
|
499
499
|
"DELETE",
|
|
500
|
-
`/knowledge-
|
|
500
|
+
`/api/v1/knowledge-filters/${filterId}`
|
|
501
501
|
);
|
|
502
502
|
const data = await response.json();
|
|
503
503
|
return data.success ?? false;
|
|
@@ -595,7 +595,7 @@ var SettingsClient = class {
|
|
|
595
595
|
* @returns Success response with message.
|
|
596
596
|
*/
|
|
597
597
|
async update(options) {
|
|
598
|
-
const response = await this.client._request("POST", "/settings", {
|
|
598
|
+
const response = await this.client._request("POST", "/api/v1/settings", {
|
|
599
599
|
body: JSON.stringify(options)
|
|
600
600
|
});
|
|
601
601
|
const data = await response.json();
|
|
@@ -605,7 +605,7 @@ var SettingsClient = class {
|
|
|
605
605
|
}
|
|
606
606
|
};
|
|
607
607
|
var OpenRAGClient = class _OpenRAGClient {
|
|
608
|
-
static DEFAULT_BASE_URL = "http://localhost:
|
|
608
|
+
static DEFAULT_BASE_URL = "http://localhost:3000";
|
|
609
609
|
_apiKey;
|
|
610
610
|
_baseUrl;
|
|
611
611
|
_timeout;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chat.ts","../src/documents.ts","../src/search.ts","../src/knowledge-filters.ts","../src/types.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * OpenRAG SDK chat client with streaming support.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n ChatCreateOptions,\n ChatResponse,\n ContentEvent,\n Conversation,\n ConversationDetail,\n ConversationListResponse,\n DoneEvent,\n Message,\n Source,\n SourcesEvent,\n StreamEvent,\n} from \"./types\";\n\n/**\n * Streaming chat response with helpers.\n *\n * Usage:\n * ```typescript\n * using stream = await client.chat.stream({ message: \"Hello\" });\n * for await (const event of stream) {\n * if (event.type === \"content\") console.log(event.delta);\n * }\n * console.log(stream.chatId);\n * console.log(stream.text);\n * ```\n */\nexport class ChatStream implements AsyncIterable<StreamEvent>, Disposable {\n private _text = \"\";\n private _chatId: string | null = null;\n private _sources: Source[] = [];\n private _consumed = false;\n private _reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n private _response: Response | null = null;\n\n constructor(\n private client: OpenRAGClient,\n private options: ChatCreateOptions\n ) {}\n\n /** The accumulated text from content events. */\n get text(): string {\n return this._text;\n }\n\n /** The chat ID for continuing the conversation. */\n get chatId(): string | null {\n return this._chatId;\n }\n\n /** The sources retrieved during the conversation. */\n get sources(): Source[] {\n return this._sources;\n }\n\n /** @internal Initialize the stream. */\n async _init(): Promise<void> {\n const body: Record<string, unknown> = {\n message: this.options.message,\n stream: true,\n limit: this.options.limit ?? 10,\n score_threshold: this.options.scoreThreshold ?? 0,\n };\n\n if (this.options.chatId) {\n body[\"chat_id\"] = this.options.chatId;\n }\n\n if (this.options.filters) {\n body[\"filters\"] = this.options.filters;\n }\n\n if (this.options.filterId) {\n body[\"filter_id\"] = this.options.filterId;\n }\n\n this._response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n stream: true,\n });\n\n if (!this._response.body) {\n throw new Error(\"Response body is null\");\n }\n\n this._reader = this._response.body.getReader();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n if (this._consumed) {\n throw new Error(\"Stream has already been consumed\");\n }\n this._consumed = true;\n\n if (!this._reader) {\n throw new Error(\"Stream not initialized\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await this._reader.read();\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 if (!trimmed || !trimmed.startsWith(\"data:\")) continue;\n\n const dataStr = trimmed.slice(5).trim();\n if (!dataStr) continue;\n\n try {\n const data = JSON.parse(dataStr);\n const eventType = data.type;\n\n if (eventType === \"content\") {\n const delta = data.delta || \"\";\n this._text += delta;\n yield { type: \"content\", delta } as ContentEvent;\n } else if (eventType === \"sources\") {\n this._sources = data.sources || [];\n yield { type: \"sources\", sources: this._sources } as SourcesEvent;\n } else if (eventType === \"done\") {\n this._chatId = data.chat_id || null;\n yield { type: \"done\", chatId: this._chatId } as DoneEvent;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n /**\n * Iterate over just the text deltas.\n */\n get textStream(): AsyncIterable<string> {\n const self = this;\n return {\n async *[Symbol.asyncIterator]() {\n for await (const event of self) {\n if (event.type === \"content\") {\n yield event.delta;\n }\n }\n },\n };\n }\n\n /**\n * Consume the stream and return the complete text.\n */\n async finalText(): Promise<string> {\n for await (const _ of this) {\n // Consume all events\n }\n return this._text;\n }\n\n /** Clean up resources. */\n [Symbol.dispose](): void {\n this._reader?.cancel().catch(() => {});\n }\n\n /** Close the stream. */\n close(): void {\n this[Symbol.dispose]();\n }\n}\n\nexport class ChatClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Send a chat message (non-streaming).\n */\n async create(options: ChatCreateOptions & { stream?: false }): Promise<ChatResponse>;\n /**\n * Send a chat message (streaming).\n */\n async create(\n options: ChatCreateOptions & { stream: true }\n ): Promise<AsyncIterable<StreamEvent>>;\n /**\n * Send a chat message.\n *\n * @param options - Chat options including message, stream flag, etc.\n * @returns ChatResponse if stream=false, AsyncIterable<StreamEvent> if stream=true.\n */\n async create(\n options: ChatCreateOptions\n ): Promise<ChatResponse | AsyncIterable<StreamEvent>> {\n if (options.stream) {\n return this._createStreamingIterator(options);\n }\n return this._createNonStreaming(options);\n }\n\n private async _createNonStreaming(options: ChatCreateOptions): Promise<ChatResponse> {\n const body: Record<string, unknown> = {\n message: options.message,\n stream: false,\n limit: options.limit ?? 10,\n score_threshold: options.scoreThreshold ?? 0,\n };\n\n if (options.chatId) {\n body[\"chat_id\"] = options.chatId;\n }\n\n if (options.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n response: data.response || \"\",\n chatId: data.chat_id || null,\n sources: data.sources || [],\n };\n }\n\n private async _createStreamingIterator(\n options: ChatCreateOptions\n ): Promise<AsyncIterable<StreamEvent>> {\n const stream = new ChatStream(this.client, options);\n await stream._init();\n return stream;\n }\n\n /**\n * Create a streaming chat context manager.\n *\n * @param options - Chat options.\n * @returns ChatStream with helpers.\n */\n async stream(options: Omit<ChatCreateOptions, \"stream\">): Promise<ChatStream> {\n const stream = new ChatStream(this.client, { ...options, stream: true });\n await stream._init();\n return stream;\n }\n\n /**\n * List all conversations.\n */\n async list(): Promise<ConversationListResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/chat\");\n const data = await response.json();\n\n const conversations: Conversation[] = (data.conversations || []).map(\n (c: Record<string, unknown>) => ({\n chatId: c[\"chat_id\"],\n title: c[\"title\"] || \"\",\n createdAt: c[\"created_at\"] || null,\n lastActivity: c[\"last_activity\"] || null,\n messageCount: c[\"message_count\"] || 0,\n })\n );\n\n return { conversations };\n }\n\n /**\n * Get a specific conversation with full message history.\n *\n * @param chatId - The ID of the conversation to retrieve.\n */\n async get(chatId: string): Promise<ConversationDetail> {\n const response = await this.client._request(\"GET\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n\n const messages: Message[] = (data.messages || []).map(\n (m: Record<string, unknown>) => ({\n role: m[\"role\"],\n content: m[\"content\"],\n timestamp: m[\"timestamp\"] || null,\n })\n );\n\n return {\n chatId: data.chat_id || chatId,\n title: data.title || \"\",\n createdAt: data.created_at || null,\n lastActivity: data.last_activity || null,\n messageCount: messages.length,\n messages,\n };\n }\n\n /**\n * Delete a conversation.\n *\n * @param chatId - The ID of the conversation to delete.\n */\n async delete(chatId: string): Promise<boolean> {\n const response = await this.client._request(\"DELETE\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n return data.success ?? false;\n }\n}\n","/**\n * OpenRAG SDK documents client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n DeleteDocumentResponse,\n IngestResponse,\n IngestTaskStatus,\n} from \"./types\";\n\nexport interface IngestOptions {\n /** Path to file (Node.js only). */\n filePath?: string;\n /** File object (browser or Node.js). */\n file?: File | Blob;\n /** Filename when providing file/blob. */\n filename?: string;\n /** If true, poll until ingestion completes. Default: true. */\n wait?: boolean;\n /** Seconds between status checks when waiting. Default: 1. */\n pollInterval?: number;\n /** Maximum seconds to wait for completion. Default: 300. */\n timeout?: number;\n}\n\nexport class DocumentsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Ingest a document into the knowledge base.\n *\n * @param options - Ingest options (filePath or file+filename).\n * @returns IngestTaskStatus with final status if wait=true, IngestResponse with task_id if wait=false.\n */\n async ingest(\n options: IngestOptions\n ): Promise<IngestResponse | IngestTaskStatus> {\n const formData = new FormData();\n const wait = options.wait ?? true;\n const pollInterval = options.pollInterval ?? 1;\n const timeout = options.timeout ?? 300;\n\n if (options.filePath) {\n // Node.js: read file from path\n if (typeof globalThis.process !== \"undefined\") {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const fileBuffer = fs.readFileSync(options.filePath);\n const filename = path.basename(options.filePath);\n const blob = new Blob([fileBuffer]);\n formData.append(\"file\", blob, filename);\n } else {\n throw new Error(\"filePath is only supported in Node.js\");\n }\n } else if (options.file) {\n if (!options.filename) {\n throw new Error(\"filename is required when providing file\");\n }\n formData.append(\"file\", options.file, options.filename);\n } else {\n throw new Error(\"Either filePath or file must be provided\");\n }\n\n const response = await this.client._request(\n \"POST\",\n \"/api/v1/documents/ingest\",\n {\n body: formData,\n isMultipart: true,\n }\n );\n\n const data = await response.json();\n const ingestResponse: IngestResponse = {\n task_id: data.task_id,\n status: data.status ?? null,\n filename: data.filename ?? null,\n };\n\n if (!wait) {\n return ingestResponse;\n }\n\n // Poll for completion\n return await this.waitForTask(ingestResponse.task_id, pollInterval, timeout);\n }\n\n /**\n * Get the status of an ingestion task.\n *\n * @param taskId - The task ID returned from ingest().\n * @returns IngestTaskStatus with current task status.\n */\n async getTaskStatus(taskId: string): Promise<IngestTaskStatus> {\n const response = await this.client._request(\n \"GET\",\n `/api/v1/tasks/${taskId}`\n );\n const data = await response.json();\n return {\n task_id: data.task_id,\n status: data.status,\n total_files: data.total_files ?? 0,\n processed_files: data.processed_files ?? 0,\n successful_files: data.successful_files ?? 0,\n failed_files: data.failed_files ?? 0,\n files: data.files ?? {},\n };\n }\n\n /**\n * Wait for an ingestion task to complete.\n *\n * @param taskId - The task ID to wait for.\n * @param pollInterval - Seconds between status checks.\n * @param timeout - Maximum seconds to wait.\n * @returns IngestTaskStatus with final status.\n */\n async waitForTask(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 300\n ): Promise<IngestTaskStatus> {\n const startTime = Date.now();\n const timeoutMs = timeout * 1000;\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getTaskStatus(taskId);\n if (status.status === \"completed\" || status.status === \"failed\") {\n return status;\n }\n await this.sleep(pollInterval * 1000);\n }\n\n throw new Error(\n `Ingestion task ${taskId} did not complete within ${timeout}s`\n );\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Delete a document from the knowledge base.\n *\n * @param filename - Name of the file to delete.\n * @returns DeleteDocumentResponse with deleted chunk count.\n */\n async delete(filename: string): Promise<DeleteDocumentResponse> {\n const response = await this.client._request(\"DELETE\", \"/api/v1/documents\", {\n body: JSON.stringify({ filename }),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n deleted_chunks: data.deleted_chunks ?? 0,\n };\n }\n}\n","/**\n * OpenRAG SDK search client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type { SearchQueryOptions, SearchResponse } from \"./types\";\n\nexport class SearchClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Perform semantic search on documents.\n *\n * @param query - The search query text.\n * @param options - Optional search options.\n * @returns SearchResponse containing the search results.\n */\n async query(\n query: string,\n options?: Omit<SearchQueryOptions, \"query\">\n ): Promise<SearchResponse> {\n const body: Record<string, unknown> = {\n query,\n limit: options?.limit ?? 10,\n score_threshold: options?.scoreThreshold ?? 0,\n };\n\n if (options?.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options?.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/search\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n results: data.results || [],\n };\n }\n}\n","/**\n * OpenRAG SDK knowledge filters client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n CreateKnowledgeFilterOptions,\n CreateKnowledgeFilterResponse,\n DeleteKnowledgeFilterResponse,\n GetKnowledgeFilterResponse,\n KnowledgeFilter,\n KnowledgeFilterSearchResponse,\n UpdateKnowledgeFilterOptions,\n} from \"./types\";\n\nexport class KnowledgeFiltersClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Create a new knowledge filter.\n *\n * @param options - The filter options including name and queryData.\n * @returns The created filter response with ID.\n */\n async create(\n options: CreateKnowledgeFilterOptions\n ): Promise<CreateKnowledgeFilterResponse> {\n const body = {\n name: options.name,\n description: options.description ?? \"\",\n queryData: JSON.stringify(options.queryData),\n };\n\n const response = await this.client._request(\"POST\", \"/knowledge-filter\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n id: data.id,\n error: data.error,\n };\n }\n\n /**\n * Search for knowledge filters by name, description, or query content.\n *\n * @param query - Optional search query text.\n * @param limit - Maximum number of results (default 20).\n * @returns List of matching knowledge filters.\n */\n async search(query?: string, limit?: number): Promise<KnowledgeFilter[]> {\n const body = {\n query: query ?? \"\",\n limit: limit ?? 20,\n };\n\n const response = await this.client._request(\n \"POST\",\n \"/knowledge-filter/search\",\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = (await response.json()) as KnowledgeFilterSearchResponse;\n if (!data.success || !data.filters) {\n return [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return data.filters.map((f: any) => this._parseFilter(f));\n }\n\n /**\n * Get a specific knowledge filter by ID.\n *\n * @param filterId - The ID of the filter to retrieve.\n * @returns The knowledge filter or null if not found.\n */\n async get(filterId: string): Promise<KnowledgeFilter | null> {\n try {\n const response = await this.client._request(\n \"GET\",\n `/knowledge-filter/${filterId}`\n );\n\n const data = (await response.json()) as GetKnowledgeFilterResponse;\n if (!data.success || !data.filter) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._parseFilter(data.filter as any);\n } catch {\n // Filter not found or other error\n return null;\n }\n }\n\n /**\n * Update an existing knowledge filter.\n *\n * @param filterId - The ID of the filter to update.\n * @param options - The fields to update.\n * @returns Success status.\n */\n async update(\n filterId: string,\n options: UpdateKnowledgeFilterOptions\n ): Promise<boolean> {\n const body: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n body[\"name\"] = options.name;\n }\n if (options.description !== undefined) {\n body[\"description\"] = options.description;\n }\n if (options.queryData !== undefined) {\n body[\"queryData\"] = JSON.stringify(options.queryData);\n }\n\n const response = await this.client._request(\n \"PUT\",\n `/knowledge-filter/${filterId}`,\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = await response.json();\n return data.success ?? false;\n }\n\n /**\n * Delete a knowledge filter.\n *\n * @param filterId - The ID of the filter to delete.\n * @returns Success status.\n */\n async delete(filterId: string): Promise<boolean> {\n const response = await this.client._request(\n \"DELETE\",\n `/knowledge-filter/${filterId}`\n );\n\n const data = (await response.json()) as DeleteKnowledgeFilterResponse;\n return data.success ?? false;\n }\n\n /**\n * Parse a filter from API response, handling JSON-stringified queryData.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _parseFilter(filter: any): KnowledgeFilter {\n let queryData = filter[\"query_data\"] ?? filter[\"queryData\"];\n if (typeof queryData === \"string\") {\n try {\n queryData = JSON.parse(queryData);\n } catch {\n queryData = {};\n }\n }\n\n return {\n id: filter[\"id\"] as string,\n name: filter[\"name\"] as string,\n description: filter[\"description\"],\n queryData: queryData as KnowledgeFilter[\"queryData\"],\n owner: filter[\"owner\"],\n createdAt: filter[\"created_at\"] ?? filter[\"createdAt\"],\n updatedAt: filter[\"updated_at\"] ?? filter[\"updatedAt\"],\n };\n }\n}\n","/**\n * OpenRAG SDK types.\n */\n\n// Chat types\nexport interface Source {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface ChatResponse {\n response: string;\n chatId?: string | null;\n sources: Source[];\n}\n\nexport type StreamEventType = \"content\" | \"sources\" | \"done\";\n\nexport interface ContentEvent {\n type: \"content\";\n delta: string;\n}\n\nexport interface SourcesEvent {\n type: \"sources\";\n sources: Source[];\n}\n\nexport interface DoneEvent {\n type: \"done\";\n chatId?: string | null;\n}\n\nexport type StreamEvent = ContentEvent | SourcesEvent | DoneEvent;\n\n// Search types\nexport interface SearchResult {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface SearchResponse {\n results: SearchResult[];\n}\n\nexport interface SearchFilters {\n data_sources?: string[];\n document_types?: string[];\n}\n\n// Document types\nexport interface IngestResponse {\n task_id: string;\n status?: string | null; // Optional - we poll for actual status\n filename?: string | null;\n}\n\nexport interface IngestTaskStatus {\n task_id: string;\n status: string; // \"pending\", \"running\", \"completed\", \"failed\"\n total_files: number;\n processed_files: number;\n successful_files: number;\n failed_files: number;\n files: Record<string, unknown>;\n}\n\nexport interface DeleteDocumentResponse {\n success: boolean;\n deleted_chunks: number;\n}\n\n// Chat history types\nexport interface Message {\n role: string;\n content: string;\n timestamp?: string | null;\n}\n\nexport interface Conversation {\n chatId: string;\n title: string;\n createdAt?: string | null;\n lastActivity?: string | null;\n messageCount: number;\n}\n\nexport interface ConversationDetail extends Conversation {\n messages: Message[];\n}\n\nexport interface ConversationListResponse {\n conversations: Conversation[];\n}\n\n// Settings types\nexport interface AgentSettings {\n llm_provider?: string | null;\n llm_model?: string | null;\n}\n\nexport interface KnowledgeSettings {\n embedding_provider?: string | null;\n embedding_model?: string | null;\n chunk_size?: number | null;\n chunk_overlap?: number | null;\n}\n\nexport interface SettingsResponse {\n agent: AgentSettings;\n knowledge: KnowledgeSettings;\n}\n\n/** Options for updating settings. */\nexport interface SettingsUpdateOptions {\n /** LLM model name. */\n llm_model?: string;\n /** LLM provider (openai, anthropic, watsonx, ollama). */\n llm_provider?: string;\n /** System prompt for the agent. */\n system_prompt?: string;\n /** Embedding model name. */\n embedding_model?: string;\n /** Embedding provider (openai, watsonx, ollama). */\n embedding_provider?: string;\n /** Chunk size for document splitting. */\n chunk_size?: number;\n /** Chunk overlap for document splitting. */\n chunk_overlap?: number;\n /** Enable table structure parsing. */\n table_structure?: boolean;\n /** Enable OCR for text extraction. */\n ocr?: boolean;\n /** Enable picture descriptions. */\n picture_descriptions?: boolean;\n}\n\n/** Response from settings update. */\nexport interface SettingsUpdateResponse {\n message: string;\n}\n\n// Knowledge filter types\n/** Query configuration stored in a knowledge filter. */\nexport interface KnowledgeFilterQueryData {\n /** Semantic search query text. */\n query?: string;\n /** Filter criteria for documents. */\n filters?: {\n data_sources?: string[];\n document_types?: string[];\n owners?: string[];\n connector_types?: string[];\n };\n /** Maximum number of results. */\n limit?: number;\n /** Minimum relevance score threshold. */\n scoreThreshold?: number;\n /** UI color for the filter. */\n color?: string;\n /** UI icon for the filter. */\n icon?: string;\n}\n\n/** A knowledge filter definition. */\nexport interface KnowledgeFilter {\n id: string;\n name: string;\n description?: string;\n queryData: KnowledgeFilterQueryData;\n owner?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/** Options for creating a knowledge filter. */\nexport interface CreateKnowledgeFilterOptions {\n /** Filter name (required). */\n name: string;\n /** Filter description. */\n description?: string;\n /** Query configuration for the filter. */\n queryData: KnowledgeFilterQueryData;\n}\n\n/** Options for updating a knowledge filter. */\nexport interface UpdateKnowledgeFilterOptions {\n /** New filter name. */\n name?: string;\n /** New filter description. */\n description?: string;\n /** New query configuration. */\n queryData?: KnowledgeFilterQueryData;\n}\n\n/** Response from creating a knowledge filter. */\nexport interface CreateKnowledgeFilterResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\n/** Response from searching knowledge filters. */\nexport interface KnowledgeFilterSearchResponse {\n success: boolean;\n filters: KnowledgeFilter[];\n}\n\n/** Response from getting a knowledge filter. */\nexport interface GetKnowledgeFilterResponse {\n success: boolean;\n filter?: KnowledgeFilter;\n error?: string;\n}\n\n/** Response from deleting a knowledge filter. */\nexport interface DeleteKnowledgeFilterResponse {\n success: boolean;\n error?: string;\n}\n\n// Client options\nexport interface OpenRAGClientOptions {\n /** API key for authentication. Falls back to OPENRAG_API_KEY env var. */\n apiKey?: string;\n /** Base URL for the API. Falls back to OPENRAG_URL env var. */\n baseUrl?: string;\n /** Request timeout in milliseconds (default 30000). */\n timeout?: number;\n}\n\n// Request types\nexport interface ChatCreateOptions {\n message: string;\n stream?: boolean;\n chatId?: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the chat. */\n filterId?: string;\n}\n\nexport interface SearchQueryOptions {\n query: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the search. */\n filterId?: string;\n}\n\n// Error types\nexport class OpenRAGError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = \"OpenRAGError\";\n }\n}\n\nexport class AuthenticationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotFoundError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ValidationError\";\n }\n}\n\nexport class RateLimitError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class ServerError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ServerError\";\n }\n}\n","/**\n * OpenRAG SDK client.\n */\n\nimport { ChatClient } from \"./chat\";\nimport { DocumentsClient } from \"./documents\";\nimport { SearchClient } from \"./search\";\nimport { KnowledgeFiltersClient } from \"./knowledge-filters\";\nimport {\n AuthenticationError,\n NotFoundError,\n OpenRAGError,\n OpenRAGClientOptions,\n RateLimitError,\n ServerError,\n SettingsResponse,\n SettingsUpdateOptions,\n SettingsUpdateResponse,\n ValidationError,\n} from \"./types\";\n\n/**\n * Get environment variable value.\n * Works in Node.js and environments with process.env.\n */\nfunction getEnv(key: string): string | undefined {\n if (typeof globalThis.process !== \"undefined\" && globalThis.process.env) {\n return globalThis.process.env[key];\n }\n return undefined;\n}\n\nclass SettingsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Get current OpenRAG configuration.\n */\n async get(): Promise<SettingsResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/settings\");\n const data = await response.json();\n return {\n agent: data.agent || {},\n knowledge: data.knowledge || {},\n };\n }\n\n /**\n * Update OpenRAG configuration.\n *\n * @param options - The settings to update.\n * @returns Success response with message.\n */\n async update(options: SettingsUpdateOptions): Promise<SettingsUpdateResponse> {\n const response = await this.client._request(\"POST\", \"/settings\", {\n body: JSON.stringify(options),\n });\n const data = await response.json();\n return {\n message: data.message || \"Settings updated\",\n };\n }\n}\n\ninterface RequestOptions {\n body?: string | FormData;\n isMultipart?: boolean;\n stream?: boolean;\n}\n\n/**\n * OpenRAG API client.\n *\n * The client can be configured via constructor arguments or environment variables:\n * - OPENRAG_API_KEY: API key for authentication\n * - OPENRAG_URL: Base URL for the OpenRAG API (default: http://localhost:8080)\n *\n * @example\n * ```typescript\n * // Using environment variables\n * const client = new OpenRAGClient();\n * const response = await client.chat.create({ message: \"Hello\" });\n *\n * // Using explicit arguments\n * const client = new OpenRAGClient({\n * apiKey: \"orag_...\",\n * baseUrl: \"https://api.example.com\"\n * });\n * ```\n */\nexport class OpenRAGClient {\n private static readonly DEFAULT_BASE_URL = \"http://localhost:8080\";\n\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n\n /** Chat client for conversations. */\n readonly chat: ChatClient;\n /** Search client for semantic search. */\n readonly search: SearchClient;\n /** Documents client for ingestion and deletion. */\n readonly documents: DocumentsClient;\n /** Settings client for configuration. */\n readonly settings: SettingsClient;\n /** Knowledge filters client for managing filters. */\n readonly knowledgeFilters: KnowledgeFiltersClient;\n\n constructor(options: OpenRAGClientOptions = {}) {\n // Resolve API key from argument or environment\n this._apiKey = options.apiKey || getEnv(\"OPENRAG_API_KEY\") || \"\";\n if (!this._apiKey) {\n throw new AuthenticationError(\n \"API key is required. Set OPENRAG_API_KEY environment variable or pass apiKey option.\"\n );\n }\n\n // Resolve base URL from argument or environment\n this._baseUrl = (\n options.baseUrl ||\n getEnv(\"OPENRAG_URL\") ||\n OpenRAGClient.DEFAULT_BASE_URL\n ).replace(/\\/$/, \"\");\n\n this._timeout = options.timeout ?? 30000;\n\n // Initialize sub-clients\n this.chat = new ChatClient(this);\n this.search = new SearchClient(this);\n this.documents = new DocumentsClient(this);\n this.settings = new SettingsClient(this);\n this.knowledgeFilters = new KnowledgeFiltersClient(this);\n }\n\n /** @internal Get request headers with authentication. */\n _getHeaders(isMultipart = false): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-API-Key\": this._apiKey,\n };\n\n if (!isMultipart) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n return headers;\n }\n\n /** @internal Make an authenticated request to the API. */\n async _request(\n method: string,\n path: string,\n options: RequestOptions = {}\n ): Promise<Response> {\n const url = `${this._baseUrl}${path}`;\n const headers = this._getHeaders(options.isMultipart);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: options.body ?? null,\n signal: controller.signal,\n });\n\n if (!options.stream) {\n this._handleError(response);\n }\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /** @internal Handle error responses. */\n _handleError(response: Response): void {\n if (response.ok) return;\n\n const statusCode = response.status;\n\n // We can't await the JSON here since this might be called in a sync context\n // So we throw with a generic message based on status code\n const errorMessages: Record<number, string> = {\n 401: \"Invalid or missing API key\",\n 403: \"Access denied\",\n 404: \"Resource not found\",\n 400: \"Invalid request\",\n 429: \"Rate limit exceeded\",\n };\n\n const message = errorMessages[statusCode] || `HTTP ${statusCode}`;\n\n if (statusCode === 401 || statusCode === 403) {\n throw new AuthenticationError(message, statusCode);\n } else if (statusCode === 404) {\n throw new NotFoundError(message, statusCode);\n } else if (statusCode === 400) {\n throw new ValidationError(message, statusCode);\n } else if (statusCode === 429) {\n throw new RateLimitError(message, statusCode);\n } else if (statusCode >= 500) {\n throw new ServerError(message, statusCode);\n } else {\n throw new OpenRAGError(message, statusCode);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chat.ts","../src/documents.ts","../src/search.ts","../src/knowledge-filters.ts","../src/types.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * OpenRAG SDK chat client with streaming support.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n ChatCreateOptions,\n ChatResponse,\n ContentEvent,\n Conversation,\n ConversationDetail,\n ConversationListResponse,\n DoneEvent,\n Message,\n Source,\n SourcesEvent,\n StreamEvent,\n} from \"./types\";\n\n/**\n * Streaming chat response with helpers.\n *\n * Usage:\n * ```typescript\n * using stream = await client.chat.stream({ message: \"Hello\" });\n * for await (const event of stream) {\n * if (event.type === \"content\") console.log(event.delta);\n * }\n * console.log(stream.chatId);\n * console.log(stream.text);\n * ```\n */\nexport class ChatStream implements AsyncIterable<StreamEvent>, Disposable {\n private _text = \"\";\n private _chatId: string | null = null;\n private _sources: Source[] = [];\n private _consumed = false;\n private _reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n private _response: Response | null = null;\n\n constructor(\n private client: OpenRAGClient,\n private options: ChatCreateOptions\n ) {}\n\n /** The accumulated text from content events. */\n get text(): string {\n return this._text;\n }\n\n /** The chat ID for continuing the conversation. */\n get chatId(): string | null {\n return this._chatId;\n }\n\n /** The sources retrieved during the conversation. */\n get sources(): Source[] {\n return this._sources;\n }\n\n /** @internal Initialize the stream. */\n async _init(): Promise<void> {\n const body: Record<string, unknown> = {\n message: this.options.message,\n stream: true,\n limit: this.options.limit ?? 10,\n score_threshold: this.options.scoreThreshold ?? 0,\n };\n\n if (this.options.chatId) {\n body[\"chat_id\"] = this.options.chatId;\n }\n\n if (this.options.filters) {\n body[\"filters\"] = this.options.filters;\n }\n\n if (this.options.filterId) {\n body[\"filter_id\"] = this.options.filterId;\n }\n\n this._response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n stream: true,\n });\n\n if (!this._response.body) {\n throw new Error(\"Response body is null\");\n }\n\n this._reader = this._response.body.getReader();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n if (this._consumed) {\n throw new Error(\"Stream has already been consumed\");\n }\n this._consumed = true;\n\n if (!this._reader) {\n throw new Error(\"Stream not initialized\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await this._reader.read();\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 if (!trimmed || !trimmed.startsWith(\"data:\")) continue;\n\n const dataStr = trimmed.slice(5).trim();\n if (!dataStr) continue;\n\n try {\n const data = JSON.parse(dataStr);\n const eventType = data.type;\n\n if (eventType === \"content\") {\n const delta = data.delta || \"\";\n this._text += delta;\n yield { type: \"content\", delta } as ContentEvent;\n } else if (eventType === \"sources\") {\n this._sources = data.sources || [];\n yield { type: \"sources\", sources: this._sources } as SourcesEvent;\n } else if (eventType === \"done\") {\n this._chatId = data.chat_id || null;\n yield { type: \"done\", chatId: this._chatId } as DoneEvent;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n /**\n * Iterate over just the text deltas.\n */\n get textStream(): AsyncIterable<string> {\n const self = this;\n return {\n async *[Symbol.asyncIterator]() {\n for await (const event of self) {\n if (event.type === \"content\") {\n yield event.delta;\n }\n }\n },\n };\n }\n\n /**\n * Consume the stream and return the complete text.\n */\n async finalText(): Promise<string> {\n for await (const _ of this) {\n // Consume all events\n }\n return this._text;\n }\n\n /** Clean up resources. */\n [Symbol.dispose](): void {\n this._reader?.cancel().catch(() => {});\n }\n\n /** Close the stream. */\n close(): void {\n this[Symbol.dispose]();\n }\n}\n\nexport class ChatClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Send a chat message (non-streaming).\n */\n async create(options: ChatCreateOptions & { stream?: false }): Promise<ChatResponse>;\n /**\n * Send a chat message (streaming).\n */\n async create(\n options: ChatCreateOptions & { stream: true }\n ): Promise<AsyncIterable<StreamEvent>>;\n /**\n * Send a chat message.\n *\n * @param options - Chat options including message, stream flag, etc.\n * @returns ChatResponse if stream=false, AsyncIterable<StreamEvent> if stream=true.\n */\n async create(\n options: ChatCreateOptions\n ): Promise<ChatResponse | AsyncIterable<StreamEvent>> {\n if (options.stream) {\n return this._createStreamingIterator(options);\n }\n return this._createNonStreaming(options);\n }\n\n private async _createNonStreaming(options: ChatCreateOptions): Promise<ChatResponse> {\n const body: Record<string, unknown> = {\n message: options.message,\n stream: false,\n limit: options.limit ?? 10,\n score_threshold: options.scoreThreshold ?? 0,\n };\n\n if (options.chatId) {\n body[\"chat_id\"] = options.chatId;\n }\n\n if (options.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n response: data.response || \"\",\n chatId: data.chat_id || null,\n sources: data.sources || [],\n };\n }\n\n private async _createStreamingIterator(\n options: ChatCreateOptions\n ): Promise<AsyncIterable<StreamEvent>> {\n const stream = new ChatStream(this.client, options);\n await stream._init();\n return stream;\n }\n\n /**\n * Create a streaming chat context manager.\n *\n * @param options - Chat options.\n * @returns ChatStream with helpers.\n */\n async stream(options: Omit<ChatCreateOptions, \"stream\">): Promise<ChatStream> {\n const stream = new ChatStream(this.client, { ...options, stream: true });\n await stream._init();\n return stream;\n }\n\n /**\n * List all conversations.\n */\n async list(): Promise<ConversationListResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/chat\");\n const data = await response.json();\n\n const conversations: Conversation[] = (data.conversations || []).map(\n (c: Record<string, unknown>) => ({\n chatId: c[\"chat_id\"],\n title: c[\"title\"] || \"\",\n createdAt: c[\"created_at\"] || null,\n lastActivity: c[\"last_activity\"] || null,\n messageCount: c[\"message_count\"] || 0,\n })\n );\n\n return { conversations };\n }\n\n /**\n * Get a specific conversation with full message history.\n *\n * @param chatId - The ID of the conversation to retrieve.\n */\n async get(chatId: string): Promise<ConversationDetail> {\n const response = await this.client._request(\"GET\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n\n const messages: Message[] = (data.messages || []).map(\n (m: Record<string, unknown>) => ({\n role: m[\"role\"],\n content: m[\"content\"],\n timestamp: m[\"timestamp\"] || null,\n })\n );\n\n return {\n chatId: data.chat_id || chatId,\n title: data.title || \"\",\n createdAt: data.created_at || null,\n lastActivity: data.last_activity || null,\n messageCount: messages.length,\n messages,\n };\n }\n\n /**\n * Delete a conversation.\n *\n * @param chatId - The ID of the conversation to delete.\n */\n async delete(chatId: string): Promise<boolean> {\n const response = await this.client._request(\"DELETE\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n return data.success ?? false;\n }\n}\n","/**\n * OpenRAG SDK documents client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n DeleteDocumentResponse,\n IngestResponse,\n IngestTaskStatus,\n} from \"./types\";\n\nexport interface IngestOptions {\n /** Path to file (Node.js only). */\n filePath?: string;\n /** File object (browser or Node.js). */\n file?: File | Blob;\n /** Filename when providing file/blob. */\n filename?: string;\n /** If true, poll until ingestion completes. Default: true. */\n wait?: boolean;\n /** Seconds between status checks when waiting. Default: 1. */\n pollInterval?: number;\n /** Maximum seconds to wait for completion. Default: 300. */\n timeout?: number;\n}\n\nexport class DocumentsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Ingest a document into the knowledge base.\n *\n * @param options - Ingest options (filePath or file+filename).\n * @returns IngestTaskStatus with final status if wait=true, IngestResponse with task_id if wait=false.\n */\n async ingest(\n options: IngestOptions\n ): Promise<IngestResponse | IngestTaskStatus> {\n const formData = new FormData();\n const wait = options.wait ?? true;\n const pollInterval = options.pollInterval ?? 1;\n const timeout = options.timeout ?? 300;\n\n if (options.filePath) {\n // Node.js: read file from path\n if (typeof globalThis.process !== \"undefined\") {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const fileBuffer = fs.readFileSync(options.filePath);\n const filename = path.basename(options.filePath);\n const blob = new Blob([fileBuffer]);\n formData.append(\"file\", blob, filename);\n } else {\n throw new Error(\"filePath is only supported in Node.js\");\n }\n } else if (options.file) {\n if (!options.filename) {\n throw new Error(\"filename is required when providing file\");\n }\n formData.append(\"file\", options.file, options.filename);\n } else {\n throw new Error(\"Either filePath or file must be provided\");\n }\n\n const response = await this.client._request(\n \"POST\",\n \"/api/v1/documents/ingest\",\n {\n body: formData,\n isMultipart: true,\n }\n );\n\n const data = await response.json();\n const ingestResponse: IngestResponse = {\n task_id: data.task_id,\n status: data.status ?? null,\n filename: data.filename ?? null,\n };\n\n if (!wait) {\n return ingestResponse;\n }\n\n // Poll for completion\n return await this.waitForTask(ingestResponse.task_id, pollInterval, timeout);\n }\n\n /**\n * Get the status of an ingestion task.\n *\n * @param taskId - The task ID returned from ingest().\n * @returns IngestTaskStatus with current task status.\n */\n async getTaskStatus(taskId: string): Promise<IngestTaskStatus> {\n const response = await this.client._request(\n \"GET\",\n `/api/v1/tasks/${taskId}`\n );\n const data = await response.json();\n return {\n task_id: data.task_id,\n status: data.status,\n total_files: data.total_files ?? 0,\n processed_files: data.processed_files ?? 0,\n successful_files: data.successful_files ?? 0,\n failed_files: data.failed_files ?? 0,\n files: data.files ?? {},\n };\n }\n\n /**\n * Wait for an ingestion task to complete.\n *\n * @param taskId - The task ID to wait for.\n * @param pollInterval - Seconds between status checks.\n * @param timeout - Maximum seconds to wait.\n * @returns IngestTaskStatus with final status.\n */\n async waitForTask(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 300\n ): Promise<IngestTaskStatus> {\n const startTime = Date.now();\n const timeoutMs = timeout * 1000;\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getTaskStatus(taskId);\n if (status.status === \"completed\" || status.status === \"failed\") {\n return status;\n }\n await this.sleep(pollInterval * 1000);\n }\n\n throw new Error(\n `Ingestion task ${taskId} did not complete within ${timeout}s`\n );\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Delete a document from the knowledge base.\n *\n * @param filename - Name of the file to delete.\n * @returns DeleteDocumentResponse with deleted chunk count.\n */\n async delete(filename: string): Promise<DeleteDocumentResponse> {\n const response = await this.client._request(\"DELETE\", \"/api/v1/documents\", {\n body: JSON.stringify({ filename }),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n deleted_chunks: data.deleted_chunks ?? 0,\n };\n }\n}\n","/**\n * OpenRAG SDK search client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type { SearchQueryOptions, SearchResponse } from \"./types\";\n\nexport class SearchClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Perform semantic search on documents.\n *\n * @param query - The search query text.\n * @param options - Optional search options.\n * @returns SearchResponse containing the search results.\n */\n async query(\n query: string,\n options?: Omit<SearchQueryOptions, \"query\">\n ): Promise<SearchResponse> {\n const body: Record<string, unknown> = {\n query,\n limit: options?.limit ?? 10,\n score_threshold: options?.scoreThreshold ?? 0,\n };\n\n if (options?.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options?.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/search\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n results: data.results || [],\n };\n }\n}\n","/**\n * OpenRAG SDK knowledge filters client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n CreateKnowledgeFilterOptions,\n CreateKnowledgeFilterResponse,\n DeleteKnowledgeFilterResponse,\n GetKnowledgeFilterResponse,\n KnowledgeFilter,\n KnowledgeFilterSearchResponse,\n UpdateKnowledgeFilterOptions,\n} from \"./types\";\n\nexport class KnowledgeFiltersClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Create a new knowledge filter.\n *\n * @param options - The filter options including name and queryData.\n * @returns The created filter response with ID.\n */\n async create(\n options: CreateKnowledgeFilterOptions\n ): Promise<CreateKnowledgeFilterResponse> {\n const body = {\n name: options.name,\n description: options.description ?? \"\",\n queryData: JSON.stringify(options.queryData),\n };\n\n const response = await this.client._request(\"POST\", \"/api/v1/knowledge-filters\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n id: data.id,\n error: data.error,\n };\n }\n\n /**\n * Search for knowledge filters by name, description, or query content.\n *\n * @param query - Optional search query text.\n * @param limit - Maximum number of results (default 20).\n * @returns List of matching knowledge filters.\n */\n async search(query?: string, limit?: number): Promise<KnowledgeFilter[]> {\n const body = {\n query: query ?? \"\",\n limit: limit ?? 20,\n };\n\n const response = await this.client._request(\n \"POST\",\n \"/api/v1/knowledge-filters/search\",\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = (await response.json()) as KnowledgeFilterSearchResponse;\n if (!data.success || !data.filters) {\n return [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return data.filters.map((f: any) => this._parseFilter(f));\n }\n\n /**\n * Get a specific knowledge filter by ID.\n *\n * @param filterId - The ID of the filter to retrieve.\n * @returns The knowledge filter or null if not found.\n */\n async get(filterId: string): Promise<KnowledgeFilter | null> {\n try {\n const response = await this.client._request(\n \"GET\",\n `/api/v1/knowledge-filters/${filterId}`\n );\n\n const data = (await response.json()) as GetKnowledgeFilterResponse;\n if (!data.success || !data.filter) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._parseFilter(data.filter as any);\n } catch {\n // Filter not found or other error\n return null;\n }\n }\n\n /**\n * Update an existing knowledge filter.\n *\n * @param filterId - The ID of the filter to update.\n * @param options - The fields to update.\n * @returns Success status.\n */\n async update(\n filterId: string,\n options: UpdateKnowledgeFilterOptions\n ): Promise<boolean> {\n const body: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n body[\"name\"] = options.name;\n }\n if (options.description !== undefined) {\n body[\"description\"] = options.description;\n }\n if (options.queryData !== undefined) {\n body[\"queryData\"] = JSON.stringify(options.queryData);\n }\n\n const response = await this.client._request(\n \"PUT\",\n `/api/v1/knowledge-filters/${filterId}`,\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = await response.json();\n return data.success ?? false;\n }\n\n /**\n * Delete a knowledge filter.\n *\n * @param filterId - The ID of the filter to delete.\n * @returns Success status.\n */\n async delete(filterId: string): Promise<boolean> {\n const response = await this.client._request(\n \"DELETE\",\n `/api/v1/knowledge-filters/${filterId}`\n );\n\n const data = (await response.json()) as DeleteKnowledgeFilterResponse;\n return data.success ?? false;\n }\n\n /**\n * Parse a filter from API response, handling JSON-stringified queryData.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _parseFilter(filter: any): KnowledgeFilter {\n let queryData = filter[\"query_data\"] ?? filter[\"queryData\"];\n if (typeof queryData === \"string\") {\n try {\n queryData = JSON.parse(queryData);\n } catch {\n queryData = {};\n }\n }\n\n return {\n id: filter[\"id\"] as string,\n name: filter[\"name\"] as string,\n description: filter[\"description\"],\n queryData: queryData as KnowledgeFilter[\"queryData\"],\n owner: filter[\"owner\"],\n createdAt: filter[\"created_at\"] ?? filter[\"createdAt\"],\n updatedAt: filter[\"updated_at\"] ?? filter[\"updatedAt\"],\n };\n }\n}\n","/**\n * OpenRAG SDK types.\n */\n\n// Chat types\nexport interface Source {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface ChatResponse {\n response: string;\n chatId?: string | null;\n sources: Source[];\n}\n\nexport type StreamEventType = \"content\" | \"sources\" | \"done\";\n\nexport interface ContentEvent {\n type: \"content\";\n delta: string;\n}\n\nexport interface SourcesEvent {\n type: \"sources\";\n sources: Source[];\n}\n\nexport interface DoneEvent {\n type: \"done\";\n chatId?: string | null;\n}\n\nexport type StreamEvent = ContentEvent | SourcesEvent | DoneEvent;\n\n// Search types\nexport interface SearchResult {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface SearchResponse {\n results: SearchResult[];\n}\n\nexport interface SearchFilters {\n data_sources?: string[];\n document_types?: string[];\n}\n\n// Document types\nexport interface IngestResponse {\n task_id: string;\n status?: string | null; // Optional - we poll for actual status\n filename?: string | null;\n}\n\nexport interface IngestTaskStatus {\n task_id: string;\n status: string; // \"pending\", \"running\", \"completed\", \"failed\"\n total_files: number;\n processed_files: number;\n successful_files: number;\n failed_files: number;\n files: Record<string, unknown>;\n}\n\nexport interface DeleteDocumentResponse {\n success: boolean;\n deleted_chunks: number;\n}\n\n// Chat history types\nexport interface Message {\n role: string;\n content: string;\n timestamp?: string | null;\n}\n\nexport interface Conversation {\n chatId: string;\n title: string;\n createdAt?: string | null;\n lastActivity?: string | null;\n messageCount: number;\n}\n\nexport interface ConversationDetail extends Conversation {\n messages: Message[];\n}\n\nexport interface ConversationListResponse {\n conversations: Conversation[];\n}\n\n// Settings types\nexport interface AgentSettings {\n llm_provider?: string | null;\n llm_model?: string | null;\n}\n\nexport interface KnowledgeSettings {\n embedding_provider?: string | null;\n embedding_model?: string | null;\n chunk_size?: number | null;\n chunk_overlap?: number | null;\n}\n\nexport interface SettingsResponse {\n agent: AgentSettings;\n knowledge: KnowledgeSettings;\n}\n\n/** Options for updating settings. */\nexport interface SettingsUpdateOptions {\n /** LLM model name. */\n llm_model?: string;\n /** LLM provider (openai, anthropic, watsonx, ollama). */\n llm_provider?: string;\n /** System prompt for the agent. */\n system_prompt?: string;\n /** Embedding model name. */\n embedding_model?: string;\n /** Embedding provider (openai, watsonx, ollama). */\n embedding_provider?: string;\n /** Chunk size for document splitting. */\n chunk_size?: number;\n /** Chunk overlap for document splitting. */\n chunk_overlap?: number;\n /** Enable table structure parsing. */\n table_structure?: boolean;\n /** Enable OCR for text extraction. */\n ocr?: boolean;\n /** Enable picture descriptions. */\n picture_descriptions?: boolean;\n}\n\n/** Response from settings update. */\nexport interface SettingsUpdateResponse {\n message: string;\n}\n\n// Knowledge filter types\n/** Query configuration stored in a knowledge filter. */\nexport interface KnowledgeFilterQueryData {\n /** Semantic search query text. */\n query?: string;\n /** Filter criteria for documents. */\n filters?: {\n data_sources?: string[];\n document_types?: string[];\n owners?: string[];\n connector_types?: string[];\n };\n /** Maximum number of results. */\n limit?: number;\n /** Minimum relevance score threshold. */\n scoreThreshold?: number;\n /** UI color for the filter. */\n color?: string;\n /** UI icon for the filter. */\n icon?: string;\n}\n\n/** A knowledge filter definition. */\nexport interface KnowledgeFilter {\n id: string;\n name: string;\n description?: string;\n queryData: KnowledgeFilterQueryData;\n owner?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/** Options for creating a knowledge filter. */\nexport interface CreateKnowledgeFilterOptions {\n /** Filter name (required). */\n name: string;\n /** Filter description. */\n description?: string;\n /** Query configuration for the filter. */\n queryData: KnowledgeFilterQueryData;\n}\n\n/** Options for updating a knowledge filter. */\nexport interface UpdateKnowledgeFilterOptions {\n /** New filter name. */\n name?: string;\n /** New filter description. */\n description?: string;\n /** New query configuration. */\n queryData?: KnowledgeFilterQueryData;\n}\n\n/** Response from creating a knowledge filter. */\nexport interface CreateKnowledgeFilterResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\n/** Response from searching knowledge filters. */\nexport interface KnowledgeFilterSearchResponse {\n success: boolean;\n filters: KnowledgeFilter[];\n}\n\n/** Response from getting a knowledge filter. */\nexport interface GetKnowledgeFilterResponse {\n success: boolean;\n filter?: KnowledgeFilter;\n error?: string;\n}\n\n/** Response from deleting a knowledge filter. */\nexport interface DeleteKnowledgeFilterResponse {\n success: boolean;\n error?: string;\n}\n\n// Client options\nexport interface OpenRAGClientOptions {\n /** API key for authentication. Falls back to OPENRAG_API_KEY env var. */\n apiKey?: string;\n /** Base URL for the API. Falls back to OPENRAG_URL env var. */\n baseUrl?: string;\n /** Request timeout in milliseconds (default 30000). */\n timeout?: number;\n}\n\n// Request types\nexport interface ChatCreateOptions {\n message: string;\n stream?: boolean;\n chatId?: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the chat. */\n filterId?: string;\n}\n\nexport interface SearchQueryOptions {\n query: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the search. */\n filterId?: string;\n}\n\n// Error types\nexport class OpenRAGError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = \"OpenRAGError\";\n }\n}\n\nexport class AuthenticationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotFoundError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ValidationError\";\n }\n}\n\nexport class RateLimitError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class ServerError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ServerError\";\n }\n}\n","/**\n * OpenRAG SDK client.\n */\n\nimport { ChatClient } from \"./chat\";\nimport { DocumentsClient } from \"./documents\";\nimport { SearchClient } from \"./search\";\nimport { KnowledgeFiltersClient } from \"./knowledge-filters\";\nimport {\n AuthenticationError,\n NotFoundError,\n OpenRAGError,\n OpenRAGClientOptions,\n RateLimitError,\n ServerError,\n SettingsResponse,\n SettingsUpdateOptions,\n SettingsUpdateResponse,\n ValidationError,\n} from \"./types\";\n\n/**\n * Get environment variable value.\n * Works in Node.js and environments with process.env.\n */\nfunction getEnv(key: string): string | undefined {\n if (typeof globalThis.process !== \"undefined\" && globalThis.process.env) {\n return globalThis.process.env[key];\n }\n return undefined;\n}\n\nclass SettingsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Get current OpenRAG configuration.\n */\n async get(): Promise<SettingsResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/settings\");\n const data = await response.json();\n return {\n agent: data.agent || {},\n knowledge: data.knowledge || {},\n };\n }\n\n /**\n * Update OpenRAG configuration.\n *\n * @param options - The settings to update.\n * @returns Success response with message.\n */\n async update(options: SettingsUpdateOptions): Promise<SettingsUpdateResponse> {\n const response = await this.client._request(\"POST\", \"/api/v1/settings\", {\n body: JSON.stringify(options),\n });\n const data = await response.json();\n return {\n message: data.message || \"Settings updated\",\n };\n }\n}\n\ninterface RequestOptions {\n body?: string | FormData;\n isMultipart?: boolean;\n stream?: boolean;\n}\n\n/**\n * OpenRAG API client.\n *\n * The client can be configured via constructor arguments or environment variables:\n * - OPENRAG_API_KEY: API key for authentication\n * - OPENRAG_URL: Base URL for the OpenRAG frontend (default: http://localhost:3000)\n *\n * @example\n * ```typescript\n * // Using environment variables\n * const client = new OpenRAGClient();\n * const response = await client.chat.create({ message: \"Hello\" });\n *\n * // Using explicit arguments\n * const client = new OpenRAGClient({\n * apiKey: \"orag_...\",\n * baseUrl: \"https://api.example.com\"\n * });\n * ```\n */\nexport class OpenRAGClient {\n private static readonly DEFAULT_BASE_URL = \"http://localhost:3000\";\n\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n\n /** Chat client for conversations. */\n readonly chat: ChatClient;\n /** Search client for semantic search. */\n readonly search: SearchClient;\n /** Documents client for ingestion and deletion. */\n readonly documents: DocumentsClient;\n /** Settings client for configuration. */\n readonly settings: SettingsClient;\n /** Knowledge filters client for managing filters. */\n readonly knowledgeFilters: KnowledgeFiltersClient;\n\n constructor(options: OpenRAGClientOptions = {}) {\n // Resolve API key from argument or environment\n this._apiKey = options.apiKey || getEnv(\"OPENRAG_API_KEY\") || \"\";\n if (!this._apiKey) {\n throw new AuthenticationError(\n \"API key is required. Set OPENRAG_API_KEY environment variable or pass apiKey option.\"\n );\n }\n\n // Resolve base URL from argument or environment\n this._baseUrl = (\n options.baseUrl ||\n getEnv(\"OPENRAG_URL\") ||\n OpenRAGClient.DEFAULT_BASE_URL\n ).replace(/\\/$/, \"\");\n\n this._timeout = options.timeout ?? 30000;\n\n // Initialize sub-clients\n this.chat = new ChatClient(this);\n this.search = new SearchClient(this);\n this.documents = new DocumentsClient(this);\n this.settings = new SettingsClient(this);\n this.knowledgeFilters = new KnowledgeFiltersClient(this);\n }\n\n /** @internal Get request headers with authentication. */\n _getHeaders(isMultipart = false): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-API-Key\": this._apiKey,\n };\n\n if (!isMultipart) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n return headers;\n }\n\n /** @internal Make an authenticated request to the API. */\n async _request(\n method: string,\n path: string,\n options: RequestOptions = {}\n ): Promise<Response> {\n const url = `${this._baseUrl}${path}`;\n const headers = this._getHeaders(options.isMultipart);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: options.body ?? null,\n signal: controller.signal,\n });\n\n if (!options.stream) {\n this._handleError(response);\n }\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /** @internal Handle error responses. */\n _handleError(response: Response): void {\n if (response.ok) return;\n\n const statusCode = response.status;\n\n // We can't await the JSON here since this might be called in a sync context\n // So we throw with a generic message based on status code\n const errorMessages: Record<number, string> = {\n 401: \"Invalid or missing API key\",\n 403: \"Access denied\",\n 404: \"Resource not found\",\n 400: \"Invalid request\",\n 429: \"Rate limit exceeded\",\n };\n\n const message = errorMessages[statusCode] || `HTTP ${statusCode}`;\n\n if (statusCode === 401 || statusCode === 403) {\n throw new AuthenticationError(message, statusCode);\n } else if (statusCode === 404) {\n throw new NotFoundError(message, statusCode);\n } else if (statusCode === 400) {\n throw new ValidationError(message, statusCode);\n } else if (statusCode === 429) {\n throw new RateLimitError(message, statusCode);\n } else if (statusCode >= 500) {\n throw new ServerError(message, statusCode);\n } else {\n throw new OpenRAGError(message, statusCode);\n }\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -402,7 +402,7 @@ var KnowledgeFiltersClient = class {
|
|
|
402
402
|
description: options.description ?? "",
|
|
403
403
|
queryData: JSON.stringify(options.queryData)
|
|
404
404
|
};
|
|
405
|
-
const response = await this.client._request("POST", "/knowledge-
|
|
405
|
+
const response = await this.client._request("POST", "/api/v1/knowledge-filters", {
|
|
406
406
|
body: JSON.stringify(body)
|
|
407
407
|
});
|
|
408
408
|
const data = await response.json();
|
|
@@ -426,7 +426,7 @@ var KnowledgeFiltersClient = class {
|
|
|
426
426
|
};
|
|
427
427
|
const response = await this.client._request(
|
|
428
428
|
"POST",
|
|
429
|
-
"/knowledge-
|
|
429
|
+
"/api/v1/knowledge-filters/search",
|
|
430
430
|
{
|
|
431
431
|
body: JSON.stringify(body)
|
|
432
432
|
}
|
|
@@ -447,7 +447,7 @@ var KnowledgeFiltersClient = class {
|
|
|
447
447
|
try {
|
|
448
448
|
const response = await this.client._request(
|
|
449
449
|
"GET",
|
|
450
|
-
`/knowledge-
|
|
450
|
+
`/api/v1/knowledge-filters/${filterId}`
|
|
451
451
|
);
|
|
452
452
|
const data = await response.json();
|
|
453
453
|
if (!data.success || !data.filter) {
|
|
@@ -478,7 +478,7 @@ var KnowledgeFiltersClient = class {
|
|
|
478
478
|
}
|
|
479
479
|
const response = await this.client._request(
|
|
480
480
|
"PUT",
|
|
481
|
-
`/knowledge-
|
|
481
|
+
`/api/v1/knowledge-filters/${filterId}`,
|
|
482
482
|
{
|
|
483
483
|
body: JSON.stringify(body)
|
|
484
484
|
}
|
|
@@ -495,7 +495,7 @@ var KnowledgeFiltersClient = class {
|
|
|
495
495
|
async delete(filterId) {
|
|
496
496
|
const response = await this.client._request(
|
|
497
497
|
"DELETE",
|
|
498
|
-
`/knowledge-
|
|
498
|
+
`/api/v1/knowledge-filters/${filterId}`
|
|
499
499
|
);
|
|
500
500
|
const data = await response.json();
|
|
501
501
|
return data.success ?? false;
|
|
@@ -593,7 +593,7 @@ var SettingsClient = class {
|
|
|
593
593
|
* @returns Success response with message.
|
|
594
594
|
*/
|
|
595
595
|
async update(options) {
|
|
596
|
-
const response = await this.client._request("POST", "/settings", {
|
|
596
|
+
const response = await this.client._request("POST", "/api/v1/settings", {
|
|
597
597
|
body: JSON.stringify(options)
|
|
598
598
|
});
|
|
599
599
|
const data = await response.json();
|
|
@@ -603,7 +603,7 @@ var SettingsClient = class {
|
|
|
603
603
|
}
|
|
604
604
|
};
|
|
605
605
|
var OpenRAGClient = class _OpenRAGClient {
|
|
606
|
-
static DEFAULT_BASE_URL = "http://localhost:
|
|
606
|
+
static DEFAULT_BASE_URL = "http://localhost:3000";
|
|
607
607
|
_apiKey;
|
|
608
608
|
_baseUrl;
|
|
609
609
|
_timeout;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chat.ts","../src/documents.ts","../src/search.ts","../src/knowledge-filters.ts","../src/types.ts","../src/client.ts"],"names":[],"mappings":";AAgCO,IAAM,aAAN,MAAmE;AAAA,EAQxE,WAAA,CACU,QACA,OAAA,EACR;AAFQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACP;AAAA,EAVK,KAAA,GAAQ,EAAA;AAAA,EACR,OAAA,GAAyB,IAAA;AAAA,EACzB,WAAqB,EAAC;AAAA,EACtB,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA,GAA0D,IAAA;AAAA,EAC1D,SAAA,GAA6B,IAAA;AAAA;AAAA,EAQrC,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,MAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,OAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAA;AAAA,MAC7B,eAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkB;AAAA,KAClD;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,IACjC;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,IACjC;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAA;AAAA,IACnC;AAEA,IAAA,IAAA,CAAK,YAAY,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,cAAA,EAAgB;AAAA,MAClE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM;AACxB,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAA,EAAU;AAAA,EAC/C;AAAA,EAEA,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAgC;AAC1D,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,IAAA,CAAK,QAAQ,IAAA,EAAK;AAChD,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAE9C,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACtC,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,UAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AAEvB,UAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,YAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,EAAA;AAC5B,YAAA,IAAA,CAAK,KAAA,IAAS,KAAA;AACd,YAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM;AAAA,UACjC,CAAA,MAAA,IAAW,cAAc,SAAA,EAAW;AAClC,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,EAAC;AACjC,YAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAK,QAAA,EAAS;AAAA,UAClD,CAAA,MAAA,IAAW,cAAc,MAAA,EAAQ;AAC/B,YAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,IAAA;AAC/B,YAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,OAAA,EAAQ;AAAA,UAC7C;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAoC;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAI;AAC9B,QAAA,WAAA,MAAiB,SAAS,IAAA,EAAM;AAC9B,UAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,YAAA,MAAM,KAAA,CAAM,KAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA6B;AACjC,IAAA,WAAA,MAAiB,KAAK,IAAA,EAAM;AAAA,IAE5B;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,CAAC,MAAA,CAAO,OAAO,CAAA,GAAU;AACvB,IAAA,IAAA,CAAK,OAAA,EAAS,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,EACvB;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB5C,MAAM,OACJ,OAAA,EACoD;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAO,IAAA,CAAK,yBAAyB,OAAO,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAAmD;AACnF,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,eAAA,EAAiB,QAAQ,cAAA,IAAkB;AAAA,KAC7C;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,IAAI,OAAA,CAAQ,MAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,SAAS,IAAI,OAAA,CAAQ,OAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAA,CAAK,WAAW,IAAI,OAAA,CAAQ,QAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,cAAA,EAAgB;AAAA,MAClE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,MAC3B,MAAA,EAAQ,KAAK,OAAA,IAAW,IAAA;AAAA,MACxB,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW;AAAC,KAC5B;AAAA,EACF;AAAA,EAEA,MAAc,yBACZ,OAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,OAAO,CAAA;AAClD,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAA,EAAiE;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,CAAA;AACvE,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAA0C;AAC9C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,cAAc,CAAA;AACjE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,MAAM,aAAA,GAAA,CAAiC,IAAA,CAAK,aAAA,IAAiB,EAAC,EAAG,GAAA;AAAA,MAC/D,CAAC,CAAA,MAAgC;AAAA,QAC/B,MAAA,EAAQ,EAAE,SAAS,CAAA;AAAA,QACnB,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,IAAK,EAAA;AAAA,QACrB,SAAA,EAAW,CAAA,CAAE,YAAY,CAAA,IAAK,IAAA;AAAA,QAC9B,YAAA,EAAc,CAAA,CAAE,eAAe,CAAA,IAAK,IAAA;AAAA,QACpC,YAAA,EAAc,CAAA,CAAE,eAAe,CAAA,IAAK;AAAA,OACtC;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,aAAA,EAAc;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAI,MAAA,EAA6C;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,KAAA,EAAO,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAA;AAC3E,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,MAAM,QAAA,GAAA,CAAuB,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,GAAA;AAAA,MAChD,CAAC,CAAA,MAAgC;AAAA,QAC/B,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,OAAA,EAAS,EAAE,SAAS,CAAA;AAAA,QACpB,SAAA,EAAW,CAAA,CAAE,WAAW,CAAA,IAAK;AAAA,OAC/B;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAK,OAAA,IAAW,MAAA;AAAA,MACxB,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,MACrB,SAAA,EAAW,KAAK,UAAA,IAAc,IAAA;AAAA,MAC9B,YAAA,EAAc,KAAK,aAAA,IAAiB,IAAA;AAAA,MACpC,cAAc,QAAA,CAAS,MAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,MAAA,EAAkC;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,QAAA,EAAU,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAA;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,KAAK,OAAA,IAAW,KAAA;AAAA,EACzB;AACF;;;ACnSO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,MAAM,OACJ,OAAA,EAC4C;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC7B,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAEnC,IAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,MAAA,IAAI,OAAO,UAAA,CAAW,OAAA,KAAY,WAAA,EAAa;AAC7C,QAAA,MAAM,EAAA,GAAK,MAAM,OAAO,IAAI,CAAA;AAC5B,QAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,QAAA,MAAM,UAAA,GAAa,EAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AACnD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAC,CAAA;AAClC,QAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,QAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,MAC5D;AACA,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,MAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA,EAAQ,KAAK,MAAA,IAAU,IAAA;AAAA,MACvB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,cAAA;AAAA,IACT;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,OAAA,EAAS,cAAc,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,MAAA,EAA2C;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,KAAA;AAAA,MACA,iBAAiB,MAAM,CAAA;AAAA,KACzB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,KAAK,WAAA,IAAe,CAAA;AAAA,MACjC,eAAA,EAAiB,KAAK,eAAA,IAAmB,CAAA;AAAA,MACzC,gBAAA,EAAkB,KAAK,gBAAA,IAAoB,CAAA;AAAA,MAC3C,YAAA,EAAc,KAAK,YAAA,IAAgB,CAAA;AAAA,MACnC,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS;AAAC,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CACJ,MAAA,EACA,YAAA,GAAuB,CAAA,EACvB,UAAkB,GAAA,EACS;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,YAAY,OAAA,GAAU,GAAA;AAE5B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,SAAA,EAAW;AACzC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,QAAA,EAAU;AAC/D,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,GAAI,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,eAAA,EAAkB,MAAM,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAA;AAAA,KAC7D;AAAA,EACF;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAAA,EAAmD;AAC9D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,UAAU,mBAAA,EAAqB;AAAA,MACzE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU;AAAA,KAClC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,MACzB,cAAA,EAAgB,KAAK,cAAA,IAAkB;AAAA,KACzC;AAAA,EACF;AACF;;;AC1JO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5C,MAAM,KAAA,CACJ,KAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,KAAA;AAAA,MACA,KAAA,EAAO,SAAS,KAAA,IAAS,EAAA;AAAA,MACzB,eAAA,EAAiB,SAAS,cAAA,IAAkB;AAAA,KAC9C;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,CAAK,SAAS,IAAI,OAAA,CAAQ,OAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,WAAW,IAAI,OAAA,CAAQ,QAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,gBAAA,EAAkB;AAAA,MACpE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW;AAAC,KAC5B;AAAA,EACF;AACF;;;AC7BO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,MAAM,OACJ,OAAA,EACwC;AACxC,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,MACpC,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS;AAAA,KAC7C;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,mBAAA,EAAqB;AAAA,MACvE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,MACzB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CAAO,KAAA,EAAgB,KAAA,EAA4C;AACvE,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,OAAO,KAAA,IAAS,EAAA;AAAA,MAChB,OAAO,KAAA,IAAS;AAAA,KAClB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,MAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,OAAA,EAAS;AAClC,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAI,QAAA,EAAmD;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,QACjC,KAAA;AAAA,QACA,qBAAqB,QAAQ,CAAA;AAAA,OAC/B;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,MAAA,EAAQ;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,MAAa,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CACJ,QAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,OAAgC,EAAC;AAEvC,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,MAAM,IAAI,OAAA,CAAQ,IAAA;AAAA,IACzB;AACA,IAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,MAAA,IAAA,CAAK,aAAa,IAAI,OAAA,CAAQ,WAAA;AAAA,IAChC;AACA,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,KAAA;AAAA,MACA,qBAAqB,QAAQ,CAAA,CAAA;AAAA,MAC7B;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,KAAK,OAAA,IAAW,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAAA,EAAoC;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,QAAA;AAAA,MACA,qBAAqB,QAAQ,CAAA;AAAA,KAC/B;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO,KAAK,OAAA,IAAW,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,MAAA,EAA8B;AACjD,IAAA,IAAI,SAAA,GAAY,MAAA,CAAO,YAAY,CAAA,IAAK,OAAO,WAAW,CAAA;AAC1D,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,IAAI;AACF,QAAA,SAAA,GAAY,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AACN,QAAA,SAAA,GAAY,EAAC;AAAA,MACf;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,IAAI,CAAA;AAAA,MACf,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MACnB,WAAA,EAAa,OAAO,aAAa,CAAA;AAAA,MACjC,SAAA;AAAA,MACA,KAAA,EAAO,OAAO,OAAO,CAAA;AAAA,MACrB,SAAA,EAAW,MAAA,CAAO,YAAY,CAAA,IAAK,OAAO,WAAW,CAAA;AAAA,MACrD,SAAA,EAAW,MAAA,CAAO,YAAY,CAAA,IAAK,OAAO,WAAW;AAAA,KACvD;AAAA,EACF;AACF;;;ACmFO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CACE,SACO,UAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EACpD,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAa;AAAA,EAC9C,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAChD,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EAC/C,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC5C,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;;;ACrRA,SAAS,OAAO,GAAA,EAAiC;AAC/C,EAAA,IAAI,OAAO,UAAA,CAAW,OAAA,KAAY,WAAA,IAAe,UAAA,CAAW,QAAQ,GAAA,EAAK;AACvE,IAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA,EAK5C,MAAM,GAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,kBAAkB,CAAA;AACrE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MACtB,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa;AAAC,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAA,EAAiE;AAC5E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,WAAA,EAAa;AAAA,MAC/D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,KAC3B;AAAA,EACF;AACF,CAAA;AA4BO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EACzB,OAAwB,gBAAA,GAAmB,uBAAA;AAAA,EAE1B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGR,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAgC,EAAC,EAAG;AAE9C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,iBAAiB,CAAA,IAAK,EAAA;AAC9D,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,QAAA,GAAA,CACH,OAAA,CAAQ,OAAA,IACR,MAAA,CAAO,aAAa,KACpB,cAAA,CAAc,gBAAA,EACd,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEnB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,IAAW,GAAA;AAGnC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,sBAAA,CAAuB,IAAI,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,WAAA,CAAY,cAAc,KAAA,EAA+B;AACvD,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAa,IAAA,CAAK;AAAA,KACpB;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACR;AACnB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,WAAW,CAAA;AAEpD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,QAAQ,CAAA;AAEpE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,QACtB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,QAAA,EAA0B;AACrC,IAAA,IAAI,SAAS,EAAA,EAAI;AAEjB,IAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAI5B,IAAA,MAAM,aAAA,GAAwC;AAAA,MAC5C,GAAA,EAAK,4BAAA;AAAA,MACL,GAAA,EAAK,eAAA;AAAA,MACL,GAAA,EAAK,oBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAEA,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,UAAU,CAAA,IAAK,QAAQ,UAAU,CAAA,CAAA;AAE/D,IAAA,IAAI,UAAA,KAAe,GAAA,IAAO,UAAA,KAAe,GAAA,EAAK;AAC5C,MAAA,MAAM,IAAI,mBAAA,CAAoB,OAAA,EAAS,UAAU,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,aAAA,CAAc,OAAA,EAAS,UAAU,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,IAC/C,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,cAAA,CAAe,OAAA,EAAS,UAAU,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,cAAc,GAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA;AAAA,IAC5C;AAAA,EACF;AACF","file":"index.mjs","sourcesContent":["/**\n * OpenRAG SDK chat client with streaming support.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n ChatCreateOptions,\n ChatResponse,\n ContentEvent,\n Conversation,\n ConversationDetail,\n ConversationListResponse,\n DoneEvent,\n Message,\n Source,\n SourcesEvent,\n StreamEvent,\n} from \"./types\";\n\n/**\n * Streaming chat response with helpers.\n *\n * Usage:\n * ```typescript\n * using stream = await client.chat.stream({ message: \"Hello\" });\n * for await (const event of stream) {\n * if (event.type === \"content\") console.log(event.delta);\n * }\n * console.log(stream.chatId);\n * console.log(stream.text);\n * ```\n */\nexport class ChatStream implements AsyncIterable<StreamEvent>, Disposable {\n private _text = \"\";\n private _chatId: string | null = null;\n private _sources: Source[] = [];\n private _consumed = false;\n private _reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n private _response: Response | null = null;\n\n constructor(\n private client: OpenRAGClient,\n private options: ChatCreateOptions\n ) {}\n\n /** The accumulated text from content events. */\n get text(): string {\n return this._text;\n }\n\n /** The chat ID for continuing the conversation. */\n get chatId(): string | null {\n return this._chatId;\n }\n\n /** The sources retrieved during the conversation. */\n get sources(): Source[] {\n return this._sources;\n }\n\n /** @internal Initialize the stream. */\n async _init(): Promise<void> {\n const body: Record<string, unknown> = {\n message: this.options.message,\n stream: true,\n limit: this.options.limit ?? 10,\n score_threshold: this.options.scoreThreshold ?? 0,\n };\n\n if (this.options.chatId) {\n body[\"chat_id\"] = this.options.chatId;\n }\n\n if (this.options.filters) {\n body[\"filters\"] = this.options.filters;\n }\n\n if (this.options.filterId) {\n body[\"filter_id\"] = this.options.filterId;\n }\n\n this._response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n stream: true,\n });\n\n if (!this._response.body) {\n throw new Error(\"Response body is null\");\n }\n\n this._reader = this._response.body.getReader();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n if (this._consumed) {\n throw new Error(\"Stream has already been consumed\");\n }\n this._consumed = true;\n\n if (!this._reader) {\n throw new Error(\"Stream not initialized\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await this._reader.read();\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 if (!trimmed || !trimmed.startsWith(\"data:\")) continue;\n\n const dataStr = trimmed.slice(5).trim();\n if (!dataStr) continue;\n\n try {\n const data = JSON.parse(dataStr);\n const eventType = data.type;\n\n if (eventType === \"content\") {\n const delta = data.delta || \"\";\n this._text += delta;\n yield { type: \"content\", delta } as ContentEvent;\n } else if (eventType === \"sources\") {\n this._sources = data.sources || [];\n yield { type: \"sources\", sources: this._sources } as SourcesEvent;\n } else if (eventType === \"done\") {\n this._chatId = data.chat_id || null;\n yield { type: \"done\", chatId: this._chatId } as DoneEvent;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n /**\n * Iterate over just the text deltas.\n */\n get textStream(): AsyncIterable<string> {\n const self = this;\n return {\n async *[Symbol.asyncIterator]() {\n for await (const event of self) {\n if (event.type === \"content\") {\n yield event.delta;\n }\n }\n },\n };\n }\n\n /**\n * Consume the stream and return the complete text.\n */\n async finalText(): Promise<string> {\n for await (const _ of this) {\n // Consume all events\n }\n return this._text;\n }\n\n /** Clean up resources. */\n [Symbol.dispose](): void {\n this._reader?.cancel().catch(() => {});\n }\n\n /** Close the stream. */\n close(): void {\n this[Symbol.dispose]();\n }\n}\n\nexport class ChatClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Send a chat message (non-streaming).\n */\n async create(options: ChatCreateOptions & { stream?: false }): Promise<ChatResponse>;\n /**\n * Send a chat message (streaming).\n */\n async create(\n options: ChatCreateOptions & { stream: true }\n ): Promise<AsyncIterable<StreamEvent>>;\n /**\n * Send a chat message.\n *\n * @param options - Chat options including message, stream flag, etc.\n * @returns ChatResponse if stream=false, AsyncIterable<StreamEvent> if stream=true.\n */\n async create(\n options: ChatCreateOptions\n ): Promise<ChatResponse | AsyncIterable<StreamEvent>> {\n if (options.stream) {\n return this._createStreamingIterator(options);\n }\n return this._createNonStreaming(options);\n }\n\n private async _createNonStreaming(options: ChatCreateOptions): Promise<ChatResponse> {\n const body: Record<string, unknown> = {\n message: options.message,\n stream: false,\n limit: options.limit ?? 10,\n score_threshold: options.scoreThreshold ?? 0,\n };\n\n if (options.chatId) {\n body[\"chat_id\"] = options.chatId;\n }\n\n if (options.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n response: data.response || \"\",\n chatId: data.chat_id || null,\n sources: data.sources || [],\n };\n }\n\n private async _createStreamingIterator(\n options: ChatCreateOptions\n ): Promise<AsyncIterable<StreamEvent>> {\n const stream = new ChatStream(this.client, options);\n await stream._init();\n return stream;\n }\n\n /**\n * Create a streaming chat context manager.\n *\n * @param options - Chat options.\n * @returns ChatStream with helpers.\n */\n async stream(options: Omit<ChatCreateOptions, \"stream\">): Promise<ChatStream> {\n const stream = new ChatStream(this.client, { ...options, stream: true });\n await stream._init();\n return stream;\n }\n\n /**\n * List all conversations.\n */\n async list(): Promise<ConversationListResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/chat\");\n const data = await response.json();\n\n const conversations: Conversation[] = (data.conversations || []).map(\n (c: Record<string, unknown>) => ({\n chatId: c[\"chat_id\"],\n title: c[\"title\"] || \"\",\n createdAt: c[\"created_at\"] || null,\n lastActivity: c[\"last_activity\"] || null,\n messageCount: c[\"message_count\"] || 0,\n })\n );\n\n return { conversations };\n }\n\n /**\n * Get a specific conversation with full message history.\n *\n * @param chatId - The ID of the conversation to retrieve.\n */\n async get(chatId: string): Promise<ConversationDetail> {\n const response = await this.client._request(\"GET\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n\n const messages: Message[] = (data.messages || []).map(\n (m: Record<string, unknown>) => ({\n role: m[\"role\"],\n content: m[\"content\"],\n timestamp: m[\"timestamp\"] || null,\n })\n );\n\n return {\n chatId: data.chat_id || chatId,\n title: data.title || \"\",\n createdAt: data.created_at || null,\n lastActivity: data.last_activity || null,\n messageCount: messages.length,\n messages,\n };\n }\n\n /**\n * Delete a conversation.\n *\n * @param chatId - The ID of the conversation to delete.\n */\n async delete(chatId: string): Promise<boolean> {\n const response = await this.client._request(\"DELETE\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n return data.success ?? false;\n }\n}\n","/**\n * OpenRAG SDK documents client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n DeleteDocumentResponse,\n IngestResponse,\n IngestTaskStatus,\n} from \"./types\";\n\nexport interface IngestOptions {\n /** Path to file (Node.js only). */\n filePath?: string;\n /** File object (browser or Node.js). */\n file?: File | Blob;\n /** Filename when providing file/blob. */\n filename?: string;\n /** If true, poll until ingestion completes. Default: true. */\n wait?: boolean;\n /** Seconds between status checks when waiting. Default: 1. */\n pollInterval?: number;\n /** Maximum seconds to wait for completion. Default: 300. */\n timeout?: number;\n}\n\nexport class DocumentsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Ingest a document into the knowledge base.\n *\n * @param options - Ingest options (filePath or file+filename).\n * @returns IngestTaskStatus with final status if wait=true, IngestResponse with task_id if wait=false.\n */\n async ingest(\n options: IngestOptions\n ): Promise<IngestResponse | IngestTaskStatus> {\n const formData = new FormData();\n const wait = options.wait ?? true;\n const pollInterval = options.pollInterval ?? 1;\n const timeout = options.timeout ?? 300;\n\n if (options.filePath) {\n // Node.js: read file from path\n if (typeof globalThis.process !== \"undefined\") {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const fileBuffer = fs.readFileSync(options.filePath);\n const filename = path.basename(options.filePath);\n const blob = new Blob([fileBuffer]);\n formData.append(\"file\", blob, filename);\n } else {\n throw new Error(\"filePath is only supported in Node.js\");\n }\n } else if (options.file) {\n if (!options.filename) {\n throw new Error(\"filename is required when providing file\");\n }\n formData.append(\"file\", options.file, options.filename);\n } else {\n throw new Error(\"Either filePath or file must be provided\");\n }\n\n const response = await this.client._request(\n \"POST\",\n \"/api/v1/documents/ingest\",\n {\n body: formData,\n isMultipart: true,\n }\n );\n\n const data = await response.json();\n const ingestResponse: IngestResponse = {\n task_id: data.task_id,\n status: data.status ?? null,\n filename: data.filename ?? null,\n };\n\n if (!wait) {\n return ingestResponse;\n }\n\n // Poll for completion\n return await this.waitForTask(ingestResponse.task_id, pollInterval, timeout);\n }\n\n /**\n * Get the status of an ingestion task.\n *\n * @param taskId - The task ID returned from ingest().\n * @returns IngestTaskStatus with current task status.\n */\n async getTaskStatus(taskId: string): Promise<IngestTaskStatus> {\n const response = await this.client._request(\n \"GET\",\n `/api/v1/tasks/${taskId}`\n );\n const data = await response.json();\n return {\n task_id: data.task_id,\n status: data.status,\n total_files: data.total_files ?? 0,\n processed_files: data.processed_files ?? 0,\n successful_files: data.successful_files ?? 0,\n failed_files: data.failed_files ?? 0,\n files: data.files ?? {},\n };\n }\n\n /**\n * Wait for an ingestion task to complete.\n *\n * @param taskId - The task ID to wait for.\n * @param pollInterval - Seconds between status checks.\n * @param timeout - Maximum seconds to wait.\n * @returns IngestTaskStatus with final status.\n */\n async waitForTask(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 300\n ): Promise<IngestTaskStatus> {\n const startTime = Date.now();\n const timeoutMs = timeout * 1000;\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getTaskStatus(taskId);\n if (status.status === \"completed\" || status.status === \"failed\") {\n return status;\n }\n await this.sleep(pollInterval * 1000);\n }\n\n throw new Error(\n `Ingestion task ${taskId} did not complete within ${timeout}s`\n );\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Delete a document from the knowledge base.\n *\n * @param filename - Name of the file to delete.\n * @returns DeleteDocumentResponse with deleted chunk count.\n */\n async delete(filename: string): Promise<DeleteDocumentResponse> {\n const response = await this.client._request(\"DELETE\", \"/api/v1/documents\", {\n body: JSON.stringify({ filename }),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n deleted_chunks: data.deleted_chunks ?? 0,\n };\n }\n}\n","/**\n * OpenRAG SDK search client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type { SearchQueryOptions, SearchResponse } from \"./types\";\n\nexport class SearchClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Perform semantic search on documents.\n *\n * @param query - The search query text.\n * @param options - Optional search options.\n * @returns SearchResponse containing the search results.\n */\n async query(\n query: string,\n options?: Omit<SearchQueryOptions, \"query\">\n ): Promise<SearchResponse> {\n const body: Record<string, unknown> = {\n query,\n limit: options?.limit ?? 10,\n score_threshold: options?.scoreThreshold ?? 0,\n };\n\n if (options?.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options?.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/search\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n results: data.results || [],\n };\n }\n}\n","/**\n * OpenRAG SDK knowledge filters client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n CreateKnowledgeFilterOptions,\n CreateKnowledgeFilterResponse,\n DeleteKnowledgeFilterResponse,\n GetKnowledgeFilterResponse,\n KnowledgeFilter,\n KnowledgeFilterSearchResponse,\n UpdateKnowledgeFilterOptions,\n} from \"./types\";\n\nexport class KnowledgeFiltersClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Create a new knowledge filter.\n *\n * @param options - The filter options including name and queryData.\n * @returns The created filter response with ID.\n */\n async create(\n options: CreateKnowledgeFilterOptions\n ): Promise<CreateKnowledgeFilterResponse> {\n const body = {\n name: options.name,\n description: options.description ?? \"\",\n queryData: JSON.stringify(options.queryData),\n };\n\n const response = await this.client._request(\"POST\", \"/knowledge-filter\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n id: data.id,\n error: data.error,\n };\n }\n\n /**\n * Search for knowledge filters by name, description, or query content.\n *\n * @param query - Optional search query text.\n * @param limit - Maximum number of results (default 20).\n * @returns List of matching knowledge filters.\n */\n async search(query?: string, limit?: number): Promise<KnowledgeFilter[]> {\n const body = {\n query: query ?? \"\",\n limit: limit ?? 20,\n };\n\n const response = await this.client._request(\n \"POST\",\n \"/knowledge-filter/search\",\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = (await response.json()) as KnowledgeFilterSearchResponse;\n if (!data.success || !data.filters) {\n return [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return data.filters.map((f: any) => this._parseFilter(f));\n }\n\n /**\n * Get a specific knowledge filter by ID.\n *\n * @param filterId - The ID of the filter to retrieve.\n * @returns The knowledge filter or null if not found.\n */\n async get(filterId: string): Promise<KnowledgeFilter | null> {\n try {\n const response = await this.client._request(\n \"GET\",\n `/knowledge-filter/${filterId}`\n );\n\n const data = (await response.json()) as GetKnowledgeFilterResponse;\n if (!data.success || !data.filter) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._parseFilter(data.filter as any);\n } catch {\n // Filter not found or other error\n return null;\n }\n }\n\n /**\n * Update an existing knowledge filter.\n *\n * @param filterId - The ID of the filter to update.\n * @param options - The fields to update.\n * @returns Success status.\n */\n async update(\n filterId: string,\n options: UpdateKnowledgeFilterOptions\n ): Promise<boolean> {\n const body: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n body[\"name\"] = options.name;\n }\n if (options.description !== undefined) {\n body[\"description\"] = options.description;\n }\n if (options.queryData !== undefined) {\n body[\"queryData\"] = JSON.stringify(options.queryData);\n }\n\n const response = await this.client._request(\n \"PUT\",\n `/knowledge-filter/${filterId}`,\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = await response.json();\n return data.success ?? false;\n }\n\n /**\n * Delete a knowledge filter.\n *\n * @param filterId - The ID of the filter to delete.\n * @returns Success status.\n */\n async delete(filterId: string): Promise<boolean> {\n const response = await this.client._request(\n \"DELETE\",\n `/knowledge-filter/${filterId}`\n );\n\n const data = (await response.json()) as DeleteKnowledgeFilterResponse;\n return data.success ?? false;\n }\n\n /**\n * Parse a filter from API response, handling JSON-stringified queryData.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _parseFilter(filter: any): KnowledgeFilter {\n let queryData = filter[\"query_data\"] ?? filter[\"queryData\"];\n if (typeof queryData === \"string\") {\n try {\n queryData = JSON.parse(queryData);\n } catch {\n queryData = {};\n }\n }\n\n return {\n id: filter[\"id\"] as string,\n name: filter[\"name\"] as string,\n description: filter[\"description\"],\n queryData: queryData as KnowledgeFilter[\"queryData\"],\n owner: filter[\"owner\"],\n createdAt: filter[\"created_at\"] ?? filter[\"createdAt\"],\n updatedAt: filter[\"updated_at\"] ?? filter[\"updatedAt\"],\n };\n }\n}\n","/**\n * OpenRAG SDK types.\n */\n\n// Chat types\nexport interface Source {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface ChatResponse {\n response: string;\n chatId?: string | null;\n sources: Source[];\n}\n\nexport type StreamEventType = \"content\" | \"sources\" | \"done\";\n\nexport interface ContentEvent {\n type: \"content\";\n delta: string;\n}\n\nexport interface SourcesEvent {\n type: \"sources\";\n sources: Source[];\n}\n\nexport interface DoneEvent {\n type: \"done\";\n chatId?: string | null;\n}\n\nexport type StreamEvent = ContentEvent | SourcesEvent | DoneEvent;\n\n// Search types\nexport interface SearchResult {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface SearchResponse {\n results: SearchResult[];\n}\n\nexport interface SearchFilters {\n data_sources?: string[];\n document_types?: string[];\n}\n\n// Document types\nexport interface IngestResponse {\n task_id: string;\n status?: string | null; // Optional - we poll for actual status\n filename?: string | null;\n}\n\nexport interface IngestTaskStatus {\n task_id: string;\n status: string; // \"pending\", \"running\", \"completed\", \"failed\"\n total_files: number;\n processed_files: number;\n successful_files: number;\n failed_files: number;\n files: Record<string, unknown>;\n}\n\nexport interface DeleteDocumentResponse {\n success: boolean;\n deleted_chunks: number;\n}\n\n// Chat history types\nexport interface Message {\n role: string;\n content: string;\n timestamp?: string | null;\n}\n\nexport interface Conversation {\n chatId: string;\n title: string;\n createdAt?: string | null;\n lastActivity?: string | null;\n messageCount: number;\n}\n\nexport interface ConversationDetail extends Conversation {\n messages: Message[];\n}\n\nexport interface ConversationListResponse {\n conversations: Conversation[];\n}\n\n// Settings types\nexport interface AgentSettings {\n llm_provider?: string | null;\n llm_model?: string | null;\n}\n\nexport interface KnowledgeSettings {\n embedding_provider?: string | null;\n embedding_model?: string | null;\n chunk_size?: number | null;\n chunk_overlap?: number | null;\n}\n\nexport interface SettingsResponse {\n agent: AgentSettings;\n knowledge: KnowledgeSettings;\n}\n\n/** Options for updating settings. */\nexport interface SettingsUpdateOptions {\n /** LLM model name. */\n llm_model?: string;\n /** LLM provider (openai, anthropic, watsonx, ollama). */\n llm_provider?: string;\n /** System prompt for the agent. */\n system_prompt?: string;\n /** Embedding model name. */\n embedding_model?: string;\n /** Embedding provider (openai, watsonx, ollama). */\n embedding_provider?: string;\n /** Chunk size for document splitting. */\n chunk_size?: number;\n /** Chunk overlap for document splitting. */\n chunk_overlap?: number;\n /** Enable table structure parsing. */\n table_structure?: boolean;\n /** Enable OCR for text extraction. */\n ocr?: boolean;\n /** Enable picture descriptions. */\n picture_descriptions?: boolean;\n}\n\n/** Response from settings update. */\nexport interface SettingsUpdateResponse {\n message: string;\n}\n\n// Knowledge filter types\n/** Query configuration stored in a knowledge filter. */\nexport interface KnowledgeFilterQueryData {\n /** Semantic search query text. */\n query?: string;\n /** Filter criteria for documents. */\n filters?: {\n data_sources?: string[];\n document_types?: string[];\n owners?: string[];\n connector_types?: string[];\n };\n /** Maximum number of results. */\n limit?: number;\n /** Minimum relevance score threshold. */\n scoreThreshold?: number;\n /** UI color for the filter. */\n color?: string;\n /** UI icon for the filter. */\n icon?: string;\n}\n\n/** A knowledge filter definition. */\nexport interface KnowledgeFilter {\n id: string;\n name: string;\n description?: string;\n queryData: KnowledgeFilterQueryData;\n owner?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/** Options for creating a knowledge filter. */\nexport interface CreateKnowledgeFilterOptions {\n /** Filter name (required). */\n name: string;\n /** Filter description. */\n description?: string;\n /** Query configuration for the filter. */\n queryData: KnowledgeFilterQueryData;\n}\n\n/** Options for updating a knowledge filter. */\nexport interface UpdateKnowledgeFilterOptions {\n /** New filter name. */\n name?: string;\n /** New filter description. */\n description?: string;\n /** New query configuration. */\n queryData?: KnowledgeFilterQueryData;\n}\n\n/** Response from creating a knowledge filter. */\nexport interface CreateKnowledgeFilterResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\n/** Response from searching knowledge filters. */\nexport interface KnowledgeFilterSearchResponse {\n success: boolean;\n filters: KnowledgeFilter[];\n}\n\n/** Response from getting a knowledge filter. */\nexport interface GetKnowledgeFilterResponse {\n success: boolean;\n filter?: KnowledgeFilter;\n error?: string;\n}\n\n/** Response from deleting a knowledge filter. */\nexport interface DeleteKnowledgeFilterResponse {\n success: boolean;\n error?: string;\n}\n\n// Client options\nexport interface OpenRAGClientOptions {\n /** API key for authentication. Falls back to OPENRAG_API_KEY env var. */\n apiKey?: string;\n /** Base URL for the API. Falls back to OPENRAG_URL env var. */\n baseUrl?: string;\n /** Request timeout in milliseconds (default 30000). */\n timeout?: number;\n}\n\n// Request types\nexport interface ChatCreateOptions {\n message: string;\n stream?: boolean;\n chatId?: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the chat. */\n filterId?: string;\n}\n\nexport interface SearchQueryOptions {\n query: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the search. */\n filterId?: string;\n}\n\n// Error types\nexport class OpenRAGError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = \"OpenRAGError\";\n }\n}\n\nexport class AuthenticationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotFoundError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ValidationError\";\n }\n}\n\nexport class RateLimitError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class ServerError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ServerError\";\n }\n}\n","/**\n * OpenRAG SDK client.\n */\n\nimport { ChatClient } from \"./chat\";\nimport { DocumentsClient } from \"./documents\";\nimport { SearchClient } from \"./search\";\nimport { KnowledgeFiltersClient } from \"./knowledge-filters\";\nimport {\n AuthenticationError,\n NotFoundError,\n OpenRAGError,\n OpenRAGClientOptions,\n RateLimitError,\n ServerError,\n SettingsResponse,\n SettingsUpdateOptions,\n SettingsUpdateResponse,\n ValidationError,\n} from \"./types\";\n\n/**\n * Get environment variable value.\n * Works in Node.js and environments with process.env.\n */\nfunction getEnv(key: string): string | undefined {\n if (typeof globalThis.process !== \"undefined\" && globalThis.process.env) {\n return globalThis.process.env[key];\n }\n return undefined;\n}\n\nclass SettingsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Get current OpenRAG configuration.\n */\n async get(): Promise<SettingsResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/settings\");\n const data = await response.json();\n return {\n agent: data.agent || {},\n knowledge: data.knowledge || {},\n };\n }\n\n /**\n * Update OpenRAG configuration.\n *\n * @param options - The settings to update.\n * @returns Success response with message.\n */\n async update(options: SettingsUpdateOptions): Promise<SettingsUpdateResponse> {\n const response = await this.client._request(\"POST\", \"/settings\", {\n body: JSON.stringify(options),\n });\n const data = await response.json();\n return {\n message: data.message || \"Settings updated\",\n };\n }\n}\n\ninterface RequestOptions {\n body?: string | FormData;\n isMultipart?: boolean;\n stream?: boolean;\n}\n\n/**\n * OpenRAG API client.\n *\n * The client can be configured via constructor arguments or environment variables:\n * - OPENRAG_API_KEY: API key for authentication\n * - OPENRAG_URL: Base URL for the OpenRAG API (default: http://localhost:8080)\n *\n * @example\n * ```typescript\n * // Using environment variables\n * const client = new OpenRAGClient();\n * const response = await client.chat.create({ message: \"Hello\" });\n *\n * // Using explicit arguments\n * const client = new OpenRAGClient({\n * apiKey: \"orag_...\",\n * baseUrl: \"https://api.example.com\"\n * });\n * ```\n */\nexport class OpenRAGClient {\n private static readonly DEFAULT_BASE_URL = \"http://localhost:8080\";\n\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n\n /** Chat client for conversations. */\n readonly chat: ChatClient;\n /** Search client for semantic search. */\n readonly search: SearchClient;\n /** Documents client for ingestion and deletion. */\n readonly documents: DocumentsClient;\n /** Settings client for configuration. */\n readonly settings: SettingsClient;\n /** Knowledge filters client for managing filters. */\n readonly knowledgeFilters: KnowledgeFiltersClient;\n\n constructor(options: OpenRAGClientOptions = {}) {\n // Resolve API key from argument or environment\n this._apiKey = options.apiKey || getEnv(\"OPENRAG_API_KEY\") || \"\";\n if (!this._apiKey) {\n throw new AuthenticationError(\n \"API key is required. Set OPENRAG_API_KEY environment variable or pass apiKey option.\"\n );\n }\n\n // Resolve base URL from argument or environment\n this._baseUrl = (\n options.baseUrl ||\n getEnv(\"OPENRAG_URL\") ||\n OpenRAGClient.DEFAULT_BASE_URL\n ).replace(/\\/$/, \"\");\n\n this._timeout = options.timeout ?? 30000;\n\n // Initialize sub-clients\n this.chat = new ChatClient(this);\n this.search = new SearchClient(this);\n this.documents = new DocumentsClient(this);\n this.settings = new SettingsClient(this);\n this.knowledgeFilters = new KnowledgeFiltersClient(this);\n }\n\n /** @internal Get request headers with authentication. */\n _getHeaders(isMultipart = false): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-API-Key\": this._apiKey,\n };\n\n if (!isMultipart) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n return headers;\n }\n\n /** @internal Make an authenticated request to the API. */\n async _request(\n method: string,\n path: string,\n options: RequestOptions = {}\n ): Promise<Response> {\n const url = `${this._baseUrl}${path}`;\n const headers = this._getHeaders(options.isMultipart);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: options.body ?? null,\n signal: controller.signal,\n });\n\n if (!options.stream) {\n this._handleError(response);\n }\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /** @internal Handle error responses. */\n _handleError(response: Response): void {\n if (response.ok) return;\n\n const statusCode = response.status;\n\n // We can't await the JSON here since this might be called in a sync context\n // So we throw with a generic message based on status code\n const errorMessages: Record<number, string> = {\n 401: \"Invalid or missing API key\",\n 403: \"Access denied\",\n 404: \"Resource not found\",\n 400: \"Invalid request\",\n 429: \"Rate limit exceeded\",\n };\n\n const message = errorMessages[statusCode] || `HTTP ${statusCode}`;\n\n if (statusCode === 401 || statusCode === 403) {\n throw new AuthenticationError(message, statusCode);\n } else if (statusCode === 404) {\n throw new NotFoundError(message, statusCode);\n } else if (statusCode === 400) {\n throw new ValidationError(message, statusCode);\n } else if (statusCode === 429) {\n throw new RateLimitError(message, statusCode);\n } else if (statusCode >= 500) {\n throw new ServerError(message, statusCode);\n } else {\n throw new OpenRAGError(message, statusCode);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chat.ts","../src/documents.ts","../src/search.ts","../src/knowledge-filters.ts","../src/types.ts","../src/client.ts"],"names":[],"mappings":";AAgCO,IAAM,aAAN,MAAmE;AAAA,EAQxE,WAAA,CACU,QACA,OAAA,EACR;AAFQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACP;AAAA,EAVK,KAAA,GAAQ,EAAA;AAAA,EACR,OAAA,GAAyB,IAAA;AAAA,EACzB,WAAqB,EAAC;AAAA,EACtB,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA,GAA0D,IAAA;AAAA,EAC1D,SAAA,GAA6B,IAAA;AAAA;AAAA,EAQrC,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,MAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,OAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAA;AAAA,MAC7B,eAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkB;AAAA,KAClD;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,IACjC;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,IACjC;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAA;AAAA,IACnC;AAEA,IAAA,IAAA,CAAK,YAAY,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,cAAA,EAAgB;AAAA,MAClE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM;AACxB,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAA,EAAU;AAAA,EAC/C;AAAA,EAEA,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAgC;AAC1D,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,IAAA,CAAK,QAAQ,IAAA,EAAK;AAChD,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAE9C,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACtC,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,UAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AAEvB,UAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,YAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,EAAA;AAC5B,YAAA,IAAA,CAAK,KAAA,IAAS,KAAA;AACd,YAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM;AAAA,UACjC,CAAA,MAAA,IAAW,cAAc,SAAA,EAAW;AAClC,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,OAAA,IAAW,EAAC;AACjC,YAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAK,QAAA,EAAS;AAAA,UAClD,CAAA,MAAA,IAAW,cAAc,MAAA,EAAQ;AAC/B,YAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,IAAA;AAC/B,YAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAK,OAAA,EAAQ;AAAA,UAC7C;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAoC;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAI;AAC9B,QAAA,WAAA,MAAiB,SAAS,IAAA,EAAM;AAC9B,UAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,YAAA,MAAM,KAAA,CAAM,KAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA6B;AACjC,IAAA,WAAA,MAAiB,KAAK,IAAA,EAAM;AAAA,IAE5B;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,CAAC,MAAA,CAAO,OAAO,CAAA,GAAU;AACvB,IAAA,IAAA,CAAK,OAAA,EAAS,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,EACvB;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB5C,MAAM,OACJ,OAAA,EACoD;AACpD,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAO,IAAA,CAAK,yBAAyB,OAAO,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAAmD;AACnF,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,MACxB,eAAA,EAAiB,QAAQ,cAAA,IAAkB;AAAA,KAC7C;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,IAAI,OAAA,CAAQ,MAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,SAAS,IAAI,OAAA,CAAQ,OAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAA,CAAK,WAAW,IAAI,OAAA,CAAQ,QAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,cAAA,EAAgB;AAAA,MAClE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,MAC3B,MAAA,EAAQ,KAAK,OAAA,IAAW,IAAA;AAAA,MACxB,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW;AAAC,KAC5B;AAAA,EACF;AAAA,EAEA,MAAc,yBACZ,OAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,OAAO,CAAA;AAClD,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAA,EAAiE;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,CAAA;AACvE,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAA0C;AAC9C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,cAAc,CAAA;AACjE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,MAAM,aAAA,GAAA,CAAiC,IAAA,CAAK,aAAA,IAAiB,EAAC,EAAG,GAAA;AAAA,MAC/D,CAAC,CAAA,MAAgC;AAAA,QAC/B,MAAA,EAAQ,EAAE,SAAS,CAAA;AAAA,QACnB,KAAA,EAAO,CAAA,CAAE,OAAO,CAAA,IAAK,EAAA;AAAA,QACrB,SAAA,EAAW,CAAA,CAAE,YAAY,CAAA,IAAK,IAAA;AAAA,QAC9B,YAAA,EAAc,CAAA,CAAE,eAAe,CAAA,IAAK,IAAA;AAAA,QACpC,YAAA,EAAc,CAAA,CAAE,eAAe,CAAA,IAAK;AAAA,OACtC;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,aAAA,EAAc;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAI,MAAA,EAA6C;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,KAAA,EAAO,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAA;AAC3E,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,MAAM,QAAA,GAAA,CAAuB,IAAA,CAAK,QAAA,IAAY,EAAC,EAAG,GAAA;AAAA,MAChD,CAAC,CAAA,MAAgC;AAAA,QAC/B,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,QACd,OAAA,EAAS,EAAE,SAAS,CAAA;AAAA,QACpB,SAAA,EAAW,CAAA,CAAE,WAAW,CAAA,IAAK;AAAA,OAC/B;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAK,OAAA,IAAW,MAAA;AAAA,MACxB,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,MACrB,SAAA,EAAW,KAAK,UAAA,IAAc,IAAA;AAAA,MAC9B,YAAA,EAAc,KAAK,aAAA,IAAiB,IAAA;AAAA,MACpC,cAAc,QAAA,CAAS,MAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,MAAA,EAAkC;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,QAAA,EAAU,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAA;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,KAAK,OAAA,IAAW,KAAA;AAAA,EACzB;AACF;;;ACnSO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,MAAM,OACJ,OAAA,EAC4C;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC7B,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAEnC,IAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,MAAA,IAAI,OAAO,UAAA,CAAW,OAAA,KAAY,WAAA,EAAa;AAC7C,QAAA,MAAM,EAAA,GAAK,MAAM,OAAO,IAAI,CAAA;AAC5B,QAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,QAAA,MAAM,UAAA,GAAa,EAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AACnD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAC,CAAA;AAClC,QAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,QAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,MAC5D;AACA,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,MAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA,EAAQ,KAAK,MAAA,IAAU,IAAA;AAAA,MACvB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,cAAA;AAAA,IACT;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,OAAA,EAAS,cAAc,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,MAAA,EAA2C;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,KAAA;AAAA,MACA,iBAAiB,MAAM,CAAA;AAAA,KACzB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,KAAK,WAAA,IAAe,CAAA;AAAA,MACjC,eAAA,EAAiB,KAAK,eAAA,IAAmB,CAAA;AAAA,MACzC,gBAAA,EAAkB,KAAK,gBAAA,IAAoB,CAAA;AAAA,MAC3C,YAAA,EAAc,KAAK,YAAA,IAAgB,CAAA;AAAA,MACnC,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS;AAAC,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CACJ,MAAA,EACA,YAAA,GAAuB,CAAA,EACvB,UAAkB,GAAA,EACS;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,YAAY,OAAA,GAAU,GAAA;AAE5B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,SAAA,EAAW;AACzC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,WAAW,QAAA,EAAU;AAC/D,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,GAAI,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,eAAA,EAAkB,MAAM,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAA;AAAA,KAC7D;AAAA,EACF;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAAA,EAAmD;AAC9D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,UAAU,mBAAA,EAAqB;AAAA,MACzE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU;AAAA,KAClC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,MACzB,cAAA,EAAgB,KAAK,cAAA,IAAkB;AAAA,KACzC;AAAA,EACF;AACF;;;AC1JO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5C,MAAM,KAAA,CACJ,KAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,KAAA;AAAA,MACA,KAAA,EAAO,SAAS,KAAA,IAAS,EAAA;AAAA,MACzB,eAAA,EAAiB,SAAS,cAAA,IAAkB;AAAA,KAC9C;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,CAAK,SAAS,IAAI,OAAA,CAAQ,OAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,WAAW,IAAI,OAAA,CAAQ,QAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,gBAAA,EAAkB;AAAA,MACpE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW;AAAC,KAC5B;AAAA,EACF;AACF;;;AC7BO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,MAAM,OACJ,OAAA,EACwC;AACxC,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,MACpC,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS;AAAA,KAC7C;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,2BAAA,EAA6B;AAAA,MAC/E,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,MACzB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CAAO,KAAA,EAAgB,KAAA,EAA4C;AACvE,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,OAAO,KAAA,IAAS,EAAA;AAAA,MAChB,OAAO,KAAA,IAAS;AAAA,KAClB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,MAAA;AAAA,MACA,kCAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,OAAA,EAAS;AAClC,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAI,QAAA,EAAmD;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,QACjC,KAAA;AAAA,QACA,6BAA6B,QAAQ,CAAA;AAAA,OACvC;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,MAAA,EAAQ;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,MAAa,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CACJ,QAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,OAAgC,EAAC;AAEvC,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,MAAM,IAAI,OAAA,CAAQ,IAAA;AAAA,IACzB;AACA,IAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,MAAA,IAAA,CAAK,aAAa,IAAI,OAAA,CAAQ,WAAA;AAAA,IAChC;AACA,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,KAAA;AAAA,MACA,6BAA6B,QAAQ,CAAA,CAAA;AAAA,MACrC;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,KAAK,OAAA,IAAW,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAAA,EAAoC;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA;AAAA,MACjC,QAAA;AAAA,MACA,6BAA6B,QAAQ,CAAA;AAAA,KACvC;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO,KAAK,OAAA,IAAW,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,MAAA,EAA8B;AACjD,IAAA,IAAI,SAAA,GAAY,MAAA,CAAO,YAAY,CAAA,IAAK,OAAO,WAAW,CAAA;AAC1D,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,IAAI;AACF,QAAA,SAAA,GAAY,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AACN,QAAA,SAAA,GAAY,EAAC;AAAA,MACf;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,IAAI,CAAA;AAAA,MACf,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MACnB,WAAA,EAAa,OAAO,aAAa,CAAA;AAAA,MACjC,SAAA;AAAA,MACA,KAAA,EAAO,OAAO,OAAO,CAAA;AAAA,MACrB,SAAA,EAAW,MAAA,CAAO,YAAY,CAAA,IAAK,OAAO,WAAW,CAAA;AAAA,MACrD,SAAA,EAAW,MAAA,CAAO,YAAY,CAAA,IAAK,OAAO,WAAW;AAAA,KACvD;AAAA,EACF;AACF;;;ACmFO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CACE,SACO,UAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EACpD,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAa;AAAA,EAC9C,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAChD,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EAC/C,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC5C,WAAA,CAAY,SAAiB,UAAA,EAAqB;AAChD,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;;;ACrRA,SAAS,OAAO,GAAA,EAAiC;AAC/C,EAAA,IAAI,OAAO,UAAA,CAAW,OAAA,KAAY,WAAA,IAAe,UAAA,CAAW,QAAQ,GAAA,EAAK;AACvE,IAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA,EAK5C,MAAM,GAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,kBAAkB,CAAA;AACrE,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,MACtB,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa;AAAC,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAA,EAAiE;AAC5E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,kBAAA,EAAoB;AAAA,MACtE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,KAC3B;AAAA,EACF;AACF,CAAA;AA4BO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EACzB,OAAwB,gBAAA,GAAmB,uBAAA;AAAA,EAE1B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGR,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAgC,EAAC,EAAG;AAE9C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,iBAAiB,CAAA,IAAK,EAAA;AAC9D,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,QAAA,GAAA,CACH,OAAA,CAAQ,OAAA,IACR,MAAA,CAAO,aAAa,KACpB,cAAA,CAAc,gBAAA,EACd,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEnB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,IAAW,GAAA;AAGnC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,sBAAA,CAAuB,IAAI,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,WAAA,CAAY,cAAc,KAAA,EAA+B;AACvD,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAa,IAAA,CAAK;AAAA,KACpB;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACR;AACnB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,WAAW,CAAA;AAEpD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,QAAQ,CAAA;AAEpE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,QACtB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,QAAA,EAA0B;AACrC,IAAA,IAAI,SAAS,EAAA,EAAI;AAEjB,IAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAI5B,IAAA,MAAM,aAAA,GAAwC;AAAA,MAC5C,GAAA,EAAK,4BAAA;AAAA,MACL,GAAA,EAAK,eAAA;AAAA,MACL,GAAA,EAAK,oBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAEA,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,UAAU,CAAA,IAAK,QAAQ,UAAU,CAAA,CAAA;AAE/D,IAAA,IAAI,UAAA,KAAe,GAAA,IAAO,UAAA,KAAe,GAAA,EAAK;AAC5C,MAAA,MAAM,IAAI,mBAAA,CAAoB,OAAA,EAAS,UAAU,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,aAAA,CAAc,OAAA,EAAS,UAAU,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AAAA,IAC/C,CAAA,MAAA,IAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,MAAM,IAAI,cAAA,CAAe,OAAA,EAAS,UAAU,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,cAAc,GAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA;AAAA,IAC5C;AAAA,EACF;AACF","file":"index.mjs","sourcesContent":["/**\n * OpenRAG SDK chat client with streaming support.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n ChatCreateOptions,\n ChatResponse,\n ContentEvent,\n Conversation,\n ConversationDetail,\n ConversationListResponse,\n DoneEvent,\n Message,\n Source,\n SourcesEvent,\n StreamEvent,\n} from \"./types\";\n\n/**\n * Streaming chat response with helpers.\n *\n * Usage:\n * ```typescript\n * using stream = await client.chat.stream({ message: \"Hello\" });\n * for await (const event of stream) {\n * if (event.type === \"content\") console.log(event.delta);\n * }\n * console.log(stream.chatId);\n * console.log(stream.text);\n * ```\n */\nexport class ChatStream implements AsyncIterable<StreamEvent>, Disposable {\n private _text = \"\";\n private _chatId: string | null = null;\n private _sources: Source[] = [];\n private _consumed = false;\n private _reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n private _response: Response | null = null;\n\n constructor(\n private client: OpenRAGClient,\n private options: ChatCreateOptions\n ) {}\n\n /** The accumulated text from content events. */\n get text(): string {\n return this._text;\n }\n\n /** The chat ID for continuing the conversation. */\n get chatId(): string | null {\n return this._chatId;\n }\n\n /** The sources retrieved during the conversation. */\n get sources(): Source[] {\n return this._sources;\n }\n\n /** @internal Initialize the stream. */\n async _init(): Promise<void> {\n const body: Record<string, unknown> = {\n message: this.options.message,\n stream: true,\n limit: this.options.limit ?? 10,\n score_threshold: this.options.scoreThreshold ?? 0,\n };\n\n if (this.options.chatId) {\n body[\"chat_id\"] = this.options.chatId;\n }\n\n if (this.options.filters) {\n body[\"filters\"] = this.options.filters;\n }\n\n if (this.options.filterId) {\n body[\"filter_id\"] = this.options.filterId;\n }\n\n this._response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n stream: true,\n });\n\n if (!this._response.body) {\n throw new Error(\"Response body is null\");\n }\n\n this._reader = this._response.body.getReader();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n if (this._consumed) {\n throw new Error(\"Stream has already been consumed\");\n }\n this._consumed = true;\n\n if (!this._reader) {\n throw new Error(\"Stream not initialized\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await this._reader.read();\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 if (!trimmed || !trimmed.startsWith(\"data:\")) continue;\n\n const dataStr = trimmed.slice(5).trim();\n if (!dataStr) continue;\n\n try {\n const data = JSON.parse(dataStr);\n const eventType = data.type;\n\n if (eventType === \"content\") {\n const delta = data.delta || \"\";\n this._text += delta;\n yield { type: \"content\", delta } as ContentEvent;\n } else if (eventType === \"sources\") {\n this._sources = data.sources || [];\n yield { type: \"sources\", sources: this._sources } as SourcesEvent;\n } else if (eventType === \"done\") {\n this._chatId = data.chat_id || null;\n yield { type: \"done\", chatId: this._chatId } as DoneEvent;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n /**\n * Iterate over just the text deltas.\n */\n get textStream(): AsyncIterable<string> {\n const self = this;\n return {\n async *[Symbol.asyncIterator]() {\n for await (const event of self) {\n if (event.type === \"content\") {\n yield event.delta;\n }\n }\n },\n };\n }\n\n /**\n * Consume the stream and return the complete text.\n */\n async finalText(): Promise<string> {\n for await (const _ of this) {\n // Consume all events\n }\n return this._text;\n }\n\n /** Clean up resources. */\n [Symbol.dispose](): void {\n this._reader?.cancel().catch(() => {});\n }\n\n /** Close the stream. */\n close(): void {\n this[Symbol.dispose]();\n }\n}\n\nexport class ChatClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Send a chat message (non-streaming).\n */\n async create(options: ChatCreateOptions & { stream?: false }): Promise<ChatResponse>;\n /**\n * Send a chat message (streaming).\n */\n async create(\n options: ChatCreateOptions & { stream: true }\n ): Promise<AsyncIterable<StreamEvent>>;\n /**\n * Send a chat message.\n *\n * @param options - Chat options including message, stream flag, etc.\n * @returns ChatResponse if stream=false, AsyncIterable<StreamEvent> if stream=true.\n */\n async create(\n options: ChatCreateOptions\n ): Promise<ChatResponse | AsyncIterable<StreamEvent>> {\n if (options.stream) {\n return this._createStreamingIterator(options);\n }\n return this._createNonStreaming(options);\n }\n\n private async _createNonStreaming(options: ChatCreateOptions): Promise<ChatResponse> {\n const body: Record<string, unknown> = {\n message: options.message,\n stream: false,\n limit: options.limit ?? 10,\n score_threshold: options.scoreThreshold ?? 0,\n };\n\n if (options.chatId) {\n body[\"chat_id\"] = options.chatId;\n }\n\n if (options.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/chat\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n response: data.response || \"\",\n chatId: data.chat_id || null,\n sources: data.sources || [],\n };\n }\n\n private async _createStreamingIterator(\n options: ChatCreateOptions\n ): Promise<AsyncIterable<StreamEvent>> {\n const stream = new ChatStream(this.client, options);\n await stream._init();\n return stream;\n }\n\n /**\n * Create a streaming chat context manager.\n *\n * @param options - Chat options.\n * @returns ChatStream with helpers.\n */\n async stream(options: Omit<ChatCreateOptions, \"stream\">): Promise<ChatStream> {\n const stream = new ChatStream(this.client, { ...options, stream: true });\n await stream._init();\n return stream;\n }\n\n /**\n * List all conversations.\n */\n async list(): Promise<ConversationListResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/chat\");\n const data = await response.json();\n\n const conversations: Conversation[] = (data.conversations || []).map(\n (c: Record<string, unknown>) => ({\n chatId: c[\"chat_id\"],\n title: c[\"title\"] || \"\",\n createdAt: c[\"created_at\"] || null,\n lastActivity: c[\"last_activity\"] || null,\n messageCount: c[\"message_count\"] || 0,\n })\n );\n\n return { conversations };\n }\n\n /**\n * Get a specific conversation with full message history.\n *\n * @param chatId - The ID of the conversation to retrieve.\n */\n async get(chatId: string): Promise<ConversationDetail> {\n const response = await this.client._request(\"GET\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n\n const messages: Message[] = (data.messages || []).map(\n (m: Record<string, unknown>) => ({\n role: m[\"role\"],\n content: m[\"content\"],\n timestamp: m[\"timestamp\"] || null,\n })\n );\n\n return {\n chatId: data.chat_id || chatId,\n title: data.title || \"\",\n createdAt: data.created_at || null,\n lastActivity: data.last_activity || null,\n messageCount: messages.length,\n messages,\n };\n }\n\n /**\n * Delete a conversation.\n *\n * @param chatId - The ID of the conversation to delete.\n */\n async delete(chatId: string): Promise<boolean> {\n const response = await this.client._request(\"DELETE\", `/api/v1/chat/${chatId}`);\n const data = await response.json();\n return data.success ?? false;\n }\n}\n","/**\n * OpenRAG SDK documents client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n DeleteDocumentResponse,\n IngestResponse,\n IngestTaskStatus,\n} from \"./types\";\n\nexport interface IngestOptions {\n /** Path to file (Node.js only). */\n filePath?: string;\n /** File object (browser or Node.js). */\n file?: File | Blob;\n /** Filename when providing file/blob. */\n filename?: string;\n /** If true, poll until ingestion completes. Default: true. */\n wait?: boolean;\n /** Seconds between status checks when waiting. Default: 1. */\n pollInterval?: number;\n /** Maximum seconds to wait for completion. Default: 300. */\n timeout?: number;\n}\n\nexport class DocumentsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Ingest a document into the knowledge base.\n *\n * @param options - Ingest options (filePath or file+filename).\n * @returns IngestTaskStatus with final status if wait=true, IngestResponse with task_id if wait=false.\n */\n async ingest(\n options: IngestOptions\n ): Promise<IngestResponse | IngestTaskStatus> {\n const formData = new FormData();\n const wait = options.wait ?? true;\n const pollInterval = options.pollInterval ?? 1;\n const timeout = options.timeout ?? 300;\n\n if (options.filePath) {\n // Node.js: read file from path\n if (typeof globalThis.process !== \"undefined\") {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const fileBuffer = fs.readFileSync(options.filePath);\n const filename = path.basename(options.filePath);\n const blob = new Blob([fileBuffer]);\n formData.append(\"file\", blob, filename);\n } else {\n throw new Error(\"filePath is only supported in Node.js\");\n }\n } else if (options.file) {\n if (!options.filename) {\n throw new Error(\"filename is required when providing file\");\n }\n formData.append(\"file\", options.file, options.filename);\n } else {\n throw new Error(\"Either filePath or file must be provided\");\n }\n\n const response = await this.client._request(\n \"POST\",\n \"/api/v1/documents/ingest\",\n {\n body: formData,\n isMultipart: true,\n }\n );\n\n const data = await response.json();\n const ingestResponse: IngestResponse = {\n task_id: data.task_id,\n status: data.status ?? null,\n filename: data.filename ?? null,\n };\n\n if (!wait) {\n return ingestResponse;\n }\n\n // Poll for completion\n return await this.waitForTask(ingestResponse.task_id, pollInterval, timeout);\n }\n\n /**\n * Get the status of an ingestion task.\n *\n * @param taskId - The task ID returned from ingest().\n * @returns IngestTaskStatus with current task status.\n */\n async getTaskStatus(taskId: string): Promise<IngestTaskStatus> {\n const response = await this.client._request(\n \"GET\",\n `/api/v1/tasks/${taskId}`\n );\n const data = await response.json();\n return {\n task_id: data.task_id,\n status: data.status,\n total_files: data.total_files ?? 0,\n processed_files: data.processed_files ?? 0,\n successful_files: data.successful_files ?? 0,\n failed_files: data.failed_files ?? 0,\n files: data.files ?? {},\n };\n }\n\n /**\n * Wait for an ingestion task to complete.\n *\n * @param taskId - The task ID to wait for.\n * @param pollInterval - Seconds between status checks.\n * @param timeout - Maximum seconds to wait.\n * @returns IngestTaskStatus with final status.\n */\n async waitForTask(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 300\n ): Promise<IngestTaskStatus> {\n const startTime = Date.now();\n const timeoutMs = timeout * 1000;\n\n while (Date.now() - startTime < timeoutMs) {\n const status = await this.getTaskStatus(taskId);\n if (status.status === \"completed\" || status.status === \"failed\") {\n return status;\n }\n await this.sleep(pollInterval * 1000);\n }\n\n throw new Error(\n `Ingestion task ${taskId} did not complete within ${timeout}s`\n );\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Delete a document from the knowledge base.\n *\n * @param filename - Name of the file to delete.\n * @returns DeleteDocumentResponse with deleted chunk count.\n */\n async delete(filename: string): Promise<DeleteDocumentResponse> {\n const response = await this.client._request(\"DELETE\", \"/api/v1/documents\", {\n body: JSON.stringify({ filename }),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n deleted_chunks: data.deleted_chunks ?? 0,\n };\n }\n}\n","/**\n * OpenRAG SDK search client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type { SearchQueryOptions, SearchResponse } from \"./types\";\n\nexport class SearchClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Perform semantic search on documents.\n *\n * @param query - The search query text.\n * @param options - Optional search options.\n * @returns SearchResponse containing the search results.\n */\n async query(\n query: string,\n options?: Omit<SearchQueryOptions, \"query\">\n ): Promise<SearchResponse> {\n const body: Record<string, unknown> = {\n query,\n limit: options?.limit ?? 10,\n score_threshold: options?.scoreThreshold ?? 0,\n };\n\n if (options?.filters) {\n body[\"filters\"] = options.filters;\n }\n\n if (options?.filterId) {\n body[\"filter_id\"] = options.filterId;\n }\n\n const response = await this.client._request(\"POST\", \"/api/v1/search\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n results: data.results || [],\n };\n }\n}\n","/**\n * OpenRAG SDK knowledge filters client.\n */\n\nimport type { OpenRAGClient } from \"./client\";\nimport type {\n CreateKnowledgeFilterOptions,\n CreateKnowledgeFilterResponse,\n DeleteKnowledgeFilterResponse,\n GetKnowledgeFilterResponse,\n KnowledgeFilter,\n KnowledgeFilterSearchResponse,\n UpdateKnowledgeFilterOptions,\n} from \"./types\";\n\nexport class KnowledgeFiltersClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Create a new knowledge filter.\n *\n * @param options - The filter options including name and queryData.\n * @returns The created filter response with ID.\n */\n async create(\n options: CreateKnowledgeFilterOptions\n ): Promise<CreateKnowledgeFilterResponse> {\n const body = {\n name: options.name,\n description: options.description ?? \"\",\n queryData: JSON.stringify(options.queryData),\n };\n\n const response = await this.client._request(\"POST\", \"/api/v1/knowledge-filters\", {\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n return {\n success: data.success ?? false,\n id: data.id,\n error: data.error,\n };\n }\n\n /**\n * Search for knowledge filters by name, description, or query content.\n *\n * @param query - Optional search query text.\n * @param limit - Maximum number of results (default 20).\n * @returns List of matching knowledge filters.\n */\n async search(query?: string, limit?: number): Promise<KnowledgeFilter[]> {\n const body = {\n query: query ?? \"\",\n limit: limit ?? 20,\n };\n\n const response = await this.client._request(\n \"POST\",\n \"/api/v1/knowledge-filters/search\",\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = (await response.json()) as KnowledgeFilterSearchResponse;\n if (!data.success || !data.filters) {\n return [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return data.filters.map((f: any) => this._parseFilter(f));\n }\n\n /**\n * Get a specific knowledge filter by ID.\n *\n * @param filterId - The ID of the filter to retrieve.\n * @returns The knowledge filter or null if not found.\n */\n async get(filterId: string): Promise<KnowledgeFilter | null> {\n try {\n const response = await this.client._request(\n \"GET\",\n `/api/v1/knowledge-filters/${filterId}`\n );\n\n const data = (await response.json()) as GetKnowledgeFilterResponse;\n if (!data.success || !data.filter) {\n return null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._parseFilter(data.filter as any);\n } catch {\n // Filter not found or other error\n return null;\n }\n }\n\n /**\n * Update an existing knowledge filter.\n *\n * @param filterId - The ID of the filter to update.\n * @param options - The fields to update.\n * @returns Success status.\n */\n async update(\n filterId: string,\n options: UpdateKnowledgeFilterOptions\n ): Promise<boolean> {\n const body: Record<string, unknown> = {};\n\n if (options.name !== undefined) {\n body[\"name\"] = options.name;\n }\n if (options.description !== undefined) {\n body[\"description\"] = options.description;\n }\n if (options.queryData !== undefined) {\n body[\"queryData\"] = JSON.stringify(options.queryData);\n }\n\n const response = await this.client._request(\n \"PUT\",\n `/api/v1/knowledge-filters/${filterId}`,\n {\n body: JSON.stringify(body),\n }\n );\n\n const data = await response.json();\n return data.success ?? false;\n }\n\n /**\n * Delete a knowledge filter.\n *\n * @param filterId - The ID of the filter to delete.\n * @returns Success status.\n */\n async delete(filterId: string): Promise<boolean> {\n const response = await this.client._request(\n \"DELETE\",\n `/api/v1/knowledge-filters/${filterId}`\n );\n\n const data = (await response.json()) as DeleteKnowledgeFilterResponse;\n return data.success ?? false;\n }\n\n /**\n * Parse a filter from API response, handling JSON-stringified queryData.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _parseFilter(filter: any): KnowledgeFilter {\n let queryData = filter[\"query_data\"] ?? filter[\"queryData\"];\n if (typeof queryData === \"string\") {\n try {\n queryData = JSON.parse(queryData);\n } catch {\n queryData = {};\n }\n }\n\n return {\n id: filter[\"id\"] as string,\n name: filter[\"name\"] as string,\n description: filter[\"description\"],\n queryData: queryData as KnowledgeFilter[\"queryData\"],\n owner: filter[\"owner\"],\n createdAt: filter[\"created_at\"] ?? filter[\"createdAt\"],\n updatedAt: filter[\"updated_at\"] ?? filter[\"updatedAt\"],\n };\n }\n}\n","/**\n * OpenRAG SDK types.\n */\n\n// Chat types\nexport interface Source {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface ChatResponse {\n response: string;\n chatId?: string | null;\n sources: Source[];\n}\n\nexport type StreamEventType = \"content\" | \"sources\" | \"done\";\n\nexport interface ContentEvent {\n type: \"content\";\n delta: string;\n}\n\nexport interface SourcesEvent {\n type: \"sources\";\n sources: Source[];\n}\n\nexport interface DoneEvent {\n type: \"done\";\n chatId?: string | null;\n}\n\nexport type StreamEvent = ContentEvent | SourcesEvent | DoneEvent;\n\n// Search types\nexport interface SearchResult {\n filename: string;\n text: string;\n score: number;\n page?: number | null;\n mimetype?: string | null;\n}\n\nexport interface SearchResponse {\n results: SearchResult[];\n}\n\nexport interface SearchFilters {\n data_sources?: string[];\n document_types?: string[];\n}\n\n// Document types\nexport interface IngestResponse {\n task_id: string;\n status?: string | null; // Optional - we poll for actual status\n filename?: string | null;\n}\n\nexport interface IngestTaskStatus {\n task_id: string;\n status: string; // \"pending\", \"running\", \"completed\", \"failed\"\n total_files: number;\n processed_files: number;\n successful_files: number;\n failed_files: number;\n files: Record<string, unknown>;\n}\n\nexport interface DeleteDocumentResponse {\n success: boolean;\n deleted_chunks: number;\n}\n\n// Chat history types\nexport interface Message {\n role: string;\n content: string;\n timestamp?: string | null;\n}\n\nexport interface Conversation {\n chatId: string;\n title: string;\n createdAt?: string | null;\n lastActivity?: string | null;\n messageCount: number;\n}\n\nexport interface ConversationDetail extends Conversation {\n messages: Message[];\n}\n\nexport interface ConversationListResponse {\n conversations: Conversation[];\n}\n\n// Settings types\nexport interface AgentSettings {\n llm_provider?: string | null;\n llm_model?: string | null;\n}\n\nexport interface KnowledgeSettings {\n embedding_provider?: string | null;\n embedding_model?: string | null;\n chunk_size?: number | null;\n chunk_overlap?: number | null;\n}\n\nexport interface SettingsResponse {\n agent: AgentSettings;\n knowledge: KnowledgeSettings;\n}\n\n/** Options for updating settings. */\nexport interface SettingsUpdateOptions {\n /** LLM model name. */\n llm_model?: string;\n /** LLM provider (openai, anthropic, watsonx, ollama). */\n llm_provider?: string;\n /** System prompt for the agent. */\n system_prompt?: string;\n /** Embedding model name. */\n embedding_model?: string;\n /** Embedding provider (openai, watsonx, ollama). */\n embedding_provider?: string;\n /** Chunk size for document splitting. */\n chunk_size?: number;\n /** Chunk overlap for document splitting. */\n chunk_overlap?: number;\n /** Enable table structure parsing. */\n table_structure?: boolean;\n /** Enable OCR for text extraction. */\n ocr?: boolean;\n /** Enable picture descriptions. */\n picture_descriptions?: boolean;\n}\n\n/** Response from settings update. */\nexport interface SettingsUpdateResponse {\n message: string;\n}\n\n// Knowledge filter types\n/** Query configuration stored in a knowledge filter. */\nexport interface KnowledgeFilterQueryData {\n /** Semantic search query text. */\n query?: string;\n /** Filter criteria for documents. */\n filters?: {\n data_sources?: string[];\n document_types?: string[];\n owners?: string[];\n connector_types?: string[];\n };\n /** Maximum number of results. */\n limit?: number;\n /** Minimum relevance score threshold. */\n scoreThreshold?: number;\n /** UI color for the filter. */\n color?: string;\n /** UI icon for the filter. */\n icon?: string;\n}\n\n/** A knowledge filter definition. */\nexport interface KnowledgeFilter {\n id: string;\n name: string;\n description?: string;\n queryData: KnowledgeFilterQueryData;\n owner?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/** Options for creating a knowledge filter. */\nexport interface CreateKnowledgeFilterOptions {\n /** Filter name (required). */\n name: string;\n /** Filter description. */\n description?: string;\n /** Query configuration for the filter. */\n queryData: KnowledgeFilterQueryData;\n}\n\n/** Options for updating a knowledge filter. */\nexport interface UpdateKnowledgeFilterOptions {\n /** New filter name. */\n name?: string;\n /** New filter description. */\n description?: string;\n /** New query configuration. */\n queryData?: KnowledgeFilterQueryData;\n}\n\n/** Response from creating a knowledge filter. */\nexport interface CreateKnowledgeFilterResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\n/** Response from searching knowledge filters. */\nexport interface KnowledgeFilterSearchResponse {\n success: boolean;\n filters: KnowledgeFilter[];\n}\n\n/** Response from getting a knowledge filter. */\nexport interface GetKnowledgeFilterResponse {\n success: boolean;\n filter?: KnowledgeFilter;\n error?: string;\n}\n\n/** Response from deleting a knowledge filter. */\nexport interface DeleteKnowledgeFilterResponse {\n success: boolean;\n error?: string;\n}\n\n// Client options\nexport interface OpenRAGClientOptions {\n /** API key for authentication. Falls back to OPENRAG_API_KEY env var. */\n apiKey?: string;\n /** Base URL for the API. Falls back to OPENRAG_URL env var. */\n baseUrl?: string;\n /** Request timeout in milliseconds (default 30000). */\n timeout?: number;\n}\n\n// Request types\nexport interface ChatCreateOptions {\n message: string;\n stream?: boolean;\n chatId?: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the chat. */\n filterId?: string;\n}\n\nexport interface SearchQueryOptions {\n query: string;\n filters?: SearchFilters;\n limit?: number;\n scoreThreshold?: number;\n /** Knowledge filter ID to apply to the search. */\n filterId?: string;\n}\n\n// Error types\nexport class OpenRAGError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = \"OpenRAGError\";\n }\n}\n\nexport class AuthenticationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotFoundError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ValidationError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ValidationError\";\n }\n}\n\nexport class RateLimitError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class ServerError extends OpenRAGError {\n constructor(message: string, statusCode?: number) {\n super(message, statusCode);\n this.name = \"ServerError\";\n }\n}\n","/**\n * OpenRAG SDK client.\n */\n\nimport { ChatClient } from \"./chat\";\nimport { DocumentsClient } from \"./documents\";\nimport { SearchClient } from \"./search\";\nimport { KnowledgeFiltersClient } from \"./knowledge-filters\";\nimport {\n AuthenticationError,\n NotFoundError,\n OpenRAGError,\n OpenRAGClientOptions,\n RateLimitError,\n ServerError,\n SettingsResponse,\n SettingsUpdateOptions,\n SettingsUpdateResponse,\n ValidationError,\n} from \"./types\";\n\n/**\n * Get environment variable value.\n * Works in Node.js and environments with process.env.\n */\nfunction getEnv(key: string): string | undefined {\n if (typeof globalThis.process !== \"undefined\" && globalThis.process.env) {\n return globalThis.process.env[key];\n }\n return undefined;\n}\n\nclass SettingsClient {\n constructor(private client: OpenRAGClient) {}\n\n /**\n * Get current OpenRAG configuration.\n */\n async get(): Promise<SettingsResponse> {\n const response = await this.client._request(\"GET\", \"/api/v1/settings\");\n const data = await response.json();\n return {\n agent: data.agent || {},\n knowledge: data.knowledge || {},\n };\n }\n\n /**\n * Update OpenRAG configuration.\n *\n * @param options - The settings to update.\n * @returns Success response with message.\n */\n async update(options: SettingsUpdateOptions): Promise<SettingsUpdateResponse> {\n const response = await this.client._request(\"POST\", \"/api/v1/settings\", {\n body: JSON.stringify(options),\n });\n const data = await response.json();\n return {\n message: data.message || \"Settings updated\",\n };\n }\n}\n\ninterface RequestOptions {\n body?: string | FormData;\n isMultipart?: boolean;\n stream?: boolean;\n}\n\n/**\n * OpenRAG API client.\n *\n * The client can be configured via constructor arguments or environment variables:\n * - OPENRAG_API_KEY: API key for authentication\n * - OPENRAG_URL: Base URL for the OpenRAG frontend (default: http://localhost:3000)\n *\n * @example\n * ```typescript\n * // Using environment variables\n * const client = new OpenRAGClient();\n * const response = await client.chat.create({ message: \"Hello\" });\n *\n * // Using explicit arguments\n * const client = new OpenRAGClient({\n * apiKey: \"orag_...\",\n * baseUrl: \"https://api.example.com\"\n * });\n * ```\n */\nexport class OpenRAGClient {\n private static readonly DEFAULT_BASE_URL = \"http://localhost:3000\";\n\n private readonly _apiKey: string;\n private readonly _baseUrl: string;\n private readonly _timeout: number;\n\n /** Chat client for conversations. */\n readonly chat: ChatClient;\n /** Search client for semantic search. */\n readonly search: SearchClient;\n /** Documents client for ingestion and deletion. */\n readonly documents: DocumentsClient;\n /** Settings client for configuration. */\n readonly settings: SettingsClient;\n /** Knowledge filters client for managing filters. */\n readonly knowledgeFilters: KnowledgeFiltersClient;\n\n constructor(options: OpenRAGClientOptions = {}) {\n // Resolve API key from argument or environment\n this._apiKey = options.apiKey || getEnv(\"OPENRAG_API_KEY\") || \"\";\n if (!this._apiKey) {\n throw new AuthenticationError(\n \"API key is required. Set OPENRAG_API_KEY environment variable or pass apiKey option.\"\n );\n }\n\n // Resolve base URL from argument or environment\n this._baseUrl = (\n options.baseUrl ||\n getEnv(\"OPENRAG_URL\") ||\n OpenRAGClient.DEFAULT_BASE_URL\n ).replace(/\\/$/, \"\");\n\n this._timeout = options.timeout ?? 30000;\n\n // Initialize sub-clients\n this.chat = new ChatClient(this);\n this.search = new SearchClient(this);\n this.documents = new DocumentsClient(this);\n this.settings = new SettingsClient(this);\n this.knowledgeFilters = new KnowledgeFiltersClient(this);\n }\n\n /** @internal Get request headers with authentication. */\n _getHeaders(isMultipart = false): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-API-Key\": this._apiKey,\n };\n\n if (!isMultipart) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n return headers;\n }\n\n /** @internal Make an authenticated request to the API. */\n async _request(\n method: string,\n path: string,\n options: RequestOptions = {}\n ): Promise<Response> {\n const url = `${this._baseUrl}${path}`;\n const headers = this._getHeaders(options.isMultipart);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: options.body ?? null,\n signal: controller.signal,\n });\n\n if (!options.stream) {\n this._handleError(response);\n }\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /** @internal Handle error responses. */\n _handleError(response: Response): void {\n if (response.ok) return;\n\n const statusCode = response.status;\n\n // We can't await the JSON here since this might be called in a sync context\n // So we throw with a generic message based on status code\n const errorMessages: Record<number, string> = {\n 401: \"Invalid or missing API key\",\n 403: \"Access denied\",\n 404: \"Resource not found\",\n 400: \"Invalid request\",\n 429: \"Rate limit exceeded\",\n };\n\n const message = errorMessages[statusCode] || `HTTP ${statusCode}`;\n\n if (statusCode === 401 || statusCode === 403) {\n throw new AuthenticationError(message, statusCode);\n } else if (statusCode === 404) {\n throw new NotFoundError(message, statusCode);\n } else if (statusCode === 400) {\n throw new ValidationError(message, statusCode);\n } else if (statusCode === 429) {\n throw new RateLimitError(message, statusCode);\n } else if (statusCode >= 500) {\n throw new ServerError(message, statusCode);\n } else {\n throw new OpenRAGError(message, statusCode);\n }\n }\n}\n"]}
|
package/package.json
CHANGED