omniai-openai 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![CircleCI](https://circleci.com/gh/ksylvest/omniai-openai.svg?style=svg)](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
|