def pay_bonus(self, worker_id, bonus_amount, assignment_id, reason, unique_request_token): """Handles paying bonus to a turker, fails for insufficient funds. Returns True on success and False on failure """ total_cost = calculate_mturk_cost(payment_opt={ 'type': 'bonus', 'amount': bonus_amount }) if not check_mturk_balance(balance_needed=total_cost, is_sandbox=self.is_sandbox): print_and_log('Cannot pay bonus. Reason: Insufficient funds' ' in your MTurk account.') return False client = get_mturk_client(self.is_sandbox) # unique_request_token may be useful for handling future network errors client.send_bonus(WorkerId=worker_id, BonusAmount=str(bonus_amount), AssignmentId=assignment_id, Reason=reason, UniqueRequestToken=unique_request_token) print_and_log('Paid ${} bonus to WorkerId: {}'.format( bonus_amount, worker_id)) return True
def pay_bonus(self, worker_id, bonus_amount, assignment_id, reason, unique_request_token): """Handles paying bonus to a turker, fails for insufficient funds. Returns True on success and False on failure """ total_cost = mturk_utils.calculate_mturk_cost( payment_opt={'type': 'bonus', 'amount': bonus_amount} ) if not mturk_utils.check_mturk_balance(balance_needed=total_cost, is_sandbox=self.is_sandbox): shared_utils.print_and_log( logging.WARN, 'Cannot pay bonus. Reason: Insufficient ' 'funds in your MTurk account.', should_print=True ) return False client = mturk_utils.get_mturk_client(self.is_sandbox) # unique_request_token may be useful for handling future network errors client.send_bonus( WorkerId=worker_id, BonusAmount=str(bonus_amount), AssignmentId=assignment_id, Reason=reason, UniqueRequestToken=unique_request_token ) shared_utils.print_and_log( logging.INFO, 'Paid ${} bonus to WorkerId: {}'.format( bonus_amount, worker_id ) ) return True
def setup_server(self, task_directory_path=None): """Prepare the MTurk server for the new HIT we would like to submit""" completion_type = 'start' if self.opt['count_complete']: completion_type = 'finish' print_and_log( '\nYou are going to allow workers from Amazon ' 'Mechanical Turk to be an agent in ParlAI.\nDuring this ' 'process, Internet connection is required, and you should ' 'turn off your computer\'s auto-sleep feature.\n' 'Enough HITs will be created to fulfill {} times the number of ' 'conversations requested, extra HITs will be expired once the ' 'desired conversations {}.'.format(HIT_MULT, completion_type)) key_input = input('Please press Enter to continue... ') print_and_log('') setup_aws_credentials() # See if there's enough money in the account to fund the HITs requested num_assignments = self.required_hits payment_opt = { 'type': 'reward', 'num_total_assignments': num_assignments, 'reward': self.opt['reward'], # in dollars 'unique': self.opt['unique_worker'] } total_cost = calculate_mturk_cost(payment_opt=payment_opt) if not check_mturk_balance(balance_needed=total_cost, is_sandbox=self.opt['is_sandbox']): raise SystemExit('Insufficient funds') if total_cost > 100 or self.opt['reward'] > 1: confirm_string = '$%.2f' % total_cost print_and_log( 'You are going to create {} HITs at {} per assignment, for a ' 'total cost of {} after MTurk fees. Please enter "{}" to ' 'confirm and continue, and anything else to cancel'.format( self.required_hits, '$%.2f' % self.opt['reward'], confirm_string, confirm_string)) check = input('Enter here: ') if (check != confirm_string): raise SystemExit('Cancelling') print_and_log('Setting up MTurk server...') create_hit_config(task_description=self.opt['task_description'], unique_worker=self.opt['unique_worker'], is_sandbox=self.opt['is_sandbox']) # Poplulate files to copy over to the server if not self.task_files_to_copy: self.task_files_to_copy = [] if not task_directory_path: task_directory_path = os.path.join(self.opt['parlai_home'], 'parlai', 'mturk', 'tasks', self.opt['task']) self.task_files_to_copy.append( os.path.join(task_directory_path, 'html', 'cover_page.html')) for mturk_agent_id in self.mturk_agent_ids + ['onboarding']: self.task_files_to_copy.append( os.path.join(task_directory_path, 'html', '{}_index.html'.format(mturk_agent_id))) # Setup the server with a likely-unique app-name task_name = '{}-{}'.format(str(uuid.uuid4())[:8], self.opt['task']) self.server_task_name = \ ''.join(e for e in task_name if e.isalnum() or e == '-') self.server_url = \ setup_server(self.server_task_name, self.task_files_to_copy) print_and_log(self.server_url, False) print_and_log("MTurk server setup done.\n")
def setup_server(self, task_directory_path=None): """Prepare the MTurk server for the new HIT we would like to submit""" fin_word = 'start' if self.opt['count_complete']: fin_word = 'finish' shared_utils.print_and_log( logging.INFO, '\nYou are going to allow workers from Amazon Mechanical Turk to ' 'be an agent in ParlAI.\nDuring this process, Internet connection ' 'is required, and you should turn off your computer\'s auto-sleep ' 'feature.\nEnough HITs will be created to fulfill {} times the ' 'number of conversations requested, extra HITs will be expired ' 'once the desired conversations {}.'.format(HIT_MULT, fin_word), should_print=True ) key_input = input('Please press Enter to continue... ') shared_utils.print_and_log(logging.NOTSET, '', True) mturk_utils.setup_aws_credentials() # See if there's enough money in the account to fund the HITs requested num_assignments = self.required_hits payment_opt = { 'type': 'reward', 'num_total_assignments': num_assignments, 'reward': self.opt['reward'], # in dollars 'unique': self.opt['unique_worker'] } total_cost = mturk_utils.calculate_mturk_cost(payment_opt=payment_opt) if not mturk_utils.check_mturk_balance( balance_needed=total_cost, is_sandbox=self.opt['is_sandbox']): raise SystemExit('Insufficient funds') if ((not self.opt['is_sandbox']) and (total_cost > 100 or self.opt['reward'] > 1)): confirm_string = '$%.2f' % total_cost expected_cost = total_cost / HIT_MULT expected_string = '$%.2f' % expected_cost shared_utils.print_and_log( logging.INFO, 'You are going to create {} HITs at {} per assignment, for a ' 'total cost up to {} after MTurk fees. Please enter "{}" to ' 'confirm and continue, and anything else to cancel.\nNote that' ' of the {}, the target amount to spend is {}.'.format( self.required_hits, '$%.2f' % self.opt['reward'], confirm_string, confirm_string, confirm_string, expected_string ), should_print=True ) check = input('Enter here: ') if (check != confirm_string and ('$' + check) != confirm_string): raise SystemExit('Cancelling') shared_utils.print_and_log(logging.INFO, 'Setting up MTurk server...', should_print=True) mturk_utils.create_hit_config( task_description=self.opt['task_description'], unique_worker=self.opt['unique_worker'], is_sandbox=self.opt['is_sandbox'] ) # Poplulate files to copy over to the server if not self.task_files_to_copy: self.task_files_to_copy = [] if not task_directory_path: task_directory_path = os.path.join( self.opt['parlai_home'], 'parlai', 'mturk', 'tasks', self.opt['task'] ) self.task_files_to_copy.append( os.path.join(task_directory_path, 'html', 'cover_page.html')) for file_name in os.listdir(os.path.join(task_directory_path, 'html')): self.task_files_to_copy.append(os.path.join( task_directory_path, 'html', file_name )) for mturk_agent_id in self.mturk_agent_ids + ['onboarding']: self.task_files_to_copy.append(os.path.join( task_directory_path, 'html', '{}_index.html'.format(mturk_agent_id) )) # Setup the server with a likely-unique app-name task_name = '{}-{}'.format(str(uuid.uuid4())[:8], self.opt['task']) self.server_task_name = \ ''.join(e for e in task_name.lower() if e.isalnum() or e == '-') self.server_url = server_utils.setup_server(self.server_task_name, self.task_files_to_copy) shared_utils.print_and_log(logging.INFO, self.server_url) shared_utils.print_and_log(logging.INFO, "MTurk server setup done.\n", should_print=True)
def setup_server(self, task_directory_path=None): """Prepare the MTurk server for the new HIT we would like to submit""" fin_word = 'start' if self.opt['count_complete']: fin_word = 'finish' shared_utils.print_and_log( logging.INFO, '\nYou are going to allow workers from Amazon Mechanical Turk to ' 'be an agent in ParlAI.\nDuring this process, Internet connection ' 'is required, and you should turn off your computer\'s auto-sleep ' 'feature.\nEnough HITs will be created to fulfill {} times the ' 'number of conversations requested, extra HITs will be expired ' 'once the desired conversations {}.'.format(HIT_MULT, fin_word), should_print=True ) key_input = input('Please press Enter to continue... ') shared_utils.print_and_log(logging.NOTSET, '', True) mturk_utils.setup_aws_credentials() # See if there's enough money in the account to fund the HITs requested num_assignments = self.required_hits payment_opt = { 'type': 'reward', 'num_total_assignments': num_assignments, 'reward': self.opt['reward'], # in dollars 'unique': self.opt['unique_worker'] } total_cost = mturk_utils.calculate_mturk_cost(payment_opt=payment_opt) if not mturk_utils.check_mturk_balance( balance_needed=total_cost, is_sandbox=self.opt['is_sandbox']): raise SystemExit('Insufficient funds') if ((not self.opt['is_sandbox']) and (total_cost > 100 or self.opt['reward'] > 1)): confirm_string = '$%.2f' % total_cost expected_cost = total_cost / HIT_MULT expected_string = '$%.2f' % expected_cost shared_utils.print_and_log( logging.INFO, 'You are going to create {} HITs at {} per assignment, for a ' 'total cost up to {} after MTurk fees. Please enter "{}" to ' 'confirm and continue, and anything else to cancel.\nNote that' ' of the {}, the target amount to spend is {}.'.format( self.required_hits, '$%.2f' % self.opt['reward'], confirm_string, confirm_string, confirm_string, expected_string ), should_print=True ) check = input('Enter here: ') if (check != confirm_string and ('$' + check) != confirm_string): raise SystemExit('Cancelling') shared_utils.print_and_log(logging.INFO, 'Setting up MTurk server...', should_print=True) mturk_utils.create_hit_config( task_description=self.opt['task_description'], unique_worker=self.opt['unique_worker'], is_sandbox=self.opt['is_sandbox'] ) # Poplulate files to copy over to the server if not self.task_files_to_copy: self.task_files_to_copy = [] if not task_directory_path: task_directory_path = os.path.join( self.opt['parlai_home'], 'parlai', 'mturk', 'tasks', self.opt['task'] ) self.task_files_to_copy.append( os.path.join(task_directory_path, 'html', 'cover_page.html')) for mturk_agent_id in self.mturk_agent_ids + ['onboarding']: self.task_files_to_copy.append(os.path.join( task_directory_path, 'html', '{}_index.html'.format(mturk_agent_id) )) # Setup the server with a likely-unique app-name task_name = '{}-{}'.format(str(uuid.uuid4())[:8], self.opt['task']) self.server_task_name = \ ''.join(e for e in task_name if e.isalnum() or e == '-') self.server_url = server_utils.setup_server(self.server_task_name, self.task_files_to_copy) shared_utils.print_and_log(logging.INFO, self.server_url) shared_utils.print_and_log(logging.INFO, "MTurk server setup done.\n", should_print=True)