lance-context 0.1.0 → 1.1.0

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 (237) hide show
  1. package/README.md +232 -23
  2. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  4. package/dist/__tests__/ast-chunker.test.js +307 -0
  5. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +242 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  12. package/dist/__tests__/dashboard/beads.test.js +151 -0
  13. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  14. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/dashboard/index.test.js +116 -0
  17. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  18. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  20. package/dist/__tests__/dashboard/routes.test.js +125 -0
  21. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  22. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  24. package/dist/__tests__/dashboard/server.test.js +75 -0
  25. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  26. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  28. package/dist/__tests__/dashboard/state.test.js +124 -0
  29. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  30. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  31. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  32. package/dist/__tests__/embeddings/factory.test.js +100 -0
  33. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  34. package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
  35. package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
  36. package/dist/__tests__/embeddings/jina.test.js +156 -0
  37. package/dist/__tests__/embeddings/jina.test.js.map +1 -0
  38. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  39. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  40. package/dist/__tests__/embeddings/ollama.test.js +172 -0
  41. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  42. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  43. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  44. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  45. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  46. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  47. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  48. package/dist/__tests__/embeddings/retry.test.js +260 -0
  49. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  50. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  51. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  52. package/dist/__tests__/embeddings/types.test.js +31 -0
  53. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  54. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  55. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  56. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  57. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  58. package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
  59. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  60. package/dist/__tests__/mocks/fetch.mock.js +74 -0
  61. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  62. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  63. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  64. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  65. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  66. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  67. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  68. package/dist/__tests__/search/clustering.test.js +230 -0
  69. package/dist/__tests__/search/clustering.test.js.map +1 -0
  70. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  71. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  72. package/dist/__tests__/search/hybrid-search.test.js +186 -0
  73. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  74. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  75. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  76. package/dist/__tests__/search/indexer.test.js +878 -0
  77. package/dist/__tests__/search/indexer.test.js.map +1 -0
  78. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  79. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  80. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  81. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  82. package/dist/__tests__/setup.d.ts +2 -0
  83. package/dist/__tests__/setup.d.ts.map +1 -0
  84. package/dist/__tests__/setup.js +11 -0
  85. package/dist/__tests__/setup.js.map +1 -0
  86. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  87. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  88. package/dist/__tests__/utils/concurrency.test.js +83 -0
  89. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  90. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  91. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/errors.test.js +136 -0
  93. package/dist/__tests__/utils/errors.test.js.map +1 -0
  94. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  95. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  96. package/dist/__tests__/utils/type-guards.test.js +80 -0
  97. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  98. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  99. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  100. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  101. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  102. package/dist/config.d.ts +122 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +508 -0
  105. package/dist/config.js.map +1 -0
  106. package/dist/dashboard/beads.d.ts +35 -0
  107. package/dist/dashboard/beads.d.ts.map +1 -0
  108. package/dist/dashboard/beads.js +102 -0
  109. package/dist/dashboard/beads.js.map +1 -0
  110. package/dist/dashboard/events.d.ts +46 -0
  111. package/dist/dashboard/events.d.ts.map +1 -0
  112. package/dist/dashboard/events.js +141 -0
  113. package/dist/dashboard/events.js.map +1 -0
  114. package/dist/dashboard/index.d.ts +69 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +93 -0
  117. package/dist/dashboard/index.js.map +1 -0
  118. package/dist/dashboard/routes.d.ts +6 -0
  119. package/dist/dashboard/routes.d.ts.map +1 -0
  120. package/dist/dashboard/routes.js +245 -0
  121. package/dist/dashboard/routes.js.map +1 -0
  122. package/dist/dashboard/server.d.ts +27 -0
  123. package/dist/dashboard/server.d.ts.map +1 -0
  124. package/dist/dashboard/server.js +72 -0
  125. package/dist/dashboard/server.js.map +1 -0
  126. package/dist/dashboard/state.d.ts +125 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +264 -0
  129. package/dist/dashboard/state.js.map +1 -0
  130. package/dist/dashboard/ui.d.ts +6 -0
  131. package/dist/dashboard/ui.d.ts.map +1 -0
  132. package/dist/dashboard/ui.js +1421 -0
  133. package/dist/dashboard/ui.js.map +1 -0
  134. package/dist/embeddings/index.d.ts +20 -2
  135. package/dist/embeddings/index.d.ts.map +1 -1
  136. package/dist/embeddings/index.js +49 -6
  137. package/dist/embeddings/index.js.map +1 -1
  138. package/dist/embeddings/jina.d.ts +9 -0
  139. package/dist/embeddings/jina.d.ts.map +1 -1
  140. package/dist/embeddings/jina.js +42 -2
  141. package/dist/embeddings/jina.js.map +1 -1
  142. package/dist/embeddings/ollama.d.ts +2 -0
  143. package/dist/embeddings/ollama.d.ts.map +1 -1
  144. package/dist/embeddings/ollama.js +21 -5
  145. package/dist/embeddings/ollama.js.map +1 -1
  146. package/dist/embeddings/rate-limiter.d.ts +75 -0
  147. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  148. package/dist/embeddings/rate-limiter.js +145 -0
  149. package/dist/embeddings/rate-limiter.js.map +1 -0
  150. package/dist/embeddings/retry.d.ts +14 -0
  151. package/dist/embeddings/retry.d.ts.map +1 -0
  152. package/dist/embeddings/retry.js +89 -0
  153. package/dist/embeddings/retry.js.map +1 -0
  154. package/dist/embeddings/types.d.ts +56 -2
  155. package/dist/embeddings/types.d.ts.map +1 -1
  156. package/dist/embeddings/types.js +16 -0
  157. package/dist/embeddings/types.js.map +1 -1
  158. package/dist/index.js +1871 -44
  159. package/dist/index.js.map +1 -1
  160. package/dist/memory/index.d.ts +63 -0
  161. package/dist/memory/index.d.ts.map +1 -0
  162. package/dist/memory/index.js +168 -0
  163. package/dist/memory/index.js.map +1 -0
  164. package/dist/search/ast-chunker.d.ts +34 -0
  165. package/dist/search/ast-chunker.d.ts.map +1 -0
  166. package/dist/search/ast-chunker.js +261 -0
  167. package/dist/search/ast-chunker.js.map +1 -0
  168. package/dist/search/clustering.d.ts +77 -0
  169. package/dist/search/clustering.d.ts.map +1 -0
  170. package/dist/search/clustering.js +455 -0
  171. package/dist/search/clustering.js.map +1 -0
  172. package/dist/search/indexer.d.ts +239 -3
  173. package/dist/search/indexer.d.ts.map +1 -1
  174. package/dist/search/indexer.js +941 -45
  175. package/dist/search/indexer.js.map +1 -1
  176. package/dist/search/tree-sitter-chunker.d.ts +69 -0
  177. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  178. package/dist/search/tree-sitter-chunker.js +436 -0
  179. package/dist/search/tree-sitter-chunker.js.map +1 -0
  180. package/dist/symbols/index.d.ts +14 -0
  181. package/dist/symbols/index.d.ts.map +1 -0
  182. package/dist/symbols/index.js +19 -0
  183. package/dist/symbols/index.js.map +1 -0
  184. package/dist/symbols/name-path.d.ts +113 -0
  185. package/dist/symbols/name-path.d.ts.map +1 -0
  186. package/dist/symbols/name-path.js +194 -0
  187. package/dist/symbols/name-path.js.map +1 -0
  188. package/dist/symbols/pattern-search.d.ts +14 -0
  189. package/dist/symbols/pattern-search.d.ts.map +1 -0
  190. package/dist/symbols/pattern-search.js +224 -0
  191. package/dist/symbols/pattern-search.js.map +1 -0
  192. package/dist/symbols/reference-finder.d.ts +38 -0
  193. package/dist/symbols/reference-finder.d.ts.map +1 -0
  194. package/dist/symbols/reference-finder.js +376 -0
  195. package/dist/symbols/reference-finder.js.map +1 -0
  196. package/dist/symbols/symbol-editor.d.ts +81 -0
  197. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  198. package/dist/symbols/symbol-editor.js +257 -0
  199. package/dist/symbols/symbol-editor.js.map +1 -0
  200. package/dist/symbols/symbol-extractor.d.ts +49 -0
  201. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  202. package/dist/symbols/symbol-extractor.js +593 -0
  203. package/dist/symbols/symbol-extractor.js.map +1 -0
  204. package/dist/symbols/symbol-renamer.d.ts +81 -0
  205. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  206. package/dist/symbols/symbol-renamer.js +204 -0
  207. package/dist/symbols/symbol-renamer.js.map +1 -0
  208. package/dist/symbols/types.d.ts +234 -0
  209. package/dist/symbols/types.d.ts.map +1 -0
  210. package/dist/symbols/types.js +106 -0
  211. package/dist/symbols/types.js.map +1 -0
  212. package/dist/utils/concurrency.d.ts +32 -0
  213. package/dist/utils/concurrency.d.ts.map +1 -0
  214. package/dist/utils/concurrency.js +57 -0
  215. package/dist/utils/concurrency.js.map +1 -0
  216. package/dist/utils/errors.d.ts +36 -0
  217. package/dist/utils/errors.d.ts.map +1 -0
  218. package/dist/utils/errors.js +91 -0
  219. package/dist/utils/errors.js.map +1 -0
  220. package/dist/utils/type-guards.d.ts +17 -0
  221. package/dist/utils/type-guards.d.ts.map +1 -0
  222. package/dist/utils/type-guards.js +25 -0
  223. package/dist/utils/type-guards.js.map +1 -0
  224. package/dist/worktree/index.d.ts +6 -0
  225. package/dist/worktree/index.d.ts.map +1 -0
  226. package/dist/worktree/index.js +6 -0
  227. package/dist/worktree/index.js.map +1 -0
  228. package/dist/worktree/types.d.ts +101 -0
  229. package/dist/worktree/types.d.ts.map +1 -0
  230. package/dist/worktree/types.js +6 -0
  231. package/dist/worktree/types.js.map +1 -0
  232. package/dist/worktree/worktree-manager.d.ts +80 -0
  233. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  234. package/dist/worktree/worktree-manager.js +407 -0
  235. package/dist/worktree/worktree-manager.js.map +1 -0
  236. package/package.json +39 -5
  237. package/scripts/postinstall.js +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/dashboard/ui.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;OAwBV,CAAC;AAER;;GAEG;AACH,MAAM,WAAW,GAAG,sBAAsB,kBAAkB,CAAC,onCAAonC,CAAC,EAAE,CAAC;AAErrC;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;gDAMuC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAosB7B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2pB9B,CAAC;AACT,CAAC"}
