|
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 |
|
); |
|
} |
|
} |