Yes sure, here it is:
router.post(“/assistant-chat”, async (req, res) => {
const { threadId, imageUrl, contextText } = req.body;
let { userMessage } = req.body;
try {
let currentThreadId = threadId;
// If a threadId is provided and exists, continue, otherwise, create a new thread
if (!currentThreadId || !threadResponses[currentThreadId]) {
// Create a new thread for the new case
const threadResponse = await openai.beta.threads.create();
currentThreadId = threadResponse.id;
console.log(“New thread created with ID:”, currentThreadId);
// Initialize storage for this new thread
threadResponses[currentThreadId] = { events: [], clients: [] };
} else {
console.log("Continuing conversation on thread:", currentThreadId);
}
// Here, before sending the user's message to OpenAI, signal the start of a new message
sendEventToAllClients(currentThreadId, { event: "messageStart", data: {} });
// check if user submit image
if (imageUrl) {
const visionResponse = await analyzeImage(imageUrl, contextText);
userMessage = visionResponse;
}
// Add the user's message to the thread
const messageResponse = await openai.beta.threads.messages.create(currentThreadId, {
role: "user",
content: userMessage,
});
console.log("User message added to the thread:", messageResponse);
// Stream the Run using the newly created or existing thread ID
const stream = openai.beta.threads.runs
.createAndStream(currentThreadId, {
assistant_id: assistantIdToUse, // Ensure this variable is correctly defined
})
.on("textCreated", (text) => {
console.log("textCreated event:", text);
sendEventToAllClients(currentThreadId, { event: "textCreated", data: text });
})
.on("textDelta", (textDelta) => {
// Optionally log textDelta events
console.log("textDelta event Carl:", textDelta);
sendEventToAllClients(currentThreadId, { event: "textDelta", data: textDelta });
})
.on("toolCallCreated", (toolCall) => {
console.log("toolCallCreated event:", toolCall);
sendEventToAllClients(currentThreadId, { event: "toolCallCreated", data: toolCall });
})
.on("toolCallDelta", (toolCallDelta) => {
console.log("toolCallDelta event:", toolCallDelta);
sendEventToAllClients(currentThreadId, { event: "toolCallDelta", data: toolCallDelta });
})
.on("end", () => {
console.log("Stream ended for threadId:", currentThreadId);
sendEventToAllClients(currentThreadId, { event: "end", data: null });
});
res.status(200).json({ threadId: currentThreadId });
} catch (error) {
console.error(“Error handling /assistant-chat:”, error);
res.status(500).send(“Internal server error”);
}
});