Version Packages
CopilotKit🪁

Add a powerful & hackable copilot to any app, in an afternoon.
Overview
- ✅ NEW:
<CopilotTextarea />: a drop-in<textarea />replacement with Copilot autocompletions. - ✅
useMakeCopilotReadable(...): Propagate granular app state to the Copilot & Textareas. - ✅
useMakeCopilotActionable(...): Let the Copilot take action on behalf of the user. - 🚧 CopilotCloudKit: integrate arbitrary LLM logic / chains / RAG, using plain code.
Demo
CopilotKit in action.
Installation
pnpm install @copilotkit/react-core @copilotkit/react-ui @copilotkit/react-textarea
Examples
NEW! <CopilotTextarea />
A drop-in replacement with context-aware Copilot autocompletions.</p> <p align="center"> <img src="./assets/CopilotTextarea.gif" width="400" height="400" style="border-radius: 15px;"> </p> <h4>Features</h4> <ol dir="auto"> <li>Customizable <code>purpose</code> prompt.</li> <li>Provide arbitrary context to inform autocompletions using <code>useMakeCopilotReadable</code></li> <li>Works with any OpenAI-compatible endpoint (<a href="CopilotKit/examples/next-openai/src/app/api/autosuggestions/route.ts">example implementation</a>)</li> <li>Supports all <code><textarea /></code> customizations</li> </ol> <div data-attr-class="_sVgCd_-GW5hXjhK:code-block-container code-overflow-scroll"><pre data-attr-class="_sVgCd_-GW5hXjhK:code-block"><code data-attr-class="_sVgCd_-GW5hXjhK: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">CopilotProvider</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-core"</span><span class="p">;</span> <span class="k">return</span> <span class="p">(</span> <span class="p"><</span><span class="nt">CopilotProvider</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">externalContextCategories</span><span class="o">:</span> <span class="p">[</span><span class="s2">"someSpecificContextCategory"</span><span class="p">],</span> <span class="c1">// or leave as `undefined`, for the default global Copilot context </span> <span class="nx">apiEndpoint</span><span class="o">:</span> <span class="s2">"/api/autosuggestions"</span> <span class="c1">// (Any OpenAI-compatible endpoint. See above) </span> <span class="nx">forwardedParams</span><span class="o">:</span> <span class="p">{</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">CopilotProvider</span><span class="p">></span> <span class="p">);</span> </code></pre></div><h3>Integrate copilot</h3> <div data-attr-class="_sVgCd_-GW5hXjhK:code-block-container code-overflow-scroll"><pre data-attr-class="_sVgCd_-GW5hXjhK:code-block"><code data-attr-class="_sVgCd_-GW5hXjhK:chroma language-typescript display"><span class="kr">import</span> <span class="s2">"@copilotkit/react-ui/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">CopilotProvider</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-core"</span><span class="p">;</span> <span class="kr">import</span> <span class="p">{</span> <span class="nx">CopilotSidebarUIProvider</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-ui"</span><span class="p">;</span> <span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">App</span><span class="p">()</span><span class="o">:</span> <span class="nx">JSX</span><span class="p">.</span><span class="nx">Element</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="p"><</span><span class="nt">CopilotProvider</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">CopilotSidebarUIProvider</span><span class="p">></span> <span class="p">{</span><span class="cm">/* A built-in Copilot UI (or bring your own UI). Put around individual pages, or the entire app. */</span><span class="p">}</span> <span class="p"><</span><span class="nt">YourContent</span> <span class="p">/></span> <span class="p"></</span><span class="nt">CopilotSidebarUIProvider</span><span class="p">></span> <span class="p"></</span><span class="nt">CopilotProvider</span><span class="p">></span> <span class="p">);</span> <span class="p">}</span> </code></pre></div><h4>Features</h4> <ol dir="auto"> <li>Batteries included. Add 2 React components, and your Copilot is live.</li> <li>Customize the built-in <code>CopilotSidebarUIProvider</code> UI -- or bring your own UI component.</li> <li>Extremely hackable. Should the need arise, you can define 1st-class extensions just as powerful as <code>useMakeCopilotReadable</code>, <code>useMakeCopilotActionable</code>, etc.</li> </ol> <h3>Give the copilot read permissions</h3> <h4>Features</h4> <ol dir="auto"> <li>Propagate useful information & granular app-state to the Copilot</li> <li>Easily maintain the hierarchical structure of information with <code>parentId</code></li> <li>One call to rule them all: <code>useMakeCopilotReadable</code> works both with the sidekick, and with CopilotTextarea. <ul> <li>Use the <code>contextCategories: string[]</code> param to route information to different places.</li> </ul> </li> </ol> <div data-attr-class="_sVgCd_-GW5hXjhK:code-block-container code-overflow-scroll"><pre data-attr-class="_sVgCd_-GW5hXjhK:code-block"><code data-attr-class="_sVgCd_-GW5hXjhK:chroma language-typescript display"><span class="kr">import</span> <span class="p">{</span> <span class="nx">useMakeCopilotReadable</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-core"</span><span class="p">;</span> <span class="kd">function</span> <span class="nx">Employee</span><span class="p">(</span><span class="nx">props</span>: <span class="kt">EmployeeProps</span><span class="p">)</span><span class="o">:</span> <span class="nx">JSX</span><span class="p">.</span><span class="nx">Element</span> <span class="p">{</span> <span class="kr">const</span> <span class="p">{</span> <span class="nx">employeeName</span><span class="p">,</span> <span class="nx">workProfile</span><span class="p">,</span> <span class="nx">metadata</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">props</span><span class="p">;</span> <span class="c1">// propagate any information copilot </span> <span class="kr">const</span> <span class="nx">employeeContextId</span> <span class="o">=</span> <span class="nx">useMakeCopilotReadable</span><span class="p">(</span><span class="nx">employeeName</span><span class="p">);</span> <span class="c1">// Pass a parentID to maintain a hiearchical structure. </span> <span class="c1">// Especially useful with child React components, list elements, etc. </span> <span class="nx">useMakeCopilotReadable</span><span class="p">(</span><span class="nx">workProfile</span><span class="p">.</span><span class="nx">description</span><span class="p">(),</span> <span class="nx">employeeContextId</span><span class="p">);</span> <span class="nx">useMakeCopilotReadable</span><span class="p">(</span><span class="nx">metadata</span><span class="p">.</span><span class="nx">description</span><span class="p">(),</span> <span class="nx">employeeContextId</span><span class="p">);</span> <span class="k">return</span> <span class="p">(</span> <span class="c1">// Render as usual... </span> <span class="p">);</span> <span class="p">}</span> </code></pre></div><h3>Give the copilot write permissions</h3> <div data-attr-class="_sVgCd_-GW5hXjhK:code-block-container code-overflow-scroll"><pre data-attr-class="_sVgCd_-GW5hXjhK:code-block"><code data-attr-class="_sVgCd_-GW5hXjhK:chroma language-typescript display"><span class="kr">import</span> <span class="p">{</span> <span class="nx">useMakeCopilotActionable</span> <span class="p">}</span> <span class="kr">from</span> <span class="s2">"@copilotkit/react-core"</span><span class="p">;</span> <span class="kd">function</span> <span class="nx">Department</span><span class="p">(</span><span class="nx">props</span>: <span class="kt">DepartmentProps</span><span class="p">)</span><span class="o">:</span> <span class="nx">JSX</span><span class="p">.</span><span class="nx">Element</span> <span class="p">{</span> <span class="c1">// ... </span> <span class="c1">// Let the copilot take action on behalf of the user. </span> <span class="nx">useMakeCopilotActionable</span><span class="p">(</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">"setEmployeesAsSelected"</span><span class="p">,</span> <span class="nx">description</span><span class="o">:</span> <span class="s2">"Set the given employees as 'selected'"</span><span class="p">,</span> <span class="nx">argumentAnnotations</span><span class="o">:</span> <span class="p">[</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">"employeeIds"</span><span class="p">,</span> <span class="kr">type</span><span class="o">:</span> <span class="s2">"array"</span><span class="p">,</span> <span class="nx">items</span><span class="o">:</span> <span class="p">{</span> <span class="kr">type</span><span class="o">:</span> <span class="s2">"string"</span> <span class="p">}</span> <span class="nx">description</span><span class="o">:</span> <span class="s2">"The IDs of employees to set as selected"</span><span class="p">,</span> <span class="nx">required</span>: <span class="kt">true</span> <span class="p">}</span> <span class="p">],</span> <span class="nx">implementation</span>: <span class="kt">async</span> <span class="p">(</span><span class="nx">employeeIds</span><span class="p">)</span> <span class="o">=></span> <span class="nx">setEmployeesAsSelected</span><span class="p">(</span><span class="nx">employeeIds</span><span class="p">),</span> <span class="p">},</span> <span class="p">[]</span> <span class="p">);</span> <span class="c1">// ... </span><span class="p">}</span> </code></pre></div><h4>Features</h4> <ol dir="auto"> <li>Plain typescript actions. Edit a textbox, navigate to a new page, or anythign you can think of.</li> <li>Specify arbitrary input types.</li> </ol> <h2>Near-Term Roadmap</h2> <h3><span data-attr-class="_sVgCd_-GW5hXjhK: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="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> <code>useMakeCopilotReadable</code>: give static information to the copilot, in sync with on-screen state</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> <code>useMakeCopilotActionable</code>: Let the copilot take action on behalf of the user</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK: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="_sVgCd_-GW5hXjhK: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="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> copilot-assisted navigation: go to the best page to achieve some objective.</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> CopilotCloudKit: integrate arbitrary LLM logic / chains / RAG, using plain code.</li> </ul> <h3>UI components</h3> <ul dir="auto"> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> <code><CopilotSidebarUIProvider></code>: Built in, hackable Copilot UI (optional - you can bring your own UI).</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> <code><CopilotTextarea /></code>: drop-in <code><textarea /></code> replacement with Copilot autocompletions.</li> </ul> <h3>Integrations</h3> <ul dir="auto"> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> Vercel AI SDK</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> OpenAI APIs</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> Langchain</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> Additional LLM providers</li> </ul> <h3>Frameworks</h3> <ul dir="auto"> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="check mark button">✅</span> React</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> Vue</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> Svelte</li> <li><span data-attr-class="_sVgCd_-GW5hXjhK:emoji" aria-label="construction">🚧</span> Swift (Mac + iOS)</li> </ul> <h2>Contribute</h2> <p dir="auto">Contributions are welcome! <span data-attr-class="_sVgCd_-GW5hXjhK: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>) --> </body></html>

