mirror of
https://github.com/microsoft/vscode-extension-samples.git
synced 2026-04-27 16:55:44 +08:00
Add chat tutorial source code
This commit is contained in:
30
chat-tutorial/.eslintrc.json
Normal file
30
chat-tutorial/.eslintrc.json
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"root": true,
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 6,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": [
|
||||
"@typescript-eslint"
|
||||
],
|
||||
"rules": {
|
||||
"@typescript-eslint/naming-convention": [
|
||||
"warn",
|
||||
{
|
||||
"selector": "import",
|
||||
"format": [ "camelCase", "PascalCase" ]
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/semi": "warn",
|
||||
"curly": "warn",
|
||||
"eqeqeq": "warn",
|
||||
"no-throw-literal": "warn",
|
||||
"semi": "off"
|
||||
},
|
||||
"ignorePatterns": [
|
||||
"out",
|
||||
"dist",
|
||||
"**/*.d.ts"
|
||||
]
|
||||
}
|
||||
7
chat-tutorial/.vscode/extensions.json
vendored
Normal file
7
chat-tutorial/.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"dbaeumer.vscode-eslint"
|
||||
]
|
||||
}
|
||||
34
chat-tutorial/.vscode/launch.json
vendored
Normal file
34
chat-tutorial/.vscode/launch.json
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// A launch configuration that compiles the extension and then opens it inside a new window
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Run Extension",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "${defaultBuildTask}"
|
||||
},
|
||||
{
|
||||
"name": "Extension Tests",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
|
||||
],
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "${defaultBuildTask}"
|
||||
}
|
||||
]
|
||||
}
|
||||
11
chat-tutorial/.vscode/settings.json
vendored
Normal file
11
chat-tutorial/.vscode/settings.json
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// Place your settings in this file to overwrite default and user settings.
|
||||
{
|
||||
"files.exclude": {
|
||||
"out": false // set this to true to hide the "out" folder with the compiled JS files
|
||||
},
|
||||
"search.exclude": {
|
||||
"out": true // set this to false to include "out" folder in search results
|
||||
},
|
||||
// Turn off tsc task auto detection since we have the necessary tasks as npm scripts
|
||||
"typescript.tsc.autoDetect": "off"
|
||||
}
|
||||
20
chat-tutorial/.vscode/tasks.json
vendored
Normal file
20
chat-tutorial/.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"type": "npm",
|
||||
"script": "watch",
|
||||
"problemMatcher": "$tsc-watch",
|
||||
"isBackground": true,
|
||||
"presentation": {
|
||||
"reveal": "never"
|
||||
},
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
21
chat-tutorial/README.md
Normal file
21
chat-tutorial/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Chat Tutorial
|
||||
|
||||
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.
|
||||
|
||||
This GitHub Copilot Extension sample shows:
|
||||
|
||||
- How to contribute a chat participant to the GitHub Copilot Chat view.
|
||||
|
||||

