| | <?php |
| |
|
| | require 'vendor/autoload.php'; |
| |
|
| | use GuzzleHttp\Client; |
| |
|
| | class DifyClient { |
| | protected $api_key; |
| | protected $base_url; |
| | protected $client; |
| |
|
| | public function __construct($api_key, $base_url = null) { |
| | $this->api_key = $api_key; |
| | $this->base_url = $base_url ?? "https://api.dify.ai/v1/"; |
| | $this->client = new Client([ |
| | 'base_uri' => $this->base_url, |
| | 'headers' => [ |
| | 'Authorization' => 'Bearer ' . $this->api_key, |
| | 'Content-Type' => 'application/json', |
| | ], |
| | ]); |
| | $this->file_client = new Client([ |
| | 'base_uri' => $this->base_url, |
| | 'headers' => [ |
| | 'Authorization' => 'Bearer ' . $this->api_key, |
| | 'Content-Type' => 'multipart/form-data', |
| | ], |
| | ]); |
| | } |
| |
|
| | 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, |
| | ]; |
| | return $this->send_request('POST', "messages/{$message_id}/feedbacks", $data); |
| | } |
| |
|
| | public function get_application_parameters($user) { |
| | $params = ['user' => $user]; |
| | return $this->send_request('GET', 'parameters', null, $params); |
| | } |
| |
|
| | 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; |
| | } |
| |
|
| |
|
| | public function text_to_audio($text, $user, $streaming = false) { |
| | $data = [ |
| | 'text' => $text, |
| | 'user' => $user, |
| | 'streaming' => $streaming |
| | ]; |
| |
|
| | return $this->send_request('POST', 'text-to-audio', $data); |
| | } |
| |
|
| | public function get_meta($user) { |
| | $params = [ |
| | 'user' => $user |
| | ]; |
| |
|
| | return $this->send_request('GET', 'meta',null, $params); |
| | } |
| | } |
| |
|
| | class CompletionClient extends DifyClient { |
| | public function create_completion_message($inputs, $response_mode, $user, $files = null) { |
| | $data = [ |
| | 'inputs' => $inputs, |
| | 'response_mode' => $response_mode, |
| | 'user' => $user, |
| | 'files' => $files, |
| | ]; |
| | return $this->send_request('POST', 'completion-messages', $data, null, $response_mode === 'streaming'); |
| | } |
| | } |
| |
|
| | class ChatClient extends DifyClient { |
| | public function create_chat_message($inputs, $query, $user, $response_mode = 'blocking', $conversation_id = null, $files = null) { |
| | $data = [ |
| | 'inputs' => $inputs, |
| | 'query' => $query, |
| | 'user' => $user, |
| | 'response_mode' => $response_mode, |
| | 'files' => $files, |
| | ]; |
| | if ($conversation_id) { |
| | $data['conversation_id'] = $conversation_id; |
| | } |
| |
|
| | return $this->send_request('POST', 'chat-messages', $data, null, $response_mode === 'streaming'); |
| | } |
| | |
| | public function get_suggestions($message_id, $user) { |
| | $params = [ |
| | 'user' => $user |
| | ] |
| | return $this->send_request('GET', "messages/{$message_id}/suggested", null, $params); |
| | } |
| | |
| | public function stop_message($task_id, $user) { |
| | $data = ['user' => $user]; |
| | return $this->send_request('POST', "chat-messages/{$task_id}/stop", $data); |
| | } |
| |
|
| | public function get_conversations($user, $first_id = null, $limit = null, $pinned = null) { |
| | $params = [ |
| | 'user' => $user, |
| | 'first_id' => $first_id, |
| | 'limit' => $limit, |
| | 'pinned'=> $pinned, |
| | ]; |
| | return $this->send_request('GET', 'conversations', null, $params); |
| | } |
| |
|
| | 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; |
| | } |
| |
|
| | return $this->send_request('GET', 'messages', null, $params); |
| | } |
| | |
| | public function rename_conversation($conversation_id, $name,$auto_generate, $user) { |
| | $data = [ |
| | 'name' => $name, |
| | 'user' => $user, |
| | 'auto_generate' => $auto_generate |
| | ]; |
| | return $this->send_request('PATCH', "conversations/{$conversation_id}", $data); |
| | } |
| |
|
| | public function delete_conversation($conversation_id, $user) { |
| | $data = [ |
| | 'user' => $user, |
| | ]; |
| | return $this->send_request('DELETE', "conversations/{$conversation_id}", $data); |
| | } |
| |
|
| | public function audio_to_text($audio_file, $user) { |
| | $data = [ |
| | 'user' => $user, |
| | ]; |
| | $options = [ |
| | 'multipart' => $this->prepareMultipart($data, $files) |
| | ]; |
| | return $this->file_client->request('POST', 'audio-to-text', $options); |
| | |
| | } |
| |
|
| | } |
| |
|
| | class WorkflowClient extends DifyClient{ |
| | public function run($inputs, $response_mode, $user) { |
| | $data = [ |
| | 'inputs' => $inputs, |
| | 'response_mode' => $response_mode, |
| | 'user' => $user, |
| | ]; |
| | return $this->send_request('POST', 'workflows/run', $data); |
| | } |
| |
|
| | public function stop($task_id, $user) { |
| | $data = [ |
| | 'user' => $user, |
| | ]; |
| | return $this->send_request('POST', "workflows/tasks/{$task_id}/stop",$data); |
| | } |
| | |
| | } |