2023-08-28 20:18:39 -07:00
2023-08-28 10:04:21 -07:00
2023-08-29 03:13:52 +00:00
2023-08-22 23:09:55 -07:00
2023-06-30 16:46:26 -07:00
2023-08-25 10:36:11 -07:00

CopilotKit🪁 Discord Online Users GitHub CI

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="Jr6ei4c4SI88lgeD:code-block-container code-overflow-scroll"><pre data-attr-class="Jr6ei4c4SI88lgeD:code-block"><code data-attr-class="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD:code-block-container code-overflow-scroll"><pre data-attr-class="Jr6ei4c4SI88lgeD:code-block"><code data-attr-class="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD:code-block-container code-overflow-scroll"><pre data-attr-class="Jr6ei4c4SI88lgeD:code-block"><code data-attr-class="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD:code-block-container code-overflow-scroll"><pre data-attr-class="Jr6ei4c4SI88lgeD:code-block"><code data-attr-class="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD:emoji" aria-label="construction">🚧</span> copilot-assisted navigation: go to the best page to achieve some objective.</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD: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="Jr6ei4c4SI88lgeD:emoji" aria-label="check mark button">✅</span> Vercel AI SDK</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="check mark button">✅</span> OpenAI APIs</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="construction">🚧</span> Langchain</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="construction">🚧</span> Additional LLM providers</li> </ul> <h3>Frameworks</h3> <ul dir="auto"> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="check mark button">✅</span> React</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="construction">🚧</span> Vue</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="construction">🚧</span> Svelte</li> <li><span data-attr-class="Jr6ei4c4SI88lgeD:emoji" aria-label="construction">🚧</span> Swift (Mac + iOS)</li> </ul> <h2>Contribute</h2> <p dir="auto">Contributions are welcome! <span data-attr-class="Jr6ei4c4SI88lgeD: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> <!-- [![Discord](<a href="https://img.shields.io/discord/1122926057641742418.svg" data-markdown-generated-content="">https://img.shields.io/discord/1122926057641742418.svg</a>)](<a href="https://discord.gg/6dffbvGU3D" data-markdown-generated-content="">https://discord.gg/6dffbvGU3D</a>) --> </body></html>

S
Description
CopilotKit:面向智能体和生成式 UI 的前端技术栈,支持 React、Angular、移动端和 Slack 等,AG-UI 协议缔造者。|GitHub 镜像 37k · 🍴 4.6k
https://github.com/copilotkit/copilotkit Readme 804 MiB
Languages
TypeScript 79.4%
MDX 7.5%
Python 6%
Shell 1.4%
C# 1.3%
Other 4.4%