diff --git a/Gemfile b/Gemfile index 9b32d51..3ba6778 100644 --- a/Gemfile +++ b/Gemfile @@ -11,4 +11,4 @@ gem "minitest", "~> 5.0" gem "rubocop", "~> 1.72" -gem 'webmock' +gem "webmock" diff --git a/lib/dify/client.rb b/lib/dify/client.rb index acaa407..85a6bfe 100644 --- a/lib/dify/client.rb +++ b/lib/dify/client.rb @@ -1,91 +1,91 @@ # frozen_string_literal: true require_relative "client/version" + class DifyClient - def initialize(api_key) - @api_key = api_key - @base_url = "https://api.dify.ai/v1" + def initialize(api_key) + @api_key = api_key + @base_url = "https://api.dify.ai/v1" + end + + def _send_request(method, endpoint, data = nil, params = nil, stream = false) + uri = URI.parse("#{@base_url}#{endpoint}") + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = true + + headers = { + "Authorization" => "Bearer #{@api_key}", + "Content-Type" => "application/json" + } + + if method == "GET" + uri.query = URI.encode_www_form(params) if params + request = Net::HTTP::Get.new(uri.request_uri, headers) + elsif method == "POST" + request = Net::HTTP::Post.new(uri.request_uri, headers) + request.body = data.to_json end - def _send_request(method, endpoint, data = nil, params = nil, stream = false) - uri = URI.parse("#{@base_url}#{endpoint}") + response = http.request(request) + return response + end - http = Net::HTTP.new(uri.host, uri.port) - http.use_ssl = true + def message_feedback(message_id, rating, user) + data = { + rating: rating, + user: user + } + return _send_request("POST", "/messages/#{message_id}/feedbacks", data) + end - headers = { - "Authorization" => "Bearer #{@api_key}", - "Content-Type" => "application/json" - } - - if method == "GET" - uri.query = URI.encode_www_form(params) if params - request = Net::HTTP::Get.new(uri.request_uri, headers) - elsif method == "POST" - request = Net::HTTP::Post.new(uri.request_uri, headers) - request.body = data.to_json - end - - response = http.request(request) - return response - end - - def message_feedback(message_id, rating, user) - data = { - rating: rating, - user: user - } - return _send_request("POST", "/messages/#{message_id}/feedbacks", data) - end - - def get_application_parameters(user) - params = {user: user} - return _send_request("GET", "/parameters", nil, params) - end + def get_application_parameters(user) + params = { user: user } + return _send_request("GET", "/parameters", nil, params) + end end class CompletionClient < DifyClient - def create_completion_message(inputs, query, response_mode, user) - data = { - inputs: inputs, - query: query, - response_mode: response_mode, - user: user - } - return _send_request("POST", "/completion-messages", data, nil, response_mode == "streaming") - end + def create_completion_message(inputs, query, response_mode, user) + data = { + inputs: inputs, + query: query, + response_mode: response_mode, + user: user + } + return _send_request("POST", "/completion-messages", data, nil, response_mode == "streaming") + end end class ChatClient < DifyClient - def create_chat_message(inputs, query, user, response_mode = "blocking", conversation_id = nil) - data = { - inputs: inputs, - query: query, - user: user, - response_mode: response_mode - } - data[:conversation_id] = conversation_id if conversation_id + def create_chat_message(inputs, query, user, response_mode = "blocking", conversation_id = nil) + data = { + inputs: inputs, + query: query, + user: user, + response_mode: response_mode + } + data[:conversation_id] = conversation_id if conversation_id - return _send_request("POST", "/chat-messages", data, nil, response_mode == "streaming") - end + return _send_request("POST", "/chat-messages", data, nil, response_mode == "streaming") + end - def get_conversation_messages(user, conversation_id = nil, first_id = nil, limit = nil) - params = {user: user} - params[:conversation_id] = conversation_id if conversation_id - params[:first_id] = first_id if first_id - params[:limit] = limit if limit + def get_conversation_messages(user, conversation_id = nil, first_id = nil, limit = nil) + params = { user: user } + params[:conversation_id] = conversation_id if conversation_id + params[:first_id] = first_id if first_id + params[:limit] = limit if limit - return _send_request("GET", "/messages", nil, params) - end + return _send_request("GET", "/messages", nil, params) + end - def get_conversations(user, last_id = nil, limit = nil, pinned = nil) - params = {user: user, last_id: last_id, limit: limit, pinned: pinned} - return _send_request("GET", "/conversations", nil, params) - end + def get_conversations(user, last_id = nil, limit = nil, pinned = nil) + params = { user: user, last_id: last_id, limit: limit, pinned: pinned } + return _send_request("GET", "/conversations", nil, params) + end - def rename_conversation(conversation_id, name, user) - data = {name: name, user: user} - return _send_request("POST", "/conversations/#{conversation_id}/name", data) - end + def rename_conversation(conversation_id, name, user) + data = { name: name, user: user } + return _send_request("POST", "/conversations/#{conversation_id}/name", data) + end end - diff --git a/test/dify/client_test.rb b/test/dify/client_test.rb index 4a71519..8dfaf9b 100644 --- a/test/dify/client_test.rb +++ b/test/dify/client_test.rb @@ -21,22 +21,22 @@ class DifyClientTest < Minitest::Test user = 'USER_ID' expected_response = {} - stub_request(:get, "https://api.dify.ai/v1/parameters"). - with( - body: {"user"=>"USER_ID"}, - headers: { - 'Accept'=>'*/*', - 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', - 'Authorization'=>'Bearer YOUR_API_KEY', - 'Content-Type'=>'application/x-www-form-urlencoded', - 'Responsetype'=>'json', - 'User-Agent'=>'Ruby' - }). - to_return(status: 200, body: expected_response.to_json, headers: {}) + stub_request(:get, "https://api.dify.ai/v1/parameters") + .with( + body: { "user" => "USER_ID" }, + headers: { + 'Accept' => '*/*', + 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', + 'Authorization' => 'Bearer YOUR_API_KEY', + 'Content-Type' => 'application/x-www-form-urlencoded', + 'Responsetype' => 'json', + 'User-Agent' => 'Ruby' + } + ) + .to_return(status: 200, body: expected_response.to_json, headers: {}) response = @client.get_application_parameters(user) assert_equal expected_response, response end - end