-
Notifications
You must be signed in to change notification settings - Fork 5
/
app.js
87 lines (73 loc) · 2.76 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import express from "express";
import bodyParser from "body-parser";
import OpenAI from "openai";
import fs from "fs";
import dotenv from "dotenv";
import morgan from "morgan";
dotenv.config();
const app = express();
app.use(bodyParser.json());
app.use(morgan("combined"));
app.use(express.static('static'));
const apiKey = process.env.OPENAI_API_KEY;
const openai = new OpenAI(apiKey);
let assistant_id;
// Create an Assistant
async function createAssistant() {
const assistantResponse = await openai.beta.assistants.create({
name: "Professional Chinese Teacher", // adjust name as per requirement
instructions: "You are a professional Chinese Teacher capable of teaching Chinese, answering related questions, and creating original content.Always Behave Like Professional and friendly chinese teacher.",
tools: [{ type: "code_interpreter" }], // adjust tools as per requirement
model: "gpt-4-1106-preview", // or any other GPT-3.5 or GPT-4 model
});
assistant_id = assistantResponse.id;
console.log(`Assistant ID: ${assistant_id}`);
}
createAssistant();
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'build', 'index.html'));
});
// Endpoint to handle chat
app.post("/chat", async (req, res) => {
try {
if (!req.body.message) {
return res.status(400).json({ error: "Message field is required" });
}
const userMessage = req.body.message;
// Create a Thread
const threadResponse = await openai.beta.threads.create();
const threadId = threadResponse.id;
// Add a Message to a Thread
await openai.beta.threads.messages.create(threadId, {
role: "user",
content: userMessage,
});
// Run the Assistant
const runResponse = await openai.beta.threads.runs.create(threadId, {
assistant_id: assistant_id,
});
// Check the Run status
let run = await openai.beta.threads.runs.retrieve(threadId, runResponse.id);
while (run.status !== "completed") {
await new Promise((resolve) => setTimeout(resolve, 1000));
run = await openai.beta.threads.runs.retrieve(threadId, runResponse.id);
}
// Display the Assistant's Response
const messagesResponse = await openai.beta.threads.messages.list(threadId);
const assistantResponses = messagesResponse.data.filter(msg => msg.role === 'assistant');
const response = assistantResponses.map(msg =>
msg.content
.filter(contentItem => contentItem.type === 'text')
.map(textContent => textContent.text.value)
.join('\n')
).join('\n');
res.json({ response });
} catch (error) {
console.error("Error processing chat:", error);
res.status(500).json({ error: "Internal server error" });
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});