luogu 0.1.6 → 0.1.7
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.lock +3 -1
- data/README.md +8 -4
- data/lib/luogu/chatgpt.rb +12 -5
- data/lib/luogu/cli.rb +74 -44
- data/lib/luogu/init.rb +2 -1
- data/lib/luogu/version.rb +1 -1
- data/luogu.gemspec +1 -0
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc5e0c2faef39054b2d1b084393c5af185fa52660a46b552af6fe26def302c8b
|
4
|
+
data.tar.gz: d20f25098e3fe03226375d3a0471acdbbd207523db7b101c431007b82cc49fa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d493d41fd71f846549921c4ee5d2ac9aa5d398f8c07010dd0d0ca4ae5b33a9c30d2625325161cf0eb4427e9297b9b103783dadef2e08d321e63aa6b0f1255cb
|
7
|
+
data.tar.gz: 44c77c4a4a4be4f2eaaef0bada464279c26c3bb90c9a56017211ae1c6f656299d521328b4235a53dd28db0706c8e7fc6616b1cea1429f6e54442aab3b0e031e1
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
luogu (0.1.
|
4
|
+
luogu (0.1.6)
|
5
5
|
dotenv (~> 2.8, >= 2.8.1)
|
6
|
+
dry-cli (~> 1.0)
|
6
7
|
ruby-openai (~> 3.7)
|
7
8
|
tty-prompt (~> 0.23.1)
|
8
9
|
|
@@ -10,6 +11,7 @@ GEM
|
|
10
11
|
remote: https://rubygems.org/
|
11
12
|
specs:
|
12
13
|
dotenv (2.8.1)
|
14
|
+
dry-cli (1.0.0)
|
13
15
|
httparty (0.21.0)
|
14
16
|
mini_mime (>= 1.0.0)
|
15
17
|
multi_xml (>= 0.5.2)
|
data/README.md
CHANGED
@@ -10,10 +10,14 @@
|
|
10
10
|
- 如果需要在终端显示markdown,需要 [glow](https://github.com/charmbracelet/glow)
|
11
11
|
|
12
12
|
### 使用
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
```Bash
|
14
|
+
Commands:
|
15
|
+
luogu build PROMPT_FILE [TARGET_FILE] # 编译 Prompt.md 成能够提交给 ChatGPT API 的 messages. 默认输出为 <同文件名>.json
|
16
|
+
luogu generate JSON_FILE [PROMPT_FILE] # 根据 ChatGPT messages JSON 来生成 Prompt.md
|
17
|
+
luogu run PROMPT_FILE # 编译 Prompt.md 成能够提交给 ChatGPT API 的 messages. 默认输出为 <同文件名>.json
|
18
|
+
luogu test [PROMPT_FILE] [TEST_FILE] # 测试 Prompt 文件
|
19
|
+
luogu version # 打印版本
|
20
|
+
```
|
17
21
|
|
18
22
|
你可以在项目目录的.env中设置下面的环境变量,或者直接系统设置
|
19
23
|
```
|
data/lib/luogu/chatgpt.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
module Luogu
|
2
2
|
class ChatGPT
|
3
|
-
def initialize(file)
|
3
|
+
def initialize(file, history_path='.')
|
4
4
|
@temperature = ENV.fetch('OPENAI_TEMPERATURE', '0.7').to_f
|
5
5
|
@limit_history = ENV.fetch('OPENAI_LIMIT_HISTORY', '6').to_i * 2
|
6
6
|
|
7
|
+
@history_path = history_path
|
8
|
+
@prompt_file = file
|
9
|
+
|
7
10
|
@prompt = PromptParser.new(file)
|
8
11
|
@row_history = []
|
9
12
|
@history = HistoryQueue.new @limit_history
|
@@ -70,8 +73,9 @@ module Luogu
|
|
70
73
|
# 根据用户输入执行相应的操作
|
71
74
|
case input
|
72
75
|
when "save"
|
73
|
-
|
74
|
-
self.class.save @
|
76
|
+
file_name = File.basename(@prompt_file, ".*")
|
77
|
+
self.class.save @row_history, File.join(@history_path, "#{file_name}.row_history.md")
|
78
|
+
self.class.save @history.to_a, File.join(@history_path, "#{file_name}.history.md")
|
75
79
|
when "row history"
|
76
80
|
p @row_history
|
77
81
|
when "history"
|
@@ -91,8 +95,10 @@ module Luogu
|
|
91
95
|
self.puts self.chat(message)
|
92
96
|
end
|
93
97
|
now = Time.now.to_i
|
94
|
-
|
95
|
-
|
98
|
+
file_name = File.basename(@prompt_file, ".*")
|
99
|
+
|
100
|
+
self.class.save @row_history, File.join(@history_path, "#{file_name}-#{now}.row_history.md")
|
101
|
+
self.class.save @history.to_a, File.join(@history_path, "#{file_name}-#{now}.history.md")
|
96
102
|
end
|
97
103
|
|
98
104
|
class << self
|
@@ -105,6 +111,7 @@ module Luogu
|
|
105
111
|
text += item[:content]
|
106
112
|
text += "\n\n"
|
107
113
|
end
|
114
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
108
115
|
File.open(file_path, 'w') do |f|
|
109
116
|
f.write(text)
|
110
117
|
end
|
data/lib/luogu/cli.rb
CHANGED
@@ -1,58 +1,88 @@
|
|
1
1
|
module Luogu
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
luogu build <file> -> 编译prompt
|
13
|
-
luogu run <file> -> 测试 prompt
|
14
|
-
luogu gen <file> <target> -> 根据 json 生成 prompt 文件
|
15
|
-
luogu test <file> <test_file.yml> -> 根据 yaml 来对 prompt 进行测试
|
16
|
-
"""
|
17
|
-
exit
|
2
|
+
module CLI
|
3
|
+
module Commands
|
4
|
+
extend Dry::CLI::Registry
|
5
|
+
|
6
|
+
class Version < Dry::CLI::Command
|
7
|
+
desc "打印版本"
|
8
|
+
|
9
|
+
def call(*)
|
10
|
+
puts Luogu::VERSION
|
11
|
+
end
|
18
12
|
end
|
19
13
|
|
20
|
-
|
14
|
+
class Build < Dry::CLI::Command
|
15
|
+
|
16
|
+
desc "编译 Prompt.md 成能够提交给 ChatGPT API 的 messages. 默认输出为 <同文件名>.json"
|
17
|
+
argument :prompt_file, type: :string, required: true, deec: "Prompt文件, 使用markdown书写"
|
18
|
+
argument :target_file, type: :string, required: false, deec: "输出 JSON 文件"
|
19
|
+
|
20
|
+
def call(prompt_file: nil, target_file: nil, **)
|
21
|
+
target_file ||= prompt_file.sub(File.extname(prompt_file), ".json")
|
22
|
+
data = PromptParser.new(prompt_file).to_json
|
23
|
+
File.open(target_file, 'w') do |f|
|
24
|
+
f.write(data)
|
25
|
+
end
|
26
|
+
end
|
21
27
|
|
22
|
-
|
23
|
-
subcommands['build'] = Proc.new do |args|
|
24
|
-
data = PromptParser.new(args.first).to_json
|
25
|
-
target_path = args[1] || "./prompt.json"
|
26
|
-
File.open(target_path, 'w') do |f|
|
27
|
-
f.write(data)
|
28
28
|
end
|
29
|
-
end
|
30
29
|
|
31
|
-
|
32
|
-
chatgpt = ChatGPT.new(args.first)
|
33
|
-
chatgpt.run
|
34
|
-
end
|
30
|
+
class Run < Dry::CLI::Command
|
35
31
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
32
|
+
desc "编译 Prompt.md 成能够提交给 ChatGPT API 的 messages. 默认输出为 <同文件名>.json"
|
33
|
+
argument :prompt_file, type: :string, required: true, desc: "Prompt文件, 使用markdown书写"
|
34
|
+
option :out, type: :string, default: ".", desc: "保存历史时存放的目录,默认为当前目录"
|
40
35
|
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
def call(prompt_file: nil, **options)
|
37
|
+
chatgpt = ChatGPT.new(prompt_file, options.fetch(:out))
|
38
|
+
chatgpt.run
|
39
|
+
end
|
44
40
|
|
45
|
-
|
41
|
+
end
|
46
42
|
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
class Generate < Dry::CLI::Command
|
44
|
+
|
45
|
+
desc "根据 ChatGPT messages JSON 来生成 Prompt.md"
|
46
|
+
argument :json_file, type: :string, required: true, deec: "ChatGPT 生成的 messages json 文件"
|
47
|
+
argument :prompt_file, type: :string, required: false, deec: "要输出的Prompt文件路径, 默认生成 <同名>.md"
|
48
|
+
|
49
|
+
def call(json_file: nil, prompt_file: nil, **)
|
50
|
+
json = JSON.parse(File.read(json_file), symbolize_names: true)
|
51
|
+
prompt_file ||= json_file.sub(File.extname(json_file), ".md")
|
52
|
+
|
53
|
+
chatgpt = ChatGPT.save(json, prompt_file)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
class Test < Dry::CLI::Command
|
59
|
+
|
60
|
+
desc "测试 Prompt 文件"
|
61
|
+
argument :prompt_file, type: :string, require: true, desc: "输出 Prompt 文件"
|
62
|
+
argument :test_file, type: :string, require: false, desc: "测试文件, 使用 YAML 文件, 一个字符串数组。默认为 同名.test.yml"
|
63
|
+
option :out, type: :string, default: ".", desc: "保存测试历史时存放的目录,默认为当前目录"
|
64
|
+
|
65
|
+
def call(prompt_file: nil, test_file:nil, **options)
|
66
|
+
test_file ||= prompt_file.sub(File.extname(prompt_file), ".test.yml")
|
67
|
+
|
68
|
+
chatgpt = ChatGPT.new(prompt_file, options.fetch(:out))
|
69
|
+
messages = YAML.load_file(test_file)
|
70
|
+
chatgpt.playload messages
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
register "version", Version, aliases: ["v", "-v", "--version"]
|
76
|
+
register "build", Build, aliases: ["b"]
|
77
|
+
register "run", Run, aliases: ["r"]
|
78
|
+
register "generate", Generate, aliases: ["g"]
|
79
|
+
register "test", Test, aliases: ["t"]
|
50
80
|
|
51
|
-
if subcommands.key?(ARGV.first)
|
52
|
-
subcommands[ARGV.first].call(ARGV[1..-1])
|
53
|
-
else
|
54
|
-
puts "Invalid command. Use -h or --help for usage information."
|
55
81
|
end
|
82
|
+
end
|
56
83
|
|
84
|
+
module_function
|
85
|
+
def cli
|
86
|
+
Dry::CLI.new(Luogu::CLI::Commands).call
|
57
87
|
end
|
58
|
-
end
|
88
|
+
end
|
data/lib/luogu/init.rb
CHANGED
data/lib/luogu/version.rb
CHANGED
data/luogu.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_dependency 'ruby-openai', '~> 3.7'
|
36
36
|
spec.add_dependency 'dotenv', '~> 2.8', '>= 2.8.1'
|
37
37
|
spec.add_dependency 'tty-prompt', '~> 0.23.1'
|
38
|
+
spec.add_dependency 'dry-cli', '~> 1.0'
|
38
39
|
|
39
40
|
# For more information and examples about making a new gem, check out our
|
40
41
|
# guide at: https://bundler.io/guides/creating_gem.html
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: luogu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MJ
|
@@ -58,6 +58,20 @@ dependencies:
|
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 0.23.1
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: dry-cli
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.0'
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '1.0'
|
61
75
|
description: 使用markdown来快速实现 Prompt工程研发
|
62
76
|
email:
|
63
77
|
- tywf91@gmail.com
|