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.
- package/README.md +232 -23
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +100 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
- package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/jina.test.js +156 -0
- package/dist/__tests__/embeddings/jina.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +172 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +260 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +74 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +186 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +878 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +122 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +508 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +46 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +141 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +245 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +125 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +264 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +1421 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/index.d.ts +20 -2
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +49 -6
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/jina.d.ts +9 -0
- package/dist/embeddings/jina.d.ts.map +1 -1
- package/dist/embeddings/jina.js +42 -2
- package/dist/embeddings/jina.js.map +1 -1
- package/dist/embeddings/ollama.d.ts +2 -0
- package/dist/embeddings/ollama.d.ts.map +1 -1
- package/dist/embeddings/ollama.js +21 -5
- package/dist/embeddings/ollama.js.map +1 -1
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +14 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +89 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +56 -2
- package/dist/embeddings/types.d.ts.map +1 -1
- package/dist/embeddings/types.js +16 -0
- package/dist/embeddings/types.js.map +1 -1
- package/dist/index.js +1871 -44
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +34 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +261 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +239 -3
- package/dist/search/indexer.d.ts.map +1 -1
- package/dist/search/indexer.js +941 -45
- package/dist/search/indexer.js.map +1 -1
- package/dist/search/tree-sitter-chunker.d.ts +69 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +436 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +39 -5
- 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
|
-
*
|
|
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;
|
|
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"}
|
package/dist/embeddings/index.js
CHANGED
|
@@ -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
|
-
*
|
|
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:
|
|
21
|
-
model:
|
|
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.
|
|
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;
|
|
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;
|
|
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"}
|
package/dist/embeddings/jina.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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":"
|
|
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;
|
|
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
|
|
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
|
|
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
|
-
|
|
44
|
-
|
|
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":"
|
|
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"}
|