openai-mapper 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +83 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/README.md +35 -0
- data/Rakefile +12 -0
- data/lib/openai/arguments.rb +20 -0
- data/lib/openai/chat/completions.rb +20 -0
- data/lib/openai/file/create.rb +10 -0
- data/lib/openai/fine_tune/create.rb +10 -0
- data/lib/openai/images/create.rb +20 -0
- data/lib/openai/images/edit.rb +50 -0
- data/lib/openai/mapper/chat/completion_chunk.rb +25 -0
- data/lib/openai/mapper/chat/completions.rb +25 -0
- data/lib/openai/mapper/choices.rb +23 -0
- data/lib/openai/mapper/file.rb +19 -0
- data/lib/openai/mapper/function_call.rb +15 -0
- data/lib/openai/mapper/functions.rb +15 -0
- data/lib/openai/mapper/images/image.rb +17 -0
- data/lib/openai/mapper/images/list.rb +17 -0
- data/lib/openai/mapper/message.rb +17 -0
- data/lib/openai/mapper/model.rb +26 -0
- data/lib/openai/mapper/model_permission.rb +35 -0
- data/lib/openai/mapper/models.rb +15 -0
- data/lib/openai/mapper/usage.rb +17 -0
- data/lib/openai/mapper.rb +16 -0
- data/lib/openai/model.rb +15 -0
- data/lib/openai/models.rb +15 -0
- data/lib/openai/request/chat/completion.rb +24 -0
- data/lib/openai/request/images/create.rb +15 -0
- data/lib/openai/request/images/edit.rb +17 -0
- data/lib/openai/request/images/variation.rb +15 -0
- data/lib/openai/resource/api.rb +73 -0
- data/lib/openai/version.rb +6 -0
- data/lib/openai.rb +28 -0
- data/openai-mapper.gemspec +69 -0
- data/sig/openai/mapper.rbs +6 -0
- metadata +448 -0
    
        data/lib/openai/model.rb
    ADDED
    
    | @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Openai
         | 
| 4 | 
            +
              class Model < ::Openai::Resource::Api
         | 
| 5 | 
            +
                def initialize
         | 
| 6 | 
            +
                  @path = "/v1/models"
         | 
| 7 | 
            +
                  super()
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def request(model_id)
         | 
| 11 | 
            +
                  @response = @connection.get(path: [@path, model_id].join("/"))
         | 
| 12 | 
            +
                  @data = ::Openai::Mapper::Model.from_json(super())
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Openai
         | 
| 4 | 
            +
              class Models < ::Openai::Resource::Api
         | 
| 5 | 
            +
                def initialize
         | 
| 6 | 
            +
                  @path = "/v1/models"
         | 
| 7 | 
            +
                  super()
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def request
         | 
| 11 | 
            +
                  @response = @connection.get(path: @path)
         | 
| 12 | 
            +
                  @data = ::Openai::Mapper::Models.from_json(super())
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Openai
         | 
| 4 | 
            +
              module Request
         | 
| 5 | 
            +
                module Chat
         | 
| 6 | 
            +
                  class Completion < ::Openai::Mapper::BaseMapper
         | 
| 7 | 
            +
                    attribute :model, ::Shale::Type::String
         | 
| 8 | 
            +
                    attribute :messages, ::Openai::Mapper::Message, collection: true
         | 
| 9 | 
            +
                    attribute :functions, ::Openai::Mapper::Functions, default: -> {}
         | 
| 10 | 
            +
                    attribute :function_call, ::Openai::Mapper::Functions, default: -> {}
         | 
| 11 | 
            +
                    attribute :temperature, ::Shale::Type::Float, default: -> { 1.0 } # Selector with top_p
         | 
| 12 | 
            +
                    attribute :top_p, ::Shale::Type::Float, default: -> { 1.0 } # Selector with temperature
         | 
| 13 | 
            +
                    attribute :n, ::Shale::Type::Integer, default: -> { 1 }
         | 
