Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. use GuzzleHttp\Client;
  3. class DifyClient {
  4. protected $api_key;
  5. protected $base_url;
  6. protected $client;
  7. public function __construct($api_key, $base_url = null) {
  8. $this->api_key = $api_key;
  9. $this->base_url = $base_url ?? 'https://api.dify.ai/v1/';
  10. $this->client = new Client([
  11. 'base_uri' => $this->base_url,
  12. 'headers' => [
  13. 'Authorization' => 'Bearer ' . $this->api_key,
  14. 'Content-Type' => 'application/json',
  15. ],
  16. ]);
  17. }
  18. protected function send_request($method, $endpoint, $data = null, $params = null, $stream = false) {
  19. $options = [
  20. 'json' => $data,
  21. 'query' => $params,
  22. 'stream' => $stream,
  23. ];
  24. $response = $this->client->request($method, $endpoint, $options);
  25. return $response;
  26. }
  27. public function message_feedback($message_id, $rating, $user) {
  28. $data = [
  29. 'rating' => $rating,
  30. 'user' => $user,
  31. ];
  32. return $this->send_request('POST', "messages/{$message_id}/feedbacks", $data);
  33. }
  34. public function get_application_parameters($user) {
  35. $params = ['user' => $user];
  36. return $this->send_request('GET', 'parameters', null, $params);
  37. }
  38. public function file_upload($user, $files) {
  39. $data = ['user' => $user];
  40. $options = [
  41. 'multipart' => $this->prepareMultipart($data, $files)
  42. ];
  43. return $this->client->request('POST', 'files/upload', $options);
  44. }
  45. protected function prepareMultipart($data, $files) {
  46. $multipart = [];
  47. foreach ($data as $key => $value) {
  48. $multipart[] = [
  49. 'name' => $key,
  50. 'contents' => $value
  51. ];
  52. }
  53. foreach ($files as $file) {
  54. $multipart[] = [
  55. 'name' => 'file',
  56. 'contents' => fopen($file['tmp_name'], 'r'),
  57. 'filename' => $file['name']
  58. ];
  59. }
  60. return $multipart;
  61. }
  62. public function text_to_audio($text, $user, $streaming = false) {
  63. $data = [
  64. 'text' => $text,
  65. 'user' => $user,
  66. 'streaming' => $streaming
  67. ];
  68. return $this->send_request('POST', 'text-to-audio', $data);
  69. }
  70. public function get_meta($user) {
  71. $params = [
  72. 'user' => $user
  73. ];
  74. return $this->send_request('GET', 'meta',null, $params);
  75. }
  76. }
  77. class CompletionClient extends DifyClient {
  78. public function create_completion_message($inputs, $response_mode, $user, $files = null) {
  79. $data = [
  80. 'inputs' => $inputs,
  81. 'response_mode' => $response_mode,
  82. 'user' => $user,
  83. 'files' => $files,
  84. ];
  85. return $this->send_request('POST', 'completion-messages', $data, null, $response_mode === 'streaming');
  86. }
  87. }
  88. class ChatClient extends DifyClient {
  89. public function create_chat_message($inputs, $query, $user, $response_mode = 'blocking', $conversation_id = null, $files = null) {
  90. $data = [
  91. 'inputs' => $inputs,
  92. 'query' => $query,
  93. 'user' => $user,
  94. 'response_mode' => $response_mode,
  95. 'files' => $files,
  96. ];
  97. if ($conversation_id) {
  98. $data['conversation_id'] = $conversation_id;
  99. }
  100. return $this->send_request('POST', 'chat-messages', $data, null, $response_mode === 'streaming');
  101. }
  102. public function get_suggestions($message_id, $user) {
  103. $params = [
  104. 'user' => $user
  105. ];
  106. return $this->send_request('GET', "messages/{$message_id}/suggested", null, $params);
  107. }
  108. public function stop_message($task_id, $user) {
  109. $data = ['user' => $user];
  110. return $this->send_request('POST', "chat-messages/{$task_id}/stop", $data);
  111. }
  112. public function get_conversations($user, $first_id = null, $limit = null, $pinned = null) {
  113. $params = [
  114. 'user' => $user,
  115. 'first_id' => $first_id,
  116. 'limit' => $limit,
  117. 'pinned'=> $pinned,
  118. ];
  119. return $this->send_request('GET', 'conversations', null, $params);
  120. }
  121. public function get_conversation_messages($user, $conversation_id = null, $first_id = null, $limit = null) {
  122. $params = ['user' => $user];
  123. if ($conversation_id) {
  124. $params['conversation_id'] = $conversation_id;
  125. }
  126. if ($first_id) {
  127. $params['first_id'] = $first_id;
  128. }
  129. if ($limit) {
  130. $params['limit'] = $limit;
  131. }
  132. return $this->send_request('GET', 'messages', null, $params);
  133. }
  134. public function rename_conversation($conversation_id, $name,$auto_generate, $user) {
  135. $data = [
  136. 'name' => $name,
  137. 'user' => $user,
  138. 'auto_generate' => $auto_generate
  139. ];
  140. return $this->send_request('PATCH', "conversations/{$conversation_id}", $data);
  141. }
  142. public function delete_conversation($conversation_id, $user) {
  143. $data = [
  144. 'user' => $user,
  145. ];
  146. return $this->send_request('DELETE', "conversations/{$conversation_id}", $data);
  147. }
  148. public function audio_to_text($audio_file, $user) {
  149. $data = [
  150. 'user' => $user,
  151. ];
  152. $options = [
  153. 'multipart' => $this->prepareMultipart($data, $audio_file)
  154. ];
  155. return $this->client->request('POST', 'audio-to-text', $options);
  156. }
  157. }
  158. class WorkflowClient extends DifyClient{
  159. public function run($inputs, $response_mode, $user) {
  160. $data = [
  161. 'inputs' => $inputs,
  162. 'response_mode' => $response_mode,
  163. 'user' => $user,
  164. ];
  165. return $this->send_request('POST', 'workflows/run', $data);
  166. }
  167. public function stop($task_id, $user) {
  168. $data = [
  169. 'user' => $user,
  170. ];
  171. return $this->send_request('POST', "workflows/tasks/{$task_id}/stop",$data);
  172. }
  173. }