Underground-Digital/Workflow-Engine
0
1import axios from "axios";2export const BASE_URL = "https://api.dify.ai/v1";3 4export const routes = {5 // app's6 feedback: {7 method: "POST",8 url: (message_id) => `/messages/${message_id}/feedbacks`,9 },10 application: {11 method: "GET",12 url: () => `/parameters`,13 },14 fileUpload: {15 method: "POST",16 url: () => `/files/upload`,17 },18 textToAudio: {19 method: "POST",20 url: () => `/text-to-audio`,21 },22 getMeta: {23 method: "GET",24 url: () => `/meta`,25 },26 27 // completion's28 createCompletionMessage: {29 method: "POST",30 url: () => `/completion-messages`,31 },32 33 // chat's34 createChatMessage: {35 method: "POST",36 url: () => `/chat-messages`,37 },38 getSuggested:{39 method: "GET",40 url: (message_id) => `/messages/${message_id}/suggested`,41 },42 stopChatMessage: {43 method: "POST",44 url: (task_id) => `/chat-messages/${task_id}/stop`,45 },46 getConversations: {47 method: "GET",48 url: () => `/conversations`,49 },50 getConversationMessages: {51 method: "GET",52 url: () => `/messages`,53 },54 renameConversation: {55 method: "POST",56 url: (conversation_id) => `/conversations/${conversation_id}/name`,57 },58 deleteConversation: {59 method: "DELETE",60 url: (conversation_id) => `/conversations/${conversation_id}`,61 },62 audioToText: {63 method: "POST",64 url: () => `/audio-to-text`,65 },66 67 // workflow‘s68 runWorkflow: {69 method: "POST",70 url: () => `/workflows/run`,71 },72 stopWorkflow: {73 method: "POST",74 url: (task_id) => `/workflows/${task_id}/stop`,75 }76 77};78 79export class DifyClient {80 constructor(apiKey, baseUrl = BASE_URL) {81 this.apiKey = apiKey;82 this.baseUrl = baseUrl;83 }84 85 updateApiKey(apiKey) {86 this.apiKey = apiKey;87 }88 89 async sendRequest(90 method,91 endpoint,92 data = null,93 params = null,94 stream = false,95 headerParams = {}96 ) {97 const headers = {98 ...{99 Authorization: `Bearer ${this.apiKey}`,100 "Content-Type": "application/json",101 },102 ...headerParams103 };104 105 const url = `${this.baseUrl}${endpoint}`;106 let response;107 if (stream) {108 response = await axios({109 method,110 url,111 data,112 params,113 headers,114 responseType: "stream",115 });116 } else {117 response = await axios({118 method,119 url,120 ...(method !== "GET" && { data }),121 params,122 headers,123 responseType: "json",124 });125 }126 127 return response;128 }129 130 messageFeedback(message_id, rating, user) {131 const data = {132 rating,133 user,134 };135 return this.sendRequest(136 routes.feedback.method,137 routes.feedback.url(message_id),138 data139 );140 }141 142 getApplicationParameters(user) {143 const params = { user };144 return this.sendRequest(145 routes.application.method,146 routes.application.url(),147 null,148 params149 );150 }151 152 fileUpload(data) {153 return this.sendRequest(154 routes.fileUpload.method,155 routes.fileUpload.url(),156 data,157 null,158 false,159 {160 "Content-Type": 'multipart/form-data'161 }162 );163 }164 165 textToAudio(text, user, streaming = false) {166 const data = {167 text,168 user,169 streaming170 };171 return this.sendRequest(172 routes.textToAudio.method,173 routes.textToAudio.url(),174 data,175 null,176 streaming177 );178 }179 180 getMeta(user) {181 const params = { user };182 return this.sendRequest(183 routes.meta.method,184 routes.meta.url(),185 null,186 params187 );188 }189}190 191export class CompletionClient extends DifyClient {192 createCompletionMessage(inputs, user, stream = false, files = null) {193 const data = {194 inputs,195 user,196 response_mode: stream ? "streaming" : "blocking",197 files,198 };199 return this.sendRequest(200 routes.createCompletionMessage.method,201 routes.createCompletionMessage.url(),202 data,203 null,204 stream205 );206 }207 208 runWorkflow(inputs, user, stream = false, files = null) {209 const data = {210 inputs,211 user,212 response_mode: stream ? "streaming" : "blocking",213 };214 return this.sendRequest(215 routes.runWorkflow.method,216 routes.runWorkflow.url(),217 data,218 null,219 stream220 );221 }222}223 224export class ChatClient extends DifyClient {225 createChatMessage(226 inputs,227 query,228 user,229 stream = false,230 conversation_id = null,231 files = null232 ) {233 const data = {234 inputs,235 query,236 user,237 response_mode: stream ? "streaming" : "blocking",238 files,239 };240 if (conversation_id) data.conversation_id = conversation_id;241 242 return this.sendRequest(243 routes.createChatMessage.method,244 routes.createChatMessage.url(),245 data,246 null,247 stream248 );249 }250 251 getSuggested(message_id, user) {252 const data = { user };253 return this.sendRequest(254 routes.getSuggested.method,255 routes.getSuggested.url(message_id),256 data257 );258 }259 260 stopMessage(task_id, user) {261 const data = { user };262 return this.sendRequest(263 routes.stopChatMessage.method,264 routes.stopChatMessage.url(task_id),265 data266 );267 }268 269 getConversations(user, first_id = null, limit = null, pinned = null) {270 const params = { user, first_id: first_id, limit, pinned };271 return this.sendRequest(272 routes.getConversations.method,273 routes.getConversations.url(),274 null,275 params276 );277 }278 279 getConversationMessages(280 user,281 conversation_id = "",282 first_id = null,283 limit = null284 ) {285 const params = { user };286 287 if (conversation_id) params.conversation_id = conversation_id;288 289 if (first_id) params.first_id = first_id;290 291 if (limit) params.limit = limit;292 293 return this.sendRequest(294 routes.getConversationMessages.method,295 routes.getConversationMessages.url(),296 null,297 params298 );299 }300 301 renameConversation(conversation_id, name, user, auto_generate) {302 const data = { name, user, auto_generate };303 return this.sendRequest(304 routes.renameConversation.method,305 routes.renameConversation.url(conversation_id),306 data307 );308 }309 310 deleteConversation(conversation_id, user) {311 const data = { user };312 return this.sendRequest(313 routes.deleteConversation.method,314 routes.deleteConversation.url(conversation_id),315 data316 );317 }318 319 320 audioToText(data) {321 return this.sendRequest(322 routes.audioToText.method,323 routes.audioToText.url(),324 data,325 null,326 false,327 {328 "Content-Type": 'multipart/form-data'329 }330 );331 }332 333}334 335export class WorkflowClient extends DifyClient {336 run(inputs,user,stream) {337 const data = { 338 inputs, 339 response_mode: stream ? "streaming" : "blocking",340 user 341 };342 343 return this.sendRequest(344 routes.runWorkflow.method,345 routes.runWorkflow.url(),346 data,347 null,348 stream349 );350 }351 352 stop(task_id, user) {353 const data = { user };354 return this.sendRequest(355 routes.stopWorkflow.method,356 routes.stopWorkflow.url(task_id),357 data358 );359 }360}