| import axios from "axios"; |
| export const BASE_URL = "https://api.dify.ai/v1"; |
|
|
| export const routes = { |
| |
| 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`, |
| }, |
|
|
| |
| createCompletionMessage: { |
| method: "POST", |
| url: () => `/completion-messages`, |
| }, |
|
|
| |
| 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`, |
| }, |
|
|
| |
| 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 |
| ); |
| } |
| } |