lib/openai/assistant.rb in openai-assistant-0.4.0 vs lib/openai/assistant.rb in openai-assistant-0.5.0
- old
+ new
@@ -1,117 +1,77 @@
# frozen_string_literal: true
require_relative "assistant/version"
require_relative "assistant_obj"
+require_relative "base"
require "json"
require "net/http"
-require "rest-client"
+require "uri"
+
module Openai
# An openai assistant
- class Assistant
- @openai_api_key = nil
- @openai_url = nil
-
- # @param api_key [String] The api key of openai
+ class Assistant < Base
+ # @param api_key [String] The api key of openai\
def initialize(api_key = "")
- @openai_api_key = api_key
- # hard the host because if the official docs change the host, maybe it will change another
- # we need to update this gem for any change
- @openai_url = "https://api.openai.com/v1/assistants"
+ super(api_key)
end
# @param api_key [String] The api key of openai
def self.setup(api_key = "")
- @openai_api_key = api_key
- @openai_url = "https://api.openai.com/v1/assistants"
+ initialize(api_key)
end
# @param model [String] Select model of the assistant. refer on: https://platform.openai.com/docs/api-reference/models/list.
# @param instructions [String] The system instructions that the assistant uses.
# @return [Openai::AssistantObj] A new response object of assistant.
def create_assistant(model, instructions)
- url = @openai_url
- headers = {
- "Authorization": "Bearer #{@openai_api_key}",
- "OpenAI-Beta": "assistants=v1",
- "Content-Type": "application/json"
- }
+ puts default_headers
+ url = URI.parse(@openai_url)
req_body = {
"instructions": instructions,
"name": "assistant",
"tools": [{ "type": "code_interpreter" }],
"model": model
- }
- begin
- resp = RestClient.post(url, req_body.to_json, headers)
- rescue RestClient::ExceptionWithResponse => e
- resp = e.response
- end
- unless resp.code == 200
- parsed = JSON.parse(resp.body)
- return parsed["error"]["code"]
- end
- parse_assistant_object(JSON.parse(resp.body))
+ }.to_json
+ response = call_post(url, req_body)
+ return response["error"]["code"] unless response["error"].nil?
+
+ parse_assistant_object(JSON.parse(response.body))
end
# @param assistant_id [String] The id of assistant after create
# @return [Openai::AssistantObj] A new response object of assistant.
def retrieve_assistant(assistant_id)
url = "#{@openai_url}/#{assistant_id}"
- headers = {
- "Authorization": "Bearer #{@openai_api_key}",
- "OpenAI-Beta": "assistants=v1",
- "Content-Type": "application/json"
- }
- begin
- resp = RestClient.get(url, headers)
- rescue RestClient::ExceptionWithResponse => e
- resp = e.response
- end
- unless resp.code == 200
- parsed = JSON.parse(resp.body)
- return parsed["error"]["code"]
- end
- parse_assistant_object(JSON.parse(resp.body))
+ uri = URI(url)
+ response = call_post(uri, nil)
+ return response["error"]["code"] unless response["error"].nil?
+
+ parse_assistant_object(JSON.parse(response.body))
end
# @param assistant_id [String] The id of assistant after create
# @return [String] Message delete the assistant ok or not
def delete_assistant(assistant_id)
url = "#{@openai_url}/#{assistant_id}"
- headers = {
- "Authorization": "Bearer #{@openai_api_key}",
- "OpenAI-Beta": "assistants=v1",
- "Content-Type": "application/json"
- }
- begin
- resp = RestClient.delete(url, headers)
- rescue RestClient::ExceptionWithResponse => e
- resp = e.response
- end
- parsed = JSON.parse(resp.body)
- return parsed["error"]["code"] unless resp.code == 200
+ uri = URI(url)
+ response = call_post(uri, nil)
+ return response["error"]["code"] unless response["error"].nil?
+ parsed = JSON.parse(response.body)
+
parsed["deleted"]
end
# @return [Array<Openai::AssistantObj>] List all assistant
def list_assistant
url = @openai_url
- headers = {
- "Authorization": "Bearer #{@openai_api_key}",
- "OpenAI-Beta": "assistants=v1",
- "Content-Type": "application/json"
- }
- begin
- resp = RestClient.get(url, headers)
- rescue RestClient::ExceptionWithResponse => e
- resp = e.response
- end
- parsed = JSON.parse(resp.body)
- return parsed["error"]["code"] unless resp.code == 200
+ uri = URI(url)
+ response = call_get(uri)
+ return response["error"]["code"] unless response["error"].nil?
+ parsed = JSON.parse(response.body)
assistants = []
parsed["data"].each do |ast|
assistants << parse_assistant_object(ast)
end
end
@@ -128,8 +88,39 @@
instructions: data["instructions"],
tools: data["tools"],
file_ids: data["file_ids"],
metadata: data["metadata"]
)
+ end
+
+ def default_headers
+ {
+ "Authorization": "Bearer #{@openai_api_key}",
+ "OpenAI-Beta": "assistants=v1",
+ "Content-Type": "application/json"
+ }
+ end
+
+ def call_post(url, req_body)
+ uri = URI(url)
+ http = Net::HTTP.new(uri.host, uri.port)
+ request = Net::HTTP::Post.new(uri.path, default_headers)
+ request.body = req_body
+ response = http.request(request)
+ parsed = JSON.parse(response.body)
+ return parsed["error"]["code"] unless response.code == "200"
+
+ parsed
+ end
+
+ def call_get(url)
+ uri = URI(url)
+ http = Net::HTTP.new(uri.host, uri.port)
+ request = Net::HTTP::Get.new(uri.path, default_headers)
+ response = http.request(request)
+ parsed = JSON.parse(response.body)
+ return parsed["error"]["code"] unless response.code == "200"
+
+ parsed
end
end
end