datarobot-ai_api 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +3 -0
- data/README.md +12 -0
- data/Rakefile +54 -0
- data/datarobot-ai_api.gemspec +19 -0
- data/lib/datarobot.rb +1 -0
- data/lib/datarobot/ai_api.rb +190 -0
- data/lib/datarobot/ai_api/ai.rb +191 -0
- data/lib/datarobot/ai_api/dataset.rb +99 -0
- data/lib/datarobot/ai_api/deployment.rb +20 -0
- data/lib/datarobot/ai_api/evaluation.rb +21 -0
- data/lib/datarobot/ai_api/learning_session.rb +112 -0
- data/lib/datarobot/ai_api/output.rb +58 -0
- data/lib/datarobot/ai_api/page.rb +50 -0
- data/lib/datarobot/ai_api/prediction.rb +20 -0
- data/lib/datarobot/ai_api/refreshable.rb +20 -0
- data/lib/datarobot/ai_api/task.rb +86 -0
- data/test/cassettes/Datarobot_AiApi/_ping/returns_unauthorized_when_not_authorized.yml +41 -0
- data/test/cassettes/Datarobot_AiApi/_ping/works_when_authorized.yml +58 -0
- data/test/cassettes/Datarobot_AiApi/_ping_me/returns_unauthorized_when_not_authorized.yml +41 -0
- data/test/cassettes/Datarobot_AiApi/_ping_me/works_when_authorized.yml +58 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/404s_if_there_is_no_matching_output.yml +190 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_find/should_accept_a_block.yml +66 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_next_page/can_go_to_the_next_page.yml +132 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_next_page/returns_the_same_page_if_there_is_no_next_page.yml +123 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_previous_page/can_go_to_the_previous_page.yml +262 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_previous_page/returns_the_same_page_if_there_is_no_previous_page.yml +67 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_refresh/can_refresh_to_a_new_object.yml +129 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/_refresh_/can_refresh_its_values.yml +129 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_add_datasets_to_AIs.yml +120 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_add_learning_sessions_to_AIs.yml +120 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_be_trained.yml +4554 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_create_AIs.yml +120 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_delete_AIs.yml +58 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_find_AIs.yml +63 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_get_AI_datasets.yml +131 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_get_AI_outputs.yml +124 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_list_AIs.yml +123 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_authorized/can_predict_things.yml +190 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_not_authorized/can_not_create_AIs.yml +43 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_not_authorized/can_not_find_AIs.yml +43 -0
- data/test/cassettes/Datarobot_AiApi_AI/when_not_authorized/can_not_list_AIs.yml +45 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_find/should_accept_a_block.yml +64 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_next_page/can_go_to_the_next_page.yml +126 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_next_page/returns_the_same_page_if_there_is_no_next_page.yml +113 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_previous_page/can_go_to_the_previous_page.yml +250 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_previous_page/returns_the_same_page_if_there_is_no_previous_page.yml +64 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_refresh/can_refresh_to_a_new_object.yml +125 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/_refresh_/can_refresh_its_values.yml +125 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/can_delete_datasets.yml +58 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/can_find_datasets.yml +61 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/can_import_a_dataset_from_a_file.yml +1077 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/can_import_a_dataset_from_a_url.yml +55 -0
- data/test/cassettes/Datarobot_AiApi_Dataset/when_authorized/can_list_datasets.yml +113 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_find/should_accept_a_block.yml +67 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_next_page/can_go_to_the_next_page.yml +67 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_next_page/returns_the_same_page_if_there_is_no_next_page.yml +100 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_previous_page/can_go_to_the_previous_page.yml +67 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_previous_page/returns_the_same_page_if_there_is_no_previous_page.yml +100 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_refresh/can_refresh_to_a_new_object.yml +131 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/_refresh_/can_refresh_its_values.yml +130 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_create_learning_sessions.yml +2815 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_delete_learning_sessions.yml +58 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_find_learning_sessions.yml +63 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_get_learning_session_deployment_data.yml +123 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_get_learning_session_evaluation_data.yml +67 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_get_learning_session_features.yml +127 -0
- data/test/cassettes/Datarobot_AiApi_LearningSession/when_authorized/can_list_learning_sessions.yml +100 -0
- data/test/cassettes/Datarobot_AiApi_Output/when_authorized/can_create_outputs.yml +60 -0
- data/test/cassettes/Datarobot_AiApi_Output/when_authorized/can_find_named_outputs.yml +123 -0
- data/test/cassettes/Datarobot_AiApi_Output/when_authorized/can_get_features_of_an_output.yml +184 -0
- data/test/cassettes/Datarobot_AiApi_Output/when_authorized/can_get_the_evaluation_of_an_output.yml +131 -0
- data/test/cassettes/Datarobot_AiApi_Output/when_authorized/can_list_outputs.yml +124 -0
- data/test/cassettes/Datarobot_AiApi_Task/when_authorized/_find/should_accept_a_block.yml +63 -0
- data/test/cassettes/Datarobot_AiApi_Task/when_authorized/_refresh/can_refresh_to_a_new_object.yml +124 -0
- data/test/cassettes/Datarobot_AiApi_Task/when_authorized/_refresh_/can_refresh_its_values.yml +125 -0
- data/test/cassettes/Datarobot_AiApi_Task/when_authorized/can_stop_a_task.yml +58 -0
- data/test/cassettes/Datarobot_AiApi_Task/when_authorized/can_wait_until_completed.yml +1138 -0
- data/test/cassettes/Datarobot_AiApi_Task/when_authorized/check_the_status_of_a_task.yml +64 -0
- data/test/data/delete-me.csv +8037 -0
- data/test/data/test.csv +8037 -0
- data/test/datarobot/ai_api/test_ai.rb +133 -0
- data/test/datarobot/ai_api/test_dataset.rb +64 -0
- data/test/datarobot/ai_api/test_learning_session.rb +77 -0
- data/test/datarobot/ai_api/test_output.rb +54 -0
- data/test/datarobot/ai_api/test_page.rb +50 -0
- data/test/datarobot/ai_api/test_prediction.rb +0 -0
- data/test/datarobot/ai_api/test_refreshable.rb +39 -0
- data/test/datarobot/ai_api/test_task.rb +53 -0
- data/test/datarobot/test_ai_api.rb +52 -0
- data/test/test_helper.rb +40 -0
- metadata +217 -0
@@ -0,0 +1,99 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Dataset
|
4
|
+
include Datarobot::AiApi::Refreshable
|
5
|
+
attr_accessor :name
|
6
|
+
attr_reader :task, :created_at, :id, :ai_id
|
7
|
+
|
8
|
+
# Retrieves all datasets as a paginated resource.
|
9
|
+
#
|
10
|
+
# @param [Integer] limit Number of datasets per page
|
11
|
+
# @param [Integer] offset How many datasets to skip before this page
|
12
|
+
#
|
13
|
+
# @return [Datarobot::AiApi::Page(Datarobot::AiApi::Dataset)]
|
14
|
+
def self.all(limit: 50, offset: 0)
|
15
|
+
Datarobot::AiApi.request_endpoint('/aiapi/datasets/', params: {limit: limit, offset: offset}) do |data|
|
16
|
+
Datarobot::AiApi::Page.new(self, data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Retrieves an dataset given an ID.
|
21
|
+
#
|
22
|
+
# @param [String] id The ID of the dataset to retrieve
|
23
|
+
#
|
24
|
+
# @return [Datarobot::AiApi::Dataset]
|
25
|
+
def self.find(id, &block)
|
26
|
+
raise Datarobot::AiApi::NotFoundError, "Cannot find Dataset with id: nil" if id.nil?
|
27
|
+
Datarobot::AiApi.request_endpoint("/aiapi/datasets/#{id}") do |data|
|
28
|
+
if block_given?
|
29
|
+
yield data
|
30
|
+
else
|
31
|
+
self.new(data)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Deletes a dataset. Returns `nil` if the action was successful. Will
|
37
|
+
# raise an error if the action was unsuccessful
|
38
|
+
#
|
39
|
+
# @param [String] id The ID of the dataset to delete
|
40
|
+
#
|
41
|
+
# @return [nil]
|
42
|
+
def self.delete(id)
|
43
|
+
Datarobot::AiApi.request_endpoint("/aiapi/datasets/#{id}", method: "delete")
|
44
|
+
end
|
45
|
+
|
46
|
+
# Creates a dataset from the file at the given (local) path
|
47
|
+
#
|
48
|
+
# @param [String] file_path The path to the file to upload
|
49
|
+
#
|
50
|
+
# @return [Datarobot::AiApi::Dataset]
|
51
|
+
def self.create_from_file(file_path)
|
52
|
+
Datarobot::AiApi.upload_to_endpoint('/aiapi/datasets/fileImports', file_path) do |data|
|
53
|
+
task = Datarobot::AiApi::Task.new(data)
|
54
|
+
task.wait_until_complete
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Creates a dataset from the file at the given (publicly accessible) url
|
59
|
+
#
|
60
|
+
# @param [String] url The url to the file to upload
|
61
|
+
#
|
62
|
+
# @return [Datarobot::AiApi::Dataset]
|
63
|
+
def self.create_from_url(url)
|
64
|
+
uri = URI.parse(url)
|
65
|
+
name = File.basename(uri.path)
|
66
|
+
Datarobot::AiApi.request_endpoint("/aiapi/datasets/urlImports/", method: "post", body: {url: url}) do |data|
|
67
|
+
dataset = new(data)
|
68
|
+
dataset.name = name
|
69
|
+
dataset
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Given a parsed response body from the API, will create a new Dataset object
|
74
|
+
def initialize(options = {})
|
75
|
+
# Suppresses warnings about uninitialized variables
|
76
|
+
@ai_id = nil
|
77
|
+
@name = nil
|
78
|
+
@created_at = nil
|
79
|
+
|
80
|
+
set_from_options(options)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Takes a response body from the API. Will set all Dataset attributes from the
|
84
|
+
# response body
|
85
|
+
#
|
86
|
+
# @param [Hash] options A parsed response body
|
87
|
+
# @return [void]
|
88
|
+
def set_from_options(options = {})
|
89
|
+
# one-liner replacement for `stringify_keys`
|
90
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
91
|
+
|
92
|
+
@created_at = options.dig("createdOn") || @created_at
|
93
|
+
@name = options.dig("datasetName") || options.dig("name") || @name
|
94
|
+
@id = options.dig("id") || options.dig("datasetId") || @id
|
95
|
+
@ai_id = options.dig("aiId") || @ai_id
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Deployment
|
4
|
+
attr_reader :datarobotKey, :deployment_id, :url, :target
|
5
|
+
|
6
|
+
# Takes a response body from the API. Will set all deployment attributes
|
7
|
+
# from the response body
|
8
|
+
#
|
9
|
+
# @param [Hash] options A parsed response body
|
10
|
+
def initialize(options={})
|
11
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
12
|
+
|
13
|
+
@datarobotKey ||= options.dig("datarobot-key")
|
14
|
+
@deploymentId ||= options.dig("deploymentId")
|
15
|
+
@url ||= options.dig("url")
|
16
|
+
@target ||= options.dig("target")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Evaluation
|
4
|
+
attr_reader :summary, :score, :label
|
5
|
+
|
6
|
+
# Takes a response body from the API. Will set all prediction attributes
|
7
|
+
# from the response body
|
8
|
+
#
|
9
|
+
# @param [Hash] options A parsed response body
|
10
|
+
def initialize(options={})
|
11
|
+
# one-liner replacement for `stringify_keys`
|
12
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
13
|
+
|
14
|
+
@summary = options.dig("summary")
|
15
|
+
@score = options.dig("score")
|
16
|
+
@label = options.dig("label")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class LearningSession
|
4
|
+
include Datarobot::AiApi::Refreshable
|
5
|
+
attr_reader :name, :id, :created_at, :dataset_id, :target, :evaluation
|
6
|
+
|
7
|
+
# Retrieves all learning sessions as a paginated resource.
|
8
|
+
#
|
9
|
+
# @param [Integer] limit Number of learning sessions per page
|
10
|
+
# @param [Integer] offset How many learning sessions to skip before this page
|
11
|
+
#
|
12
|
+
# @return [Datarobot::AiApi::Page(Datarobot::AiApi::LearningSession)]
|
13
|
+
def self.all(limit: 50, offset: 0)
|
14
|
+
Datarobot::AiApi.request_endpoint('/aiapi/learningSessions/', params: {limit: limit, offset: offset}) do |data|
|
15
|
+
Datarobot::AiApi::Page.new(self, data)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Retrieves a leanring sessoin given an ID.
|
20
|
+
#
|
21
|
+
# @param [String] id The ID of the learning session to retrieve
|
22
|
+
#
|
23
|
+
# @return [Datarobot::AiApi::LearningSession]
|
24
|
+
def self.find(id, &block)
|
25
|
+
raise Datarobot::AiApi::NotFoundError, "Cannot find LearningSession with id: nil" if id.nil?
|
26
|
+
Datarobot::AiApi.request_endpoint("/aiapi/learningSessions/#{id}") do |data|
|
27
|
+
if block_given?
|
28
|
+
yield data
|
29
|
+
else
|
30
|
+
self.new(data)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Creates a new learning session on the given target for a given dataset
|
36
|
+
#
|
37
|
+
# @param [String] dataset_id The ID of the dataset to learn on
|
38
|
+
# @param [String] target Name of the target feature
|
39
|
+
# @return [Datarobot::AiApi::LearningSession]
|
40
|
+
def self.create(dataset_id:, target:)
|
41
|
+
raise "Need both dataset_id and target" unless dataset_id && target
|
42
|
+
|
43
|
+
name ||= "Learning #{target}"
|
44
|
+
Datarobot::AiApi.request_endpoint('/aiapi/learningSessions/', method: 'post', body: { datasetId: dataset_id, target: target }) do |data|
|
45
|
+
task_data = Datarobot::AiApi.get(data["links"]["result"])
|
46
|
+
task = Datarobot::AiApi::Task.new(task_data)
|
47
|
+
task.wait_until_complete
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Deletes a learning session. Returns `nil` if the action was successful.
|
52
|
+
# Will raise an error if the action was unsuccessful
|
53
|
+
#
|
54
|
+
# @param [String] id The ID of the learning session to delete
|
55
|
+
#
|
56
|
+
# @return [nil]
|
57
|
+
def self.delete(id)
|
58
|
+
Datarobot::AiApi.request_endpoint("/aiapi/learningSessions/#{id}", method: "delete")
|
59
|
+
end
|
60
|
+
|
61
|
+
# Given a parsed response body from the API, will create a new leanring sessoin object
|
62
|
+
def initialize(options = {})
|
63
|
+
# Suppresses warnings about uninitialized variables
|
64
|
+
@id = nil
|
65
|
+
@name = nil
|
66
|
+
@dataset_id = nil
|
67
|
+
@target = nil
|
68
|
+
@created_at = nil
|
69
|
+
|
70
|
+
set_from_options(options)
|
71
|
+
@features = nil
|
72
|
+
@deployment = nil
|
73
|
+
end
|
74
|
+
|
75
|
+
# Takes a response body from the API. Will set all learning session
|
76
|
+
# attributes from the response body
|
77
|
+
#
|
78
|
+
# @param [Hash] options A parsed response body
|
79
|
+
# @return [void]
|
80
|
+
def set_from_options(options = {})
|
81
|
+
# one-liner replacement for `stringify_keys`
|
82
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
83
|
+
|
84
|
+
@name = options.dig("name") || @name
|
85
|
+
@id = options.dig("id") || @id
|
86
|
+
@created_at = options.dig("created") || @created_at
|
87
|
+
@dataset_id = options.dig("datasetId") || @dataset_id
|
88
|
+
@target = options.dig("target") || @target
|
89
|
+
@evaluation = Datarobot::AiApi::Evaluation.new(options.dig("evaluation") || {})
|
90
|
+
end
|
91
|
+
|
92
|
+
# gets all feature metadata for learned features of the associated
|
93
|
+
# dataset
|
94
|
+
#
|
95
|
+
# @return [Array]
|
96
|
+
def features
|
97
|
+
Datarobot::AiApi.request_endpoint("/aiapi/learningSessions/#{id}/features/") do |data|
|
98
|
+
data = data.collect{|k,v| [k.to_s, v]}.to_h
|
99
|
+
@features = data["features"]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Gets the deployment for the learning session
|
104
|
+
# @return Datarobot::AiApi::Deployment
|
105
|
+
def deployment
|
106
|
+
Datarobot::AiApi.request_endpoint("/aiapi/learningSessions/#{id}/deployment") do |data|
|
107
|
+
@deployment = Datarobot::AiApi::Deployment.new(data)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Output
|
4
|
+
attr_accessor :name, :target
|
5
|
+
attr_reader :evaluation, :ai_id, :links, :source
|
6
|
+
|
7
|
+
# Given a parsed response body from the API, will create a new ouptut object
|
8
|
+
def initialize(options = {})
|
9
|
+
set_from_options(options)
|
10
|
+
@features = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
# Takes a response body from the API. Will set all output attributes from the
|
14
|
+
# response body
|
15
|
+
#
|
16
|
+
# @param [Hash] options A parsed response body
|
17
|
+
# @return [void]
|
18
|
+
def set_from_options(options = {})
|
19
|
+
# one-liner replacement for `stringify_keys`
|
20
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
21
|
+
|
22
|
+
@name ||= options.dig("name")
|
23
|
+
@target ||= options.dig("target")
|
24
|
+
@source ||= options.dig("source")
|
25
|
+
@links ||= options.dig("links")
|
26
|
+
@ai_id ||= options.dig("aiId")
|
27
|
+
@evaluation ||= Datarobot::AiApi::Evaluation.new(options.dig("evaluation") || {})
|
28
|
+
end
|
29
|
+
|
30
|
+
# Creates a new output on the given target for a given dataset
|
31
|
+
#
|
32
|
+
# @param [String] ai_id The ID of the AI to associate this output with
|
33
|
+
# @param [String] learning_session_id The ID of the learning session
|
34
|
+
# assocaite this output with
|
35
|
+
# @param [String] output_name The name of the output
|
36
|
+
# @return [Datarobot::AiApi::Output]
|
37
|
+
def self.create(ai_id:, learning_session_id:, output_name:)
|
38
|
+
req_body = {learningSessionId: learning_session_id, outputName: output_name}
|
39
|
+
Datarobot::AiApi.request_endpoint("/aiapi/ais/#{ai_id}/outputs/", method: "put", body: req_body) do |data|
|
40
|
+
output = new(data)
|
41
|
+
output.name = output_name
|
42
|
+
output
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# gets all feature metadata for learned features of the associated
|
47
|
+
# dataset
|
48
|
+
#
|
49
|
+
# @return [Array]
|
50
|
+
def features
|
51
|
+
raise "no ai id" unless @ai_id
|
52
|
+
Datarobot::AiApi.request_endpoint("/aiapi/ais/#{@ai_id}/outputs/#{@name}/features") do |data|
|
53
|
+
@features = data["features"]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Page < Delegator
|
4
|
+
attr_reader :total, :items, :klass, :links
|
5
|
+
|
6
|
+
# Creates a paginated collectoin of objects of type klass. Uses a parsed
|
7
|
+
# response body of paginated data to initialize group of objects
|
8
|
+
def initialize(klass, param_collection)
|
9
|
+
@items = param_collection["data"].map do |params|
|
10
|
+
klass.new(params)
|
11
|
+
end
|
12
|
+
@klass = klass
|
13
|
+
@total = param_collection["total"]
|
14
|
+
if param_collection["links"] # predictions don't have pages
|
15
|
+
@links = param_collection["links"]
|
16
|
+
@next_page = param_collection["links"]["next"]
|
17
|
+
@previous_page = param_collection["links"]["previous"]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Goes to the next page in the dataset if there is one. Otherwise,
|
22
|
+
# returns the current page
|
23
|
+
# @return [Datarobot::AiApi::Page[klass]]
|
24
|
+
def next_page
|
25
|
+
return self if @next_page.nil?
|
26
|
+
|
27
|
+
Datarobot::AiApi.get(@next_page) do |data|
|
28
|
+
self.class.new(@klass, data)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Goes to the prevoius page in the dataset if there is one. Otherwise,
|
33
|
+
# returns the current page
|
34
|
+
# @return [Datarobot::AiApi::Page[klass]]
|
35
|
+
def previous_page
|
36
|
+
return self if @previous_page.nil?
|
37
|
+
|
38
|
+
Datarobot::AiApi.get(@previous_page) do |data|
|
39
|
+
self.class.new(@klass, data)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Allows all Array-like methods to be called on this class. They will be
|
44
|
+
# delegated to @items
|
45
|
+
def __getobj__
|
46
|
+
@items
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Prediction
|
4
|
+
attr_reader :prediction, :row_id, :data
|
5
|
+
|
6
|
+
# Takes a response body from the API. Will set all prediction attributes
|
7
|
+
# from the response body
|
8
|
+
#
|
9
|
+
# @param [Hash] options A parsed response body
|
10
|
+
def initialize(options={})
|
11
|
+
# one-liner replacement for `stringify_keys`
|
12
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
13
|
+
|
14
|
+
@prediction = options.dig("prediction")
|
15
|
+
@row_id = options.dig("rowId")
|
16
|
+
@data = options.dig("data")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Datarobot::AiApi::Refreshable
|
2
|
+
# This was initially written to closely align with the other datarobot clients, but `reload` is much more activerecord-y
|
3
|
+
def refresh!
|
4
|
+
raise "cannot refresh #{self.class} - no method `find'" unless self.class.respond_to? :find
|
5
|
+
raise "cannot refresh #{self.class} - no method `set_from_options'" unless respond_to? :set_from_options
|
6
|
+
raise "cannot refresh #{self.class} - object does not have an id" unless @id
|
7
|
+
self.class.find(@id) do |data|
|
8
|
+
set_from_options(data)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def refresh
|
13
|
+
raise "cannot refresh #{self.class} - no method `find'" unless self.class.respond_to? :find
|
14
|
+
raise "cannot refresh #{self.class} - object does not have an id" unless @id
|
15
|
+
self.class.find(@id)
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :reload!, :refresh!
|
19
|
+
alias_method :reload, :refresh
|
20
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Datarobot
|
2
|
+
module AiApi
|
3
|
+
class Task
|
4
|
+
include Datarobot::AiApi::Refreshable
|
5
|
+
|
6
|
+
attr_reader :id, :code, :status_type, :status_id, :created_at,
|
7
|
+
:description, :message, :status, :links
|
8
|
+
|
9
|
+
# Given a parsed response body from the API, will create a new leanring sessoin object
|
10
|
+
def initialize(options = {})
|
11
|
+
# Suppresses warnings about uninitialized variables
|
12
|
+
@code = nil
|
13
|
+
@status = nil
|
14
|
+
@status_type = nil
|
15
|
+
@status_id = nil
|
16
|
+
@id = nil
|
17
|
+
@created_at = nil
|
18
|
+
@description = nil
|
19
|
+
@message = nil
|
20
|
+
@links = nil
|
21
|
+
|
22
|
+
set_from_options(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Takes a response body from the API. Will set all task attributes from
|
26
|
+
# the response body
|
27
|
+
#
|
28
|
+
# @param [Hash] options A parsed response body
|
29
|
+
# @return [void]
|
30
|
+
def set_from_options(options = {})
|
31
|
+
# one-liner replacement for `stringify_keys`
|
32
|
+
options = options.collect{|k,v| [k.to_s, v]}.to_h
|
33
|
+
|
34
|
+
@code = options.dig("code") || @code
|
35
|
+
@status = options.dig("status") || @status
|
36
|
+
@status_type = options.dig("statusType") || @status_type
|
37
|
+
@status_id = options.dig("statusId") || @status_id
|
38
|
+
@id = options.dig("statusId") || @id
|
39
|
+
@created_at = options.dig("created") || @created_at
|
40
|
+
@description = options.dig("description") || @description
|
41
|
+
@message = options.dig("message") || @message
|
42
|
+
@links = options.dig("links") || @links
|
43
|
+
end
|
44
|
+
|
45
|
+
# Finds a task by id
|
46
|
+
#
|
47
|
+
# @param [String] id The id of the task to find
|
48
|
+
# @return [Datarobot::AiApi::Task]
|
49
|
+
def self.find(id, &block)
|
50
|
+
raise Datarobot::AiApi::NotFoundError, "Cannot find Task with id: nil" if id.nil?
|
51
|
+
Datarobot::AiApi.request_endpoint("/aiapi/status/#{id}") do |data|
|
52
|
+
if block_given?
|
53
|
+
yield data
|
54
|
+
else
|
55
|
+
self.new(data)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Stops a task by id
|
61
|
+
#
|
62
|
+
# @param [String] id The id of the task to stop
|
63
|
+
# @return [Datarobot::AiApi::Task]
|
64
|
+
def self.stop(id)
|
65
|
+
Datarobot::AiApi.request_endpoint("/aiapi/status/#{id}", method: "delete")
|
66
|
+
end
|
67
|
+
|
68
|
+
# Waits for a task to complete and returns the resulting object.
|
69
|
+
#
|
70
|
+
# @return [Datarobot::AiApi::*]
|
71
|
+
def wait_until_complete
|
72
|
+
refreshed = self
|
73
|
+
until refreshed.status == 'COMPLETED'
|
74
|
+
sleep 1 unless ENV['FAST_TEST_RESPONSE'] == 'true'
|
75
|
+
refreshed = Datarobot::AiApi::Task.find(@id)
|
76
|
+
end
|
77
|
+
|
78
|
+
result = refreshed.links["result"]
|
79
|
+
Datarobot::AiApi.get(result) do |data|
|
80
|
+
klass = Datarobot::AiApi.determine_object(result)
|
81
|
+
klass.new(data)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|