dify-client.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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) {
  9. $this->api_key = $api_key;
  10. $this->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. }
  71. class CompletionClient extends DifyClient {
  72. public function create_completion_message($inputs, $response_mode, $user, $files = null) {
  73. $data = [
  74. 'inputs' => $inputs,
  75. 'response_mode' => $response_mode,
  76. 'user' => $user,
  77. 'files' => $files,
  78. ];
  79. return $this->send_request('POST', 'completion-messages', $data, null, $response_mode === 'streaming');
  80. }
  81. }
  82. class ChatClient extends DifyClient {
  83. public function create_chat_message($inputs, $query, $user, $response_mode = 'blocking', $conversation_id = null, $files = null) {
  84. $data = [
  85. 'inputs' => $inputs,
  86. 'query' => $query,
  87. 'user' => $user,
  88. 'response_mode' => $response_mode,
  89. 'files' => $files,
  90. ];
  91. if ($conversation_id) {
  92. $data['conversation_id'] = $conversation_id;
  93. }
  94. return $this->send_request('POST', 'chat-messages', $data, null, $response_mode === 'streaming');
  95. }
  96. public function get_conversation_messages($user, $conversation_id = null, $first_id = null, $limit = null) {
  97. $params = ['user' => $user];
  98. if ($conversation_id) {
  99. $params['conversation_id'] = $conversation_id;
  100. }
  101. if ($first_id) {
  102. $params['first_id'] = $first_id;
  103. }
  104. if ($limit) {
  105. $params['limit'] = $limit;
  106. }
  107. return $this->send_request('GET', 'messages', null, $params);
  108. }
  109. public function get_conversations($user, $first_id = null, $limit = null, $pinned = null) {
  110. $params = [
  111. 'user' => $user,
  112. 'first_id' => $first_id,
  113. 'limit' => $limit,
  114. 'pinned'=> $pinned,
  115. ];
  116. return $this->send_request('GET', 'conversations', null, $params);
  117. }
  118. public function rename_conversation($conversation_id, $name, $user) {
  119. $data = [
  120. 'name' => $name,
  121. 'user' => $user,
  122. ];
  123. return $this->send_request('PATCH', "conversations/{$conversation_id}", $data);
  124. }
  125. }