| 14 | 
            +
                    attribute :stream, ::Shale::Type::Boolean, default: -> { false }
         | 
| 15 | 
            +
                    attribute :stop, ::Shale::Type::String, default: -> {} # Selector of types
         | 
| 16 | 
            +
                    attribute :max_tokens, ::Shale::Type::Integer, default: -> { 5 }
         | 
| 17 | 
            +
                    attribute :presence_penalty, ::Shale::Type::Float, default: -> { 0 }
         | 
| 18 | 
            +
                    attribute :frequency_penalty, ::Shale::Type::Float, default: -> { 0 }
         | 
| 19 | 
            +
                    attribute :logit_bias, ::Shale::Type::String, default: -> {}
         | 
| 20 | 
            +
                    attribute :user, ::Shale::Type::String, default: -> {}
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Openai
         | 
| 4 | 
            +
              module Request
         | 
| 5 | 
            +
                module Images
         | 
| 6 | 
            +
                  class Create < ::Openai::Mapper::BaseMapper
         | 
| 7 | 
            +
                    attribute :prompt, ::Shale::Type::String
         | 
| 8 | 
            +
                    attribute :response_format, ::Shale::Type::String, default: -> { "url" }
         | 
| 9 | 
            +
                    attribute :n, ::Shale::Type::Integer, default: -> { 1 }
         | 
| 10 | 
            +
                    attribute :size, ::Shale::Type::String, default: -> {}
         | 
| 11 | 
            +
                    attribute :user, ::Shale::Type::String, default: -> {}
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Openai
         | 
| 4 | 
            +
              module Request
         | 
| 5 | 
            +
                module Images
         | 
| 6 | 
            +
                  class Edit < ::Openai::Mapper::BaseMapper
         | 
| 7 | 
            +
                    attribute :image, ::Shale::Type::String
         | 
| 8 | 
            +
                    attribute :prompt, ::Shale::Type::String
         | 
| 9 | 
            +
                    attribute :mask, ::Shale::Type::String
         | 
| 10 | 
            +
                    attribute :n, ::Shale::Type::Integer, default: -> { 1 }
         | 
| 11 | 
            +
                    attribute :size, ::Shale::Type::String, default: -> { "1024x1024" }
         | 
| 12 | 
            +
                    attribute :response_format, ::Shale::Type::String, default: -> { "url" }
         | 
| 13 | 
            +
                    attribute :user, ::Shale::Type::String, default: -> {}
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Openai
         | 
| 4 | 
            +
              module Request
         | 
| 5 | 
            +
                module Images
         | 
| 6 | 
            +
                  class Variation < ::Openai::Mapper::BaseMapper
         | 
| 7 | 
            +
                    attribute :image, ::Shale::Type::String
         | 
| 8 | 
            +
                    attribute :n, ::Shale::Type::Integer, default: -> { 1 }
         | 
| 9 | 
            +
                    attribute :response_format, ::Shale::Type::String, default: -> { "url" }
         | 
| 10 | 
            +
                    attribute :size, ::Shale::Type::String, default: -> { "1024x1024" }
         | 
| 11 | 
            +
                    attribute :user, ::Shale::Type::String, default: -> {}
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require "securerandom"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Openai
         | 
| 7 | 
            +
              module Resource
         | 
| 8 | 
            +
                class Api
         | 
| 9 | 
            +
                  attr_reader :connection, :path, :data, :response
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize
         | 
| 12 | 
            +
                    @file_source = ::File.join(__dir__, "../../../input/")
         | 
| 13 | 
            +
                    Excon.defaults[:ssl_verify_peer] = false
         | 
| 14 | 
            +
                    @connection = Excon.new(BASE_URL, headers: headers)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def request
         | 
| 18 | 
            +
                    parse_body
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  private
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def ssl_options
         | 
| 24 | 
            +
                    {verify: true, verify_mode: 0}
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def headers
         | 