@@ -1,10 +1,28 @@
1
1
  import type { EmbeddingBackend, EmbeddingConfig } from './types.js';
2
2
  export * from './types.js';
3
+ export { chunkArray } from './types.js';
3
4
  export { OllamaBackend } from './ollama.js';
4
5
  export { JinaBackend } from './jina.js';
6
+ export { RateLimiter, type RateLimiterConfig } from './rate-limiter.js';
5
7
  /**
6
- * Create an embedding backend based on configuration
7
- * Falls back through backends: jina -> local -> ollama
8
+ * Create an embedding backend based on configuration and available credentials.
9
+ *
10
+ * Tries backends in priority order:
11
+ * 1. Jina (if JINA_API_KEY environment variable or config.apiKey is set)
12
+ * 2. Ollama (local fallback, requires Ollama to be running)
13
+ *
14
+ * @param config - Optional configuration to customize the backend
15
+ * @returns A promise resolving to an initialized embedding backend
16
+ * @throws Error if no backend is available (no API keys and Ollama not running)
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // Use automatic backend selection
21
+ * const backend = await createEmbeddingBackend();
22
+ *
23
+ * // Force a specific model
24
+ * const backend = await createEmbeddingBackend({ model: 'jina-embeddings-v3' });
25
+ * ```
8
26
  */
