> Discover all available pages from the documentation index: https://mastra.zisheng.pro/ko/llms.txt # Memory.cloneThread() 그만큼`.cloneThread()`메서드는 모든 메시지를 포함하여 기존 대화 스레드의 복사본을 만듭니다. 대화의 특정 지점에서 다양한 대화 경로 생성을 지원합니다. 의미적 회상이 활성화되면 이 메서드는 복제된 메시지에 대한 벡터 임베딩도 생성합니다. ## 사용예 다음 예에서는 `Memory` 인스턴스를 만들고 기존 스레드를 복제합니다. ```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`): 복제할 스레드의 ID **newThreadId** (`string`): 복제된 스레드에 사용할 선택적 사용자 정의 ID입니다. 제공하지 않으면 자동으로 생성됩니다. **resourceId** (`string`): 복제된 스레드에 사용할 선택적 리소스 ID입니다. 기본값은 원본 스레드의 resourceId입니다. **title** (`string`): 복제된 스레드에 사용할 선택적 제목입니다. 생략하고 원본 스레드에 제목이 있으면 복제본은 Clone of ${sourceThread.title}을 사용합니다. 그렇지 않으면 제목은 비어 있습니다. **metadata** (`Record`): 원본 스레드의 메타데이터와 병합할 선택적 메타데이터입니다. 복제 메타데이터는 자동으로 추가됩니다. **options** (`CloneOptions`): 복제 작업을 위한 선택적 필터링 옵션입니다. **options.messageLimit** (`number`): 복제할 최대 메시지 수입니다. 설정하면 가장 최근 메시지 N개를 복제합니다. **options.messageFilter** (`MessageFilter`): 복제할 메시지를 선택하기 위한 필터 조건입니다. **options.messageFilter.startDate** (`Date`): 이 날짜 이후(해당 날짜 포함)에 생성된 메시지만 복제합니다. **options.messageFilter.endDate** (`Date`): 이 날짜 이전(해당 날짜 포함)에 생성된 메시지만 복제합니다. **options.messageFilter.messageIds** (`string[]`): 지정된 ID를 가진 메시지만 복제합니다. ## 보고 **thread** (`StorageThreadType`): 복제 메타데이터가 포함된 새로 생성된 복제 스레드입니다. **clonedMessages** (`MastraDBMessage[]`): 새 스레드에 할당된 새 ID를 가진 복제 메시지 배열입니다. **messageIdMap** (`Record`): 원본 메시지 ID와 해당 복제 메시지 ID 간의 매핑입니다. ### 메타데이터 복제 복제된 스레드의 메타데이터에는 다음 항목을 가진 `clone` 속성이 포함됩니다. **sourceThreadId** (`string`): 복제된 원본 스레드의 ID입니다. **clonedAt** (`Date`): 복제본이 생성된 시점의 타임스탬프입니다. **lastMessageId** (`string`): 복제 시점에 원본 스레드에 있던 마지막 메시지의 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.id`와 `thread.resourceId`를 `agent.generate()`에 전달합니다. ## 벡터 임베딩 Memory 인스턴스에 벡터 저장소와 임베더가 구성되어 의미 체계 회상이 활성화된 경우, `cloneThread()`는 복제된 모든 메시지의 벡터 임베딩을 자동으로 생성합니다. 따라서 복제된 스레드에서도 의미 체계 검색이 올바르게 작동합니다. 이 예에서 `embeddingModel`은 프로젝트에 구성된 임베딩 Model입니다. ```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', }) ``` ## 작업기억 작업 Memory가 활성화되면 `cloneThread()`는 작업 Memory의 범위와 복제본의 `resourceId`에 따라 작업 Memory를 복사하거나 공유합니다. - **스레드 범위 작업 Memory**: 작업 Memory가 복제된 스레드에 복사됩니다. - **동일한 리소스 범위의 작업 Memory`resourceId`**: 원본 스레드와 복제된 스레드가 동일한 리소스에 속하므로 작업 Memory가 공유됩니다. - **다른 리소스 범위의 작업 Memory`resourceId`**: 작업 Memory가 복제된 스레드의 리소스에 복사됩니다. ## 관찰 기억 [Observational Memory](https://mastra.zisheng.pro/ko/docs/memory/observational-memory)가 활성화되면 `cloneThread()`는 원본 스레드와 연결된 OM 레코드를 자동으로 복제합니다. 동작은 OM 범위에 따라 달라집니다. - **스레드 범위 OM**: OM 레코드가 새 스레드에 복제됩니다. 모든 내부 메시지 ID 참조는 복제된 메시지를 가리키도록 다시 매핑됩니다. - **리소스 범위 OM(동일`resourceId`)**: OM 레코드는 동일한 리소스에 속하므로 소스 스레드와 복제된 스레드 간에 공유됩니다. 중복이 발생하지 않습니다. - **리소스 범위 OM(다른`resourceId`)**: OM 레코드가 새 리소스에 복제됩니다. 메시지 ID가 다시 매핑되고 관찰 내의 스레드 식별 태그가 복제된 스레드를 참조하도록 업데이트됩니다. 현재(가장 최근) OM 세대만 복제됩니다. 이전 기록 세대는 복사되지 않습니다. 일시적인 처리 상태(관찰/반영 진행 중 플래그)는 복제된 기록에서 재설정됩니다.