@mastra/upstash 1.4.0-alpha.0 → 1.4.0-alpha.2
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 +30 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-memory-working-memory.md +1 -0
- package/dist/docs/references/guides-rag-retrieval.md +17 -0
- package/dist/docs/references/guides-rag-vector-databases.md +41 -0
- package/dist/index.cjs +28 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +9 -2
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @mastra/upstash
|
|
2
2
|
|
|
3
|
+
## 1.4.0-alpha.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed generated thread titles being clobbered during a turn ([#21041](https://github.com/mastra-ai/mastra/pull/21041))
|
|
8
|
+
|
|
9
|
+
`updateThread` required both `title` and `metadata`, so callers that only needed to
|
|
10
|
+
change metadata (message persistence, working memory, observational memory, channel
|
|
11
|
+
subscriptions) had to read the thread and pass its title back. When title generation
|
|
12
|
+
finished between that read and the write, the freshly generated title was overwritten
|
|
13
|
+
with the stale one.
|
|
14
|
+
|
|
15
|
+
`title` and `metadata` are now independently optional: omitting one leaves that column
|
|
16
|
+
untouched. Callers that only change metadata no longer send a title, and message
|
|
17
|
+
persistence no longer rewrites a thread row it just read.
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`1c75e32`](https://github.com/mastra-ai/mastra/commit/1c75e32f7fc0b9fb6f548b4407feaec8a1440212), [`c47165c`](https://github.com/mastra-ai/mastra/commit/c47165c983c87594c6952f1fd2fa51a90205034c), [`e08e789`](https://github.com/mastra-ai/mastra/commit/e08e789c1bf4cd2fe46363f7a4728536ceccc9bd), [`35cc901`](https://github.com/mastra-ai/mastra/commit/35cc90102cf834a84827acaf9eee0b6d6d1e2a3b), [`a8b4cf0`](https://github.com/mastra-ai/mastra/commit/a8b4cf02823cffebc4751a53337dfacf097c1ae1), [`f33264f`](https://github.com/mastra-ai/mastra/commit/f33264f517ae603279afd5c4251e2b40f6dd3618), [`689f2c4`](https://github.com/mastra-ai/mastra/commit/689f2c4b6c0835fe455702b01d21daa8abcd9331), [`eeae63e`](https://github.com/mastra-ai/mastra/commit/eeae63e7fbe8e1f237adc69bca6e2ac13c5ca907), [`4c186a0`](https://github.com/mastra-ai/mastra/commit/4c186a017275f45e6ed4c09de0f89550e2d09e8c), [`b0fa077`](https://github.com/mastra-ai/mastra/commit/b0fa077bcbc9b08551846fe372a0d3d15b71ed72)]:
|
|
20
|
+
- @mastra/core@1.58.0-alpha.8
|
|
21
|
+
- @mastra/redis@1.4.0-alpha.2
|
|
22
|
+
|
|
23
|
+
## 1.4.0-alpha.1
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- Fixed resource-scoped message includes across storage adapters so included context cannot cross resource boundaries. ([#20984](https://github.com/mastra-ai/mastra/pull/20984))
|
|
28
|
+
|
|
29
|
+
- Updated dependencies [[`6445eba`](https://github.com/mastra-ai/mastra/commit/6445eba6020abac681aba1cc9289f446cb400cbe), [`df31eb0`](https://github.com/mastra-ai/mastra/commit/df31eb0c7087d782a0d9346e467f9a4af4b0eef6), [`df31eb0`](https://github.com/mastra-ai/mastra/commit/df31eb0c7087d782a0d9346e467f9a4af4b0eef6), [`fcd0667`](https://github.com/mastra-ai/mastra/commit/fcd0667a4e378be35c9a1b1eb19cce78fbfd7282), [`bab06b1`](https://github.com/mastra-ai/mastra/commit/bab06b18923873a584bdfc71a6b4ec7fb4727fb7)]:
|
|
30
|
+
- @mastra/core@1.58.0-alpha.5
|
|
31
|
+
- @mastra/redis@1.4.0-alpha.1
|
|
32
|
+
|
|
3
33
|
## 1.4.0-alpha.0
|
|
4
34
|
|
|
5
35
|
### Minor Changes
|
package/dist/docs/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: mastra-upstash
|
|
|
3
3
|
description: Documentation for @mastra/upstash. Use when working with @mastra/upstash APIs, configuration, or implementation.
|
|
4
4
|
metadata:
|
|
5
5
|
package: "@mastra/upstash"
|
|
6
|
-
version: "1.4.0-alpha.
|
|
6
|
+
version: "1.4.0-alpha.2"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
@@ -129,6 +129,7 @@ Resource-scoped working memory requires specific storage adapters that support t
|
|
|
129
129
|
|
|
130
130
|
- **libSQL** (`@mastra/libsql`)
|
|
131
131
|
- **PostgreSQL** (`@mastra/pg`)
|
|
132
|
+
- **OracleDB** (`@mastra/oracledb`)
|
|
132
133
|
- **Upstash** (`@mastra/upstash`)
|
|
133
134
|
- **MongoDB** (`@mastra/mongodb`)
|
|
134
135
|
|
|
@@ -436,6 +436,23 @@ export const ragAgent = new Agent({
|
|
|
436
436
|
})
|
|
437
437
|
```
|
|
438
438
|
|
|
439
|
+
**OracleDB**:
|
|
440
|
+
|
|
441
|
+
```ts
|
|
442
|
+
import { ORACLEDB_PROMPT } from '@mastra/oracledb'
|
|
443
|
+
|
|
444
|
+
export const ragAgent = new Agent({
|
|
445
|
+
id: 'rag-agent',
|
|
446
|
+
name: 'RAG Agent',
|
|
447
|
+
model: 'openai/gpt-5.6-sol',
|
|
448
|
+
instructions: `
|
|
449
|
+
Process queries using the provided context. Structure responses to be concise and relevant.
|
|
450
|
+
${ORACLEDB_PROMPT}
|
|
451
|
+
`,
|
|
452
|
+
tools: { vectorQueryTool },
|
|
453
|
+
})
|
|
454
|
+
```
|
|
455
|
+
|
|
439
456
|
**S3Vectors**:
|
|
440
457
|
|
|
441
458
|
```ts
|
|
@@ -78,6 +78,35 @@ await store.upsert({
|
|
|
78
78
|
|
|
79
79
|
PostgreSQL with the pgvector extension is a good solution for teams already using PostgreSQL who want to minimize infrastructure complexity. For detailed setup instructions and best practices, see the [official pgvector repository](https://github.com/pgvector/pgvector).
|
|
80
80
|
|
|
81
|
+
**OracleDB**:
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
import { OracleVector } from '@mastra/oracledb'
|
|
85
|
+
|
|
86
|
+
const store = new OracleVector({
|
|
87
|
+
id: 'oracle-vector',
|
|
88
|
+
user: process.env.ORACLE_DATABASE_USER,
|
|
89
|
+
password: process.env.ORACLE_DATABASE_PASSWORD,
|
|
90
|
+
connectString: process.env.ORACLE_DATABASE_CONNECT_STRING,
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
await store.createIndex({
|
|
94
|
+
indexName: 'myCollection',
|
|
95
|
+
dimension: 1536,
|
|
96
|
+
indexConfig: { type: 'none' },
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
await store.upsert({
|
|
100
|
+
indexName: 'myCollection',
|
|
101
|
+
vectors: embeddings,
|
|
102
|
+
metadata: chunks.map(chunk => ({ text: chunk.text })),
|
|
103
|
+
})
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Using Oracle Database Vector Search
|
|
107
|
+
|
|
108
|
+
OracleDB stores embeddings in native `VECTOR` columns and metadata in Oracle JSON. Exact search is the default; HNSW and IVF indexes can be configured for tuned deployments.
|
|
109
|
+
|
|
81
110
|
**Pinecone**:
|
|
82
111
|
|
|
83
112
|
```ts
|
|
@@ -410,6 +439,18 @@ Index names must:
|
|
|
410
439
|
- Example: `my_index_123` is valid
|
|
411
440
|
- Example: `my-index` is not valid (contains hyphen)
|
|
412
441
|
|
|
442
|
+
**OracleDB**:
|
|
443
|
+
|
|
444
|
+
Index names are logical Mastra names. OracleDB maps each logical index to a physical Oracle table internally.
|
|
445
|
+
|
|
446
|
+
Logical index names must:
|
|
447
|
+
|
|
448
|
+
- Be non-empty
|
|
449
|
+
- Be 512 characters or fewer
|
|
450
|
+
- Be stable for the lifetime of the vector index
|
|
451
|
+
- Example: `my_collection_123` is valid
|
|
452
|
+
- Example: `customer-support/docs:v1` is valid and is mapped to a safe Oracle table name
|
|
453
|
+
|
|
413
454
|
**Pinecone**:
|
|
414
455
|
|
|
415
456
|
Index names must:
|
package/dist/index.cjs
CHANGED
|
@@ -485,7 +485,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
|
|
|
485
485
|
const now = /* @__PURE__ */ new Date();
|
|
486
486
|
const updatedThread = {
|
|
487
487
|
...thread,
|
|
488
|
-
title,
|
|
488
|
+
title: title ?? thread.title,
|
|
489
489
|
metadata: {
|
|
490
490
|
...thread.metadata,
|
|
491
491
|
...metadata
|
|
@@ -658,16 +658,38 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
|
|
|
658
658
|
return direction === "ASC" ? aValue - bValue : bValue - aValue;
|
|
659
659
|
});
|
|
660
660
|
}
|
|
661
|
-
|
|
661
|
+
/**
|
|
662
|
+
* Fetches the messages named by `include` together with their surrounding context.
|
|
663
|
+
*
|
|
664
|
+
* @param include - Message ids to pin, each with an optional before/after window.
|
|
665
|
+
* @param resourceId - When set, drops any pinned or context message owned by another
|
|
666
|
+
* resource so an id from another resource returns nothing.
|
|
667
|
+
*/
|
|
668
|
+
async _getIncludedMessages(include, resourceId) {
|
|
662
669
|
if (!include?.length) return [];
|
|
663
670
|
const messageIds = /* @__PURE__ */ new Set();
|
|
664
671
|
const messageIdToThreadIds = {};
|
|
665
672
|
for (const item of include) {
|
|
666
673
|
const itemThreadId = await this._getThreadIdForMessage(item.id);
|
|
667
674
|
if (!itemThreadId) continue;
|
|
675
|
+
const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
|
|
676
|
+
if (resourceId !== void 0) {
|
|
677
|
+
const threadMessageIds = await this.client.zrange(itemThreadMessagesKey, 0, -1);
|
|
678
|
+
const threadPipeline = this.client.pipeline();
|
|
679
|
+
threadMessageIds.forEach((id) => threadPipeline.get(getMessageKey(itemThreadId, id)));
|
|
680
|
+
const threadMessages = (await threadPipeline.exec()).filter((message) => message !== null).filter((message) => message.resourceId === resourceId);
|
|
681
|
+
const targetIndex = threadMessages.findIndex((message) => message.id === item.id);
|
|
682
|
+
if (targetIndex === -1) continue;
|
|
683
|
+
const start = Math.max(0, targetIndex - (item.withPreviousMessages ?? 0));
|
|
684
|
+
const end = Math.min(threadMessages.length, targetIndex + (item.withNextMessages ?? 0) + 1);
|
|
685
|
+
for (const message of threadMessages.slice(start, end)) {
|
|
686
|
+
messageIds.add(message.id);
|
|
687
|
+
messageIdToThreadIds[message.id] = itemThreadId;
|
|
688
|
+
}
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
668
691
|
messageIds.add(item.id);
|
|
669
692
|
messageIdToThreadIds[item.id] = itemThreadId;
|
|
670
|
-
const itemThreadMessagesKey = getThreadMessagesKey(itemThreadId);
|
|
671
693
|
const rank = await this.client.zrank(itemThreadMessagesKey, item.id);
|
|
672
694
|
if (rank === null) continue;
|
|
673
695
|
if (item.withPreviousMessages) {
|
|
@@ -688,7 +710,8 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
|
|
|
688
710
|
const tId = messageIdToThreadIds[id];
|
|
689
711
|
pipeline.get(getMessageKey(tId, id));
|
|
690
712
|
});
|
|
691
|
-
|
|
713
|
+
const includedMessages = (await pipeline.exec()).filter((result) => result !== null);
|
|
714
|
+
return resourceId ? includedMessages.filter((message) => message.resourceId === resourceId) : includedMessages;
|
|
692
715
|
}
|
|
693
716
|
parseStoredMessage(storedMessage) {
|
|
694
717
|
const defaultMessageContent = {
|
|
@@ -782,7 +805,7 @@ var StoreMemoryUpstash = class extends _mastra_core_storage.MemoryStorage {
|
|
|
782
805
|
hasMore: false
|
|
783
806
|
};
|
|
784
807
|
let includedMessages = [];
|
|
785
|
-
if (include && include.length > 0) includedMessages = (await this._getIncludedMessages(include)).map(this.parseStoredMessage);
|
|
808
|
+
if (include && include.length > 0) includedMessages = (await this._getIncludedMessages(include, resourceId)).map(this.parseStoredMessage);
|
|
786
809
|
if (perPage === 0 && include && include.length > 0) {
|
|
787
810
|
const list = new _mastra_core_agent.MessageList().add(includedMessages, "memory");
|
|
788
811
|
return {
|