chatgpt2023 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fa6c7ff39ad8b06d1908bdeafe1e7e695f2b49fc4a7b5c0f1fc3436bae550ca
4
- data.tar.gz: 507e44dc68538096b23ac3d3cd17e1e6ce3e6ceabdc78469f872731c18a9cd95
3
+ metadata.gz: d76a15a250b67bab6e676ed5c18131cde6310d9c5ace84921e8113c21b4c180f
4
+ data.tar.gz: bbdce3b4c8ba915e55f3b440da3fc368d90ad6a0555ae1ebf8e6065e44061bd3
5
5
  SHA512:
6
- metadata.gz: 28e5169a1d13568bcdbe83c677d125e1a0aa275318f41aabbd8acdee6376f28f0dfda6a56de4604e273d8d3d6fe18883172c556636be5fb726a79223e70a638d
7
- data.tar.gz: 4d1e69b95f4c16c181426926ffde1d9b4d46cc97f59b8478fee5964a0d2bc216ac6f7bd5f5aeb4076154ed2b6e82ebbe083499351e978969a16f7c3905faad2c
6
+ metadata.gz: fb2c05d8493193771ae4480dfa340af843c4c73ae497cc03aa9504c5c9fbb5c30456df7c5c37db26f68bba3419ca41447d4e8436b7aab9b060bcce2160fd6254
7
+ data.tar.gz: b2c4d4292b30a127935de35156cd48b50ae7c5890e2c5cbe0e6e5f37bf56641db73bb136ee6a2a3d88b8227aacc05f8041281347920d0da7a54d2b9f6a899171
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/chatgpt2023.rb CHANGED
@@ -39,15 +39,62 @@ end
39
39
 
40
40
  class ChatGpt2023
41
41
 
42
+ attr_accessor :assistant_recent
43
+
42
44
  def initialize(apikey: nil, attempts: 1, debug: false)
43
45
 
44
46
  @apiurl = "https://api.openai.com/v1"
45
47
 
46
48
  raise 'You must supply an API key!' unless apikey
47
49
  @apikey, @attempts, @debug = apikey, attempts, debug
50
+ @assistant_recent = nil
48
51
 
49
52
  end
50
53
 
54
+
55
+ # CURL example
56
+ # curl https://api.openai.com/v1/chat/completions \
57
+ # -H 'Content-Type: application/json' \
58
+ # -H 'Authorization: Bearer YOUR_API_KEY' \
59
+ # -d '{
60
+ # "model": "gpt-3.5-turbo",
61
+ # "messages": [{"role": "user", "content": "Hello!"}]
62
+ # }'
63
+
64
+ # Ruby example
65
+
66
+ # require 'chatgpt2023'
67
+
68
+ # c = ChatGpt2023.new(apikey: YOUR_API_KEY)
69
+ # r = c.chat 'who is Burt Reynolds?'
70
+ # r2 = c.chat 'what age was he?'
71
+ # r3 = c.chat 'did he have family?'
72
+ #
73
+
74
+ def chat(s, temperature: 1, max_tokens: 3900)
75
+ r = chats(s, temperature: temperature, max_tokens: max_tokens)
76
+ return r if r.is_a?(Hash)
77
+ return {text: r.first[:message][:content].strip}
78
+ end
79
+
80
+ def chats(s=nil, messages: [], temperature: 1, max_tokens: 3900, n: 1)
81
+
82
+ messages << @assistant_recent if @assistant_recent
83
+ messages << {'role' => 'user', 'content' => s } if s
84
+ r = go_chat(messages, temperature: temperature,
85
+ max_tokens: max_tokens, n: n)
86
+
87
+ puts 'chat/completions r: ' + r.inspect if @debug
88
+
89
+ if r[:error] then r
90
+ r
91
+ else
92
+ @assistant_recent = r[:choices].first[:message]
93
+ r[:choices]
94
+ end
95
+
96
+ end
97
+
51
98
  # Example
52
99
  # c = ChatGpt2023.new(apikey: 'yourapikey')
53
100
  # s = '
@@ -56,19 +103,20 @@ class ChatGpt2023
56
103
  # '
57
104
  # r = c.code_completions s, temperature: 0.2
58
105
  # puts r.first[:text]
59
-
106
+ #
60
107
  def code_completions(s, temperature: 1, max_tokens: 32, n: 1)
61
108
 
62
109
  r = go_code(s, temperature: temperature,
63
110
  max_tokens: max_tokens, n: n)
64
111
  puts 'code r: ' + r.inspect if @debug
