omniai 1.1.6 → 1.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e94ad519b08013feb50cd317eaed5f66188929d02c6c03f25bd19e3fe5b4f3a9
4
- data.tar.gz: 988e4191a7928a785f24e277e56683a8afb3253a6e90fb42e0cf8e52d9996990
3
+ metadata.gz: 5b37e667b2b004a012bf7d7d76fd80c08aa8948d46b8670651daa3a426c591d2
4
+ data.tar.gz: ded01ccbbf34486159fd965953a9d5cec9a62da16404960e5b0c8bca8d5384ad
5
5
  SHA512:
6
- metadata.gz: 4e6599fd2d0d6d88710b684ee92e19e638dd9aa0ae71d60ca05e710a4ea998e39e8429a6e10c6b7f179d1957f16e60d5c0a8f614bbb36bce847a28373f87daed
7
- data.tar.gz: 326eedd109e5cb0cca4ea758bd02bf6ce51eeae8da9be58a5f892bea20e951155af34b326ecafdd3c0d46a3dee04aa375fa48f634af28d7b09f1677df9553d3a
6
+ metadata.gz: c6c26067f0b0b3c7ecefbdc00ed1746f0f597f729a41ff1e0a253bb723cf89ef1b82ccc2c411a8b43b93d5f54c83a9f3e58ab7074be324e9b3bf24e099e7ca2a
7
+ data.tar.gz: fe75154f85d6a68b1698c923548570695c724293462225bdb9d29db8ccf884ab2965bce3090a9f9c64851c5547ab4a655e59e7079c0923bff9ee18f46320517c
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAI
4
+ class Chat
5
+ module Content
6
+ # A file that is either audio / image / video.
7
+ class File < Media
8
+ attr_accessor :io
9
+
10
+ # @param io [IO, Pathname, String]
11
+ # @param type [Symbol, String] :image, :video, :audio, "audio/flac", "image/jpeg", "video/mpeg", etc.
12
+ def initialize(io, type)
13
+ super(type)
14
+ @io = io
15
+ end
16
+
17
+ # @return [String]
18
+ def fetch!
19
+ case @io
20
+ when IO then @io.read
21
+ else ::File.binread(@io)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAI
4
+ class Chat
5
+ module Content
6
+ # An abstract class that represents audio / image / video and is used for both files and urls.
7
+ class Media
8
+ attr_accessor :type
9
+
10
+ # @param type [String] "audio/flac", "image/jpeg", "video/mpeg", etc.
11
+ def initialize(type)
12
+ @type = type
13
+ end
14
+
15
+ # @return [Boolean]
16
+ def text?
17
+ @type.match?(%r{^text/})
18
+ end
19
+
20
+ # @return [Boolean]
21
+ def audio?
22
+ @type.match?(%r{^audio/})
23
+ end
24
+
25
+ # @return [Boolean]
26
+ def image?
27
+ @type.match?(%r{^image/})
28
+ end
29
+
30
+ # @return [Boolean]
31
+ def video?
32
+ @type.match?(%r{^video/})
33
+ end
34
+
35
+ # @yield [io]
36
+ def fetch!(&)
37
+ raise NotImplementedError, "#{self.class}#fetch! undefined"
38
+ end
39
+
40
+ # e.g. "Hello" -> "SGVsbG8h"
41
+ #
42
+ # @return [String]
43
+ def data
44
+ Base64.strict_encode64(fetch!)
45
+ end
46
+
47
+ # e.g. "data:text/html;base64,..."
48
+ #
49
+ # @return [String]
50
+ def data_uri
51
+ "data:#{@type};base64,#{data}"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAI
4
+ class Chat
5
+ module Content
6
+ # Just some text.
7
+ class Text
8
+ attr_accessor :text
9
+
10
+ # @param text [text]
11
+ def initialize(text)
12
+ @text = text
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAI
4
+ class Chat
5
+ module Content
6
+ # A url that is either audio / image / video.
7
+ class URL < Media
8
+ attr_accessor :url, :type
9
+
10
+ class HTTPError < OmniAI::HTTPError; end
11
+
12
+ # @param url [URI, String]
13
+ # @param type [Symbol, String] "audio/flac", "image/jpeg", "video/mpeg", etc.
14
+ def initialize(url, type)
15
+ super(type)
16
+ @url = url
17
+ end
18
+
19
+ # @raise [HTTPError]
20
+ #
21
+ # @return [String]
22
+ def fetch!
23
+ response = request!
24
+ String(response.body)
25
+ end
26
+
27
+ private
28
+
29
+ # @raise [HTTPError]
30
+ #
31
+ # @return [HTTP::Response]
32
+ def request!
33
+ response = HTTP.get(@url)
34
+ raise HTTPError, response.flush unless response.status.success?
35
+
36
+ response
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OmniAI
4
- VERSION = '1.1.6'
4
+ VERSION = '1.2.1'
5
5
  end
data/lib/omniai.rb CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  require 'event_stream_parser'
4
4
  require 'http'
5
+ require 'uri'
5
6
  require 'zeitwerk'
6
7
 
7
8
  loader = Zeitwerk::Loader.for_gem
8
9
  loader.inflector.inflect 'omniai' => 'OmniAI'
10
+ loader.inflector.inflect 'url' => 'URL'
9
11
  loader.setup
10
12
 
11
13
  module OmniAI
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Sylvestre
@@ -69,7 +69,10 @@ files:
69
69
  - lib/omniai/chat/choice.rb
70
70
  - lib/omniai/chat/chunk.rb
71
71
  - lib/omniai/chat/completion.rb
72
- - lib/omniai/chat/content.rb
72
+ - lib/omniai/chat/content/file.rb
73
+ - lib/omniai/chat/content/media.rb
74
+ - lib/omniai/chat/content/text.rb
75
+ - lib/omniai/chat/content/url.rb
73
76
  - lib/omniai/chat/delta.rb
74
77
  - lib/omniai/chat/message.rb
75
78
  - lib/omniai/chat/stream.rb
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OmniAI
4
- class Chat
5
- # A file used for analysis.
6
- class Content
7
- attr_accessor :type, :value
8
-
9
- # @param value [String]
10
- # @param type [Symbol] :image / :video / :audio / :text
11
- def initialize(value, type: :text)
12
- @value = value
13
- @type = type
14
- end
15
- end
16
- end
17
- end