Memory.cloneThread()
.cloneThread() メソッドは、すべてのメッセージを含む既存の会話 Thread のコピーを作成します。会話内の特定の時点から分岐する会話パスを作成できます。セマンティックリコールが有効な場合、このメソッドはクローンされたメッセージのベクトル埋め込みも作成します。
使用例使用例への直接リンク
次の例では、Memory インスタンスを作成し、既存の Thread をクローンします。
import { Memory } from '@mastra/memory'
import { LibSQLStore } from '@mastra/libsql'
const memory = new Memory({
storage: new LibSQLStore({ id: 'memory-store', url: 'file:./memory.db' }),
})
const { thread, clonedMessages } = await memory.cloneThread({
sourceThreadId: 'original-thread-123',
})
パラメーターパラメーターへの直接リンク
sourceThreadId:
newThreadId?:
resourceId?:
title?:
Clone of ${sourceThread.title} になります。それ以外の場合、タイトルは空です。metadata?:
options?:
messageLimit?:
messageFilter?:
startDate?:
endDate?:
messageIds?:
戻り値戻り値への直接リンク
thread:
clonedMessages:
messageIdMap?:
クローンのメタデータクローンのメタデータへの直接リンク
クローンされた Thread のメタデータには、次のフィールドを持つ clone プロパティが含まれます。
sourceThreadId:
clonedAt:
lastMessageId?:
詳細な使用例詳細な使用例への直接リンク
import { mastra } from './mastra'
const agent = mastra.getAgent('agent')
const memory = await agent.getMemory()
// Clone a thread with all messages
const { thread: fullClone } = await memory.cloneThread({
sourceThreadId: 'original-thread-123',
title: 'Alternative Conversation Path',
})
// Clone with a custom ID
const { thread: customIdClone } = await memory.cloneThread({
sourceThreadId: 'original-thread-123',
newThreadId: 'my-custom-clone-id',
})
// Clone only the last 5 messages
const { thread: partialClone, clonedMessages } = await memory.cloneThread({
sourceThreadId: 'original-thread-123',
options: {
messageLimit: 5,
},
})
// Clone messages from a specific date range
const { thread: dateFilteredClone } = await memory.cloneThread({
sourceThreadId: 'original-thread-123',
options: {
messageFilter: {
startDate: new Date('2024-01-01'),
endDate: new Date('2024-01-31'),
},
},
})
// Clone specific messages
const { thread: selectedMessagesClone } = await memory.cloneThread({
sourceThreadId: 'original-thread-123',
options: {
messageFilter: {
messageIds: ['message-1', 'message-2'],
},
},
})
// Continue conversation on the cloned thread
const response = await agent.generate('Try a different approach', {
memory: {
thread: fullClone.id,
resource: fullClone.resourceId,
},
})
クローンされた Thread から会話を続けるには、クローンされた thread.id と thread.resourceId を agent.generate() に渡します。
ベクトル埋め込みベクトル埋め込みへの直接リンク
Memory インスタンスで vector store と embedder を設定してセマンティックリコールを有効にすると、cloneThread() はクローンされたすべてのメッセージのベクトル埋め込みを自動的に作成します。これにより、クローンされた Thread でもセマンティック検索が正しく動作します。
この例では、embeddingModel はプロジェクトに設定された埋め込みモデルです。
import { Memory } from '@mastra/memory'
import { LibSQLStore, LibSQLVector } from '@mastra/libsql'
const memory = new Memory({
storage: new LibSQLStore({ id: 'memory-store', url: 'file:./memory.db' }),
vector: new LibSQLVector({ id: 'vector-store', url: 'file:./vector.db' }),
embedder: embeddingModel,
options: {
semanticRecall: true,
},
})
// Clone will also create embeddings for cloned messages
const { thread } = await memory.cloneThread({
sourceThreadId: 'original-thread',
})
// Semantic search works on the cloned thread
const results = await memory.recall({
threadId: thread.id,
vectorSearchString: 'search query',
})
Working MemoryWorking Memoryへの直接リンク
Working Memory が有効な場合、cloneThread() は Working Memory のスコープとクローンの resourceId に基づいて、Working Memory をコピーまたは共有します。
- Thread スコープの Working Memory:Working Memory はクローンされた Thread にコピーされます。
- 同じ
resourceIdを持つリソーススコープの Working Memory:ソース Thread とクローンされた Thread は同じリソースに属するため、Working Memory は共有されます。 - 異なる
resourceIdを持つリソーススコープの Working Memory:Working Memory はクローンされた Thread のリソースにコピーされます。
Observational MemoryObservational Memoryへの直接リンク
Observational Memory が有効な場合、cloneThread() はソース Thread に関連付けられた OM レコードを自動的にクローンします。動作は OM のスコープによって異なります。
- Thread スコープの OM:OM レコードは新しい Thread にクローンされます。内部のすべてのメッセージ ID 参照は、クローンされたメッセージを指すように再マッピングされます。
- リソーススコープの OM(同じ
resourceId):ソース Thread とクローンされた Thread は同じリソースに属するため、OM レコードは両者で共有されます。複製は行われません。 - リソーススコープの OM(異なる
resourceId):OM レコードは新しいリソースにクローンされます。メッセージ ID は再マッピングされ、観察内にある Thread を識別するタグは、クローンされた Thread を参照するように更新されます。
現在の(最新の)OM 世代だけがクローンされます。以前の履歴世代はコピーされません。一時的な処理状態(観察または振り返りの処理中フラグ)は、クローンされたレコードでリセットされます。