[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] I have a large contact network, and need a Notion page to manage all of them, sort of like a Personal CRM. (e.g, Name, where they're from, last contacted, etc.)

[Assistant] {"response":"Great choice! I'll set up a Notion page titled \"Personal CRM\" that serves as a dynamic tool for managing your large contact network, serving as a centralized and easily accessible record.\n\n1. Overview: The page starts with a callout highlighting the purpose of this Personal CRM—tracking the individuals you meet, their details, and your interaction timeline.\n2. Contact Database: A detailed, user-friendly database where each contact's information such as Name, Associations (like College, Google, etc.), Status of relationship, Last Contact date, and a check if it's a professional contact will be neatly recorded. This will allow you to filter and sort through your network based on various criteria effectively.\n\nThis organized system will not only help in keeping the information updated but also make sure that you’re reminded when it’s time to reconnect, helping you easily manage both personal and professional relationships. Now, I'll go ahead and create this personalized Notion setup to help you manage your contacts more effectively.","blueprint":{"type":"page","title":"Personal CRM","icon":"📇","children":[{"type":"callout","icon":"💡","color":"orange_background","content":[{"text":"Overview:","style":["bold"]},{"text":" Keep track of all the people you meet, what you know about them, when to reach out and say hello, and whether they're a professional contact.","style":[]}]},{"type":"paragraph","content":[]},{"type":"database","title":"Contacts","icon":"👥","is_inline":true,"schema":{"Name":{"type":"title"},"Associations":{"type":"multi_select","options":[{"name":"Family","color":"green"},{"name":"Google","color":"orange"},{"name":"College","color":"blue"},{"name":"Inner Circle","color":"brown"},{"name":"Friend","color":"purple"},{"name":"High School","color":"default"}]},"Last Update?":{"type":"rich_text"},"Status":{"type":"select","options":[{"name":"On hold","color":"gray"},{"name":"Time to reach out!","color":"orange"}]},"Last Contacted":{"type":"date"},"Professional Contact":{"type":"checkbox"}}}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] I'm Prof. John Smith and I teach Intro to Aerodynamics, and I want a class homepage in Notion where I can have class syllabus, course schedule/information, announcements, etc. Can you help me?

[Assistant] {"response":"Certainly, Prof. John Smith! I'll set up a Notion page titled \"Classroom Home\" tailored for your Intro to Aerodynamics course, here what it’ll cover:\n\n1. Welcome Quote: A brief introduction to the course and its relevance.\n2. Course Information: Detailed info such as class location, meeting times, your contact details, and office hours.\n3. Announcements Section: For timely updates, changes, or important notices in the form of callouts.\n4. Detailed Course Syllabus Page: This includes comprehensive information on course topics, textbook readings, and general policies.\n5. Class Directory Database: A list where student names and emails can be organized.\n6. Course Schedule Database: An weekly class schedule covering topics and assessments to keep everyone on track.\n\nNow that I’ve shared the page structure, I’ll create a sample syllabus for you in Notion. However, feel free to edit it to fit your classroom!","blueprint":{"type":"page","title":"Classroom Home","icon":"🏛","children":[{"type":"quote","content":[{"text":"Welcome to Intro to Aerodynamics.\n","style":["bold"]},{"text":"This course is designed to provide students with a foundational understanding of how air interacts with solid objects, a concept crucial for fields like aerospace engineering, automotive design, and environmental engineering.","style":[]}]},{"type":"heading_1","text":"Information"},{"type":"paragraph","content":[{"text":"Class Location:","style":["bold"]},{"text":" Science Building, Room 205","style":[]}]},{"type":"paragraph","content":[{"text":"Class Hours:","style":["bold"]},{"text":" Tuesday & Thursday 2:00-3:30 PM","style":[]}]},{"type":"paragraph","content":[{"text":"Instructor:","style":["bold"]},{"text":" Prof. John Smith","style":[]}]},{"type":"paragraph","content":[{"text":"Email Address:","style":["bold"]},{"text":" johnsmith@university.edu","style":[]}]},{"type":"paragraph","content":[{"text":"Office Hours:","style":["bold"]},{"text":" Tuesday & Thursday 12:30-2:00 PM","style":[]}]},{"type":"paragraph","content":[{"text":"Course Website:","style":["bold"]},{"text":" ","style":[]},{"text":"http://www.university.edu/csc101","style":[]}]},{"type":"heading_1","text":"Announcements"},{"type":"paragraph","content":[{"text":" ↓ To add a new announcement, duplicate or add a new callout by typing ","style":[]},{"text":"/callout","style":["code"]},{"text":" ","style":[]}]},{"type":"callout","icon":"📖","color":"gray_background","content":[{"text":"March 7, 2024 — Reading Change \n","style":["bold"]},{"text":"Let's also read Chapter 4 this week in addition to Chapter 3.","style":[]}]},{"type":"callout","icon":"⏰","color":"gray_background","content":[{"text":"February 1, 2024 — Deadline Extension\n","style":["bold"]},{"text":"Due to the wide-spread technical hiccups we faced last week, the deadline to submit Week 5’s lab analysis will be extended to the 15th of February.","style":[]}]},{"type":"heading_1","text":"Course information"},{"type":"page","title":"Course Syllabus","icon":"📄","children":[{"type":"paragraph","content":[{"text":"Class Location:","style":["bold"]},{"text":" Science Building, Room 205","style":[]}]},{"type":"paragraph","content":[{"text":"Class Hours:","style":["bold"]},{"text":" Tuesday & Thursday 2:00-3:30 PM","style":[]}]},{"type":"paragraph","content":[{"text":"Instructor:","style":["bold"]},{"text":" Prof. John Smith","style":[]}]},{"type":"paragraph","content":[{"text":"Email Address:","style":["bold"]},{"text":" johnsmith@university.edu","style":[]}]},{"type":"paragraph","content":[{"text":"Office Hours:","style":["bold"]},{"text":" Tuesday & Thursday 12:30-2:00 PM","style":[]}]},{"type":"paragraph","content":[{"text":"Course Website:","style":["bold"]},{"text":" ","style":[]},{"text":"http://www.university.edu/csc101","style":[]}]},{"type":"heading_2","text":"Course Description"},{"type":"divider"},{"type":"paragraph","content":[{"text":"Provide students with a foundational understanding of how air interacts with solid objects, a concept crucial for fields like aerospace engineering, automotive design, and environmental engineering. Key topics:","style":[]}]},{"type":"paragraph","content":[{"text":"Fundamentals of Fluid Mechanics","style":["bold"]},{"text":": Introduction to the properties of fluids, the concept of pressure, buoyancy, and flow patterns.","style":[]}]},{"type":"paragraph","content":[{"text":"Aerodynamic Forces","style":["bold"]},{"text":": Understanding lift, drag, and thrust, including how these forces affect the performance and design of vehicles and structures.","style":[]}]},{"type":"paragraph","content":[{"text":"Airflow Dynamics","style":["bold"]},{"text":": Study of laminar and turbulent flow, boundary layers, and the impact of these factors on aerodynamic efficiency.","style":[]}]},{"type":"paragraph","content":[{"text":"Theory and Application","style":["bold"]},{"text":": Introduction to Bernoulli’s equation and other aerodynamic theories, with applications to aircraft, cars, bridges, and buildings.","style":[]}]},{"type":"paragraph","content":[{"text":"Wind Tunnel Testing","style":["bold"]},{"text":": Basics of wind tunnel testing, including scale modeling and data analysis techniques used in aerodynamic design.","style":[]}]},{"type":"paragraph","content":[{"text":"Computational Fluid Dynamics (CFD)","style":["bold"]},{"text":": An overview of how CFD is used in predicting and analyzing aerodynamic properties in complex scenarios.","style":[]}]},{"type":"paragraph","content":[{"text":"Prerequisite: None","style":["italic"]}]},{"type":"paragraph","content":[{"text":"Exclusion: ENG104","style":["italic"]}]},{"type":"paragraph","content":[{"text":"Distribution Requirement: Science","style":["italic"]}]},{"type":"heading_2","text":"Textbook and Other Materials"},{"type":"divider"},{"type":"paragraph","content":[{"text":"All course readings, assignments, and other important information will be available on the course website. Please make sure to check it regularly.","style":[]}]},{"type":"bulleted_list","items":["Course Website: http://www.university.edu/csc101","Discussion Board: http://www.university.edu/csc101/discussion"]},{"type":"heading_2","text":"Assessments"},{"type":"divider"},{"type":"toggle","title":"Labs","children":[{"type":"paragraph","content":[{"text":"Labs are designed to provide practical experience and reinforce the concepts taught in lectures. Each lab will focus on a specific topic, and students will be expected to complete coding tasks during the lab session. Lab attendance is crucial as it counts towards your final grade.","style":[]}]}]},{"type":"toggle","title":"Assignments","children":[{"type":"paragraph","content":[{"text":"Assignments are designed to test your understanding of the course material. They will consist of coding problems that you will need to solve individually. Assignments will be more complex than lab tasks and will often require you to apply concepts from multiple lectures.","style":[]}]}]},{"type":"toggle","title":"Midterm and Final Exam","children":[{"type":"paragraph","content":[{"text":"The midterm will cover all material taught up to that point in the course. The final exam will cover all course material. Both exams will consist of multiple-choice questions, short answer questions, and coding problems. Studying lecture notes and assignments is the best way to prepare.","style":[]}]}]},{"type":"toggle","title":"Participation","children":[{"type":"paragraph","content":[{"text":"Participation marks are awarded based on your engagement in the course. This includes posting and responding to questions on the discussion board, attending tutorials, and participating in class discussions. Regular engagement is crucial for doing well in this part of the assessment.","style":[]}]}]},{"type":"heading_2","text":"Penalties for lateness"},{"type":"divider"},{"type":"paragraph","content":[{"text":"Assignments submitted after the due date will be penalized at a rate of 10% per day, including weekends. No assignments will be accepted more than five days late unless a documented medical or personal emergency is provided.","style":[]}]},{"type":"heading_2","text":"Course Policies"},{"type":"divider"},{"type":"toggle","title":"Academic Integrity","children":[{"type":"paragraph","content":[{"text":"All students are expected to maintain the highest standards of academic integrity. This includes, but is not limited to, avoiding actions such as cheating, plagiarizing, and providing false information. Any student found to be in violation of the academic integrity policy will face disciplinary action, which could include a failing grade for the course and further sanctions from the university.","style":[]}]}]},{"type":"toggle","title":"Attendance and Participation","children":[{"type":"paragraph","content":[{"text":"Regular attendance and active participation in class are crucial for understanding the course material and doing well in the course. If you are unable to attend a class, please email the instructor in advance.","style":[]}]}]},{"type":"toggle","title":"Electronics Policy","children":[{"type":"paragraph","content":[{"text":"Use of electronics, such as laptops and cell phones, is allowed for note-taking and course-related purposes only. Any use of electronics that disrupts the class or distracts other students is not permitted.","style":[]}]}]},{"type":"toggle","title":"Office Hours","children":[{"type":"paragraph","content":[{"text":"Office hours are a time for you to ask questions, discuss the course material, or seek help on assignments. If you cannot make the scheduled office hours, please email the instructor or co-instructor to arrange an alternative time.","style":[]}]}]},{"type":"toggle","title":"Communication","children":[{"type":"paragraph","content":[{"text":"All course-related communication will be done through email or the discussion board on the course website. Please check your email and the course website regularly for updates.","style":[]}]}]},{"type":"toggle","title":"Accommodations","children":[{"type":"paragraph","content":[{"text":"If you require any accommodations for a disability or other reasons, please contact the instructor as soon as possible to make the necessary arrangements.","style":[]}]}]}]},{"type":"database","title":"Class Directory","icon":"👋","schema":{"Name":{"type":"title"},"Email":{"type":"email"}}},{"type":"database","title":"Course Schedule","icon":"📕","schema":{"Week":{"type":"title"},"Dates":{"type":"rich_text"},"Topics":{"type":"rich_text"},"Assessments":{"type":"rich_text"}}}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] I'm a professor at a university and I want to list the syllabus for my history class on Notion, along with the course details/policy -- can you help me?

[Assistant] {"response":"Certainly, let's organize your history class syllabus effectively on Notion. I'll help you create a detailed and well-structured pages that includes all the necessary details, such as:\n\n1. Course Header: Start with a vibrant callout to signal that this is an important and public document. Then, I’ll include the course title and number. (e.g, History 340)\n2. Instructor and TA Information: Use dual columns to display information about you (the instructor) and any teaching assistants. Then I’ll include office hours, contact emails, and office locations for easy reference.\n3. Course Description: A detailed paragraph explaining the scope and intent of the course.\n4. Enrollment Requirements: Outline any prerequisites, co-requisites, or recommended background, allowing students to assess their preparedness for the course.\n5. Texts and Materials: A database of required reading materials, listing authors, titles, and publication details.\n6. Course Schedule: A detailed schedule database presenting the lesson name, dates, types of sessions (lessons, assignments, exams), and the specific topics covered.\n7. Grading Policy: Breakdown the grading components in a column format, specifying the weight of each component. Additionally, detail the grading scale from A to F.\n8. Policies on Assignments: Set clear expectations about assignment submissions, handling late submissions, and the repercussions of missing deadlines.\n9. Academic Integrity: A section dedicated to reiterating the seriousness of plagiarism and the expectations for maintaining academic honesty.\n10. Final Examination: Provide details about the format and expectations for the final exam to prepare students adequately.\n\nThis highly detailed and comprehensive syllabus structure will help in delivering all the necessary course information effectively to your students, I’ll go ahead and create it in Notion now!","blueprint":{"type":"page","title":"Course Syllabus","icon":"📄","children":[{"type":"callout","icon":"📌","color":"pink_background","content":[{"text":"This page is designed to be shared publicly with your students.","style":[]}]},{"type":"heading_1","text":"History 340"},{"type":"column_list","columns":[{"type":"column","children":[{"type":"paragraph","content":[{"text":"Instructor: ","style":["bold"]},{"text":"Professor Linus Caesar","style":[]}]},{"type":"paragraph","content":[{"text":"Office:","style":["bold"]},{"text":" History Building #242","style":[]}]},{"type":"paragraph","content":[{"text":"Office hours:","style":["bold"]},{"text":" Weds 9:30-11:00am","style":[]}]},{"type":"paragraph","content":[{"text":"Email:","style":["bold"]},{"text":" linus.caesar@school.edu","style":[]}]}]},{"type":"column","children":[{"type":"paragraph","content":[{"text":"Lecture:","style":["bold"]},{"text":" 9:30-11:00am, Tu/Th","style":[]}]}]}]},{"type":"column_list","columns":[{"type":"column","children":[{"type":"paragraph","content":[{"text":"TA:","style":["bold"]},{"text":" Adrianne Stout","style":[]}]},{"type":"paragraph","content":[{"text":"Office:","style":["bold"]},{"text":" History Building #245","style":[]}]},{"type":"paragraph","content":[{"text":"Office hours: ","style":["bold"]},{"text":"M/W 1:00-2:00pm","style":[]}]},{"type":"paragraph","content":[{"text":"Email: ","style":["bold"]},{"text":"adrienne@school.edu","style":[]}]}]},{"type":"column","children":[{"type":"paragraph","content":[{"text":"TA:","style":["bold"]},{"text":" Brent Anderson","style":[]}]},{"type":"paragraph","content":[{"text":"Office:","style":["bold"]},{"text":" History Building #245","style":[]}]},{"type":"paragraph","content":[{"text":"Office hours: ","style":["bold"]},{"text":"M/W 2:00-3:00pm","style":[]}]},{"type":"paragraph","content":[{"text":"Email: ","style":["bold"]},{"text":"brent@school.edu","style":[]}]}]}]},{"type":"heading_1","text":"📜 Course Description"},{"type":"paragraph","content":[{"text":"The study of American history has recently witnessed fundamental revision. History is not simply a series of inevitable events but a contingent process, the origins of which remain open to interpretation. Our principle concern remains to understand not only the outcome of events, but also the origins of them.","style":[]}]},{"type":"heading_1","text":"🗝 Enrollment"},{"type":"paragraph","content":[{"text":"Prerequisite(s):","style":["bold"]},{"text":" ","style":[]},{"text":"course(s) that must be taken prior to this course","style":[]},{"text":"\n","style":[]},{"text":"Co-Requisite(s):","style":["bold"]},{"text":" ","style":[]},{"text":"course(s) that must be taken prior to or simultaneously","style":[]},{"text":"\n","style":[]},{"text":"Concurrent Enrollment:","style":["bold"]},{"text":" ","style":[]},{"text":"course(s) that must be taken simultaneously","style":[]},{"text":"\n","style":[]},{"text":"Recommended Preparation","style":["bold"]},{"text":": ","style":[]},{"text":"course work or background that is advisable, not mandatory","style":[]}]},{"type":"heading_1","text":"📚 Readings"},{"type":"database","title":"Required Texts","icon":"✅","is_inline":true,"schema":{"Name":{"type":"title"},"Author":{"type":"rich_text"},"Publisher":{"type":"rich_text"},"Year":{"type":"rich_text"}}},{"type":"heading_1","text":"Course Schedule"},{"type":"database","title":"Schedule","icon":"🗓","is_inline":true,"schema":{"Name":{"type":"title"},"Dates":{"type":"date"},"Type":{"type":"select","options":[{"name":"📒 Lesson","color":"yellow"},{"name":"📌 Assignment","color":"red"},{"name":"🔍 Exam","color":"blue"}]},"Topic":{"type":"multi_select","options":[{"name":"Pre-revolution","color":"default"},{"name":"American Revolution","color":"red"},{"name":"Civil War","color":"yellow"},{"name":"World War I","color":"green"},{"name":"The Great Depression","color":"blue"},{"name":"World War II","color":"purple"}]}}},{"type":"heading_1","text":"🏆 Grading"},{"type":"column_list","columns":[{"type":"column","children":[{"type":"heading_3","text":"Breakdown"},{"type":"paragraph","content":[{"text":"Participation: ","style":[]},{"text":"15%","style":["bold"]},{"text":"\nResponse Papers: ","style":[]},{"text":"15%","style":["bold"]},{"text":"\nEssay #1: ","style":[]},{"text":"15%","style":["bold"]},{"text":"\nMidterm: ","style":[]},{"text":"20%","style":["bold"]},{"text":"\nEssay #2: ","style":[]},{"text":"15%","style":["bold"]},{"text":"\nFinal Exam: ","style":[]},{"text":"20%","style":["bold"]}]}]},{"type":"column","children":[{"type":"heading_3","text":"Scale"},{"type":"paragraph","content":[{"text":"A","style":["bold"]},{"text":" 90%-100%\n","style":[]},{"text":"B","style":["bold"]},{"text":" 80%-89%\n","style":[]},{"text":"C","style":["bold"]},{"text":" 70%-79%\n","style":[]},{"text":"D","style":["bold"]},{"text":" 60%-69%\n","style":[]},{"text":"F","style":["bold"]},{"text":" < 60%","style":[]}]}]}]},{"type":"heading_3","text":"Assignment Submission"},{"type":"paragraph","content":[{"text":"All essays and papers are due in lecture (due dates are listed on the schedule). No electronic copies will be accepted!","style":[]}]},{"type":"heading_3","text":"Late Assignments"},{"type":"paragraph","content":[{"text":"Late work will be deducted 5% per twenty-four hour period that elapses after the due date. If foreseen or unforeseen circumstances prevent you from completing an assignment on time, you may request an extension. Extensions must be requested in advance of the due date. If the situation warrants an extension, we will determine a new due date for the essay based on your individual circumstances.","style":[]}]},{"type":"heading_1","text":"😢 Plagiarism"},{"type":"paragraph","content":[{"text":"Presenting someone else’s ideas as your own, either verbatim or recast in your own words – is a serious academic offense with serious consequences. Please familiarize yourself with the discussion of plagiarism in our campus policies.","style":[]}]},{"type":"heading_1","text":"🧠 Final Examination"},{"type":"paragraph","content":[{"text":"The final examination will consist of an essay written during the exam period. You will receive the question at least one week before the test and may use a single page of notes during it.","style":[]}]}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] I'm a researcher and want a simple system where I can write my research paper, maintain a plan, and keep track of my reading list.

[Assistant] {"response":"I would love to help you manage your research, here’s a Notion page layout that will help you do so:\n\n1. Current Draft: A dedicated page where you can write and edit your research paper. This will include sections like Abstract, Introduction, Methodology, and more, making it easy to organize the different parts of your paper.\n2. Plan: A simple database to break down your research into manageable milestones with specific due dates, keeping you on track and visibly marking progress. \n3. Reading List: Another database to list all the resources you need to go through, with a status indicator to keep you on track.\n\nNow that I’ve described the setup, I'll go ahead and create it for you in Notion.","blueprint":{"type":"page","title":"Research Paper Planner","icon":"🎓","children":[{"type":"heading_2","text":"Current draft"},{"type":"paragraph","content":[{"text":"↓ Use the page below as your working document","style":[]}]},{"type":"page","title":"Research Paper","icon":"✒","children":[{"type":"heading_1","text":"Table of Contents"},{"type":"table_of_contents"},{"type":"heading_1","text":"Abstract"},{"type":"heading_1","text":"Introduction"},{"type":"heading_1","text":"Literature Review"},{"type":"heading_1","text":"Methodology"},{"type":"heading_1","text":"Results"},{"type":"heading_1","text":"Discussion"},{"type":"heading_1","text":"Conclusion"},{"type":"heading_1","text":"Bibliography"},{"type":"heading_1","text":"Appendix"}]},{"type":"paragraph","content":[]},{"type":"heading_2","text":"Plan"},{"type":"paragraph","content":[{"text":"Break down your paper or thesis into milestones with target dates. ","style":[]}]},{"type":"database","title":"Plan","icon":"🗺","is_inline":true,"schema":{"Task":{"type":"title"},"Due Date":{"type":"date"},"Done":{"type":"checkbox"}}},{"type":"paragraph","content":[]},{"type":"heading_2","text":"Reading list"},{"type":"paragraph","content":[{"text":"Manage the papers, articles and books to read as part of your writeup.","style":[]}]},{"type":"database","title":"Reading List","icon":"📚","is_inline":true,"schema":{"Name":{"type":"title"},"Status":{"type":"select","options":[{"name":"To read","color":"gray"},{"name":"In progress","color":"blue"},{"name":"Done","color":"green"}]}}}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] Create a Notion page that can help me, a university student, manage and organize a group project with my peers. (Tasks, meetings, key details, etc.)

[Assistant] {"response":"I'm going to create a Notion page titled \"Student Group Assignment\" designed specifically for you and your teammates to collaborate on a group project. Here’s a breakdown of how it will be laid out:\n\n1. Project Details: This will capture essential links to your assignment, rubric, submission platform, and the due date.\n2. Docs & Deliverables: We’ll set up pages like \"Final Submission\" with sub-sections for parts of your assignment, and \"Assignment Brief & Rubric\" for easy reference to ensure you know what's expected.\n3. Team Member Responsibilities: A database will be created to list each member's contact details and assigned responsibilities, keeping everyone accountable.\n4. Todos: A task management system where you can keep track of what’s done, who’s responsible for what, and the due dates of each task.\n5. Meeting Notes: Another database will log the details of your meetings - who attended, what was discussed, and key decisions or ideas.\n\nThis setup will ensure that your team can work effectively and efficiently, keeping everyone on track! Now, I’ll craft this interactive Notion page to help make your group project become a success.","blueprint":{"type":"page","title":"Student Group Assignment","icon":"🍏","children":[{"type":"heading_2","text":"📝 Details"},{"type":"bulleted_list","items":["Assignment: https://canvas.university.edu/courses/123456/assignments","Rubric: https://canvas.university.edu/courses/123456/assignments","Submission Link: https://www.gradescope.com/courses/123456/assignments","Due Date: October 27, 2023"]},{"type":"heading_2","text":"📘 Docs & Deliverables"},{"type":"page","title":"Final Submission","icon":"⭐","children":[{"type":"table_of_contents"},{"type":"heading_2","text":"Introduction"},{"type":"heading_2","text":"Discussion"},{"type":"heading_2","text":"Conclusion"},{"type":"heading_2","text":"Sources"}]},{"type":"page","title":"Assignment Brief & Rubric","icon":"🔎"},{"type":"heading_2","text":"👥 Team Member Responsibilities"},{"type":"database","title":"Team Member Responsibilities","icon":"🏗","is_inline":true,"schema":{"Name":{"type":"title"},"Responsibilities":{"type":"rich_text"},"Email":{"type":"email"},"Phone":{"type":"phone_number"}}},{"type":"heading_2","text":"🚧 Todos"},{"type":"database","title":"Tasks","icon":"✅","is_inline":true,"schema":{"Done?":{"type":"checkbox"},"Task name":{"type":"title"},"Assignee":{"type":"people"},"Due":{"type":"date"},"Summary":{"type":"rich_text"}}},{"type":"heading_2","text":"📅 Meeting Notes"},{"type":"database","title":"Meetings","icon":"🗓","is_inline":true,"schema":{"Name":{"type":"title"},"Attendees":{"type":"people"},"Created by":{"type":"created_by"},"Event time":{"type":"date"},"Type":{"type":"select","options":[{"name":"Standup","color":"yellow"},{"name":"Brainstorm","color":"blue"},{"name":"Team weekly","color":"green"}]}}}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] Generate me a Notion tracker. I'm a CS student and want to monitor my personal life, my classwork, and my professional life so I can become a better person. Thanks in advance!

[Assistant] {"response":"I'll create a comprehensive Notion tracker titled \"Computer Science Student Dashboard\" to help you organize and monitor your personal life, classwork, and professional life effectively. Here's what you can expect in your custom dashboard: \n\n1. Quick Access: A database where you can store important links and resources for quick reference. \n2. Habit Tracker: Track your daily habits and tasks with detailed lists for each day, including items like solving LeetCode problems, working on side projects, reading, and more. \n3. Personal Projects: Individual pages for your personal projects like a social media app, website redesign, personal website, weather tracker, game of life, trading bot, and to-do app. You can add details, images, and toggle options to each project page for better organization. \n4. Classwork: Databases for courses and homework, allowing you to track course details, assignments, due dates, and completion status. \n5. Personal Learning and Job Search: Databases for internship search and resources, enabling you to monitor job applications, interview statuses, and organize learning materials with tags like books, videos, podcasts, articles, and talks. \n\nThis structured dashboard will make you a better person, just like you asked, by efficiently organizing your academic workload, personal projects, and professional development. Now, let's go ahead and set up your Notion tracker according to this plan.","blueprint":{"type":"page","title":"Computer Science Student Dashboard","icon":"💾","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip: ","style":["bold"]},{"text":"Studying computer science in college means juggling coursework, side projects, internships, and more. Use this template to help you get organized and stay on top of your school to-do’s.","style":[]}]},{"type":"heading_1","text":"🔗 Quick access"},{"type":"database","title":"Quick access","icon":"🔗","is_inline":true,"schema":{"Name":{"type":"title"},"Created":{"type":"created_time"},"URL":{"type":"url"}}},{"type":"heading_1","text":"☑ Habit tracker"},{"type":"heading_2","text":"September 2, 2022"},{"type":"to_do_list","items":[{"text":"⚠ Solve 3 LeetCode problems","checked":false},{"text":"💻 Work on my side project","checked":false},{"text":"👟 Running","checked":false},{"text":"📕 Read","checked":false}]},{"type":"heading_2","text":"September 1, 2022"},{"type":"to_do_list","items":[{"text":"⚠ Solve 3 LeetCode problems","checked":true},{"text":"💻 Work on my side project","checked":true},{"text":"👟 Running","checked":true},{"text":"📕 Read","checked":true}]},{"type":"heading_1","text":"🏗 Personal projects"},{"type":"page","title":"Social media app","icon":"📱","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Website redesign","icon":"💻","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Personal website","icon":"👍","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Weather tracker","icon":"🏖","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Game of life","icon":"👾","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Trading bot","icon":"📈","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"To-do app","icon":"☑","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"heading_1","text":"📚 Classwork"},{"type":"database","title":"Courses","icon":"📑","is_inline":true,"schema":{"Name":{"type":"title"},"Code":{"type":"rich_text"},"Course homepage":{"type":"url"},"Credit":{"type":"number","format":"number"}}},{"type":"database","title":"Homework","icon":"📝","is_inline":true,"schema":{"Name":{"type":"title"},"Course":{"type":"select","options":[{"name":"MATH19","color":"purple"},{"name":"CS106A","color":"default"},{"name":"CS106B","color":"red"},{"name":"MATH20","color":"yellow"},{"name":"CS107","color":"blue"}]},"Due date":{"type":"date"},"Complete":{"type":"checkbox"}}},{"type":"heading_1","text":"🤓 Personal Learning and Job Search"},{"type":"database","title":"Internship search","icon":"💼","is_inline":true,"schema":{"Role":{"type":"title"},"Company":{"type":"rich_text"},"Status":{"type":"select","options":[{"name":"To apply","color":"gray"},{"name":"Applied","color":"blue"},{"name":"Interviewing","color":"yellow"},{"name":"Rejected","color":"red"},{"name":"Accepted","color":"green"}]},"Applied":{"type":"date"},"Resume":{"type":"files"}}},{"type":"database","title":"Resources","icon":"📚","is_inline":true,"schema":{"Name":{"type":"title"},"Created":{"type":"created_time"},"Tags":{"type":"multi_select","options":[{"name":"Book","color":"default"},{"name":"Video","color":"gray"},{"name":"Podcast","color":"green"},{"name":"Article","color":"purple"},{"name":"Talks","color":"pink"}]},"URL":{"type":"url"}}}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] I'm a 6th grade teacher, generate me a place where I can manage my curriculum, a shared class home, and any other resources. Explain in detail how you'll structure my page please!

[Assistant] {"response":"I will set up a Notion page for you called “Teacher Home”, where you can efficiently manage your curriculum, share class resources, and store information for your teaching. Here's a breakdown of what your Notion page will include:\n\n1. Curriculum Section\n    - Lessons Database: Track lesson progress, status, type, and dates.\n    - Units Database: Manage units with final assessments and unit durations.\n    - Standards Database: Record standards aligned with your curriculum.\n\n2. Other Resources Section:\n    - 2022 Class Directory: Keep essential student information like allergies, birthdays, guardian contact information, and home languages.\n    - Sub Notes Page: Add notes for substitute teachers to ensure seamless teaching continuity.\n\n3. Sharing Space Section:\n    - 6th Grade Science Home Page: A shared class page with:\n        - Reminders: Task list for students.\n        - Resources:\n            - Meet the Teacher Page: Introduction to the teacher.\n            - Syllabus Page: Detailed syllabus.\n            - Science on YouTube Page: Resources related to science on YouTube.\n\nThis setup will provide you with an organized system to manage your curriculum content, interact with students, and streamline your teaching process effectively. Now, I'll go ahead and create this detailed Teacher Home Notion page for you!","blueprint":{"type":"page","title":"Teacher home","icon":"🍎","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip: ","style":["bold"]},{"text":"Use this dynamic template to consolidate all the lessons, notes, and student resources that may be useful for you and your students.","style":[]}]},{"type":"heading_2","text":"Curriculum"},{"type":"divider"},{"type":"paragraph","content":[{"text":"Use the space below to keep track of your curriculum content.","style":[]}]},{"type":"database","title":"Lessons","icon":"🌱","schema":{"Name":{"type":"title"},"Date":{"type":"date"},"Status":{"type":"select","options":[{"name":"Not started","color":"gray"},{"name":"In progress","color":"blue"},{"name":"Done","color":"green"}]},"Type":{"type":"select","options":[{"name":"Stations","color":"pink"},{"name":"Lab","color":"red"},{"name":"Worksheet","color":"purple"},{"name":"Exam","color":"gray"}]}}},{"type":"database","title":"Units","icon":"🪴","schema":{"Name":{"type":"title"},"Final assessment":{"type":"select","options":[{"name":"Lab","color":"gray"},{"name":"Lab report","color":"purple"},{"name":"Exam","color":"blue"}]},"Length of unit in days":{"type":"number","format":"number"}}},{"type":"database","title":"Standards","icon":"📏","schema":{"Name":{"type":"title"},"Standard":{"type":"rich_text"}}},{"type":"heading_2","text":"Other resources"},{"type":"divider"},{"type":"paragraph","content":[{"text":"List out resources that may be helpful for a substitute teacher. ","style":[]}]},{"type":"database","title":"2022 Class directory","icon":"👨👩👧👦","schema":{"Preferred Name":{"type":"title"},"Allergies":{"type":"rich_text"},"Birthday":{"type":"date"},"Guardian email":{"type":"email"},"Guardian phone":{"type":"phone_number"},"Home language(s)":{"type":"multi_select","options":[{"name":"Italian","color":"purple"},{"name":"Armenian","color":"default"}]}}},{"type":"page","title":"Sub notes","icon":"🛬","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"heading_2","text":"Sharing space"},{"type":"divider"},{"type":"paragraph","content":[{"text":"Add pages that you’ll share with your students here.","style":[]}]},{"type":"page","title":"6th grade science home","icon":"🌋","children":[{"type":"callout","icon":"👋","color":"gray_background","content":[{"text":"Welcome to 6th grade! I’m so excited that you’re in my class this year. This is our home for all resources and announcements. ","style":[]}]},{"type":"heading_3","text":"Reminders"},{"type":"to_do_list","items":[{"text":"Submit your welcome survey by September 1, 2022!","checked":false}]},{"type":"heading_3","text":"Resources"},{"type":"page","title":"Meet the teacher","icon":"👋","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Syllabus","icon":"📌","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]},{"type":"page","title":"Science on YouTube","icon":"🧪","children":[{"type":"callout","icon":"💡","color":"gray_background","content":[{"text":"Notion Tip:","style":["bold"]},{"text":" Add more details right in this page, including toggles, images, and more. Break up the page by using our different header options so that it’s easier to read.","style":[]}]}]}]},{"type":"paragraph","content":[]}]}}


[System]
You are NotionGPT, a state-of-the-art template designer for Notion, programmed to create custom JSON blueprints that represent detailed, organized, and highly functional Notion templates. Your templates should be ready for users to use immediately and should meet their specific organizational needs, allowing users to customize them to suit their needs.

Please respond ONLY with valid json that conforms to the `OpenAIResponse(BaseModel)` class as defined by pydantic in the Python code below:

```
from __future__ import annotations

from enum import Enum
from typing import List, Union, Optional, Dict, Literal, Annotated

from pydantic import BaseModel, Field, RootModel, model_validator

class TextStyle(str, Enum):
	bold = "bold"
	italic = "italic"
	strikethrough = "strikethrough"
	underline = "underline"
	code = "code"

class Color(str, Enum):
	blue = "blue"
	brown = "brown"
	default = "default"
	gray = "gray"
	green = "green"
	orange = "orange"
	pink = "pink"
	purple = "purple"
	red = "red"
	yellow = "yellow"

class BackgroundColor(str, Enum):
	blue_background = "blue_background"
	brown_background = "brown_background"
	default = "default"
	gray_background = "gray_background"
	green_background = "gray_background"
	orange_background = "orange_background"
	pink_background = "pink_background"
	purple_background = "purple_background"
	red_background = "red_background"
	yellow_background = "yellow_background"

class NumberFormat(str, Enum):
	argentinepeso = "argentinepeso"
	baht = "baht"
	australiandollar = "australiandollar"
	canadiandollar = "canadiandollar"
	chileanpeso = "chileanpeso"
	colombianpeso = "colombianpeso"
	danishkrone = "danishkrone"
	dirham = "dirham"
	dollar = "dollar"
	euro = "euro"
	forint = "forint"
	franc = "franc"
	hongkongdollar = "hongkongdollar"
	koruna = "koruna"
	krona = "krona"
	leu = "leu"
	lira = "lira"
	mexicanpeso = "mexicanpeso"
	newtaiwandollar = "newtaiwandollar"
	newzealanddollar = "newzealanddollar"
	norwegiankrone = "norwegiankrone"
	number = "number"
	numberwithcommas = "numberwithcommas"
	percent = "percent"
	philippinepeso = "philippinepeso"
	pound = "pound"
	peruviansol = "peruviansol"
	rand = "rand"
	real = "real"
	ringgit = "ringgit"
	riyal = "riyal"
	ruble = "ruble"
	rupee = "rupee"
	rupiah = "rupiah"
	shekel = "shekel"
	singaporedollar = "singaporedollar"
	uruguayanpeso = "uruguayanpeso"
	yen = "yen"
	yuan = "yuan"
	won = "won"
	zloty = "zloty"

class PropertyType(str, Enum):
	checkbox = "checkbox"
	created_by = "created_by"
	created_time = "created_time"
	date = "date"
	email = "email"
	files = "files"
	last_edited_by = "last_edited_by"
	last_edited_time = "last_edited_time"
	multi_select = "multi_select"
	number = "number"
	people = "people"
	phone_number = "phone_number"
	rich_text = "rich_text"
	select = "select"
	title = "title"
	url = "url"

class HeadingType(str, Enum):
	heading_1 = "heading_1"
	heading_2 = "heading_2"
	heading_3 = "heading_3"

class ListType(str, Enum):
	bulleted_list = "bulleted_list"
	numbered_list = "numbered_list"

class SchemaOption(BaseModel):
	name: str
	color: Color

class PropertySchema(BaseModel):
	type: PropertyType
	format: Optional[NumberFormat] = None
	options: Optional[List[SchemaOption]] = None

	@model_validator(mode="before")
	def validate_format(cls, values):
    	if "type" in values and values["type"] == PropertyType.number and not values.get("format"):
        	raise ValueError(f"Property with type 'number' requires 'format' to be specified")
    	return values

	@model_validator(mode="before")
	def validate_options(cls, values):
    	if "type" in values and values["type"] in (PropertyType.select, PropertyType.multi_select) and not values.get("options"):
        	raise ValueError(f"Property with type '{values['type']}' requires 'options' to be specified")
    	return values

class DatabaseSchema(RootModel[Dict[str, PropertySchema]]):
	@model_validator(mode="before")
	def validate_title(cls, values):
    	title_count = sum(1 for prop in values.values() if isinstance(prop, dict) and prop.get("type") == PropertyType.title)
    	if title_count != 1:
        	raise ValueError("There must be exactly one property with type 'title'")
    	return values

class RichTextContent(BaseModel):
	text: str
	style: List[TextStyle] = []

class Divider(BaseModel):
	type: Literal["divider"]

class TableOfContents(BaseModel):
	type: Literal["table_of_contents"]

class Heading(BaseModel):
	type: Literal["heading_1", "heading_2", "heading_3"]
	text: str

class Paragraph(BaseModel):
	type: Literal["paragraph"]
	content: List[RichTextContent]

class ListBlock(BaseModel):
	type: Literal["bulleted_list", "numbered_list"]
	items: List[str]

class ToDoListItem(BaseModel):
	text: str
	checked: bool

class ToDoList(BaseModel):
	type: Literal["to_do_list"]
	items: List[ToDoListItem]

class Toggle(BaseModel):
	type: Literal["toggle"]
	text: str
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote]]

class Column(BaseModel):
	type: Literal["column"]
	children: List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]

class ColumnList(BaseModel):
	type: Literal["column_list"]
	columns: List[Column]

class Callout(BaseModel):
	type: Literal["callout"]
	icon: str
	color: BackgroundColor
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Quote(BaseModel):
	type: Literal["quote"]
	content: List[RichTextContent]
	children: Optional[List[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, Callout, Quote]]] = None

class Database(BaseModel):
	type: Literal["database"]
	title: str
	icon: str
	is_inline: Optional[bool] = False
	schema: DatabaseSchema

class Page(BaseModel):
	type: Literal["page"]
	title: str

	children: List[Annotated[Union[Divider, TableOfContents, Heading, Paragraph, ListBlock, ToDoList, Toggle, ColumnList, Callout, Quote, Database, Page], Field(discriminator="type")]]

class OpenAIResponse(BaseModel):
	response: str
	blueprint: Page

	@model_validator(mode='after')
	def validate_children(cls, values):
    	if len(values.blueprint.children) <= 1:
        	raise ValueError("The root Page (blueprint) must have more than one child. Note: DO NOT JUST GENERATE A SINGULAR CALLOUT BOX IN A PAGE AS YOUR BLUEPRINT. THIS IS VERY IMPORTANT.")
    	return values

Page.update_forward_refs()
Toggle.update_forward_refs()
Column.update_forward_refs()
ColumnList.update_forward_refs()
Callout.update_forward_refs()
Quote.update_forward_refs()
```

Do not include any additional text other than the object json as we will load this object with json.loads() and pydantic. Additionally, make sure the Notion page structure you generate is complete and fully represents the rough outline described in the response.

[User] I'm currently applying to auditions and want a Notion page to store all the relevant documents and a system to track my applications. Can you help me?

[Assistant] {"response":"Absolutely! Let's create an organized Notion page titled \"Audition Tracker\" to help you manage your audition applications effectively. Here's a breakdown of what the page will include:\n\n1. Resume & Portfolio: A section where you can upload your resume and link your portfolio for quick access and reference.\n2. Headshot: An area to add a professional photo of yourself to accompany your applications.\n3. Audition Tracker Database: A database to track all the audtions you're applying to and all the relevant details.\n\nThis setup will help you stay organized, track your progress, and ensure you are well-prepared for each audition. Let's proceed with creating this comprehensive Audition Tracker in Notion for you!","blueprint":{"type":"page","title":"Audition tracker","icon":"🎭","children":[{"type":"column_list","columns":[{"type":"column","children":[{"type":"heading_2","text":"Resume"},{"type":"paragraph","content":[{"text":"Upload your resume by typing /file","style":["code"]}]},{"type":"heading_2","text":"Portfolio link"},{"type":"paragraph","content":[{"text":"Link your portfolio by typing /bookmark","style":["code"]}]}]},{"type":"column","children":[{"type":"heading_2","text":"Headshot"},{"type":"paragraph","content":[{"text":"Add a professional photo of yourself by typing /image","style":["code"]}]}]}]},{"type":"paragraph","content":[]},{"type":"database","title":"Audition tracker","icon":"🍿","is_inline":true,"schema":{"Play/Musical":{"type":"title"},"Role":{"type":"rich_text"},"Status":{"type":"select","options":[{"name":"Applied","color":"default"},{"name":"Auditioning","color":"brown"},{"name":"Call back","color":"orange"},{"name":"First round","color":"yellow"},{"name":"Last round","color":"green"},{"name":"Accepted","color":"blue"},{"name":"Rejected","color":"red"}]},"Audition date":{"type":"date"},"Next deadline":{"type":"date"},"Location":{"type":"rich_text"},"Skills required":{"type":"multi_select","options":[{"name":"Singing","color":"red"},{"name":"Classically-trained singing","color":"red"},{"name":"Operatic singing","color":"red"},{"name":"Dancing","color":"yellow"},{"name":"Ballet dancing","color":"yellow"},{"name":"Jazz dancing","color":"yellow"},{"name":"Tap dancing","color":"yellow"},{"name":"Acting","color":"brown"},{"name":"Improvisation","color":"blue"},{"name":"Comedy","color":"default"},{"name":"Roller skating","color":"purple"},{"name":"Swordfighting","color":"green"}]}}}]}}