65
- r[:choices]
112
+ r[:error] ? r : r[:choices]
66
113
 
67
114
  end
68
115
 
69
116
  def code_completion(s, temperature: 1, max_tokens: 32)
70
- code_completions(s, temperature: temperature, max_tokens: max_tokens)\
71
- .first[:text].strip
117
+ r = code_completions(s, temperature: temperature, max_tokens: max_tokens)
118
+ return r if r.is_a?(Hash)
119
+ return {text: r.first[:text].strip}
72
120
  end
73
121
 
74
122
  def completions(s, temperature: 1, max_tokens: 32, n: 1)
@@ -76,17 +124,18 @@ class ChatGpt2023
76
124
  r = go_completions(s, temperature: temperature,
77
125
  max_tokens: max_tokens, n: n)
78
126
  puts 'completions r: ' + r.inspect if @debug
79
- r[:choices]
127
+ r[:error] ? r : r[:choices]
80
128
 
81
129
  end
82
130
 
83
131
  def completion(s, temperature: 1, max_tokens: 32)
84
- completions(s, temperature: temperature, max_tokens: max_tokens)\
85
- .first[:text].strip
132
+ r = completions(s, temperature: temperature, max_tokens: max_tokens)
133
+ return r if r.is_a?(Hash)
134
+ return {text: r.first[:text].strip}
86
135
  end
87
136
 
88
137
  alias complete completion
89
- alias ask completion
138
+ alias ask chat
90
139
 
91
140
  def edits(s, s2)
92
141
  r = go_edits(s, s2)
@@ -109,6 +158,20 @@ class ChatGpt2023
109
158
 
110
159
  private
111
160
 
161
+ def go_chat(messages=[], temperature: 0, max_tokens: 4096, n: 1)
162
+
163
+ h = {
164
+ "model" => 'gpt-3.5-turbo',
165
+ "messages" => messages,
166
+ "temperature" => temperature,
167
+ "max_tokens" => max_tokens,
168
+ "n" => n
169
+ }
170
+
171
+ submit('chat/completions', h)
172
+
173
+ end
174
+
112
175
  def go_code(s, temperature: 0, max_tokens: 7, n: 1)
113
176
 
