omniai 1.9.2 → 1.9.4
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 +4 -4
- data/Gemfile +14 -13
- data/README.md +14 -0
- data/bin/console +3 -3
- data/exe/omniai +1 -1
- data/lib/omniai/chat/choice.rb +2 -2
- data/lib/omniai/chat/content.rb +3 -3
- data/lib/omniai/chat/file.rb +1 -1
- data/lib/omniai/chat/function.rb +3 -3
- data/lib/omniai/chat/message.rb +4 -4
- data/lib/omniai/chat/payload.rb +2 -2
- data/lib/omniai/chat/stream.rb +2 -2
- data/lib/omniai/chat/text.rb +2 -2
- data/lib/omniai/chat/tool_call.rb +3 -3
- data/lib/omniai/chat/tool_call_message.rb +3 -3
- data/lib/omniai/chat/tool_call_result.rb +2 -2
- data/lib/omniai/chat/url.rb +3 -3
- data/lib/omniai/chat/usage.rb +3 -3
- data/lib/omniai/chat.rb +7 -7
- data/lib/omniai/cli/base_handler.rb +3 -3
- data/lib/omniai/cli/chat_handler.rb +8 -8
- data/lib/omniai/cli/embed_handler.rb +6 -6
- data/lib/omniai/cli.rb +9 -9
- data/lib/omniai/client.rb +8 -8
- data/lib/omniai/embed/response.rb +3 -3
- data/lib/omniai/embed.rb +1 -1
- data/lib/omniai/files.rb +11 -0
- data/lib/omniai/speak.rb +7 -7
- data/lib/omniai/tool/array.rb +1 -1
- data/lib/omniai/tool/object.rb +1 -1
- data/lib/omniai/tool/property.rb +4 -4
- data/lib/omniai/tool.rb +1 -1
- data/lib/omniai/transcribe.rb +63 -63
- data/lib/omniai/version.rb +1 -1
- data/lib/omniai.rb +8 -8
- metadata +18 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eca1c768ff6bacdf521418a896e115253ad01e80848bb3a2416772b18e17cc84
|
4
|
+
data.tar.gz: 78a171dc3b7ccf17765166836f12daca5cc14baaa77396f680682b7c9ceb4a4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 865e34d906b82247bbd5a664610e96fdc256b40d9701b5cd2d1cb5166d1334dda233272117d7065a7dabd2e25e77a5e454ea2cb8af028f63b8998dfc575cd67c
|
7
|
+
data.tar.gz: 57951e245c5b6a29e5d147b0c91c6a1decb37bca7af7aabe9580a51016d332343f981d4bab733fef5350c6a40024633e0792e1ecceefc245dbe8f781d5bcf1a4
|
data/Gemfile
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
source
|
3
|
+
source "https://rubygems.org"
|
4
4
|
|
5
5
|
gemspec
|
6
6
|
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem
|
10
|
-
gem
|
11
|
-
gem
|
12
|
-
gem
|
13
|
-
gem
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem
|
17
|
-
gem
|
18
|
-
gem
|
7
|
+
gem "factory_bot"
|
8
|
+
gem "irb"
|
9
|
+
gem "rake"
|
10
|
+
gem "rspec"
|
11
|
+
gem "rspec_junit_formatter"
|
12
|
+
gem "rubocop"
|
13
|
+
gem "rubocop-basic"
|
14
|
+
gem "rubocop-factory_bot"
|
15
|
+
gem "rubocop-rake"
|
16
|
+
gem "rubocop-rspec"
|
17
|
+
gem "simplecov"
|
18
|
+
gem "webmock"
|
19
|
+
gem "yard"
|
data/README.md
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
OmniAI standardizes the APIs of various AI / LLM companies such as Anthropic, Google, Mistral and OpenAI for the generation of text, the conversion of text-to-speech, the conversion of speech-to-text, the generation of embeddings, and more. It offers a unified API regardless of the provider and task.
|
10
10
|
|
11
11
|
- [OmniAI::Anthropic](https://github.com/ksylvest/omniai-anthropic)
|
12
|
+
- [OmniAI::DeepSeek](https://github.com/ksylvest/omniai-deepseek)
|
12
13
|
- [OmniAI::Google](https://github.com/ksylvest/omniai-google)
|
13
14
|
- [OmniAI::Mistral](https://github.com/ksylvest/omniai-mistral)
|
14
15
|
- [OmniAI::OpenAI](https://github.com/ksylvest/omniai-openai)
|
@@ -167,12 +168,17 @@ search('Who do you call to fix a toilet?')
|
|
167
168
|
|
168
169
|
## Installation
|
169
170
|
|
171
|
+
The main `omniai` gem is installed with:
|
172
|
+
|
170
173
|
```sh
|
171
174
|
gem install omniai
|
172
175
|
```
|
173
176
|
|
177
|
+
Specific provider gems are installed with:
|
178
|
+
|
174
179
|
```sh
|
175
180
|
gem install omniai-anthropic
|
181
|
+
gem install omniai-deepseek
|
176
182
|
gem install omniai-mistral
|
177
183
|
gem install omniai-google
|
178
184
|
gem install omniai-openai
|
@@ -192,6 +198,14 @@ require 'omniai/anthropic'
|
|
192
198
|
client = OmniAI::Anthropic::Client.new
|
193
199
|
```
|
194
200
|
|
201
|
+
#### [OmniAI::DeepSeek](https://github.com/ksylvest/omniai-deepseek)
|
202
|
+
|
203
|
+
```ruby
|
204
|
+
require 'omniai/deepseek'
|
205
|
+
|
206
|
+
client = OmniAI::DeepSeek::Client.new
|
207
|
+
```
|
208
|
+
|
195
209
|
#### [OmniAI::Google](https://github.com/ksylvest/omniai-google)
|
196
210
|
|
197
211
|
```ruby
|
data/bin/console
CHANGED
data/exe/omniai
CHANGED
data/lib/omniai/chat/choice.rb
CHANGED
@@ -31,8 +31,8 @@ module OmniAI
|
|
31
31
|
deserialize = context&.deserializer(:choice)
|
32
32
|
return deserialize.call(data, context:) if deserialize
|
33
33
|
|
34
|
-
index = data[
|
35
|
-
message = Message.deserialize(data[
|
34
|
+
index = data["index"]
|
35
|
+
message = Message.deserialize(data["message"] || data["delta"], context:)
|
36
36
|
|
37
37
|
new(message:, index:)
|
38
38
|
end
|
data/lib/omniai/chat/content.rb
CHANGED
@@ -32,10 +32,10 @@ module OmniAI
|
|
32
32
|
|
33
33
|
return data if data.is_a?(String)
|
34
34
|
|
35
|
-
raise ArgumentError, "untyped data=#{data.inspect}" unless data.key?(
|
35
|
+
raise ArgumentError, "untyped data=#{data.inspect}" unless data.key?("type")
|
36
36
|
|
37
|
-
case data[
|
38
|
-
when
|
37
|
+
case data["type"]
|
38
|
+
when "text" then Text.deserialize(data, context:)
|
39
39
|
when /(.*)_url/ then URL.deserialize(data, context:)
|
40
40
|
else raise ArgumentError, "unknown type=#{data['type'].inspect}"
|
41
41
|
end
|
data/lib/omniai/chat/file.rb
CHANGED
data/lib/omniai/chat/function.rb
CHANGED
@@ -30,11 +30,11 @@ module OmniAI
|
|
30
30
|
deserialize = context&.deserializer(:function)
|
31
31
|
return deserialize.call(data, context:) if deserialize
|
32
32
|
|
33
|
-
name = data[
|
33
|
+
name = data["name"]
|
34
34
|
arguments = begin
|
35
|
-
JSON.parse(data[
|
35
|
+
JSON.parse(data["arguments"]) if data["arguments"]
|
36
36
|
rescue JSON::ParserError
|
37
|
-
data[
|
37
|
+
data["arguments"]
|
38
38
|
end
|
39
39
|
|
40
40
|
new(name:, arguments:)
|
data/lib/omniai/chat/message.rb
CHANGED
@@ -30,7 +30,7 @@ module OmniAI
|
|
30
30
|
#
|
31
31
|
# @return [Message]
|
32
32
|
def self.build(content = nil, role: Role::USER, &block)
|
33
|
-
raise ArgumentError,
|
33
|
+
raise ArgumentError, "content or block is required" if content.nil? && block.nil?
|
34
34
|
|
35
35
|
Builder.build(role:) do |builder|
|
36
36
|
builder.text(content) if content
|
@@ -81,9 +81,9 @@ module OmniAI
|
|
81
81
|
deserialize = context&.deserializer(:message)
|
82
82
|
return deserialize.call(data, context:) if deserialize
|
83
83
|
|
84
|
-
role = data[
|
85
|
-
content = Content.deserialize(data[
|
86
|
-
tool_call_list = data[
|
84
|
+
role = data["role"]
|
85
|
+
content = Content.deserialize(data["content"], context:)
|
86
|
+
tool_call_list = data["tool_calls"]&.map { |subdata| ToolCall.deserialize(subdata, context:) }
|
87
87
|
|
88
88
|
new(content:, role:, tool_call_list:)
|
89
89
|
end
|
data/lib/omniai/chat/payload.rb
CHANGED
@@ -28,8 +28,8 @@ module OmniAI
|
|
28
28
|
deserialize = context&.deserializer(:payload)
|
29
29
|
return deserialize.call(data, context:) if deserialize
|
30
30
|
|
31
|
-
choices = data[
|
32
|
-
usage = Usage.deserialize(data[
|
31
|
+
choices = data["choices"].map { |choice_data| Choice.deserialize(choice_data, context:) }
|
32
|
+
usage = Usage.deserialize(data["usage"], context:) if data["usage"]
|
33
33
|
|
34
34
|
new(choices:, usage:)
|
35
35
|
end
|
data/lib/omniai/chat/stream.rb
CHANGED
@@ -23,7 +23,7 @@ module OmniAI
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
protected
|
27
27
|
|
28
28
|
# @param type [String]
|
29
29
|
# @param data [String]
|
@@ -47,7 +47,7 @@ module OmniAI
|
|
47
47
|
def process!(type, data, id, &block)
|
48
48
|
log(type, data, id)
|
49
49
|
|
50
|
-
return if data.eql?(
|
50
|
+
return if data.eql?("[DONE]")
|
51
51
|
|
52
52
|
block.call(Payload.deserialize(JSON.parse(data), context: @context))
|
53
53
|
end
|
data/lib/omniai/chat/text.rb
CHANGED
@@ -28,7 +28,7 @@ module OmniAI
|
|
28
28
|
deserialize = context&.deserializer(:text)
|
29
29
|
return deserialize.call(data, context:) if deserialize
|
30
30
|
|
31
|
-
new(data[
|
31
|
+
new(data["text"])
|
32
32
|
end
|
33
33
|
|
34
34
|
# @param context [Context] optional
|
@@ -38,7 +38,7 @@ module OmniAI
|
|
38
38
|
serializer = context&.serializer(:text)
|
39
39
|
return serializer.call(self, context:) if serializer
|
40
40
|
|
41
|
-
{ type:
|
41
|
+
{ type: "text", text: @text }
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -30,8 +30,8 @@ module OmniAI
|
|
30
30
|
deserialize = context&.deserializer(:tool_call)
|
31
31
|
return deserialize.call(data, context:) if deserialize
|
32
32
|
|
33
|
-
id = data[
|
34
|
-
function = Function.deserialize(data[
|
33
|
+
id = data["id"]
|
34
|
+
function = Function.deserialize(data["function"], context:)
|
35
35
|
|
36
36
|
new(id:, function:)
|
37
37
|
end
|
@@ -45,7 +45,7 @@ module OmniAI
|
|
45
45
|
|
46
46
|
{
|
47
47
|
id: @id,
|
48
|
-
type:
|
48
|
+
type: "function",
|
49
49
|
function: @function.serialize(context:),
|
50
50
|
}
|
51
51
|
end
|
@@ -31,9 +31,9 @@ module OmniAI
|
|
31
31
|
deserialize = context&.deserializer(:tool_message)
|
32
32
|
return deserialize.call(data, context:) if deserialize
|
33
33
|
|
34
|
-
role = data[
|
35
|
-
content = JSON.parse(data[
|
36
|
-
tool_call_id = data[
|
34
|
+
role = data["role"]
|
35
|
+
content = JSON.parse(data["content"])
|
36
|
+
tool_call_id = data["tool_call_id"]
|
37
37
|
|
38
38
|
new(role:, content:, tool_call_id:)
|
39
39
|
end
|
@@ -41,8 +41,8 @@ module OmniAI
|
|
41
41
|
deserialize = context&.deserializer(:tool_call_result)
|
42
42
|
return deserialize.call(data, context:) if deserialize
|
43
43
|
|
44
|
-
content = JSON.parse(data[
|
45
|
-
tool_call_id = data[
|
44
|
+
content = JSON.parse(data["content"])
|
45
|
+
tool_call_id = data["tool_call_id"]
|
46
46
|
|
47
47
|
new(content:, tool_call_id:)
|
48
48
|
end
|
data/lib/omniai/chat/url.rb
CHANGED
@@ -31,8 +31,8 @@ module OmniAI
|
|
31
31
|
deserialize = context&.deserializer(:url)
|
32
32
|
return deserialize.call(data, context:) if deserialize
|
33
33
|
|
34
|
-
type = /(?<type>\w+)_url/.match(data[
|
35
|
-
uri = data["#{type}_url"][
|
34
|
+
type = /(?<type>\w+)_url/.match(data["type"])[:type]
|
35
|
+
uri = data["#{type}_url"]["url"]
|
36
36
|
|
37
37
|
new(uri, type)
|
38
38
|
end
|
@@ -68,7 +68,7 @@ module OmniAI
|
|
68
68
|
::File.basename(@uri)
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
protected
|
72
72
|
|
73
73
|
# @raise [FetchError]
|
74
74
|
#
|
data/lib/omniai/chat/usage.rb
CHANGED
@@ -35,9 +35,9 @@ module OmniAI
|
|
35
35
|
deserialize = context&.deserializer(:usage)
|
36
36
|
return deserialize.call(data, context:) if deserialize
|
37
37
|
|
38
|
-
input_tokens = data[
|
39
|
-
output_tokens = data[
|
40
|
-
total_tokens = data[
|
38
|
+
input_tokens = data["input_tokens"]
|
39
|
+
output_tokens = data["output_tokens"]
|
40
|
+
total_tokens = data["total_tokens"]
|
41
41
|
|
42
42
|
new(input_tokens:, output_tokens:, total_tokens:)
|
43
43
|
end
|
data/lib/omniai/chat.rb
CHANGED
@@ -25,7 +25,7 @@ module OmniAI
|
|
25
25
|
#
|
26
26
|
# client.chat(messages, model: "...", temperature: 0.0, format: :text)
|
27
27
|
class Chat
|
28
|
-
JSON_PROMPT =
|
28
|
+
JSON_PROMPT = "Respond with valid JSON. Do not include any non-JSON in the response."
|
29
29
|
|
30
30
|
# An error raised for tool-call issues.
|
31
31
|
class ToolCallError < Error
|
@@ -45,10 +45,10 @@ module OmniAI
|
|
45
45
|
end
|
46
46
|
|
47
47
|
module Role
|
48
|
-
ASSISTANT =
|
49
|
-
USER =
|
50
|
-
SYSTEM =
|
51
|
-
TOOL =
|
48
|
+
ASSISTANT = "assistant"
|
49
|
+
USER = "user"
|
50
|
+
SYSTEM = "system"
|
51
|
+
TOOL = "tool"
|
52
52
|
end
|
53
53
|
|
54
54
|
module Format
|
@@ -72,7 +72,7 @@ module OmniAI
|
|
72
72
|
#
|
73
73
|
# @return [OmniAi::Chat]
|
74
74
|
def initialize(prompt = nil, client:, model:, temperature: nil, stream: nil, tools: nil, format: nil, &block)
|
75
|
-
raise ArgumentError,
|
75
|
+
raise ArgumentError, "prompt or block is required" if !prompt && !block
|
76
76
|
|
77
77
|
@prompt = prompt ? Prompt.parse(prompt) : Prompt.new
|
78
78
|
block&.call(@prompt)
|
@@ -94,7 +94,7 @@ module OmniAI
|
|
94
94
|
parse!(response:)
|
95
95
|
end
|
96
96
|
|
97
|
-
|
97
|
+
protected
|
98
98
|
|
99
99
|
# Override to provide an context for serializers / deserializes for a provider.
|
100
100
|
#
|
@@ -8,14 +8,14 @@ module OmniAI
|
|
8
8
|
# @param stdout [IO] an optional stream for stdout
|
9
9
|
# @param provider [String] an optional provider (defaults to 'openai')
|
10
10
|
# @param argv [Array<String>]
|
11
|
-
def self.handle!(argv:, stdin: $stdin, stdout: $stdout, provider:
|
11
|
+
def self.handle!(argv:, stdin: $stdin, stdout: $stdout, provider: "openai")
|
12
12
|
new(stdin:, stdout:, provider:).handle!(argv:)
|
13
13
|
end
|
14
14
|
|
15
15
|
# @param stdin [IO] an optional stream for stdin
|
16
16
|
# @param stdout [IO] an optional stream for stdout
|
17
17
|
# @param provider [String] an optional provider (defaults to 'openai')
|
18
|
-
def initialize(stdin: $stdin, stdout: $stdout, provider:
|
18
|
+
def initialize(stdin: $stdin, stdout: $stdout, provider: "openai")
|
19
19
|
@stdin = stdin
|
20
20
|
@stdout = stdout
|
21
21
|
@provider = provider
|
@@ -27,7 +27,7 @@ module OmniAI
|
|
27
27
|
raise NotImplementedError, "#{self.class}#handle! undefined"
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
private
|
31
31
|
|
32
32
|
# @return [OmniAI::Client]
|
33
33
|
def client
|
@@ -11,17 +11,17 @@ module OmniAI
|
|
11
11
|
if argv.empty?
|
12
12
|
listen!
|
13
13
|
else
|
14
|
-
chat(prompt: argv.join(
|
14
|
+
chat(prompt: argv.join(" "))
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
private
|
19
19
|
|
20
20
|
def listen!
|
21
21
|
@stdout.puts('Type "exit" or "quit" to leave.')
|
22
22
|
|
23
23
|
loop do
|
24
|
-
@stdout.print(
|
24
|
+
@stdout.print("# ")
|
25
25
|
@stdout.flush
|
26
26
|
prompt = @stdin.gets&.chomp
|
27
27
|
|
@@ -43,17 +43,17 @@ module OmniAI
|
|
43
43
|
OptionParser.new do |options|
|
44
44
|
options.banner = 'usage: omniai chat [options] "<prompt>"'
|
45
45
|
|
46
|
-
options.on(
|
46
|
+
options.on("-h", "--help", "help") do
|
47
47
|
@stdout.puts(options)
|
48
48
|
exit
|
49
49
|
end
|
50
50
|
|
51
|
-
options.on(
|
52
|
-
options.on(
|
53
|
-
options.on(
|
51
|
+
options.on("-p", "--provider=PROVIDER", "provider") { |provider| @provider = provider }
|
52
|
+
options.on("-m", "--model=MODEL", "model") { |model| @args[:model] = model }
|
53
|
+
options.on("-t", "--temperature=TEMPERATURE", Float, "temperature") do |temperature|
|
54
54
|
@args[:temperature] = temperature
|
55
55
|
end
|
56
|
-
options.on(
|
56
|
+
options.on("-f", "--format=FORMAT", "format") { |format| @args[:format] = format.intern }
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -11,17 +11,17 @@ module OmniAI
|
|
11
11
|
if argv.empty?
|
12
12
|
listen!
|
13
13
|
else
|
14
|
-
embed(input: argv.join(
|
14
|
+
embed(input: argv.join(" "))
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
private
|
19
19
|
|
20
20
|
def listen!
|
21
21
|
@stdout.puts('Type "exit" or "quit" to leave.')
|
22
22
|
|
23
23
|
loop do
|
24
|
-
@stdout.print(
|
24
|
+
@stdout.print("# ")
|
25
25
|
@stdout.flush
|
26
26
|
input = @stdin.gets&.chomp
|
27
27
|
|
@@ -44,13 +44,13 @@ module OmniAI
|
|
44
44
|
OptionParser.new do |options|
|
45
45
|
options.banner = 'usage: omniai embed [options] "<prompt>"'
|
46
46
|
|
47
|
-
options.on(
|
47
|
+
options.on("-h", "--help", "help") do
|
48
48
|
@stdout.puts(options)
|
49
49
|
exit
|
50
50
|
end
|
51
51
|
|
52
|
-
options.on(
|
53
|
-
options.on(
|
52
|
+
options.on("-p", "--provider=PROVIDER", "provider") { |provider| @provider = provider }
|
53
|
+
options.on("-m", "--model=MODEL", "model") { |model| @args[:model] = model }
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
data/lib/omniai/cli.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "optparse"
|
4
4
|
|
5
5
|
module OmniAI
|
6
6
|
# Used when interacting with the suite from the command line interface (CLI).
|
@@ -15,7 +15,7 @@ module OmniAI
|
|
15
15
|
# @param stdin [IO] a stream
|
16
16
|
# @param stdout [IO] a stream
|
17
17
|
# @param provider [String] a provider
|
18
|
-
def initialize(stdin: $stdin, stdout: $stdout, provider:
|
18
|
+
def initialize(stdin: $stdin, stdout: $stdout, provider: "openai")
|
19
19
|
@stdin = stdin
|
20
20
|
@stdout = stdout
|
21
21
|
@provider = provider
|
@@ -30,32 +30,32 @@ module OmniAI
|
|
30
30
|
|
31
31
|
handler =
|
32
32
|
case command
|
33
|
-
when
|
34
|
-
when
|
33
|
+
when "chat" then ChatHandler
|
34
|
+
when "embed" then EmbedHandler
|
35
35
|
else raise Error, "unsupported command=#{command.inspect}"
|
36
36
|
end
|
37
37
|
|
38
38
|
handler.handle!(stdin: @stdin, stdout: @stdout, provider: @provider, argv:)
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
private
|
42
42
|
|
43
43
|
# @return [OptionParser]
|
44
44
|
def parser
|
45
45
|
OptionParser.new do |options|
|
46
|
-
options.banner =
|
46
|
+
options.banner = "usage: omniai [options] <command> [<args>]"
|
47
47
|
|
48
|
-
options.on(
|
48
|
+
options.on("-h", "--help", "help") do
|
49
49
|
@stdout.puts(options)
|
50
50
|
exit
|
51
51
|
end
|
52
52
|
|
53
|
-
options.on(
|
53
|
+
options.on("-v", "--version", "version") do
|
54
54
|
@stdout.puts(VERSION)
|
55
55
|
exit
|
56
56
|
end
|
57
57
|
|
58
|
-
options.on(
|
58
|
+
options.on("-p", "--provider=PROVIDER", 'provider (default="openai")') do |provider|
|
59
59
|
@provider = provider
|
60
60
|
end
|
61
61
|
|
data/lib/omniai/client.rb
CHANGED
@@ -33,7 +33,7 @@ module OmniAI
|
|
33
33
|
# @raise [OmniAI::Error] if the provider is not defined and the gem is not installed
|
34
34
|
# @return [Class<OmniAI::Client>]
|
35
35
|
def self.anthropic
|
36
|
-
require
|
36
|
+
require "omniai/anthropic" unless defined?(OmniAI::Anthropic::Client)
|
37
37
|
OmniAI::Anthropic::Client
|
38
38
|
rescue LoadError
|
39
39
|
raise Error, "requires 'omniai-anthropic': `gem install omniai-anthropic`"
|
@@ -44,7 +44,7 @@ module OmniAI
|
|
44
44
|
# @raise [OmniAI::Error] if the provider is not defined and the gem is not installed
|
45
45
|
# @return [Class<OmniAI::Client>]
|
46
46
|
def self.google
|
47
|
-
require
|
47
|
+
require "omniai/google" unless defined?(OmniAI::Google::Client)
|
48
48
|
OmniAI::Google::Client
|
49
49
|
rescue LoadError
|
50
50
|
raise Error, "requires 'omniai-google': `gem install omniai-google`"
|
@@ -55,7 +55,7 @@ module OmniAI
|
|
55
55
|
# @raise [OmniAI::Error] if the provider is not defined and the gem is not installed
|
56
56
|
# @return [Class<OmniAI::Client>]
|
57
57
|
def self.mistral
|
58
|
-
require
|
58
|
+
require "omniai/mistral" unless defined?(OmniAI::Mistral::Client)
|
59
59
|
OmniAI::Mistral::Client
|
60
60
|
rescue LoadError
|
61
61
|
raise Error, "requires 'omniai-mistral': `gem install omniai-mistral`"
|
@@ -66,7 +66,7 @@ module OmniAI
|
|
66
66
|
# @raise [OmniAI::Error] if the provider is not defined and the gem is not installed
|
67
67
|
# @return [Class<OmniAI::Client>]
|
68
68
|
def self.openai
|
69
|
-
require
|
69
|
+
require "omniai/openai" unless defined?(OmniAI::OpenAI::Client)
|
70
70
|
OmniAI::OpenAI::Client
|
71
71
|
rescue LoadError
|
72
72
|
raise Error, "requires 'omniai-openai': `gem install omniai-openai`"
|
@@ -80,10 +80,10 @@ module OmniAI
|
|
80
80
|
def self.find(provider:, **)
|
81
81
|
klass =
|
82
82
|
case provider
|
83
|
-
when :anthropic,
|
84
|
-
when :google,
|
85
|
-
when :mistral,
|
86
|
-
when :openai,
|
83
|
+
when :anthropic, "anthropic" then anthropic
|
84
|
+
when :google, "google" then google
|
85
|
+
when :mistral, "mistral" then mistral
|
86
|
+
when :openai, "openai" then openai
|
87
87
|
else raise Error, "unknown provider=#{provider.inspect}"
|
88
88
|
end
|
89
89
|
|
@@ -27,8 +27,8 @@ module OmniAI
|
|
27
27
|
if deserializer
|
28
28
|
deserializer.call(@data, context: @context)
|
29
29
|
else
|
30
|
-
prompt_tokens = @data.dig(
|
31
|
-
total_tokens = @data.dig(
|
30
|
+
prompt_tokens = @data.dig("usage", "prompt_tokens")
|
31
|
+
total_tokens = @data.dig("usage", "total_tokens")
|
32
32
|
|
33
33
|
Usage.new(prompt_tokens:, total_tokens:)
|
34
34
|
end
|
@@ -50,7 +50,7 @@ module OmniAI
|
|
50
50
|
if deserializer
|
51
51
|
deserializer.call(@data, context: @context)
|
52
52
|
else
|
53
|
-
@data[
|
53
|
+
@data["data"].map { |embedding| embedding["embedding"] }
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
data/lib/omniai/embed.rb
CHANGED
data/lib/omniai/files.rb
ADDED
data/lib/omniai/speak.rb
CHANGED
@@ -26,12 +26,12 @@ module OmniAI
|
|
26
26
|
# client.transcribe(File.open("..."), model: "...", format: :json)
|
27
27
|
class Speak
|
28
28
|
module Format
|
29
|
-
AAC =
|
30
|
-
FLAC =
|
31
|
-
MP3 =
|
32
|
-
OPUS =
|
33
|
-
PCM =
|
34
|
-
WAV =
|
29
|
+
AAC = "aac"
|
30
|
+
FLAC = "flac"
|
31
|
+
MP3 = "mp3"
|
32
|
+
OPUS = "opus"
|
33
|
+
PCM = "pcm"
|
34
|
+
WAV = "wav"
|
35
35
|
end
|
36
36
|
|
37
37
|
# @raise [HTTPError]
|
@@ -94,7 +94,7 @@ module OmniAI
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
|
97
|
+
protected
|
98
98
|
|
99
99
|
# @param response [HTTP::Response]
|
100
100
|
#
|
data/lib/omniai/tool/array.rb
CHANGED
data/lib/omniai/tool/object.rb
CHANGED
data/lib/omniai/tool/property.rb
CHANGED
@@ -13,10 +13,10 @@ module OmniAI
|
|
13
13
|
# OmniAI::Tool::Property.boolean(description: '...')
|
14
14
|
class Property
|
15
15
|
module Type
|
16
|
-
BOOLEAN =
|
17
|
-
INTEGER =
|
18
|
-
STRING =
|
19
|
-
NUMBER =
|
16
|
+
BOOLEAN = "boolean"
|
17
|
+
INTEGER = "integer"
|
18
|
+
STRING = "string"
|
19
|
+
NUMBER = "number"
|
20
20
|
end
|
21
21
|
|
22
22
|
# @return [String]
|
data/lib/omniai/tool.rb
CHANGED
data/lib/omniai/transcribe.rb
CHANGED
@@ -26,70 +26,70 @@ module OmniAI
|
|
26
26
|
# client.transcribe(File.open("..."), model: "...", format: :json)
|
27
27
|
class Transcribe
|
28
28
|
module Language
|
29
|
-
AFRIKAANS =
|
30
|
-
ARABIC =
|
31
|
-
ARMENIAN =
|
32
|
-
AZERBAIJANI =
|
33
|
-
BELARUSIAN =
|
34
|
-
BOSNIAN =
|
35
|
-
BULGARIAN =
|
36
|
-
CATALAN =
|
37
|
-
CHINESE =
|
38
|
-
CROATIAN =
|
39
|
-
CZECH =
|
40
|
-
DANISH =
|
41
|
-
DUTCH =
|
42
|
-
ENGLISH =
|
43
|
-
ESTONIAN =
|
44
|
-
FINNISH =
|
45
|
-
FRENCH =
|
46
|
-
GALICIAN =
|
47
|
-
GERMAN =
|
48
|
-
GREEK =
|
49
|
-
HEBREW =
|
50
|
-
HINDI =
|
51
|
-
HUNGARIAN =
|
52
|
-
ICELANDIC =
|
53
|
-
INDONESIAN =
|
54
|
-
ITALIAN =
|
55
|
-
JAPANESE =
|
56
|
-
KANNADA =
|
57
|
-
KAZAKH =
|
58
|
-
KOREAN =
|
59
|
-
LATVIAN =
|
60
|
-
LITHUANIAN =
|
61
|
-
MACEDONIAN =
|
62
|
-
MALAY =
|
63
|
-
MARATHI =
|
64
|
-
MAORI =
|
65
|
-
NEPALI =
|
66
|
-
NORWEGIAN =
|
67
|
-
PERSIAN =
|
68
|
-
POLISH =
|
69
|
-
PORTUGUESE =
|
70
|
-
ROMANIAN =
|
71
|
-
RUSSIAN =
|
72
|
-
SERBIAN =
|
73
|
-
SLOVAK =
|
74
|
-
SLOVENIAN =
|
75
|
-
SPANISH =
|
76
|
-
SWAHILI =
|
77
|
-
SWEDISH =
|
78
|
-
TAGALOG =
|
79
|
-
TAMIL =
|
80
|
-
THAI =
|
81
|
-
TURKISH =
|
82
|
-
UKRAINIAN =
|
83
|
-
URDU =
|
84
|
-
VIETNAMESE =
|
85
|
-
WELSH =
|
29
|
+
AFRIKAANS = "af"
|
30
|
+
ARABIC = "ar"
|
31
|
+
ARMENIAN = "hy"
|
32
|
+
AZERBAIJANI = "az"
|
33
|
+
BELARUSIAN = "be"
|
34
|
+
BOSNIAN = "bs"
|
35
|
+
BULGARIAN = "bg"
|
36
|
+
CATALAN = "ca"
|
37
|
+
CHINESE = "zh"
|
38
|
+
CROATIAN = "hr"
|
39
|
+
CZECH = "cs"
|
40
|
+
DANISH = "da"
|
41
|
+
DUTCH = "nl"
|
42
|
+
ENGLISH = "en"
|
43
|
+
ESTONIAN = "et"
|
44
|
+
FINNISH = "fi"
|
45
|
+
FRENCH = "fr"
|
46
|
+
GALICIAN = "gl"
|
47
|
+
GERMAN = "de"
|
48
|
+
GREEK = "el"
|
49
|
+
HEBREW = "he"
|
50
|
+
HINDI = "hi"
|
51
|
+
HUNGARIAN = "hu"
|
52
|
+
ICELANDIC = "is"
|
53
|
+
INDONESIAN = "id"
|
54
|
+
ITALIAN = "it"
|
55
|
+
JAPANESE = "ja"
|
56
|
+
KANNADA = "kn"
|
57
|
+
KAZAKH = "kk"
|
58
|
+
KOREAN = "ko"
|
59
|
+
LATVIAN = "lv"
|
60
|
+
LITHUANIAN = "lt"
|
61
|
+
MACEDONIAN = "mk"
|
62
|
+
MALAY = "ms"
|
63
|
+
MARATHI = "mr"
|
64
|
+
MAORI = "mi"
|
65
|
+
NEPALI = "ne"
|
66
|
+
NORWEGIAN = "no"
|
67
|
+
PERSIAN = "fa"
|
68
|
+
POLISH = "pl"
|
69
|
+
PORTUGUESE = "pt"
|
70
|
+
ROMANIAN = "ro"
|
71
|
+
RUSSIAN = "ru"
|
72
|
+
SERBIAN = "sr"
|
73
|
+
SLOVAK = "sk"
|
74
|
+
SLOVENIAN = "sl"
|
75
|
+
SPANISH = "es"
|
76
|
+
SWAHILI = "sw"
|
77
|
+
SWEDISH = "sv"
|
78
|
+
TAGALOG = "tl"
|
79
|
+
TAMIL = "ta"
|
80
|
+
THAI = "th"
|
81
|
+
TURKISH = "tr"
|
82
|
+
UKRAINIAN = "uk"
|
83
|
+
URDU = "ur"
|
84
|
+
VIETNAMESE = "vi"
|
85
|
+
WELSH = "cy"
|
86
86
|
end
|
87
87
|
|
88
88
|
module Format
|
89
|
-
JSON =
|
90
|
-
TEXT =
|
91
|
-
VTT =
|
92
|
-
SRT =
|
89
|
+
JSON = "json"
|
90
|
+
TEXT = "text"
|
91
|
+
VTT = "vtt"
|
92
|
+
SRT = "srt"
|
93
93
|
end
|
94
94
|
|
95
95
|
def self.process!(...)
|
@@ -120,11 +120,11 @@ module OmniAI
|
|
120
120
|
|
121
121
|
raise HTTPError, response.flush unless response.status.ok?
|
122
122
|
|
123
|
-
text = @format.nil? || @format.eql?(Format::JSON) ? response.parse[
|
123
|
+
text = @format.nil? || @format.eql?(Format::JSON) ? response.parse["text"] : String(response.body)
|
124
124
|
Transcription.new(text:, model: @model, format: @format)
|
125
125
|
end
|
126
126
|
|
127
|
-
|
127
|
+
protected
|
128
128
|
|
129
129
|
# @return [Hash]
|
130
130
|
def payload
|
data/lib/omniai/version.rb
CHANGED
data/lib/omniai.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
3
|
+
require "logger"
|
4
|
+
require "event_stream_parser"
|
5
|
+
require "http"
|
6
|
+
require "uri"
|
7
|
+
require "zeitwerk"
|
8
8
|
|
9
9
|
loader = Zeitwerk::Loader.for_gem
|
10
|
-
loader.inflector.inflect
|
11
|
-
loader.inflector.inflect
|
12
|
-
loader.inflector.inflect
|
10
|
+
loader.inflector.inflect "omniai" => "OmniAI"
|
11
|
+
loader.inflector.inflect "url" => "URL"
|
12
|
+
loader.inflector.inflect "cli" => "CLI"
|
13
13
|
loader.setup
|
14
14
|
|
15
15
|
module OmniAI
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Sylvestre
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-01-30 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: event_stream_parser
|
@@ -38,6 +37,20 @@ dependencies:
|
|
38
37
|
- - ">="
|
39
38
|
- !ruby/object:Gem::Version
|
40
39
|
version: '0'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: logger
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
41
54
|
- !ruby/object:Gem::Dependency
|
42
55
|
name: zeitwerk
|
43
56
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,6 +108,7 @@ files:
|
|
95
108
|
- lib/omniai/embed.rb
|
96
109
|
- lib/omniai/embed/response.rb
|
97
110
|
- lib/omniai/embed/usage.rb
|
111
|
+
- lib/omniai/files.rb
|
98
112
|
- lib/omniai/instrumentation.rb
|
99
113
|
- lib/omniai/speak.rb
|
100
114
|
- lib/omniai/tool.rb
|
@@ -112,7 +126,6 @@ metadata:
|
|
112
126
|
homepage_uri: https://github.com/ksylvest/omniai
|
113
127
|
changelog_uri: https://github.com/ksylvest/omniai/releases
|
114
128
|
rubygems_mfa_required: 'true'
|
115
|
-
post_install_message:
|
116
129
|
rdoc_options: []
|
117
130
|
require_paths:
|
118
131
|
- lib
|
@@ -127,8 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
140
|
- !ruby/object:Gem::Version
|
128
141
|
version: '0'
|
129
142
|
requirements: []
|
130
|
-
rubygems_version: 3.
|
131
|
-
signing_key:
|
143
|
+
rubygems_version: 3.6.2
|
132
144
|
specification_version: 4
|
133
145
|
summary: A generalized framework for interacting with many AI services
|
134
146
|
test_files: []
|