bigtool-ts 0.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 (116) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +641 -0
  4. package/dist/adapters/agent-protocol.d.ts +149 -0
  5. package/dist/adapters/agent-protocol.d.ts.map +1 -0
  6. package/dist/adapters/agent-protocol.js +133 -0
  7. package/dist/adapters/agent-protocol.js.map +1 -0
  8. package/dist/adapters/index.d.ts +39 -0
  9. package/dist/adapters/index.d.ts.map +1 -0
  10. package/dist/adapters/index.js +42 -0
  11. package/dist/adapters/index.js.map +1 -0
  12. package/dist/adapters/inngest.d.ts +234 -0
  13. package/dist/adapters/inngest.d.ts.map +1 -0
  14. package/dist/adapters/inngest.js +276 -0
  15. package/dist/adapters/inngest.js.map +1 -0
  16. package/dist/adapters/mastra.d.ts +201 -0
  17. package/dist/adapters/mastra.d.ts.map +1 -0
  18. package/dist/adapters/mastra.js +250 -0
  19. package/dist/adapters/mastra.js.map +1 -0
  20. package/dist/adapters/types.d.ts +42 -0
  21. package/dist/adapters/types.d.ts.map +1 -0
  22. package/dist/adapters/types.js +6 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/adapters/vercel-ai.d.ts +176 -0
  25. package/dist/adapters/vercel-ai.d.ts.map +1 -0
  26. package/dist/adapters/vercel-ai.js +244 -0
  27. package/dist/adapters/vercel-ai.js.map +1 -0
  28. package/dist/catalog/index.d.ts +177 -0
  29. package/dist/catalog/index.d.ts.map +1 -0
  30. package/dist/catalog/index.js +244 -0
  31. package/dist/catalog/index.js.map +1 -0
  32. package/dist/graph/agent.d.ts +214 -0
  33. package/dist/graph/agent.d.ts.map +1 -0
  34. package/dist/graph/agent.js +196 -0
  35. package/dist/graph/agent.js.map +1 -0
  36. package/dist/graph/index.d.ts +5 -0
  37. package/dist/graph/index.d.ts.map +1 -0
  38. package/dist/graph/index.js +4 -0
  39. package/dist/graph/index.js.map +1 -0
  40. package/dist/graph/nodes.d.ts +100 -0
  41. package/dist/graph/nodes.d.ts.map +1 -0
  42. package/dist/graph/nodes.js +190 -0
  43. package/dist/graph/nodes.js.map +1 -0
  44. package/dist/graph/search-tool.d.ts +34 -0
  45. package/dist/graph/search-tool.d.ts.map +1 -0
  46. package/dist/graph/search-tool.js +54 -0
  47. package/dist/graph/search-tool.js.map +1 -0
  48. package/dist/graph/state.d.ts +26 -0
  49. package/dist/graph/state.d.ts.map +1 -0
  50. package/dist/graph/state.js +29 -0
  51. package/dist/graph/state.js.map +1 -0
  52. package/dist/index.d.ts +69 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +85 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/loader/index.d.ts +172 -0
  57. package/dist/loader/index.d.ts.map +1 -0
  58. package/dist/loader/index.js +179 -0
  59. package/dist/loader/index.js.map +1 -0
  60. package/dist/loader/loader.d.ts +114 -0
  61. package/dist/loader/loader.d.ts.map +1 -0
  62. package/dist/loader/loader.js +185 -0
  63. package/dist/loader/loader.js.map +1 -0
  64. package/dist/search/cache.d.ts +76 -0
  65. package/dist/search/cache.d.ts.map +1 -0
  66. package/dist/search/cache.js +135 -0
  67. package/dist/search/cache.js.map +1 -0
  68. package/dist/search/index.d.ts +63 -0
  69. package/dist/search/index.d.ts.map +1 -0
  70. package/dist/search/index.js +122 -0
  71. package/dist/search/index.js.map +1 -0
  72. package/dist/search/normalize.d.ts +104 -0
  73. package/dist/search/normalize.d.ts.map +1 -0
  74. package/dist/search/normalize.js +211 -0
  75. package/dist/search/normalize.js.map +1 -0
  76. package/dist/search/orama.d.ts +256 -0
  77. package/dist/search/orama.d.ts.map +1 -0
  78. package/dist/search/orama.js +511 -0
  79. package/dist/search/orama.js.map +1 -0
  80. package/dist/search/types.d.ts +96 -0
  81. package/dist/search/types.d.ts.map +1 -0
  82. package/dist/search/types.js +8 -0
  83. package/dist/search/types.js.map +1 -0
  84. package/dist/sources/dynamic.d.ts +200 -0
  85. package/dist/sources/dynamic.d.ts.map +1 -0
  86. package/dist/sources/dynamic.js +194 -0
  87. package/dist/sources/dynamic.js.map +1 -0
  88. package/dist/sources/index.d.ts +11 -0
  89. package/dist/sources/index.d.ts.map +1 -0
  90. package/dist/sources/index.js +14 -0
  91. package/dist/sources/index.js.map +1 -0
  92. package/dist/sources/local.d.ts +128 -0
  93. package/dist/sources/local.d.ts.map +1 -0
  94. package/dist/sources/local.js +155 -0
  95. package/dist/sources/local.js.map +1 -0
  96. package/dist/sources/mcp.d.ts +438 -0
  97. package/dist/sources/mcp.d.ts.map +1 -0
  98. package/dist/sources/mcp.js +438 -0
  99. package/dist/sources/mcp.js.map +1 -0
  100. package/dist/sources/types.d.ts +16 -0
  101. package/dist/sources/types.d.ts.map +1 -0
  102. package/dist/sources/types.js +7 -0
  103. package/dist/sources/types.js.map +1 -0
  104. package/dist/sources/with-metadata.d.ts +7 -0
  105. package/dist/sources/with-metadata.d.ts.map +1 -0
  106. package/dist/sources/with-metadata.js +7 -0
  107. package/dist/sources/with-metadata.js.map +1 -0
  108. package/dist/types/index.d.ts +7 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +8 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/types.d.ts +700 -0
  113. package/dist/types.d.ts.map +1 -0
  114. package/dist/types.js +97 -0
  115. package/dist/types.js.map +1 -0
  116. package/package.json +118 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Score Normalization Utilities
