Sha256: b7a4a1217043f343d3e39838b079351e45c24b9fdff75b5a4a0b1736909c7f76

Contents?: true

Size: 1.22 KB

Versions: 8

Compression:

Stored size: 1.22 KB

Contents

# frozen_string_literal: true

module OmniAI
  class Chat
    # A file is media that can be sent to many LLMs.
    class File < Media
      attr_accessor :io

      # @param io [IO, Pathname, String]
      # @param type [Symbol, String] :image, :video, :audio, "audio/flac", "image/jpeg", "video/mpeg", etc.
      def initialize(io, type)
        super(type)
        @io = io
      end

      # @return [String]
      def inspect
        "#<#{self.class} io=#{@io.inspect}>"
      end

      # @return [String]
      def fetch!
        case @io
        when String then ::File.binread(@io)
        else @io.read
        end
      end

      # @param context [Context]
      # @return [Hash]
      def serialize(context: nil)
        if text?
          content = fetch!
          Text.new("<file>#{filename}: #{content}</file>").serialize(context:)
        else
          serializer = context&.serializer(:file)
          return serializer.call(self, context:) if serializer

          { type: "#{kind}_url", "#{kind}_url": { url: data_uri } }
        end
      end

      # @return [String]
      def filename
        case @io
        when Tempfile, File, String then ::File.basename(@io)
        else 'DATA'
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
omniai-1.9.2 lib/omniai/chat/file.rb
omniai-1.9.1 lib/omniai/chat/file.rb
omniai-1.9.0 lib/omniai/chat/file.rb
omniai-1.8.4 lib/omniai/chat/file.rb
omniai-1.8.3 lib/omniai/chat/file.rb
omniai-1.8.2 lib/omniai/chat/file.rb
omniai-1.8.1 lib/omniai/chat/file.rb
omniai-1.8.0 lib/omniai/chat/file.rb