Team Ai
Apppublic

Underground-Digital/Workflow-Engine

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
index.js360 linesDownload Raw Back to nodejs-client
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}