9
27
  export declare function createEmbeddingBackend(config?: Partial<EmbeddingConfig>): Promise<EmbeddingBackend>;
10
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIpE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAgC3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIpE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA4D3B"}
@@ -1,24 +1,67 @@
1
1
  import { OllamaBackend } from './ollama.js';
2
2
  import { JinaBackend } from './jina.js';
3
3
  export * from './types.js';
4
+ export { chunkArray } from './types.js';
4
5
  export { OllamaBackend } from './ollama.js';
5
6
  export { JinaBackend } from './jina.js';
7
+ export { RateLimiter } from './rate-limiter.js';
6
8
  /**
7
- * Create an embedding backend based on configuration
8
- * Falls back through backends: jina -> local -> ollama
9
+ * Create an embedding backend based on configuration and available credentials.
10
+ *
11
+ * Tries backends in priority order:
12
+ * 1. Jina (if JINA_API_KEY environment variable or config.apiKey is set)
13
+ * 2. Ollama (local fallback, requires Ollama to be running)
14
+ *
15
+ * @param config - Optional configuration to customize the backend
16
+ * @returns A promise resolving to an initialized embedding backend
17
+ * @throws Error if no backend is available (no API keys and Ollama not running)
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // Use automatic backend selection
22
+ * const backend = await createEmbeddingBackend();
23
+ *
24
+ * // Force a specific model
25
+ * const backend = await createEmbeddingBackend({ model: 'jina-embeddings-v3' });
26
+ * ```
9
27
  */
