| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'vendor/autoload.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use GuzzleHttp\Client; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DifyClient { | 
					
						
							|  |  |  |     protected $api_key; | 
					
						
							|  |  |  |     protected $base_url; | 
					
						
							|  |  |  |     protected $client; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function __construct($api_key) { | 
					
						
							|  |  |  |         $this->api_key = $api_key; | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         $this->base_url = "https://api.dify.ai/v1/"; | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         $this->client = new Client([ | 
					
						
							|  |  |  |             'base_uri' => $this->base_url, | 
					
						
							|  |  |  |             'headers' => [ | 
					
						
							|  |  |  |                 'Authorization' => 'Bearer ' . $this->api_key, | 
					
						
							|  |  |  |                 'Content-Type' => 'application/json', | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2023-11-20 17:54:01 +08:00
										 |  |  |         $this->file_client = new Client([ | 
					
						
							|  |  |  |             'base_uri' => $this->base_url, | 
					
						
							|  |  |  |             'headers' => [ | 
					
						
							|  |  |  |                 'Authorization' => 'Bearer ' . $this->api_key, | 
					
						
							|  |  |  |                 'Content-Type' => 'multipart/form-data', | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function send_request($method, $endpoint, $data = null, $params = null, $stream = false) { | 
					
						
							|  |  |  |         $options = [ | 
					
						
							|  |  |  |             'json' => $data, | 
					
						
							|  |  |  |             'query' => $params, | 
					
						
							|  |  |  |             'stream' => $stream, | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $response = $this->client->request($method, $endpoint, $options); | 
					
						
							|  |  |  |         return $response; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function message_feedback($message_id, $rating, $user) { | 
					
						
							|  |  |  |         $data = [ | 
					
						
							|  |  |  |             'rating' => $rating, | 
					
						
							|  |  |  |             'user' => $user, | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('POST', "messages/{$message_id}/feedbacks", $data); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function get_application_parameters($user) { | 
					
						
							|  |  |  |         $params = ['user' => $user]; | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('GET', 'parameters', null, $params); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-11-20 17:54:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function file_upload($user, $files) { | 
					
						
							|  |  |  |         $data = ['user' => $user]; | 
					
						
							|  |  |  |         $options = [ | 
					
						
							|  |  |  |             'multipart' => $this->prepareMultipart($data, $files) | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this->file_client->request('POST', 'files/upload', $options); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function prepareMultipart($data, $files) { | 
					
						
							|  |  |  |         $multipart = []; | 
					
						
							|  |  |  |         foreach ($data as $key => $value) { | 
					
						
							|  |  |  |             $multipart[] = [ | 
					
						
							|  |  |  |                 'name' => $key, | 
					
						
							|  |  |  |                 'contents' => $value | 
					
						
							|  |  |  |             ]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($files as $file) { | 
					
						
							|  |  |  |             $multipart[] = [ | 
					
						
							|  |  |  |                 'name' => 'file', | 
					
						
							|  |  |  |                 'contents' => fopen($file['tmp_name'], 'r'), | 
					
						
							|  |  |  |                 'filename' => $file['name'] | 
					
						
							|  |  |  |             ]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $multipart; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CompletionClient extends DifyClient { | 
					
						
							| 
									
										
										
										
											2023-11-20 17:54:01 +08:00
										 |  |  |     public function create_completion_message($inputs, $response_mode, $user, $files = null) { | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         $data = [ | 
					
						
							|  |  |  |             'inputs' => $inputs, | 
					
						
							|  |  |  |             'response_mode' => $response_mode, | 
					
						
							|  |  |  |             'user' => $user, | 
					
						
							| 
									
										
										
										
											2023-11-20 17:54:01 +08:00
										 |  |  |             'files' => $files, | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('POST', 'completion-messages', $data, null, $response_mode === 'streaming'); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ChatClient extends DifyClient { | 
					
						
							| 
									
										
										
										
											2023-11-20 17:54:01 +08:00
										 |  |  |     public function create_chat_message($inputs, $query, $user, $response_mode = 'blocking', $conversation_id = null, $files = null) { | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         $data = [ | 
					
						
							|  |  |  |             'inputs' => $inputs, | 
					
						
							|  |  |  |             'query' => $query, | 
					
						
							|  |  |  |             'user' => $user, | 
					
						
							|  |  |  |             'response_mode' => $response_mode, | 
					
						
							| 
									
										
										
										
											2023-11-20 17:54:01 +08:00
										 |  |  |             'files' => $files, | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         ]; | 
					
						
							|  |  |  |         if ($conversation_id) { | 
					
						
							|  |  |  |             $data['conversation_id'] = $conversation_id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('POST', 'chat-messages', $data, null, $response_mode === 'streaming'); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function get_conversation_messages($user, $conversation_id = null, $first_id = null, $limit = null) { | 
					
						
							|  |  |  |         $params = ['user' => $user]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($conversation_id) { | 
					
						
							|  |  |  |             $params['conversation_id'] = $conversation_id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($first_id) { | 
					
						
							|  |  |  |             $params['first_id'] = $first_id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($limit) { | 
					
						
							|  |  |  |             $params['limit'] = $limit; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('GET', 'messages', null, $params); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function get_conversations($user, $first_id = null, $limit = null, $pinned = null) { | 
					
						
							|  |  |  |         $params = [ | 
					
						
							|  |  |  |             'user' => $user, | 
					
						
							|  |  |  |             'first_id' => $first_id, | 
					
						
							|  |  |  |             'limit' => $limit, | 
					
						
							|  |  |  |             'pinned'=> $pinned, | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('GET', 'conversations', null, $params); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function rename_conversation($conversation_id, $name, $user) { | 
					
						
							|  |  |  |         $data = [ | 
					
						
							|  |  |  |             'name' => $name, | 
					
						
							|  |  |  |             'user' => $user, | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-05-24 21:05:05 +08:00
										 |  |  |         return $this->send_request('PATCH', "conversations/{$conversation_id}", $data); | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } |