useThreads
React hook for listing, managing, and syncing conversation threads with useThreads — rename, archive, delete, and paginate threads with realtime updates via WebSocket.
Overview
useThreads is a React hook for managing conversation threads on the Enterprise Intelligence Platform. It fetches the thread list for a given agent, keeps it synchronized in realtime via WebSocket, and exposes mutation methods for renaming, archiving, and deleting threads.
Threads are sorted by most recently updated first. The hook supports cursor-based pagination when a limit is provided.
Signature
import { useThreads } from "@copilotkit/react-core/v2";
function useThreads(input: UseThreadsInput): UseThreadsResult
Parameters
Configuration object for the hook.
The ID of the agent whose threads to list. Must match an agent configured in your runtime.
Whether to include archived threads in the list.
Maximum number of threads to fetch per page. When set, enables cursor-based pagination via fetchMoreThreads() and hasMoreThreads.
Return Value
State
Array of threads for the current user and agent, sorted by most recently updated first. Each Thread contains:
id: string— unique thread identifieragentId: string— the agent this thread belongs toname: string | null— thread name (auto-generated by the LLM on first run, or set manually viarenameThread)archived: boolean— whether the thread is archivedcreatedAt: string— ISO 8601 timestampupdatedAt: string— ISO 8601 timestamplastRunAt?: string— ISO 8601 timestamp of the most recent run on this thread. Only present when the thread has had at least one run. Useful for surfacing "last activity" timing distinct fromupdatedAt(which also bumps on metadata changes like rename/archive).
true while the initial thread list is being fetched.
The most recent error from fetching or mutating threads, or null if no error has occurred.
true when more threads are available beyond the current page. Only meaningful when limit is set.
true while additional threads are being fetched.
Methods
Fetch the next page of threads. No-op if hasMoreThreads is false or a fetch is already in progress.
Rename a thread. The promise resolves when the server confirms the operation, or rejects with an Error on failure.
Soft-delete a thread. The thread remains in the database with archived: true but is excluded from the list unless includeArchived is true. Archived threads can be restored via the unarchived platform event. The promise resolves on server confirmation, or rejects with an Error on failure. No built-in confirmation dialog — implement your own if needed.
Permanently and irreversibly delete a thread. The thread record is removed from the database entirely. The promise resolves on server confirmation, or rejects with an Error on failure. No built-in confirmation dialog — implement your own if needed.
Usage
import { useThreads } from "@copilotkit/react-core/v2"; // [!code highlight]
function ThreadList() {
const {
threads,
isLoading,
renameThread,
archiveThread,
deleteThread,
} = useThreads({ agentId: "my-agent" }); // [!code highlight]
if (isLoading) return <div>Loading threads...</div>;
return (
<ul>
{threads.map((thread) => (
<li key={thread.id}>
<span>{thread.name ?? "Untitled"}</span>
<button onClick={() => renameThread(thread.id, "New name")}>
Rename
</button>
<button onClick={() => archiveThread(thread.id)}>Archive</button>
<button onClick={() => deleteThread(thread.id)}>Delete</button>
</li>
))}
</ul>
);
}
Behavior
- On mount, fetches the thread list and establishes a realtime WebSocket subscription.
- Thread creates, renames, archives, and deletes from any client are reflected immediately without polling.
- All mutation methods use pessimistic updates — the UI updates only after the server confirms the operation via WebSocket, not immediately on dispatch. Promises resolve on confirmation (15-second timeout) and reject on failure.
- The
errorstate updates with the most recent error from any operation. - The
threadsarray stays sorted byupdatedAtdescending (most recent first). - New threads are automatically named by the LLM after their first run (2–5 word title). This is configurable via
generateThreadNameson the runtime.
Next steps
- Understand how it works: How Threads & Persistence Work — architecture, event replay model, and WebSocket sync
- Step-by-step guide: Threads — set up thread management in your app
- Tutorial: Build a Multi-Conversation Chat App — end-to-end walkthrough building a chat app with thread history
