Chat extensions
Visual Studio Code's Copilot Chat architecture enables extension authors to integrate with the GitHub Copilot Chat experience. A chat extension is a VS Code extension that uses the Chat extension API by contributing a Chat participant.
Chat participants are domain experts that can answer user queries within a specific domain. Participants can use different approaches to process a user query:
- Use AI to interpret the request and generate a response, for example by using the Language Model API
- Forward the user request to a backend service
- Use procedural logic and local resources
Participants can use the language model in a wide range of ways. Some participants only make use of the language model to get answers to custom prompts, for example the sample chat participant. Other participants are more advanced and act like autonomous agents that invoke multiple tools with the help of the language model. An example of such an advanced participant is the built-in @workspace
that knows about your workspace and can answer questions about it. Internally, @workspace
is powered by multiple tools: GitHub's knowledge graph, combined with semantic search, local code indexes, and VS Code's language services.
When a user explicitly mentions a @participant
in their chat prompt, that prompt is forwarded to the extension that contributed that specific chat participant. The participant then uses a ResponseStream
to respond to the request. To provide a smooth user experience, the Chat API is streaming-based. A chat response can contain rich content, such as Markdown, file trees, command buttons, and more. Get more info about the supported response output types.
To help the user take the conversation further, participants can provide follow-ups for each response. Follow-up questions are suggestions that are presented in the chat user interface and might give the user inspiration about the chat extension's capabilities.
Participants can also contribute commands, which are a shorthand notation for common user intents, and are indicated by the /
symbol. The extension can then use the command to prompt the language model accordingly. For example, /explain
is a command for the @workspace
participant that corresponds with the intent that the language model should explain some code.
Extending GitHub Copilot via GitHub Apps
Alternatively, it is possible to extend GitHub Copilot by creating a GitHub App that contributes a chat participant in the Chat view. A GitHub App is backed by a service and works across all GitHub Copilot surfaces, such as github.com, Visual Studio, or VS Code. On the other hand, GitHub Apps do not have full access to the VS Code API. To learn more about extending GitHub Copilot through a GitHub App see the GitHub documentation.
Links
Parts of the chat user experience
The following screenshot shows the different chat concepts in the Visual Studio Code chat experience for the sample extension.
- Use the
@
syntax to invoke the@cat
chat participant - Use the
/
syntax to call the/teach
command - User-provided query, also known as the user prompt
- Icon and participant
fullName
that indicate that Copilot is using the@cat
chat participant - Markdown response, provided by
@cat
- Code fragment included in the markdown response
- Button included in the
@cat
response, the button invokes a VS Code command - Suggested follow-up questions provided by the chat participant
- Chat input field with the placeholder text provided by the chat participant's
description
property
Develop a chat extension
A chat extension is an extension that contributes a chat participant to the Chat view.
The minimum functionality that is needed for implementing a chat extension is:
- Register the chat participant, to let users invoke it by using the
@
symbol in the VS Code Chat view. - Define a request handler that interprets the user's question, and returns a response in the Chat view.
You can further expand the functionality of the chat extension with the following optional features:
- Register chat commands to provide users with a shorthand notation for common questions
- Define suggested follow-up questions to help the user continue a conversation
As a starting point for developing a chat extension, you can refer to our chat extension sample. This sample implements a simple cat tutor that can explain computer science topics using cat metaphors.
Register the chat extension
The first step to create a chat extension is to register it in your package.json
by providing a unique id
, the name
, and description
.
"contributes": {
"chatParticipants": [
{
"id": "chat-sample.cat",
"name": "cat",
"fullName": "Cat",
"description": "Meow! What can I teach you?",
"isSticky": true
}
]
}
Users can then reference the chat participant in the Chat view by using the @
symbol and the name
you provided. The fullName
is shown in the title area of a response from your participant. The description
is used as placeholder text in the chat input field.
The isSticky
property controls whether the chat participant is persistent, which means that the participant name is automatically prepended in the chat input field after the user has started interacting with the participant.
We suggest using a lowercase name
and using title case for the fullName
to align with existing chat participants. Get more info about the naming conventions for chat participants.
[!NOTE] Some participant names are reserved, and in case you use a reserved name VS Code will display the fully qualified name of your participant (including the extension ID).
Up-front registration of participants and commands in package.json
is required, so that VS Code can activate your extension at the right time, and not before it is needed.
After registration, all your extension has to do is create the participant by using vscode.chat.createChatParticipant
. When creating the participant, you have to provide the ID, which you defined in package.json
, and a request handler.
The following code snippet shows how to create the @cat
chat participant (after you register it in your package.json
):
export function activate(context: vscode.ExtensionContext) {
// Register the chat participant and its request handler
const cat = vscode.chat.createChatParticipant('chat-sample.cat', handler);
// Optionally, set some properties for @cat
cat.iconPath = vscode.Uri.joinPath(context.extensionUri, 'cat.jpeg');
// Add the chat request handler here
}
After registering and creating the chat participant, you now need to implement the request handler to process a user's request.
Implement a request handler
The request handler is responsible for processing the user's chat requests in the VS Code Chat view. Each time a user enters a prompt in the chat input field, the chat request handler is invoked. These are the typical steps for implementing a chat request handler:
- Define the request handler
- Determine the intent of the user's request
- Perform logic to answer the user's question
- Return a response to the user