3
+ *
4
+ * Different search algorithms produce scores in different ranges:
5
+ * - BM25: 0 to ~25+ (unbounded, depends on corpus)
6
+ * - Cosine similarity: -1 to 1 (for vectors)
7
+ * - Orama vector search: 0 to 1 (already normalized)
8
+ *
9
+ * We normalize everything to 0-1 for consistent thresholding.
10
+ */
11
+ // ═══════════════════════════════════════════════════════════════════════════
12
+ // BM25 Score Normalization
13
+ // ═══════════════════════════════════════════════════════════════════════════
14
+ /**
15
+ * Normalize BM25 scores to 0-1 range.
16
+ *
17
+ * Uses min-max normalization within the result set.
18
+ * If all scores are the same, returns 1.0 for all.
19
+ *
20
+ * @param scores - Array of raw BM25 scores
21
+ * @returns Array of normalized scores (0-1)
22
+ */
23
+ export function normalizeBM25Scores(scores) {
24
+ if (scores.length === 0)
25
+ return [];
26
+ if (scores.length === 1)
27
+ return [1.0];
28
+ const min = Math.min(...scores);
29
+ const max = Math.max(...scores);
30
+ const range = max - min;
31
+ if (range === 0) {
32
+ // All scores are the same
33
+ return scores.map(() => 1.0);
34
+ }
35
+ return scores.map((score) => (score - min) / range);
36
+ }
37
+ /**
38
+ * Normalize a single BM25 score using a sigmoid function.
39
+ * This is useful when you don't have the full result set.
40
+ *
41
+ * The sigmoid maps scores to (0, 1):
42
+ * - Low scores (~0-2) map to ~0.0-0.5
43
+ * - Medium scores (~2-10) map to ~0.5-0.9
44
+ * - High scores (~10+) map to ~0.9-1.0
45
+ *
46
+ * @param score - Raw BM25 score
47
+ * @param k - Steepness parameter (default: 5)
48
+ * @returns Normalized score (0-1)
49
+ */
50
+ export function normalizeBM25Sigmoid(score, k = 5) {
51
+ // Sigmoid: 1 / (1 + e^(-x/k))
52
+ // Shifted so that 0 input gives ~0.5 output
53
+ return 1 / (1 + Math.exp(-score / k));
54
+ }
55
+ // ═══════════════════════════════════════════════════════════════════════════
56
+ // Vector Similarity Normalization
57
+ // ═══════════════════════════════════════════════════════════════════════════
58
+ /**
59
+ * Normalize cosine similarity from [-1, 1] to [0, 1]
60
+ *
61
+ * @param similarity - Cosine similarity value (-1 to 1)
62
+ * @returns Normalized score (0-1)
63
+ */
64
+ export function normalizeCosineSimilarity(similarity) {
65
+ // Map [-1, 1] to [0, 1]
66
+ return (similarity + 1) / 2;
67
+ }
68
+ /**
69
+ * Orama already returns vector scores in 0-1 range (distance-based).
70
+ * This function clamps to ensure valid range.
71
+ *
72
+ * @param score - Orama vector search score
73
+ * @returns Clamped score (0-1)
74
+ */
75
+ export function normalizeOramaVectorScore(score) {
76
+ return Math.max(0, Math.min(1, score));
77
+ }
78
+ // ═══════════════════════════════════════════════════════════════════════════
79
+ // Hybrid Score Combination
80
+ // ═══════════════════════════════════════════════════════════════════════════
81
+ /**
82
+ * Combine BM25 and vector scores using weighted average.
83
+ *
84
+ * @param bm25Score - Normalized BM25 score (0-1)
85
+ * @param vectorScore - Normalized vector score (0-1)
86
+ * @param weights - Weight configuration
87
+ * @returns Combined score (0-1)
88
+ */
89
+ export function combineScores(bm25Score, vectorScore, weights) {
90
+ const total = weights.bm25 + weights.vector;
91
+ return (bm25Score * weights.bm25 + vectorScore * weights.vector) / total;
92
+ }
93
+ /**
94
+ * Reciprocal Rank Fusion (RRF) for combining ranked lists.
95
+ *
96
+ * RRF is a rank-based fusion method that doesn't require score normalization.
97
+ * It's useful when BM25 and vector scores are not directly comparable.
98
+ *
99
+ * Formula: score = sum(1 / (k + rank)) for each list the item appears in
100
+ *
101
+ * @param bm25Rank - Rank in BM25 results (1-indexed, null if not present)
102
+ * @param vectorRank - Rank in vector results (1-indexed, null if not present)
103
+ * @param k - Smoothing constant (default: 60, standard value)
104
+ * @returns RRF score (higher is better)
105
+ */
106
+ export function reciprocalRankFusion(bm25Rank, vectorRank, k = 60) {
107
+ let score = 0;
108
+ if (bm25Rank !== null) {
109
+ score += 1 / (k + bm25Rank);
110
+ }
111
+ if (vectorRank !== null) {
112
+ score += 1 / (k + vectorRank);
113
+ }
114
+ return score;
115
+ }
116
+ // ═══════════════════════════════════════════════════════════════════════════
117
+ // Result Merging
118
+ // ═══════════════════════════════════════════════════════════════════════════
119
+ /**
120
+ * Merge BM25 and vector results using weighted combination.
121
+ *
122
+ * Tools that appear in both result sets get combined scores.
123
+ * Tools that appear in only one set get their score weighted by that mode's weight.
124
+ *
125
+ * @param bm25Results - BM25 search results (normalized scores)
126
+ * @param vectorResults - Vector search results (normalized scores)
127
+ * @param weights - Weight configuration for combining
128
+ * @returns Merged and re-ranked results
129
+ */
130
+ export function mergeHybridResults(bm25Results, vectorResults, weights) {
131
+ const scoreMap = new Map();
132
+ // Add BM25 scores
133
+ for (const result of bm25Results) {
134
+ scoreMap.set(result.toolId, {
135
+ bm25: result.score,
136
+ vector: 0,
137
+ });
138
+ }
139
+ // Add/merge vector scores
140
+ for (const result of vectorResults) {
141
+ const existing = scoreMap.get(result.toolId);
142
+ if (existing) {
143
+ existing.vector = result.score;
144
+ }
145
+ else {
146
+ scoreMap.set(result.toolId, {
147
+ bm25: 0,
148
+ vector: result.score,
149
+ });
150
+ }
151
+ }
152
+ // Combine scores and create results
153
+ const results = [];
154
+ for (const [toolId, scores] of scoreMap) {
155
+ const combinedScore = combineScores(scores.bm25, scores.vector, weights);
156
+ results.push({
157
+ toolId,
158
+ score: combinedScore,
159
+ matchType: "hybrid",
160
+ });
161
+ }
162
+ // Sort by score descending
163
+ results.sort((a, b) => b.score - a.score);
164
+ return results;
165
+ }
166
+ /**
167
+ * Merge results using Reciprocal Rank Fusion.
168
+ *
169
+ * This method is rank-based rather than score-based,
170
+ * which can be more robust when score distributions differ significantly.
171
+ *
172
+ * @param bm25Results - BM25 search results (order matters, not scores)
173
+ * @param vectorResults - Vector search results (order matters, not scores)
174
+ * @param k - RRF smoothing constant
175
+ * @returns Merged and re-ranked results
176
+ */
177
+ export function mergeWithRRF(bm25Results, vectorResults, k = 60) {
178
+ // Create rank maps (1-indexed)
179
+ const bm25Ranks = new Map();
180
+ bm25Results.forEach((r, i) => bm25Ranks.set(r.toolId, i + 1));
181
+ const vectorRanks = new Map();
182
+ vectorResults.forEach((r, i) => vectorRanks.set(r.toolId, i + 1));
183
+ // Get all unique tool IDs
184
+ const allToolIds = new Set([
185
+ ...bm25Results.map((r) => r.toolId),
186
+ ...vectorResults.map((r) => r.toolId),
187
+ ]);
188
+ // Compute RRF scores
189
+ const results = [];
190
+ for (const toolId of allToolIds) {
191
+ const bm25Rank = bm25Ranks.get(toolId) ?? null;
192
+ const vectorRank = vectorRanks.get(toolId) ?? null;
193
+ const score = reciprocalRankFusion(bm25Rank, vectorRank, k);
194
+ results.push({
195
+ toolId,
196
+ score,
197
+ matchType: "hybrid",
198
+ });
199
+ }
200
+ // Sort by RRF score descending
201
+ results.sort((a, b) => b.score - a.score);
202
+ // Normalize RRF scores to 0-1 for consistent thresholding
203
+ if (results.length > 0) {
204
+ const maxScore = results[0].score;
205
+ for (const result of results) {
206
+ result.score = result.score / maxScore;
207
+ }
208
+ }
209
+ return results;
210
+ }
211
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/search/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * OramaSearch module.
3
+ *
4
+ * Provides a powerful search index implementation using @orama/orama,
5
+ * supporting BM25 text search, vector semantic search, and hybrid modes.
6
+ *
7
+ * @module search/orama
8
+ */
9
+ import type { SearchIndex, SearchOptions, SearchResult } from '../types/index.js';
10
+ import type { ToolMetadata, OramaSearchConfig, Embeddings, EmbeddingCache } from "./types.js";
11
+ /**
12
+ * Search index implementation using @orama/orama.
13
+ *
14
+ * OramaSearch provides fast, in-memory search for tool discovery.
15
+ * It supports three search modes:
16
+ *
17
+ * - **BM25**: Fast text search using TF-IDF/BM25 algorithm. No API keys
18
+ * needed. Best for keyword-based queries.
19
+ *
20
+ * - **Vector**: Semantic search using embeddings. Requires an embeddings
21
+ * provider (e.g., OpenAIEmbeddings). Best for natural language queries.
22
+ *
23
+ * - **Hybrid**: Combines BM25 and vector scores for best results. Uses
24
+ * weighted combination with configurable weights.
25
+ *
26
+ * @example BM25 Mode (default, no API keys needed)
27
+ * ```typescript
28
+ * import { OramaSearch } from '@repo/bigtool-ts';
29
+ *
30
+ * const search = new OramaSearch({ mode: 'bm25' });
31
+ * await search.index(catalog.getAllMetadata());
32
+ *
33
+ * const results = await search.search('github pull request');
34
+ * console.log(results[0].toolId); // 'github:create_pr'
35
+ * ```
36
+ *
37
+ * @example Vector Mode (semantic search)
38
+ * ```typescript
39
+ * import { OramaSearch } from '@repo/bigtool-ts';
40
+ * import { OpenAIEmbeddings } from '@langchain/openai';
41
+ *
42
+ * const search = new OramaSearch({
43
+ * mode: 'vector',
44
+ * embeddings: new OpenAIEmbeddings(),
45
+ * cache: new MemoryEmbeddingCache(),
46
+ * });
47
+ *
48
+ * await search.index(tools);
49
+ * const results = await search.search('help me merge code changes');
50
+ * ```
51
+ *
52
+ * @example Hybrid Mode (best of both)
53
+ * ```typescript
54
+ * const search = new OramaSearch({
55
+ * mode: 'hybrid',
56
+ * embeddings: new OpenAIEmbeddings(),
57
+ * weights: { bm25: 0.4, vector: 0.6 },
58
+ * boost: { name: 3, keywords: 2 },
59
+ * });
60
+ * ```
61
+ */
62
+ export declare class OramaSearch implements SearchIndex {
63
+ /** @internal BM25 database */
64
+ private db;
65
+ /** @internal Vector database */
66
+ private vectorDb;
67
+ /** @internal Resolved configuration */
68
+ private config;
69
+ /** @internal Indexed tools for reindexing */
70
+ private tools;
71
+ /** @internal Embeddings provider */
72
+ private embeddings?;
73
+ /** @internal Embedding cache */
74
+ private cache?;
75
+ /** @internal Whether index() has been called */
76
+ private initialized;
77
+ /**
78
+ * Creates a new OramaSearch instance.
79
+ *
80
+ * @param config - Search configuration (mode, embeddings, etc.)
81
+ * @throws Error if vector/hybrid mode is used without embeddings
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * // BM25 (default)
86
+ * const search = new OramaSearch();
87
+ *
88
+ * // Explicit mode
89
+ * const search = new OramaSearch({ mode: 'bm25' });
90
+ *
91
+ * // With custom boosts
92
+ * const search = new OramaSearch({
93
+ * mode: 'bm25',
94
+ * boost: { name: 3, keywords: 2, description: 1, categories: 1 },
95
+ * });
96
+ * ```
97
+ */
98
+ constructor(config?: OramaSearchConfig);
99
+ /**
100
+ * Index a collection of tools for search.
101
+ *
102
+ * This creates the search index from the provided tool metadata.
103
+ * Call this after registering sources with the catalog.
104
+ * Replaces any existing index.
105
+ *
106
+ * For vector/hybrid modes, this also computes and caches embeddings.
107
+ *
108
+ * @param tools - Array of tool metadata to index
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const search = new OramaSearch({ mode: 'bm25' });
113
+ * await search.index(catalog.getAllMetadata());
114
+ * ```
115
+ */
116
+ index(tools: ToolMetadata[]): Promise<void>;
117
+ /**
118
+ * Search for tools matching a query.
119
+ *
120
+ * Uses the configured search mode (BM25, vector, or hybrid).
121
+ * Results are normalized to 0-1 scores and sorted by relevance.
122
+ *
123
+ * @param query - Natural language search query
124
+ * @param options - Search options (limit, threshold, categories)
125
+ * @returns Array of search results sorted by relevance
126
+ * @throws Error if index() has not been called
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const results = await search.search('create github pull request', {
131
+ * limit: 10,
132
+ * threshold: 0.3,
133
+ * });
134
+ *
135
+ * for (const result of results) {
136
+ * console.log(`${result.toolId}: ${result.score.toFixed(2)}`);
137
+ * }
138
+ * ```
139
+ */
140
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
141
+ /**
142
+ * Rebuild the index from currently indexed tools.
143
+ *
144
+ * Call this when the catalog changes (tools added/removed).
145
+ * Uses the tools from the last index() call.
146
+ *
147
+ * @throws Error if index() has not been called
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * // Listen for catalog changes
152
+ * catalog.onToolsChanged.subscribe(async () => {
153
+ * await search.reindex();
154
+ * });
155
+ * ```
156
+ */
157
+ reindex(): Promise<void>;
158
+ /**
159
+ * Get the number of indexed tools.
160
+ *
161
+ * @returns Number of tools in the index
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const indexed = await search.count();
166
+ * console.log(`${indexed} tools indexed`);
167
+ * ```
168
+ */
169
+ count(): Promise<number>;
170
+ private searchBM25;
171
+ private searchVector;
172
+ private searchHybrid;
173
+ /**
174
+ * Compute embeddings for tools, using cache when available.
175
+ */
176
+ private computeEmbeddings;
177
+ }
178
+ /**
179
+ * Create a BM25-only search index.
180
+ *
181
+ * This is the simplest and fastest option, requiring no API keys.
182
+ * Uses TF-IDF/BM25 algorithm for text matching.
183
+ *
184
+ * @param options - Optional configuration for field boosting
185
+ * @returns Configured OramaSearch instance
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * import { createBM25Search } from '@repo/bigtool-ts';
190
+ *
191
+ * const search = createBM25Search();
192
+ * await search.index(tools);
193
+ * ```
194
+ *
195
+ * @example With custom boosts
196
+ * ```typescript
197
+ * const search = createBM25Search({
198
+ * boost: { name: 3, keywords: 2, description: 1, categories: 1 },
199
+ * });
200
+ * ```
201
+ */
202
+ export declare function createBM25Search(options?: Pick<OramaSearchConfig, "boost">): OramaSearch;
203
+ /**
204
+ * Create a vector search index.
205
+ *
206
+ * Uses semantic similarity via embeddings. Requires an embeddings
207
+ * provider (e.g., OpenAIEmbeddings).
208
+ *
209
+ * @param embeddings - Embeddings provider for computing vectors
210
+ * @param cache - Optional cache for storing computed embeddings
211
+ * @param vectorSize - Embedding dimension (default: 1536 for OpenAI)
212
+ * @returns Configured OramaSearch instance
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * import { createVectorSearch } from '@repo/bigtool-ts';
217
+ * import { OpenAIEmbeddings } from '@langchain/openai';
218
+ *
219
+ * const search = createVectorSearch(
220
+ * new OpenAIEmbeddings(),
221
+ * new MemoryEmbeddingCache(),
222
+ * );
223
+ * ```
224
+ */
225
+ export declare function createVectorSearch(embeddings: Embeddings, cache?: EmbeddingCache, vectorSize?: number): OramaSearch;
226
+ /**
227
+ * Create a hybrid search index.
228
+ *
229
+ * Combines BM25 text matching with vector semantic similarity
230
+ * for the best results. Uses weighted scoring to merge results.
231
+ *
232
+ * @param embeddings - Embeddings provider for computing vectors
233
+ * @param options - Configuration options
234
+ * @returns Configured OramaSearch instance
235
+ *
236
+ * @example
237
+ * ```typescript
238
+ * import { createHybridSearch } from '@repo/bigtool-ts';
239
+ * import { OpenAIEmbeddings } from '@langchain/openai';
240
+ *
241
+ * const search = createHybridSearch(new OpenAIEmbeddings(), {
242
+ * weights: { bm25: 0.3, vector: 0.7 },
243
+ * cache: new MemoryEmbeddingCache(),
244
+ * });
245
+ * ```
246
+ */
247
+ export declare function createHybridSearch(embeddings: Embeddings, options?: {
248
+ cache?: EmbeddingCache;
249
+ weights?: {
250
+ bm25: number;
251
+ vector: number;
252
+ };
253
+ boost?: OramaSearchConfig["boost"];
254
+ vectorSize?: number;
255
+ }): OramaSearch;
256
+ //# sourceMappingURL=orama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orama.d.ts","sourceRoot":"","sources":["../../src/search/orama.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,cAAc,EAEf,MAAM,YAAY,CAAC;AAgEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,WAAY,YAAW,WAAW;IAC7C,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAA0C;IAEpD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAA2B;IAE3C,uCAAuC;IACvC,OAAO,CAAC,MAAM,CAA8G;IAE5H,6CAA6C;IAC7C,OAAO,CAAC,KAAK,CAAsB;IAEnC,oCAAoC;IACpC,OAAO,CAAC,UAAU,CAAC,CAAa;IAEhC,gCAAgC;IAChC,OAAO,CAAC,KAAK,CAAC,CAAiB;IAE/B,gDAAgD;IAChD,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;;;;;;;;;;;;;;;;OAoBG;gBACS,MAAM,GAAE,iBAAoC;IAmCxD;;;;;;;;;;;;;;;;OAgBG;IACG,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CjD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkC7E;;;;;;;;;;;;;;;OAeG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;;;;;;;OAUG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;YAShB,UAAU;YA+BV,YAAY;YA4BZ,YAAY;IAqB1B;;OAEG;YACW,iBAAiB;CAyChC;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GACzC,WAAW,CAKb;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,KAAK,CAAC,EAAE,cAAc,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,WAAW,CAOb;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,KAAK,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,WAAW,CASb"}