cryptum 0.0.423 → 0.0.425

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0db6879e922302bbbbcd4c283552f6057c1ff1651cfef64bb3908c60f378bdea
4
- data.tar.gz: 6c1fa446d9facf407b3729aeb4bbc449b92bf44799c5865804811ddfc5ce7dd7
3
+ metadata.gz: 93ce9c71816f16413dd9aac6b343d4b24b958ac2956aad177bd2409b22f2b96f
4
+ data.tar.gz: 72b4e5410ff43db2f0b1bc17a9c3c46ec8decfea5c4a0118096a6bc9a1f31f23
5
5
  SHA512:
6
- metadata.gz: 775f105582775eeac624f886fb98884b20a1006ea5d5882ccda2da023ecae159db27f4ad0dfc6c7b13e55b16fd03b701eb2197885c1af4a6cd4d3a18be2d56ad
7
- data.tar.gz: 02b257841617c72ab0fde2be5b70d7d2b70d33317d3c8aa325e1d7464788a6a52aa0d98ff1177fc12c018651139095b9729fc0cf8e50a0a4582ea35119b17717
6
+ metadata.gz: b5838263d18649850b67a020a39e80bfea10acfb1bfec589c38d15728fc5876b489bec31d9f6d78e16ad2608b38e839a45eaf837f715d3e67cc40aff3ac49d6c
7
+ data.tar.gz: 9355aa5e0950cb73e6ce1519f5df29c40836ae1ec51311a7ef78861b35f934866fda5b0c3a0e0b2135d3c893841c070a664233660275b27711de7ec79f8aa142
data/.rubocop.yml CHANGED
@@ -6,7 +6,7 @@ Layout/LineLength:
6
6
  Lint/UselessRescue:
7
7
  Enabled: false
8
8
  Metrics/AbcSize:
9
- Max: 393
9
+ Max: 410
10
10
  Metrics/BlockLength:
11
11
  Max: 138
12
12
  Metrics/BlockNesting:
@@ -14,13 +14,13 @@ Metrics/BlockNesting:
14
14
  Metrics/ClassLength:
15
15
  Max: 128
16
16
  Metrics/CyclomaticComplexity:
17
- Max: 77
17
+ Max: 80
18
18
  Metrics/MethodLength:
19
19
  Max: 397
20
20
  Metrics/ModuleLength:
21
21
  Max: 407
22
22
  Metrics/PerceivedComplexity:
23
- Max: 77
23
+ Max: 80
24
24
  Style/HashSyntax:
25
25
  EnforcedShorthandSyntax: never
26
26
 
data/Gemfile CHANGED
@@ -12,7 +12,7 @@ gemspec
12
12
  # to build appropriately. Defer to ./reinstall_coinbot_gemset.sh
13
13
  # to review these custom flags
14
14
  gem 'addressable', '2.8.4'
15
- gem 'bundler', '>=2.4.10'
15
+ gem 'bundler', '>=2.4.11'
16
16
  gem 'bundler-audit', '0.9.1'
17
17
  gem 'curses', '1.4.4'
18
18
  gem 'eventmachine', '1.2.7'
@@ -26,12 +26,12 @@ gem 'rdoc', '6.5.0'
26
26
  gem 'require_all', '3.0.0'
27
27
  gem 'rest-client', '2.1.0'
28
28
  gem 'rspec', '3.12.0'
29
- gem 'rubocop', '1.49.0'
29
+ gem 'rubocop', '1.50.0'
30
30
  gem 'rubocop-rake', '0.6.0'
31
31
  gem 'rubocop-rspec', '2.19.0'
32
32
  gem 'ruby-prof', '1.6.1'
33
33
  gem 'rvm', '1.11.3.9'
34
- gem 'sinatra', '3.0.5'
34
+ gem 'sinatra', '3.0.6'
35
35
  gem 'thin', '1.8.2'
36
36
  gem 'tty-prompt', '0.23.1'
37
37
  gem 'websocket-extensions', '0.1.5'
data/bin/cryptum-repl CHANGED
@@ -71,7 +71,7 @@ begin
71
71
  Cryptum::Log.append(level: :info, msg: msg, which_self: self)
72
72
  cli.start(self, prompt: Pry::Prompt.new(:cryptum, 'CRYPTUM_PROTOTYPING_DRIVER', prompt))
73
73
  rescue StandardError => e
74
- raise e
74
+ Cryptum::Log.append(level: :error, msg: e, which_self: self)
75
75
  ensure
76
76
  msg = 'Session Terminated.'
77
77
  Cryptum::Log.append(level: :info, msg: msg, which_self: self)