| 28 | 
            +
                    {
         | 
| 29 | 
            +
                      "Content-Type" => "application/json",
         | 
| 30 | 
            +
                      "Authorization" => "Bearer #{ACCESS_TOKEN}"
         | 
| 31 | 
            +
                    }
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def parse_body
         | 
| 35 | 
            +
                    @data = @response.body
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def multipart_attachment(content_type, key, filename, data)
         | 
| 39 | 
            +
                    data.binmode if data.respond_to?(:binmode)
         | 
| 40 | 
            +
                    data.pos = 0 if data.respond_to?(:pos=)
         | 
| 41 | 
            +
                    body = "--#{@boundary}#{Excon::CR_NL}"
         | 
| 42 | 
            +
                    body << multipart_file_header(key, filename, content_type)
         | 
| 43 | 
            +
                    body << Excon::CR_NL
         | 
| 44 | 
            +
                    body << data.to_s
         | 
| 45 | 
            +
                    body << Excon::CR_NL
         | 
| 46 | 
            +
                    body
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def multipart_file_header(key, filename, content_type)
         | 
| 50 | 
            +
                    body = %(Content-Disposition: form-data; name="#{key}"; filename="#{filename}"#{Excon::CR_NL})
         | 
| 51 | 
            +
                    body << "Content-Type: #{content_type}#{Excon::CR_NL}"
         | 
| 52 | 
            +
                    body
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  def multipart_field(key, value)
         | 
| 56 | 
            +
                    body = "--#{@boundary}#{Excon::CR_NL}"
         | 
| 57 | 
            +
                    body << %(Content-Disposition: form-data; name="#{key}"#{Excon::CR_NL})
         | 
| 58 | 
            +
                    body << Excon::CR_NL
         | 
| 59 | 
            +
                    body << value.to_s
         | 
| 60 | 
            +
                    body << Excon::CR_NL
         | 
| 61 | 
            +
                    body
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  def attach_image(key, filename, image, mime = "image/png")
         | 
| 65 | 
            +
                    multipart_attachment(mime, key, filename, image)
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  def read_image(image)
         | 
| 69 | 
            +
                    ::File.read(::File.join(@file_source, image))
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
    
        data/lib/openai.rb
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            # typed: false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            if ["test", "development"].include?(ENV["BUNDLE_ENV"])
         | 
| 4 | 
            +
              require "dotenv"
         | 
| 5 | 
            +
              Dotenv.load
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            require "zeitwerk"
         | 
| 9 | 
            +
            require "excon"
         | 
| 10 | 
            +
            require "shale"
         | 
| 11 | 
            +
            require "ox"
         | 
| 12 | 
            +
            require "tomlib"
         | 
| 13 | 
            +
            require "shale/adapter/ox"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            loader = Zeitwerk::Loader.for_gem
         | 
| 16 | 
            +
            loader.setup
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            Shale.xml_adapter = Shale::Adapter::Ox
         | 
| 19 | 
            +
            Shale.toml_adapter = Tomlib
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            module Openai
         | 
| 22 | 
            +
              BASE_URL = "https://api.openai.com"
         | 
| 23 | 
            +
              ACCESS_TOKEN = ENV.fetch("OPENAI_TOKEN")
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              class Error < StandardError; end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            loader.eager_load
         | 
| @@ -0,0 +1,69 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require_relative "lib/openai/version"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |spec|
         | 
| 6 | 
            +
              spec.name = "openai-mapper"
         | 
| 7 | 
            +
              spec.version = Openai::VERSION
         | 
| 8 | 
            +
              spec.authors = ["Sergey Bezugliy"]
         | 
| 9 | 
            +
              spec.email = ["s.bezugliy@gmail.com"]
         | 
| 10 | 
            +
              spec.licenses    = ['MIT']
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              spec.summary = "OpenAI resources API client and object mapper"
         | 
| 13 | 
            +
              spec.description = "OpenAI resources API client and object mapper"
         | 
| 14 | 
            +
              spec.homepage = "https://github.com/sbezugliy/openai-mapper"
         | 
| 15 | 
            +
              spec.required_ruby_version = ">= 2.6.0"
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              spec.metadata["allowed_push_host"] = "https://rubygems.org/"
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              spec.metadata["homepage_uri"] = spec.homepage
         | 
| 20 | 
            +
              spec.metadata["source_code_uri"] = "https://github.com/sbezugliy/openai-mapper"
         | 
| 21 | 
            +
              spec.metadata["changelog_uri"] = "https://github.com/sbezugliy/openai-mapper/CHANGELOG.MD"
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              # Specify which files should be added to the gem when it is released.
         | 
| 24 | 
            +
              # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
         | 
| 25 | 
            +
              spec.files = Dir.chdir(__dir__) do
         | 
| 26 | 
            +
                `git ls-files -z`.split("\x0").reject do |f|
         | 
| 27 | 
            +
                  (File.expand_path(f) == __FILE__) ||
         | 
| 28 | 
            +
                    f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile output])
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
              spec.bindir = "exe"
         | 
