A2UI Launched: Full CopilotKit support at launch!

A2UI Launched: CopilotKit has partnered with Google to deliver full support in both CopilotKit and AG-UI!

Check it out
LogoLogo
  • Overview
  • Integrations
  • API Reference
  • Copilot Cloud
Slanted end borderSlanted end border
Slanted start borderSlanted start border
Select integration...

Please select an integration to view the sidebar content.

Persistence

Threads

Learn how to maintain persistent conversations across sessions with CrewAI Flows.

Understanding Thread Persistence

CrewAI Flows supports threads, a way to group messages together and maintain a continuous chat history across sessions. CopilotKit provides mechanisms to ensure conversation state is properly persisted between the frontend and backend.

This guide assumes you have already gone through the quickstart guide.

Note: While the frontend uses threadId to manage conversation sessions, true persistence across sessions requires backend setup. The backend agent needs to implement a persistence mechanism (like the one shown in Message Persistence) to save and load the state associated with each threadId.

See the sample agent implementation for a concrete example.

Frontend: Setting the ThreadId

Loading an Existing Thread

To load an existing thread in CopilotKit, set the threadId property on <CopilotKit>:

import { CopilotKit } from "@copilotkit/react-core";

<CopilotKit threadId="37aa68d0-d15b-45ae-afc1-0ba6c3e11353">
  <YourApp />
</CopilotKit>;

Dynamically Switching Threads

You can make the threadId dynamic. Once set, CopilotKit will load previous messages for that thread.

import { useState } from "react";
import { CopilotKit } from "@copilotkit/react-core";

const Page = () => {
  const [threadId, setThreadId] = useState(
    "af2fa5a4-36bd-4e02-9b55-2580ab584f89"
  );
  return (
    <CopilotKit threadId={threadId}>
      <YourApp setThreadId={setThreadId} />
    </CopilotKit>
  );
};

const YourApp = ({ setThreadId }) => {
  return (
    <Button onClick={() => setThreadId("679e8da5-ee9b-41b1-941b-80e0cc73a008")}>
      Change Thread
    </Button>
  );
};

Using setThreadId

CopilotKit provides the current threadId and a setThreadId function from the useCopilotContext hook:

import { useCopilotContext } from "@copilotkit/react-core";

const ChangeThreadButton = () => {
  const { threadId, setThreadId } = useCopilotContext();
  return (
    <Button onClick={() => setThreadId("d73c22f3-1f8e-4a93-99db-5c986068d64f")}>
      Change Thread
    </Button>
  );
};
PREV
Loading Agent State
Slanted end borderSlanted end border
Slanted start borderSlanted start border
NEXT
Message Persistence

On this page

Understanding Thread Persistence
Frontend: Setting the ThreadId
Loading an Existing Thread
Dynamically Switching Threads
Using setThreadId