如何通过ChatGPT Assistants API执行自定义操作
餐厅GPT预约机器人开发问题
核心需求
- 开发餐厅GPT聊天机器人,用于收集顾客联系方式与预约时间
- 当AI确认获取全部信息后,触发自定义操作:先通过
console.log("confirmed")验证流程,后续调用第三方API发送告知邮件 - 当前基于Node.js开发的后端仅能实现基础对话,尝试的工具调用代码片段已注释但未生效
关键疑问
- 如何将编写的工具调用示例代码与现有Assistant整合?
- OpenAI平台Assistants页面添加函数(如
get_weather)的运行逻辑是什么? - 后续如何接入邮件发送API?
- 是否可通过Gemini实现相同功能?
现有后端代码
const express = require('express'); const { OpenAI } = require('openai'); const cors = require('cors'); require('dotenv').config(); const app = express(); app.use(cors()); app.use(express.json()); const openai = new OpenAI(process.env.OPENAI_API_KEY); app.post('/get-response', async (req, res) => { const userMessage = req.body.message; let threadId = req.body.threadId; // Receive threadId from the client const assistantId = 'MYASSISTANTID'; // Replace with your actual assistant ID // If no threadId or it's a new session, create a new thread if (!threadId) { const thread = await openai.beta.threads.create(); threadId = thread.id; } await openai.beta.threads.messages.create(threadId, { role: "user", content: userMessage, }); // Use runs to wait for the assistant response and then retrieve it const run = await openai.beta.threads.runs.create(threadId, { assistant_id: assistantId, }); let runStatus = await openai.beta.threads.runs.retrieve( threadId, run.id ); // Polling mechanism to see if runStatus is completed // This should be made more robust. while (runStatus.status !== "completed") { await new Promise((resolve) => setTimeout(resolve, 2000)); runStatus = await openai.beta.threads.runs.retrieve(threadId, run.id); } // //CHECKING FOR TABLE RESERVATION: // // If the model output includes a function call // if (runStatus.status === 'requires_action') { // // You might receive an array of actions, iterate over it // for (const action of runStatus.required_action.submit_tool_outputs.tool_calls) { // const functionName = action.function.name; // const arguments = JSON.parse(action.function.arguments); // // // Check if the function name matches 'table_reservation' // if (functionName === 'table_reservation') { // handleTableReservation(arguments); // // Respond back to the model that the action has been handled // await openai.beta.threads.runs.submit_tool_outputs(threadId, run.id, { // tool_outputs: [{ // tool_call_id: action.id, // output: { success: true } // You can include more details if needed // }] // }); // } // } // } // Get the last assistant message from the messages array const messages = await openai.beta.threads.messages.list(threadId); // Find the last message for the current run const lastMessageForRun = messages.data .filter( (message) => message.run_id === run.id && message.role === "assistant" ) .pop(); // If an assistant message is found, console.log() it assistantMessage = "" if (lastMessageForRun) { assistantMessage = lastMessageForRun.content[0].text.value console.log(`${assistantMessage} \n`); } res.json({ message: assistantMessage, threadId: threadId }); }); const PORT = 3001; app.listen(PORT, () => console.log(`Server listening on port ${PORT}`));
工具调用示例代码
require('dotenv').config(); // This should be at the top of your file const { OpenAI } = require('openai'); const openai = new OpenAI(process.env.OPENAI_API_KEY); // Example dummy function hard coded to return the same weather // In production, this could be your backend API or an external API function getCurrentWeather(location) { if (location.toLowerCase().includes("tokyo")) { return JSON.stringify({ location: "Tokyo", temperature: "10", unit: "celsius" }); } else if (location.toLowerCase().includes("san francisco")) { return JSON.stringify({ location: "San Francisco", temperature: "72", unit: "fahrenheit" }); } else if (location.toLowerCase().includes("paris")) { return JSON.stringify({ location: "Paris", temperature: "22", unit: "fahrenheit" }); } else { return JSON.stringify({ location, temperature: "unknown" }); } } function get_table_reservations(bookingTime, numGuests) { if (bookingTime.toLowerCase().includes("4:30")) { return JSON.stringify({ availability: "Not available"}); } else if (!bookingTime) { return JSON.stringify({ availability: "Please include a booking time"}); } else { return JSON.stringify({ availability: "Available", forGuests: numGuests}); } } async function runConversation() { // Step 1: send the conversation and available functions to the model const messages = [ { role: "user", content: "I want a table reservation for 3 people." }, ]; const tools = [ { type: "function", function: { name: "get_current_weather", description: "Get the current weather in a given location", parameters: { type: "object", properties: { location: { type: "string", description: "The city and state, e.g. San Francisco, CA", }, unit: { type: "string", enum: ["celsius", "fahrenheit"] }, }, required: ["location"], }, }, }, { type: "function", function: { name: "get_table_reservations", description: "Tell the user if a table is available for the number of guests and time they request", parameters: { type: "object", properties: { numGuests: { type: "integer", description: "The number of guests", }, bookingTime: { type: "string", description: "The time requested for a reservation, eg. 8:30 PM" }, }, required: ["numGuests", "bookingTime"], }, }, }, ]; const response = await openai.chat.completions.create({ model: "gpt-3.5-turbo-1106", messages: messages, tools: tools, tool_choice: "auto", // auto is default, but we'll be explicit }); const responseMessage = response.choices[0].message; // Step 2: check if the model wanted to call a function const toolCalls = responseMessage.tool_calls; if (responseMessage.tool_calls) { // Step 3: call the function // Note: the JSON response may not always be valid; be sure to handle errors const availableFunctions = { get_current_weather: getCurrentWeather, get_table_reservations: get_table_reservations }; // only one function in this example, but you can have multiple messages.push(responseMessage); // extend conversation with assistant's reply for (const toolCall of toolCalls) { const functionName = toolCall.function.name; const functionToCall = availableFunctions[functionName]; const functionArgs = JSON.parse(toolCall.function.arguments); console.log('Arguments:', toolCall.function.arguments, 'name:', functionName); // Add this line to debug const functionResponse = functionToCall( functionArgs.bookingTime, functionArgs.numGuests ); messages.push({ tool_call_id: toolCall.id, role: "tool", name: functionName, content: functionResponse, }); // extend conversation with function response } const secondResponse = await openai.chat.completions.create({ model: "gpt-3.5-turbo-1106", messages: messages, }); // get a new response from the model where it can see the function response return secondResponse.choices; } } runConversation().then(console.log).catch(console.error);
OpenAI Assistants界面截图


内容的提问来源于stack exchange,提问作者Matthew Gerges
相关产品推荐
相关产品推荐

