actions/chat-with-assistant/chat-with-assistant.mjs
import openai from "../../openai.app.mjs"; import common from "../common/common-assistants.mjs"; export default { ...common, key: "openai-chat-with-assistant", name: "Chat with Assistant", description: "Sends a message and generates a response, storing the message history for a continuous conversation. [See the documentation](https://platform.openai.com/docs/api-reference/runs/createThreadAndRun)", version: "0.0.13", annotations: { destructiveHint: false, openWorldHint: true, readOnlyHint: false, }, type: "action", props: { openai, alert: { type: "alert", alertType: "info", content: "Looking to chat with your tools? Check out our individual actions: [Chat using Web Search](https://pipedream.com/apps/openai/actions/chat-using-web-search), [Chat using File Search](https://pipedream.com/apps/openai/actions/chat-using-file-search), and [Chat using Functions](https://pipedream.com/apps/openai/actions/chat-using-functions).", }, message: { type: "string", label: "Message", description: "The message to send", }, assistantId: { propDefinition: [ openai, "assistant", ], description: "The assistant to use. Leave blank to create a new assistant", optional: true, }, name: { propDefinition: [ openai, "name", ], }, instructions: { propDefinition: [ openai, "instructions", ], }, model: { propDefinition: [ openai, "assistantModel", ], optional: true, default: "gpt-3.5-turbo", }, threadId: { propDefinition: [ openai, "threadId", ], description: "The unique identifier for the thread. Example: `thread_abc123`. Leave blank to create a new thread. To locate the thread ID, make sure your OpenAI Threads setting (Settings -> Organization/Personal -> General -> Features and capabilities -> Threads) is set to \"Visible to organization owners\" or \"Visible to everyone\". You can then access the list of threads and click on individual threads to reveal their IDs", optional: true, }, ...common.props, }, async run({ $ }) { let assistantId = this.assistantId; if (!assistantId) { const { id: newAssistantId } = await this.openai.createAssistant({ $, data: { model: this.model, name: this.name, instructions: this.instructions, tools: this.buildTools(), tool_resources: this.buildToolResources(), }, }); assistantId = newAssistantId; } let threadId = this.threadId; let run; if (!threadId) { run = await this.openai.createThreadAndRun({ $, data: { assistant_id: assistantId, thread: { messages: [ { role: "user", content: this.message, }, ], }, model: this.model, instructions: this.instructions, tools: this.buildTools(), tool_resources: this.buildToolResources(), }, }); threadId = run.thread_id; } else { run = await this.openai.createRun({ $, threadId: this.threadId, data: { assistant_id: assistantId, model: this.model, instructions: this.instructions, tools: this.buildTools(), tool_resources: this.buildToolResources(), additional_messages: [ { role: "user", content: this.message, }, ], }, }); } const runId = run.id; run = await this.pollRunUntilCompleted(run, threadId, runId, $); const { data: messages } = await this.openai.listMessages({ $, threadId, params: { order: "desc", }, }); const response = messages[0].content[0].text.value; return { response, messages, run, }; }, };