Files
Benjamin Taylor f23eebea06 docs(intelligence-platform): add self-hosting how-to and platform architecture explainer
Add the documentation kit for self-hosted CopilotKit Intelligence:

- (root)/premium/self-hosting.mdx — canonical how-to covering platform
  prerequisites, values file configuration (AWS ALB/IRSA and on-prem
  nginx paths), secret delivery via External Secrets or direct
  Kubernetes Secrets, install/verify/upgrade/uninstall steps, and an
  inline values.yaml reference
- learn/intelligence-platform.mdx — Diataxis explanation covering the
  app-api / app-frontend / realtime-gateway workloads, the
  control-plane/data-plane split, the multi-tenancy model
  (organization/project/user with auth.deploymentMode postures), the
  platform-layer vs application-layer split for self-hosted installs,
  secret rotation, scaling, upgrade, error handling, and the
  hosted-vs-self-hosted decision
- snippets/shared/premium/self-hosting.mdx — shared snippet that
  mirrors the canonical how-to for integration pointer pages
- integrations/*/premium/self-hosting.mdx (12 frameworks) — thin
  pointer pages that import the shared snippet, so Self-Hosting is
  discoverable from every integration sidebar (a2a has no /premium/
  subdir and is intentionally skipped)
- meta.json nav entries in (root)/premium, learn, and every integration
  premium sidebar

Also wraps the remaining Threads docs with the ThreadsEarlyAccess gate
(root threads.mdx, shared threads snippet, multi-conversation-chat
tutorial) and replaces the previous "self-hosted Enterprise, configure
your database connection per the Enterprise setup guide" placeholders
with real /premium/self-hosting links — the Threads docs referenced a
setup guide that did not exist until now.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 23:12:52 -05:00

153 lines
6.0 KiB
Plaintext

import { Tabs, Tab } from "fumadocs-ui/components/tabs";
<ThreadsEarlyAccess>
## What is this?
CopilotKit threads enable persistent, resumable multi-turn conversations. The `useThreads` hook lists, creates, renames, archives, and deletes threads with realtime synchronization via WebSocket. Threads work with any agent framework — the Intelligence Platform stores conversation history server-side, so users can close their browser and pick up where they left off. Thread metadata updates (renames, archives, new threads) are pushed to all connected clients in realtime without polling.
## When should I use this?
- Your app needs multiple saved conversations per user (like a chat history sidebar)
- Users should be able to resume a prior conversation across sessions or devices
- You want realtime sync so threads created on one tab appear on another
- You need to let users organize conversations by renaming or archiving them
## Prerequisites
- A working CopilotKit setup — see [Quickstart](/quickstart) if you're starting fresh
- The CopilotKit Intelligence Platform (available via [Copilot Cloud](https://cloud.copilotkit.ai) or [self-hosted on your own Kubernetes cluster](/premium/self-hosting))
- `@copilotkit/react-core` v1.50+
## Implementation
<Steps>
<Step>
### Configure your runtime with the Intelligence Platform
Connect your CopilotKit runtime to the Intelligence Platform. This provides the thread storage and WebSocket infrastructure. Thread names are automatically generated by the LLM after the first message — you can disable this with `generateThreadNames: false`.
```typescript title="server.ts"
import { CopilotRuntime } from "@copilotkit/runtime";
const runtime = new CopilotRuntime({
agents: {
default: agent,
},
// Thread names are auto-generated by default.
// Set to false to disable:
// generateThreadNames: false,
// Optional: tune thread lock behavior
// lockTtlSeconds: 20, // Lock TTL (default 20s, max 3600s)
// lockHeartbeatIntervalSeconds: 15, // Heartbeat interval (default 15s, max 3000s)
// lockKeyPrefix: "my-app", // Custom Redis key prefix for the lock
});
```
If you're using Copilot Cloud, thread storage is handled automatically. For self-hosted deployments, see [Self-Hosting Intelligence](/premium/self-hosting) for the Helm chart install and database configuration.
</Step>
<Step>
### List and manage threads with useThreads
Use the `useThreads` hook to fetch and manage threads for a specific agent. The hook returns the thread list, loading state, and mutation methods.
```tsx title="ThreadSidebar.tsx"
import { useThreads } from "@copilotkit/react-core/v2"; // [!code highlight]
function ThreadSidebar() {
const { // [!code highlight:6]
threads,
isLoading,
renameThread,
archiveThread,
deleteThread,
} = useThreads({ agentId: "my-agent" });
if (isLoading) return <div>Loading...</div>;
return (
<div>
{threads.map((thread) => (
<div key={thread.id}>
<span>{thread.name ?? "New conversation"}</span>
<button onClick={() => renameThread(thread.id, "Renamed")}>
Rename
</button>
<button onClick={() => archiveThread(thread.id)}>
Archive
</button>
</div>
))}
</div>
);
}
```
The `threads` array is sorted by most recently updated first and stays synchronized in realtime — new threads from other tabs or devices appear automatically.
**Archive vs. delete:** `archiveThread` is a soft delete — the thread stays in the database but is hidden from the list by default. Pass `includeArchived: true` to show archived threads. `deleteThread` is permanent and irreversible. Neither has a built-in confirmation dialog — add your own if needed.
</Step>
<Step>
### Switch between threads
When a user selects a thread, pass its `threadId` to your chat component. The chat clears the current messages, fetches the selected thread's history, and replays it. If the agent is still running on that thread, the chat picks up the live stream.
```tsx title="App.tsx"
import { CopilotChat } from "@copilotkit/react-core/v2"; // [!code highlight]
import { useState } from "react";
function App() {
const [activeThreadId, setActiveThreadId] = useState<string | undefined>();
return (
<div className="flex">
<ThreadSidebar onSelectThread={setActiveThreadId} />
<CopilotChat threadId={activeThreadId} /> {/* [!code highlight] */}
</div>
);
}
```
When `threadId` changes, the chat component automatically loads the selected thread's history and reconnects to the agent's stream. If the agent is still running on that thread, the chat picks up the live stream.
</Step>
<Step>
### Add pagination for large thread lists
For users with many conversations, use the `limit` parameter to enable cursor-based pagination.
```tsx title="ThreadSidebar.tsx"
const {
threads,
hasMoreThreads,
isFetchingMoreThreads,
fetchMoreThreads,
} = useThreads({
agentId: "my-agent",
limit: 20, // [!code highlight]
});
// In your JSX:
{hasMoreThreads && (
<button
onClick={fetchMoreThreads}
disabled={isFetchingMoreThreads}
>
{isFetchingMoreThreads ? "Loading..." : "Load more"}
</button>
)}
```
</Step>
</Steps>
## Next steps
- **Understand how it works:** [How Threads & Persistence Work](/learn/threads) — architecture, event replay model, and WebSocket sync
- **API reference:** [useThreads](/reference/v2/hooks/useThreads) — parameters, return values, types
- **Tutorial:** [Build a Multi-Conversation Chat App](/learn/tutorials/multi-conversation-chat) — end-to-end walkthrough building a chat app with thread history
</ThreadsEarlyAccess>