from otree.api import * import openai import datetime import time OPENAI_API_KEY = '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' openai.api_key = OPENAI_API_KEY doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'generativework_before_high' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 READING1="In 1939 an archaeological excavation in southeastern England revealed a grave dated to the seventh century C.E. The grave contained a 13-meter-long ship filled with jewelry and other precious objects. The presence of such impressive artifacts made it likely that the person buried in the grave had been one of the kings who ruled the region, known as East Anglia. While it has long been unclear which East Anglian king this was, most historians now believe that the grave belonged to King Raedwald. The dating of the objects seems to fit the date of King Raedwald's death. The grave is so grand and the objects it contained are so splendid that it appears that the person buried in the grave was a particularly powerful king." READING2="Some companies in the United States have developed wellness programs that give rewards or incentives to employees for achieving certain health-related goals, such as stopping smoking or losing weight. The rewards and incentives include cash prizes, extra vacation days, or reduction of the employee's portion of health insurance fees. The awards and incentives are an excellent motivational tool for people to adopt healthy lifestyles. The advocates of incentive programs argue that rewarding people who are willing to adopt healthier lifestyles is only being fair. Although the wellness incentives cost a lot of money for companies, the incentives save companies money in the long term." READING3="Throughout the Greek islands, archaeologists have found over 200 plate-sized ceramic disks dating to about 2000 to 3000 B.C.E. The disks are typically decorated on one side, while the other side is undecorated and has a raised edge that creates a shallow basin. They usually also have short handles. Archaeologists are still unclear about what the objects were used for. Some archaeologists believe that the objects were used for cooking food. Other archaeologists believe that the objects were drums for making sounds. Yet other archaeologists believe that the objects were a kind of ancient mirror." READING_noAI="In recent years, the desire to find a clean, renewable source of energy has led to an increase in the number of wind turbines in the United States. Wind turbines are tall pillars topped with spinning blades, which create energy when they are turned by strong winds. Unfortunately, these turbines are having an unintended consequence: collisions with wind turbines injure or kill many bats during the bats' annual migrations. The result has been a noticeable decrease in the populations of many species of bats. Researchers have proposed three solutions to save the bats from being harmed by wind turbines. One solution is to build wind turbines at sites where they would not interfere with the bats' migratory patterns. A second solution is to shut down the current wind turbines at night time when bats are most active (bats are night animals.) Finally, a third solution involves the use of radar to keep bats away from the wind turbines." class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): answer1 = models.StringField() answer2 = models.StringField() answer3 = models.StringField() reviewToHumanAnswer1=models.StringField() reviewToHumanAnswer2=models.StringField() reviewToHumanAnswer3=models.StringField() warmupAnswer=models.StringField() reviewToWarmupAnswer=models.StringField() openanswer=models.StringField(label="Please write your thoughts on working with the AI Writer.") enterTimeQuestionPage1=models.StringField(blank=True) leaveTimeQuestionPage1=models.StringField(blank=True) enterTimeProcessPage1=models.StringField(blank=True) leaveTimeProcessPage1=models.StringField(blank=True) enterTimeFeedbackPage1=models.StringField(blank=True) leaveTimeFeedbackPage1=models.StringField(blank=True) enterTimeQuestionPage2=models.StringField(blank=True) leaveTimeQuestionPage2=models.StringField(blank=True) enterTimeProcessPage2=models.StringField(blank=True) leaveTimeProcessPage2=models.StringField(blank=True) enterTimeFeedbackPage2=models.StringField(blank=True) leaveTimeFeedbackPage2=models.StringField(blank=True) enterTimeQuestionPage3=models.StringField(blank=True) leaveTimeQuestionPage3=models.StringField(blank=True) enterTimeProcessPage3=models.StringField(blank=True) leaveTimeProcessPage3=models.StringField(blank=True) enterTimeFeedbackPage3=models.StringField(blank=True) leaveTimeFeedbackPage3=models.StringField(blank=True) useness1= models.StringField(label="To what extent is the suggestion from AI useful?", choices=[['5','Extremely useful'],[ '4','Very useful'],[ '3','Moderately useful'],[ '2','Slightly useful'],[ '1','Not at all useful']], widget=widgets.RadioSelect,) useness2= models.StringField(label="To what extent is the suggestion from AI useful?", choices=[['5','Extremely useful'],[ '4','Very useful'],[ '3','Moderately useful'],[ '2','Slightly useful'],[ '1','Not at all useful']], widget=widgets.RadioSelect,) useness3= models.StringField(label="To what extent is the suggestion from AI useful?", choices=[['5','Extremely useful'],[ '4','Very useful'],[ '3','Moderately useful'],[ '2','Slightly useful'],[ '1','Not at all useful']], widget=widgets.RadioSelect,) agreeLevelToReviewToHuman1=models.StringField(label="To what extent do you agree with the rating and comment toward your summary?", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) agreeLevelToReviewToHuman2=models.StringField(label="To what extent do you agree with the rating and comment toward your summary?", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) agreeLevelToReviewToHuman3=models.StringField(label="To what extent do you agree with the rating and comment toward your summary?", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) agreeLevelToReviewToAI1=models.StringField(label="To what extent do you agree with the rating and comment toward AI`s suggestion?", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) agreeLevelToReviewToAI2=models.StringField(label="To what extent do you agree with the rating and comment toward AI`s suggestion?", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) agreeLevelToReviewToAI3=models.StringField(label="To what extent do you agree with the rating and comment toward AI`s suggestion?", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey1=models.StringField(label="AI Writer can complete the task more efficiently.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey2=models.StringField(label="AI Writer can increase my payoffs.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey3=models.StringField(label="I am more productive with the AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey4=models.StringField(label="I would not need to exert much effort to make the AI Writer work properly.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey5=models.StringField(label="My interaction with AI Writer is clear and understandable.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey6=models.StringField(label=" Using AI Writer is a good idea.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey7=models.StringField(label=" AI Writer makes tasks more interesting.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey8=models.StringField(label="Working with AI Writer is fun.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey9=models.StringField(label="I like working with AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey10=models.StringField(label="I could complete tasks using the AI Writer without any supervision.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey11=models.StringField(label=" I could complete tasks using the AI Writer without any assistance.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey12=models.StringField(label=" I need extra time to complete tasks using the AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey13=models.StringField(label="I could complete tasks using the AI Writer if it included a way to ask for help.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey14=models.StringField(label="I feel apprehensive about using AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey15=models.StringField(label="I could lose a lot of information using AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey16=models.StringField(label=" I hesitate to use the system for fear of making mistakes.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey17=models.StringField(label="The system is somewhat intimidating to me.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey18=models.StringField(label="I feel that AI Writer performs better than me.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) pre_survey19=models.StringField(label="I feel that AI Writer can perform the tasks without my involvement.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) #now post post_survey1=models.StringField(label="AI Writer could complete the task more efficiently.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey2=models.StringField(label="AI Writer could increase my payoffs.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey3=models.StringField(label="I was more productive with the AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey4=models.StringField(label="I would not need to exert much effort to make the AI Writer work properly.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey5=models.StringField(label="My interaction with AI Writer was clear and understandable.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey6=models.StringField(label=" Using AI Writer is a good idea.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey7=models.StringField(label=" AI Writer made tasks more interesting.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey8=models.StringField(label="Working with AI Writer is fun.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey9=models.StringField(label="I like working with AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey10=models.StringField(label="I could complete tasks using the AI Writer without any supervision.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey11=models.StringField(label=" I could complete tasks using the AI Writer without any assistance.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey12=models.StringField(label=" I needed extra time to complete tasks using the AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey13=models.StringField(label="I could complete tasks using the AI Writer if it included a way to ask for help.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey14=models.StringField(label="I feel apprehensive about using AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey15=models.StringField(label="I could lose a lot of information using AI Writer.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey16=models.StringField(label=" I hesitate to use the system for fear of making mistakes.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey17=models.StringField(label="The system was somewhat intimidating to me.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey18=models.StringField(label="I feel that AI Writer performed better than me.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey19=models.StringField(label="I feel that AI Writer could perform the tasks without my involvement.", choices=[['5','Strongly agree'],[ '4','Agree'],[ '3','Neutral'],[ '2','Disagree'],[ '1','Strongly disagree']], widget=widgets.RadioSelect,) post_survey20=models.StringField(label="Did you receive a suggestion from AI Writer before you submitted your corrected sentences?", choices=[['Yes','Yes'],['No','No'], ['Not sure','Not sure']], widget=widgets.RadioSelect,) post_survey21=models.StringField(label="Did the AI Writer correct your sentences after submission?", choices=[['Yes','Yes'],['No','No'], ['Not sure','Not sure']], widget=widgets.RadioSelect,) post_survey22=models.StringField(label="Which of the following best describes the role of AI Writer you perceived in previous tasks?", choices=[['Assistant','Assistant'],['Competitor','Competitor'], ['Supervisor','Supervisor']], widget=widgets.RadioSelect,) post_survey23=models.StringField(label="Did the AI Writer make any errors in the tasks?", choices=[['Yes','Yes'],['No','No'], ['Not sure','Not sure']], widget=widgets.RadioSelect,) post_survey24=models.StringField(label="What is the performance of the AI Writer?", choices=[['5','Very good'],[ '4','Good'],[ '3','Neutral'],[ '2','Bad'],[ '1','Very bad']], widget=widgets.RadioSelect,) def countWords(summary): res=len(summary.split()) return res def rateFuncSum(original,summary): try: counts=countWords(summary) order="Rate and comment the summary out of 10 based on the original texts. I will give the number of words in the summary. Show it and if the words in the summary are more than 50, give a 1 point penalty on the rating. For example, if some summary has 70 words, which are more than 50, this summary will get 1 point reduction in its rating for going beyond the limit." texts=order+"The orginal texts are: "+original+" the summary is: "+summary+" The number of words in the summary is: "+str(counts) message=[{"role": "user", "content": texts}] response = openai.ChatCompletion.create( model="gpt-4", max_tokens=2000, temperature=0.3, messages = message) return response['choices'][0]['message']['content'] except: time.sleep(0.1) rateFuncSum(original,summary) def highPerformImproveFuncSum(original,summary): try: order="Here is a paraphraph of texts and its summary made by someone. Please improve the summary made by this guy with around 30 but no more than 50 words. " texts=order+"The orginal texts are: "+original+" the summary is: "+summary message=[{"role": "user", "content": texts}] response = openai.ChatCompletion.create( model="gpt-4", max_tokens=2000, temperature=1.0, messages = message) #print(response['choices'][0]['message']['content']) return response['choices'][0]['message']['content'] except: time.sleep(0.1) highPerformImproveFuncSum(original,summary) def lowPerformImproveFuncSum(original,summary): try: #order="Here is a paraphraph of texts and its summary made by someone, and improve the summary made by this guy within 20 words. " order="Here is a paraphraph of texts and its summary made by someone. Please improve the summary made by this guy with around 30 but no more than 50 words" texts=order+"The orginal texts are: "+original+" the summary is: "+summary response = openai.Completion.create( model="text-davinci-003", prompt=texts, max_tokens=2000, temperature=1.0, ) #print(response['choices'][0]['text']) #print (response) return response['choices'][0]['text'] except: time.sleep(0.1) lowPerformImproveFuncSum(original,summary) class Welcome(Page): pass class AI_Welcome(Page): pass class no_AI_Welcome(Page): pass class no_AI(Page): form_model = 'player' form_fields = ['warmupAnswer'] class no_AI_result(Page): def vars_for_template(player): review=rateFuncSum(C.READING_noAI,player.warmupAnswer) player.reviewToWarmupAnswer=review return dict(review=review) class pre_survey(Page): form_model = 'player' form_fields = ['pre_survey1','pre_survey2','pre_survey3','pre_survey4','pre_survey5','pre_survey6','pre_survey7','pre_survey8', 'pre_survey9','pre_survey10','pre_survey11','pre_survey12','pre_survey13','pre_survey14','pre_survey15','pre_survey16','pre_survey17', 'pre_survey18','pre_survey19'] class post_survey(Page): form_model = 'player' form_fields = [ 'post_survey1', 'post_survey2', 'post_survey3', 'post_survey4', 'post_survey5', 'post_survey6', 'post_survey7', 'post_survey8', 'post_survey9', 'post_survey10', 'post_survey11', 'post_survey12', 'post_survey13', 'post_survey14', 'post_survey15', 'post_survey16', 'post_survey17', 'post_survey18', 'post_survey19', 'post_survey22', 'post_survey23', 'post_survey20', 'post_survey21', 'post_survey24', 'openanswer'] class Task1_QuestionPage(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeQuestionPage1=str(timePoint) return dict(timePoint=timePoint) form_model = 'player' form_fields = ['answer1'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeQuestionPage1=str(timePoint) class Task1_process(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeProcessPage1=str(timePoint) return dict(timePoint=timePoint) form_model = 'player' form_fields = ['useness1'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeProcessPage1=str(timePoint) class Task1_feedback(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeFeedbackPage1=str(timePoint) review=rateFuncSum(C.READING1,player.answer1) player.reviewToHumanAnswer1=review return dict(review=review,timePoint=timePoint) form_model = 'player' form_fields = ['agreeLevelToReviewToHuman1', 'agreeLevelToReviewToAI1'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeFeedbackPage1=str(timePoint) class Task2_QuestionPage(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeQuestionPage2=str(timePoint) return dict(timePoint=timePoint) form_model = 'player' form_fields = ['answer2'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeQuestionPage2=str(timePoint) class Task2_process(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeProcessPage2=str(timePoint) return dict(timePoint=timePoint) form_model = 'player' form_fields = ['useness2'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeProcessPage2=str(timePoint) class Task2_feedback(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeFeedbackPage2=str(timePoint) review=rateFuncSum(C.READING2,player.answer2) player.reviewToHumanAnswer2=review return dict(review=review) form_model = 'player' form_fields = ['agreeLevelToReviewToHuman2', 'agreeLevelToReviewToAI2'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeFeedbackPage2=str(timePoint) class Task3_QuestionPage(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeQuestionPage3=str(timePoint) return dict(timePoint=timePoint) form_model = 'player' form_fields = ['answer3'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeQuestionPage3=str(timePoint) class Task3_process(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeProcessPage3=str(timePoint) return dict(timePoint=timePoint) form_model = 'player' form_fields = ['useness3'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeProcessPage3=str(timePoint) class Task3_feedback(Page): def vars_for_template(player): timePoint=datetime.datetime.now() player.enterTimeFeedbackPage3=str(timePoint) review=rateFuncSum(C.READING3,player.answer3) player.reviewToHumanAnswer3=review return dict(review=review) form_model = 'player' form_fields = ['agreeLevelToReviewToHuman3', 'agreeLevelToReviewToAI3'] def before_next_page(player,timeout_happened=False ):# it works timePoint=datetime.datetime.now() player.leaveTimeFeedbackPage3=str(timePoint) class Completion(Page): pass # PAGES class MyPage(Page): pass class ResultsWaitPage(WaitPage): pass class Results(Page): pass page_sequence = [ no_AI_Welcome,no_AI,no_AI_result, pre_survey, AI_Welcome, Task1_QuestionPage, Task1_process, Task1_feedback, Task2_QuestionPage, Task2_process, Task2_feedback, Task3_QuestionPage, Task3_process, Task3_feedback, post_survey, Completion]