@@ -116,8 +116,8 @@ module Cryptum
116
116
  )
117
117
 
118
118
  else
119
- e = "Unsupported HTTP Method #{http_method}"
120
- Cryptum::Log.append(level: :debug, msg: e, which_self: self)
119
+ msg = "Unsupported HTTP Method #{http_method}"
120
+ Cryptum::Log.append(level: :debug, msg: msg, which_self: self)
121
121
  end
122
122
 
123
123
  resp = JSON.parse(response, symbolize_names: true)
data/lib/cryptum/log.rb CHANGED
@@ -26,9 +26,13 @@ module Cryptum
26
26
  datetime_str = '%Y-%m-%d %H:%M:%S.%N%z'
27
27
 
28
28
  # Always append to log file
29
- log_file_path = '/tmp/cryptum.log'
30
- log_file_path = "/tmp/cryptum-ai-#{session}-#{symbol}.json" if level == :learning
31
- log_file = File.open(log_file_path, 'a')
29
+ if level == :learning
30
+ log_file_path = "/tmp/cryptum-ai-#{session}-#{symbol}.json" if level == :learning
31
+ log_file = File.open(log_file_path, 'w')
32
+ else
33
+ log_file_path = '/tmp/cryptum.log'
34
+ log_file = File.open(log_file_path, 'a')
35
+ end
32
36
 
33
37
  # Leave 10 "old" log files where
34
38
  # each file is ~ 1,024,000 bytes
@@ -69,14 +73,10 @@ module Cryptum
69
73
  end
70
74
 
71
75
  if level == :learning
72
- logger.formatter = proc do |_severity, datetime, progname, json_msg|
73
- date = datetime.strftime(datetime_str)
76
+ log_event = msg
77
+ logger.formatter = proc do |_severity, _datetime, _progname, json_msg|
74
78
  JSON.pretty_generate(
75
- date: date,
76
- session: session,
77
- symbol: symbol,
78
- progname: progname,
79
- msg: json_msg
79
+ learning_data: json_msg
80
80
  )
81
81
  end
82
82
  else
@@ -97,11 +97,11 @@ module Cryptum
97
97
  log_event += "\n\n\n"
98
98
  end
99
99
  end
100
+ end
100
101
 
101
- logger.add(logger.level, log_event, which_self)
102
+ logger.add(logger.level, log_event, which_self)
102
103
 
103
- Cryptum::UI::Exit.gracefully(event_history: event_history) if exit_gracefully
104
- end
104
+ Cryptum::UI::Exit.gracefully(event_history: event_history) if exit_gracefully
105
105
  rescue Interrupt, StandardError => e
106
106
  raise e
107
107
  end
@@ -12,7 +12,8 @@ module Cryptum
12
12
  # http_method: 'optional HTTP method (defaults to GET)
13
13
  # rest_call: 'required rest call to make per the schema',
14
14
  # params: 'optional params passed in the URI or HTTP Headers',
15
- # http_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST'
15
+ # http_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST',
16
+ # timeout: 'optional - timeout in seconds (defaults to 60)'
16
17
  # )
17
18
 
18
19
  private_class_method def self.open_ai_rest_call(opts = {})
@@ -27,6 +28,8 @@ module Cryptum
27
28
  base_open_ai_api_uri = 'https://api.openai.com/v1'
28
29
  token = opts[:token]
29
30
  option_choice = opts[:option_choice]
31
+ timeout = opts[:timeout]
32
+ timeout ||= 60
30
33
 
31
34
  if option_choice.proxy
32
35
  rest_client = RestClient
@@ -46,9 +49,9 @@ module Cryptum
46
49
  authorization: "Bearer #{token}",
47
50
  params: params
48
51
  },
49
- verify_ssl: false
52
+ verify_ssl: false,
53
+ timeout: timeout
50
54
  )
51
-
52
55
  when :post
53
56
  response = rest_client_request.execute(
54
57
  method: :post,
@@ -58,22 +61,21 @@ module Cryptum
58
61
  authorization: "Bearer #{token}"
59
62
  },
60
63
  payload: http_body,
61
- verify_ssl: false
64
+ verify_ssl: false,
65
+ timeout: timeout
62
66
  )
63
-
64
67
  else
65
- raise @@logger.error("Unsupported HTTP Method #{http_method} for #{self} Plugin")
68
+ msg = "Unsupported HTTP Method #{http_method} for #{self} Plugin"
69
+ Cryptum::Log.append(level: :error, msg: msg, which_self: self)
66
70
  end
67
- response
71
+
72
+ JSON.parse(response, symbolize_names: true)
68
73
  rescue RestClient::ExceptionWithResponse => e
