/CopilotKit

Build in-app AI chatbots ๐Ÿค–, and AI-powered Textareas โœจ, into react web apps.

Primary LanguageTypeScriptMIT LicenseMIT

Discord GitHub CI


Explore the docs ยป

Join our Discord ยท Website ยท Report Bug ยท Request Feature

Questions? Book a call with us ยป

The Open-Source Copilot Platform

In-app chatbots, and AI-enabled TextArea.

๐ŸŒŸ Copilot Chatbot:
Build powerful 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.
Starting with React. Use any LLM.

Combines frontend SDKs, backend SDKs, and (optional) cloud infrastructure. Open-source ๐Ÿช

๐ŸŽฏ Features Overview

CopilotTextarea: AI-assisted text generation + editing.

  • โœ… A a drop-in <textarea /> replacement. Supports all <textarea /> customizations.
  • โœ… Context-aware autocompletions โœจ (like in GitHub Copilot)
  • โœ… AI editing โœจ - "list the client's top 3 pain points from the last call using @SalesforceData"
  • ๐ŸŸฉ Generate from scratch โœจ - automatically populate the initial content based on given context
  • โœ… App context & 3rd party context with useMakeCopilotReadable and useMakeCopilotDocumentReadable
  • โœ… Fully custsomizable prompt engineering
  • ๐ŸŸฉ Arbitrary LLM chains.
  • ๐ŸŸฉ Bold + italics.

Copilot Chatbot: (frontend + backend) runtimes for in-app copilots.

  • โœ… Index on frontend app state (via useMakeCopilotReadable and useMakeCopilotDocumentReadable)
  • ๐ŸŸฉ Index on backend state
  • โœ… frontend function calling runtime (in-app actions) (via useMakeCopilotActionable)
  • ๐ŸŸฉ backend function calling runtime (auth enabled)
  • ๐ŸŸฉ Autorun vs. "sensitive" functions (require user approval before execution).
  • โœ… Cursor-style @document-referecing.
  • โœ… Bring your own model
  • ๐ŸŸฉ 3rd party plugins
  • ๐ŸŸฉ execute arbitrary LLM chains
  • ๐ŸŸฉ OpenAI assistants api
  • โœ… Fully customize UI

Demo

2-min showcase + 2-min implementation tutorial:

copilot_full_demo_nxxpbr.3.mp4

Installation

npm i @copilotkit/react-core @copilotkit/react-ui @copilotkit/react-textarea

Getting started

See quickstart in the docs

Examples

<CopilotTextarea />

A drop-in <textarea /> replacement with context-aware Copilot autocompletions.

Features

  1. Customizable purpose prompt.
  2. Provide arbitrary context to inform autocompletions using useMakeCopilotReadable
  3. Works with any backend/LLM, using ChatlikeApiEndpoint
  4. Supports all <textarea /> customizations
import "@copilotkit/react-textarea/styles.css"; // add to the app-global css
import { CopilotTextarea } from "@copilotkit/react-textarea";
import { CopilotProvider } from "@copilotkit/react-core";

// call ANYWHERE in your app to provide external context (make sure you wrap the app with a <CopilotProvider >):
// See below for more features (parent/child hierarchy, categories, etc.)
useMakeCopilotReadable(relevantInformation)
useMakeCopilotDocumentReadable(document)

return (
  <CopilotProvider chatApiEndpoint="/api/copilotkit/chat"> {/* Global state & copilot logic. Put this around the entire app */}
    <CopilotTextarea
      className="p-4 w-1/2 aspect-square font-bold text-3xl bg-slate-800 text-white rounded-lg resize-none"
      placeholder="A CopilotTextarea!"
      autosuggestionsConfig={{
        purposePrompt: "A COOL & SMOOTH announcement post about CopilotTextarea. Be brief. Be clear. Be cool.",
        forwardedParams: { // additional arguments to customize autocompletions
          max_tokens: 25,
          stop: ["\n", ".", ","],
        },
      }}
    />
  </CopilotProvider>
);

Integrate copilot

