@cogitator-ai/rag 0.1.0 → 0.1.4

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.
Files changed (110) hide show
  1. package/README.md +2 -2
  2. package/dist/chunkers/create-chunker.d.ts +3 -0
  3. package/dist/chunkers/create-chunker.d.ts.map +1 -0
  4. package/dist/chunkers/create-chunker.js +32 -0
  5. package/dist/chunkers/create-chunker.js.map +1 -0
  6. package/dist/chunkers/fixed-chunker.d.ts +12 -0
  7. package/dist/chunkers/fixed-chunker.d.ts.map +1 -0
  8. package/dist/chunkers/fixed-chunker.js +40 -0
  9. package/dist/chunkers/fixed-chunker.js.map +1 -0
  10. package/dist/chunkers/index.d.ts +5 -0
  11. package/dist/chunkers/index.d.ts.map +1 -0
  12. package/dist/chunkers/index.js +5 -0
  13. package/dist/chunkers/index.js.map +1 -0
  14. package/dist/chunkers/recursive-chunker.d.ts +18 -0
  15. package/dist/chunkers/recursive-chunker.d.ts.map +1 -0
  16. package/dist/chunkers/recursive-chunker.js +161 -0
  17. package/dist/chunkers/recursive-chunker.js.map +1 -0
  18. package/dist/chunkers/semantic-chunker.d.ts +19 -0
  19. package/dist/chunkers/semantic-chunker.d.ts.map +1 -0
  20. package/dist/chunkers/semantic-chunker.js +176 -0
  21. package/dist/chunkers/semantic-chunker.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +10 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/loaders/csv-loader.d.ts +16 -0
  27. package/dist/loaders/csv-loader.d.ts.map +1 -0
  28. package/dist/loaders/csv-loader.js +57 -0
  29. package/dist/loaders/csv-loader.js.map +1 -0
  30. package/dist/loaders/html-loader.d.ts +12 -0
  31. package/dist/loaders/html-loader.d.ts.map +1 -0
  32. package/dist/loaders/html-loader.js +40 -0
  33. package/dist/loaders/html-loader.js.map +1 -0
  34. package/dist/loaders/index.d.ts +14 -0
  35. package/dist/loaders/index.d.ts.map +1 -0
  36. package/dist/loaders/index.js +8 -0
  37. package/dist/loaders/index.js.map +1 -0
  38. package/dist/loaders/json-loader.d.ts +16 -0
  39. package/dist/loaders/json-loader.d.ts.map +1 -0
  40. package/dist/loaders/json-loader.js +63 -0
  41. package/dist/loaders/json-loader.js.map +1 -0
  42. package/dist/loaders/markdown-loader.d.ts +14 -0
  43. package/dist/loaders/markdown-loader.d.ts.map +1 -0
  44. package/dist/loaders/markdown-loader.js +65 -0
  45. package/dist/loaders/markdown-loader.js.map +1 -0
  46. package/dist/loaders/pdf-loader.d.ts +14 -0
  47. package/dist/loaders/pdf-loader.d.ts.map +1 -0
  48. package/dist/loaders/pdf-loader.js +66 -0
  49. package/dist/loaders/pdf-loader.js.map +1 -0
  50. package/dist/loaders/text-loader.d.ts +8 -0
  51. package/dist/loaders/text-loader.d.ts.map +1 -0
  52. package/dist/loaders/text-loader.js +40 -0
  53. package/dist/loaders/text-loader.js.map +1 -0
  54. package/dist/loaders/web-loader.d.ts +13 -0
  55. package/dist/loaders/web-loader.d.ts.map +1 -0
  56. package/dist/loaders/web-loader.js +22 -0
  57. package/dist/loaders/web-loader.js.map +1 -0
  58. package/dist/rag-builder.d.ts +22 -0
  59. package/dist/rag-builder.d.ts.map +1 -0
  60. package/dist/rag-builder.js +74 -0
  61. package/dist/rag-builder.js.map +1 -0
  62. package/dist/rag-pipeline.d.ts +28 -0
  63. package/dist/rag-pipeline.d.ts.map +1 -0
  64. package/dist/rag-pipeline.js +63 -0
  65. package/dist/rag-pipeline.js.map +1 -0
  66. package/dist/rerankers/cohere-reranker.d.ts +12 -0
  67. package/dist/rerankers/cohere-reranker.d.ts.map +1 -0
  68. package/dist/rerankers/cohere-reranker.js +41 -0
  69. package/dist/rerankers/cohere-reranker.js.map +1 -0
  70. package/dist/rerankers/index.d.ts +3 -0
  71. package/dist/rerankers/index.d.ts.map +1 -0
  72. package/dist/rerankers/index.js +3 -0
  73. package/dist/rerankers/index.js.map +1 -0
  74. package/dist/rerankers/llm-reranker.d.ts +12 -0
  75. package/dist/rerankers/llm-reranker.d.ts.map +1 -0
  76. package/dist/rerankers/llm-reranker.js +56 -0
  77. package/dist/rerankers/llm-reranker.js.map +1 -0
  78. package/dist/retrievers/create-retriever.d.ts +33 -0
  79. package/dist/retrievers/create-retriever.d.ts.map +1 -0
  80. package/dist/retrievers/create-retriever.js +36 -0
  81. package/dist/retrievers/create-retriever.js.map +1 -0
  82. package/dist/retrievers/hybrid-retriever.d.ts +18 -0
  83. package/dist/retrievers/hybrid-retriever.d.ts.map +1 -0
  84. package/dist/retrievers/hybrid-retriever.js +44 -0
  85. package/dist/retrievers/hybrid-retriever.js.map +1 -0
  86. package/dist/retrievers/index.d.ts +11 -0
  87. package/dist/retrievers/index.d.ts.map +1 -0
  88. package/dist/retrievers/index.js +6 -0
  89. package/dist/retrievers/index.js.map +1 -0
  90. package/dist/retrievers/mmr-retriever.d.ts +20 -0
  91. package/dist/retrievers/mmr-retriever.d.ts.map +1 -0
  92. package/dist/retrievers/mmr-retriever.js +91 -0
  93. package/dist/retrievers/mmr-retriever.js.map +1 -0
  94. package/dist/retrievers/multi-query-retriever.d.ts +13 -0
  95. package/dist/retrievers/multi-query-retriever.d.ts.map +1 -0
  96. package/dist/retrievers/multi-query-retriever.js +29 -0
  97. package/dist/retrievers/multi-query-retriever.js.map +1 -0
  98. package/dist/retrievers/similarity-retriever.d.ts +17 -0
  99. package/dist/retrievers/similarity-retriever.d.ts.map +1 -0
  100. package/dist/retrievers/similarity-retriever.js +40 -0
  101. package/dist/retrievers/similarity-retriever.js.map +1 -0
  102. package/dist/schema.d.ts +70 -0
  103. package/dist/schema.d.ts.map +1 -0
  104. package/dist/schema.js +27 -0
  105. package/dist/schema.js.map +1 -0
  106. package/dist/tools.d.ts +23 -0
  107. package/dist/tools.d.ts.map +1 -0
  108. package/dist/tools.js +45 -0
  109. package/dist/tools.js.map +1 -0
  110. package/package.json +1 -6