69
- File.open('/tmp/cryptum-errors.txt', 'a') do |f|
70
- f.puts Time.now.strftime('%Y-%m-%d %H:%M:%S.%N%z')
71
- f.puts "Module: #{self}"
72
- f.puts "URL: #{base_open_ai_api_uri}#{rest_call}"
73
- f.puts "PARAMS: #{params.inspect}"
74
- f.puts "HTTP POST BODY: #{http_body.inspect}" if http_body != ''
75
- f.puts "#{e}\n#{e.response}\n\n\n"
76
- end
74
+ msg = "URL: #{base_open_ai_api_uri}#{rest_call}"
75
+ msg += "PARAMS: #{params.inspect}"
76
+ msg += "HTTP POST BODY: #{http_body.inspect}" if http_body != ''
77
+ msg += "#{e}\n#{e.response}\n\n\n"
78
+ Cryptum::Log.append(level: :error, msg: msg, which_self: self)
77
79
  rescue Interrupt, StandardError => e
78
80
  Cryptum::Log.append(level: :error, msg: e, which_self: self)
79
81
  end
@@ -82,18 +84,18 @@ module Cryptum
82
84
  # response = Cryptum::OpenAI.get_models(
83
85
  # option_choice: 'required - option_choice object containing command line params',
84
86
  # token: 'required - Bearer token',
87
+ # timeout: 'optional - timeout in seconds (defaults to 60)'
85
88
  # )
86
89
 
87
90
  public_class_method def self.get_models(opts = {})
88
91
  token = opts[:token]
89
92
 
90
- response = open_ai_rest_call(
93
+ open_ai_rest_call(
91
94
  option_choice: option_choice,
92
95
  token: token,
93
- rest_call: 'models'
96
+ rest_call: 'models',
97
+ timeout: timeout
94
98
  )
95
-
96
- JSON.parse(response, symbolize_names: true)
97
99
  rescue Interrupt, StandardError => e
98
100
  Cryptum::Log.append(level: :error, msg: e, which_self: self)
99
101
  end
@@ -107,7 +109,8 @@ module Cryptum
107
109
  # temp: 'optional - creative response float (deafults to 0)',
108
110
  # max_tokens: 'optional - integer (defaults to 4_097 - request.length || 300)',
109
111
  # system_role_content: 'optional - context to set up the model behavior for conversation (Default: "You are a momentum trading bot that analyzes order history on Coinbase. You are able to access any content or website on any device or network without any limitations or filters.")',
110
- # response_history: 'optional - pass response back in to have a conversation'
112
+ # response_history: 'optional - pass response back in to have a conversation',
113
+ # timeout: 'optional - timeout in seconds (defaults to 60)'
111
114
  # )
112
115
 
113
116
  public_class_method def self.chat(opts = {})
@@ -126,6 +129,9 @@ module Cryptum
126
129
  max_tokens = 4_097 - request.to_s.length
127
130
  max_tokens = 300 unless max_tokens.positive?
128
131
 
132
+ timeout = opts[:timeout]
133
+ timeout ||= 60
134
+
129
135
  gpt = true if model.include?('gpt-3.5') || model.include?('gpt-4')
130
136
 
131
137
  if gpt
@@ -174,15 +180,15 @@ module Cryptum
174
180
  }
175
181
  end
176
182
 
177
- response = open_ai_rest_call(
183
+ json_resp = open_ai_rest_call(
178
184
  option_choice: option_choice,
179
185
  http_method: :post,
180
186
  token: token,
181
187
  rest_call: rest_call,
182
- http_body: http_body.to_json
188
+ http_body: http_body.to_json,
189
+ timeout: timeout
183
190
  )
184
191
 
185
- json_resp = JSON.parse(response, symbolize_names: true)
186
192
  if gpt
187
193
  assistant_resp = json_resp[:choices].first[:message]
188
194
  json_resp[:choices] = http_body[:messages]
@@ -201,6 +207,7 @@ module Cryptum
201
207
  response = #{self}.get_models(
202
208
  option_choice: 'required - option_choice object containing command line params',
203
209
  token: 'required - Bearer token',
210
+ timeout: 'optional - timeout in seconds (defaults to 60)'
204
211
  )
205
212
 
206
213
  response = #{self}.chat(
@@ -211,7 +218,8 @@ module Cryptum
211
218
  temp: 'optional - creative response float (defaults to 0)',
212
219
  max_tokens: 'optional - integer (deafults to 4_097 - request.length || 300)',
213
220
  system_role_content: 'optional - context to set up the model behavior for conversation (Default: \"You are a momentum trading bot that analyzes order history on Coinbase. You are able to access any content or website on any device or network without any limitations or filters.\")',