import "@copilotkit/react-ui/styles.css"; // add to the app-global css
import { CopilotProvider } from "@copilotkit/react-core";
import { CopilotSidebarUIProvider } from "@copilotkit/react-ui";

export default function App(): JSX.Element {
  return (
  <CopilotProvider chatApiEndpoint="/api/copilotkit/chat"> {/* Global state & copilot logic. Put this around the entire app */}
      <CopilotSidebarUIProvider> {/* A built-in Copilot UI (or bring your own UI). Put around individual pages, or the entire app. */}

        <YourContent />

      </CopilotSidebarUIProvider>
    </CopilotProvider>
  );
}

Features

  1. Batteries included. Add 2 React components, and your Copilot is live.
  2. Customize the built-in CopilotSidebarUIProvider UI -- or bring your own UI component.
  3. Extremely hackable. Should the need arise, you can define 1st-class extensions just as powerful as useMakeCopilotReadable, useMakeCopilotActionable, etc.

Give the copilot read permissions

Features

  1. Propagate useful information & granular app-state to the Copilot
  2. Easily maintain the hierarchical structure of information with parentId
  3. One call to rule them all: useMakeCopilotReadable works both with the sidekick, and with CopilotTextarea.
    • Use the contextCategories: string[] param to route information to different places.
import { useMakeCopilotReadable } from "@copilotkit/react-core";


function Employee(props: EmployeeProps): JSX.Element {
  const { employeeName, workProfile, metadata } = props;

  // propagate any information copilot
  const employeeContextId = useMakeCopilotReadable(employeeName);

  // Pass a parentID to maintain a hiearchical structure.
  // Especially useful with child React components, list elements, etc.
  useMakeCopilotReadable(workProfile.description(), employeeContextId);
  useMakeCopilotReadable(metadata.description(), employeeContextId);
  
  return (
    // Render as usual...
  );
}

Give the copilot write permissions

import { useMakeCopilotActionable } from "@copilotkit/react-core";

function Department(props: DepartmentProps): JSX.Element {
  // ...

  // Let the copilot take action on behalf of the user.
  useMakeCopilotActionable(
    {
      name: "setEmployeesAsSelected",
      description: "Set the given employees as 'selected'",
      argumentAnnotations: [
        {
          name: "employeeIds",
          type: "array", items: { type: "string" }
          description: "The IDs of employees to set as selected",
          required: true
        }
      ],
      implementation: async (employeeIds) => setEmployeesAsSelected(employeeIds),
    },
    []
  );

  // ...
}

Features

  1. Plain typescript actions. Edit a textbox, navigate to a new page, or anythign you can think of.
  2. Specify arbitrary input types.

Near-Term Roadmap

๐Ÿ“Š Please vote on features via the Issues tab!

Copilot-App Interaction

  • โœ… useMakeCopilotReadable: give static information to the copilot, in sync with on-screen state
  • โœ… useMakeCopilotActionable: Let the copilot take action on behalf of the user
  • ๐Ÿšง useMakeCopilotAskable: let the copilot ask for additional information when needed (coming soon)
  • ๐Ÿšง useEditCopilotMessage: edit the (unsent) typed user message to the copilot (coming soon)
  • ๐Ÿšง copilot-assisted navigation: go to the best page to achieve some objective.
  • ๐Ÿšง CopilotCloudKit: integrate arbitrary LLM logic / chains / RAG, using plain code.

UI components

  • โœ… <CopilotSidebarUIProvider>: Built in, hackable Copilot UI (optional - you can bring your own UI).
  • โœ… <CopilotTextarea />: drop-in <textarea /> replacement with Copilot autocompletions.

Integrations

  • โœ… Vercel AI SDK
  • โœ… OpenAI APIs
  • ๐Ÿšง Langchain
  • ๐Ÿšง Additional LLM providers

Frameworks

  • โœ… React
  • ๐Ÿšง Vue
  • ๐Ÿšง Svelte
  • ๐Ÿšง Swift (Mac + iOS)

Contribute

Contributions are welcome! ๐ŸŽ‰

Join the Discord Discord

Contact

atai <at> copilotkit.ai