omniai-openai 1.1.0 → 1.2.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 +4 -4
- data/README.md +69 -7
- data/lib/omniai/openai/client.rb +21 -0
- data/lib/omniai/openai/config.rb +2 -1
- data/lib/omniai/openai/speak.rb +37 -0
- data/lib/omniai/openai/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01d9c9144c74769c3eed7d8ec37f4cab63885057d5f16b02727e8c26e94414a0
|
4
|
+
data.tar.gz: 98e56e503c8ba01d3822d448dab53c94fef16d08c3f7896884e381f0b10b54fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 652b78a11ffb57f7b884d39fd08222fd4a87a0105a32ec0304d7d09efde5988b7f6058d3fbed46b6b3b8e8d44fec5191ffe925804f953456502020ea9cc8ef6f
|
7
|
+
data.tar.gz: 41c3516078e9a9411eebea6a0eaf3424b6a756d8b714697e51817e02f7faa9c4f170dc38c2fadb21c325a7576c5ae615468e3fb5d1438014532ae1be4c43d37b
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# OmniAI::OpenAI
|
2
2
|
|
3
|
+
[](https://circleci.com/gh/ksylvest/omniai-openai)
|
4
|
+
|
3
5
|
An OpenAI implementation of the [OmniAI](https://github.com/ksylvest/omniai) APIs.
|
4
6
|
|
5
7
|
## Installation
|
@@ -43,12 +45,12 @@ end
|
|
43
45
|
A chat completion is generated by passing in prompts using any a variety of formats:
|
44
46
|
|
45
47
|
```ruby
|
46
|
-
completion = client.chat
|
48
|
+
completion = client.chat('Tell me a joke!')
|
47
49
|
completion.choice.message.content # 'Why did the chicken cross the road? To get to the other side.'
|
48
50
|
```
|
49
51
|
|
50
52
|
```ruby
|
51
|
-
completion = client.chat
|
53
|
+
completion = client.chat({
|
52
54
|
role: OmniAI::Chat::Role::USER,
|
53
55
|
content: 'Is it wise to jump off a bridge?'
|
54
56
|
})
|
@@ -56,7 +58,7 @@ completion.choice.message.content # 'No.'
|
|
56
58
|
```
|
57
59
|
|
58
60
|
```ruby
|
59
|
-
completion = client.chat
|
61
|
+
completion = client.chat([
|
60
62
|
{
|
61
63
|
role: OmniAI::Chat::Role::SYSTEM,
|
62
64
|
content: 'You are a helpful assistant.'
|
@@ -71,7 +73,7 @@ completion.choice.message.content # 'The capital of Canada is Ottawa.'
|
|
71
73
|
`model` takes an optional string (default is `gtp-4o`):
|
72
74
|
|
73
75
|
```ruby
|
74
|
-
completion = client.chat
|
76
|
+
completion = client.chat('How fast is a cheetah?', model: OmniAI::OpenAI::Chat::Model::GPT_3_5_TURBO)
|
75
77
|
completion.choice.message.content # 'A cheetah can reach speeds over 100 km/h.'
|
76
78
|
```
|
77
79
|
|
@@ -82,7 +84,7 @@ completion.choice.message.content # 'A cheetah can reach speeds over 100 km/h.'
|
|
82
84
|
`temperature` takes an optional float between `0.0` and `2.0` (defaults is `0.7`):
|
83
85
|
|
84
86
|
```ruby
|
85
|
-
completion = client.chat
|
87
|
+
completion = client.chat('Pick a number between 1 and 5', temperature: 2.0)
|
86
88
|
completion.choice.message.content # '3'
|
87
89
|
```
|
88
90
|
|
@@ -96,7 +98,7 @@ completion.choice.message.content # '3'
|
|
96
98
|
stream = proc do |chunk|
|
97
99
|
print(chunk.choice.delta.content) # 'Better', 'three', 'hours', ...
|
98
100
|
end
|
99
|
-
client.chat
|
101
|
+
client.chat('Be poetic.', stream:)
|
100
102
|
```
|
101
103
|
|
102
104
|
[OpenAI API Reference `stream`](https://platform.openai.com/docs/api-reference/chat/create#chat-create-stream)
|
@@ -106,7 +108,7 @@ client.chat.completion('Be poetic.', stream:)
|
|
106
108
|
`format` takes an optional symbol (`:json`) and that setes the `response_format` to `json_object`:
|
107
109
|
|
108
110
|
```ruby
|
109
|
-
completion = client.chat
|
111
|
+
completion = client.chat([
|
110
112
|
{ role: OmniAI::Chat::Role::SYSTEM, content: OmniAI::Chat::JSON_PROMPT },
|
111
113
|
{ role: OmniAI::Chat::Role::USER, content: 'What is the name of the drummer for the Beatles?' }
|
112
114
|
], format: :json)
|
@@ -169,3 +171,63 @@ transcription.text
|
|
169
171
|
```
|
170
172
|
|
171
173
|
[OpenAI API Reference `temperature`](https://platform.openai.com/docs/api-reference/audio/createTranscription#audio-createtranscription-temperature)
|
174
|
+
|
175
|
+
### Speak
|
176
|
+
|
177
|
+
Speech can be generated by passing text with a block:
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
File.open('example.ogg', 'wb') do |file|
|
181
|
+
client.speak('How can a clam cram in a clean cream can?') do |chunk|
|
182
|
+
file << chunk
|
183
|
+
end
|
184
|
+
end
|
185
|
+
```
|
186
|
+
|
187
|
+
If a block is not provided then a tempfile is returned:
|
188
|
+
|
189
|
+
```ruby
|
190
|
+
tempfile = client.speak('Can you can a can as a canner can can a can?')
|
191
|
+
tempfile.close
|
192
|
+
tempfile.unlink
|
193
|
+
```
|
194
|
+
|
195
|
+
#### Voice
|
196
|
+
|
197
|
+
`voice` is optional and must be one of the supported voices:
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
client.speak('She sells seashells by the seashore.', voice: OmniAI::OpenAI::Speak::Voice::SHIMMER)
|
201
|
+
```
|
202
|
+
|
203
|
+
[OpenAI API Reference `voice`](https://platform.openai.com/docs/api-reference/audio/createSpeech#audio-createspeech-voice)
|
204
|
+
|
205
|
+
#### Model
|
206
|
+
|
207
|
+
`model` is optional and must be either `tts-1` or `tts-1-hd` (default):
|
208
|
+
|
209
|
+
```ruby
|
210
|
+
client.speak('I saw a kitten eating chicken in the kitchen.', format: OmniAI::OpenAI::Speak::Model::TTS_1)
|
211
|
+
```
|
212
|
+
|
213
|
+
[OpenAI API Refernce `model`](https://platform.openai.com/docs/api-reference/audio/createSpeech#audio-createspeech-model)
|
214
|
+
|
215
|
+
#### Speed
|
216
|
+
|
217
|
+
`speed` is optional and must be between 0.25 and 0.40:
|
218
|
+
|
219
|
+
```ruby
|
220
|
+
client.speak('How much wood would a woodchuck chuck if a woodchuck could chuck wood?', speed: 4.0)
|
221
|
+
```
|
222
|
+
|
223
|
+
[OmniAI API Reference `speed`](https://platform.openai.com/docs/api-reference/audio/createSpeech#audio-createspeech-speed)
|
224
|
+
|
225
|
+
#### Format
|
226
|
+
|
227
|
+
`format` is optional and supports `MP3` (default), `OPUS`, `AAC`, `FLAC`, `WAV` or `PCM`:
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
client.speak('A pessemistic pest exists amidst us.', format: OmniAI::OpenAI::Speak::Format::FLAC)
|
231
|
+
```
|
232
|
+
|
233
|
+
[OpenAI API Reference `format`](https://platform.openai.com/docs/api-reference/audio/createSpeech#audio-createspeech-response_format)
|
data/lib/omniai/openai/client.rb
CHANGED
@@ -78,6 +78,27 @@ module OmniAI
|
|
78
78
|
def transcribe(path, model: Transcribe::Model::WHISPER, language: nil, prompt: nil, temperature: nil, format: nil)
|
79
79
|
Transcribe.process!(path, model:, language:, prompt:, temperature:, format:, client: self)
|
80
80
|
end
|
81
|
+
|
82
|
+
# @raise [OmniAI::Error]
|
83
|
+
#
|
84
|
+
# @param input [String] required
|
85
|
+
# @param model [String] optional
|
86
|
+
# @param voice [String] optional
|
87
|
+
# @param speed [Float] optional
|
88
|
+
# @param format [String] optional (default "aac"):
|
89
|
+
# - "aac"
|
90
|
+
# - "mp3"
|
91
|
+
# - "flac"
|
92
|
+
# - "opus"
|
93
|
+
# - "pcm"
|
94
|
+
# - "wav"
|
95
|
+
#
|
96
|
+
# @yield [output] optional
|
97
|
+
#
|
98
|
+
# @return [Tempfile``]
|
99
|
+
def speak(input, model: Speak::Model::TTS_1_HD, voice: Speak::Voice::ALLOY, speed: nil, format: nil, &)
|
100
|
+
Speak.process!(input, model:, voice:, speed:, format:, client: self, &)
|
101
|
+
end
|
81
102
|
end
|
82
103
|
end
|
83
104
|
end
|
data/lib/omniai/openai/config.rb
CHANGED
@@ -4,7 +4,7 @@ module OmniAI
|
|
4
4
|
module OpenAI
|
5
5
|
# Configuration for managing the OpenAI `api_key` / `organization` / `project` / `logger`.
|
6
6
|
class Config < OmniAI::Config
|
7
|
-
attr_accessor :organization, :project, :chat_options, :transcribe_options
|
7
|
+
attr_accessor :organization, :project, :chat_options, :transcribe_options, :speak_options
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
super
|
@@ -14,6 +14,7 @@ module OmniAI
|
|
14
14
|
@host = ENV.fetch('OPENAI_HOST', 'https://api.openai.com')
|
15
15
|
@chat_options = {}
|
16
16
|
@transcribe_options = {}
|
17
|
+
@speak_options = {}
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OmniAI
|
4
|
+
module OpenAI
|
5
|
+
# An OpenAI transcribe implementation.
|
6
|
+
class Speak < OmniAI::Speak
|
7
|
+
module Model
|
8
|
+
TTS_1 = 'tts-1'
|
9
|
+
TTS_1_HD = 'tts-1-hd'
|
10
|
+
end
|
11
|
+
|
12
|
+
module Voice
|
13
|
+
ALLOY = 'alloy' # https://platform.openai.com/docs/guides/text-to-speech/alloy
|
14
|
+
ECHO = 'echo' # https://platform.openai.com/docs/guides/text-to-speech/echo
|
15
|
+
FABLE = 'fable' # https://platform.openai.com/docs/guides/text-to-speech/fable
|
16
|
+
NOVA = 'nova' # https://platform.openai.com/docs/guides/text-to-speech/nova
|
17
|
+
ONYX = 'onyx' # https://platform.openai.com/docs/guides/text-to-speech/onyx
|
18
|
+
SHIMMER = 'shimmer' # https://platform.openai.com/docs/guides/text-to-speech/shimmer
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
# @return [Hash]
|
24
|
+
def payload
|
25
|
+
OmniAI::OpenAI
|
26
|
+
.config.speak_options
|
27
|
+
.merge(super)
|
28
|
+
.merge({ response_format: @format }.compact)
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [String]
|
32
|
+
def path
|
33
|
+
"/#{OmniAI::OpenAI::Client::VERSION}/audio/speech"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniai-openai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Sylvestre
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: event_stream_parser
|
@@ -65,10 +65,12 @@ files:
|
|
65
65
|
- lib/omniai/openai/chat.rb
|
66
66
|
- lib/omniai/openai/client.rb
|
67
67
|
- lib/omniai/openai/config.rb
|
68
|
+
- lib/omniai/openai/speak.rb
|
68
69
|
- lib/omniai/openai/transcribe.rb
|
69
70
|
- lib/omniai/openai/version.rb
|
70
71
|
homepage: https://github.com/ksylvest/omniai-openai
|
71
|
-
licenses:
|
72
|
+
licenses:
|
73
|
+
- MIT
|
72
74
|
metadata:
|
73
75
|
homepage_uri: https://github.com/ksylvest/omniai-openai
|
74
76
|
changelog_uri: https://github.com/ksylvest/omniai-openai/releases
|