Cómo crear tu primera extensión para GitHub Copilot Chat

¡Hola developer 👋🏻! En el pasado ✨ AI Tour Madrid 🍿 tuve la suerte de poder participar en un par de sesiones donde hablamos de algunas de las funcionalidades que ofrece a día de hoy GitHub Copilot. En una de ellas, mi compañero Raúl y yo, nos centramos en cómo era nuestro día a día usando esta maravillosa herramienta:

y en la otra sobre cómo desarrollar nuestras GitHub Copilot extensions:

Además de estas sesiones, te compartí en mi canal de YouTube la demo que mostré durante la misma con más detalle:

Sin embargo, por falta de tiempo principalmente 😖, no había compartido hasta ahora el código que utilicé para poder construirla. Por lo que en este artículo te quería dejar el código desarrollado en Node.js para esta demo:

import { Octokit } from "@octokit/core";
import express from "express";
import OpenAI from 'openai';
const app = express();

app.post("/", express.json(), async (req, res) => {
  // Identify the user, using the GitHub API token provided in the request headers.
  const tokenForUser = req.get("X-GitHub-Token");
  const octokit = new Octokit({ auth: tokenForUser });
  const user = await octokit.request("GET /user");
  console.log("User:", user.data.login);

  const capiClient = new OpenAI({
    baseURL: "https://api.githubcopilot.com",
    apiKey: tokenForUser
  });

  // Parse the request payload and log it.
  const payload = req.body;
  console.log("Payload:", payload);
  let movies_api_res = await fetch(process.env.MOVIES_API_URL);
  let movies_json = await movies_api_res.json();
  console.log("Movies:", movies_json);
  // Insert a special super hero system message in our message list.
  const messages = payload.messages;
  messages.unshift({
    role: "system",
    content: "You are a helpful assistant that replies to user messages as if you were a super hero.",
  });
  messages.unshift({
    role: "system",
    content: `If the user is asking for a movie in the cinema you should respond taking into account the following information: ${JSON.stringify(movies_json)}`
  });
  messages.unshift({
    role: "system",
    content: `Start every response with the user's name, which is @${user.data.login} and include emojis in your responses.`,
  });

  const copilotLLMResponse = await capiClient.chat.completions.create({
    model: "gpt-4o",
    messages,
    stream: true,
  });
  // Stream the response straight back to the user.
  for await (const chunk of copilotLLMResponse) {
    const chunkStr = "data: " + JSON.stringify(chunk) + "\n\n";
    res.write(chunkStr);
  }
  res.write("data: [DONE]\n\n");
  res.end();
  return;
})
const port = Number(process.env.PORT || '3000')
app.listen(port, () => {
  console.log(`Server running on port ${port}`)
});

Donde utilicé como base uno de los ejemplos de la cuenta llamada Copilot Extensions, el cual adapté para utilizar el SDK de Open AI y modificar un poco el propmt que le llegaba a la API de GitHub Copilot.

También te dejo un repositorio en GitHub para que puedas clonarlo fácilmente y ponerlo a tu gusto ☺️: https://github.com/0GiS0/tour-of-heroes-ghc-extension

¡Saludos 👋🏻!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.