package/README.md CHANGED
@@ -64,7 +64,7 @@ for (const r of results) {
64
64
  | ---------------- | --------------------- | ------------ | ----------------------------- |
65
65
  | `TextLoader` | `.txt` | — | Files and directories |
66
66
  | `MarkdownLoader` | `.md` | — | Strips frontmatter by default |
67
- | `JSONLoader` | `.json` | — | Configurable JSON path |
67
+ | `JSONLoader` | `.json` | — | Configurable content field |
68
68
  | `CSVLoader` | `.csv` | `papaparse` | Column selection, row mapping |
69
69
  | `HTMLLoader` | `.html`, `.htm` | `cheerio` | CSS selector support |
70
70
  | `PDFLoader` | `.pdf` | `pdf-parse` | Text extraction from PDFs |
@@ -75,7 +75,7 @@ import { MarkdownLoader, WebLoader, CSVLoader } from '@cogitator-ai/rag';
75
75
 
76
76
  const md = new MarkdownLoader({ stripFrontmatter: true });
77
77
  const web = new WebLoader({ selector: 'article' });
78
- const csv = new CSVLoader({ columns: ['title', 'body'] });
78
+ const csv = new CSVLoader({ contentColumn: 'body', metadataColumns: ['title'] });
79
79
  ```
80
80
 
81
81
  ---
@@ -0,0 +1,3 @@
1
+ import type { ChunkingConfig, Chunker, AsyncChunker, EmbeddingService } from '@cogitator-ai/types';
2
+ export declare function createChunker(config: ChunkingConfig, embeddingService?: EmbeddingService): Chunker | AsyncChunker;
3
+ //# sourceMappingURL=create-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/create-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKnG,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,GAAG,YAAY,CA8BxB"}
@@ -0,0 +1,32 @@
1
+ import { FixedSizeChunker } from './fixed-chunker';
2
+ import { RecursiveChunker } from './recursive-chunker';
3
+ import { SemanticChunker } from './semantic-chunker';
4
+ export function createChunker(config, embeddingService) {
5
+ switch (config.strategy) {
6
+ case 'fixed':
7
+ return new FixedSizeChunker({
8
+ chunkSize: config.chunkSize,
9
+ chunkOverlap: config.chunkOverlap,
10
+ });
11
+ case 'recursive':
12
+ return new RecursiveChunker({
13
+ chunkSize: config.chunkSize,
14
+ chunkOverlap: config.chunkOverlap,
15
+ separators: config.separators,
16
+ });
17
+ case 'semantic': {
18
+ if (!embeddingService) {
19
+ throw new Error('embeddingService is required for semantic chunking strategy');
20
+ }
21
+ return new SemanticChunker({
22
+ embeddingService,
23
+ maxChunkSize: config.chunkSize,
24
+ });
25
+ }
26
+ default: {
27
+ const _exhaustive = config.strategy;
28
+ throw new Error(`Unknown chunking strategy: ${_exhaustive}`);
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=create-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-chunker.js","sourceRoot":"","sources":["../../src/chunkers/create-chunker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,UAAU,aAAa,CAC3B,MAAsB,EACtB,gBAAmC;IAEnC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAC;QAEL,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QAEL,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,IAAI,eAAe,CAAC;gBACzB,gBAAgB;gBAChB,YAAY,EAAE,MAAM,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Chunker, DocumentChunk } from '@cogitator-ai/types';
2
+ export interface FixedSizeChunkerOptions {
3
+ chunkSize: number;
4
+ chunkOverlap: number;
5
+ }
6
+ export declare class FixedSizeChunker implements Chunker {
7
+ private readonly chunkSize;
8
+ private readonly chunkOverlap;
9
+ constructor(options: FixedSizeChunkerOptions);
10
+ chunk(text: string, documentId: string): DocumentChunk[];
11
+ }
12
+ //# sourceMappingURL=fixed-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/fixed-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,uBAAuB;IAc5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;CAuBzD"}
@@ -0,0 +1,40 @@
1
+ import { nanoid } from 'nanoid';
2
+ export class FixedSizeChunker {
3
+ chunkSize;
4
+ chunkOverlap;
5
+ constructor(options) {
6
+ if (options.chunkSize <= 0) {
7
+ throw new Error('chunkSize must be a positive number');
8
+ }
9
+ if (options.chunkOverlap < 0) {
10
+ throw new Error('chunkOverlap must be non-negative');
11
+ }
12
+ if (options.chunkOverlap >= options.chunkSize) {
13
+ throw new Error('chunkOverlap must be less than chunkSize');
14
+ }
15
+ this.chunkSize = options.chunkSize;
16
+ this.chunkOverlap = options.chunkOverlap;
17
+ }
18
+ chunk(text, documentId) {
19
+ if (text.length === 0)
20
+ return [];
21
+ const step = this.chunkSize - this.chunkOverlap;
22
+ const chunks = [];
23
+ let order = 0;
24
+ for (let start = 0; start < text.length; start += step) {
25
+ const end = Math.min(start + this.chunkSize, text.length);
26
+ chunks.push({
27
+ id: nanoid(),
28
+ documentId,
29
+ content: text.slice(start, end),
30
+ startOffset: start,
31
+ endOffset: end,
32
+ order: order++,
33
+ });
34
+ if (end === text.length)
35
+ break;
36
+ }
37
+ return chunks;
38
+ }
39
+ }
40
+ //# sourceMappingURL=fixed-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-chunker.js","sourceRoot":"","sources":["../../src/chunkers/fixed-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAQhC,MAAM,OAAO,gBAAgB;IACV,SAAS,CAAS;IAClB,YAAY,CAAS;IAEtC,YAAY,OAAgC;QAC1C,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,UAAkB;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;QAChD,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,MAAM,EAAE;gBACZ,UAAU;gBACV,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC/B,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,GAAG;gBACd,KAAK,EAAE,KAAK,EAAE;aACf,CAAC,CAAC;YAEH,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM;gBAAE,MAAM;QACjC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { FixedSizeChunker, type FixedSizeChunkerOptions } from './fixed-chunker';
2
+ export { RecursiveChunker, type RecursiveChunkerOptions } from './recursive-chunker';
3
+ export { SemanticChunker, type SemanticChunkerOptions } from './semantic-chunker';
4
+ export { createChunker } from './create-chunker';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { FixedSizeChunker } from './fixed-chunker';
2
+ export { RecursiveChunker } from './recursive-chunker';
3
+ export { SemanticChunker } from './semantic-chunker';
4
+ export { createChunker } from './create-chunker';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAgC,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAA+B,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Chunker, DocumentChunk } from '@cogitator-ai/types';
2
+ export interface RecursiveChunkerOptions {
3
+ chunkSize: number;
4
+ chunkOverlap: number;
5
+ separators?: string[];
6
+ }
7
+ export declare class RecursiveChunker implements Chunker {
8
+ private readonly chunkSize;
9
+ private readonly chunkOverlap;
10
+ private readonly separators;
11
+ constructor(options: RecursiveChunkerOptions);
12
+ chunk(text: string, documentId: string): DocumentChunk[];
13
+ private splitText;
14
+ private charSplit;
15
+ private mergeWithOverlap;
16
+ private mergeWithOverlapSimple;
17
+ }
18
+ //# sourceMappingURL=recursive-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;gBAE1B,OAAO,EAAE,uBAAuB;IAe5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAOxD,OAAO,CAAC,SAAS;IA+CjB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,gBAAgB;IAwFxB,OAAO,CAAC,sBAAsB;CAwB/B"}
@@ -0,0 +1,161 @@
1
+ import { nanoid } from 'nanoid';
2
+ const DEFAULT_SEPARATORS = ['\n\n', '\n', '. ', ' ', ''];
3
+ export class RecursiveChunker {
4
+ chunkSize;
5
+ chunkOverlap;
6
+ separators;
7
+ constructor(options) {
8
+ if (options.chunkSize <= 0) {
9
+ throw new Error('chunkSize must be a positive number');
10
+ }
11
+ if (options.chunkOverlap < 0) {
12
+ throw new Error('chunkOverlap must be non-negative');
13
+ }
14
+ if (options.chunkOverlap >= options.chunkSize) {
15
+ throw new Error('chunkOverlap must be less than chunkSize');
16
+ }
17
+ this.chunkSize = options.chunkSize;
18
+ this.chunkOverlap = options.chunkOverlap;
19
+ this.separators = options.separators ?? DEFAULT_SEPARATORS;
20
+ }
21
+ chunk(text, documentId) {
22
+ if (text.length === 0)
23
+ return [];
24
+ const texts = this.splitText(text, 0);
25
+ return this.mergeWithOverlap(texts, documentId);
26
+ }
27
+ splitText(text, separatorIndex) {
28
+ if (text.length <= this.chunkSize)
29
+ return [text];
30
+ if (separatorIndex >= this.separators.length) {
31
+ return this.charSplit(text);
32
+ }
33
+ const separator = this.separators[separatorIndex];
34
+ if (separator === '') {
35
+ return this.charSplit(text);
36
+ }
37
+ const parts = text.split(separator);
38
+ if (parts.length === 1) {
39
+ return this.splitText(text, separatorIndex + 1);
40
+ }
41
+ const merged = [];
42
+ let current = '';
43
+ for (const part of parts) {
44
+ if (part.length === 0)
45
+ continue;
46
+ const candidate = current ? current + separator + part : part;
47
+ if (candidate.length <= this.chunkSize) {
48
+ current = candidate;
49
+ }
50
+ else {
51
+ if (current)
52
+ merged.push(current);
53
+ if (part.length > this.chunkSize) {
54
+ const subParts = this.splitText(part, separatorIndex + 1);
55
+ merged.push(...subParts);
56
+ current = '';
57
+ }
58
+ else {
59
+ current = part;
60
+ }
61
+ }
62
+ }
63
+ if (current)
64
+ merged.push(current);
65
+ return merged;
66
+ }
67
+ charSplit(text) {
68
+ const result = [];
69
+ for (let i = 0; i < text.length; i += this.chunkSize) {
70
+ result.push(text.slice(i, i + this.chunkSize));
71
+ }
72
+ return result;
73
+ }
74
+ mergeWithOverlap(texts, documentId) {
75
+ if (this.chunkOverlap === 0) {
76
+ let offset = 0;
77
+ return texts.map((content, i) => {
78
+ const chunk = {
79
+ id: nanoid(),
80
+ documentId,
81
+ content,
82
+ startOffset: offset,
83
+ endOffset: offset + content.length,
84
+ order: i,
85
+ };
86
+ offset += content.length;
87
+ return chunk;
88
+ });
89
+ }
90
+ const joined = texts.join('');
91
+ const chunks = [];
92
+ let order = 0;
93
+ let textIndex = 0;
94
+ let i = 0;
95
+ while (i < texts.length) {
96
+ let content = texts[i];
97
+ let consumed = 1;
98
+ while (i + consumed < texts.length) {
99
+ const next = content + texts[i + consumed];
100
+ if (next.length <= this.chunkSize) {
101
+ content = next;
102
+ consumed++;
103
+ }
104
+ else {
105
+ break;
106
+ }
107
+ }
108
+ const startOffset = joined.indexOf(content, textIndex > 0 ? Math.max(0, textIndex - this.chunkOverlap) : 0);
109
+ chunks.push({
110
+ id: nanoid(),
111
+ documentId,
112
+ content,
113
+ startOffset: startOffset >= 0 ? startOffset : textIndex,
114
+ endOffset: (startOffset >= 0 ? startOffset : textIndex) + content.length,
115
+ order: order++,
116
+ });
117
+ textIndex += content.length;
118
+ const overlapChars = Math.min(this.chunkOverlap, content.length);
119
+ const overlapText = content.slice(content.length - overlapChars);
120
+ i += consumed;
121
+ if (i < texts.length) {
122
+ const remaining = texts.slice(i);
123
+ const withOverlap = overlapText + remaining.join('');
124
+ if (withOverlap.length <= this.chunkSize) {
125
+ chunks.push({
126
+ id: nanoid(),
127
+ documentId,
128
+ content: withOverlap,
129
+ startOffset: textIndex - overlapChars,
130
+ endOffset: textIndex - overlapChars + withOverlap.length,
131
+ order: order++,
132
+ });
133
+ break;
134
+ }
135
+ const reSplit = this.splitText(withOverlap, 0);
136
+ const subChunks = this.mergeWithOverlapSimple(reSplit, documentId, textIndex - overlapChars, order);
137
+ chunks.push(...subChunks);
138
+ break;
139
+ }
140
+ }
141
+ return chunks;
142
+ }
143
+ mergeWithOverlapSimple(texts, documentId, baseOffset, startOrder) {
144
+ const chunks = [];
145
+ let offset = baseOffset;
146
+ let order = startOrder;
147
+ for (const content of texts) {
148
+ chunks.push({
149
+ id: nanoid(),
150
+ documentId,
151
+ content,
152
+ startOffset: offset,
153
+ endOffset: offset + content.length,
154
+ order: order++,
155
+ });
156
+ offset += content.length;
157
+ }
158
+ return chunks;
159
+ }
160
+ }
161
+ //# sourceMappingURL=recursive-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recursive-chunker.js","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AsyncChunker, DocumentChunk, EmbeddingService } from '@cogitator-ai/types';
2
+ export interface SemanticChunkerOptions {
3
+ embeddingService: EmbeddingService;
4
+ breakpointThreshold?: number;
5
+ minChunkSize?: number;
6
+ maxChunkSize?: number;
7
+ }
8
+ export declare class SemanticChunker implements AsyncChunker {
9
+ private readonly embeddingService;
10
+ private readonly breakpointThreshold;
11
+ private readonly minChunkSize;
12
+ private readonly maxChunkSize;
13
+ constructor(options: SemanticChunkerOptions);
14
+ chunk(text: string, documentId: string): Promise<DocumentChunk[]>;
15
+ private mergeSmallGroups;
16
+ private buildChunks;
17
+ private splitLargeGroup;
18
+ }
19
+ //# sourceMappingURL=semantic-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/semantic-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyBD,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,sBAAsB;IAOrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAkCvE,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,WAAW;IA8CnB,OAAO,CAAC,eAAe;CA8DxB"}
@@ -0,0 +1,176 @@
1
+ import { nanoid } from 'nanoid';
2
+ function cosineSimilarity(a, b) {
3
+ const len = Math.min(a.length, b.length);
4
+ let dot = 0;
5
+ let normA = 0;
6
+ let normB = 0;
7
+ for (let i = 0; i < len; i++) {
8
+ dot += a[i] * b[i];
9
+ normA += a[i] * a[i];
10
+ normB += b[i] * b[i];
11
+ }
12
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
13
+ return denom === 0 ? 0 : dot / denom;
14
+ }
15
+ const SENTENCE_SPLIT_RE = /(?<=[.?!])\s+/;
16
+ function splitSentences(text) {
17
+ return text
18
+ .split(SENTENCE_SPLIT_RE)
19
+ .map((s) => s.trim())
20
+ .filter((s) => s.length > 0);
21
+ }
22
+ export class SemanticChunker {
23
+ embeddingService;
24
+ breakpointThreshold;
25
+ minChunkSize;
26
+ maxChunkSize;
27
+ constructor(options) {
28
+ this.embeddingService = options.embeddingService;
29
+ this.breakpointThreshold = options.breakpointThreshold ?? 0.5;
30
+ this.minChunkSize = options.minChunkSize ?? 100;
31
+ this.maxChunkSize = options.maxChunkSize ?? 2000;
32
+ }
33
+ async chunk(text, documentId) {
34
+ if (!text || text.trim().length === 0)
35
+ return [];
36
+ const sentences = splitSentences(text);
37
+ if (sentences.length === 0)
38
+ return [];
39
+ if (sentences.length === 1) {
40
+ return this.buildChunks([sentences], text, documentId);
41
+ }
42
+ const embeddings = await this.embeddingService.embedBatch(sentences);
43
+ const similarities = [];
44
+ for (let i = 0; i < embeddings.length - 1; i++) {
45
+ similarities.push(cosineSimilarity(embeddings[i], embeddings[i + 1]));
46
+ }
47
+ const groups = [];
48
+ let currentGroup = [sentences[0]];
49
+ for (let i = 0; i < similarities.length; i++) {
50
+ if (similarities[i] < this.breakpointThreshold) {
51
+ groups.push(currentGroup);
52
+ currentGroup = [sentences[i + 1]];
53
+ }
54
+ else {
55
+ currentGroup.push(sentences[i + 1]);
56
+ }
57
+ }
58
+ groups.push(currentGroup);
59
+ const merged = this.mergeSmallGroups(groups);
60
+ return this.buildChunks(merged, text, documentId);
61
+ }
62
+ mergeSmallGroups(groups) {
63
+ if (groups.length <= 1)
64
+ return groups;
65
+ const result = [];
66
+ let current = groups[0];
67
+ for (let i = 1; i < groups.length; i++) {
68
+ const currentText = current.join(' ');
69
+ const nextText = groups[i].join(' ');
70
+ const combinedLength = currentText.length + 1 + nextText.length;
71
+ if (currentText.length < this.minChunkSize && combinedLength <= this.maxChunkSize) {
72
+ current = [...current, ...groups[i]];
73
+ }
74
+ else {
75
+ result.push(current);
76
+ current = groups[i];
77
+ }
78
+ }
79
+ if (current.length > 0) {
80
+ const currentText = current.join(' ');
81
+ if (currentText.length < this.minChunkSize && result.length > 0) {
82
+ const last = result[result.length - 1];
83
+ const lastText = last.join(' ');
84
+ if (lastText.length + 1 + currentText.length <= this.maxChunkSize) {
85
+ result[result.length - 1] = [...last, ...current];
86
+ }
87
+ else {
88
+ result.push(current);
89
+ }
90
+ }
91
+ else {
92
+ result.push(current);
93
+ }
94
+ }
95
+ return result;
96
+ }
97
+ buildChunks(groups, originalText, documentId) {
98
+ const chunks = [];
99
+ let searchFrom = 0;
100
+ for (const group of groups) {
101
+ const content = group.join(' ');
102
+ if (content.length <= this.maxChunkSize) {
103
+ const startOffset = originalText.indexOf(group[0], searchFrom);
104
+ const lastSentence = group[group.length - 1];
105
+ const lastStart = originalText.indexOf(lastSentence, startOffset >= 0 ? startOffset : 0);
106
+ const endOffset = lastStart >= 0 ? lastStart + lastSentence.length : startOffset + content.length;
107
+ chunks.push({
108
+ id: nanoid(),
109
+ documentId,
110
+ content,
111
+ startOffset: Math.max(0, startOffset),
112
+ endOffset,
113
+ order: chunks.length,
114
+ });
115
+ searchFrom = endOffset;
116
+ }
117
+ else {
118
+ const subChunks = this.splitLargeGroup(group, originalText, documentId, searchFrom, chunks.length);
119
+ chunks.push(...subChunks);
120
+ if (subChunks.length > 0) {
121
+ searchFrom = subChunks[subChunks.length - 1].endOffset;
122
+ }
123
+ }
124
+ }
125
+ return chunks;
126
+ }
127
+ splitLargeGroup(sentences, originalText, documentId, searchFrom, startOrder) {
128
+ const chunks = [];
129
+ let currentSentences = [];
130
+ let currentLength = 0;
131
+ let order = startOrder;
132
+ let offset = searchFrom;
133
+ for (const sentence of sentences) {
134
+ const newLength = currentLength + (currentSentences.length > 0 ? 1 : 0) + sentence.length;
135
+ if (newLength > this.maxChunkSize && currentSentences.length > 0) {
136
+ const content = currentSentences.join(' ');
137
+ const startOffset = originalText.indexOf(currentSentences[0], offset);
138
+ const lastSentence = currentSentences[currentSentences.length - 1];
139
+ const lastStart = originalText.indexOf(lastSentence, startOffset >= 0 ? startOffset : 0);
140
+ const endOffset = lastStart >= 0 ? lastStart + lastSentence.length : startOffset + content.length;
141
+ chunks.push({
142
+ id: nanoid(),
143
+ documentId,
144
+ content,
145
+ startOffset: Math.max(0, startOffset),
146
+ endOffset,
147
+ order: order++,
148
+ });
149
+ offset = endOffset;
150
+ currentSentences = [sentence];
151
+ currentLength = sentence.length;
152
+ }
153
+ else {
154
+ currentSentences.push(sentence);
155
+ currentLength = newLength;
156
+ }
157
+ }
158
+ if (currentSentences.length > 0) {
159
+ const content = currentSentences.join(' ');
160
+ const startOffset = originalText.indexOf(currentSentences[0], offset);
161
+ const lastSentence = currentSentences[currentSentences.length - 1];
162
+ const lastStart = originalText.indexOf(lastSentence, startOffset >= 0 ? startOffset : 0);
163
+ const endOffset = lastStart >= 0 ? lastStart + lastSentence.length : startOffset + content.length;
164
+ chunks.push({
165
+ id: nanoid(),
166
+ documentId,
167
+ content,
168
+ startOffset: Math.max(0, startOffset),
169
+ endOffset,
170
+ order: order++,
171
+ });
172
+ }
173
+ return chunks;
174
+ }
175
+ }
176
+ //# sourceMappingURL=semantic-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-chunker.js","sourceRoot":"","sources":["../../src/chunkers/semantic-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUhC,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC;AAED,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAE1C,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,KAAK,CAAC,iBAAiB,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,eAAe;IACT,gBAAgB,CAAmB;IACnC,mBAAmB,CAAS;IAC5B,YAAY,CAAS;IACrB,YAAY,CAAS;IAEtC,YAAY,OAA+B;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,GAAG,CAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,UAAkB;QAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAErE,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,IAAI,YAAY,GAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC1B,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;IAEO,gBAAgB,CAAC,MAAkB;QACzC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QAEtC,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;YAEhE,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClF,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CACjB,MAAkB,EAClB,YAAoB,EACpB,UAAkB;QAElB,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEhC,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACxC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC/D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,SAAS,GACb,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;gBAElF,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,MAAM,EAAE;oBACZ,UAAU;oBACV,OAAO;oBACP,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;oBACrC,SAAS;oBACT,KAAK,EAAE,MAAM,CAAC,MAAM;iBACrB,CAAC,CAAC;gBAEH,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CACpC,KAAK,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,MAAM,CAAC,MAAM,CACd,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;gBAC1B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CACrB,SAAmB,EACnB,YAAoB,EACpB,UAAkB,EAClB,UAAkB,EAClB,UAAkB;QAElB,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,gBAAgB,GAAa,EAAE,CAAC;QACpC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,KAAK,GAAG,UAAU,CAAC;QACvB,IAAI,MAAM,GAAG,UAAU,CAAC;QAExB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,aAAa,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE1F,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACtE,MAAM,YAAY,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACnE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzF,MAAM,SAAS,GACb,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;gBAElF,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,MAAM,EAAE;oBACZ,UAAU;oBACV,OAAO;oBACP,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;oBACrC,SAAS;oBACT,KAAK,EAAE,KAAK,EAAE;iBACf,CAAC,CAAC;gBAEH,MAAM,GAAG,SAAS,CAAC;gBACnB,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9B,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAChC,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,MAAM,SAAS,GACb,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;YAElF,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,MAAM,EAAE;gBACZ,UAAU;gBACV,OAAO;gBACP,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;gBACrC,SAAS;gBACT,KAAK,EAAE,KAAK,EAAE;aACf,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export declare const VERSION = "0.1.0";
2
+ export { RAGPipeline, type RAGPipelineDeps } from './rag-pipeline';
3
+ export { RAGPipelineBuilder } from './rag-builder';
4
+ export * from './loaders';
5
+ export * from './chunkers';
6
+ export * from './retrievers';
7
+ export * from './rerankers';
8
+ export * from './schema';
9
+ export { createSearchTool, createIngestTool, ragTools, type RAGTool } from './tools';
10
+ export type { RAGDocument, DocumentChunk, DocumentLoader, Chunker, AsyncChunker, ChunkingConfig, ChunkingStrategy, Retriever, RetrievalConfig, RetrievalStrategy, RetrievalResult, Reranker, RAGPipelineConfig, EmbeddingService, EmbeddingAdapter, } from '@cogitator-ai/types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAErF,YAAY,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,OAAO,EACP,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export const VERSION = '0.1.0';
2
+ export { RAGPipeline } from './rag-pipeline';
3
+ export { RAGPipelineBuilder } from './rag-builder';
4
+ export * from './loaders';
5
+ export * from './chunkers';
6
+ export * from './retrievers';
7
+ export * from './rerankers';
8
+ export * from './schema';
9
+ export { createSearchTool, createIngestTool, ragTools } from './tools';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAwB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { DocumentLoader, RAGDocument } from '@cogitator-ai/types';
2
+ export interface CSVLoaderOptions {
3
+ contentColumn?: string;
4
+ metadataColumns?: string[];
5
+ delimiter?: string;
6
+ }
7
+ export declare class CSVLoader implements DocumentLoader {
8
+ readonly supportedTypes: string[];
9
+ private readonly contentColumn?;
10
+ private readonly metadataColumns?;
11
+ private readonly delimiter?;
12
+ constructor(options?: CSVLoaderOptions);
13
+ load(source: string): Promise<RAGDocument[]>;
14
+ private extractMetadata;
15
+ }
16
+ //# sourceMappingURL=csv-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/csv-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUvE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAU,YAAW,cAAc;IAC9C,QAAQ,CAAC,cAAc,WAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;gBAExB,OAAO,CAAC,EAAE,gBAAgB;IAMhC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA4BlD,OAAO,CAAC,eAAe;CAWxB"}