# frozen_string_literal: true require_relative "assistant/version" require_relative "assistant_obj" require "uri" require "json" require "net/http" require "rest-client" module Openai # An openai assistant class Assistant @openai_api_key = nil @openai_url = "https://api.openai.com/v1/assistants" def self.initialize(api_key) @openai_api_key = api_key end def self.create_assistant(model, instructions) url = @openai_url headers = { "Authorization": "Bearer #{@openai_api_key}", "OpenAI-Beta": "assistants=v1", "Content-Type": "application/json" } 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)) end def self.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)) end def self.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 parsed["deleted"] end def self.parse_assistant_object(data) Openai::AssistantObj.new( id: data["id"], object: data["object"], created_at: data["created_at"], name: data["name"], description: data["description"], model: data["model"], instructions: data["instructions"], tools: data["tools"], file_ids: data["file_ids"], metadata: data["metadata"] ) end end end