メインコンテンツへ移動

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:

string
クローンする Thread の ID

newThreadId?:

string
クローンされた Thread に使用する省略可能なカスタム ID。指定しない場合は生成されます。

resourceId?:

string
クローンされた Thread に使用する省略可能なリソース ID。デフォルトはソース Thread の resourceId です。

title?:

string
クローンされた Thread に使用する省略可能なタイトル。省略した場合、ソース Thread にタイトルがあれば、クローンのタイトルは Clone of ${sourceThread.title} になります。それ以外の場合、タイトルは空です。

metadata?:

Record<string, unknown>
ソース Thread のメタデータとマージする省略可能なメタデータ。クローンのメタデータは自動的に追加されます。

options?:

CloneOptions
クローン処理に使用する省略可能なフィルタリングオプション。
CloneOptions

messageLimit?:

number
クローンするメッセージの最大数。設定すると、直近の N 件のメッセージをクローンします。

messageFilter?:

MessageFilter
クローンするメッセージを選択するためのフィルター条件。
MessageFilter

startDate?:

Date
この日時以降に作成されたメッセージのみをクローンします。

endDate?:

Date
この日時以前に作成されたメッセージのみをクローンします。

messageIds?:

string[]
指定した ID のメッセージのみをクローンします。

戻り値
戻り値への直接リンク

thread:

StorageThreadType
クローンのメタデータを含む、新しく作成されたクローン Thread。

clonedMessages:

MastraDBMessage[]
新しい Thread 用の新しい ID が割り当てられた、クローンされたメッセージの配列。

messageIdMap?:

Record<string, string>
ソースメッセージ ID から、対応するクローンされたメッセージ ID へのマッピング。

クローンのメタデータ
クローンのメタデータへの直接リンク

クローンされた Thread のメタデータには、次のフィールドを持つ clone プロパティが含まれます。

sourceThreadId:

string
クローン元である元の Thread の ID。

clonedAt:

Date
クローンが作成された日時。

lastMessageId?:

string
クローン作成時点における、ソース Thread の最後のメッセージの ID。

詳細な使用例
詳細な使用例への直接リンク

src/test-clone.ts
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.idthread.resourceIdagent.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 Memory
Working 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 Memory
Observational Memoryへの直接リンク

Observational Memory が有効な場合、cloneThread() はソース Thread に関連付けられた OM レコードを自動的にクローンします。動作は OM のスコープによって異なります。

  • Thread スコープの OM:OM レコードは新しい Thread にクローンされます。内部のすべてのメッセージ ID 参照は、クローンされたメッセージを指すように再マッピングされます。
  • リソーススコープの OM(同じ resourceId:ソース Thread とクローンされた Thread は同じリソースに属するため、OM レコードは両者で共有されます。複製は行われません。
  • リソーススコープの OM(異なる resourceId:OM レコードは新しいリソースにクローンされます。メッセージ ID は再マッピングされ、観察内にある Thread を識別するタグは、クローンされた Thread を参照するように更新されます。

現在の(最新の)OM 世代だけがクローンされます。以前の履歴世代はコピーされません。一時的な処理状態(観察または振り返りの処理中フラグ)は、クローンされたレコードでリセットされます。