binding-Ruby/gym_client.rb (117 lines of code) (raw):

require 'rest-client' require 'json' OPENAI_GYM_API_KEY = 'YOUR_API_KEY' $logger = Logger.new(STDOUT) class Client attr_reader :remote_base attr_reader :session def initialize(remote_base) @remote_base = remote_base @session = RestClient::Resource.new(remote_base) end def parse_server_error_or_raise_for_status(resp) j = {} begin j = JSON.parse(resp.body) rescue puts "Status code: #{resp.code}" end return j end def post_request(route, data) url = self.remote_base + route $logger.info "POST #{url}\n#{data}" resp = session[route].post data.to_json, content_type: :json return self.parse_server_error_or_raise_for_status(resp) end def get_request(route) url = self.remote_base + route $logger.info("GET #{url}") resp = session[route].get return self.parse_server_error_or_raise_for_status(resp) end def env_create(env_id) route = '/v1/envs/' data = {'env_id': env_id} resp = self.post_request(route, data) instance_id = resp['instance_id'] return instance_id end def env_list_all route = '/v1/envs/' resp = self.get_request(route) all_envs = resp['all_envs'] return all_envs end def env_reset(instance_id) route = "/v1/envs/#{instance_id}/reset/" resp = self.post_request(route, "") observation = resp['observation'] return observation end def env_step(instance_id, action, render=false) route = "/v1/envs/#{instance_id}/step/" data = {'action': action, 'render': render} resp = self.post_request(route, data) observation = resp['observation'] reward = resp['reward'] done = resp['done'] info = resp['info'] return [observation, reward, done, info] end def env_action_space_info(instance_id) route = "/v1/envs/#{instance_id}/action_space/" p route resp = self.get_request(route) info = resp['info'] return info end def env_action_space_sample(instance_id) route = "/v1/envs/#{instance_id}/action_space/sample" resp = self.get_request(route) action = resp['action'] return action end def env_action_space_contains(instance_id, x) route = "/v1/envs/#{instance_id}/action_space/contains/#{x}" resp = self.get_request(route) member = resp['member'] return member end def env_observation_space_info(instance_id) route = "/v1/envs/#{instance_id}/observation_space/" resp = self.get_request(route) info = resp['info'] return info end def env_monitor_start(instance_id, directory, force=false, resume=false, video_callable=false) route = "/v1/envs/#{instance_id}/monitor/start/" data = {'directory': directory, 'force': force, 'resume': resume, 'video_callable': video_callable} self.post_request(route, data) end def env_monitor_close(instance_id) route = "/v1/envs/#{instance_id}/monitor/close/" self.post_request(route, "") end def env_close(instance_id) route = "/v1/envs/#{instance_id}/close/" self.post_request(route, "") end def upload(training_dir, algorithm_id="", api_key="") if api_key.empty? api_key = OPENAI_GYM_API_KEY end route = '/v1/upload/' data = {'training_dir': training_dir, 'algorithm_id': algorithm_id, 'api_key': api_key} self.post_request(route, data) end def shutdown_server route = "/v1/shutdown/" self.post_request(route, "") end end