index.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import axios from "axios";
  2. export const BASE_URL = "https://api.dify.ai/v1";
  3. export const routes = {
  4. application: {
  5. method: "GET",
  6. url: () => `/parameters`,
  7. },
  8. feedback: {
  9. method: "POST",
  10. url: (message_id) => `/messages/${message_id}/feedbacks`,
  11. },
  12. createCompletionMessage: {
  13. method: "POST",
  14. url: () => `/completion-messages`,
  15. },
  16. createChatMessage: {
  17. method: "POST",
  18. url: () => `/chat-messages`,
  19. },
  20. getConversationMessages: {
  21. method: "GET",
  22. url: () => `/messages`,
  23. },
  24. getConversations: {
  25. method: "GET",
  26. url: () => `/conversations`,
  27. },
  28. renameConversation: {
  29. method: "POST",
  30. url: (conversation_id) => `/conversations/${conversation_id}/name`,
  31. },
  32. deleteConversation: {
  33. method: "DELETE",
  34. url: (conversation_id) => `/conversations/${conversation_id}`,
  35. },
  36. fileUpload: {
  37. method: "POST",
  38. url: () => `/files/upload`,
  39. },
  40. runWorkflow: {
  41. method: "POST",
  42. url: () => `/workflows/run`,
  43. },
  44. };
  45. export class DifyClient {
  46. constructor(apiKey, baseUrl = BASE_URL) {
  47. this.apiKey = apiKey;
  48. this.baseUrl = baseUrl;
  49. }
  50. updateApiKey(apiKey) {
  51. this.apiKey = apiKey;
  52. }
  53. async sendRequest(
  54. method,
  55. endpoint,
  56. data = null,
  57. params = null,
  58. stream = false,
  59. headerParams = {}
  60. ) {
  61. const headers = {
  62. ...{
  63. Authorization: `Bearer ${this.apiKey}`,
  64. "Content-Type": "application/json",
  65. },
  66. ...headerParams
  67. };
  68. const url = `${this.baseUrl}${endpoint}`;
  69. let response;
  70. if (stream) {
  71. response = await axios({
  72. method,
  73. url,
  74. data,
  75. params,
  76. headers,
  77. responseType: "stream",
  78. });
  79. } else {
  80. response = await axios({
  81. method,
  82. url,
  83. data,
  84. params,
  85. headers,
  86. responseType: "json",
  87. });
  88. }
  89. return response;
  90. }
  91. messageFeedback(message_id, rating, user) {
  92. const data = {
  93. rating,
  94. user,
  95. };
  96. return this.sendRequest(
  97. routes.feedback.method,
  98. routes.feedback.url(message_id),
  99. data
  100. );
  101. }
  102. getApplicationParameters(user) {
  103. const params = { user };
  104. return this.sendRequest(
  105. routes.application.method,
  106. routes.application.url(),
  107. null,
  108. params
  109. );
  110. }
  111. fileUpload(data) {
  112. return this.sendRequest(
  113. routes.fileUpload.method,
  114. routes.fileUpload.url(),
  115. data,
  116. null,
  117. false,
  118. {
  119. "Content-Type": 'multipart/form-data'
  120. }
  121. );
  122. }
  123. }
  124. export class CompletionClient extends DifyClient {
  125. createCompletionMessage(inputs, user, stream = false, files = null) {
  126. const data = {
  127. inputs,
  128. user,
  129. response_mode: stream ? "streaming" : "blocking",
  130. files,
  131. };
  132. return this.sendRequest(
  133. routes.createCompletionMessage.method,
  134. routes.createCompletionMessage.url(),
  135. data,
  136. null,
  137. stream
  138. );
  139. }
  140. runWorkflow(inputs, user, stream = false, files = null) {
  141. const data = {
  142. inputs,
  143. user,
  144. response_mode: stream ? "streaming" : "blocking",
  145. };
  146. return this.sendRequest(
  147. routes.runWorkflow.method,
  148. routes.runWorkflow.url(),
  149. data,
  150. null,
  151. stream
  152. );
  153. }
  154. }
  155. export class ChatClient extends DifyClient {
  156. createChatMessage(
  157. inputs,
  158. query,
  159. user,
  160. stream = false,
  161. conversation_id = null,
  162. files = null
  163. ) {
  164. const data = {
  165. inputs,
  166. query,
  167. user,
  168. response_mode: stream ? "streaming" : "blocking",
  169. files,
  170. };
  171. if (conversation_id) data.conversation_id = conversation_id;
  172. return this.sendRequest(
  173. routes.createChatMessage.method,
  174. routes.createChatMessage.url(),
  175. data,
  176. null,
  177. stream
  178. );
  179. }
  180. getConversationMessages(
  181. user,
  182. conversation_id = "",
  183. first_id = null,
  184. limit = null
  185. ) {
  186. const params = { user };
  187. if (conversation_id) params.conversation_id = conversation_id;
  188. if (first_id) params.first_id = first_id;
  189. if (limit) params.limit = limit;
  190. return this.sendRequest(
  191. routes.getConversationMessages.method,
  192. routes.getConversationMessages.url(),
  193. null,
  194. params
  195. );
  196. }
  197. getConversations(user, first_id = null, limit = null, pinned = null) {
  198. const params = { user, first_id: first_id, limit, pinned };
  199. return this.sendRequest(
  200. routes.getConversations.method,
  201. routes.getConversations.url(),
  202. null,
  203. params
  204. );
  205. }
  206. renameConversation(conversation_id, name, user, auto_generate) {
  207. const data = { name, user, auto_generate };
  208. return this.sendRequest(
  209. routes.renameConversation.method,
  210. routes.renameConversation.url(conversation_id),
  211. data
  212. );
  213. }
  214. deleteConversation(conversation_id, user) {
  215. const data = { user };
  216. return this.sendRequest(
  217. routes.deleteConversation.method,
  218. routes.deleteConversation.url(conversation_id),
  219. data
  220. );
  221. }
  222. }