asimov-openai-module 0.0.0 → 0.1.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/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
|