@mastra/rag 0.0.2-alpha.35 → 0.0.2-alpha.39

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/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @mastra/rag
2
2
 
3
+ ## 0.0.2-alpha.39
4
+
5
+ ### Patch Changes
6
+
7
+ - 592e3cf: Add custom rag tools, add vector retrieval, and update docs
8
+ - 837a288: MAJOR Revamp of tools, workflows, syncs.
9
+ - 0b74006: Workflow updates
10
+ - Updated dependencies [592e3cf]
11
+ - Updated dependencies [837a288]
12
+ - Updated dependencies [0b74006]
13
+ - @mastra/core@0.1.27-alpha.55
14
+
15
+ ## 0.0.2-alpha.38
16
+
17
+ ### Patch Changes
18
+
19
+ - eb45d76: Updated PG Vector filter and added rag examples in docs
20
+ - Updated dependencies [d2cd535]
21
+ - @mastra/core@0.1.27-alpha.54
22
+
23
+ ## 0.0.2-alpha.37
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies [8e7814f]
28
+ - @mastra/core@0.1.27-alpha.53
29
+
30
+ ## 0.0.2-alpha.36
31
+
32
+ ### Patch Changes
33
+
34
+ - Updated dependencies [eedb829]
35
+ - @mastra/core@0.1.27-alpha.52
36
+
3
37
  ## 0.0.2-alpha.35
4
38
 
5
39
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -5,4 +5,5 @@ export * from './astra-db';
5
5
  export * from './qdrant';
6
6
  export * from './upstash';
7
7
  export * from './embeddings';
