> Discover all available pages from the documentation index: https://mastra.zisheng.pro/ja/llms.txt # Memory.cloneThread() `.cloneThread()` メソッドは、すべてのメッセージを含む既存の会話 Thread のコピーを作成します。会話内の特定の時点から分岐する会話パスを作成できます。セマンティックリコールが有効な場合、このメソッドはクローンされたメッセージのベクトル埋め込みも作成します。 ## 使用例 次の例では、`Memory` インスタンスを作成し、既存の Thread をクローンします。 ```typescript 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`): ソース Thread のメタデータとマージする省略可能なメタデータ。クローンのメタデータは自動的に追加されます。 **options** (`CloneOptions`): クローン処理に使用する省略可能なフィルタリングオプション。 **options.messageLimit** (`number`): クローンするメッセージの最大数。設定すると、直近の N 件のメッセージをクローンします。 **options.messageFilter** (`MessageFilter`): クローンするメッセージを選択するためのフィルター条件。 **options.messageFilter.startDate** (`Date`): この日時以降に作成されたメッセージのみをクローンします。 **options.messageFilter.endDate** (`Date`): この日時以前に作成されたメッセージのみをクローンします。 **options.messageFilter.messageIds** (`string[]`): 指定した ID のメッセージのみをクローンします。 ## 戻り値 **thread** (`StorageThreadType`): クローンのメタデータを含む、新しく作成されたクローン Thread。 **clonedMessages** (`MastraDBMessage[]`): 新しい Thread 用の新しい ID が割り当てられた、クローンされたメッセージの配列。 **messageIdMap** (`Record`): ソースメッセージ ID から、対応するクローンされたメッセージ ID へのマッピング。 ### クローンのメタデータ クローンされた Thread のメタデータには、次のフィールドを持つ `clone` プロパティが含まれます。 **sourceThreadId** (`string`): クローン元である元の Thread の ID。 **clonedAt** (`Date`): クローンが作成された日時。 **lastMessageId** (`string`): クローン作成時点における、ソース Thread の最後のメッセージの ID。 ## 詳細な使用例 ```typescript 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` はプロジェクトに設定された埋め込みモデルです。 ```typescript 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 が有効な場合、`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](https://mastra.zisheng.pro/ja/docs/memory/observational-memory) が有効な場合、`cloneThread()` はソース Thread に関連付けられた OM レコードを自動的にクローンします。動作は OM のスコープによって異なります。 - **Thread スコープの OM**:OM レコードは新しい Thread にクローンされます。内部のすべてのメッセージ ID 参照は、クローンされたメッセージを指すように再マッピングされます。 - **リソーススコープの OM(同じ `resourceId`)**:ソース Thread とクローンされた Thread は同じリソースに属するため、OM レコードは両者で共有されます。複製は行われません。 - **リソーススコープの OM(異なる `resourceId`)**:OM レコードは新しいリソースにクローンされます。メッセージ ID は再マッピングされ、観察内にある Thread を識別するタグは、クローンされた Thread を参照するように更新されます。 現在の(最新の)OM 世代だけがクローンされます。以前の履歴世代はコピーされません。一時的な処理状態(観察または振り返りの処理中フラグ)は、クローンされたレコードでリセットされます。