asimov-openai-module 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +2 -0
- data/README.md +34 -0
- data/VERSION +1 -1
- data/bin/asimov-openai-prompter +88 -0
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16074fac10acec8384d4e663e1dfd5222489516daf586c2cd9f589618f8d1533
|
4
|
+
data.tar.gz: 28556b39e6b2b441e09d8cfa647b60907b2469180031bf6da2456b145a39eb53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cbdb1f157186fce6e138078f79034fe03706c28eb8de8aeae0aa82c3a1c7e1a16d19b789940940b94055f0e126dc85d9ced73f1a02de52d68a070f46dd5ebfe
|
7
|
+
data.tar.gz: 8c99e3b72b3ea8b443469c25543fe5cb2f4264212e3abb986db29b5a5c0a9cb6fac6489dcf8a6757669ae5108289d8e0415c77776525a01e9788c131e140c77f
|
data/CHANGES.md
CHANGED
@@ -5,4 +5,6 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## 0.1.0 - 2025-02-19
|
9
|
+
|
8
10
|
## 0.0.0 - 2025-02-16
|
data/README.md
CHANGED
@@ -5,3 +5,37 @@
|
|
5
5
|
[](https://rubygems.org/gems/asimov-openai-module)
|
6
6
|
|
7
7
|
🚧 _We are building in public. This is presently under heavy construction._
|
8
|
+
|
9
|
+
## 🛠️ Prerequisites
|
10
|
+
|
11
|
+
- [Ruby](https://ruby-lang.org) 3.2+
|
12
|
+
|
13
|
+
## ⬇️ Installation
|
14
|
+
|
15
|
+
### Installation via RubyGems
|
16
|
+
|
17
|
+
```bash
|
18
|
+
gem install asimov-openai-module --pre
|
19
|
+
```
|
20
|
+
|
21
|
+
## ⚙️ Configuration
|
22
|
+
|
23
|
+
https://platform.openai.com/docs/quickstart
|
24
|
+
|
25
|
+
```bash
|
26
|
+
export OPENAI_API_KEY="sk-proj-..."
|
27
|
+
```
|
28
|
+
|
29
|
+
## 👨💻 Development
|
30
|
+
|
31
|
+
```bash
|
32
|
+
git clone https://github.com/asimov-modules/asimov-openai-module.git
|
33
|
+
```
|
34
|
+
|
35
|
+
- - -
|
36
|
+
|
37
|
+
[](https://x.com/intent/post?url=https://github.com/asimov-modules/asimov-openai-module&text=ASIMOV%20OpenAI%20Module)
|
38
|
+
[](https://reddit.com/submit?url=https://github.com/asimov-modules/asimov-openai-module&title=ASIMOV%20OpenAI%20Module)
|
39
|
+
[](https://news.ycombinator.com/submitlink?u=https://github.com/asimov-modules/asimov-openai-module&t=ASIMOV%20OpenAI%20Module)
|
40
|
+
[](https://www.facebook.com/sharer/sharer.php?u=https://github.com/asimov-modules/asimov-openai-module)
|
41
|
+
[](https://www.linkedin.com/sharing/share-offsite/?url=https://github.com/asimov-modules/asimov-openai-module)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.1.0
|
data/bin/asimov-openai-prompter
CHANGED
@@ -1,2 +1,90 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require "bundler/setup"
|
3
|
+
|
4
|
+
require "asimov/construct"
|
5
|
+
require "asimov/module"
|
6
|
+
require "mini_mime"
|
7
|
+
require "omniai/openai"
|
8
|
+
require "optparse"
|
9
|
+
|
10
|
+
trap(:SIGINT) { abort "" }
|
11
|
+
|
12
|
+
ARGV0 = File.basename($0).freeze
|
13
|
+
|
14
|
+
options = {
|
15
|
+
model: OmniAI::OpenAI::Chat::DEFAULT_MODEL,
|
16
|
+
}
|
17
|
+
|
18
|
+
option_parser = OptionParser.new do |parser|
|
19
|
+
parser.banner = "Usage: #{ARGV0} [OPTIONS] CONSTRUCT PROMPT INPUTS...\n\nOptions:"
|
20
|
+
parser.on("-d", "--debug", "Enable debugging output") do
|
21
|
+
options[:debug] = true
|
22
|
+
end
|
23
|
+
parser.on("-m", "--model=ID", "Override the model [default: #{options[:model]}]") do |model_id|
|
24
|
+
options[:model] = model_id
|
25
|
+
end
|
26
|
+
parser.on("-o", "--output=FILE", "Write to file instead of stdout") do |output_path|
|
27
|
+
options[:output] = output_path
|
28
|
+
end
|
29
|
+
parser.on("-v", "--verbose", "Enable verbose output") do
|
30
|
+
options[:verbose] = true
|
31
|
+
end
|
32
|
+
parser.on("-V", "--version", "Print version information") do
|
33
|
+
File.read(File.expand_path("../VERSION", __dir__)).strip.tap do |version|
|
34
|
+
puts "#{ARGV0} #{version}"; exit
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
begin
|
40
|
+
option_parser.parse!(ARGV)
|
41
|
+
rescue OptionParser::InvalidOption => error
|
42
|
+
abort "#{ARGV0}: invalid option: `#{error.args.join(' ')}`"
|
43
|
+
end
|
44
|
+
|
45
|
+
api_key = ENV["OPENAI_API_KEY"]
|
46
|
+
abort "#{ARGV0}: missing OPENAI_API_KEY" if api_key.to_s.empty?
|
47
|
+
|
48
|
+
construct_id = ARGV.shift
|
49
|
+
abort "#{ARGV0}: missing construct ID" unless construct_id
|
50
|
+
|
51
|
+
construct = ASIMOV::Construct.open(construct_id)
|
52
|
+
abort "#{ARGV0}: unknown construct ID" unless construct
|
53
|
+
|
54
|
+
prompt_text = case ARGV.first
|
55
|
+
when nil then abort "#{ARGV0}: missing prompt"
|
56
|
+
when "-", "@/dev/stdin" then ARGV.shift; $stdin.read
|
57
|
+
when /^@/ then begin
|
58
|
+
File.read(ARGV.shift[1..])
|
59
|
+
rescue => error
|
60
|
+
abort "#{ARGV0}: invalid `@file` prompt: #{error.message}"
|
61
|
+
end
|
62
|
+
else ARGV.shift
|
63
|
+
end
|
64
|
+
|
65
|
+
prompt = OmniAI::Chat::Prompt.build do |prompt|
|
66
|
+
prompt.system(construct.system_prompt)
|
67
|
+
prompt.user do |message|
|
68
|
+
message.text(prompt_text)
|
69
|
+
ARGV.each do |input|
|
70
|
+
case input
|
71
|
+
when /^https?:\/\// then message.url(input) # TODO: content type
|
72
|
+
when /^@/ then message.file(input[1..], MiniMime.lookup_by_filename(input[1..])&.content_type)
|
73
|
+
else message.file(input, MiniMime.lookup_by_filename(input)&.content_type)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
client = OmniAI::OpenAI::Client.new(api_key:)
|
80
|
+
model = options[:model]
|
81
|
+
stream = case options[:output]
|
82
|
+
when nil, "-", "/dev/stdout" then $stdout
|
83
|
+
else begin
|
84
|
+
File.open(options[:output], "w")
|
85
|
+
rescue => error
|
86
|
+
abort "#{ARGV0}: invalid `--output` file: #{error.message}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
OmniAI::OpenAI::Chat.new(prompt, client:, model:, stream:).process!
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asimov-openai-module
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ASIMOV Protocol
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-02-
|
10
|
+
date: 2025-02-19 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: rake
|
@@ -23,6 +23,20 @@ dependencies:
|
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
25
|
version: '13'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: asimov-construct
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 25.0.0.dev
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 25.0.0.dev
|
26
40
|
- !ruby/object:Gem::Dependency
|
27
41
|
name: asimov-module
|
28
42
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,6 +51,20 @@ dependencies:
|
|
37
51
|
- - ">="
|
38
52
|
- !ruby/object:Gem::Version
|
39
53
|
version: 25.0.0.dev
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: mini_mime
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.1'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.1'
|
40
68
|
- !ruby/object:Gem::Dependency
|
41
69
|
name: omniai
|
42
70
|
requirement: !ruby/object:Gem::Requirement
|