|
||||
|
||||
Documentation can be found here:
|
||||
- https://code.visualstudio.com/api/extension-guides/chat
|
||||
- https://code.visualstudio.com/api/extension-guides/chat-tutorial
|
||||
|
||||
## Running the Sample
|
||||
|
||||
- Run `npm install` in terminal to install dependencies
|
||||
- Run the `Run Extension` target in the Debug View. This will:
|
||||
- Start a task `npm: watch` to compile the code
|
||||
- Run the extension in a new VS Code window
|
||||
- You will see the @tutor chat participant in the GitHub Copilot Chat view
|
||||
5031
chat-tutorial/package-lock.json
generated
Normal file
5031
chat-tutorial/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
52
chat-tutorial/package.json
Normal file
52
chat-tutorial/package.json
Normal file
@ -0,0 +1,52 @@
|
||||
{
|
||||
"name": "code-tutor",
|
||||
"displayName": "Code Tutor",
|
||||
"description": "",
|
||||
"version": "0.0.1",
|
||||
"engines": {
|
||||
"vscode": "^1.93.0"
|
||||
},
|
||||
"categories": [
|
||||
"AI",
|
||||
"Chat"
|
||||
],
|
||||
"activationEvents": [],
|
||||
"main": "./out/extension.js",
|
||||
"contributes": {
|
||||
"chatParticipants": [
|
||||
{
|
||||
"id": "chat-tutorial.code-tutor",
|
||||
"fullName": "Code Tutor",
|
||||
"name": "tutor",
|
||||
"description": "What can I teach you?",
|
||||
"isSticky": true,
|
||||
"commands": [
|
||||
{
|
||||
"name": "exercise",
|
||||
"description": "Provide exercises to practice a concept."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"scripts": {
|
||||
"vscode:prepublish": "npm run compile",
|
||||
"compile": "tsc -p ./",
|
||||
"watch": "tsc -watch -p ./",
|
||||
"pretest": "npm run compile && npm run lint",
|
||||
"lint": "eslint src --ext ts",
|
||||
"test": "node ./out/test/runTest.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/vscode": "^1.93.0",
|
||||
"@types/mocha": "^10.0.3",
|
||||
"@types/node": "18.x",
|
||||
"@typescript-eslint/eslint-plugin": "^6.9.0",
|
||||
"@typescript-eslint/parser": "^6.9.0",
|
||||
"eslint": "^8.52.0",
|
||||
"glob": "^10.3.10",
|
||||
"mocha": "^10.2.0",
|
||||
"typescript": "^5.2.2",
|
||||
"@vscode/test-electron": "^2.3.6"
|
||||
}
|
||||
}
|
||||
69
chat-tutorial/src/extension.ts
Normal file
69
chat-tutorial/src/extension.ts
Normal file
@ -0,0 +1,69 @@
|
||||
import * as vscode from 'vscode';
|
||||
|
||||
const BASE_PROMPT = 'You are a helpful code tutor. Your job is to teach the user with simple descriptions and sample code of the concept. Respond with a guided overview of the concept in a series of messages. Do not give the user the answer directly, but guide them to find the answer themselves. If the user asks a non-programming question, politely decline to respond.';
|
||||
|
||||
const EXERCISES_PROMPT = 'You are a helpful tutor. Your job is to teach the user with fun, simple exercises that they can complete in the editor. Your exercises should start simple and get more complex as the user progresses. Move one concept at a time, and do not move on to the next concept until the user provides the correct answer. Give hints in your exercises to help the user learn. If the user is stuck, you can provide the answer and explain why it is the answer. If the user asks a non-programming question, politely decline to respond.';
|
||||
|
||||
// Use gpt-4o since it is fast and high quality. gpt-3.5-turbo and gpt-4 are also available.
|
||||
const MODEL_SELECTOR: vscode.LanguageModelChatSelector = { vendor: 'copilot', family: 'gpt-4o' };
|
||||
|
||||
export function activate(context: vscode.ExtensionContext) {
|
||||
|
||||
// define a chat handler
|
||||
const handler: vscode.ChatRequestHandler = async (request: vscode.ChatRequest, context: vscode.ChatContext, stream: vscode.ChatResponseStream, token: vscode.CancellationToken) => {
|
||||
|
||||
// initialize the prompt and model
|
||||
let prompt = BASE_PROMPT;
|
||||
|
||||
if (request.command === 'exercise') {
|
||||
prompt = EXERCISES_PROMPT;
|
||||
}
|
||||
|
||||
const [model] = await vscode.lm.selectChatModels(MODEL_SELECTOR);
|
||||
|
||||
// make sure the model is available
|
||||
if (model) {
|
||||
// initialize the messages array with the prompt
|
||||
const messages = [
|
||||
vscode.LanguageModelChatMessage.User(prompt),
|
||||
];
|
||||
|
||||
// get all the previous participant messages
|
||||
const previousMessages = context.history.filter(
|
||||
(h) => h instanceof vscode.ChatResponseTurn
|
||||
);
|
||||
|
||||
// add the previous messages to the messages array
|
||||
previousMessages.forEach((m) => {
|
||||
let fullMessage = '';
|
||||
m.response.forEach((r) => {
|
||||
const mdPart = r as vscode.ChatResponseMarkdownPart;
|
||||
fullMessage += mdPart.value.value;
|
||||
});
|
||||
messages.push(vscode.LanguageModelChatMessage.Assistant(fullMessage));
|
||||
});
|
||||
|
||||
// add in the user's message
|
||||
messages.push(vscode.LanguageModelChatMessage.User(request.prompt));
|
||||
|
||||
// send the request
|
||||
const chatResponse = await model.sendRequest(messages, {}, token);
|
||||
|
||||
// stream the response
|
||||
for await (const fragment of chatResponse.text) {
|
||||
stream.markdown(fragment);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
};
|
||||
|
||||
// create participant
|
||||
const tutor = vscode.chat.createChatParticipant("chat-tutorial.code-tutor", handler);
|
||||
|
||||
// add icon to participant
|
||||
tutor.iconPath = vscode.Uri.joinPath(context.extensionUri, 'tutor.jpeg');
|
||||
}
|
||||
|
||||
export function deactivate() { }
|
||||
17
chat-tutorial/tsconfig.json
Normal file
17
chat-tutorial/tsconfig.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "Node16",
|
||||
"target": "ES2022",
|
||||
"outDir": "out",
|
||||
"lib": [
|
||||
"ES2022"
|
||||
],
|
||||
"sourceMap": true,
|
||||
"rootDir": "src",
|
||||
"strict": true /* enable all strict type-checking options */
|
||||
/* Additional Checks */
|
||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
||||
}
|
||||
}
|
||||
BIN
chat-tutorial/tutor.jpeg
Normal file
BIN
chat-tutorial/tutor.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
Reference in New Issue
Block a user