Postanowiłem napisać serwer Node.js, aby komunikować się z API OpenAI, aby nie musieć przechowywać klucza API w mojej aplikacji klienckiej. Utworzyłem nowy katalog dla mojego serwera, zainicjowałem katalog jako pakiet Node.js (używając npm init) i utworzyłem plik o nazwie server.js. Aby rozpocząć pisanie server.js, kliknąłem przycisk Wyświetl kod w prawym górnym rogu placu zabaw i wybrałem Node.js jako moją bibliotekę. Otworzyło się okno Wyświetl kod z niezbędnym kodem do wysyłania bieżących ustawień i monitów do API oraz pobierania następnego uzupełnienia. Skopiowałem ten kod z placu zabaw i wkleiłem go do server.js. Dodałem również kod do importowania klucza API z pliku .env. Plik .env jest używany w Node.js do przechowywania zmiennych środowiskowych poza programem głównym. Zmienne środowiskowe przechowują informacje, które są specyficzne dla instalacji oprogramowania (takie jak klucze API) i nie powinny być dystrybuowane wraz z oprogramowaniem (ponieważ nie chcesz, aby inne osoby używały Twojego klucza API). Początek mojego serwera pokazany jest na rysunku .

Następnym krokiem było stworzenie własnego serwera API, który pobiera wyniki z OpenAI i zwraca je do mojej aplikacji klienckiej. Ponieważ pisanie serwera API jest dość standardowym zadaniem, postanowiłem użyć Copilot Chat, aby go wygenerować. Zacząłem od następującego monitu:
Chcę przekształcić kod w server.js w serwer API, do którego mogę wysłać nową wiadomość i dodać ją do tablicy messages przed przesłaniem jej do API OpenAI. Serwer powinien zwrócić odpowiedź z API OpenAI.
Kod wygenerowany przez Copilot był dobrym początkiem. Cały kod jest pokazany w Listingu .
import express from ‘express’;
import OpenAI from ‘openai’;
import ‘dotenv/config’;
const app = express();
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
app.use(express.json());
app.post(‘/chat’, async (req, res) => {
const { message } = req.body;
const response = await openai.chat.completions.create({
model: ‘gpt-4’,
messages: [
{
role: ‘system’,
content:
“You are an AI tic-tac-toe player. You are always ‘O’ and
I’m always ‘X’.\n\nI’ll provide you with my move as a number
on this grid:\n\n0 | 1 | 2\n3 | 4 | 5\n6 | 7 | 8\n\nYou’ll
respond with only an array with an X in the position of my
move, followed by your move, followed by an array with an O
in the position of your move.\n\nIf one of us wins or it’s a
draw, tell me ‘you win’, ‘I win’, or ‘draw’.\n\nWhen I say
‘new(10)’ start a new game and set the difficulty level to
10, meaning that you will always choose the best move. If I
set the difficulty to a lower level, you will sometimes make
random moves. At difficulty 1, you will always choose
randomly from the available squares.”,
},
{
role: ‘user’,
content: message,
},
],
});
res.json({ response });
});
app.listen(3000, () => {
console.log(‘Server listening on port 3000’);
});
Wysyłanie monitów kontynuacyjnych
Na dole odpowiedzi Copilot wyjaśnił wygenerowany kod i zasugerował monit kontynuacyjny:
J