114
177
  h = {
@@ -209,7 +272,7 @@ class ChatGpt2023
209
272
 
210
273
  end while h.has_key?(:error) and attempts < @attempts
211
274
 
212
- raise ChatGpt2023Error, h[:error][:message].inspect if h.has_key? :error
275
+ #raise ChatGpt2023Error, h[:error][:message].inspect if h.has_key? :error
213
276
 
214
277
  return h
215
278
  end
@@ -222,10 +285,10 @@ class CGRecorder < ChatGpt2023
222
285
 
223
286
  def initialize(apikey: nil, indexfile: 'cgindex.xml',
224
287
  logfile: 'chatgpt.xml', attempts: 1, debug: false)
225
-
288
+
226
289
  super(apikey: apikey, attempts: attempts, debug: debug)
227
290
  @dx = DynarexDaily.new filename: logfile, fields: %i(prompt result),
228
- autosave: true, order: 'descending', debug: false
291
+ autosave: true, order: 'descending', debug: debug
229
292
  @index = Dynarex.new(indexfile, schema: 'entries[title]/entry(prompt, ' \
230
293
  + 'tags)', order: 'descending', autosave: true)
231
294
  title = 'ChatGPT prompt log'
@@ -235,9 +298,8 @@ class CGRecorder < ChatGpt2023
235
298
 
236
299
  def code_completion(s, tags=nil, temperature: 1, max_tokens: 2000)
237
300
 
238
- r = code_completions(s, temperature: temperature, max_tokens: max_tokens)\
239
- .first[:text].strip
240
- log(s, r, tags)
301
+ r = super(s, temperature: temperature, max_tokens: max_tokens)
302
+ log(s, r[:text].strip, tags) unless r[:error]
241
303
 
242
304
  return r
243
305
 
@@ -245,9 +307,9 @@ class CGRecorder < ChatGpt2023
245
307
 
246
308
  def completion(s, tags=nil, temperature: 1, max_tokens: 1000)
247
309
 
248
- r = completions(s, temperature: temperature, max_tokens: max_tokens)\
249
- .first[:text].strip
250
- log(s, r, tags)
310
+ r = super(s, temperature: temperature, max_tokens: max_tokens)
311
+ puts 'CGRecorder inside completion: ' + r.inspect if @debug
312
+ log(s, r[:text].strip, tags) unless r[:error]
251
313
 
252
314
  return r
253
315
 
@@ -269,7 +331,7 @@ end
269
331
  class ChatAway
270
332
 
271
333
  # statement below used for debugging
272
- #attr_reader :dx, :prompts
334
+ attr_reader :dx, :prompts
273
335
 
274
336
  def initialize(questions, apikey: nil, filepath: '/tmp/chatgpt', debug: false)
275
337
 
@@ -278,42 +340,99 @@ class ChatAway
278
340
  FileUtils.mkdir_p filepath
279
341
  idxfile = File.join(filepath, 'index.xml')
280
342
  cgfile = File.join(filepath, 'chatgpt.xml')
281
-
282
- @dx = questions.is_a?(Dynarex) ? questions : Dynarex.new(questions)
283
- @chat = CGRecorder.new(apikey: apikey, indexfile: idxfile, logfile: cgfile, attempts: 5)
343
+
344
+ puts 'questions: ' + questions.inspect if @debug
345
+ @dx = case questions.class.to_s.to_sym
346
+ when :Dynarex
347
+ questions
348
+ when :String
349
+ questions.lines.length < 2 ? Dynarex.new(questions) : import(questions)
350
+ end
351
+
352
+ @chat = CGRecorder.new(apikey: apikey, indexfile: idxfile,
353
+ logfile: cgfile, attempts: 5, debug: @debug)
284
354
  @prompts = @chat.index.all.map(&:prompt)
285
355
 
286
- end
356
+ @mode = nil
357
+
358
+ end
287
359
 
288
- def start()
360
+ def start()
289
361
 
290
- @dx.all.each do |rx|
362
+ @dx.all.map do |rx|
291
363
 
292
- if @prompts.include?(rx.prompt) and rx.redo != 'true'
293
- next
294
- end
295
-
296
- type = rx.type == 'code' ? :code_completion : :completion
364
+ puts 'rx: ' + rx.inspect if @debug
365
+
366
+ #if (@prompts.include?(rx.prompt) and rx.redo != 'true') \
367
+ # or @mode != :import
368
+ # next
369
+ #end
370
+
371
+ type = rx.type == 'code' ? :code_completion : :completion
372
+
373
+ prompt = rx.prompt
374
+
375
+ puts 'prompt: ' + prompt
376
+
377
+ attempts = 0
378
+ reply = nil
379
+
380
+ begin
297
381
 
298
- prompt = rx.prompt
382
+ r = @chat.method(type).call prompt
299
383
 
300
- puts 'prompt: ' + prompt
301
-
302
- attempts = 0
384
+ puts 'r: ' + r.inspect if @debug
303
385
 
304
- begin
305
- r = @chat.method(type).call prompt
306
- rescue
307
- puts 'Something not working! ' + ($!).inspect
386
+ if r[:error] then
387
+
388
+ puts r[:error][:text]
308
389
  sleep 2
309
390
  attempts += 1
310
- retry if attempts < 4
391
+
392
+ redo if attempts < 4
393
+
394
+ else
395
+ reply = r[:text]
311
396
  end
312
397
 
398
+ rescue
399
+
400
+ puts 'Something not working! ' + ($!).inspect
313
401
  sleep 2
402
+ attempts += 1
403
+
404
+ retry if attempts < 4
405
+
406
+ ensure
407
+
408
+ reply ||= ''
409
+
410
+ end
411
+
412
+ sleep 2
413
+
414
+ reply
314
415
 
315
416
  end
316
417
 
317
418
  end
318
419
 
420
+ private
421
+
422
+
423
+ def import(s)
424
+
425
+ @mode = :import
426
+ puts 'inside import' if @debug
427
+
428
+ header = '<?dynarex schema="prompts/entry(prompt, type, redo)" delimiter=" # "?>
429
+ --+
430
+ '
431
+
432
+ s2 = header + s.strip.lines.map {|line| 'p: ' + line }.join("\n")
433
+
434
+ Dynarex.new(s2)
435
+
436
+ end
437
+
319
438
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chatgpt2023
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -36,7 +36,7 @@ cert_chain:
36
36
  6FQD1/GISew7VvxUJdptXeuVNIsdNKxvL3RpfLCuFsi1WXyJ4k3odRMTmS0kAfTy
37
37
  J4sZZW9RNfabTMQQY7DIs3tUAn6i+O0r9lo=
38
38
  -----END CERTIFICATE-----
39
- date: 2023-02-15 00:00:00.000000000 Z
39
+ date: 2023-03-05 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: down
metadata.gz.sig CHANGED
Binary file