Skip to content

复制线程

您可能希望复制(即“分叉”)现有的线程,以保留现有线程的历史记录并创建独立运行的线程,这些线程不会影响原始线程。本指南将向您展示如何执行此操作。

设置

此代码假设您已经有一个线程可供复制。您可以在此处了解线程的概念这里,并学习如何在这些操作指南中流式传输线程上的运行。

SDK 初始化

首先,我们需要设置客户端以便能够与托管的图通信:

from langgraph_sdk import get_client
client = get_client(url="<DEPLOYMENT_URL>")
assistant_id = "agent"
thread = await client.threads.create()
import { Client } from "@langchain/langgraph-sdk";

const client = new Client({ apiUrl: "<DEPLOYMENT_URL>" });
const assistantId = "agent";
const thread = await client.threads.create();
curl --request POST \
  --url <DEPLOYMENT_URL>/threads \
  --header 'Content-Type: application/json' \
  --data '{
    "metadata": {}
  }'

复制一个线程

以下代码假设您要复制的线程已经存在。

复制一个线程会创建一个新的具有与现有线程相同历史记录的新线程,然后允许您继续执行运行。

创建副本

copied_thread = await client.threads.copy(<THREAD_ID>)
let copiedThread = await client.threads.copy(<THREAD_ID>);
curl --request POST --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/copy \
--header 'Content-Type: application/json'

验证副本

我们可以验证前一个线程的历史记录是否确实正确复制:

def remove_thread_id(d):
  if 'metadata' in d and 'thread_id' in d['metadata']:
      del d['metadata']['thread_id']
  return d

original_thread_history = list(map(remove_thread_id,await client.threads.get_history(<THREAD_ID>)))
copied_thread_history = list(map(remove_thread_id,await client.threads.get_history(copied_thread['thread_id'])))

# 比较两个历史记录
assert original_thread_history == copied_thread_history
# 如果通过了断言,则说明历史记录一致
print("历史记录一致。")
function removeThreadId(d) {
  if (d.metadata && d.metadata.thread_id) {
    delete d.metadata.thread_id;
  }
  return d;
}

// 假设`client.threads.getHistory(threadId)`是返回字典列表的异步函数
async function compareThreadHistories(threadId, copiedThreadId) {
  const originalThreadHistory = (await client.threads.getHistory(threadId)).map(removeThreadId);
  const copiedThreadHistory = (await client.threads.getHistory(copiedThreadId)).map(removeThreadId);

  // 比较两个历史记录
  console.assert(JSON.stringify(originalThreadHistory) === JSON.stringify(copiedThreadHistory));
  // 如果通过了断言,则说明历史记录一致
  console.log("历史记录一致。");
}

// 示例用法
compareThreadHistories(<THREAD_ID>, copiedThread.thread_id);
if diff <(
    curl --request GET --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/history | jq -S 'map(del(.metadata.thread_id))'
) <(
    curl --request GET --url <DEPLOYMENT_URL>/threads/<COPIED_THREAD_ID>/history | jq -S 'map(del(.metadata.thread_id))'
) >/dev/null; then
    echo "历史记录一致。"
else
    echo "历史记录不一致。"
fi

输出:

历史记录一致。

Comments