| 32 | 
            +
              spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
         | 
| 33 | 
            +
              spec.require_paths = ["lib"]
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              spec.add_dependency "excon"
         | 
| 36 | 
            +
              spec.add_dependency "shale"
         | 
| 37 | 
            +
              # spec.add_dependency "faraday_middleware"
         | 
| 38 | 
            +
              # spec.add_dependency "async-http-faraday"
         | 
| 39 | 
            +
              spec.add_dependency "rake"
         | 
| 40 | 
            +
              spec.add_dependency "zeitwerk"
         | 
| 41 | 
            +
              spec.add_dependency "mimemagic"
         | 
| 42 | 
            +
              spec.add_dependency "ox"
         | 
| 43 | 
            +
              spec.add_dependency "tomlib"
         | 
| 44 | 
            +
              spec.add_dependency "pry"
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              # Uncomment to register a new dependency of your gem
         | 
| 47 | 
            +
              spec.add_development_dependency "dotenv"
         | 
| 48 | 
            +
              spec.add_development_dependency "rspec"
         | 
| 49 | 
            +
              spec.add_development_dependency "rubocop", "~> 1.56.0"
         | 
| 50 | 
            +
              spec.add_development_dependency "rubocop-capybara"
         | 
| 51 | 
            +
              spec.add_development_dependency "rubocop-factory_bot"
         | 
| 52 | 
            +
              spec.add_development_dependency "rubocop-performance", "~> 1.18.0"
         | 
| 53 | 
            +
              spec.add_development_dependency "rubocop-rake"
         | 
| 54 | 
            +
              spec.add_development_dependency "rubocop-rspec"
         | 
| 55 | 
            +
              spec.add_development_dependency "rubocop-packs"
         | 
| 56 | 
            +
              spec.add_development_dependency "simplecov"
         | 
| 57 | 
            +
              spec.add_development_dependency "standard", "~> 1.30"
         | 
| 58 | 
            +
              spec.add_development_dependency "standard-performance", "~> 1.1.0"
         | 
| 59 | 
            +
              spec.add_development_dependency "shoulda-matchers"
         | 
| 60 | 
            +
              spec.add_development_dependency "webmock"
         | 
| 61 | 
            +
              spec.add_development_dependency "async-rspec", "~> 1.2"
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              spec.add_development_dependency "bundler-audit"
         | 
| 64 | 
            +
              spec.add_development_dependency "dawnscanner"
         | 
| 65 | 
            +
              spec.add_development_dependency "ruby_audit"
         | 
| 66 | 
            +
             | 
| 67 | 
            +
              # For more information and examples about making a new gem, check out our
         | 
| 68 | 
            +
              # guide at: https://bundler.io/guides/creating_gem.html
         | 
| 69 | 
            +
            end
         |