The Open-Source Copilot Platform
in-app chatbots, and AI-enabled Textareas.
Join our Discord · Website · Report Bug · Request Feature
Questions?
Book a call with us »
Copilot support: We're happy to support your Copilot integration efforts.
You can receive support on our discord
or by booking a call with us.
Building blocks for AI Copilots,
and AI-native Applications.
Bring your own LLM.
🌟 <CopilotChat />:
Build in-app AI chatbots that can "see" the current app state + take action inside your app.
The AI chatbot can talk to your app frontend & backend, and to 3rd party services (Salesforce, Dropbox, etc.) via plugins.
AI "second brain" for your users, on tap.
🌟 <CopilotTextarea />:
AI-assisted text generation. Drop-in replacement for any <textarea />.
Autocompletions + AI editing + generate from scratch. Indexed on your users' content.
How does it work
Define the following simple entry-points into your application, and the CopilotKit🪁 execution engine takes care of the rest!
- Application state (frontend + backend + 3rd party)
- Application interaction (via plain typescript code, frontend + backend)
- Purpose-specific LLM chains
- Application interaction (via plain typescript code, frontend + backend)
- and more.
CopilotKit also provides builit-in (fully-customizable) Copilot-native UX components, including:
CopilotChat, CopilotSidebar, CopilotPopup, and CopilotTextarea.
Installation
npm i @copilotkit/react-core @copilotkit/react-ui @copilotkit/react-textarea
Getting started
See quickstart in the docs
Demo
3-min showcase + 3-min implementation tutorial:
CopilotKit_Demo_Jan_zjgjk0.webm
Building blocks
A more comprehensive and up-to-date overview is available in the docs.
But roughtly:
Copilot entrypoints
- ✅
useMakeCopilotReadable: give frontend state to the copilot - ✅
useMakeCopilotDocumentReadable: give document state to the copilot, especially useful with 3rd party state (e.g. Gong call transcript). - ✅
useMakeCopilotActionable: frontend application interaction - ✅
CopilotBackend: backend application interaction - 🚧
useCopilotChain: provide usecase-specific LLM chains
Built-in UI components
- ✅
<CopilotSidebar>: Built in, hackable Copilot UI (optional - you can bring your own UI). - ✅
<CopilotPopup>: Built in popup UI. - ✅
<CopilotChat>: Standalone chat UI - ✅
<CopilotTextarea />: drop-in<textarea />replacement with Copilot autocompletions. - ✅
useCopilotChat()for fully-custom UI component - 🚧 use custom UX elements inside the chat (coming soon)
Examples
<CopilotSidebar />
import "@copilotkit/react-ui/styles.css"; // add to the app-global css
import { CopilotKit } from "@copilotkit/react-core";
import { CopilotSidebar } from "@copilotkit/react-ui";
function MyAmazingContent() {
const importantInfo = useImportantInfo()
useMakeCopilotReadable("very importnat information: " + importantInfo)
useMakeCopilotActionable(
{
name: `selectDestinations_${toCamelCase(heading)}`,
description: `Set the given destinations as 'selected', on the ${heading} table`,
argumentAnnotations: [
{
name: "destinationNames",
type: "array",
items: {
type: "string",
},
description: "The names of the destinations to select",
required: true,
},
],
implementation: async (destinationNames: string[]) => {
setCheckedRows((prevState) => {
const newState = { ...prevState };
destinationNames.forEach((destinationName) => {
newState[destinationName] = true;
});
return newState;
});
},
},
[],
);
return (
<YourContent />
)
}
export default function App() {
return (
<CopilotKit url="/api/copilotkit/chat"> {/* Global state & copilot logic. Put this around the entire app */}
<CopilotSidebar> {/* A built-in Copilot UI (or bring your own UI). Put around individual pages, or the entire app. */}
<MyAmazingContent />
</CopilotSidebar>
</CopilotKit>
);
}
<CopilotTextarea />
A drop-in replacement with autocompletions, AI insertions/edits, and generate-from-scratch. <br/> Indexed on data provided to the Copilot.</p> <p align="center"> <img src="./assets/CopilotTextarea.gif" width="648" style="border-radius: 15px; max-width="100%""> </p> <div data-attr-class="N-pbC1BtHPkMLbJ8:code-block-container code-overflow-scroll"><pre data-attr-class="N-pbC1BtHPkMLbJ8:code-block"><code data-attr-class="N-pbC1BtHPkMLbJ8:chroma language-typescript display"><span class="kr">import</span> <span class="s2">"@copilotkit/react-textarea/styles.css"</span><span class="p">;</span> <span class="c1">// add to the app-global css </span><span class="kr">import</span> <span class="p">{</span> <span class="nx">CopilotTextarea</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-textarea"</span><span class="p">;</span> <span class="kr">import</span> <span class="p">{</span> <span class="nx">CopilotKit</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-core"</span><span class="p">;</span> <span class="c1">// call ANYWHERE in your app to provide external context (make sure you wrap the app with a <CopilotKit >): </span><span class="c1">// See below for more features (parent/child hierarchy, categories, etc.) </span><span class="nx">useMakeCopilotReadable</span><span class="p">(</span><span class="nx">relevantInformation</span><span class="p">);</span> <span class="nx">useMakeCopilotDocumentReadable</span><span class="p">(</span><span class="nb">document</span><span class="p">);</span> <span class="k">return</span> <span class="p">(</span> <span class="p"><</span><span class="nt">CopilotKit</span> <span class="na">url</span><span class="o">=</span><span class="s">"/api/copilotkit/chat"</span><span class="p">></span> <span class="p">{</span><span class="cm">/* Global state & copilot logic. Put this around the entire app */</span><span class="p">}</span> <span class="p"><</span><span class="nt">CopilotTextarea</span> <span class="na">className</span><span class="o">=</span><span class="s">"p-4 w-1/2 aspect-square font-bold text-3xl bg-slate-800 text-white rounded-lg resize-none"</span> <span class="na">placeholder</span><span class="o">=</span><span class="s">"A CopilotTextarea!"</span> <span class="na">autosuggestionsConfig</span><span class="o">=</span><span class="p">{{</span> <span class="nx">purposePrompt</span><span class="o">:</span> <span class="s2">"A COOL & SMOOTH announcement post about CopilotTextarea. Be brief. Be clear. Be cool."</span><span class="p">,</span> <span class="nx">forwardedParams</span><span class="o">:</span> <span class="p">{</span> <span class="c1">// additional arguments to customize autocompletions </span> <span class="nx">max_tokens</span>: <span class="kt">25</span><span class="p">,</span> <span class="nx">stop</span><span class="o">:</span> <span class="p">[</span><span class="s2">"\n"</span><span class="p">,</span> <span class="s2">"."</span><span class="p">,</span> <span class="s2">","</span><span class="p">],</span> <span class="p">},</span> <span class="p">}}</span> <span class="p">/></span> <span class="p"></</span><span class="nt">CopilotKit</span><span class="p">></span> <span class="p">);</span> </code></pre></div><h2>Near-Term Roadmap</h2> <h3><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="bar chart">📊</span> Please vote on features via the Issues tab!</h3> <h3>Copilot-App Interaction</h3> <ul dir="auto"> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="check mark button">✅</span> <code>useMakeCopilotReadable</code>: give frontend state to the copilot</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="check mark button">✅</span> <code>useMakeCopilotDocumentReadable</code>: give document state to the copilot, especially useful with 3rd party state (e.g. Gong call transcript)</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="check mark button">✅</span> <code>useMakeCopilotActionable</code>: Let the copilot interact with the application</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> <code>useMakeCopilotAskable</code>: let the copilot ask for additional information when needed (coming soon)</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> <code>useCopilotChain</code>: provide usecase-specific chain</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> <code>useEditCopilotMessage</code>: edit the (unsent) typed user message to the copilot (coming soon)</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> copilot-assisted navigation: go to the best page to achieve some objective.</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> Copilot Cloud: From hosting, chat history, analytics, and evals, to automatic Copilot personalization and self-improvement.</li> </ul> <h3>Integrations</h3> <ul dir="auto"> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="check mark button">✅</span> Vercel AI SDK</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="check mark button">✅</span> OpenAI APIs</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> Langchain</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> Additional LLM providers</li> </ul> <h3>Frameworks</h3> <ul dir="auto"> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="check mark button">✅</span> React</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> Vue</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> Svelte</li> <li><span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="construction">🚧</span> Swift (Mac + iOS)</li> </ul> <h2>Contribute</h2> <p dir="auto">Contributions are welcome! <span data-attr-class="N-pbC1BtHPkMLbJ8:emoji" aria-label="party popper">🎉</span></p> <p dir="auto"><a href="<a href="https://discord.gg/6dffbvGU3D" data-markdown-generated-content="">https://discord.gg/6dffbvGU3D</a>">Join the Discord</a> <a href="<a href="https://discord.gg/6dffbvGU3D" data-markdown-generated-content="">https://discord.gg/6dffbvGU3D</a>"><img src="<a href="https://dcbadge.vercel.app/api/server/6dffbvGU3D?compact=true&style=flat" data-markdown-generated-content="">https://dcbadge.vercel.app/api/server/6dffbvGU3D?compact=true&style=flat</a>" alt="Discord"></a></p> <!-- [](<a href="https://discord.gg/6dffbvGU3D" data-markdown-generated-content="">https://discord.gg/6dffbvGU3D</a>) --> <h2>Contact</h2> <p dir="auto">atai <code><at></code> copilotkit.ai</p> </body></html>