10
28
  export async function createEmbeddingBackend(config) {
29
+ const jinaKey = config?.apiKey || process.env.JINA_API_KEY;
30
+ const ollamaUrl = config?.baseUrl || process.env.OLLAMA_URL || 'http://localhost:11434';
31
+ const ollamaModel = config?.model || 'nomic-embed-text';
32
+ // If explicit backend is specified, use only that backend
33
+ if (config?.backend && config.backend !== 'local') {
34
+ if (config.backend === 'jina') {
35
+ if (!jinaKey) {
36
+ throw new Error('Jina backend requested but no API key available. Set JINA_API_KEY or provide apiKey in config.');
37
+ }
38
+ const backend = new JinaBackend({ backend: 'jina', apiKey: jinaKey, ...config });
39
+ await backend.initialize();
40
+ console.error(`[lance-context] Using jina embedding backend (explicitly configured)`);
41
+ return backend;
42
+ }
43
+ else if (config.backend === 'ollama') {
44
+ const backend = new OllamaBackend({
45
+ backend: 'ollama',
46
+ baseUrl: ollamaUrl,
47
+ model: ollamaModel,
48
+ });
49
+ await backend.initialize();
50
+ console.error(`[lance-context] Using ollama embedding backend (explicitly configured)`);
51
+ return backend;
52
+ }
53
+ }
54
+ // Auto-select: try backends in priority order
11
55
  const backends = [];
12
56
  // Priority 1: Jina (if API key available)
13
- const jinaKey = config?.apiKey || process.env.JINA_API_KEY;
14
57
  if (jinaKey) {
15
58
  backends.push(() => new JinaBackend({ backend: 'jina', apiKey: jinaKey, ...config }));
16
59
  }
17
60
  // Priority 2: Ollama (local fallback)
18
61
  backends.push(() => new OllamaBackend({
19
62
  backend: 'ollama',
20
- baseUrl: config?.baseUrl || process.env.OLLAMA_URL || 'http://localhost:11434',
21
- model: config?.model || 'nomic-embed-text',
63
+ baseUrl: ollamaUrl,
64
+ model: ollamaModel,
22
65
  }));
23
66
  // Try each backend until one works
24
67
  for (const createBackend of backends) {
@@ -32,6 +75,6 @@ export async function createEmbeddingBackend(config) {
32
75
  console.error(`[lance-context] Backend failed: ${error}`);
33
76
  }
34
77
  }
35
- throw new Error('No embedding backend available. Install Ollama or set JINA_API_KEY.');
78
+ throw new Error('No embedding backend available. Set JINA_API_KEY or install Ollama.');
36
79
  }
37
80
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAiC;IAEjC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IAEnD,0CAA0C;IAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CACX,GAAG,EAAE,CACH,IAAI,aAAa,CAAC;QAChB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,wBAAwB;QAC9E,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,kBAAkB;KAC3C,CAAC,CACL,CAAC;IAEF,mCAAmC;IACnC,KAAK,MAAM,aAAa,IAAI,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;YAChC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,IAAI,oBAAoB,CAAC,CAAC;YACzE,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { EmbeddingBackend, EmbeddingConfig } from './types.js';
2
2
  /**
3
3
  * Jina AI embedding backend
4
4
  * Uses Jina's free API tier for high-quality embeddings
5
+ * Includes client-side rate limiting to prevent API throttling
5
6
  */
