gpt-function 0.3.0 → 0.4.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/Gemfile.lock +1 -1
- data/README.md +73 -6
- data/lib/gpt-function.rb +4 -1
- data/lib/gpt_function/batch.rb +59 -11
- data/lib/gpt_function/file.rb +0 -1
- data/lib/gpt_function/simple_queue.rb +18 -0
- data/lib/gpt_function/storage.rb +20 -0
- data/lib/gpt_function/version.rb +1 -1
- metadata +4 -3
- data/lib/gpt/function.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cdeb301d12f6247b694accec4654d4d65bab0ca071cb4bf7ae73631bf540bc56
|
4
|
+
data.tar.gz: dd5cb067931ac6411a545641b96f40ef81d929bd1d388cfe93808d5c76b6e2ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 665474c59064f7ae3401b0fea4e8ca562cfa2e91ff285523bbcdff9b367480f2d137b619b15d30c396df92a07c506bd73ed121bd8c54292d301785957486aa37
|
7
|
+
data.tar.gz: f1072362a33e579c4f52eda7b8abbadc3970807eaca91c5aa39010ca130c3e935a9ee5194b207a8c4de8b11c2079a68bbc3675d63ddeb74d811f9c2de7c33aac
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -27,27 +27,94 @@ gem 'gpt-function'
|
|
27
27
|
require 'gpt-function'
|
28
28
|
|
29
29
|
# 你需要設定你的 api key 和 model name
|
30
|
-
|
30
|
+
GptFunction.configure(api_key: '...', model: 'gpt-4o-mini', batch_storage: MyBatchStorage)
|
31
31
|
|
32
32
|
# 使用內建的翻譯方法
|
33
|
-
p
|
33
|
+
p GptFunctions.翻譯成中文.call("banana") # "香蕉"
|
34
34
|
|
35
35
|
# 使用內建的擷取關鍵字方法
|
36
|
-
p
|
36
|
+
p GptFunctions.擷取關鍵字.call("臺北市政府推動綠色交通計劃,鼓勵民眾使用公共運輸和自行車") # ["臺北市政府", "綠色交通計劃", "民眾", "公共運輸", "自行車"]
|
37
37
|
|
38
38
|
# 你也可以自己定義方法
|
39
|
-
def 擷取關鍵字
|
39
|
+
def 擷取關鍵字
|
40
40
|
# 創建一個簡單的 GPT 函數,你需要描述這個函數的功能,以及提供一些範例
|
41
|
-
|
41
|
+
GptFunction.new("Extract all keywords",
|
42
42
|
[
|
43
43
|
[
|
44
44
|
"臺灣最新5G網路覆蓋率達95%,推動智慧城市發展,領先亞洲多國",
|
45
45
|
["臺灣", "5G網路", "覆蓋率", "智慧城市", "亞洲"]
|
46
46
|
]
|
47
|
-
])
|
47
|
+
])
|
48
48
|
end
|
49
49
|
```
|
50
50
|
|
51
|
+
Batch Storage 是一個用來儲存 GPT 函數的結果的類別,你可以自己定義一個類似的類別,並且在 `GptFunction.configure` 中設定。
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
class MyBatchStorage
|
55
|
+
def initialize
|
56
|
+
@queue = []
|
57
|
+
end
|
58
|
+
|
59
|
+
def enqueue(value)
|
60
|
+
@queue << value
|
61
|
+
true
|
62
|
+
end
|
63
|
+
|
64
|
+
def dequeue
|
65
|
+
@queue.shift
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
GptFunction.configure(api_key: '...', model: 'gpt-4o-mini', batch_storage: MyBatchStorage)
|
70
|
+
```
|
71
|
+
|
72
|
+
你可以用 Batch.create 建立一個新的 Batch, 在 create 成功時,會自動將 Batch 存入 BatchStorage 中。
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
request1 = GptFunctions.翻譯成中文.to_request_body("apple")
|
76
|
+
request2 = GptFunctions.翻譯成中文.to_request_body("tesla")
|
77
|
+
batch = GptFunction::Batch.create([request1, request2])
|
78
|
+
```
|
79
|
+
|
80
|
+
你可以用 Batch.process 來處理 Batch,如果 Batch 的 status 在 "failed", "completed", "expired", "cancelled" 當中,Batch 會被從 queue 中移除,如果是其他狀態,Batch 會自動重新加入 queue 中,你只需要定期持續呼叫 process 就可以。
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
GptFunction::Batch.process do |batch|
|
84
|
+
puts "batch id: #{batch.id}, status: #{batch.status}, progress: #{batch.request_counts_completed}/#{batch.request_counts_total}"
|
85
|
+
batch.pairs.each do |input, output|
|
86
|
+
puts "input: #{input}, output: #{output}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
```
|
90
|
+
|
91
|
+
可以用 count 參數來限制每次處理的數量,預設值為 1。
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
GptFunction::Batch.process(count: 2) do |batch|
|
95
|
+
...
|
96
|
+
end
|
97
|
+
```
|
98
|
+
|
99
|
+
Batch Storage 整合 Active Record 的範例:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
class Model < ApplicationRecord
|
103
|
+
class << self
|
104
|
+
def enqueue(hash)
|
105
|
+
create!(hash)
|
106
|
+
true
|
107
|
+
end
|
108
|
+
|
109
|
+
def dequeue
|
110
|
+
first&.destroy
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
GptFunction.configure(api_key: '...', model: 'gpt-4o-mini', batch_storage: Model)
|
116
|
+
```
|
117
|
+
|
51
118
|
## License
|
52
119
|
|
53
120
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/gpt-function.rb
CHANGED
@@ -5,6 +5,8 @@ require "json"
|
|
5
5
|
|
6
6
|
require_relative "gpt_function/version"
|
7
7
|
require_relative "gpt_function/file"
|
8
|
+
require_relative "gpt_function/storage"
|
9
|
+
require_relative "gpt_function/simple_queue"
|
8
10
|
require_relative "gpt_function/batch"
|
9
11
|
require_relative "gpt_functions"
|
10
12
|
|
@@ -17,9 +19,10 @@ class GptFunction
|
|
17
19
|
class << self
|
18
20
|
attr_accessor :api_key, :model
|
19
21
|
|
20
|
-
def configure(api_key:, model:)
|
22
|
+
def configure(api_key:, model:, batch_storage: GptFunction::SimpleQueue.new)
|
21
23
|
@api_key = api_key
|
22
24
|
@model = model
|
25
|
+
GptFunction::Storage.batch_storage = batch_storage
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
data/lib/gpt_function/batch.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
# lib/gpt_function/batch.rb
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
require "net/http"
|
5
4
|
require "json"
|
6
|
-
require "byebug"
|
7
5
|
|
8
6
|
class GptFunction
|
9
7
|
class Batch
|
@@ -98,19 +96,21 @@ class GptFunction
|
|
98
96
|
end
|
99
97
|
|
100
98
|
def input_file
|
99
|
+
return nil if input_file_id.nil?
|
101
100
|
@input_file ||= File.from_id(input_file_id)
|
102
101
|
end
|
103
102
|
|
104
103
|
def output_file
|
104
|
+
return nil if output_file_id.nil?
|
105
105
|
@output_file ||= File.from_id(output_file_id)
|
106
106
|
end
|
107
107
|
|
108
108
|
def input_jsonl
|
109
|
-
@input_jsonl ||= input_file
|
109
|
+
@input_jsonl ||= input_file&.jsonl || []
|
110
110
|
end
|
111
111
|
|
112
112
|
def output_jsonl
|
113
|
-
@output_jsonl ||= output_file
|
113
|
+
@output_jsonl ||= output_file&.jsonl || []
|
114
114
|
end
|
115
115
|
|
116
116
|
def inputs
|
@@ -135,14 +135,16 @@ class GptFunction
|
|
135
135
|
|
136
136
|
def pairs
|
137
137
|
hash = {}
|
138
|
-
|
139
|
-
hash[input["custom_id"]] = {
|
140
|
-
"input" => input["content"],
|
141
|
-
}
|
142
|
-
end
|
138
|
+
|
143
139
|
outputs.each do |output|
|
144
|
-
hash[output["custom_id"]]
|
140
|
+
hash[output["custom_id"]] = [nil ,output["content"]]
|
145
141
|
end
|
142
|
+
|
143
|
+
inputs.each do |input|
|
144
|
+
next if hash[input["custom_id"]].nil?
|
145
|
+
hash[input["custom_id"]][0] = input["content"]
|
146
|
+
end
|
147
|
+
|
146
148
|
hash.values
|
147
149
|
end
|
148
150
|
|
@@ -150,6 +152,24 @@ class GptFunction
|
|
150
152
|
Batch.cancel(id)
|
151
153
|
end
|
152
154
|
|
155
|
+
def enqueue
|
156
|
+
return false if GptFunction::Storage.batch_storage.nil?
|
157
|
+
|
158
|
+
GptFunction::Storage.batch_storage.enqueue(self.to_hash)
|
159
|
+
end
|
160
|
+
|
161
|
+
# validating the input file is being validated before the batch can begin
|
162
|
+
# failed the input file has failed the validation process
|
163
|
+
# in_progress the input file was successfully validated and the batch is currently being run
|
164
|
+
# finalizing the batch has completed and the results are being prepared
|
165
|
+
# completed the batch has been completed and the results are ready
|
166
|
+
# expired the batch was not able to be completed within the 24-hour time window
|
167
|
+
# cancelling the batch is being cancelled (may take up to 10 minutes)
|
168
|
+
# cancelled the batch was cancelled
|
169
|
+
def is_processed
|
170
|
+
["failed", "completed", "expired", "cancelled"].include? status
|
171
|
+
end
|
172
|
+
|
153
173
|
class << self
|
154
174
|
def list(limit: 20, after: nil)
|
155
175
|
# 創建批次請求
|
@@ -199,7 +219,9 @@ class GptFunction
|
|
199
219
|
raise "Batch creation failed: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
|
200
220
|
|
201
221
|
hash = JSON.parse(response.body)
|
202
|
-
Batch.new(hash)
|
222
|
+
batch = Batch.new(hash)
|
223
|
+
batch.enqueue
|
224
|
+
batch
|
203
225
|
rescue => e
|
204
226
|
file&.delete
|
205
227
|
raise e
|
@@ -245,6 +267,32 @@ class GptFunction
|
|
245
267
|
response.body
|
246
268
|
end
|
247
269
|
|
270
|
+
def dequeue
|
271
|
+
hash = GptFunction::Storage.batch_storage&.dequeue
|
272
|
+
id = hash&.dig("id") || hash&.dig(:id)
|
273
|
+
from_id(id) if id
|
274
|
+
end
|
275
|
+
|
276
|
+
# 進行批次請求處理
|
277
|
+
# count: 處理批次請求的數量
|
278
|
+
# block: 處理批次請求的 block
|
279
|
+
# 返回值: 是否還有批次請求需要處理
|
280
|
+
def process(count: 1, &block)
|
281
|
+
# 從 Storage 取出 count 個批次請求
|
282
|
+
count.times do
|
283
|
+
batch = dequeue
|
284
|
+
|
285
|
+
# 如果沒有批次請求,則跳出迴圈
|
286
|
+
return false if batch.nil?
|
287
|
+
|
288
|
+
yield batch
|
289
|
+
|
290
|
+
# 如果 batch 還未處理完成,將批次請求重新加入 Storage
|
291
|
+
batch.enqueue unless batch.is_processed
|
292
|
+
end
|
293
|
+
|
294
|
+
true
|
295
|
+
end
|
248
296
|
end
|
249
297
|
end
|
250
298
|
end
|
data/lib/gpt_function/file.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class GptFunction
|
4
|
+
module Storage
|
5
|
+
class << self
|
6
|
+
def batch_storage=(value)
|
7
|
+
# 檢查 value 有實作 enqueue 方法
|
8
|
+
raise "Invalid batch storage: should respond to #enqueue" unless value.respond_to?(:enqueue)
|
9
|
+
|
10
|
+
# 檢查 value 有實作 dequeue 方法
|
11
|
+
raise "Invalid batch storage: should respond to #dequeue" unless value.respond_to?(:dequeue)
|
12
|
+
@batch_storage = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def batch_storage
|
16
|
+
@batch_storage
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/gpt_function/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gpt-function
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- etrex kuo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dotenv
|
@@ -41,9 +41,10 @@ files:
|
|
41
41
|
- Rakefile
|
42
42
|
- gpt-function.gemspec
|
43
43
|
- lib/gpt-function.rb
|
44
|
-
- lib/gpt/function.rb
|
45
44
|
- lib/gpt_function/batch.rb
|
46
45
|
- lib/gpt_function/file.rb
|
46
|
+
- lib/gpt_function/simple_queue.rb
|
47
|
+
- lib/gpt_function/storage.rb
|
47
48
|
- lib/gpt_function/version.rb
|
48
49
|
- lib/gpt_functions.rb
|
49
50
|
- workflows/main.yml
|