import axios from "axios"; export const BASE_URL = "https://api.dify.ai/v1"; export const routes = { // app's feedback: { method: "POST", url: (message_id) => `/messages/${message_id}/feedbacks`, }, application: { method: "GET", url: () => `/parameters`, }, fileUpload: { method: "POST", url: () => `/files/upload`, }, textToAudio: { method: "POST", url: () => `/text-to-audio`, }, getMeta: { method: "GET", url: () => `/meta`, }, // completion's createCompletionMessage: { method: "POST", url: () => `/completion-messages`, }, // chat's createChatMessage: { method: "POST", url: () => `/chat-messages`, }, getSuggested:{ method: "GET", url: (message_id) => `/messages/${message_id}/suggested`, }, stopChatMessage: { method: "POST", url: (task_id) => `/chat-messages/${task_id}/stop`, }, getConversations: { method: "GET", url: () => `/conversations`, }, getConversationMessages: { method: "GET", url: () => `/messages`, }, renameConversation: { method: "POST", url: (conversation_id) => `/conversations/${conversation_id}/name`, }, deleteConversation: { method: "DELETE", url: (conversation_id) => `/conversations/${conversation_id}`, }, audioToText: { method: "POST", url: () => `/audio-to-text`, }, // workflow‘s runWorkflow: { method: "POST", url: () => `/workflows/run`, }, stopWorkflow: { method: "POST", url: (task_id) => `/workflows/${task_id}/stop`, } }; export class DifyClient { constructor(apiKey, baseUrl = BASE_URL) { this.apiKey = apiKey; this.baseUrl = baseUrl; } updateApiKey(apiKey) { this.apiKey = apiKey; } async sendRequest( method, endpoint, data = null, params = null, stream = false, headerParams = {} ) { const headers = { ...{ Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json", }, ...headerParams }; const url = `${this.baseUrl}${endpoint}`; let response; if (stream) { response = await axios({ method, url, data, params, headers, responseType: "stream", }); } else { response = await axios({ method, url, ...(method !== "GET" && { data }), params, headers, responseType: "json", }); } return response; } messageFeedback(message_id, rating, user) { const data = { rating, user, }; return this.sendRequest( routes.feedback.method, routes.feedback.url(message_id), data ); } getApplicationParameters(user) { const params = { user }; return this.sendRequest( routes.application.method, routes.application.url(), null, params ); } fileUpload(data) { return this.sendRequest( routes.fileUpload.method, routes.fileUpload.url(), data, null, false, { "Content-Type": 'multipart/form-data' } ); } textToAudio(text, user, streaming = false) { const data = { text, user, streaming }; return this.sendRequest( routes.textToAudio.method, routes.textToAudio.url(), data, null, streaming ); } getMeta(user) { const params = { user }; return this.sendRequest( routes.meta.method, routes.meta.url(), null, params ); } } export class CompletionClient extends DifyClient { createCompletionMessage(inputs, user, stream = false, files = null) { const data = { inputs, user, response_mode: stream ? "streaming" : "blocking", files, }; return this.sendRequest( routes.createCompletionMessage.method, routes.createCompletionMessage.url(), data, null, stream ); } runWorkflow(inputs, user, stream = false, files = null) { const data = { inputs, user, response_mode: stream ? "streaming" : "blocking", }; return this.sendRequest( routes.runWorkflow.method, routes.runWorkflow.url(), data, null, stream ); } } export class ChatClient extends DifyClient { createChatMessage( inputs, query, user, stream = false, conversation_id = null, files = null ) { const data = { inputs, query, user, response_mode: stream ? "streaming" : "blocking", files, }; if (conversation_id) data.conversation_id = conversation_id; return this.sendRequest( routes.createChatMessage.method, routes.createChatMessage.url(), data, null, stream ); } getSuggested(message_id, user) { const data = { user }; return this.sendRequest( routes.getSuggested.method, routes.getSuggested.url(message_id), data ); } stopMessage(task_id, user) { const data = { user }; return this.sendRequest( routes.stopChatMessage.method, routes.stopChatMessage.url(task_id), data ); } getConversations(user, first_id = null, limit = null, pinned = null) { const params = { user, first_id: first_id, limit, pinned }; return this.sendRequest( routes.getConversations.method, routes.getConversations.url(), null, params ); } getConversationMessages( user, conversation_id = "", first_id = null, limit = null ) { const params = { user }; if (conversation_id) params.conversation_id = conversation_id; if (first_id) params.first_id = first_id; if (limit) params.limit = limit; return this.sendRequest( routes.getConversationMessages.method, routes.getConversationMessages.url(), null, params ); } renameConversation(conversation_id, name, user, auto_generate) { const data = { name, user, auto_generate }; return this.sendRequest( routes.renameConversation.method, routes.renameConversation.url(conversation_id), data ); } deleteConversation(conversation_id, user) { const data = { user }; return this.sendRequest( routes.deleteConversation.method, routes.deleteConversation.url(conversation_id), data ); } audioToText(data) { return this.sendRequest( routes.audioToText.method, routes.audioToText.url(), data, null, false, { "Content-Type": 'multipart/form-data' } ); } } export class WorkflowClient extends DifyClient { run(inputs,user,stream) { const data = { inputs, response_mode: stream ? "streaming" : "blocking", user }; return this.sendRequest( routes.runWorkflow.method, routes.runWorkflow.url(), data, null, stream ); } stop(task_id, user) { const data = { user }; return this.sendRequest( routes.stopWorkflow.method, routes.stopWorkflow.url(task_id), data ); } }