6
7
  export declare class JinaBackend implements EmbeddingBackend {
7
8
  name: string;
@@ -9,10 +10,18 @@ export declare class JinaBackend implements EmbeddingBackend {
9
10
  private apiKey;
10
11
  private baseUrl;
11
12
  private dimensions;
13
+ private rateLimiter;
14
+ private batchSize;
12
15
  constructor(config: EmbeddingConfig);
13
16
  initialize(): Promise<void>;
14
17
  embed(text: string): Promise<number[]>;
15
18
  embedBatch(texts: string[]): Promise<number[][]>;
19
+ /**
20
+ * Embed a batch of texts in a single API request (no chunking).
21
+ * Used internally by embedBatch.
22
+ */
23
+ private embedBatchDirect;
16
24
  getDimensions(): number;
25
+ getModel(): string;
17
26
  }
18
27
  //# sourceMappingURL=jina.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jina.d.ts","sourceRoot":"","sources":["../../src/embeddings/jina.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,qBAAa,WAAY,YAAW,gBAAgB;IAClD,IAAI,SAAU;IACd,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAAQ;gBAEd,MAAM,EAAE,eAAe;IAQ7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAsBtD,aAAa,IAAI,MAAM;CAGxB"}
1
+ {"version":3,"file":"jina.d.ts","sourceRoot":"","sources":["../../src/embeddings/jina.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQpE;;;;GAIG;AACH,qBAAa,WAAY,YAAW,gBAAgB;IAClD,IAAI,SAAU;IACd,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe;IAe7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAkBtD;;;OAGG;YACW,gBAAgB;IA0B9B,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAGnB"}
@@ -1,6 +1,12 @@
1
+ import { chunkArray } from './types.js';
2
+ import { fetchWithRetry } from './retry.js';
3
+ import { RateLimiter } from './rate-limiter.js';
4
+ /** Default batch size for Jina API requests */
5
+ const DEFAULT_BATCH_SIZE = 100;
1
6
  /**
2
7
  * Jina AI embedding backend
3
8
  * Uses Jina's free API tier for high-quality embeddings
9
+ * Includes client-side rate limiting to prevent API throttling
4
10
  */
5
11
  export class JinaBackend {
6
12
  name = 'jina';
@@ -8,12 +14,20 @@ export class JinaBackend {
8
14
  apiKey;
9
15
  baseUrl = 'https://api.jina.ai/v1/embeddings';
10
16
  dimensions = 1024; // jina-embeddings-v3 default
17
+ rateLimiter;
18
+ batchSize;
11
19
  constructor(config) {
12
20
  this.model = config.model || 'jina-embeddings-v3';
13
21
  if (!config.apiKey) {
14
22
  throw new Error('Jina API key is required. Set JINA_API_KEY environment variable.');
15
23
  }
16
24
  this.apiKey = config.apiKey;
25
+ this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
26
+ // Initialize rate limiter with configurable or default values
27
+ this.rateLimiter = new RateLimiter({
28
+ requestsPerSecond: config.rateLimitRps ?? 5,
29
+ burstCapacity: config.rateLimitBurst ?? 10,
30
+ });
17
31
  }
18
32
  async initialize() {
19
33
  // Test API key with a small request
@@ -25,7 +39,9 @@ export class JinaBackend {
25
39
  }
26
40
  }
27
41
  async embed(text) {
28
- const response = await fetch(this.baseUrl, {
42
+ // Acquire a rate limit token before making the request
43
+ await this.rateLimiter.acquire();
44
+ const response = await fetchWithRetry(this.baseUrl, {
29
45
  method: 'POST',
30
46
  headers: {
31
47
  'Content-Type': 'application/json',
@@ -44,7 +60,28 @@ export class JinaBackend {
44
60
  return data.data[0].embedding;
45
61
  }
46
62
  async embedBatch(texts) {
47
- const response = await fetch(this.baseUrl, {
63
+ // For small batches, process directly
64
+ if (texts.length <= this.batchSize) {
65
+ return this.embedBatchDirect(texts);
66
+ }
67
+ // For large batches, chunk and process sequentially
68
+ const chunks = chunkArray(texts, this.batchSize);
69
+ const results = [];
70
+ for (const chunk of chunks) {
71
+ const chunkResults = await this.embedBatchDirect(chunk);
72
+ results.push(...chunkResults);
73
+ }
74
+ return results;
75
+ }
76
+ /**
77
+ * Embed a batch of texts in a single API request (no chunking).
78
+ * Used internally by embedBatch.
79
+ */
80
+ async embedBatchDirect(texts) {
81
+ // Acquire a rate limit token before making the request
82
+ // Note: batch requests count as one API call
83
+ await this.rateLimiter.acquire();
84
+ const response = await fetchWithRetry(this.baseUrl, {
48
85
  method: 'POST',
49
86
  headers: {
50
87
  'Content-Type': 'application/json',
@@ -65,5 +102,8 @@ export class JinaBackend {
65
102
  getDimensions() {
66
103
  return this.dimensions;
67
104
  }
105
+ getModel() {
106
+ return this.model;
107
+ }
68
108
  }
69
109
  //# sourceMappingURL=jina.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jina.js","sourceRoot":"","sources":["../../src/embeddings/jina.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACtB,IAAI,GAAG,MAAM,CAAC;IACN,KAAK,CAAS;IACd,MAAM,CAAS;IACf,OAAO,GAAG,mCAAmC,CAAC;IAC9C,UAAU,GAAG,IAAI,CAAC,CAAC,6BAA6B;IAExD,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,oBAAoB,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,CAAC,IAAI,CAAC;aACd,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6C,CAAC;QACjF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,KAAK;aACb,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6C,CAAC;QACjF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"jina.js","sourceRoot":"","sources":["../../src/embeddings/jina.ts"],"names":[],"mappings":"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"}
@@ -8,10 +8,12 @@ export declare class OllamaBackend implements EmbeddingBackend {
8
8
  private model;
9
9
  private baseUrl;
10
10
  private dimensions;
11
+ private batchSize;
11
12
  constructor(config: EmbeddingConfig);
12
13
  initialize(): Promise<void>;
13
14
  embed(text: string): Promise<number[]>;
14
15
  embedBatch(texts: string[]): Promise<number[][]>;
15
16
  getDimensions(): number;
17
+ getModel(): string;
16
18
  }
17
19
  //# sourceMappingURL=ollama.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAO;gBAEb,MAAM,EAAE,eAAe;IAK7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAMtD,aAAa,IAAI,MAAM;CAGxB"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOpE;;;GAGG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe;IAM7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAetD,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAGnB"}
@@ -1,3 +1,7 @@
1
+ import { chunkArray } from './types.js';
2
+ import { fetchWithRetry } from './retry.js';
3
+ /** Default parallel batch size for Ollama (concurrent requests) */
4
+ const DEFAULT_BATCH_SIZE = 10;
1
5
  /**
2
6
  * Ollama embedding backend
3
7
  * Uses local Ollama server for embeddings
@@ -7,14 +11,16 @@ export class OllamaBackend {
7
11
  model;
8
12
  baseUrl;
9
13
  dimensions = 768; // nomic-embed-text default
14
+ batchSize;
10
15
  constructor(config) {
11
16
  this.model = config.model || 'nomic-embed-text';
12
17
  this.baseUrl = config.baseUrl || 'http://localhost:11434';
18
+ this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
13
19
  }
14
20
  async initialize() {
15
21
  // Test connection
16
22
  try {
17
- const response = await fetch(`${this.baseUrl}/api/tags`);
23
+ const response = await fetchWithRetry(`${this.baseUrl}/api/tags`, {});
18
24
  if (!response.ok) {
19
25
  throw new Error(`Ollama server returned ${response.status}`);
20
26
  }
@@ -24,7 +30,7 @@ export class OllamaBackend {
24
30
  }
25
31
  }
26
32
  async embed(text) {
27
- const response = await fetch(`${this.baseUrl}/api/embeddings`, {
33
+ const response = await fetchWithRetry(`${this.baseUrl}/api/embeddings`, {
28
34
  method: 'POST',
29
35
  headers: { 'Content-Type': 'application/json' },
30
36
  body: JSON.stringify({
@@ -39,12 +45,22 @@ export class OllamaBackend {
39
45
  return data.embedding;
40
46
  }
41
47
  async embedBatch(texts) {
42
- // Ollama doesn't have native batch, so we parallelize
43
- const embeddings = await Promise.all(texts.map((t) => this.embed(t)));
44
- return embeddings;
48
+ // Ollama doesn't have native batch API, so we parallelize with controlled concurrency
49
+ // to avoid overwhelming the server with too many concurrent requests
50
+ const chunks = chunkArray(texts, this.batchSize);
51
+ const results = [];
52
+ for (const chunk of chunks) {
53
+ // Process each chunk in parallel, but chunks sequentially
54
+ const chunkResults = await Promise.all(chunk.map((t) => this.embed(t)));
55
+ results.push(...chunkResults);
56
+ }
57
+ return results;
45
58
  }
46
59
  getDimensions() {
47
60
  return this.dimensions;
48
61
  }
62
+ getModel() {
63
+ return this.model;
64
+ }
49
65
  }
50
66
  //# sourceMappingURL=ollama.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB,IAAI,GAAG,QAAQ,CAAC;IACR,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,UAAU,GAAG,GAAG,CAAC,CAAC,2BAA2B;IAErD,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,kBAAkB,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,wBAAwB,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI;aACb,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,sDAAsD;QACtD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB,IAAI,GAAG,QAAQ,CAAC;IACR,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,UAAU,GAAG,GAAG,CAAC,CAAC,2BAA2B;IAC7C,SAAS,CAAS;IAE1B,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,kBAAkB,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,wBAAwB,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;YACtE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI;aACb,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,sFAAsF;QACtF,qEAAqE;QACrE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,0DAA0D;YAC1D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Token bucket rate limiter for API requests
3
+ * Implements a classic token bucket algorithm with configurable rate and burst capacity
4
+ */
5
+ /**
6
+ * Configuration options for the rate limiter
7
+ */
8
+ export interface RateLimiterConfig {
9
+ /** Maximum requests per second (tokens added per second) */
10
+ requestsPerSecond: number;
11
+ /** Maximum burst capacity (bucket size) */
12
+ burstCapacity?: number;
13
+ }
14
+ /**
15
+ * Default rate limiter configuration
16
+ * Jina free tier allows ~500 RPM, so we use a conservative 5 RPS
17
+ */
18
+ export declare const DEFAULT_RATE_LIMITER_CONFIG: Required<RateLimiterConfig>;
19
+ /**
20
+ * Token bucket rate limiter
21
+ *
22
+ * The token bucket algorithm works as follows:
23
+ * - Tokens are added to the bucket at a fixed rate (requestsPerSecond)
24
+ * - Each request consumes one token
25
+ * - If no tokens are available, the request waits until one becomes available
26
+ * - The bucket has a maximum capacity (burstCapacity) to allow short bursts
27
+ */
28
+ export declare class RateLimiter {
29
+ private tokens;
30
+ private lastRefillTime;
31
+ private readonly requestsPerSecond;
32
+ private readonly burstCapacity;
33
+ private pendingQueue;
34
+ private scheduledTimeout;
35
+ constructor(config?: RateLimiterConfig);
36
+ /**
37
+ * Refill tokens based on elapsed time
38
+ */
39
+ private refillTokens;
40
+ /**
41
+ * Calculate wait time until a token is available
42
+ */
43
+ private getWaitTimeMs;
44
+ /**
45
+ * Schedule processing of the queue if not already scheduled
46
+ */
47
+ private scheduleProcessing;
48
+ /**
49
+ * Process the pending queue
50
+ */
51
+ private processQueue;
52
+ /**
53
+ * Acquire a token, waiting if necessary
54
+ * Returns a promise that resolves when a token is acquired
55
+ */
56
+ acquire(): Promise<void>;
57
+ /**
58
+ * Try to acquire a token without waiting
59
+ * Returns true if a token was acquired, false otherwise
60
+ */
61
+ tryAcquire(): boolean;
62
+ /**
63
+ * Get the current number of available tokens
64
+ */
65
+ getAvailableTokens(): number;
66
+ /**
67
+ * Get the current queue length
68
+ */
69
+ getQueueLength(): number;
70
+ /**
71
+ * Reset the rate limiter to initial state
72
+ */
73
+ reset(): void;
74
+ }
75
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/embeddings/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,iBAAiB,CAGnE,CAAC;AAEF;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,gBAAgB,CAA8C;gBAE1D,MAAM,CAAC,EAAE,iBAAiB;IAQtC;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAe9B;;;OAGG;IACH,UAAU,IAAI,OAAO;IAWrB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAK5B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;CAcd"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Token bucket rate limiter for API requests
3
+ * Implements a classic token bucket algorithm with configurable rate and burst capacity
4
+ */
5
+ /**
6
+ * Default rate limiter configuration
7
+ * Jina free tier allows ~500 RPM, so we use a conservative 5 RPS
8
+ */
9
+ export const DEFAULT_RATE_LIMITER_CONFIG = {
10
+ requestsPerSecond: 5,
11
+ burstCapacity: 10,
12
+ };
13
+ /**
14
+ * Token bucket rate limiter
15
+ *
16
+ * The token bucket algorithm works as follows:
17
+ * - Tokens are added to the bucket at a fixed rate (requestsPerSecond)
18
+ * - Each request consumes one token
19
+ * - If no tokens are available, the request waits until one becomes available
20
+ * - The bucket has a maximum capacity (burstCapacity) to allow short bursts
21
+ */
22
+ export class RateLimiter {
23
+ tokens;
24
+ lastRefillTime;
25
+ requestsPerSecond;
26
+ burstCapacity;
27
+ pendingQueue = [];
28
+ scheduledTimeout = null;
29
+ constructor(config) {
30
+ const opts = { ...DEFAULT_RATE_LIMITER_CONFIG, ...config };
31
+ this.requestsPerSecond = opts.requestsPerSecond;
32
+ this.burstCapacity = opts.burstCapacity;
33
+ this.tokens = this.burstCapacity; // Start with full bucket
34
+ this.lastRefillTime = Date.now();
35
+ }
36
+ /**
37
+ * Refill tokens based on elapsed time
38
+ */
39
+ refillTokens() {
40
+ const now = Date.now();
41
+ const elapsedSeconds = (now - this.lastRefillTime) / 1000;
42
+ const tokensToAdd = elapsedSeconds * this.requestsPerSecond;
43
+ this.tokens = Math.min(this.burstCapacity, this.tokens + tokensToAdd);
44
+ this.lastRefillTime = now;
45
+ }
46
+ /**
47
+ * Calculate wait time until a token is available
48
+ */
49
+ getWaitTimeMs() {
50
+ if (this.tokens >= 1) {
51
+ return 0;
52
+ }
53
+ // Calculate time until we have at least 1 token
54
+ const tokensNeeded = 1 - this.tokens;
55
+ const secondsToWait = tokensNeeded / this.requestsPerSecond;
56
+ return Math.ceil(secondsToWait * 1000);
57
+ }
58
+ /**
59
+ * Schedule processing of the queue if not already scheduled
60
+ */
61
+ scheduleProcessing() {
62
+ if (this.scheduledTimeout !== null || this.pendingQueue.length === 0) {
63
+ return;
64
+ }
65
+ const waitTime = this.getWaitTimeMs();
66
+ this.scheduledTimeout = setTimeout(() => {
67
+ this.scheduledTimeout = null;
68
+ this.refillTokens();
69
+ this.processQueue();
70
+ // If there are still pending requests, schedule another processing
71
+ if (this.pendingQueue.length > 0) {
72
+ this.scheduleProcessing();
73
+ }
74
+ }, waitTime);
75
+ }
76
+ /**
77
+ * Process the pending queue
78
+ */
79
+ processQueue() {
80
+ while (this.pendingQueue.length > 0 && this.tokens >= 1) {
81
+ this.tokens -= 1;
82
+ const resolve = this.pendingQueue.shift();
83
+ resolve();
84
+ }
85
+ }
86
+ /**
87
+ * Acquire a token, waiting if necessary
88
+ * Returns a promise that resolves when a token is acquired
89
+ */
90
+ async acquire() {
91
+ this.refillTokens();
92
+ if (this.tokens >= 1) {
93
+ this.tokens -= 1;
94
+ return;
95
+ }
96
+ // Need to wait for a token
97
+ return new Promise((resolve) => {
98
+ this.pendingQueue.push(resolve);
99
+ this.scheduleProcessing();
100
+ });
101
+ }
102
+ /**
103
+ * Try to acquire a token without waiting
104
+ * Returns true if a token was acquired, false otherwise
105
+ */
106
+ tryAcquire() {
107
+ this.refillTokens();
108
+ if (this.tokens >= 1) {
109
+ this.tokens -= 1;
110
+ return true;
111
+ }
112
+ return false;
113
+ }
114
+ /**
115
+ * Get the current number of available tokens
116
+ */
117
+ getAvailableTokens() {
118
+ this.refillTokens();
119
+ return Math.floor(this.tokens);
120
+ }
121
+ /**
122
+ * Get the current queue length
123
+ */
124
+ getQueueLength() {
125
+ return this.pendingQueue.length;
126
+ }
127
+ /**
128
+ * Reset the rate limiter to initial state
129
+ */
130
+ reset() {
131
+ this.tokens = this.burstCapacity;
132
+ this.lastRefillTime = Date.now();
133
+ // Clear any scheduled timeout
134
+ if (this.scheduledTimeout !== null) {
135
+ clearTimeout(this.scheduledTimeout);
136
+ this.scheduledTimeout = null;
137
+ }
138
+ // Clear pending queue
139
+ while (this.pendingQueue.length > 0) {
140
+ const resolve = this.pendingQueue.shift();
141
+ resolve();
142
+ }
143
+ }
144
+ }
145
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/embeddings/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Retry configuration options
3
+ */
4
+ export interface RetryOptions {
5
+ maxRetries?: number;
6
+ baseDelayMs?: number;
7
+ maxDelayMs?: number;
8
+ maxResponseSizeBytes?: number;
9
+ }
10
+ /**
11
+ * Execute a fetch request with exponential backoff retry
12
+ */
13
+ export declare function fetchWithRetry(url: string, options: RequestInit, retryOptions?: RetryOptions): Promise<Response>;
14
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/embeddings/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AA4DD;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,QAAQ,CAAC,CA6CnB"}