8
+ export * from './utils';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type OperatorType = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'like' | 'ilike' | 'in' | 'contains' | 'exists';
2
+ export declare function isValidOperator(operator: string): operator is OperatorType;
3
+ type FilterOperator = {
4
+ sql: string;
5
+ needsValue: boolean;
6
+ transformValue?: (value: any) => any;
7
+ };
8
+ type FilterOperatorMap = {
9
+ [K in OperatorType]: (key: string, paramIndex: number) => FilterOperator;
10
+ };
11
+ export declare const FILTER_OPERATORS: FilterOperatorMap;
12
+ type FilterCondition = {
13
+ operator: OperatorType;
14
+ value?: any;
15
+ };
16
+ export type Filter = Record<string, FilterCondition | any>;
17
+ export {};
18
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/pg/filter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,QAAQ,CAAC;AAGxH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,YAAY,CAE1E;AAED,KAAK,cAAc,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;CACtC,CAAC;AAEF,KAAK,iBAAiB,GAAG;KACtB,CAAC,IAAI,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,cAAc;CACzE,CAAC;AAkBF,eAAO,MAAM,gBAAgB,EAAE,iBAoC9B,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,GAAG,CAAC,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { IndexStats, QueryResult, MastraVector } from '@mastra/core';
2
+ import { Filter } from './filter';
2
3
  export declare class PgVector extends MastraVector {
3
4
  private pool;
4
5
  constructor(connectionString: string);
5
- query(indexName: string, queryVector: number[], topK?: number, filter?: Record<string, any>, minScore?: number): Promise<QueryResult[]>;
6
+ query(indexName: string, queryVector: number[], topK?: number, filter?: Filter, minScore?: number): Promise<QueryResult[]>;
6
7
  upsert(indexName: string, vectors: number[][], metadata?: Record<string, any>[], ids?: string[]): Promise<string[]>;
7
8
  createIndex(indexName: string, dimension: number, metric?: 'cosine' | 'euclidean' | 'dotproduct'): Promise<void>;
8
9
  listIndexes(): Promise<string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGrE,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,IAAI,CAAU;gBAEV,gBAAgB,EAAE,MAAM;IAoB9B,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,MAAW,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC;IA4CnB,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EAAE,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAChC,GAAG,CAAC,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,EAAE,CAAC;IA8Bd,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,QAAQ,GAAG,WAAW,GAAG,YAAuB,GACvD,OAAO,CAAC,IAAI,CAAC;IAqDV,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBhC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA6DrD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C,aAAa,CAAC,SAAS,EAAE,MAAM;IAY/B,UAAU;CAGjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,EAAE,MAAM,EAAqC,MAAM,UAAU,CAAC;AAErE,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,IAAI,CAAU;gBAEV,gBAAgB,EAAE,MAAM;IAoB9B,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,MAAW,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC;IAkEnB,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EAAE,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAChC,GAAG,CAAC,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,EAAE,CAAC;IA8Bd,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,QAAQ,GAAG,WAAW,GAAG,YAAuB,GACvD,OAAO,CAAC,IAAI,CAAC;IAqDV,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBhC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA6DrD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C,aAAa,CAAC,SAAS,EAAE,MAAM;IAY/B,UAAU;CAGjB"}
@@ -11,6 +11,7 @@ var pinecone = require('@pinecone-database/pinecone');
11
11
  var astraDbTs = require('@datastax/astra-db-ts');
12
12
  var jsClientRest = require('@qdrant/js-client-rest');
13
13
  var vector = require('@upstash/vector');
14
+ var zod = require('zod');
14
15
 
15
16
  function _arrayLikeToArray(r, a) {
16
17
  (null == a || a > r.length) && (a = r.length);
@@ -2013,6 +2014,72 @@ var MDocument = /*#__PURE__*/function () {
2013
2014
  return MDocument;
2014
2015
  }();
2015
2016
 
2017
+ // Type guard to check if an operator is valid
2018
+ function isValidOperator(operator) {
2019
+ return operator in FILTER_OPERATORS;
2020
+ }
2021
+ // Helper functions to create operators
2022
+ var createBasicOperator = function createBasicOperator(symbol) {
2023
+ return function (key, paramIndex) {
2024
+ return {
2025
+ sql: "metadata->>'" + key + "' " + symbol + " $" + paramIndex,
2026
+ needsValue: true
2027
+ };
2028
+ };
2029
+ };
2030
+ var createNumericOperator = function createNumericOperator(symbol) {
2031
+ return function (key, paramIndex) {
2032
+ return {
2033
+ sql: "(metadata->>'" + key + "')::numeric " + symbol + " $" + paramIndex,
2034
+ needsValue: true
2035
+ };
2036
+ };
2037
+ };
2038
+ // Define all filter operators
2039
+ var FILTER_OPERATORS = {
2040
+ // Equal
2041
+ eq: /*#__PURE__*/createBasicOperator('='),
2042
+ // Not equal
2043
+ neq: /*#__PURE__*/createBasicOperator('!='),
2044
+ // Greater than
2045
+ gt: /*#__PURE__*/createNumericOperator('>'),
2046
+ // Greater than or equal
2047
+ gte: /*#__PURE__*/createNumericOperator('>='),
2048
+ // Less than
2049
+ lt: /*#__PURE__*/createNumericOperator('<'),
2050
+ // Less than or equal
2051
+ lte: /*#__PURE__*/createNumericOperator('<='),
2052
+ // Pattern matching (LIKE)
2053
+ like: /*#__PURE__*/createBasicOperator('LIKE'),
2054
+ // Case-insensitive pattern matching (ILIKE)
2055
+ ilike: /*#__PURE__*/createBasicOperator('ILIKE'),
2056
+ // IN array of values
2057
+ "in": function _in(key, paramIndex) {
2058
+ return {
2059
+ sql: "metadata->>'" + key + "' = ANY($" + paramIndex + ")",
2060
+ needsValue: true
2061
+ };
2062
+ },
2063
+ // JSONB contains
2064
+ contains: function contains(key, paramIndex) {
2065
+ return {
2066
+ sql: "metadata @> $" + paramIndex + "::jsonb",
2067
+ needsValue: true,
2068
+ transformValue: function transformValue(value) {
2069
+ var _JSON$stringify;
2070
+ return JSON.stringify((_JSON$stringify = {}, _JSON$stringify[key] = value, _JSON$stringify));
2071
+ }
2072
+ };
2073
+ },
2074
+ // Key exists
2075
+ exists: function exists(key) {
2076
+ return {
2077
+ sql: "metadata ? '" + key + "'",
2078
+ needsValue: false
2079
+ };
2080
+ }
2081
+ };
2082
+
2016
2083
  var PgVector = /*#__PURE__*/function (_MastraVector) {
2017
2084
  function PgVector(connectionString) {
2018
2085
  var _telemetry$traceClass;
@@ -2059,11 +2126,30 @@ var PgVector = /*#__PURE__*/function (_MastraVector) {
2059
2126
  filterValues = [minScore];
2060
2127
  vectorStr = "[" + queryVector.join(',') + "]";
2061
2128
  if (filter) {
2062
- conditions = Object.entries(filter).map(function (_ref, index) {
2129
+ conditions = Object.entries(filter).map(function (_ref) {
2063
2130
  var key = _ref[0],
2064
- value = _ref[1];
2065
- filterValues.push(value);
2066
- return "metadata->>'" + key + "' = $" + (index + 2); // +2 because $1 is minScore
2131
+ condition = _ref[1];
2132
+ // If condition is not a FilterCondition object, assume it's an equality check
2133
+ if (!condition || typeof condition !== 'object' || !('operator' in condition)) {
2134
+ filterValues.push(condition);
2135
+ return "metadata->>'" + key + "' = $" + filterValues.length;
2136
+ }
2137
+ var operator = condition.operator,
2138
+ value = condition.value;
2139
+ if (!isValidOperator(operator)) {
2140
+ throw new Error("Unsupported operator: " + operator);
2141
+ }
2142
+ // Get operation function
2143
+ var operatorFn = FILTER_OPERATORS[operator];
2144
+ var operatorResult = operatorFn(key, filterValues.length + 1);
2145
+ // Handle operator cases and check if value is needed
2146
+ if (operatorResult.needsValue) {
2147
+ // Transform value if needed
2148
+ var transformedValue = operatorResult.transformValue ? operatorResult.transformValue(value) : value;
2149
+ filterValues.push(transformedValue);
2150
+ }
2151
+ // return sql condition
2152
+ return operatorResult.sql;
2067
2153
  });
2068
2154
  if (conditions.length > 0) {
2069
2155
  filterQuery = 'AND ' + conditions.join(' AND ');
@@ -3304,11 +3390,125 @@ var embed = function embed(chunk, options) {
3304
3390
  return core.embed(value, options);
3305
3391
  };
3306
3392
 
3393
+ var createVectorQueryTool = function createVectorQueryTool(_ref) {
3394
+ var vectorStoreName = _ref.vectorStoreName,
3395
+ indexName = _ref.indexName,
3396
+ _ref$topK = _ref.topK,
3397
+ topK = _ref$topK === void 0 ? 10 : _ref$topK,
3398
+ options = _ref.options,
3399
+ _ref$useFilter = _ref.useFilter,
3400
+ useFilter = _ref$useFilter === void 0 ? false : _ref$useFilter;
3401
+ return core.createTool({
3402
+ id: "VectorQuery " + vectorStoreName + " " + indexName + " Tool",
3403
+ inputSchema: zod.z.object({
3404
+ queryText: zod.z.string(),
3405
+ filter: zod.z.object({
3406
+ keyword: zod.z.string().min(1),
3407
+ operator: zod.z.string().min(1),
3408
+ value: zod.z.string().min(1)
3409
+ }).optional()
3410
+ }),
3411
+ outputSchema: zod.z.object({
3412
+ context: zod.z.string()
3413
+ }),
3414
+ description: "Fetches and combines the top " + topK + " relevant chunks from the " + vectorStoreName + " vector store using the " + indexName + " index",
3415
+ execute: function () {
3416
+ var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref2) {
3417
+ var _mastra$vectors;
3418
+ var _ref2$context, queryText, filter, mastra, context, vectorStore, _yield$embed, embedding, _filter$keyword, _ref3, queryFilter, results, relevantChunks;
3419
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
3420
+ while (1) switch (_context.prev = _context.next) {
3421
+ case 0:
3422
+ _ref2$context = _ref2.context, queryText = _ref2$context.queryText, filter = _ref2$context.filter, mastra = _ref2.mastra;
3423
+ context = '';
3424
+ vectorStore = mastra == null || (_mastra$vectors = mastra.vectors) == null ? void 0 : _mastra$vectors[vectorStoreName];
3425
+ console.log({
3426
+ vectorStore: vectorStore,
3427
+ vectorStoreName: vectorStoreName
3428
+ });
3429
+ _context.next = 6;
3430
+ return embed(queryText, options);
3431
+ case 6:
3432
+ _yield$embed = _context.sent;
3433
+ embedding = _yield$embed.embedding;
3434
+ if (!vectorStore) {
3435
+ _context.next = 15;
3436
+ break;
3437
+ }
3438
+ queryFilter = useFilter && filter ? (_ref3 = {}, _ref3[filter.keyword] = (_filter$keyword = {}, _filter$keyword[filter.operator] = filter.value, _filter$keyword), _ref3) : {};
3439
+ _context.next = 12;
3440
+ return vectorStore.query(indexName, embedding, topK, queryFilter);
3441
+ case 12:
3442
+ results = _context.sent;
3443
+ relevantChunks = results.map(function (result) {
3444
+ var _result$metadata;
3445
+ return result == null || (_result$metadata = result.metadata) == null ? void 0 : _result$metadata.text;
3446
+ }); // Combine the chunks into a context string
3447
+ context = relevantChunks.join('\n\n');
3448
+ case 15:
3449
+ return _context.abrupt("return", {
3450
+ context: context
3451
+ });
3452
+ case 16:
3453
+ case "end":
3454
+ return _context.stop();
3455
+ }
3456
+ }, _callee);
3457
+ }));
3458
+ function execute(_x) {
3459
+ return _execute.apply(this, arguments);
3460
+ }
3461
+ return execute;
3462
+ }()
3463
+ });
3464
+ };
3465
+ var createDocumentChunker = function createDocumentChunker(_ref4) {
3466
+ var doc = _ref4.doc,
3467
+ _ref4$params = _ref4.params,
3468
+ params = _ref4$params === void 0 ? {
3469
+ strategy: 'recursive',
3470
+ size: 512,
3471
+ overlap: 50,
3472
+ separator: '\n'
3473
+ } : _ref4$params;
3474
+ return core.createTool({
3475
+ id: "Document Chunker " + params.strategy + " " + params.size,
3476
+ inputSchema: zod.z.object({}),
3477
+ description: "Chunks document using " + params.strategy + " strategy with size " + params.size + " and " + params.overlap + " overlap",
3478
+ execute: function () {
3479
+ var _execute2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
3480
+ var chunks;
3481
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
3482
+ while (1) switch (_context2.prev = _context2.next) {
3483
+ case 0:
3484
+ _context2.next = 2;
3485
+ return doc.chunk(params);
3486
+ case 2:
3487
+ chunks = _context2.sent;
3488
+ return _context2.abrupt("return", {
3489
+ chunks: chunks
3490
+ });
3491
+ case 4:
3492
+ case "end":
3493
+ return _context2.stop();
3494
+ }
3495
+ }, _callee2);
3496
+ }));
3497
+ function execute() {
3498
+ return _execute2.apply(this, arguments);
3499
+ }
3500
+ return execute;
3501
+ }()
3502
+ });
3503
+ };
3504
+
3307
3505
  exports.AstraVector = AstraVector;
3308
3506
  exports.MDocument = MDocument;
3309
3507
  exports.PgVector = PgVector;
3310
3508
  exports.PineconeVector = PineconeVector;
3311
3509
  exports.QdrantVector = QdrantVector;
3312
3510
  exports.UpstashVector = UpstashVector;
3511
+ exports.createDocumentChunker = createDocumentChunker;
3512
+ exports.createVectorQueryTool = createVectorQueryTool;
3313
3513
  exports.embed = embed;
3314
3514
  //# sourceMappingURL=rag.cjs.development.js.map