dify-client.php 6.3 KB

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