dify-client.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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_conversation_messages($user, $conversation_id = null, $first_id = null, $limit = null) {
  111. $params = ['user' => $user];
  112. if ($conversation_id) {
  113. $params['conversation_id'] = $conversation_id;
  114. }
  115. if ($first_id) {
  116. $params['first_id'] = $first_id;
  117. }
  118. if ($limit) {
  119. $params['limit'] = $limit;
  120. }
  121. return $this->send_request('GET', 'messages', null, $params);
  122. }
  123. public function stop_message($task_id, $user) {
  124. $data = ['user' => $user];
  125. return $this->send_request('POST', "chat-messages/{$task_id}/stop", $data);
  126. }
  127. public function get_conversations($user, $first_id = null, $limit = null, $pinned = null) {
  128. $params = [
  129. 'user' => $user,
  130. 'first_id' => $first_id,
  131. 'limit' => $limit,
  132. 'pinned'=> $pinned,
  133. ];
  134. return $this->send_request('GET', 'conversations', null, $params);
  135. }
  136. public function rename_conversation($conversation_id, $name, $user) {
  137. $data = [
  138. 'name' => $name,
  139. 'user' => $user,
  140. ];
  141. return $this->send_request('PATCH', "conversations/{$conversation_id}", $data);
  142. }
  143. public function audio_to_text($audio_file, $user) {
  144. $data = [
  145. 'user' => $user,
  146. ];
  147. $options = [
  148. 'multipart' => $this->prepareMultipart($data, $files)
  149. ];
  150. return $this->file_client->request('POST', 'audio-to-text', $options);
  151. }
  152. public function get_suggestions($message_id, $user) {
  153. $params = [
  154. 'user' => $user
  155. ]
  156. return $this->send_request('GET', "messages/{$message_id}/suggested", null, $params);
  157. }
  158. }