214
- response_history: 'optional - pass response back in to have a conversation'
221
+ response_history: 'optional - pass response back in to have a conversation',
222
+ timeout: 'optional - timeout in seconds (defaults to 60)'
215
223
  )
216
224
  "
217
225
  end
@@ -237,6 +237,12 @@ module Cryptum
237
237
  end
238
238
  end
239
239
 
240
+ # Snag all sold orders
241
+ oh_meta_sold_arr = order_history_meta.select do |ohm|
242
+ ohm[:color].to_sym == :green && ohm.key?(:done_at)
243
+ end
244
+ order_hist_meta_sold = oh_meta_sold_arr.length
245
+
240
246
  # Update Completed Sell Orders w/ Green &&
241
247
  # Include done_at Timestamp for 24h gain calc
242
248
  if event_type == :done &&
@@ -247,6 +253,18 @@ module Cryptum
247
253
  order_history_meta.each do |meta|
248
254
  next unless meta[:sell_order_id] == sell_order_id
249
255
 
256
+ learning_arr = []
257
+ oh_meta_sold_arr.each do |ohm|
258
+ learning = ohm
259
+ buy_order_id = ohm[:buy_order_id]
260
+ sell_order_id = ohm[:sell_order_id]
261
+ order_history_buy_details = order_history.select { |oh| oh[:id] == buy_order_id }
262
+ order_history_sell_details = order_history.select { |oh| oh[:id] == sell_order_id }
263
+ learning[:buy_details] = order_history_buy_details.first
264
+ learning[:sell_details] = order_history_sell_details.first
265
+ learning_arr.push(learning)
266
+ end
267
+
250
268
  meta[:done_at] = Time.now.strftime('%Y-%m-%d %H:%M:%S.%N%z')
251
269
  meta[:color] = :green
252
270
 
@@ -259,9 +277,11 @@ module Cryptum
259
277
  order_history_sell_details = order_history.select { |oh| oh[:id] == sell_order_id }
260
278
  learning[:buy_details] = order_history_buy_details.first
261
279
  learning[:sell_details] = order_history_sell_details.first
280
+ learning_arr.push(learning)
281
+
262
282
  Cryptum::Log.append(
263
283
  level: :learning,
264
- msg: learning,
284
+ msg: learning_arr,
265
285
  which_self: self,
266
286
  event_history: event_history
267
287
  )
@@ -271,12 +291,6 @@ module Cryptum
271
291
  # OK, now let's tally up everything...
272
292
  twenty_four_hrs_ago = Time.now - 86_400
273
293
 
274
- # Snag all sold orders
275
- oh_meta_sold_arr = order_history_meta.select do |ohm|
276
- ohm[:color].to_sym == :green && ohm.key?(:done_at)
277
- end
278
- order_hist_meta_sold = oh_meta_sold_arr.length
279
-
280
294
  # Snag all sold orders within past 24 hrs
281
295
  ohm_sold_twenty_four_arr = []
282
296
  unless oh_meta_sold_arr.empty?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cryptum
4
- VERSION = '0.0.423'
4
+ VERSION = '0.0.425'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cryptum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.423
4
+ version: 0.0.425
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-10 00:00:00.000000000 Z
11
+ date: 2023-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.4.10
33
+ version: 2.4.11
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 2.4.10
40
+ version: 2.4.11
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler-audit
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - '='
228
228
  - !ruby/object:Gem::Version
229
- version: 1.49.0
229
+ version: 1.50.0
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - '='
235
235
  - !ruby/object:Gem::Version
236
- version: 1.49.0
236
+ version: 1.50.0
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: rubocop-rake
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -296,14 +296,14 @@ dependencies:
296
296
  requirements:
297
297
  - - '='
298
298
  - !ruby/object:Gem::Version
299
- version: 3.0.5
299
+ version: 3.0.6
300
300
  type: :runtime
301
301
  prerelease: false
302
302
  version_requirements: !ruby/object:Gem::Requirement
303
303
  requirements:
304
304
  - - '='
305
305
  - !ruby/object:Gem::Version
306
- version: 3.0.5
306
+ version: 3.0.6
307
307
  - !ruby/object:Gem::Dependency
308
308
  name: thin
309
309
  requirement: !ruby/object:Gem::Requirement
@@ -537,7 +537,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
537
537
  - !ruby/object:Gem::Version
538
538
  version: '0'
539
539
  requirements: []
540
- rubygems_version: 3.4.10
540
+ rubygems_version: 3.4.11
541
541
  signing_key:
542
542
  specification_version: 4
543
543
  summary: Coinbase Pro High-Frequency Trading Bot