diff --git a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/1. Hello world.canvas b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/1. Hello world.canvas index 4f3ec8f..bd76b40 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/1. Hello world.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/1. Hello world.canvas @@ -1 +1,15 @@ -{"nodes":[{"type":"group","id":"161279baf7763214","x":-174,"y":-160,"width":394,"height":340,"label":"Cannoli"},{"type":"text","text":"Hello world!","id":"dc3f9351f787531e","x":-97,"y":-91,"width":250,"height":60},{"type":"text","text":"","id":"bc1a550bbb4aac7b","x":-97,"y":60,"width":250,"height":60,"color":"6"},{"type":"text","text":"The purple node is a content node. Content nodes can be used to store and display text that can be read or written by you or another node.","id":"f77169b141243e65","x":240,"y":30,"width":420,"height":120},{"type":"text","text":"The colorless, green, or yellow node is an AI node. AI nodes make a chat completion call to the LLM with the text of the node as a user message.","id":"0af5a453bd4d6ec9","x":240,"y":-110,"width":380,"height":120},{"type":"text","text":"If a node in a cannoli is floating (no arrows attached) it won't affect the cannoli unless it is formatted in a special way we'll go over later.","id":"7d005c80299f3674","x":-202,"y":220,"width":461,"height":112},{"type":"text","text":"This is a Cannoli. It's made up of different types of nodes and arrows.\n\nTry running it by clicking the Cannoli button in the control ribbon on the left side of your Obsidian window.","id":"24dd96c964700992","x":-147,"y":-400,"width":350,"height":180},{"type":"text","text":"Cannolis can be run in several ways:\n\n- Click the Cannoli ribbon icon\n - If you're on a canvas file, it will be run as a cannoli\n - If you're on a note with a \"cannoli\" property, the canvas file in that property will be run as a cannoli\n- Run the \"Start/Stop cannoli\" command in the command palette (functions the same as the ribbon icon)\n- If a canvas file name ends with \".cno\", it will have its own run command in the command palette\n- Make an audio recording on a note with a \"cannoli\" property\n\t- That recording will be transcribed, replace the reference, and trigger the cannoli defined in the property.","id":"927cf33512b0dfc1","x":-740,"y":-182,"width":538,"height":402}],"edges":[{"id":"23c2d7dffb49bf75","fromNode":"dc3f9351f787531e","fromSide":"bottom","toNode":"bc1a550bbb4aac7b","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"161279baf7763214","x":-174,"y":-160,"width":394,"height":340,"label":"Cannoli"}, + {"type":"text","text":"Hello world!","id":"dc3f9351f787531e","x":-97,"y":-91,"width":250,"height":60}, + {"type":"text","text":"","id":"bc1a550bbb4aac7b","x":-97,"y":60,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"The purple node is a content node. Content nodes can be used to store and display text that can be read or written by you or another node.","id":"f77169b141243e65","x":240,"y":30,"width":420,"height":120}, + {"type":"text","text":"The colorless, green, or yellow node is an AI node. AI nodes make a chat completion call to the LLM with the text of the node as a user message.","id":"0af5a453bd4d6ec9","x":240,"y":-110,"width":380,"height":120}, + {"type":"text","text":"If a node in a cannoli is floating (no arrows attached) it won't affect the cannoli unless it is formatted in a special way we'll go over later.","id":"7d005c80299f3674","x":-202,"y":220,"width":461,"height":112}, + {"type":"text","text":"This is a Cannoli. It's made up of different types of nodes and arrows.\n\nTry running it by clicking the Cannoli button in the control ribbon on the left side of your Obsidian window.","id":"24dd96c964700992","x":-147,"y":-400,"width":350,"height":180}, + {"type":"text","text":"Cannolis can be run in several ways:\n\n- Click the Cannoli ribbon icon\n - If you're on a canvas file, it will be run as a cannoli\n - If you're on a note with a \"cannoli\" property, the canvas file in that property will be run as a cannoli\n- Run the \"Start/Stop cannoli\" command in the command palette (functions the same as the ribbon icon)\n- If a canvas file name ends with \".cno\", it will have its own run command in the command palette\n- Make an audio recording on a note with a \"cannoli\" property\n\t- That recording will be transcribed, replace the reference, and trigger the cannoli defined in the property.","id":"927cf33512b0dfc1","x":-740,"y":-182,"width":538,"height":402} + ], + "edges":[ + {"id":"23c2d7dffb49bf75","fromNode":"dc3f9351f787531e","fromSide":"bottom","toNode":"bc1a550bbb4aac7b","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/2. Blank arrows.canvas b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/2. Blank arrows.canvas index 4538d2a..3d32072 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/2. Blank arrows.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/2. Blank arrows.canvas @@ -1 +1,18 @@ -{"nodes":[{"type":"group","id":"e77c462deb61200c","x":-200,"y":-240,"width":360,"height":600,"label":"Blank Arrows"},{"type":"text","text":"This first arrow is going from an AI node to another AI node, so it will pass the chat history along.","id":"ab7c414710f7f130","x":-478,"y":-160,"width":268,"height":135},{"type":"text","text":"The third arrow is going from a content node to a content node, so it will just copy its content.","id":"ccd789ee75f32cfa","x":-513,"y":191,"width":303,"height":102},{"type":"text","text":"This is the second user message, after an LLM response","id":"78cc7edc0acf7754","x":-145,"y":-39,"width":250,"height":110},{"type":"text","text":"This is the first user message","id":"f20327851c3175bd","x":-145,"y":-190,"width":250,"height":60},{"type":"text","text":"","id":"ffdc926f780c7c6f","x":-145,"y":131,"width":250,"height":60,"color":"6"},{"type":"text","text":"","id":"2a451cf329dad9eb","x":-145,"y":260,"width":250,"height":60,"color":"6"},{"type":"text","text":"The second arrow is going to a content node, so it will just pass the content of the LLM's response along.","id":"69c75646befb238b","x":170,"y":49,"width":344,"height":112},{"type":"text","text":"Arrows behave differently depending on their color, their label, and the type of their source and target (the node they are coming from and the node they point to).","id":"7f3c629307341974","x":-210,"y":-440,"width":380,"height":130}],"edges":[{"id":"3e2d98fc5ddeb168","fromNode":"78cc7edc0acf7754","fromSide":"bottom","toNode":"ffdc926f780c7c6f","toSide":"top"},{"id":"321db5e7d72b0151","fromNode":"ffdc926f780c7c6f","fromSide":"bottom","toNode":"2a451cf329dad9eb","toSide":"top"},{"id":"d08c98406e290f66","fromNode":"f20327851c3175bd","fromSide":"bottom","toNode":"78cc7edc0acf7754","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"e77c462deb61200c","x":-200,"y":-240,"width":360,"height":600,"label":"Blank Arrows"}, + {"type":"text","text":"This first arrow is going from an AI node to another AI node, so it will pass the chat history along.","id":"ab7c414710f7f130","x":-478,"y":-160,"width":268,"height":135}, + {"type":"text","text":"The third arrow is going from a content node to a content node, so it will just copy its content.","id":"ccd789ee75f32cfa","x":-513,"y":191,"width":303,"height":102}, + {"type":"text","text":"This is the second user message, after an LLM response","id":"78cc7edc0acf7754","x":-145,"y":-39,"width":250,"height":110}, + {"type":"text","text":"This is the first user message","id":"f20327851c3175bd","x":-145,"y":-190,"width":250,"height":60}, + {"type":"text","text":"","id":"ffdc926f780c7c6f","x":-145,"y":131,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"","id":"2a451cf329dad9eb","x":-145,"y":260,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"The second arrow is going to a content node, so it will just pass the content of the LLM's response along.","id":"69c75646befb238b","x":170,"y":49,"width":344,"height":112}, + {"type":"text","text":"Arrows behave differently depending on their color, their label, and the type of their source and target (the node they are coming from and the node they point to).","id":"7f3c629307341974","x":-210,"y":-440,"width":380,"height":130} + ], + "edges":[ + {"id":"3e2d98fc5ddeb168","fromNode":"78cc7edc0acf7754","fromSide":"bottom","toNode":"ffdc926f780c7c6f","toSide":"top"}, + {"id":"321db5e7d72b0151","fromNode":"ffdc926f780c7c6f","fromSide":"bottom","toNode":"2a451cf329dad9eb","toSide":"top"}, + {"id":"d08c98406e290f66","fromNode":"f20327851c3175bd","fromSide":"bottom","toNode":"78cc7edc0acf7754","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/3. Branching.canvas b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/3. Branching.canvas index d8aeb37..4b183a2 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/3. Branching.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/3. Branching.canvas @@ -1 +1,31 @@ -{"nodes":[{"type":"group","id":"7c382706de4d0696","x":-160,"y":-409,"width":695,"height":770,"label":"Multiple outgoing arrows"},{"type":"group","id":"5a24d53646b10364","x":-132,"y":480,"width":640,"height":480,"label":"Branching chats"},{"type":"text","text":"In this case, we are sending the output of each AI node to a content node as well as another AI node.\n\nThis shows us the LLM's response to each user message.","id":"a920f9e049043602","x":-460,"y":-228,"width":280,"height":240},{"type":"text","text":"","id":"69ab78708b319e8d","x":140,"y":-329,"width":340,"height":110,"color":"6"},{"type":"text","text":"","id":"c096758e55238bfe","x":175,"y":-178,"width":340,"height":250,"color":"6"},{"type":"text","text":"What's the best Italian dessert?","id":"7b37496e496da827","x":-137,"y":-359,"width":250,"height":60},{"type":"text","text":"How do you make it?","id":"aea9dcb543944bb1","x":-137,"y":-189,"width":250,"height":60},{"type":"text","text":"Give me a simpler recipe","id":"2f59408c2be9b7ae","x":-137,"y":12,"width":250,"height":60},{"type":"text","text":"","id":"ddb05069cb9f6f3e","x":113,"y":137,"width":390,"height":190,"color":"6"},{"type":"text","text":"Nodes can have multiple arrows coming out of them. They can carry information to different kinds of nodes.","id":"6d316338bfce7b20","x":28,"y":-580,"width":340,"height":100},{"type":"text","text":"Nf3","id":"248594446ba6eca2","x":-97,"y":691,"width":250,"height":60},{"type":"text","text":"Lets play chess. Here's my first move: e4","id":"891f6d7945759cd7","x":69,"y":500,"width":250,"height":60},{"type":"text","text":"Nc3","id":"5d4454ca8f7bdb3a","x":228,"y":691,"width":250,"height":60},{"type":"text","text":"","id":"3492caf4ead7f8cb","x":-107,"y":853,"width":260,"height":78,"color":"6"},{"type":"text","text":"","id":"9f9ba5852d437657","x":228,"y":853,"width":254,"height":78,"color":"6"},{"type":"text","text":"We can also use multiple outgoing arrows to create different branches of a chat","id":"5347076c683c8346","x":-392,"y":680,"width":255,"height":104}],"edges":[{"id":"d8d4ab1340924892","fromNode":"2f59408c2be9b7ae","fromSide":"bottom","toNode":"ddb05069cb9f6f3e","toSide":"left"},{"id":"806865b0c75a6687","fromNode":"aea9dcb543944bb1","fromSide":"bottom","toNode":"2f59408c2be9b7ae","toSide":"top"},{"id":"44a20edc995a84d8","fromNode":"aea9dcb543944bb1","fromSide":"bottom","toNode":"c096758e55238bfe","toSide":"left"},{"id":"b59766f15e6812d8","fromNode":"7b37496e496da827","fromSide":"bottom","toNode":"aea9dcb543944bb1","toSide":"top"},{"id":"8fd655a2583e6f98","fromNode":"7b37496e496da827","fromSide":"bottom","toNode":"69ab78708b319e8d","toSide":"left"},{"id":"7d1bb4c2b5052c34","fromNode":"891f6d7945759cd7","fromSide":"bottom","toNode":"248594446ba6eca2","toSide":"top"},{"id":"bc0b97379618ae28","fromNode":"891f6d7945759cd7","fromSide":"bottom","toNode":"5d4454ca8f7bdb3a","toSide":"top"},{"id":"08fda0370caa615e","fromNode":"248594446ba6eca2","fromSide":"bottom","toNode":"3492caf4ead7f8cb","toSide":"top"},{"id":"e1a68493483394b4","fromNode":"5d4454ca8f7bdb3a","fromSide":"bottom","toNode":"9f9ba5852d437657","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"7c382706de4d0696","x":-160,"y":-409,"width":695,"height":770,"label":"Multiple outgoing arrows"}, + {"type":"group","id":"5a24d53646b10364","x":-132,"y":480,"width":640,"height":480,"label":"Branching chats"}, + {"type":"text","text":"In this case, we are sending the output of each AI node to a content node as well as another AI node.\n\nThis shows us the LLM's response to each user message.","id":"a920f9e049043602","x":-460,"y":-228,"width":280,"height":240}, + {"type":"text","text":"","id":"69ab78708b319e8d","x":140,"y":-329,"width":340,"height":110,"color":"6"}, + {"type":"text","text":"","id":"c096758e55238bfe","x":175,"y":-178,"width":340,"height":250,"color":"6"}, + {"type":"text","text":"What's the best Italian dessert?","id":"7b37496e496da827","x":-137,"y":-359,"width":250,"height":60}, + {"type":"text","text":"How do you make it?","id":"aea9dcb543944bb1","x":-137,"y":-189,"width":250,"height":60}, + {"type":"text","text":"Give me a simpler recipe","id":"2f59408c2be9b7ae","x":-137,"y":12,"width":250,"height":60}, + {"type":"text","text":"","id":"ddb05069cb9f6f3e","x":113,"y":137,"width":390,"height":190,"color":"6"}, + {"type":"text","text":"Nodes can have multiple arrows coming out of them. They can carry information to different kinds of nodes.","id":"6d316338bfce7b20","x":28,"y":-580,"width":340,"height":100}, + {"type":"text","text":"Nf3","id":"248594446ba6eca2","x":-97,"y":691,"width":250,"height":60}, + {"type":"text","text":"Lets play chess. Here's my first move: e4","id":"891f6d7945759cd7","x":69,"y":500,"width":250,"height":60}, + {"type":"text","text":"Nc3","id":"5d4454ca8f7bdb3a","x":228,"y":691,"width":250,"height":60}, + {"type":"text","text":"","id":"3492caf4ead7f8cb","x":-107,"y":853,"width":260,"height":78,"color":"6"}, + {"type":"text","text":"","id":"9f9ba5852d437657","x":228,"y":853,"width":254,"height":78,"color":"6"}, + {"type":"text","text":"We can also use multiple outgoing arrows to create different branches of a chat","id":"5347076c683c8346","x":-392,"y":680,"width":255,"height":104} + ], + "edges":[ + {"id":"d8d4ab1340924892","fromNode":"2f59408c2be9b7ae","fromSide":"bottom","toNode":"ddb05069cb9f6f3e","toSide":"left"}, + {"id":"806865b0c75a6687","fromNode":"aea9dcb543944bb1","fromSide":"bottom","toNode":"2f59408c2be9b7ae","toSide":"top"}, + {"id":"44a20edc995a84d8","fromNode":"aea9dcb543944bb1","fromSide":"bottom","toNode":"c096758e55238bfe","toSide":"left"}, + {"id":"b59766f15e6812d8","fromNode":"7b37496e496da827","fromSide":"bottom","toNode":"aea9dcb543944bb1","toSide":"top"}, + {"id":"8fd655a2583e6f98","fromNode":"7b37496e496da827","fromSide":"bottom","toNode":"69ab78708b319e8d","toSide":"left"}, + {"id":"7d1bb4c2b5052c34","fromNode":"891f6d7945759cd7","fromSide":"bottom","toNode":"248594446ba6eca2","toSide":"top"}, + {"id":"bc0b97379618ae28","fromNode":"891f6d7945759cd7","fromSide":"bottom","toNode":"5d4454ca8f7bdb3a","toSide":"top"}, + {"id":"08fda0370caa615e","fromNode":"248594446ba6eca2","fromSide":"bottom","toNode":"3492caf4ead7f8cb","toSide":"top"}, + {"id":"e1a68493483394b4","fromNode":"5d4454ca8f7bdb3a","fromSide":"bottom","toNode":"9f9ba5852d437657","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/4. System messages.canvas b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/4. System messages.canvas index f106c74..e3cb2ab 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/4. System messages.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/4. System messages.canvas @@ -1 +1,22 @@ -{"nodes":[{"type":"group","id":"9a74aa8d0afdb942","x":-334,"y":-395,"width":669,"height":790,"label":"System Messages"},{"type":"text","text":"You are a silly goofy guy","id":"d005ba1be8656e6e","x":-314,"y":-205,"width":250,"height":60,"color":"6"},{"type":"text","text":"Hey what's a fun outing","id":"2c1e68fdaf20b936","x":-314,"y":-25,"width":250,"height":60},{"type":"text","text":"","id":"606e8b604062817a","x":-314,"y":111,"width":250,"height":154,"color":"6"},{"type":"text","text":"","id":"d0edacf3895cacc4","x":65,"y":-95,"width":250,"height":155,"color":"6"},{"type":"text","text":"Respond with a description of a very confused AI assistant that can't keep it together. Nothing else should be in your response. It should start with: \"you are a...\"","id":"59b7fc9dda9a50c1","x":65,"y":-375,"width":250,"height":232},{"type":"text","text":"This AI node will include the above content node text as a system message.","id":"4b95de6b15e52400","x":-620,"y":-45,"width":260,"height":125},{"type":"text","text":"Here we're using an AI node to generate a system message.","id":"9f14bc97186eabc0","x":360,"y":-143,"width":260,"height":98},{"type":"text","text":"Blank arrows going from content nodes to AI nodes will pass their content as a system message. System messages are used to give instructions on how the LLM should respond to user messages.","id":"225fa9e654db31d6","x":-189,"y":-620,"width":414,"height":157},{"type":"text","text":"","id":"661a61495dfeaf24","x":65,"y":218,"width":250,"height":157,"color":"6"},{"type":"text","text":"Who invented mail?","id":"b8465e3c0926341e","x":65,"y":111,"width":250,"height":60}],"edges":[{"id":"4cfad5a8ec2be98f","fromNode":"d005ba1be8656e6e","fromSide":"bottom","toNode":"2c1e68fdaf20b936","toSide":"top"},{"id":"2a357972e7682b3d","fromNode":"2c1e68fdaf20b936","fromSide":"bottom","toNode":"606e8b604062817a","toSide":"top"},{"id":"c19d63a0e7873549","fromNode":"d0edacf3895cacc4","fromSide":"bottom","toNode":"b8465e3c0926341e","toSide":"top"},{"id":"04fc452e98f4b80f","fromNode":"59b7fc9dda9a50c1","fromSide":"bottom","toNode":"d0edacf3895cacc4","toSide":"top"},{"id":"ff5fd1f32d515a9f","fromNode":"b8465e3c0926341e","fromSide":"bottom","toNode":"661a61495dfeaf24","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"9a74aa8d0afdb942","x":-334,"y":-395,"width":669,"height":790,"label":"System Messages"}, + {"type":"text","text":"You are a silly goofy guy","id":"d005ba1be8656e6e","x":-314,"y":-205,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"Hey what's a fun outing","id":"2c1e68fdaf20b936","x":-314,"y":-25,"width":250,"height":60}, + {"type":"text","text":"","id":"606e8b604062817a","x":-314,"y":111,"width":250,"height":154,"color":"6"}, + {"type":"text","text":"","id":"d0edacf3895cacc4","x":65,"y":-95,"width":250,"height":155,"color":"6"}, + {"type":"text","text":"Respond with a description of a very confused AI assistant that can't keep it together. Nothing else should be in your response. It should start with: \"you are a...\"","id":"59b7fc9dda9a50c1","x":65,"y":-375,"width":250,"height":232}, + {"type":"text","text":"This AI node will include the above content node text as a system message.","id":"4b95de6b15e52400","x":-620,"y":-45,"width":260,"height":125}, + {"type":"text","text":"Here we're using an AI node to generate a system message.","id":"9f14bc97186eabc0","x":360,"y":-143,"width":260,"height":98}, + {"type":"text","text":"Blank arrows going from content nodes to AI nodes will pass their content as a system message. System messages are used to give instructions on how the LLM should respond to user messages.","id":"225fa9e654db31d6","x":-189,"y":-620,"width":414,"height":157}, + {"type":"text","text":"","id":"661a61495dfeaf24","x":65,"y":218,"width":250,"height":157,"color":"6"}, + {"type":"text","text":"Who invented mail?","id":"b8465e3c0926341e","x":65,"y":111,"width":250,"height":60} + ], + "edges":[ + {"id":"4cfad5a8ec2be98f","fromNode":"d005ba1be8656e6e","fromSide":"bottom","toNode":"2c1e68fdaf20b936","toSide":"top"}, + {"id":"2a357972e7682b3d","fromNode":"2c1e68fdaf20b936","fromSide":"bottom","toNode":"606e8b604062817a","toSide":"top"}, + {"id":"c19d63a0e7873549","fromNode":"d0edacf3895cacc4","fromSide":"bottom","toNode":"b8465e3c0926341e","toSide":"top"}, + {"id":"04fc452e98f4b80f","fromNode":"59b7fc9dda9a50c1","fromSide":"bottom","toNode":"d0edacf3895cacc4","toSide":"top"}, + {"id":"ff5fd1f32d515a9f","fromNode":"b8465e3c0926341e","fromSide":"bottom","toNode":"661a61495dfeaf24","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/5. Variable arrows.canvas b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/5. Variable arrows.canvas index 2755182..675aa67 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/1. Basics/5. Variable arrows.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/1. Basics/5. Variable arrows.canvas @@ -1 +1,36 @@ -{"nodes":[{"type":"group","id":"4dd63eded63256f2","x":-172,"y":240,"width":665,"height":460,"label":"Multiple variables"},{"type":"group","id":"d83444fe5b49fb2c","x":-160,"y":800,"width":653,"height":463,"label":"Between call nodes"},{"type":"group","id":"c409a28317a5ae26","x":11,"y":-360,"width":294,"height":510,"label":"Variables"},{"type":"text","text":"Pannetone","id":"0d48f7722e5db52e","x":31,"y":-340,"width":250,"height":60,"color":"6"},{"type":"text","text":"The label of the arrow names the variable, and you can inject it into an AI node using the format \"{{variable name}}\"","id":"1a3b5db348375dba","x":-380,"y":-199,"width":371,"height":119},{"type":"text","text":"How do you make {{dessert}}?","id":"10cedae5ccf81664","x":31,"y":-180,"width":250,"height":60},{"type":"text","text":"","id":"5cf958d72a55d52d","x":32,"y":-24,"width":250,"height":154,"color":"6"},{"type":"text","text":"Labeling an arrow makes it a variable you can access in AI nodes.","id":"db8924f8ddaaa08e","x":-13,"y":-520,"width":330,"height":86},{"type":"text","text":"Hannibal","id":"b2aa8b695a7b7774","x":-152,"y":260,"width":250,"height":60,"color":"6"},{"type":"text","text":"Elephants","id":"c23271f22630c4a9","x":223,"y":260,"width":250,"height":60,"color":"6"},{"type":"text","text":"What connects {{a}} and {{b}}?","id":"4f84654825f9df4c","x":34,"y":420,"width":293,"height":75},{"type":"text","text":"You can name and inject the output of AI nodes the same way.","id":"835c4e523796df6e","x":-500,"y":915,"width":320,"height":80},{"type":"text","text":"Rate this limerick:\n{{limerick}}","id":"25d842fe884f4e78","x":-140,"y":995,"width":250,"height":60},{"type":"text","text":"Respond with a limerick about Cannolis","id":"1714bc9f52099a91","x":-140,"y":820,"width":250,"height":60},{"type":"text","text":"","id":"84fb2c8243704c1a","x":55,"y":550,"width":250,"height":130,"color":"6"},{"type":"text","text":"","id":"13cde1cb12272304","x":-140,"y":1110,"width":250,"height":133,"color":"6"},{"type":"text","text":"Are you sure its {{city}}?","id":"fe8260fd047fe01a","x":192,"y":996,"width":250,"height":60},{"type":"text","text":"","id":"26d4da45eb95d333","x":192,"y":1110,"width":250,"height":133,"color":"6"},{"type":"text","text":"What's the capital of Italy?","id":"44d0ee25c2f23e66","x":192,"y":820,"width":250,"height":60},{"type":"text","text":"Multiple arrows going into an AI node can be used to inject multiple variables.","id":"0fd0a4b39c942f0b","x":-426,"y":399,"width":246,"height":117},{"type":"text","text":"Labeled basic arrows between AI nodes will not pass along the chat history by default, only the content of the response.\n\nYou can override this by adding a \"|\" symbol at the end of the arrow label like so. Then you can continue a conversation as well as use a variable.","id":"1fadbba4649fa725","x":520,"y":955,"width":380,"height":245}],"edges":[{"id":"139dad9317421572","fromNode":"0d48f7722e5db52e","fromSide":"bottom","toNode":"10cedae5ccf81664","toSide":"top","label":"dessert"},{"id":"fa1b26557addc3e5","fromNode":"b2aa8b695a7b7774","fromSide":"bottom","toNode":"4f84654825f9df4c","toSide":"top","label":"a"},{"id":"ece89fb689451485","fromNode":"c23271f22630c4a9","fromSide":"bottom","toNode":"4f84654825f9df4c","toSide":"top","label":"b"},{"id":"b9eadfcbf2c54fe1","fromNode":"10cedae5ccf81664","fromSide":"bottom","toNode":"5cf958d72a55d52d","toSide":"top"},{"id":"3a41dc5849268edf","fromNode":"4f84654825f9df4c","fromSide":"bottom","toNode":"84fb2c8243704c1a","toSide":"top"},{"id":"7cf5bbc070866504","fromNode":"25d842fe884f4e78","fromSide":"bottom","toNode":"13cde1cb12272304","toSide":"top"},{"id":"3b347865a761d32b","fromNode":"1714bc9f52099a91","fromSide":"bottom","toNode":"25d842fe884f4e78","toSide":"top","label":"limerick"},{"id":"f93a6b2b699a1bf6","fromNode":"44d0ee25c2f23e66","fromSide":"bottom","toNode":"fe8260fd047fe01a","toSide":"top","label":"city|"},{"id":"0fa4378c8752aca4","fromNode":"fe8260fd047fe01a","fromSide":"bottom","toNode":"26d4da45eb95d333","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"4dd63eded63256f2","x":-172,"y":240,"width":665,"height":460,"label":"Multiple variables"}, + {"type":"group","id":"d83444fe5b49fb2c","x":-160,"y":800,"width":653,"height":463,"label":"Between call nodes"}, + {"type":"group","id":"c409a28317a5ae26","x":11,"y":-360,"width":294,"height":510,"label":"Variables"}, + {"type":"text","text":"Pannetone","id":"0d48f7722e5db52e","x":31,"y":-340,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"The label of the arrow names the variable, and you can inject it into an AI node using the format \"{{variable name}}\"","id":"1a3b5db348375dba","x":-380,"y":-199,"width":371,"height":119}, + {"type":"text","text":"How do you make {{dessert}}?","id":"10cedae5ccf81664","x":31,"y":-180,"width":250,"height":60}, + {"type":"text","text":"","id":"5cf958d72a55d52d","x":32,"y":-24,"width":250,"height":154,"color":"6"}, + {"type":"text","text":"Labeling an arrow makes it a variable you can access in AI nodes.","id":"db8924f8ddaaa08e","x":-13,"y":-520,"width":330,"height":86}, + {"type":"text","text":"Hannibal","id":"b2aa8b695a7b7774","x":-152,"y":260,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"Elephants","id":"c23271f22630c4a9","x":223,"y":260,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"What connects {{a}} and {{b}}?","id":"4f84654825f9df4c","x":34,"y":420,"width":293,"height":75}, + {"type":"text","text":"You can name and inject the output of AI nodes the same way.","id":"835c4e523796df6e","x":-500,"y":915,"width":320,"height":80}, + {"type":"text","text":"Rate this limerick:\n{{limerick}}","id":"25d842fe884f4e78","x":-140,"y":995,"width":250,"height":60}, + {"type":"text","text":"Respond with a limerick about Cannolis","id":"1714bc9f52099a91","x":-140,"y":820,"width":250,"height":60}, + {"type":"text","text":"","id":"84fb2c8243704c1a","x":55,"y":550,"width":250,"height":130,"color":"6"}, + {"type":"text","text":"","id":"13cde1cb12272304","x":-140,"y":1110,"width":250,"height":133,"color":"6"}, + {"type":"text","text":"Are you sure its {{city}}?","id":"fe8260fd047fe01a","x":192,"y":996,"width":250,"height":60}, + {"type":"text","text":"","id":"26d4da45eb95d333","x":192,"y":1110,"width":250,"height":133,"color":"6"}, + {"type":"text","text":"What's the capital of Italy?","id":"44d0ee25c2f23e66","x":192,"y":820,"width":250,"height":60}, + {"type":"text","text":"Multiple arrows going into an AI node can be used to inject multiple variables.","id":"0fd0a4b39c942f0b","x":-426,"y":399,"width":246,"height":117}, + {"type":"text","text":"Labeled basic arrows between AI nodes will not pass along the chat history by default, only the content of the response.\n\nYou can override this by adding a \"|\" symbol at the end of the arrow label like so. Then you can continue a conversation as well as use a variable.","id":"1fadbba4649fa725","x":520,"y":955,"width":380,"height":245} + ], + "edges":[ + {"id":"139dad9317421572","fromNode":"0d48f7722e5db52e","fromSide":"bottom","toNode":"10cedae5ccf81664","toSide":"top","label":"dessert"}, + {"id":"fa1b26557addc3e5","fromNode":"b2aa8b695a7b7774","fromSide":"bottom","toNode":"4f84654825f9df4c","toSide":"top","label":"a"}, + {"id":"ece89fb689451485","fromNode":"c23271f22630c4a9","fromSide":"bottom","toNode":"4f84654825f9df4c","toSide":"top","label":"b"}, + {"id":"b9eadfcbf2c54fe1","fromNode":"10cedae5ccf81664","fromSide":"bottom","toNode":"5cf958d72a55d52d","toSide":"top"}, + {"id":"3a41dc5849268edf","fromNode":"4f84654825f9df4c","fromSide":"bottom","toNode":"84fb2c8243704c1a","toSide":"top"}, + {"id":"7cf5bbc070866504","fromNode":"25d842fe884f4e78","fromSide":"bottom","toNode":"13cde1cb12272304","toSide":"top"}, + {"id":"3b347865a761d32b","fromNode":"1714bc9f52099a91","fromSide":"bottom","toNode":"25d842fe884f4e78","toSide":"top","label":"limerick"}, + {"id":"f93a6b2b699a1bf6","fromNode":"44d0ee25c2f23e66","fromSide":"bottom","toNode":"fe8260fd047fe01a","toSide":"top","label":"city|"}, + {"id":"0fa4378c8752aca4","fromNode":"fe8260fd047fe01a","fromSide":"bottom","toNode":"26d4da45eb95d333","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/1. Config arrows.canvas b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/1. Config arrows.canvas index b4a9916..988ea7e 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/1. Config arrows.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/1. Config arrows.canvas @@ -1 +1,28 @@ -{"nodes":[{"type":"group","id":"b388b74fc76f9d5b","x":-411,"y":420,"width":800,"height":480,"label":"Config Arrows"},{"type":"group","id":"50e47210c3597f2c","x":-382,"y":-274,"width":742,"height":442,"label":"Logging Arrows"},{"type":"text","text":"What's the weakest?","id":"01b6cd0557436d0d","x":-362,"y":77,"width":250,"height":60},{"type":"text","text":"You're an expert in metallurgy","id":"cd8bccad9c0ff0e1","x":-362,"y":-254,"width":250,"height":60,"color":"6"},{"type":"text","text":"What's the strongest metal?","id":"d90d1eda5b1cee39","x":-362,"y":-94,"width":250,"height":60},{"type":"text","text":"The logging arrow will write the chat history, response, and config of the AI node to the content node it is pointing to.","id":"82607dbca24bcc3b","x":-720,"y":48,"width":325,"height":120},{"type":"text","text":"As a cannoli gets more complex, it can be difficult to know what the LLM is actually seeing in each AI node.\n\nA blank config arrow leaving a AI node will log out everything the LLM saw on that request, as well as the config of that AI node.","id":"2eddfb2df05ffd92","x":-932,"y":-224,"width":537,"height":160},{"type":"text","text":"Orange arrows are config arrows. You can change the color of arrows by left clicking on them and then clicking on the color pallet ","id":"f1b3951087221764","x":-160,"y":-440,"width":393,"height":118},{"type":"text","text":"","id":"18629c0795e99c52","x":-28,"y":-158,"width":365,"height":295,"color":"6"},{"type":"text","text":"Labeled config arrows pointing to AI nodes will try to set their content to the LLM config setting named in the arrow's label.","id":"9750898ccab8b2ec","x":-190,"y":240,"width":325,"height":130},{"type":"text","text":"1.5","id":"f2066662ccfdf12b","x":-228,"y":450,"width":106,"height":68,"color":"6"},{"type":"text","text":"When will gpt-5 come out?","id":"901e534d654dbe8d","x":-285,"y":640,"width":250,"height":60},{"type":"text","text":"gpt-4","id":"32895b9cbe65ebf5","x":-385,"y":450,"width":100,"height":60,"color":"6"},{"type":"text","text":"","id":"f9768071dcaaf641","x":24,"y":445,"width":345,"height":415,"color":"6"},{"type":"text","text":"Config arrows can also be used to set the LLM config of AI nodes, overriding the default.","id":"f75c463c060098f5","x":-760,"y":442,"width":324,"height":106},{"type":"text","text":"This AI node will request a gpt-4 response with a temperature of 1.5, overriding the defaults.\n\n(You can set the defaults in the plugin settings)","id":"1a6e63c23f2fd598","x":-760,"y":581,"width":324,"height":179}],"edges":[{"id":"3e19de32f2cf2234","fromNode":"01b6cd0557436d0d","fromSide":"right","toNode":"18629c0795e99c52","toSide":"left","color":"2"},{"id":"a5ea03afb9e7519f","fromNode":"d90d1eda5b1cee39","fromSide":"bottom","toNode":"01b6cd0557436d0d","toSide":"top"},{"id":"e60e398ffd796673","fromNode":"cd8bccad9c0ff0e1","fromSide":"bottom","toNode":"d90d1eda5b1cee39","toSide":"top"},{"id":"4802b580405f5936","fromNode":"f2066662ccfdf12b","fromSide":"bottom","toNode":"901e534d654dbe8d","toSide":"top","color":"2","label":"temperature"},{"id":"44d9a85dc1209c3f","fromNode":"901e534d654dbe8d","fromSide":"right","toNode":"f9768071dcaaf641","toSide":"left","color":"2"},{"id":"18f98f277862e948","fromNode":"32895b9cbe65ebf5","fromSide":"bottom","toNode":"901e534d654dbe8d","toSide":"left","color":"2","label":"model"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"b388b74fc76f9d5b","x":-411,"y":420,"width":800,"height":480,"label":"Config Arrows"}, + {"type":"group","id":"50e47210c3597f2c","x":-382,"y":-274,"width":742,"height":442,"label":"Logging Arrows"}, + {"type":"text","text":"What's the weakest?","id":"01b6cd0557436d0d","x":-362,"y":77,"width":250,"height":60}, + {"type":"text","text":"You're an expert in metallurgy","id":"cd8bccad9c0ff0e1","x":-362,"y":-254,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"What's the strongest metal?","id":"d90d1eda5b1cee39","x":-362,"y":-94,"width":250,"height":60}, + {"type":"text","text":"The logging arrow will write the chat history, response, and config of the AI node to the content node it is pointing to.","id":"82607dbca24bcc3b","x":-720,"y":48,"width":325,"height":120}, + {"type":"text","text":"As a cannoli gets more complex, it can be difficult to know what the LLM is actually seeing in each AI node.\n\nA blank config arrow leaving a AI node will log out everything the LLM saw on that request, as well as the config of that AI node.","id":"2eddfb2df05ffd92","x":-932,"y":-224,"width":537,"height":160}, + {"type":"text","text":"Orange arrows are config arrows. You can change the color of arrows by left clicking on them and then clicking on the color pallet ","id":"f1b3951087221764","x":-160,"y":-440,"width":393,"height":118}, + {"type":"text","text":"","id":"18629c0795e99c52","x":-28,"y":-158,"width":365,"height":295,"color":"6"}, + {"type":"text","text":"Labeled config arrows pointing to AI nodes will try to set their content to the LLM config setting named in the arrow's label.","id":"9750898ccab8b2ec","x":-190,"y":240,"width":325,"height":130}, + {"type":"text","text":"1.5","id":"f2066662ccfdf12b","x":-228,"y":450,"width":106,"height":68,"color":"6"}, + {"type":"text","text":"When will gpt-5 come out?","id":"901e534d654dbe8d","x":-285,"y":640,"width":250,"height":60}, + {"type":"text","text":"gpt-4","id":"32895b9cbe65ebf5","x":-385,"y":450,"width":100,"height":60,"color":"6"}, + {"type":"text","text":"","id":"f9768071dcaaf641","x":24,"y":445,"width":345,"height":415,"color":"6"}, + {"type":"text","text":"Config arrows can also be used to set the LLM config of AI nodes, overriding the default.","id":"f75c463c060098f5","x":-760,"y":442,"width":324,"height":106}, + {"type":"text","text":"This AI node will request a gpt-4 response with a temperature of 1.5, overriding the defaults.\n\n(You can set the defaults in the plugin settings)","id":"1a6e63c23f2fd598","x":-760,"y":581,"width":324,"height":179} + ], + "edges":[ + {"id":"3e19de32f2cf2234","fromNode":"01b6cd0557436d0d","fromSide":"right","toNode":"18629c0795e99c52","toSide":"left","color":"2"}, + {"id":"a5ea03afb9e7519f","fromNode":"d90d1eda5b1cee39","fromSide":"bottom","toNode":"01b6cd0557436d0d","toSide":"top"}, + {"id":"e60e398ffd796673","fromNode":"cd8bccad9c0ff0e1","fromSide":"bottom","toNode":"d90d1eda5b1cee39","toSide":"top"}, + {"id":"4802b580405f5936","fromNode":"f2066662ccfdf12b","fromSide":"bottom","toNode":"901e534d654dbe8d","toSide":"top","color":"2","label":"temperature"}, + {"id":"44d9a85dc1209c3f","fromNode":"901e534d654dbe8d","fromSide":"right","toNode":"f9768071dcaaf641","toSide":"left","color":"2"}, + {"id":"18f98f277862e948","fromNode":"32895b9cbe65ebf5","fromSide":"bottom","toNode":"901e534d654dbe8d","toSide":"left","color":"2","label":"model"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/2. Configuring AI providers.canvas b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/2. Configuring AI providers.canvas index d6d99fc..ce00609 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/2. Configuring AI providers.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/2. Configuring AI providers.canvas @@ -1 +1,16 @@ -{"nodes":[{"id":"b51e8860282e437b","type":"group","x":-643,"y":-220,"width":1040,"height":448,"label":"Configuring AI providers"},{"type":"text","text":"Which AI company is best?","id":"b8a20b0a3f4583a7","x":-277,"y":-12,"width":257,"height":60},{"type":"text","text":"","id":"ad935f27d0760630","x":60,"y":-207,"width":317,"height":415,"color":"6"},{"id":"acca6afbde7b5906","type":"text","text":"gemini","x":-480,"y":-120,"width":107,"height":60,"color":"6"},{"id":"320b6f5ddfd0549d","type":"text","text":"probablyDontUseThisFeature","x":-623,"y":80,"width":263,"height":60,"color":"6"},{"id":"86e7502a8598bee9","type":"text","text":"You can also use config arrows to define which AI provider you'd like to use at the node-level.\n\nJust add a config arrow labeled \"provider\", and load it with one of our currently supported providers in lower case: openai, groq, anthropic, gemini, and ollama.","x":-320,"y":-440,"width":482,"height":185},{"id":"01f2c254b06b9f3e","type":"text","text":"You can also edit the API key at the node level in this way, but this isn't reccomended, as it would be easier to accidentally share it.","x":-660,"y":280,"width":409,"height":104}],"edges":[{"id":"387af49c4e0bf24e","fromNode":"b8a20b0a3f4583a7","fromSide":"right","toNode":"ad935f27d0760630","toSide":"left","color":"2"},{"id":"ac0063c71becd7de","fromNode":"acca6afbde7b5906","fromSide":"right","toNode":"b8a20b0a3f4583a7","toSide":"left","color":"2","label":"provider"},{"id":"74cf2aa488454e8e","fromNode":"320b6f5ddfd0549d","fromSide":"right","toNode":"b8a20b0a3f4583a7","toSide":"left","color":"2","label":"apiKey"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"b51e8860282e437b","type":"group","x":-643,"y":-220,"width":1040,"height":448,"label":"Configuring AI providers"}, + {"type":"text","text":"Which AI company is best?","id":"b8a20b0a3f4583a7","x":-277,"y":-12,"width":257,"height":60}, + {"type":"text","text":"","id":"ad935f27d0760630","x":60,"y":-207,"width":317,"height":415,"color":"6"}, + {"id":"acca6afbde7b5906","type":"text","text":"gemini","x":-480,"y":-120,"width":107,"height":60,"color":"6"}, + {"id":"320b6f5ddfd0549d","type":"text","text":"probablyDontUseThisFeature","x":-623,"y":80,"width":263,"height":60,"color":"6"}, + {"id":"86e7502a8598bee9","type":"text","text":"You can also use config arrows to define which AI provider you'd like to use at the node-level.\n\nJust add a config arrow labeled \"provider\", and load it with one of our currently supported providers in lower case: openai, groq, anthropic, gemini, and ollama.","x":-320,"y":-440,"width":482,"height":185}, + {"id":"01f2c254b06b9f3e","type":"text","text":"You can also edit the API key at the node level in this way, but this isn't reccomended, as it would be easier to accidentally share it.","x":-660,"y":280,"width":409,"height":104} + ], + "edges":[ + {"id":"387af49c4e0bf24e","fromNode":"b8a20b0a3f4583a7","fromSide":"right","toNode":"ad935f27d0760630","toSide":"left","color":"2"}, + {"id":"ac0063c71becd7de","fromNode":"acca6afbde7b5906","fromSide":"right","toNode":"b8a20b0a3f4583a7","toSide":"left","color":"2","label":"provider"}, + {"id":"74cf2aa488454e8e","fromNode":"320b6f5ddfd0549d","fromSide":"right","toNode":"b8a20b0a3f4583a7","toSide":"left","color":"2","label":"apiKey"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/3. Field arrows.canvas b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/3. Field arrows.canvas index d36a6f0..bb0bdf3 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/3. Field arrows.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/3. Field arrows.canvas @@ -1 +1,38 @@ -{"nodes":[{"type":"group","id":"ac03334c4c9efbbf","x":-300,"y":320,"width":871,"height":540,"label":"Other details"},{"type":"group","id":"49bb3c2aaf878ecc","x":-168,"y":922,"width":571,"height":585,"label":"Multi-arrows"},{"type":"group","id":"bb74df853c72868d","x":-240,"y":-80,"width":600,"height":328,"label":"Field arrows"},{"type":"text","text":"What's a good fruit to eat for each meal?","id":"bf2f302f415a57a7","x":-97,"y":-60,"width":250,"height":60},{"type":"text","text":"banana","id":"8eee16509fba3a49","x":-214,"y":168,"width":140,"height":60,"color":"6"},{"type":"text","text":"When an AI node has field arrows leaving it, that call will include a function that gives the LLM fields to fill out for each field name you provide.","id":"c812856c4f5cfe60","x":-560,"y":-80,"width":309,"height":158},{"type":"text","text":"Choosing field arrow names is its own kind of prompting. Experiment with different ways of naming the arrows to get better results.","id":"bf823c055e81ed66","x":-560,"y":97,"width":309,"height":143},{"type":"text","text":"Purple arrows are field arrows. Field arrows are a special kind of variable arrow that allow you to name a field for the LLM to fill. \n\nThey use openai's function calling feature to get structured responses based on the arrow labels.","id":"972a9b4042c99aff","x":-160,"y":-320,"width":444,"height":186},{"type":"text","text":"Rank the top 2 most famous historical battles","id":"912a11d4e1afa3c1","x":-74,"y":340,"width":250,"height":60},{"type":"text","text":"apple","id":"fc3f0539962083c5","x":-33,"y":168,"width":122,"height":60,"color":"6"},{"type":"text","text":"grapes","id":"303f2609904e9a78","x":153,"y":168,"width":180,"height":60,"color":"6"},{"type":"text","text":"#### User:\nWhat makes the Battle of Waterloo famous?\n#### Assistant:\nThe Battle of Waterloo, fought on June 18, 1815, is famous for several reasons:\n\n1. **Decisive End of Napoleonic Wars**: The battle marked the final defeat of French Emperor Napoleon Bonaparte, effectively ending his rule and his ambition to dominate Europe. This defeat concluded over a decade of persistent warfare that had reshaped the continent.\n\n2. **Change in European Power Dynamics**: The outcome of the Battle of Waterloo resulted in significant shifts in the geopolitical landscape of Europe. The fall of Napoleon paved the way for the Congress of Vienna to implement its decisions, leading to nearly a century of relative peace in Europe (known as the \"Concert of Europe\").\n\n3. **Famous Commanders**: The battle is notable for featuring some of the most prominent military leaders of the time. Napoleon led the French forces, while the Duke of Wellington commanded the British and their allies, and Field Marshal Gebhard Leberecht von Blücher led the Prussian army. Their tactics and decisions on the battlefield have been extensively studied and debated.\n\n4. **Tactical and Strategic Interest**: The battle is often examined in military history for its strategies and tactics. It showcased the use of defensive formations, timely cavalry charges, and the coordination of multinational allied forces. Wellington's defensive strategy and Blücher's timely arrival were crucial to the Allied victory.\n\n5. **Historical Legacy and Cultural Impact**: The sheer scale and drama of the confrontation captured public imagination and entered popular culture. It has been commemorated in literature, music, and art, and it remains a popular subject of study and reenactment.\n\n6. **Restoration of Monarchy in France**: Following Napoleon's defeat, the Bourbon monarchy was restored to the French throne, leading to significant political and social changes within France.\n\nOverall, the Battle of Waterloo is often seen as a turning point in European history, bringing an end to a period of widespread conflict and ushering in an era of relative stability and diplomatic balance.\n#### Config\nmodel: gpt-4o\ntemperature: 1\nprovider: openai\n\n","id":"7fcb2dd5de840465","x":-280,"y":600,"width":332,"height":241,"color":"6"},{"type":"text","text":"What makes the {{battle 1}} famous?","id":"b9016ed068d8f3df","x":-214,"y":496,"width":254,"height":60},{"type":"text","text":"#### User:\nRank the top 2 most famous historical battles\n#### Assistant:\nFunction Call: **form**\nArguments:\n```json\n{\"battle 1\":\"Battle of Waterloo\",\"battle 2\":\"Battle of Gettysburg\"}\n```\n#### User:\nWhat makes the Battle of Gettysburg famous?\n#### Assistant:\nThe Battle of Gettysburg, fought from July 1 to July 3, 1863, is one of the most famous and significant battles of the American Civil War. Several factors contribute to its fame:\n\n1. **Turning Point**: The battle is often considered the turning point of the Civil War. It marked the end of Confederate General Robert E. Lee's second and most ambitious invasion of the North. After this battle, the Confederate Army was largely on the defensive for the remainder of the war.\n\n2. **Scale and Casualties**: It was one of the largest battles ever fought in North America, involving around 85,000 soldiers from the Union Army of the Potomac and about 75,000 from the Confederate Army of Northern Virginia. The battle resulted in heavy casualties, with estimates of around 51,000 soldiers killed, wounded, or missing.\n\n3. **Strategic Importance**: Gettysburg was a significant strategic objective due to its road network, enabling rapid movement of troops. The defeat of Lee's army at Gettysburg halted the Confederate momentum and dashed hopes of gaining recognition and support from European powers.\n\n4. **Gettysburg Address**: Four months after the battle, President Abraham Lincoln delivered the Gettysburg Address during the dedication of the Soldiers' National Cemetery on November 19, 1863. This speech, just 272 words long, eloquently redefined the purpose of the war and underscored the principles of human equality and national unity.\n\n5. **Cultural Impact**: The battle has been extensively studied, commemorated, and depicted in various forms of media, including books, films, and reenactments. The Gettysburg National Military Park serves as a major historical site, visited by millions each year.\n\nThe combination of its scale, its role as a turning point, its human cost, and the enduring legacy of Lincoln's Gettysburg Address all contribute to the Battle of Gettysburg's fame and its place as a pivotal moment in American history.\n#### Config\nmodel: gpt-4o\ntemperature: 1\nprovider: openai\n\n","id":"b58f716ac95e1bd3","x":81,"y":600,"width":339,"height":241,"color":"6"},{"type":"text","text":"What makes the {{battle 2}} famous?","id":"355f89d3338915a0","x":89,"y":496,"width":271,"height":60},{"type":"text","text":"{\"battle 1\":\"Battle of Waterloo\",\"battle 2\":\"Battle of Gettysburg\"}","id":"602c0eb10399429c","x":251,"y":340,"width":301,"height":120,"color":"6"},{"type":"text","text":"Non-field arrows will just carry the response as a JSON string.","id":"05a12136e3510af7","x":580,"y":340,"width":250,"height":98},{"type":"text","text":"Similarly to variable arrows, by default field arrows don't pass chat history. Override this with a \"|\" symbol at the end.","id":"e385c431c950a822","x":-600,"y":435,"width":277,"height":155},{"id":"33807cb64cdd9cac","type":"text","text":"Who are the most popular authors in each of these categories?","x":-56,"y":942,"width":350,"height":96},{"id":"a36d2f1233705b2d","type":"text","text":"\"\"Sci-fi: {{sci-fi}}\nHistorical fiction: {{historical fiction}}\nBiography: {{biography}}\n\"\"","x":-60,"y":1196,"width":352,"height":132,"color":"6"},{"id":"8eb5818084414bdc","type":"text","text":"Sci-fi: Isaac Asimov, Arthur C. Clarke, Philip K. Dick\nHistorical fiction: Ken Follett, Hilary Mantel, Philippa Gregory\nBiography: Walter Isaacson, David McCullough, Ron Chernow\n","x":-144,"y":1372,"width":520,"height":115,"color":"6"},{"id":"c909a29a2da72938","type":"text","text":"When there are multiple lines in an arrow label, cannoli will treat them as separate arrows.\n\nThis works on any arrow type, but it's particularly useful for field arrows, as you often want the same AI node to fill out multiple fields, and pass them all into another AI node or Formatter node.","x":-590,"y":998,"width":396,"height":239}],"edges":[{"id":"f243e7ecc26dddf0","fromNode":"bf2f302f415a57a7","fromSide":"bottom","toNode":"8eee16509fba3a49","toSide":"top","color":"6","label":"breakfast"},{"id":"19acdf8c5139a403","fromNode":"bf2f302f415a57a7","fromSide":"bottom","toNode":"fc3f0539962083c5","toSide":"top","color":"6","label":"lunch"},{"id":"eea5e61d628a1f37","fromNode":"bf2f302f415a57a7","fromSide":"bottom","toNode":"303f2609904e9a78","toSide":"top","color":"6","label":"dinner"},{"id":"3e455995e5dff301","fromNode":"912a11d4e1afa3c1","fromSide":"bottom","toNode":"b9016ed068d8f3df","toSide":"top","color":"6","label":"battle 1"},{"id":"de82f8c9cc47e515","fromNode":"912a11d4e1afa3c1","fromSide":"bottom","toNode":"355f89d3338915a0","toSide":"top","color":"6","label":"battle 2|"},{"id":"1a9662bf2fcaaeca","fromNode":"b9016ed068d8f3df","fromSide":"bottom","toNode":"7fcb2dd5de840465","toSide":"top","color":"2"},{"id":"7f6b2d929334d325","fromNode":"355f89d3338915a0","fromSide":"bottom","toNode":"b58f716ac95e1bd3","toSide":"top","color":"2"},{"id":"0d6c132ba45af90d","fromNode":"912a11d4e1afa3c1","fromSide":"right","toNode":"602c0eb10399429c","toSide":"left"},{"id":"84cfedc9449f5d42","fromNode":"33807cb64cdd9cac","fromSide":"bottom","toNode":"a36d2f1233705b2d","toSide":"top","color":"6","label":"sci-fi\nhistorical fiction\nbiography"},{"id":"9ada88b3cfd1c1a1","fromNode":"a36d2f1233705b2d","fromSide":"bottom","toNode":"8eb5818084414bdc","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"ac03334c4c9efbbf","x":-300,"y":320,"width":871,"height":540,"label":"Other details"}, + {"type":"group","id":"49bb3c2aaf878ecc","x":-168,"y":922,"width":571,"height":585,"label":"Multi-arrows"}, + {"type":"group","id":"bb74df853c72868d","x":-240,"y":-80,"width":600,"height":328,"label":"Field arrows"}, + {"type":"text","text":"What's a good fruit to eat for each meal?","id":"bf2f302f415a57a7","x":-97,"y":-60,"width":250,"height":60}, + {"type":"text","text":"banana","id":"8eee16509fba3a49","x":-214,"y":168,"width":140,"height":60,"color":"6"}, + {"type":"text","text":"When an AI node has field arrows leaving it, that call will include a function that gives the LLM fields to fill out for each field name you provide.","id":"c812856c4f5cfe60","x":-560,"y":-80,"width":309,"height":158}, + {"type":"text","text":"Choosing field arrow names is its own kind of prompting. Experiment with different ways of naming the arrows to get better results.","id":"bf823c055e81ed66","x":-560,"y":97,"width":309,"height":143}, + {"type":"text","text":"Purple arrows are field arrows. Field arrows are a special kind of variable arrow that allow you to name a field for the LLM to fill. \n\nThey use openai's function calling feature to get structured responses based on the arrow labels.","id":"972a9b4042c99aff","x":-160,"y":-320,"width":444,"height":186}, + {"type":"text","text":"Rank the top 2 most famous historical battles","id":"912a11d4e1afa3c1","x":-74,"y":340,"width":250,"height":60}, + {"type":"text","text":"apple","id":"fc3f0539962083c5","x":-33,"y":168,"width":122,"height":60,"color":"6"}, + {"type":"text","text":"grapes","id":"303f2609904e9a78","x":153,"y":168,"width":180,"height":60,"color":"6"}, + {"type":"text","text":"#### User:\nWhat makes the Battle of Waterloo famous?\n#### Assistant:\nThe Battle of Waterloo, fought on June 18, 1815, is famous for several reasons:\n\n1. **Decisive End of Napoleonic Wars**: The battle marked the final defeat of French Emperor Napoleon Bonaparte, effectively ending his rule and his ambition to dominate Europe. This defeat concluded over a decade of persistent warfare that had reshaped the continent.\n\n2. **Change in European Power Dynamics**: The outcome of the Battle of Waterloo resulted in significant shifts in the geopolitical landscape of Europe. The fall of Napoleon paved the way for the Congress of Vienna to implement its decisions, leading to nearly a century of relative peace in Europe (known as the \"Concert of Europe\").\n\n3. **Famous Commanders**: The battle is notable for featuring some of the most prominent military leaders of the time. Napoleon led the French forces, while the Duke of Wellington commanded the British and their allies, and Field Marshal Gebhard Leberecht von Blücher led the Prussian army. Their tactics and decisions on the battlefield have been extensively studied and debated.\n\n4. **Tactical and Strategic Interest**: The battle is often examined in military history for its strategies and tactics. It showcased the use of defensive formations, timely cavalry charges, and the coordination of multinational allied forces. Wellington's defensive strategy and Blücher's timely arrival were crucial to the Allied victory.\n\n5. **Historical Legacy and Cultural Impact**: The sheer scale and drama of the confrontation captured public imagination and entered popular culture. It has been commemorated in literature, music, and art, and it remains a popular subject of study and reenactment.\n\n6. **Restoration of Monarchy in France**: Following Napoleon's defeat, the Bourbon monarchy was restored to the French throne, leading to significant political and social changes within France.\n\nOverall, the Battle of Waterloo is often seen as a turning point in European history, bringing an end to a period of widespread conflict and ushering in an era of relative stability and diplomatic balance.\n#### Config\nmodel: gpt-4o\ntemperature: 1\nprovider: openai\n\n","id":"7fcb2dd5de840465","x":-280,"y":600,"width":332,"height":241,"color":"6"}, + {"type":"text","text":"What makes the {{battle 1}} famous?","id":"b9016ed068d8f3df","x":-214,"y":496,"width":254,"height":60}, + {"type":"text","text":"#### User:\nRank the top 2 most famous historical battles\n#### Assistant:\nFunction Call: **form**\nArguments:\n```json\n{\"battle 1\":\"Battle of Waterloo\",\"battle 2\":\"Battle of Gettysburg\"}\n```\n#### User:\nWhat makes the Battle of Gettysburg famous?\n#### Assistant:\nThe Battle of Gettysburg, fought from July 1 to July 3, 1863, is one of the most famous and significant battles of the American Civil War. Several factors contribute to its fame:\n\n1. **Turning Point**: The battle is often considered the turning point of the Civil War. It marked the end of Confederate General Robert E. Lee's second and most ambitious invasion of the North. After this battle, the Confederate Army was largely on the defensive for the remainder of the war.\n\n2. **Scale and Casualties**: It was one of the largest battles ever fought in North America, involving around 85,000 soldiers from the Union Army of the Potomac and about 75,000 from the Confederate Army of Northern Virginia. The battle resulted in heavy casualties, with estimates of around 51,000 soldiers killed, wounded, or missing.\n\n3. **Strategic Importance**: Gettysburg was a significant strategic objective due to its road network, enabling rapid movement of troops. The defeat of Lee's army at Gettysburg halted the Confederate momentum and dashed hopes of gaining recognition and support from European powers.\n\n4. **Gettysburg Address**: Four months after the battle, President Abraham Lincoln delivered the Gettysburg Address during the dedication of the Soldiers' National Cemetery on November 19, 1863. This speech, just 272 words long, eloquently redefined the purpose of the war and underscored the principles of human equality and national unity.\n\n5. **Cultural Impact**: The battle has been extensively studied, commemorated, and depicted in various forms of media, including books, films, and reenactments. The Gettysburg National Military Park serves as a major historical site, visited by millions each year.\n\nThe combination of its scale, its role as a turning point, its human cost, and the enduring legacy of Lincoln's Gettysburg Address all contribute to the Battle of Gettysburg's fame and its place as a pivotal moment in American history.\n#### Config\nmodel: gpt-4o\ntemperature: 1\nprovider: openai\n\n","id":"b58f716ac95e1bd3","x":81,"y":600,"width":339,"height":241,"color":"6"}, + {"type":"text","text":"What makes the {{battle 2}} famous?","id":"355f89d3338915a0","x":89,"y":496,"width":271,"height":60}, + {"type":"text","text":"{\"battle 1\":\"Battle of Waterloo\",\"battle 2\":\"Battle of Gettysburg\"}","id":"602c0eb10399429c","x":251,"y":340,"width":301,"height":120,"color":"6"}, + {"type":"text","text":"Non-field arrows will just carry the response as a JSON string.","id":"05a12136e3510af7","x":580,"y":340,"width":250,"height":98}, + {"type":"text","text":"Similarly to variable arrows, by default field arrows don't pass chat history. Override this with a \"|\" symbol at the end.","id":"e385c431c950a822","x":-600,"y":435,"width":277,"height":155}, + {"id":"33807cb64cdd9cac","type":"text","text":"Who are the most popular authors in each of these categories?","x":-56,"y":942,"width":350,"height":96}, + {"id":"a36d2f1233705b2d","type":"text","text":"\"\"Sci-fi: {{sci-fi}}\nHistorical fiction: {{historical fiction}}\nBiography: {{biography}}\n\"\"","x":-60,"y":1196,"width":352,"height":132,"color":"6"}, + {"id":"8eb5818084414bdc","type":"text","text":"Sci-fi: Isaac Asimov, Arthur C. Clarke, Philip K. Dick\nHistorical fiction: Ken Follett, Hilary Mantel, Philippa Gregory\nBiography: Walter Isaacson, David McCullough, Ron Chernow\n","x":-144,"y":1372,"width":520,"height":115,"color":"6"}, + {"id":"c909a29a2da72938","type":"text","text":"When there are multiple lines in an arrow label, cannoli will treat them as separate arrows.\n\nThis works on any arrow type, but it's particularly useful for field arrows, as you often want the same AI node to fill out multiple fields, and pass them all into another AI node or Formatter node.","x":-590,"y":998,"width":396,"height":239} + ], + "edges":[ + {"id":"f243e7ecc26dddf0","fromNode":"bf2f302f415a57a7","fromSide":"bottom","toNode":"8eee16509fba3a49","toSide":"top","color":"6","label":"breakfast"}, + {"id":"19acdf8c5139a403","fromNode":"bf2f302f415a57a7","fromSide":"bottom","toNode":"fc3f0539962083c5","toSide":"top","color":"6","label":"lunch"}, + {"id":"eea5e61d628a1f37","fromNode":"bf2f302f415a57a7","fromSide":"bottom","toNode":"303f2609904e9a78","toSide":"top","color":"6","label":"dinner"}, + {"id":"3e455995e5dff301","fromNode":"912a11d4e1afa3c1","fromSide":"bottom","toNode":"b9016ed068d8f3df","toSide":"top","color":"6","label":"battle 1"}, + {"id":"de82f8c9cc47e515","fromNode":"912a11d4e1afa3c1","fromSide":"bottom","toNode":"355f89d3338915a0","toSide":"top","color":"6","label":"battle 2|"}, + {"id":"1a9662bf2fcaaeca","fromNode":"b9016ed068d8f3df","fromSide":"bottom","toNode":"7fcb2dd5de840465","toSide":"top","color":"2"}, + {"id":"7f6b2d929334d325","fromNode":"355f89d3338915a0","fromSide":"bottom","toNode":"b58f716ac95e1bd3","toSide":"top","color":"2"}, + {"id":"0d6c132ba45af90d","fromNode":"912a11d4e1afa3c1","fromSide":"right","toNode":"602c0eb10399429c","toSide":"left"}, + {"id":"84cfedc9449f5d42","fromNode":"33807cb64cdd9cac","fromSide":"bottom","toNode":"a36d2f1233705b2d","toSide":"top","color":"6","label":"sci-fi\nhistorical fiction\nbiography"}, + {"id":"9ada88b3cfd1c1a1","fromNode":"a36d2f1233705b2d","fromSide":"bottom","toNode":"8eb5818084414bdc","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/4. Choice arrows.canvas b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/4. Choice arrows.canvas index c89ed5c..0fe5ee2 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/4. Choice arrows.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/2. Special arrows/4. Choice arrows.canvas @@ -1 +1,48 @@ -{"nodes":[{"type":"group","id":"c9dd6d1bd62bafff","x":-380,"y":380,"width":800,"height":520,"label":"Chat history"},{"type":"group","id":"cd01298f475a3dd6","x":-296,"y":980,"width":578,"height":640,"label":"Variables from different choice paths"},{"type":"group","id":"a6599fe712bec80e","x":-296,"y":-200,"width":604,"height":474,"label":"Choice arrows"},{"type":"text","text":"When an AI node has choice arrows leaving it, it will be given a function that asks for a response with one of the arrow labels.","id":"45df9fe6d33cd2d2","x":-660,"y":-140,"width":341,"height":135},{"type":"text","text":"Should I make pasta tonight?","id":"28786f9598c550d5","x":-112,"y":-179,"width":204,"height":79},{"type":"text","text":"You sure?","id":"ac91698a073fc95c","x":-237,"y":6,"width":177,"height":60,"color":"0"},{"type":"text","text":"Ok give me a list of ingredients","id":"63096630fb9f2e2e","x":48,"y":6,"width":230,"height":60},{"type":"text","text":"","id":"3acf958e2220ce5e","x":-273,"y":140,"width":250,"height":114,"color":"6"},{"type":"text","text":"Yellow arrows are choice arrows. Use these to give the LLM a choice between options. Only the arrows that have the chosen label will activate.","id":"4e077ea9cfa98595","x":-175,"y":-368,"width":415,"height":108},{"type":"text","text":"Similarly to blank arrows, choice arrows pass chat history by default.\n\nIf you'd like a choice arrow not to pass chat history, and simply define which nodes to activate, add a \"~\" symbol at the end of the label.","id":"f258c0364e5303bb","x":-781,"y":400,"width":380,"height":207},{"type":"text","text":"","id":"a5276dfa0b72a1d9","x":38,"y":140,"width":250,"height":114,"color":"6"},{"type":"text","text":"What's the most difficult pasta to make?","id":"03f149b198234b2e","x":-232,"y":400,"width":250,"height":60},{"type":"text","text":"Choice arrows and any other outgoing arrows simply pass the response as a JSON string.","id":"f342c07dfcc12a65","x":440,"y":395,"width":299,"height":109},{"type":"text","text":"","id":"631691e520dac009","x":-355,"y":760,"width":358,"height":120,"color":"6"},{"type":"text","text":"","id":"b217af764ccecfd0","x":28,"y":760,"width":375,"height":120,"color":"6"},{"type":"text","text":"","id":"e82cc2675ee6f4ac","x":140,"y":400,"width":263,"height":60,"color":"6"},{"type":"text","text":"","id":"599128089fbfde0c","x":220,"y":561,"width":183,"height":135,"color":"6"},{"type":"text","text":"Is this my first message?","id":"76252deff058a30b","x":28,"y":641,"width":175,"height":85,"color":"0"},{"type":"text","text":"","id":"32b8f51ebe623e94","x":-369,"y":560,"width":164,"height":135,"color":"6"},{"type":"text","text":"Is this my first message?","id":"c63995fa03f9e524","x":-190,"y":629,"width":166,"height":85},{"type":"text","text":"Write a shopping list based on this recipe: {{a}}","id":"b95eb36f138e1a24","x":-126,"y":1349,"width":250,"height":92},{"type":"text","text":"Which pasta is better for a red sauce?","id":"0fd490ac150e0f5e","x":-143,"y":1000,"width":250,"height":60},{"type":"text","text":"","id":"676ea6885c79b682","x":-185,"y":1480,"width":368,"height":120,"color":"6"},{"type":"text","text":"I dont have any orzo. Respond with a recipe for orzo as well as a recipe for a simple red sauce.","id":"a234933050b99f4f","x":8,"y":1160,"width":250,"height":120,"color":"0"},{"type":"text","text":"Ok I have that. Just respond with the recipe for a simple red sauce.","id":"46b1cd2114123ac8","x":-276,"y":1160,"width":250,"height":120},{"type":"text","text":"If an AI node has multiple incoming edges with the same name, only the one from an activated path will be injected.","id":"6e5936cc2c85af89","x":-610,"y":1280,"width":288,"height":137}],"edges":[{"id":"7265ecc0e39454b0","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"32b8f51ebe623e94","toSide":"top","color":"3","label":"rigatoni"},{"id":"5b08fd306da75b91","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"599128089fbfde0c","toSide":"top","color":"3","label":"linguini"},{"id":"82b732c8452c9584","fromNode":"28786f9598c550d5","fromSide":"bottom","toNode":"ac91698a073fc95c","toSide":"top","color":"3","label":"no"},{"id":"b83dfe178174121d","fromNode":"28786f9598c550d5","fromSide":"bottom","toNode":"63096630fb9f2e2e","toSide":"top","color":"3","label":"yes"},{"id":"b4775fe4758dc40d","fromNode":"ac91698a073fc95c","fromSide":"bottom","toNode":"3acf958e2220ce5e","toSide":"top"},{"id":"ae2322dc9035b985","fromNode":"63096630fb9f2e2e","fromSide":"bottom","toNode":"a5276dfa0b72a1d9","toSide":"top"},{"id":"26d34c5e87e7d03c","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"c63995fa03f9e524","toSide":"top","color":"3","label":"rigatoni~"},{"id":"7db7e2a8fc1e1ef6","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"76252deff058a30b","toSide":"top","color":"3","label":"linguini~"},{"id":"6f95f372b461f8d5","fromNode":"76252deff058a30b","fromSide":"bottom","toNode":"b217af764ccecfd0","toSide":"top","color":"2"},{"id":"abc25503ba8076fb","fromNode":"c63995fa03f9e524","fromSide":"bottom","toNode":"631691e520dac009","toSide":"top","color":"2"},{"id":"1582d8994ac555e1","fromNode":"03f149b198234b2e","fromSide":"right","toNode":"e82cc2675ee6f4ac","toSide":"left"},{"id":"c43d38e12b9c16b8","fromNode":"46b1cd2114123ac8","fromSide":"bottom","toNode":"b95eb36f138e1a24","toSide":"top","label":"a"},{"id":"f22bc7061eff5703","fromNode":"a234933050b99f4f","fromSide":"bottom","toNode":"b95eb36f138e1a24","toSide":"top","label":"a"},{"id":"bf13cea8fc4d3ac8","fromNode":"0fd490ac150e0f5e","fromSide":"bottom","toNode":"46b1cd2114123ac8","toSide":"top","color":"3","label":"penne"},{"id":"0d60d2b18558d544","fromNode":"0fd490ac150e0f5e","fromSide":"bottom","toNode":"a234933050b99f4f","toSide":"top","color":"3","label":"orzo"},{"id":"96c63376c757dbf0","fromNode":"b95eb36f138e1a24","fromSide":"bottom","toNode":"676ea6885c79b682","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"c9dd6d1bd62bafff","x":-380,"y":380,"width":800,"height":520,"label":"Chat history"}, + {"type":"group","id":"cd01298f475a3dd6","x":-296,"y":980,"width":578,"height":640,"label":"Variables from different choice paths"}, + {"type":"group","id":"a6599fe712bec80e","x":-296,"y":-200,"width":604,"height":474,"label":"Choice arrows"}, + {"type":"text","text":"When an AI node has choice arrows leaving it, it will be given a function that asks for a response with one of the arrow labels.","id":"45df9fe6d33cd2d2","x":-660,"y":-140,"width":341,"height":135}, + {"type":"text","text":"Should I make pasta tonight?","id":"28786f9598c550d5","x":-112,"y":-179,"width":204,"height":79}, + {"type":"text","text":"You sure?","id":"ac91698a073fc95c","x":-237,"y":6,"width":177,"height":60,"color":"0"}, + {"type":"text","text":"Ok give me a list of ingredients","id":"63096630fb9f2e2e","x":48,"y":6,"width":230,"height":60}, + {"type":"text","text":"","id":"3acf958e2220ce5e","x":-273,"y":140,"width":250,"height":114,"color":"6"}, + {"type":"text","text":"Yellow arrows are choice arrows. Use these to give the LLM a choice between options. Only the arrows that have the chosen label will activate.","id":"4e077ea9cfa98595","x":-175,"y":-368,"width":415,"height":108}, + {"type":"text","text":"Similarly to blank arrows, choice arrows pass chat history by default.\n\nIf you'd like a choice arrow not to pass chat history, and simply define which nodes to activate, add a \"~\" symbol at the end of the label.","id":"f258c0364e5303bb","x":-781,"y":400,"width":380,"height":207}, + {"type":"text","text":"","id":"a5276dfa0b72a1d9","x":38,"y":140,"width":250,"height":114,"color":"6"}, + {"type":"text","text":"What's the most difficult pasta to make?","id":"03f149b198234b2e","x":-232,"y":400,"width":250,"height":60}, + {"type":"text","text":"Choice arrows and any other outgoing arrows simply pass the response as a JSON string.","id":"f342c07dfcc12a65","x":440,"y":395,"width":299,"height":109}, + {"type":"text","text":"","id":"631691e520dac009","x":-355,"y":760,"width":358,"height":120,"color":"6"}, + {"type":"text","text":"","id":"b217af764ccecfd0","x":28,"y":760,"width":375,"height":120,"color":"6"}, + {"type":"text","text":"","id":"e82cc2675ee6f4ac","x":140,"y":400,"width":263,"height":60,"color":"6"}, + {"type":"text","text":"","id":"599128089fbfde0c","x":220,"y":561,"width":183,"height":135,"color":"6"}, + {"type":"text","text":"Is this my first message?","id":"76252deff058a30b","x":28,"y":641,"width":175,"height":85,"color":"0"}, + {"type":"text","text":"","id":"32b8f51ebe623e94","x":-369,"y":560,"width":164,"height":135,"color":"6"}, + {"type":"text","text":"Is this my first message?","id":"c63995fa03f9e524","x":-190,"y":629,"width":166,"height":85}, + {"type":"text","text":"Write a shopping list based on this recipe: {{a}}","id":"b95eb36f138e1a24","x":-126,"y":1349,"width":250,"height":92}, + {"type":"text","text":"Which pasta is better for a red sauce?","id":"0fd490ac150e0f5e","x":-143,"y":1000,"width":250,"height":60}, + {"type":"text","text":"","id":"676ea6885c79b682","x":-185,"y":1480,"width":368,"height":120,"color":"6"}, + {"type":"text","text":"I dont have any orzo. Respond with a recipe for orzo as well as a recipe for a simple red sauce.","id":"a234933050b99f4f","x":8,"y":1160,"width":250,"height":120,"color":"0"}, + {"type":"text","text":"Ok I have that. Just respond with the recipe for a simple red sauce.","id":"46b1cd2114123ac8","x":-276,"y":1160,"width":250,"height":120}, + {"type":"text","text":"If an AI node has multiple incoming edges with the same name, only the one from an activated path will be injected.","id":"6e5936cc2c85af89","x":-610,"y":1280,"width":288,"height":137} + ], + "edges":[ + {"id":"7265ecc0e39454b0","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"32b8f51ebe623e94","toSide":"top","color":"3","label":"rigatoni"}, + {"id":"5b08fd306da75b91","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"599128089fbfde0c","toSide":"top","color":"3","label":"linguini"}, + {"id":"82b732c8452c9584","fromNode":"28786f9598c550d5","fromSide":"bottom","toNode":"ac91698a073fc95c","toSide":"top","color":"3","label":"no"}, + {"id":"b83dfe178174121d","fromNode":"28786f9598c550d5","fromSide":"bottom","toNode":"63096630fb9f2e2e","toSide":"top","color":"3","label":"yes"}, + {"id":"b4775fe4758dc40d","fromNode":"ac91698a073fc95c","fromSide":"bottom","toNode":"3acf958e2220ce5e","toSide":"top"}, + {"id":"ae2322dc9035b985","fromNode":"63096630fb9f2e2e","fromSide":"bottom","toNode":"a5276dfa0b72a1d9","toSide":"top"}, + {"id":"26d34c5e87e7d03c","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"c63995fa03f9e524","toSide":"top","color":"3","label":"rigatoni~"}, + {"id":"7db7e2a8fc1e1ef6","fromNode":"03f149b198234b2e","fromSide":"bottom","toNode":"76252deff058a30b","toSide":"top","color":"3","label":"linguini~"}, + {"id":"6f95f372b461f8d5","fromNode":"76252deff058a30b","fromSide":"bottom","toNode":"b217af764ccecfd0","toSide":"top","color":"2"}, + {"id":"abc25503ba8076fb","fromNode":"c63995fa03f9e524","fromSide":"bottom","toNode":"631691e520dac009","toSide":"top","color":"2"}, + {"id":"1582d8994ac555e1","fromNode":"03f149b198234b2e","fromSide":"right","toNode":"e82cc2675ee6f4ac","toSide":"left"}, + {"id":"c43d38e12b9c16b8","fromNode":"46b1cd2114123ac8","fromSide":"bottom","toNode":"b95eb36f138e1a24","toSide":"top","label":"a"}, + {"id":"f22bc7061eff5703","fromNode":"a234933050b99f4f","fromSide":"bottom","toNode":"b95eb36f138e1a24","toSide":"top","label":"a"}, + {"id":"bf13cea8fc4d3ac8","fromNode":"0fd490ac150e0f5e","fromSide":"bottom","toNode":"46b1cd2114123ac8","toSide":"top","color":"3","label":"penne"}, + {"id":"0d60d2b18558d544","fromNode":"0fd490ac150e0f5e","fromSide":"bottom","toNode":"a234933050b99f4f","toSide":"top","color":"3","label":"orzo"}, + {"id":"96c63376c757dbf0","fromNode":"b95eb36f138e1a24","fromSide":"bottom","toNode":"676ea6885c79b682","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/1. Floating nodes.canvas b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/1. Floating nodes.canvas index 278f343..0da9459 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/1. Floating nodes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/1. Floating nodes.canvas @@ -1 +1,18 @@ -{"nodes":[{"type":"group","id":"6221f4693ddb3417","x":-320,"y":-80,"width":600,"height":460,"label":"Floating nodes"},{"type":"text","text":"Use a specific format on a floating node (no attached arrows) to create a global variable. You can read and write to this variable anywhere in the cannoli.","id":"9650a6926008b16f","x":-234,"y":-259,"width":414,"height":119},{"type":"text","text":"Now just write the new version by itself in your next response.","id":"867aca6f08aff01f","x":-1,"y":124,"width":250,"height":116,"color":"0"},{"type":"text","text":"Please critique and rewrite this email to be a bit more apologetic:\n{{Email Draft}}","id":"848648ac1ab74998","x":-14,"y":-60,"width":274,"height":120,"color":"0"},{"type":"text","text":"{{Email Draft}}","id":"5246f4d07c4012a8","x":-1,"y":300,"width":250,"height":60,"color":"6"},{"type":"text","text":"In this example we reference and write to a floating node.","id":"38e2ac4e746d3f44","x":-580,"y":-30,"width":250,"height":90},{"type":"text","text":"When a floating node's first line is in single square brackets, it can be accessed as a variable.","id":"ff6cf4c87583cf77","x":-580,"y":111,"width":250,"height":129},{"type":"text","text":"You can reference floating node variables the same way you'd reference normal variables.","id":"80a63e1ff8700f60","x":300,"y":-40,"width":340,"height":120},{"type":"text","text":"This is an example of a Reference Node. When a content node is just a floating node reference or note reference wrapped in double curly braces, you can write to the referenced location instead of the node itself.","id":"f0466f473408290b","x":300,"y":240,"width":516,"height":127},{"type":"text","text":"[Email Draft]\nLet me get back to you on that","id":"329298ec10140a51","x":-300,"y":75,"width":250,"height":99}],"edges":[{"id":"f33f402d10538f79","fromNode":"848648ac1ab74998","fromSide":"bottom","toNode":"867aca6f08aff01f","toSide":"top"},{"id":"bfad0ddbfa29f18f","fromNode":"867aca6f08aff01f","fromSide":"bottom","toNode":"5246f4d07c4012a8","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"6221f4693ddb3417","x":-320,"y":-80,"width":600,"height":460,"label":"Floating nodes"}, + {"type":"text","text":"Use a specific format on a floating node (no attached arrows) to create a global variable. You can read and write to this variable anywhere in the cannoli.","id":"9650a6926008b16f","x":-234,"y":-259,"width":414,"height":119}, + {"type":"text","text":"Now just write the new version by itself in your next response.","id":"867aca6f08aff01f","x":-1,"y":124,"width":250,"height":116,"color":"0"}, + {"type":"text","text":"Please critique and rewrite this email to be a bit more apologetic:\n{{Email Draft}}","id":"848648ac1ab74998","x":-14,"y":-60,"width":274,"height":120,"color":"0"}, + {"type":"text","text":"{{Email Draft}}","id":"5246f4d07c4012a8","x":-1,"y":300,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"In this example we reference and write to a floating node.","id":"38e2ac4e746d3f44","x":-580,"y":-30,"width":250,"height":90}, + {"type":"text","text":"When a floating node's first line is in single square brackets, it can be accessed as a variable.","id":"ff6cf4c87583cf77","x":-580,"y":111,"width":250,"height":129}, + {"type":"text","text":"You can reference floating node variables the same way you'd reference normal variables.","id":"80a63e1ff8700f60","x":300,"y":-40,"width":340,"height":120}, + {"type":"text","text":"This is an example of a Reference Node. When a content node is just a floating node reference or note reference wrapped in double curly braces, you can write to the referenced location instead of the node itself.","id":"f0466f473408290b","x":300,"y":240,"width":516,"height":127}, + {"type":"text","text":"[Email Draft]\nLet me get back to you on that","id":"329298ec10140a51","x":-300,"y":75,"width":250,"height":99} + ], + "edges":[ + {"id":"f33f402d10538f79","fromNode":"848648ac1ab74998","fromSide":"bottom","toNode":"867aca6f08aff01f","toSide":"top"}, + {"id":"bfad0ddbfa29f18f","fromNode":"867aca6f08aff01f","fromSide":"bottom","toNode":"5246f4d07c4012a8","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/2. Action nodes.canvas b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/2. Action nodes.canvas index fcbff0e..2a9b314 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/2. Action nodes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/2. Action nodes.canvas @@ -1 +1,44 @@ -{"nodes":[{"id":"b0c4a818e82c9a93","type":"group","x":-988,"y":718,"width":1271,"height":1191,"label":"Built-in actions"},{"id":"9c40004c1221b271","type":"group","x":-769,"y":-293,"width":841,"height":911,"label":"HTTP request"},{"id":"9807f6e43d42b056","type":"group","x":-926,"y":-913,"width":1131,"height":545,"label":"Simple GET requests"},{"id":"805230ed376e523a","type":"text","text":"https://api.chucknorris.io/jokes/random","x":-483,"y":-893,"width":375,"height":50,"color":"2"},{"id":"75b1c213e8314a7f","type":"text","text":"","x":-274,"y":-703,"width":459,"height":153,"color":"6"},{"id":"d05cd17ddae7b3ae","type":"text","text":"","x":-906,"y":-707,"width":591,"height":319,"color":"6"},{"type":"text","text":"Orange nodes are action nodes. You can use them to make http calls with content from the cannoli.","id":"60bd8cc6ffcdd82b","x":-460,"y":-1081,"width":291,"height":123},{"id":"cd0306d313c1ba9a","type":"text","text":"You can write a JSON path in an arrow leaving an action node and it will extract that part of the JSON response, if possible","x":-1330,"y":-613,"width":389,"height":104},{"id":"34f1866f7d8ec75d","type":"text","text":"If the content of an action node is just a URL, it will just inject any variables it has and send a GET request to that url, and send along the response","x":-1341,"y":-857,"width":398,"height":121},{"id":"85c53cc8da22cfe8","type":"text","text":"Who's the current king of France?","x":-385,"y":-273,"width":306,"height":50,"color":"6"},{"type":"text","text":"If the content of the action node is a JSON object that looks like this one, with properties for the url, method, headers (optional), and body (optional), it will send the defined HTTP request","id":"d7c2f23ed59d226e","x":-1212,"y":-197,"width":424,"height":151},{"role":"","displayOverride":true,"id":"6e6fbee5bfb165f7","type":"text","text":"```json\n{\n \"url\": \"https://api.openai.com/v1/chat/completions\",\n \"method\": \"POST\",\n \"headers\": {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \"Bearer {{OPENAI_API_KEY}}\"\n },\n \"body\": {\n \"model\": \"gpt-4o-mini\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"{{prompt}}\"\n }\n ]\n }\n}\n```","x":-513,"y":-133,"width":562,"height":408,"color":"2"},{"role":"","displayOverride":true,"id":"ab7ac45db968d052","type":"text","text":"","x":-459,"y":524,"width":87,"height":61,"color":"6"},{"id":"5d9f1d178f2e07a5","type":"text","text":"","x":-357,"y":394,"width":409,"height":204,"color":"6"},{"id":"a234e7042ff9c857","type":"text","text":"In this example, we inject the prompt and the API key. All of the AI provider API keys can be referenced in this way, along with any secrets you've defined in the settings.","x":-1262,"y":277,"width":481,"height":119},{"id":"31207a01ee6f6fa9","type":"text","text":"guinea pig","x":-547,"y":734,"width":250,"height":60,"color":"6"},{"id":"3a97e7dd58bd7da5","type":"text","text":"disco","x":-274,"y":732,"width":250,"height":60,"color":"6"},{"id":"9928314d4e8f380c","type":"text","text":"[dalle]\nmake a picture of a {{animal}} at a {{event}}","x":-273,"y":864,"width":250,"height":98,"color":"2"},{"id":"cb4c9da73bf91322","type":"text","text":"1024x1792","x":21,"y":766,"width":250,"height":60,"color":"6"},{"id":"e4e8f41b308f5557","type":"text","text":"","x":-968,"y":983,"width":534,"height":504,"color":"6"},{"id":"1e284d74b857ee78","type":"text","text":"make a picture of a frog at a concert","x":-828,"y":738,"width":250,"height":60,"color":"6"},{"id":"439ff93f8f2810fc","type":"text","text":"dalle","x":-826,"y":874,"width":250,"height":60,"color":"2"},{"id":"8b31f6b1680c71c3","type":"text","text":"","x":-415,"y":1011,"width":534,"height":883,"color":"6"},{"id":"40dcbe69778315d8","type":"text","text":"The currently available built-in actions are described in more detail in the \"6. Built-in Actions\" folder of the Cannoli College\n\nWe plan to add a lot more, and if you're running a baked cannoli in code, adding your own custom functions is as simple as making an object with \"name\" and \"function\" properties.","x":-1439,"y":1295,"width":428,"height":239},{"id":"0636a124a5a4a703","type":"text","text":"You can also reference the built-in actions available by simple writing the action name into the node.\n\nThis node will use the built-in \"dalle\" action, which responds with an embedded markdown link with the resulting image.","x":-1419,"y":917,"width":411,"height":201},{"id":"5e5885b41e6028a3","x":80,"y":44,"width":439,"height":115,"type":"text","text":"You can also pre-define http templates like this in the settings, which you can then just reference with their name"},{"id":"ce7a9d23ed54ea75","x":298,"y":934,"width":386,"height":177,"type":"text","text":"If you reference an action like this with the name in square brackets, you can template the first argument of the function.\n\nIn the case of the dalle action, that first argument is the prompt"}],"edges":[{"id":"a9a5933d9ac3b5aa","fromNode":"6e6fbee5bfb165f7","fromSide":"left","toNode":"ab7ac45db968d052","toSide":"left","label":"usage.completion_tokens"},{"id":"66da44c564b82a4c","fromNode":"6e6fbee5bfb165f7","fromSide":"bottom","toNode":"5d9f1d178f2e07a5","toSide":"top","label":"choices[0].message.content"},{"id":"d1553808132c755c","fromNode":"85c53cc8da22cfe8","fromSide":"bottom","toNode":"6e6fbee5bfb165f7","toSide":"top","label":"prompt"},{"id":"ca705e472c4191b2","fromNode":"805230ed376e523a","fromSide":"bottom","toNode":"d05cd17ddae7b3ae","toSide":"top"},{"id":"fc7740241923be0b","fromNode":"805230ed376e523a","fromSide":"bottom","toNode":"75b1c213e8314a7f","toSide":"top","label":"value"},{"id":"c18371e33307587f","fromNode":"1e284d74b857ee78","fromSide":"bottom","toNode":"439ff93f8f2810fc","toSide":"top","label":"prompt"},{"id":"be22a83cc0bbb224","fromNode":"439ff93f8f2810fc","fromSide":"bottom","toNode":"e4e8f41b308f5557","toSide":"top"},{"id":"1d605dcd924a46c8","fromNode":"3a97e7dd58bd7da5","fromSide":"bottom","toNode":"9928314d4e8f380c","toSide":"top"},{"id":"e05cba64d54b762e","fromNode":"31207a01ee6f6fa9","fromSide":"bottom","toNode":"9928314d4e8f380c","toSide":"left","label":"animal"},{"id":"6655ae09a0302e98","fromNode":"cb4c9da73bf91322","fromSide":"bottom","toNode":"9928314d4e8f380c","toSide":"right","label":"size"},{"id":"c2071fd06a179e36","fromNode":"9928314d4e8f380c","fromSide":"bottom","toNode":"8b31f6b1680c71c3","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"b0c4a818e82c9a93","type":"group","x":-988,"y":718,"width":1271,"height":1191,"label":"Built-in actions"}, + {"id":"9c40004c1221b271","type":"group","x":-769,"y":-293,"width":841,"height":911,"label":"HTTP request"}, + {"id":"9807f6e43d42b056","type":"group","x":-926,"y":-913,"width":1131,"height":545,"label":"Simple GET requests"}, + {"id":"805230ed376e523a","type":"text","text":"https://api.chucknorris.io/jokes/random","x":-483,"y":-893,"width":375,"height":50,"color":"2"}, + {"id":"75b1c213e8314a7f","type":"text","text":"","x":-274,"y":-703,"width":459,"height":153,"color":"6"}, + {"id":"d05cd17ddae7b3ae","type":"text","text":"","x":-906,"y":-707,"width":591,"height":319,"color":"6"}, + {"type":"text","text":"Orange nodes are action nodes. You can use them to make http calls with content from the cannoli.","id":"60bd8cc6ffcdd82b","x":-460,"y":-1081,"width":291,"height":123}, + {"id":"cd0306d313c1ba9a","type":"text","text":"You can write a JSON path in an arrow leaving an action node and it will extract that part of the JSON response, if possible","x":-1330,"y":-613,"width":389,"height":104}, + {"id":"34f1866f7d8ec75d","type":"text","text":"If the content of an action node is just a URL, it will just inject any variables it has and send a GET request to that url, and send along the response","x":-1341,"y":-857,"width":398,"height":121}, + {"id":"85c53cc8da22cfe8","type":"text","text":"Who's the current king of France?","x":-385,"y":-273,"width":306,"height":50,"color":"6"}, + {"type":"text","text":"If the content of the action node is a JSON object that looks like this one, with properties for the url, method, headers (optional), and body (optional), it will send the defined HTTP request","id":"d7c2f23ed59d226e","x":-1212,"y":-197,"width":424,"height":151}, + {"role":"","displayOverride":true,"id":"6e6fbee5bfb165f7","type":"text","text":"```json\n{\n \"url\": \"https://api.openai.com/v1/chat/completions\",\n \"method\": \"POST\",\n \"headers\": {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \"Bearer {{OPENAI_API_KEY}}\"\n },\n \"body\": {\n \"model\": \"gpt-4o-mini\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"{{prompt}}\"\n }\n ]\n }\n}\n```","x":-513,"y":-133,"width":562,"height":408,"color":"2"}, + {"role":"","displayOverride":true,"id":"ab7ac45db968d052","type":"text","text":"","x":-459,"y":524,"width":87,"height":61,"color":"6"}, + {"id":"5d9f1d178f2e07a5","type":"text","text":"","x":-357,"y":394,"width":409,"height":204,"color":"6"}, + {"id":"a234e7042ff9c857","type":"text","text":"In this example, we inject the prompt and the API key. All of the AI provider API keys can be referenced in this way, along with any secrets you've defined in the settings.","x":-1262,"y":277,"width":481,"height":119}, + {"id":"31207a01ee6f6fa9","type":"text","text":"guinea pig","x":-547,"y":734,"width":250,"height":60,"color":"6"}, + {"id":"3a97e7dd58bd7da5","type":"text","text":"disco","x":-274,"y":732,"width":250,"height":60,"color":"6"}, + {"id":"9928314d4e8f380c","type":"text","text":"[dalle]\nmake a picture of a {{animal}} at a {{event}}","x":-273,"y":864,"width":250,"height":98,"color":"2"}, + {"id":"cb4c9da73bf91322","type":"text","text":"1024x1792","x":21,"y":766,"width":250,"height":60,"color":"6"}, + {"id":"e4e8f41b308f5557","type":"text","text":"","x":-968,"y":983,"width":534,"height":504,"color":"6"}, + {"id":"1e284d74b857ee78","type":"text","text":"make a picture of a frog at a concert","x":-828,"y":738,"width":250,"height":60,"color":"6"}, + {"id":"439ff93f8f2810fc","type":"text","text":"dalle","x":-826,"y":874,"width":250,"height":60,"color":"2"}, + {"id":"8b31f6b1680c71c3","type":"text","text":"","x":-415,"y":1011,"width":534,"height":883,"color":"6"}, + {"id":"40dcbe69778315d8","type":"text","text":"The currently available built-in actions are described in more detail in the \"6. Built-in Actions\" folder of the Cannoli College\n\nWe plan to add a lot more, and if you're running a baked cannoli in code, adding your own custom functions is as simple as making an object with \"name\" and \"function\" properties.","x":-1439,"y":1295,"width":428,"height":239}, + {"id":"0636a124a5a4a703","type":"text","text":"You can also reference the built-in actions available by simple writing the action name into the node.\n\nThis node will use the built-in \"dalle\" action, which responds with an embedded markdown link with the resulting image.","x":-1419,"y":917,"width":411,"height":201}, + {"id":"5e5885b41e6028a3","x":80,"y":44,"width":439,"height":115,"type":"text","text":"You can also pre-define http templates like this in the settings, which you can then just reference with their name"}, + {"id":"ce7a9d23ed54ea75","x":298,"y":934,"width":386,"height":177,"type":"text","text":"If you reference an action like this with the name in square brackets, you can template the first argument of the function.\n\nIn the case of the dalle action, that first argument is the prompt"} + ], + "edges":[ + {"id":"a9a5933d9ac3b5aa","fromNode":"6e6fbee5bfb165f7","fromSide":"left","toNode":"ab7ac45db968d052","toSide":"left","label":"usage.completion_tokens"}, + {"id":"66da44c564b82a4c","fromNode":"6e6fbee5bfb165f7","fromSide":"bottom","toNode":"5d9f1d178f2e07a5","toSide":"top","label":"choices[0].message.content"}, + {"id":"d1553808132c755c","fromNode":"85c53cc8da22cfe8","fromSide":"bottom","toNode":"6e6fbee5bfb165f7","toSide":"top","label":"prompt"}, + {"id":"ca705e472c4191b2","fromNode":"805230ed376e523a","fromSide":"bottom","toNode":"d05cd17ddae7b3ae","toSide":"top"}, + {"id":"fc7740241923be0b","fromNode":"805230ed376e523a","fromSide":"bottom","toNode":"75b1c213e8314a7f","toSide":"top","label":"value"}, + {"id":"c18371e33307587f","fromNode":"1e284d74b857ee78","fromSide":"bottom","toNode":"439ff93f8f2810fc","toSide":"top","label":"prompt"}, + {"id":"be22a83cc0bbb224","fromNode":"439ff93f8f2810fc","fromSide":"bottom","toNode":"e4e8f41b308f5557","toSide":"top"}, + {"id":"1d605dcd924a46c8","fromNode":"3a97e7dd58bd7da5","fromSide":"bottom","toNode":"9928314d4e8f380c","toSide":"top"}, + {"id":"e05cba64d54b762e","fromNode":"31207a01ee6f6fa9","fromSide":"bottom","toNode":"9928314d4e8f380c","toSide":"left","label":"animal"}, + {"id":"6655ae09a0302e98","fromNode":"cb4c9da73bf91322","fromSide":"bottom","toNode":"9928314d4e8f380c","toSide":"right","label":"size"}, + {"id":"c2071fd06a179e36","fromNode":"9928314d4e8f380c","fromSide":"bottom","toNode":"8b31f6b1680c71c3","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/3. Formatter nodes.canvas b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/3. Formatter nodes.canvas index 2c6919b..debd6f1 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/3. Formatter nodes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/3. Formatter nodes.canvas @@ -1 +1,18 @@ -{"nodes":[{"type":"group","id":"94f5f94475efad52","x":-242,"y":-100,"width":512,"height":635,"label":"Formatter nodes"},{"type":"text","text":"Respond with the name of a nosy villager character","id":"e2163e206cbda905","x":-200,"y":-80,"width":250,"height":60},{"type":"text","text":"","id":"b9b423ce99fb31c9","x":-217,"y":360,"width":284,"height":155,"color":"6"},{"type":"text","text":"A content node wrapped in double double quotes (\"\") is a formatter node. They will not be overwritten.","id":"0be55ec8c78cd264","x":-500,"y":201,"width":250,"height":119},{"type":"text","text":"\"\"Name: {{name}}\nLines:\n{{lines}}\"\"","id":"4f1b8e3bd87e5bd8","x":-222,"y":160,"width":294,"height":140,"color":"6"},{"type":"text","text":"Formatter nodes allow you to work with variables the same way you do with AI nodes, but without making an LLM call.","id":"b6560aee19ea758c","x":-180,"y":-260,"width":394,"height":113},{"type":"text","text":"You can use the output of formatter nodes the same way you use AI nodes.","id":"897ca9e72f35add4","x":-500,"y":385,"width":250,"height":105},{"type":"text","text":"Now write a list of 5 lines they might say.","id":"7a909145058b7691","x":0,"y":40,"width":250,"height":60}],"edges":[{"id":"3ba3954eb0260bb0","fromNode":"e2163e206cbda905","fromSide":"bottom","toNode":"7a909145058b7691","toSide":"top"},{"id":"be08a31884ecc768","fromNode":"e2163e206cbda905","fromSide":"bottom","toNode":"4f1b8e3bd87e5bd8","toSide":"top","label":"name"},{"id":"2f201d9220f6ef3f","fromNode":"7a909145058b7691","fromSide":"bottom","toNode":"4f1b8e3bd87e5bd8","toSide":"top","label":"lines"},{"id":"f590014afea4fcd1","fromNode":"4f1b8e3bd87e5bd8","fromSide":"bottom","toNode":"b9b423ce99fb31c9","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"94f5f94475efad52","x":-242,"y":-100,"width":512,"height":635,"label":"Formatter nodes"}, + {"type":"text","text":"Respond with the name of a nosy villager character","id":"e2163e206cbda905","x":-200,"y":-80,"width":250,"height":60}, + {"type":"text","text":"","id":"b9b423ce99fb31c9","x":-217,"y":360,"width":284,"height":155,"color":"6"}, + {"type":"text","text":"A content node wrapped in double double quotes (\"\") is a formatter node. They will not be overwritten.","id":"0be55ec8c78cd264","x":-500,"y":201,"width":250,"height":119}, + {"type":"text","text":"\"\"Name: {{name}}\nLines:\n{{lines}}\"\"","id":"4f1b8e3bd87e5bd8","x":-222,"y":160,"width":294,"height":140,"color":"6"}, + {"type":"text","text":"Formatter nodes allow you to work with variables the same way you do with AI nodes, but without making an LLM call.","id":"b6560aee19ea758c","x":-180,"y":-260,"width":394,"height":113}, + {"type":"text","text":"You can use the output of formatter nodes the same way you use AI nodes.","id":"897ca9e72f35add4","x":-500,"y":385,"width":250,"height":105}, + {"type":"text","text":"Now write a list of 5 lines they might say.","id":"7a909145058b7691","x":0,"y":40,"width":250,"height":60} + ], + "edges":[ + {"id":"3ba3954eb0260bb0","fromNode":"e2163e206cbda905","fromSide":"bottom","toNode":"7a909145058b7691","toSide":"top"}, + {"id":"be08a31884ecc768","fromNode":"e2163e206cbda905","fromSide":"bottom","toNode":"4f1b8e3bd87e5bd8","toSide":"top","label":"name"}, + {"id":"2f201d9220f6ef3f","fromNode":"7a909145058b7691","fromSide":"bottom","toNode":"4f1b8e3bd87e5bd8","toSide":"top","label":"lines"}, + {"id":"f590014afea4fcd1","fromNode":"4f1b8e3bd87e5bd8","fromSide":"bottom","toNode":"b9b423ce99fb31c9","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/4. Reference nodes.canvas b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/4. Reference nodes.canvas index a7bc315..4821ddf 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/4. Reference nodes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/3. Special nodes/4. Reference nodes.canvas @@ -1 +1,38 @@ -{"nodes":[{"type":"group","id":"546578b6fae29490","x":-420,"y":-160,"width":580,"height":640,"label":"Reference nodes"},{"id":"8d414d7be725ce11","type":"group","x":-420,"y":880,"width":610,"height":259,"label":"Getting properties"},{"id":"8fd4e3f6e22304ba","type":"group","x":-420,"y":560,"width":290,"height":259,"label":"Getting note name"},{"id":"8c0fb44530075f7d","type":"group","x":-420,"y":1200,"width":290,"height":259,"label":"Getting note path"},{"type":"text","text":"{{Current state}}","id":"079588e3f7e0afa0","x":-393,"y":203,"width":250,"height":60,"color":"6"},{"type":"text","text":"Reference nodes can reference floating nodes or notes from your vault.","id":"a8346a9d96a737bb","x":-692,"y":238,"width":262,"height":114},{"type":"text","text":"Reference nodes are content nodes surrounded by double curly braces.","id":"a9ea85b101bc8776","x":-686,"y":-149,"width":250,"height":129},{"type":"text","text":"You can write or read from them the same way you use normal content nodes.","id":"be5c114d263a0107","x":-686,"y":66,"width":250,"height":137},{"type":"text","text":"Write a poem about walking","id":"fba8c017a84a0a74","x":-380,"y":-124,"width":250,"height":60,"color":"0"},{"type":"text","text":"{{[[Walking Poem]]}}","id":"e8e998b3d784e3a1","x":-380,"y":6,"width":250,"height":60,"color":"6"},{"type":"text","text":"Reference nodes can be used to write to and read from notes in your vault or floating nodes on the cannoli.","id":"28c071d10dfda17f","x":-333,"y":-340,"width":379,"height":122},{"type":"text","text":"[Current state]\nNot much going on","id":"e08885cd2f146f7d","x":-113,"y":203,"width":250,"height":92},{"id":"344bb3da359269a4","type":"text","text":"","x":-100,"y":327,"width":237,"height":113,"color":"6"},{"type":"text","text":"Does this change our plan at all:\n{{a}}","id":"e9768515f6295d9b","x":-393,"y":333,"width":250,"height":100,"color":"0"},{"id":"963eacfd11f92b34","type":"text","text":"{{[[Meeting Notes]]}}","x":-400,"y":580,"width":250,"height":60,"color":"6"},{"id":"ef10f47160ceb92a","type":"text","text":"","x":-400,"y":739,"width":250,"height":60,"color":"6"},{"id":"f85bdd621bacd536","type":"text","text":"If a variable arrow coming from a reference node starts with a square bracket, it will extract the link for the reference.\n\nThis is uses in cases when you dynamically create nodes and need to get their link reliably.","x":-763,"y":580,"width":318,"height":239},{"id":"da10ade6ef9ec7fb","type":"text","text":"{{[[Meeting Notes]]}}","x":-400,"y":900,"width":250,"height":60,"color":"6"},{"id":"d0e83b31dc2a1576","type":"text","text":"{{[[Meeting Notes]]}}","x":-90,"y":900,"width":250,"height":60,"color":"6"},{"id":"1566407420c6d37d","type":"text","text":"","x":-400,"y":1059,"width":250,"height":60,"color":"6"},{"id":"68e42dd6d4721f26","type":"text","text":"","x":-90,"y":1059,"width":250,"height":60,"color":"6"},{"id":"28a0281c87a0c588","type":"text","text":"{{[[Meeting Notes]]}}","x":-400,"y":1220,"width":250,"height":60,"color":"6"},{"id":"babacacceece0d0f","type":"text","text":"","x":-400,"y":1379,"width":250,"height":60,"color":"6"},{"id":"bad9bf674fca2bfa","type":"text","text":"You can use arrows that start with \":\" to retrieve the associated property of the same name from a note.\n\nIf there is nothing on the arrow other than \":\", all properties will be retrieved. ","x":-763,"y":900,"width":318,"height":239},{"id":"b6b1e156ad3548a2","type":"text","text":"You can use arrows that start with \"/\" to retrieve the path of a reference node.\n\nThis could be useful for creating notes in the same folder as dynamically selected notes.","x":-763,"y":1220,"width":318,"height":219}],"edges":[{"id":"bc3f3aa5abc3914d","fromNode":"fba8c017a84a0a74","fromSide":"bottom","toNode":"e8e998b3d784e3a1","toSide":"top"},{"id":"c98efd6bf2dff5d4","fromNode":"079588e3f7e0afa0","fromSide":"bottom","toNode":"e9768515f6295d9b","toSide":"top","label":"a"},{"id":"20b93bd61e36c19f","fromNode":"963eacfd11f92b34","fromSide":"bottom","toNode":"ef10f47160ceb92a","toSide":"top","label":"["},{"id":"d1ab9632f705d309","fromNode":"e9768515f6295d9b","fromSide":"right","toNode":"344bb3da359269a4","toSide":"left","color":"2"},{"id":"4320417bc6736dd9","fromNode":"da10ade6ef9ec7fb","fromSide":"bottom","toNode":"1566407420c6d37d","toSide":"top","label":":Date"},{"id":"e56ac04c2a7ef6da","fromNode":"d0e83b31dc2a1576","fromSide":"bottom","toNode":"68e42dd6d4721f26","toSide":"top","label":":"},{"id":"06d6a4450c69c049","fromNode":"28a0281c87a0c588","fromSide":"bottom","toNode":"babacacceece0d0f","toSide":"top","label":"/"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"546578b6fae29490","x":-420,"y":-160,"width":580,"height":640,"label":"Reference nodes"}, + {"id":"8d414d7be725ce11","type":"group","x":-420,"y":880,"width":610,"height":259,"label":"Getting properties"}, + {"id":"8fd4e3f6e22304ba","type":"group","x":-420,"y":560,"width":290,"height":259,"label":"Getting note name"}, + {"id":"8c0fb44530075f7d","type":"group","x":-420,"y":1200,"width":290,"height":259,"label":"Getting note path"}, + {"type":"text","text":"{{Current state}}","id":"079588e3f7e0afa0","x":-393,"y":203,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"Reference nodes can reference floating nodes or notes from your vault.","id":"a8346a9d96a737bb","x":-692,"y":238,"width":262,"height":114}, + {"type":"text","text":"Reference nodes are content nodes surrounded by double curly braces.","id":"a9ea85b101bc8776","x":-686,"y":-149,"width":250,"height":129}, + {"type":"text","text":"You can write or read from them the same way you use normal content nodes.","id":"be5c114d263a0107","x":-686,"y":66,"width":250,"height":137}, + {"type":"text","text":"Write a poem about walking","id":"fba8c017a84a0a74","x":-380,"y":-124,"width":250,"height":60,"color":"0"}, + {"type":"text","text":"{{[[Walking Poem]]}}","id":"e8e998b3d784e3a1","x":-380,"y":6,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"Reference nodes can be used to write to and read from notes in your vault or floating nodes on the cannoli.","id":"28c071d10dfda17f","x":-333,"y":-340,"width":379,"height":122}, + {"type":"text","text":"[Current state]\nNot much going on","id":"e08885cd2f146f7d","x":-113,"y":203,"width":250,"height":92}, + {"id":"344bb3da359269a4","type":"text","text":"","x":-100,"y":327,"width":237,"height":113,"color":"6"}, + {"type":"text","text":"Does this change our plan at all:\n{{a}}","id":"e9768515f6295d9b","x":-393,"y":333,"width":250,"height":100,"color":"0"}, + {"id":"963eacfd11f92b34","type":"text","text":"{{[[Meeting Notes]]}}","x":-400,"y":580,"width":250,"height":60,"color":"6"}, + {"id":"ef10f47160ceb92a","type":"text","text":"","x":-400,"y":739,"width":250,"height":60,"color":"6"}, + {"id":"f85bdd621bacd536","type":"text","text":"If a variable arrow coming from a reference node starts with a square bracket, it will extract the link for the reference.\n\nThis is uses in cases when you dynamically create nodes and need to get their link reliably.","x":-763,"y":580,"width":318,"height":239}, + {"id":"da10ade6ef9ec7fb","type":"text","text":"{{[[Meeting Notes]]}}","x":-400,"y":900,"width":250,"height":60,"color":"6"}, + {"id":"d0e83b31dc2a1576","type":"text","text":"{{[[Meeting Notes]]}}","x":-90,"y":900,"width":250,"height":60,"color":"6"}, + {"id":"1566407420c6d37d","type":"text","text":"","x":-400,"y":1059,"width":250,"height":60,"color":"6"}, + {"id":"68e42dd6d4721f26","type":"text","text":"","x":-90,"y":1059,"width":250,"height":60,"color":"6"}, + {"id":"28a0281c87a0c588","type":"text","text":"{{[[Meeting Notes]]}}","x":-400,"y":1220,"width":250,"height":60,"color":"6"}, + {"id":"babacacceece0d0f","type":"text","text":"","x":-400,"y":1379,"width":250,"height":60,"color":"6"}, + {"id":"bad9bf674fca2bfa","type":"text","text":"You can use arrows that start with \":\" to retrieve the associated property of the same name from a note.\n\nIf there is nothing on the arrow other than \":\", all properties will be retrieved. ","x":-763,"y":900,"width":318,"height":239}, + {"id":"b6b1e156ad3548a2","type":"text","text":"You can use arrows that start with \"/\" to retrieve the path of a reference node.\n\nThis could be useful for creating notes in the same folder as dynamically selected notes.","x":-763,"y":1220,"width":318,"height":219} + ], + "edges":[ + {"id":"bc3f3aa5abc3914d","fromNode":"fba8c017a84a0a74","fromSide":"bottom","toNode":"e8e998b3d784e3a1","toSide":"top"}, + {"id":"c98efd6bf2dff5d4","fromNode":"079588e3f7e0afa0","fromSide":"bottom","toNode":"e9768515f6295d9b","toSide":"top","label":"a"}, + {"id":"20b93bd61e36c19f","fromNode":"963eacfd11f92b34","fromSide":"bottom","toNode":"ef10f47160ceb92a","toSide":"top","label":"["}, + {"id":"d1ab9632f705d309","fromNode":"e9768515f6295d9b","fromSide":"right","toNode":"344bb3da359269a4","toSide":"left","color":"2"}, + {"id":"4320417bc6736dd9","fromNode":"da10ade6ef9ec7fb","fromSide":"bottom","toNode":"1566407420c6d37d","toSide":"top","label":":Date"}, + {"id":"e56ac04c2a7ef6da","fromNode":"d0e83b31dc2a1576","fromSide":"bottom","toNode":"68e42dd6d4721f26","toSide":"top","label":":"}, + {"id":"06d6a4450c69c049","fromNode":"28a0281c87a0c588","fromSide":"bottom","toNode":"babacacceece0d0f","toSide":"top","label":"/"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/1. Referencing notes.canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/1. Referencing notes.canvas index 162193a..e1db678 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/1. Referencing notes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/1. Referencing notes.canvas @@ -1 +1,66 @@ -{"nodes":[{"type":"group","id":"34ab67ca730bb363","x":-700,"y":420,"width":960,"height":500,"label":"Extraction modifiers"},{"type":"group","id":"1e30c5b622c33707","x":-700,"y":-160,"width":600,"height":500,"label":"Reference nodes"},{"type":"group","id":"4b47baa584657fc0","x":-700,"y":-620,"width":650,"height":360,"label":"Notes as variables"},{"id":"3c55aea3ab7679cf","type":"group","x":-690,"y":1680,"width":610,"height":259,"label":"Getting properties"},{"id":"71f82d60459605e9","type":"group","x":-690,"y":1000,"width":290,"height":290,"label":"Special \"NOTE\" reference"},{"id":"bc6196ed2a59141c","type":"group","x":-690,"y":1360,"width":290,"height":259,"label":"Getting note names"},{"id":"f5c0436b8aa42d7f","type":"group","x":-690,"y":2000,"width":290,"height":259,"label":"Getting note path"},{"type":"text","text":"Check this out:\n{{[[Lemons for Cleaning]]}}","id":"24fc10789416284c","x":-680,"y":-600,"width":250,"height":60},{"type":"text","text":"What was in that note?","id":"e62b59877d19a53b","x":-680,"y":-490,"width":250,"height":50},{"type":"text","text":"","id":"62447884955fc816","x":-409,"y":-560,"width":349,"height":280,"color":"6"},{"type":"text","text":"You can reference notes in Cannolis to give LLMs up-to-date context conveniently.","id":"305dbf844cee4b22","x":-562,"y":-780,"width":328,"height":102},{"type":"text","text":"To show the LLM the content of a note, simply wrap a note link in curly braces, just as you would a variable.","id":"9ae16a6025e83401","x":-1060,"y":-521,"width":345,"height":113},{"type":"file","file":"Cannoli College/Example notes/Apple Trees.md","text":"{{[[Apple Trees]]}}","id":"b7597d6f39e7acc9","x":-690,"y":-120,"width":283,"height":145},{"type":"text","text":"What's the note above about","id":"8039b20f5e260110","x":-673,"y":80,"width":250,"height":80},{"type":"text","text":"What's this about:\n{{a}}","id":"dec28b770c6e0601","x":-359,"y":80,"width":250,"height":80},{"type":"text","text":"","id":"37c33e8f19a09beb","x":-680,"y":-380,"width":250,"height":100,"color":"6"},{"type":"text","text":"You can also pull the content of notes with arrows leaving Obsidian's built-in file cards.","id":"7563d53b40bf5f1a","x":-986,"y":-101,"width":271,"height":126},{"type":"text","text":"The same effect can be achieved with a reference node, using this double curly brace notation in a content node.","id":"7486aafd14a866f8","x":-80,"y":-103,"width":340,"height":111},{"type":"text","text":"{{[[Lemons for Cleaning]]}}","id":"aa6a67a2ff0f2fe8","x":-359,"y":-77,"width":250,"height":60,"color":"6"},{"type":"text","text":"","id":"a96e14fbb7d1265f","x":-673,"y":200,"width":250,"height":120,"color":"6"},{"type":"text","text":"","id":"7f19194be69549ec","x":-359,"y":200,"width":250,"height":120,"color":"6"},{"id":"e7990bd20a1a3f11","type":"text","text":"{{NOTE}}","x":-670,"y":1020,"width":250,"height":60},{"id":"da19d9eee04a6946","type":"text","text":"This reference node will always correspond to the active note when the cannoli was started.\n\nYou can use this syntax to build chatbots (see [[4. Chat arrows.cno.canvas|4. Chat arrows.cno]]) or cannolis that process the content of the active note somehow.","x":-1039,"y":1010,"width":324,"height":260},{"id":"dd06bd8ffd8959c3","type":"text","text":"","x":-670,"y":1140,"width":250,"height":130,"color":"6"},{"id":"d399962128a18b2e","type":"text","text":"","x":-680,"y":615,"width":268,"height":277,"color":"6"},{"type":"text","text":"{{[[Meeting Notes]]#}}","id":"30afb34c1019f5df","x":-670,"y":473,"width":250,"height":60,"color":"6"},{"id":"b63aa69459ed0e33","type":"text","text":"{{[[Meeting Notes]]}}","x":-670,"y":1380,"width":250,"height":60,"color":"6"},{"id":"d19cad0060fcb71c","type":"text","text":"","x":-670,"y":1539,"width":250,"height":60,"color":"6"},{"id":"9aff2c48988f7fdf","type":"text","text":"If a variable arrow coming from a reference node starts with a square bracket, it will extract the link for the reference.\n\nThis is uses in cases when you dynamically create nodes and need to get their link reliably.","x":-1033,"y":1380,"width":318,"height":239},{"id":"9967b60050a55863","type":"text","text":"{{[[Meeting Notes]]}}","x":-670,"y":1700,"width":250,"height":60,"color":"6"},{"id":"570d87dc498def43","type":"text","text":"","x":-670,"y":1859,"width":250,"height":60,"color":"6"},{"id":"94c9f6ee12de2723","type":"text","text":"You can use arrows that start with \":\" to retrieve the associated property of the same name from a note.\n\nIf there is nothing on the arrow other than \":\", all properties will be retrieved. ","x":-1033,"y":1700,"width":318,"height":239},{"id":"382cdbdf89daa53c","type":"text","text":"{{[[Meeting Notes]]}}","x":-360,"y":1700,"width":250,"height":60,"color":"6"},{"id":"386367aa8acf2917","type":"text","text":"","x":-360,"y":1859,"width":250,"height":60,"color":"6"},{"id":"47f1774a10a6de98","type":"text","text":"{{[[Meeting Notes]]}}","x":-670,"y":2020,"width":250,"height":60,"color":"6"},{"id":"09ec11f71f736c5a","type":"text","text":"","x":-670,"y":2179,"width":250,"height":60,"color":"6"},{"id":"82df68e8b67c09c8","type":"text","text":"You can use arrows that start with \"/\" to retrieve the path of a reference node.\n\nThis could be useful for creating notes in the same folder as dynamically selected notes.","x":-1033,"y":2020,"width":318,"height":219},{"id":"8352e64802f9ff93","type":"text","text":"You can add multiple modifiers in a single reference:\n{{[[Note]]^!#}}","x":280,"y":785,"width":398,"height":120},{"id":"0856fc4c98e0e01c","type":"text","text":"To include the properties (YAML frontmatter) in the note, reference it like this:\n{{[[Note]]^}}\n\nIf your default setting is to include the properties, you can remove them like this:\n{{[[Note]]!^}}\n\nIf you are editing a note, this modifier will also change if the edit can affect the existing properties. This is useful if you don't want to overwrite properties when you edit a note.","x":280,"y":413,"width":420,"height":342},{"type":"text","text":"{{[[Meeting Notes]]^}}","id":"10439db683a6c0a7","x":-35,"y":473,"width":250,"height":60,"color":"6"},{"id":"919f3852d5538bac","type":"text","text":"","x":-44,"y":615,"width":268,"height":277,"color":"6"},{"id":"faa26d9da34c53d9","type":"text","text":"","x":-368,"y":615,"width":268,"height":277,"color":"6"},{"type":"text","text":"{{[[Meeting Notes]]@}}","id":"cf0cf7433914ad7f","x":-359,"y":473,"width":250,"height":60,"color":"6"},{"type":"text","text":"You can change how notes are extracted or edited using symbols after the note within a reference.\n\nThese modifiers will override the related settings you chose in the cannoli settings.","id":"f98df3d186b6b8b3","x":-1079,"y":371,"width":365,"height":205},{"id":"21a132196d1026bf","type":"text","text":"To add the filename of a note as a header, reference it like this:\n{{[[Note]]#}}\n\nIf your default setting is to add the filename header, you can remove it like this:\n{{[[Note]]!#}}\n\nThe same is true of the \"@\" modifier, which does the same thing but with a markdown link to the note.","x":-1073,"y":615,"width":354,"height":340}],"edges":[{"id":"7ebbdaba21c78245","fromNode":"24fc10789416284c","fromSide":"right","toNode":"62447884955fc816","toSide":"top","color":"2"},{"id":"ee4e6166d0ffe43d","fromNode":"24fc10789416284c","fromSide":"bottom","toNode":"e62b59877d19a53b","toSide":"top"},{"id":"063d6d8d083b2666","fromNode":"b7597d6f39e7acc9","fromSide":"bottom","toNode":"8039b20f5e260110","toSide":"top"},{"id":"9bcad28d8d703638","fromNode":"aa6a67a2ff0f2fe8","fromSide":"bottom","toNode":"dec28b770c6e0601","toSide":"top","label":"a"},{"id":"ba5e154b30f8168f","fromNode":"e62b59877d19a53b","fromSide":"bottom","toNode":"37c33e8f19a09beb","toSide":"top"},{"id":"6e838ae4192a0925","fromNode":"8039b20f5e260110","fromSide":"bottom","toNode":"a96e14fbb7d1265f","toSide":"top"},{"id":"7f3f25c31ae38f6d","fromNode":"dec28b770c6e0601","fromSide":"bottom","toNode":"7f19194be69549ec","toSide":"top"},{"id":"8af2e272382f3038","fromNode":"e7990bd20a1a3f11","fromSide":"bottom","toNode":"dd06bd8ffd8959c3","toSide":"top"},{"id":"aba263db1eb0f4b6","fromNode":"9967b60050a55863","fromSide":"bottom","toNode":"570d87dc498def43","toSide":"top","label":":Date"},{"id":"f0e0c3d61fe7aca3","fromNode":"30afb34c1019f5df","fromSide":"bottom","toNode":"d399962128a18b2e","toSide":"top"},{"id":"e137cb2b47fff78e","fromNode":"10439db683a6c0a7","fromSide":"bottom","toNode":"919f3852d5538bac","toSide":"top"},{"id":"7919954c7360c103","fromNode":"b63aa69459ed0e33","fromSide":"bottom","toNode":"d19cad0060fcb71c","toSide":"top","label":"["},{"id":"a149899b3a0f51b7","fromNode":"47f1774a10a6de98","fromSide":"bottom","toNode":"09ec11f71f736c5a","toSide":"top","label":"/"},{"id":"1bb84d00af5d18f5","fromNode":"382cdbdf89daa53c","fromSide":"bottom","toNode":"386367aa8acf2917","toSide":"top","label":":"},{"id":"2d839e95573e05a0","fromNode":"cf0cf7433914ad7f","fromSide":"bottom","toNode":"faa26d9da34c53d9","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"34ab67ca730bb363","x":-700,"y":420,"width":960,"height":500,"label":"Extraction modifiers"}, + {"type":"group","id":"1e30c5b622c33707","x":-700,"y":-160,"width":600,"height":500,"label":"Reference nodes"}, + {"type":"group","id":"4b47baa584657fc0","x":-700,"y":-620,"width":650,"height":360,"label":"Notes as variables"}, + {"id":"3c55aea3ab7679cf","type":"group","x":-690,"y":1680,"width":610,"height":259,"label":"Getting properties"}, + {"id":"71f82d60459605e9","type":"group","x":-690,"y":1000,"width":290,"height":290,"label":"Special \"NOTE\" reference"}, + {"id":"bc6196ed2a59141c","type":"group","x":-690,"y":1360,"width":290,"height":259,"label":"Getting note names"}, + {"id":"f5c0436b8aa42d7f","type":"group","x":-690,"y":2000,"width":290,"height":259,"label":"Getting note path"}, + {"type":"text","text":"Check this out:\n{{[[Lemons for Cleaning]]}}","id":"24fc10789416284c","x":-680,"y":-600,"width":250,"height":60}, + {"type":"text","text":"What was in that note?","id":"e62b59877d19a53b","x":-680,"y":-490,"width":250,"height":50}, + {"type":"text","text":"","id":"62447884955fc816","x":-409,"y":-560,"width":349,"height":280,"color":"6"}, + {"type":"text","text":"You can reference notes in Cannolis to give LLMs up-to-date context conveniently.","id":"305dbf844cee4b22","x":-562,"y":-780,"width":328,"height":102}, + {"type":"text","text":"To show the LLM the content of a note, simply wrap a note link in curly braces, just as you would a variable.","id":"9ae16a6025e83401","x":-1060,"y":-521,"width":345,"height":113}, + {"type":"file","file":"Cannoli College/Example notes/Apple Trees.md","text":"{{[[Apple Trees]]}}","id":"b7597d6f39e7acc9","x":-690,"y":-120,"width":283,"height":145}, + {"type":"text","text":"What's the note above about","id":"8039b20f5e260110","x":-673,"y":80,"width":250,"height":80}, + {"type":"text","text":"What's this about:\n{{a}}","id":"dec28b770c6e0601","x":-359,"y":80,"width":250,"height":80}, + {"type":"text","text":"","id":"37c33e8f19a09beb","x":-680,"y":-380,"width":250,"height":100,"color":"6"}, + {"type":"text","text":"You can also pull the content of notes with arrows leaving Obsidian's built-in file cards.","id":"7563d53b40bf5f1a","x":-986,"y":-101,"width":271,"height":126}, + {"type":"text","text":"The same effect can be achieved with a reference node, using this double curly brace notation in a content node.","id":"7486aafd14a866f8","x":-80,"y":-103,"width":340,"height":111}, + {"type":"text","text":"{{[[Lemons for Cleaning]]}}","id":"aa6a67a2ff0f2fe8","x":-359,"y":-77,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"","id":"a96e14fbb7d1265f","x":-673,"y":200,"width":250,"height":120,"color":"6"}, + {"type":"text","text":"","id":"7f19194be69549ec","x":-359,"y":200,"width":250,"height":120,"color":"6"}, + {"id":"e7990bd20a1a3f11","type":"text","text":"{{NOTE}}","x":-670,"y":1020,"width":250,"height":60}, + {"id":"da19d9eee04a6946","type":"text","text":"This reference node will always correspond to the active note when the cannoli was started.\n\nYou can use this syntax to build chatbots (see [[4. Chat arrows.cno.canvas|4. Chat arrows.cno]]) or cannolis that process the content of the active note somehow.","x":-1039,"y":1010,"width":324,"height":260}, + {"id":"dd06bd8ffd8959c3","type":"text","text":"","x":-670,"y":1140,"width":250,"height":130,"color":"6"}, + {"id":"d399962128a18b2e","type":"text","text":"","x":-680,"y":615,"width":268,"height":277,"color":"6"}, + {"type":"text","text":"{{[[Meeting Notes]]#}}","id":"30afb34c1019f5df","x":-670,"y":473,"width":250,"height":60,"color":"6"}, + {"id":"b63aa69459ed0e33","type":"text","text":"{{[[Meeting Notes]]}}","x":-670,"y":1380,"width":250,"height":60,"color":"6"}, + {"id":"d19cad0060fcb71c","type":"text","text":"","x":-670,"y":1539,"width":250,"height":60,"color":"6"}, + {"id":"9aff2c48988f7fdf","type":"text","text":"If a variable arrow coming from a reference node starts with a square bracket, it will extract the link for the reference.\n\nThis is uses in cases when you dynamically create nodes and need to get their link reliably.","x":-1033,"y":1380,"width":318,"height":239}, + {"id":"9967b60050a55863","type":"text","text":"{{[[Meeting Notes]]}}","x":-670,"y":1700,"width":250,"height":60,"color":"6"}, + {"id":"570d87dc498def43","type":"text","text":"","x":-670,"y":1859,"width":250,"height":60,"color":"6"}, + {"id":"94c9f6ee12de2723","type":"text","text":"You can use arrows that start with \":\" to retrieve the associated property of the same name from a note.\n\nIf there is nothing on the arrow other than \":\", all properties will be retrieved. ","x":-1033,"y":1700,"width":318,"height":239}, + {"id":"382cdbdf89daa53c","type":"text","text":"{{[[Meeting Notes]]}}","x":-360,"y":1700,"width":250,"height":60,"color":"6"}, + {"id":"386367aa8acf2917","type":"text","text":"","x":-360,"y":1859,"width":250,"height":60,"color":"6"}, + {"id":"47f1774a10a6de98","type":"text","text":"{{[[Meeting Notes]]}}","x":-670,"y":2020,"width":250,"height":60,"color":"6"}, + {"id":"09ec11f71f736c5a","type":"text","text":"","x":-670,"y":2179,"width":250,"height":60,"color":"6"}, + {"id":"82df68e8b67c09c8","type":"text","text":"You can use arrows that start with \"/\" to retrieve the path of a reference node.\n\nThis could be useful for creating notes in the same folder as dynamically selected notes.","x":-1033,"y":2020,"width":318,"height":219}, + {"id":"8352e64802f9ff93","type":"text","text":"You can add multiple modifiers in a single reference:\n{{[[Note]]^!#}}","x":280,"y":785,"width":398,"height":120}, + {"id":"0856fc4c98e0e01c","type":"text","text":"To include the properties (YAML frontmatter) in the note, reference it like this:\n{{[[Note]]^}}\n\nIf your default setting is to include the properties, you can remove them like this:\n{{[[Note]]!^}}\n\nIf you are editing a note, this modifier will also change if the edit can affect the existing properties. This is useful if you don't want to overwrite properties when you edit a note.","x":280,"y":413,"width":420,"height":342}, + {"type":"text","text":"{{[[Meeting Notes]]^}}","id":"10439db683a6c0a7","x":-35,"y":473,"width":250,"height":60,"color":"6"}, + {"id":"919f3852d5538bac","type":"text","text":"","x":-44,"y":615,"width":268,"height":277,"color":"6"}, + {"id":"faa26d9da34c53d9","type":"text","text":"","x":-368,"y":615,"width":268,"height":277,"color":"6"}, + {"type":"text","text":"{{[[Meeting Notes]]@}}","id":"cf0cf7433914ad7f","x":-359,"y":473,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"You can change how notes are extracted or edited using symbols after the note within a reference.\n\nThese modifiers will override the related settings you chose in the cannoli settings.","id":"f98df3d186b6b8b3","x":-1079,"y":371,"width":365,"height":205}, + {"id":"21a132196d1026bf","type":"text","text":"To add the filename of a note as a header, reference it like this:\n{{[[Note]]#}}\n\nIf your default setting is to add the filename header, you can remove it like this:\n{{[[Note]]!#}}\n\nThe same is true of the \"@\" modifier, which does the same thing but with a markdown link to the note.","x":-1073,"y":615,"width":354,"height":340} + ], + "edges":[ + {"id":"7ebbdaba21c78245","fromNode":"24fc10789416284c","fromSide":"right","toNode":"62447884955fc816","toSide":"top","color":"2"}, + {"id":"ee4e6166d0ffe43d","fromNode":"24fc10789416284c","fromSide":"bottom","toNode":"e62b59877d19a53b","toSide":"top"}, + {"id":"063d6d8d083b2666","fromNode":"b7597d6f39e7acc9","fromSide":"bottom","toNode":"8039b20f5e260110","toSide":"top"}, + {"id":"9bcad28d8d703638","fromNode":"aa6a67a2ff0f2fe8","fromSide":"bottom","toNode":"dec28b770c6e0601","toSide":"top","label":"a"}, + {"id":"ba5e154b30f8168f","fromNode":"e62b59877d19a53b","fromSide":"bottom","toNode":"37c33e8f19a09beb","toSide":"top"}, + {"id":"6e838ae4192a0925","fromNode":"8039b20f5e260110","fromSide":"bottom","toNode":"a96e14fbb7d1265f","toSide":"top"}, + {"id":"7f3f25c31ae38f6d","fromNode":"dec28b770c6e0601","fromSide":"bottom","toNode":"7f19194be69549ec","toSide":"top"}, + {"id":"8af2e272382f3038","fromNode":"e7990bd20a1a3f11","fromSide":"bottom","toNode":"dd06bd8ffd8959c3","toSide":"top"}, + {"id":"aba263db1eb0f4b6","fromNode":"9967b60050a55863","fromSide":"bottom","toNode":"570d87dc498def43","toSide":"top","label":":Date"}, + {"id":"f0e0c3d61fe7aca3","fromNode":"30afb34c1019f5df","fromSide":"bottom","toNode":"d399962128a18b2e","toSide":"top"}, + {"id":"e137cb2b47fff78e","fromNode":"10439db683a6c0a7","fromSide":"bottom","toNode":"919f3852d5538bac","toSide":"top"}, + {"id":"7919954c7360c103","fromNode":"b63aa69459ed0e33","fromSide":"bottom","toNode":"d19cad0060fcb71c","toSide":"top","label":"["}, + {"id":"a149899b3a0f51b7","fromNode":"47f1774a10a6de98","fromSide":"bottom","toNode":"09ec11f71f736c5a","toSide":"top","label":"/"}, + {"id":"1bb84d00af5d18f5","fromNode":"382cdbdf89daa53c","fromSide":"bottom","toNode":"386367aa8acf2917","toSide":"top","label":":"}, + {"id":"2d839e95573e05a0","fromNode":"cf0cf7433914ad7f","fromSide":"bottom","toNode":"faa26d9da34c53d9","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/2. Writing to notes.canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/2. Writing to notes.canvas index 3de3d3b..ce87c6b 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/2. Writing to notes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/2. Writing to notes.canvas @@ -1 +1,42 @@ -{"nodes":[{"type":"group","id":"a81f6864d57513f0","x":-335,"y":300,"width":755,"height":620,"label":"Tips"},{"type":"group","id":"92f439736587539d","x":-335,"y":-760,"width":615,"height":477,"label":"Reference nodes"},{"id":"50c183ba68857287","type":"group","x":-335,"y":1000,"width":610,"height":259,"label":"Editing properties"},{"type":"group","id":"255a410c19a12e56","x":-335,"y":-160,"width":355,"height":328,"label":"Protecting properties"},{"type":"text","text":"You can write to notes using file cards or the reference node format shown below.","id":"d9b027f149b4da0f","x":-140,"y":-942,"width":253,"height":122},{"type":"text","text":"Write a short article about using lemons for cleaning. It should have the title \"Lemons for Cleaning\" and use proper markdown.","id":"e19b655090530949","x":-312,"y":-740,"width":255,"height":150},{"type":"text","text":"Write a short article about using lemons for cleaning. It should have the title \"Lemons for Cleaning\" and use proper markdown.","id":"1de6b113e5ad75c5","x":8,"y":-740,"width":250,"height":150},{"type":"file","file":"Cannoli College/Example notes/Lemons for Cleaning.md","text":"{{[[Lemons for Cleaning]]}}","id":"d6552cf2b811cb0a","x":-315,"y":-540,"width":261,"height":237},{"type":"text","text":"You can write to a note the same way you'd write to a normal content node, from AI nodes or other content nodes.","id":"fe1f2c35a7426056","x":-640,"y":-622,"width":280,"height":118},{"type":"text","text":"{{[[Lemons for Cleaning]]}}","id":"2160d3369fea2bcb","x":8,"y":-451,"width":250,"height":60,"color":"6"},{"type":"text","text":"Write a sample meeting minutes","id":"cc3989fddfc7607b","x":-297,"y":-134,"width":250,"height":80},{"type":"text","text":"You can change how notes are extracted or edited using symbols after the note within a reference.\n\nThese modifiers will override the related settings you chose in the cannoli settings.","id":"bffb0679a38e68b5","x":-720,"y":-134,"width":365,"height":205},{"type":"text","text":"Utilize multiple chat messages to get a clean written response. You can even use a more expensive model to generate the article, then use a less expensive one to copy the final product to the note.","id":"98deb4f5f13687c5","x":-800,"y":470,"width":440,"height":145},{"type":"text","text":"Outline and write a short article about growing apple trees.","id":"63db7ba6f5cb3524","x":-312,"y":320,"width":250,"height":100},{"type":"text","text":"Write a short poem about walking.","id":"9de84ebf983156f8","x":8,"y":320,"width":250,"height":100},{"type":"file","file":"Cannoli College/Example notes/Apple Trees.md","text":"{{[[Apple Trees]]}}","id":"0561c9ae1669460f","x":-315,"y":715,"width":255,"height":189},{"type":"text","text":"","id":"9de536515698d256","x":220,"y":618,"width":182,"height":62,"color":"6"},{"type":"text","text":"Field arrows can help get good formatting for notes. Use \"content\" and \"title\" field names to keep the LLM from writing the title of the note into the content.","id":"5943bd16d1a71072","x":440,"y":506,"width":357,"height":119},{"type":"text","text":"Ok, now respond with just the article\n\nThere should be nothing in your response other than the article","id":"94567e5a2b31c42b","x":-315,"y":475,"width":255,"height":180},{"id":"9fa03f1308317478","type":"text","text":"To allow the edit to overwrite the properties (YAML frontmatter) in the note, reference it like this:\n{{[[Note]]^}}\n\nIf your default setting is to include (overwrite) the properties, you can remove them like this:\n{{[[Note]]!^}}","x":48,"y":-122,"width":420,"height":229},{"type":"text","text":"{{[[Lemons for Cleaning]]!^}}","id":"6c3aaf24c1410da5","x":-309,"y":77,"width":274,"height":60,"color":"6"},{"type":"file","file":"Cannoli College/Example notes/Walking Poem.md","text":"{{[[Apple Trees]]}}","id":"5e54d6df61248d37","x":8,"y":715,"width":255,"height":189},{"id":"fe4f45ec55ab88f8","type":"text","text":"You can use arrows that start with \":\" to edit the property in the arrow label.\n\nThis also works for list format properties.","x":-678,"y":1020,"width":318,"height":189},{"id":"ae32c84e56f650cb","type":"text","text":"{{[[Meeting Notes]]}}","x":-310,"y":1179,"width":250,"height":60,"color":"6"},{"id":"b58f063da822b869","type":"text","text":"Tuesday","x":-310,"y":1020,"width":250,"height":60,"color":"6"},{"id":"d283ed9e9d24b01d","type":"text","text":"{{[[Meeting Notes]]}}","x":0,"y":1179,"width":250,"height":60,"color":"6"},{"id":"f82f1adc99fcc4db","type":"text","text":"- jim\n- mary","x":0,"y":1020,"width":250,"height":80,"color":"6"}],"edges":[{"id":"32c1cb193a6bfc19","fromNode":"e19b655090530949","fromSide":"bottom","toNode":"d6552cf2b811cb0a","toSide":"top"},{"id":"e339725c61ba4f0b","fromNode":"1de6b113e5ad75c5","fromSide":"bottom","toNode":"2160d3369fea2bcb","toSide":"top"},{"id":"741c9e0b211241a2","fromNode":"94567e5a2b31c42b","fromSide":"bottom","toNode":"0561c9ae1669460f","toSide":"top"},{"id":"38d8c5cd09414fe8","fromNode":"9de84ebf983156f8","fromSide":"bottom","toNode":"5e54d6df61248d37","toSide":"top","color":"6","label":"content"},{"id":"6e207e77a539fbd3","fromNode":"9de84ebf983156f8","fromSide":"bottom","toNode":"9de536515698d256","toSide":"top","color":"6","label":"title"},{"id":"e7cd177b0fe4bf6b","fromNode":"63db7ba6f5cb3524","fromSide":"bottom","toNode":"94567e5a2b31c42b","toSide":"top"},{"id":"996659a79f50e2da","fromNode":"cc3989fddfc7607b","fromSide":"bottom","toNode":"6c3aaf24c1410da5","toSide":"top"},{"id":"790403f81a184f3b","fromNode":"b58f063da822b869","fromSide":"bottom","toNode":"ae32c84e56f650cb","toSide":"top","label":":weekday"},{"id":"503b5af7f363b512","fromNode":"f82f1adc99fcc4db","fromSide":"bottom","toNode":"d283ed9e9d24b01d","toSide":"top","label":":tags"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"a81f6864d57513f0","x":-335,"y":300,"width":755,"height":620,"label":"Tips"}, + {"type":"group","id":"92f439736587539d","x":-335,"y":-760,"width":615,"height":477,"label":"Reference nodes"}, + {"id":"50c183ba68857287","type":"group","x":-335,"y":1000,"width":610,"height":259,"label":"Editing properties"}, + {"type":"group","id":"255a410c19a12e56","x":-335,"y":-160,"width":355,"height":328,"label":"Protecting properties"}, + {"type":"text","text":"You can write to notes using file cards or the reference node format shown below.","id":"d9b027f149b4da0f","x":-140,"y":-942,"width":253,"height":122}, + {"type":"text","text":"Write a short article about using lemons for cleaning. It should have the title \"Lemons for Cleaning\" and use proper markdown.","id":"e19b655090530949","x":-312,"y":-740,"width":255,"height":150}, + {"type":"text","text":"Write a short article about using lemons for cleaning. It should have the title \"Lemons for Cleaning\" and use proper markdown.","id":"1de6b113e5ad75c5","x":8,"y":-740,"width":250,"height":150}, + {"type":"file","file":"Cannoli College/Example notes/Lemons for Cleaning.md","text":"{{[[Lemons for Cleaning]]}}","id":"d6552cf2b811cb0a","x":-315,"y":-540,"width":261,"height":237}, + {"type":"text","text":"You can write to a note the same way you'd write to a normal content node, from AI nodes or other content nodes.","id":"fe1f2c35a7426056","x":-640,"y":-622,"width":280,"height":118}, + {"type":"text","text":"{{[[Lemons for Cleaning]]}}","id":"2160d3369fea2bcb","x":8,"y":-451,"width":250,"height":60,"color":"6"}, + {"type":"text","text":"Write a sample meeting minutes","id":"cc3989fddfc7607b","x":-297,"y":-134,"width":250,"height":80}, + {"type":"text","text":"You can change how notes are extracted or edited using symbols after the note within a reference.\n\nThese modifiers will override the related settings you chose in the cannoli settings.","id":"bffb0679a38e68b5","x":-720,"y":-134,"width":365,"height":205}, + {"type":"text","text":"Utilize multiple chat messages to get a clean written response. You can even use a more expensive model to generate the article, then use a less expensive one to copy the final product to the note.","id":"98deb4f5f13687c5","x":-800,"y":470,"width":440,"height":145}, + {"type":"text","text":"Outline and write a short article about growing apple trees.","id":"63db7ba6f5cb3524","x":-312,"y":320,"width":250,"height":100}, + {"type":"text","text":"Write a short poem about walking.","id":"9de84ebf983156f8","x":8,"y":320,"width":250,"height":100}, + {"type":"file","file":"Cannoli College/Example notes/Apple Trees.md","text":"{{[[Apple Trees]]}}","id":"0561c9ae1669460f","x":-315,"y":715,"width":255,"height":189}, + {"type":"text","text":"","id":"9de536515698d256","x":220,"y":618,"width":182,"height":62,"color":"6"}, + {"type":"text","text":"Field arrows can help get good formatting for notes. Use \"content\" and \"title\" field names to keep the LLM from writing the title of the note into the content.","id":"5943bd16d1a71072","x":440,"y":506,"width":357,"height":119}, + {"type":"text","text":"Ok, now respond with just the article\n\nThere should be nothing in your response other than the article","id":"94567e5a2b31c42b","x":-315,"y":475,"width":255,"height":180}, + {"id":"9fa03f1308317478","type":"text","text":"To allow the edit to overwrite the properties (YAML frontmatter) in the note, reference it like this:\n{{[[Note]]^}}\n\nIf your default setting is to include (overwrite) the properties, you can remove them like this:\n{{[[Note]]!^}}","x":48,"y":-122,"width":420,"height":229}, + {"type":"text","text":"{{[[Lemons for Cleaning]]!^}}","id":"6c3aaf24c1410da5","x":-309,"y":77,"width":274,"height":60,"color":"6"}, + {"type":"file","file":"Cannoli College/Example notes/Walking Poem.md","text":"{{[[Apple Trees]]}}","id":"5e54d6df61248d37","x":8,"y":715,"width":255,"height":189}, + {"id":"fe4f45ec55ab88f8","type":"text","text":"You can use arrows that start with \":\" to edit the property in the arrow label.\n\nThis also works for list format properties.","x":-678,"y":1020,"width":318,"height":189}, + {"id":"ae32c84e56f650cb","type":"text","text":"{{[[Meeting Notes]]}}","x":-310,"y":1179,"width":250,"height":60,"color":"6"}, + {"id":"b58f063da822b869","type":"text","text":"Tuesday","x":-310,"y":1020,"width":250,"height":60,"color":"6"}, + {"id":"d283ed9e9d24b01d","type":"text","text":"{{[[Meeting Notes]]}}","x":0,"y":1179,"width":250,"height":60,"color":"6"}, + {"id":"f82f1adc99fcc4db","type":"text","text":"- jim\n- mary","x":0,"y":1020,"width":250,"height":80,"color":"6"} + ], + "edges":[ + {"id":"32c1cb193a6bfc19","fromNode":"e19b655090530949","fromSide":"bottom","toNode":"d6552cf2b811cb0a","toSide":"top"}, + {"id":"e339725c61ba4f0b","fromNode":"1de6b113e5ad75c5","fromSide":"bottom","toNode":"2160d3369fea2bcb","toSide":"top"}, + {"id":"741c9e0b211241a2","fromNode":"94567e5a2b31c42b","fromSide":"bottom","toNode":"0561c9ae1669460f","toSide":"top"}, + {"id":"38d8c5cd09414fe8","fromNode":"9de84ebf983156f8","fromSide":"bottom","toNode":"5e54d6df61248d37","toSide":"top","color":"6","label":"content"}, + {"id":"6e207e77a539fbd3","fromNode":"9de84ebf983156f8","fromSide":"bottom","toNode":"9de536515698d256","toSide":"top","color":"6","label":"title"}, + {"id":"e7cd177b0fe4bf6b","fromNode":"63db7ba6f5cb3524","fromSide":"bottom","toNode":"94567e5a2b31c42b","toSide":"top"}, + {"id":"996659a79f50e2da","fromNode":"cc3989fddfc7607b","fromSide":"bottom","toNode":"6c3aaf24c1410da5","toSide":"top"}, + {"id":"790403f81a184f3b","fromNode":"b58f063da822b869","fromSide":"bottom","toNode":"ae32c84e56f650cb","toSide":"top","label":":weekday"}, + {"id":"503b5af7f363b512","fromNode":"f82f1adc99fcc4db","fromSide":"bottom","toNode":"d283ed9e9d24b01d","toSide":"top","label":":tags"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/3. Dynamic note references.canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/3. Dynamic note references.canvas index 23af5b8..04dc568 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/3. Dynamic note references.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/3. Dynamic note references.canvas @@ -1 +1,36 @@ -{"nodes":[{"type":"group","id":"3884a37115998334","x":-200,"y":1160,"width":520,"height":760,"label":"Dynamic reference nodes"},{"type":"group","id":"1d4638cc848ce883","x":-160,"y":460,"width":460,"height":575,"label":"Ensuring proper note names"},{"type":"group","id":"190c7fe39136a4e6","x":-175,"y":-400,"width":321,"height":575,"label":"Note names as variables"},{"type":"text","text":"What's this about:\n{{@note}}","id":"4e5095e59d3b1f75","x":-140,"y":-100,"width":250,"height":58},{"type":"text","text":"","id":"78a31a6b0db6e00a","x":-155,"y":40,"width":281,"height":115,"color":"6"},{"type":"text","text":"An \"@\" symbol in front of a variable reference will have the node attempt to extract the content of the note with that name.","id":"8dc52a792fef349a","x":-460,"y":-146,"width":275,"height":150},{"type":"text","text":"Respond with the name of one of these notes without square brackets:\n[[Apple Trees]],\n[[Lemons for Cleaning]]","id":"71fc4d9bcf7e5cef","x":-140,"y":-380,"width":250,"height":160},{"type":"text","text":"In addition to statically referencing notes, you can have the LLM generate note names that you expect to be valid, and reference them in prompts.","id":"aa35fa7b42662498","x":-220,"y":-580,"width":387,"height":120},{"type":"text","text":"Respond with the name of one of these notes:\n[[Apple Trees]],\n[[Lemons for Cleaning]]","id":"a563177e81b5c95e","x":-125,"y":480,"width":250,"height":140},{"type":"text","text":"The square bracket signifies that you'd like the LLM to respond with a note name, and Cannoli uses function calling to ensure that the response is only one of the note names present in the prompt.","id":"e2632c0409b0c31e","x":-500,"y":581,"width":335,"height":179},{"type":"text","text":"","id":"39b8926cc93a3400","x":-140,"y":860,"width":281,"height":155,"color":"6"},{"type":"text","text":"You can use this to build Cannolis that interact with your vault in dynamic ways, navigating through it using links.","id":"8c08925cfa290c8a","x":-508,"y":818,"width":343,"height":127},{"type":"text","text":"The same format can also be used for reference nodes.","id":"ff34fc6b7a9db4a4","x":-540,"y":1281,"width":335,"height":79},{"type":"text","text":"In this example, the LLM chooses a note and writes to it.","id":"c185a020e676b84a","x":-548,"y":1500,"width":343,"height":82},{"type":"text","text":"","id":"65d38a62ff03dbfe","x":110,"y":671,"width":175,"height":60,"color":"6"},{"type":"text","text":"Write an article with that title.","id":"d192686ddf19160b","x":40,"y":1430,"width":250,"height":60},{"type":"text","text":"Respond with the name of one of these notes:\n[[Apple Trees]],\n[[Lemons for Cleaning]]","id":"6b6b4b634889aad8","x":-165,"y":1180,"width":250,"height":140},{"type":"text","text":"{{@note}}","id":"8a0e100e00bdcaea","x":-165,"y":1582,"width":250,"height":58,"color":"6"},{"type":"text","text":"What's this about:\n{{@note}}","id":"0db897a7e991783c","x":-125,"y":760,"width":250,"height":58},{"type":"text","text":"","id":"1394a8cbb5db72d9","x":-165,"y":1720,"width":455,"height":180,"color":"6"},{"type":"text","text":"Getting the LLM to properly name notes can be a challenge. You can ensure the response is a valid note name the LLM has seen by using a single square bracket prefix on an arrow label.","id":"8b52c0b7a2e3aa8a","x":-220,"y":240,"width":442,"height":141}],"edges":[{"id":"f0ecaa4ebe5d824b","fromNode":"71fc4d9bcf7e5cef","fromSide":"bottom","toNode":"4e5095e59d3b1f75","toSide":"top","label":"note"},{"id":"303a7695b62bb265","fromNode":"4e5095e59d3b1f75","fromSide":"bottom","toNode":"78a31a6b0db6e00a","toSide":"top","color":"2"},{"id":"cb401d73afd6b5b0","fromNode":"a563177e81b5c95e","fromSide":"bottom","toNode":"0db897a7e991783c","toSide":"top","label":"[note"},{"id":"87145bcd5b0ef58a","fromNode":"0db897a7e991783c","fromSide":"bottom","toNode":"39b8926cc93a3400","toSide":"top","color":"2"},{"id":"d7621f4a15b0b7fb","fromNode":"6b6b4b634889aad8","fromSide":"bottom","toNode":"8a0e100e00bdcaea","toSide":"top","label":"[note"},{"id":"8748f38aca7e3e66","fromNode":"6b6b4b634889aad8","fromSide":"bottom","toNode":"d192686ddf19160b","toSide":"top"},{"id":"6b0d63d0cc50d49a","fromNode":"d192686ddf19160b","fromSide":"bottom","toNode":"8a0e100e00bdcaea","toSide":"top"},{"id":"b2e6acd4ac04fdb5","fromNode":"a563177e81b5c95e","fromSide":"right","toNode":"65d38a62ff03dbfe","toSide":"top","label":"[note"},{"id":"3cbecc9da0226b67","fromNode":"8a0e100e00bdcaea","fromSide":"bottom","toNode":"1394a8cbb5db72d9","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"3884a37115998334","x":-200,"y":1160,"width":520,"height":760,"label":"Dynamic reference nodes"}, + {"type":"group","id":"1d4638cc848ce883","x":-160,"y":460,"width":460,"height":575,"label":"Ensuring proper note names"}, + {"type":"group","id":"190c7fe39136a4e6","x":-175,"y":-400,"width":321,"height":575,"label":"Note names as variables"}, + {"type":"text","text":"What's this about:\n{{@note}}","id":"4e5095e59d3b1f75","x":-140,"y":-100,"width":250,"height":58}, + {"type":"text","text":"","id":"78a31a6b0db6e00a","x":-155,"y":40,"width":281,"height":115,"color":"6"}, + {"type":"text","text":"An \"@\" symbol in front of a variable reference will have the node attempt to extract the content of the note with that name.","id":"8dc52a792fef349a","x":-460,"y":-146,"width":275,"height":150}, + {"type":"text","text":"Respond with the name of one of these notes without square brackets:\n[[Apple Trees]],\n[[Lemons for Cleaning]]","id":"71fc4d9bcf7e5cef","x":-140,"y":-380,"width":250,"height":160}, + {"type":"text","text":"In addition to statically referencing notes, you can have the LLM generate note names that you expect to be valid, and reference them in prompts.","id":"aa35fa7b42662498","x":-220,"y":-580,"width":387,"height":120}, + {"type":"text","text":"Respond with the name of one of these notes:\n[[Apple Trees]],\n[[Lemons for Cleaning]]","id":"a563177e81b5c95e","x":-125,"y":480,"width":250,"height":140}, + {"type":"text","text":"The square bracket signifies that you'd like the LLM to respond with a note name, and Cannoli uses function calling to ensure that the response is only one of the note names present in the prompt.","id":"e2632c0409b0c31e","x":-500,"y":581,"width":335,"height":179}, + {"type":"text","text":"","id":"39b8926cc93a3400","x":-140,"y":860,"width":281,"height":155,"color":"6"}, + {"type":"text","text":"You can use this to build Cannolis that interact with your vault in dynamic ways, navigating through it using links.","id":"8c08925cfa290c8a","x":-508,"y":818,"width":343,"height":127}, + {"type":"text","text":"The same format can also be used for reference nodes.","id":"ff34fc6b7a9db4a4","x":-540,"y":1281,"width":335,"height":79}, + {"type":"text","text":"In this example, the LLM chooses a note and writes to it.","id":"c185a020e676b84a","x":-548,"y":1500,"width":343,"height":82}, + {"type":"text","text":"","id":"65d38a62ff03dbfe","x":110,"y":671,"width":175,"height":60,"color":"6"}, + {"type":"text","text":"Write an article with that title.","id":"d192686ddf19160b","x":40,"y":1430,"width":250,"height":60}, + {"type":"text","text":"Respond with the name of one of these notes:\n[[Apple Trees]],\n[[Lemons for Cleaning]]","id":"6b6b4b634889aad8","x":-165,"y":1180,"width":250,"height":140}, + {"type":"text","text":"{{@note}}","id":"8a0e100e00bdcaea","x":-165,"y":1582,"width":250,"height":58,"color":"6"}, + {"type":"text","text":"What's this about:\n{{@note}}","id":"0db897a7e991783c","x":-125,"y":760,"width":250,"height":58}, + {"type":"text","text":"","id":"1394a8cbb5db72d9","x":-165,"y":1720,"width":455,"height":180,"color":"6"}, + {"type":"text","text":"Getting the LLM to properly name notes can be a challenge. You can ensure the response is a valid note name the LLM has seen by using a single square bracket prefix on an arrow label.","id":"8b52c0b7a2e3aa8a","x":-220,"y":240,"width":442,"height":141} + ], + "edges":[ + {"id":"f0ecaa4ebe5d824b","fromNode":"71fc4d9bcf7e5cef","fromSide":"bottom","toNode":"4e5095e59d3b1f75","toSide":"top","label":"note"}, + {"id":"303a7695b62bb265","fromNode":"4e5095e59d3b1f75","fromSide":"bottom","toNode":"78a31a6b0db6e00a","toSide":"top","color":"2"}, + {"id":"cb401d73afd6b5b0","fromNode":"a563177e81b5c95e","fromSide":"bottom","toNode":"0db897a7e991783c","toSide":"top","label":"[note"}, + {"id":"87145bcd5b0ef58a","fromNode":"0db897a7e991783c","fromSide":"bottom","toNode":"39b8926cc93a3400","toSide":"top","color":"2"}, + {"id":"d7621f4a15b0b7fb","fromNode":"6b6b4b634889aad8","fromSide":"bottom","toNode":"8a0e100e00bdcaea","toSide":"top","label":"[note"}, + {"id":"8748f38aca7e3e66","fromNode":"6b6b4b634889aad8","fromSide":"bottom","toNode":"d192686ddf19160b","toSide":"top"}, + {"id":"6b0d63d0cc50d49a","fromNode":"d192686ddf19160b","fromSide":"bottom","toNode":"8a0e100e00bdcaea","toSide":"top"}, + {"id":"b2e6acd4ac04fdb5","fromNode":"a563177e81b5c95e","fromSide":"right","toNode":"65d38a62ff03dbfe","toSide":"top","label":"[note"}, + {"id":"3cbecc9da0226b67","fromNode":"8a0e100e00bdcaea","fromSide":"bottom","toNode":"1394a8cbb5db72d9","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/4. Creating notes.canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/4. Creating notes.canvas index 3961dc5..8cb9392 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/4. Creating notes.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/4. Creating notes.canvas @@ -1 +1,28 @@ -{"nodes":[{"id":"4456b948335f3b94","type":"group","x":-334,"y":260,"width":731,"height":518,"label":"Defining path"},{"id":"837ba0cd52636e4c","type":"group","x":-280,"y":-335,"width":677,"height":518,"label":"Creating notes"},{"id":"fc94ad73861dd0b4","type":"text","text":"{{+@articleName}}","x":-40,"y":-146,"width":250,"height":60,"color":"6"},{"id":"375c5de56f45d5e1","type":"text","text":"The Truth About Hula Hoops","x":-260,"y":-296,"width":285,"height":60,"color":"6"},{"id":"679af4d2d1190b6b","type":"text","text":"Write a paragraph about a sinister history of hula hoops","x":85,"y":-315,"width":292,"height":79},{"id":"bd60374fe51f025d","type":"text","text":"","x":-64,"y":-20,"width":299,"height":183,"color":"6"},{"id":"58140dc2db7bc769","type":"text","text":"You can create a note using a special reference node.\n\nAdd a \"+\" before the variable in a dynamic reference node, and it will create that note.","x":-660,"y":-236,"width":354,"height":180},{"id":"4c6e2bf4a9959f15","type":"text","text":"Write an overly apologetic email about how we're out of altoids","x":85,"y":280,"width":292,"height":100},{"id":"6b9ee922dd00451b","type":"text","text":"{{+@title}}","x":-40,"y":449,"width":250,"height":60,"color":"6"},{"id":"7a8aaacc8a5f8e49","type":"text","text":"This feature should play nicely with other plugins like templater.","x":-635,"y":0,"width":329,"height":72},{"id":"8372acb7e244fb15","type":"text","text":"","x":-64,"y":575,"width":299,"height":183,"color":"6"},{"id":"0f4591137e166313","type":"text","text":"No more Altoids","x":-117,"y":280,"width":180,"height":60,"color":"6"},{"id":"b0608205e7a748f6","type":"text","text":"/Cannoli College/4. Vault interaction","x":-306,"y":350,"width":250,"height":60,"color":"6"},{"id":"f3c97367ffc6cce1","type":"text","text":"You can define where the new note will be created using an arrow that starts with \"/\".\n\nIf it's a valid path, then the note will be created there.","x":-700,"y":310,"width":342,"height":180},{"id":"dec1b7beb803bffa","type":"text","text":"This example will create a new note in this folder.","x":-608,"y":575,"width":250,"height":60}],"edges":[{"id":"87857bf3a2254dec","fromNode":"375c5de56f45d5e1","fromSide":"bottom","toNode":"fc94ad73861dd0b4","toSide":"top","label":"articleName"},{"id":"a49c245f203702e6","fromNode":"679af4d2d1190b6b","fromSide":"bottom","toNode":"fc94ad73861dd0b4","toSide":"top"},{"id":"283a21bf831d34da","fromNode":"fc94ad73861dd0b4","fromSide":"bottom","toNode":"bd60374fe51f025d","toSide":"top"},{"id":"c0aea91c093cd031","fromNode":"6b9ee922dd00451b","fromSide":"bottom","toNode":"8372acb7e244fb15","toSide":"top"},{"id":"7aca371238d9f008","fromNode":"0f4591137e166313","fromSide":"bottom","toNode":"6b9ee922dd00451b","toSide":"top","label":"title"},{"id":"f2ab13710488acaa","fromNode":"4c6e2bf4a9959f15","fromSide":"bottom","toNode":"6b9ee922dd00451b","toSide":"top"},{"id":"f9e1ee261742cf86","fromNode":"b0608205e7a748f6","fromSide":"bottom","toNode":"6b9ee922dd00451b","toSide":"left","label":"/"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"4456b948335f3b94","type":"group","x":-334,"y":260,"width":731,"height":518,"label":"Defining path"}, + {"id":"837ba0cd52636e4c","type":"group","x":-280,"y":-335,"width":677,"height":518,"label":"Creating notes"}, + {"id":"fc94ad73861dd0b4","type":"text","text":"{{+@articleName}}","x":-40,"y":-146,"width":250,"height":60,"color":"6"}, + {"id":"375c5de56f45d5e1","type":"text","text":"The Truth About Hula Hoops","x":-260,"y":-296,"width":285,"height":60,"color":"6"}, + {"id":"679af4d2d1190b6b","type":"text","text":"Write a paragraph about a sinister history of hula hoops","x":85,"y":-315,"width":292,"height":79}, + {"id":"bd60374fe51f025d","type":"text","text":"","x":-64,"y":-20,"width":299,"height":183,"color":"6"}, + {"id":"58140dc2db7bc769","type":"text","text":"You can create a note using a special reference node.\n\nAdd a \"+\" before the variable in a dynamic reference node, and it will create that note.","x":-660,"y":-236,"width":354,"height":180}, + {"id":"4c6e2bf4a9959f15","type":"text","text":"Write an overly apologetic email about how we're out of altoids","x":85,"y":280,"width":292,"height":100}, + {"id":"6b9ee922dd00451b","type":"text","text":"{{+@title}}","x":-40,"y":449,"width":250,"height":60,"color":"6"}, + {"id":"7a8aaacc8a5f8e49","type":"text","text":"This feature should play nicely with other plugins like templater.","x":-635,"y":0,"width":329,"height":72}, + {"id":"8372acb7e244fb15","type":"text","text":"","x":-64,"y":575,"width":299,"height":183,"color":"6"}, + {"id":"0f4591137e166313","type":"text","text":"No more Altoids","x":-117,"y":280,"width":180,"height":60,"color":"6"}, + {"id":"b0608205e7a748f6","type":"text","text":"/Cannoli College/4. Vault interaction","x":-306,"y":350,"width":250,"height":60,"color":"6"}, + {"id":"f3c97367ffc6cce1","type":"text","text":"You can define where the new note will be created using an arrow that starts with \"/\".\n\nIf it's a valid path, then the note will be created there.","x":-700,"y":310,"width":342,"height":180}, + {"id":"dec1b7beb803bffa","type":"text","text":"This example will create a new note in this folder.","x":-608,"y":575,"width":250,"height":60} + ], + "edges":[ + {"id":"87857bf3a2254dec","fromNode":"375c5de56f45d5e1","fromSide":"bottom","toNode":"fc94ad73861dd0b4","toSide":"top","label":"articleName"}, + {"id":"a49c245f203702e6","fromNode":"679af4d2d1190b6b","fromSide":"bottom","toNode":"fc94ad73861dd0b4","toSide":"top"}, + {"id":"283a21bf831d34da","fromNode":"fc94ad73861dd0b4","fromSide":"bottom","toNode":"bd60374fe51f025d","toSide":"top"}, + {"id":"c0aea91c093cd031","fromNode":"6b9ee922dd00451b","fromSide":"bottom","toNode":"8372acb7e244fb15","toSide":"top"}, + {"id":"7aca371238d9f008","fromNode":"0f4591137e166313","fromSide":"bottom","toNode":"6b9ee922dd00451b","toSide":"top","label":"title"}, + {"id":"f2ab13710488acaa","fromNode":"4c6e2bf4a9959f15","fromSide":"bottom","toNode":"6b9ee922dd00451b","toSide":"top"}, + {"id":"f9e1ee261742cf86","fromNode":"b0608205e7a748f6","fromSide":"bottom","toNode":"6b9ee922dd00451b","toSide":"left","label":"/"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/5. Referencing selections.canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/5. Referencing selections.canvas index 0e02f57..4cfcee6 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/5. Referencing selections.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/5. Referencing selections.canvas @@ -1 +1,18 @@ -{"nodes":[{"id":"8c02946171040e71","type":"group","x":30,"y":-145,"width":350,"height":345,"label":"Special \"SELECTION\" variable"},{"id":"a0047756f6bf199f","type":"group","x":30,"y":280,"width":350,"height":320,"label":"Replacing selections"},{"id":"28278bc5135af80c","type":"text","text":"Respond with a more concise version of this text:\n{{SELECTION}}","x":75,"y":-125,"width":250,"height":120},{"id":"9b5312d8361c2f5e","type":"text","text":"","x":75,"y":40,"width":250,"height":130,"color":"6"},{"id":"6f34b064907441fd","type":"text","text":"This works in any workspace where you can select text, including canvas files.\n\nTry it on the sentence above.","x":-313,"y":-100,"width":324,"height":140},{"id":"21dc5d31fab5298f","type":"text","text":"You can reference the current selection (the text highlighted by your cursor when you started the cannoli) using the {{SELECTION}} variable","x":11,"y":-360,"width":378,"height":142},{"id":"2deb4b62d41bbfb7","type":"text","text":"Respond with a more concise version of this text:\n{{SELECTION}}","x":75,"y":300,"width":250,"height":120},{"id":"6e8591393bf5e285","type":"text","text":"You can write to a selection reference node just like a Note reference node. \n\nWriting to a {{SELECTION}} node will replace the text if there is a selection, or insert it at the cursor if there isn't.","x":-340,"y":325,"width":351,"height":175},{"id":"880831fc3c8b5e93","type":"text","text":"{{SELECTION}}","x":75,"y":500,"width":250,"height":60,"color":"6"},{"id":"c940877ff5ddd66f","type":"text","text":"Note that if you click away from a selection before the cannoli reaches this node, it will change where the replacement happens, so be wary of long cannolis that use this feature.","x":389,"y":346,"width":404,"height":133}],"edges":[{"id":"ff57adf1f2f08d4d","fromNode":"28278bc5135af80c","fromSide":"bottom","toNode":"9b5312d8361c2f5e","toSide":"top"},{"id":"e6c1d0371468967e","fromNode":"2deb4b62d41bbfb7","fromSide":"bottom","toNode":"880831fc3c8b5e93","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"8c02946171040e71","type":"group","x":30,"y":-145,"width":350,"height":345,"label":"Special \"SELECTION\" variable"}, + {"id":"a0047756f6bf199f","type":"group","x":30,"y":280,"width":350,"height":320,"label":"Replacing selections"}, + {"id":"28278bc5135af80c","type":"text","text":"Respond with a more concise version of this text:\n{{SELECTION}}","x":75,"y":-125,"width":250,"height":120}, + {"id":"9b5312d8361c2f5e","type":"text","text":"","x":75,"y":40,"width":250,"height":130,"color":"6"}, + {"id":"6f34b064907441fd","type":"text","text":"This works in any workspace where you can select text, including canvas files.\n\nTry it on the sentence above.","x":-313,"y":-100,"width":324,"height":140}, + {"id":"21dc5d31fab5298f","type":"text","text":"You can reference the current selection (the text highlighted by your cursor when you started the cannoli) using the {{SELECTION}} variable","x":11,"y":-360,"width":378,"height":142}, + {"id":"2deb4b62d41bbfb7","type":"text","text":"Respond with a more concise version of this text:\n{{SELECTION}}","x":75,"y":300,"width":250,"height":120}, + {"id":"6e8591393bf5e285","type":"text","text":"You can write to a selection reference node just like a Note reference node. \n\nWriting to a {{SELECTION}} node will replace the text if there is a selection, or insert it at the cursor if there isn't.","x":-340,"y":325,"width":351,"height":175}, + {"id":"880831fc3c8b5e93","type":"text","text":"{{SELECTION}}","x":75,"y":500,"width":250,"height":60,"color":"6"}, + {"id":"c940877ff5ddd66f","type":"text","text":"Note that if you click away from a selection before the cannoli reaches this node, it will change where the replacement happens, so be wary of long cannolis that use this feature.","x":389,"y":346,"width":404,"height":133} + ], + "edges":[ + {"id":"ff57adf1f2f08d4d","fromNode":"28278bc5135af80c","fromSide":"bottom","toNode":"9b5312d8361c2f5e","toSide":"top"}, + {"id":"e6c1d0371468967e","fromNode":"2deb4b62d41bbfb7","fromSide":"bottom","toNode":"880831fc3c8b5e93","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/6. Dataview.canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/6. Dataview.canvas index c237b22..d6b005a 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/6. Dataview.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/6. Dataview.canvas @@ -1 +1,32 @@ -{"nodes":[{"id":"abdd7f206ec179b5","type":"group","x":-292,"y":2360,"width":926,"height":786,"label":"Selecting notes from Dataview queries"},{"id":"866cf47b85828224","type":"group","x":-280,"y":200,"width":901,"height":800,"label":"Dataview Queries"},{"id":"54821284bfffa404","type":"group","x":-280,"y":1240,"width":901,"height":800,"label":"Embedding notes with Dataview"},{"id":"d496337fb835112d","type":"text","text":"Here is a dataview query:\n```dataview\nLIST\nFROM #cannoliArticle\n```\nWhat do you think are inside these notes?","x":-237,"y":220,"width":339,"height":246,"color":"0"},{"id":"0a4607692e99ccc4","type":"text","text":"Tell me about this table\n\n```dataview\nTABLE file.name,file.ctime\nFROM #cannoliArticle\n```","x":207,"y":220,"width":390,"height":255,"color":"0"},{"id":"2a540f6685096f40","type":"text","text":"","x":-260,"y":560,"width":385,"height":420,"color":"6"},{"id":"4991b1a604f5b0c0","type":"text","text":"","x":203,"y":560,"width":398,"height":420,"color":"6"},{"id":"86b5e262c31686a5","type":"text","text":"Read these notes and write a haiku about each one:\n\n{{\n```dataview\nLIST\nFROM #cannoliArticle\n```\n}}","x":-237,"y":1260,"width":339,"height":280,"color":"0"},{"id":"e00b70c20e8b5de4","type":"text","text":"Read these notes and write a haiku about each one:\n\n{{\n```dataview\nLIST\nFROM #cannoliArticle\n```\n!#}}","x":207,"y":1260,"width":390,"height":280,"color":"0"},{"id":"af6026eb8c26d15b","type":"text","text":"Sometimes you want the LLM to see the contents of all of the resulting links of a dataview query. To do that you can simply wrap the query in double curly brackets the way you would with a note embed. This looks better with lists than with tables.","x":-160,"y":1080,"width":680,"height":108},{"id":"025b43bd8ffaa90d","type":"text","text":"Cannoli renders Dataview DQL queries so the LLM can see them. \n\nIf you have the Dataview plugin enabled on a vault, and there's a valid query inside of a node or embedded note, the LLM will see the results of that query as a Markdown list or table.\n\nDataviewJS queries are not implemented yet, but we're still working to get that in as well. (p.s. if you're reading this and have arcane dataview knowledge that might help please reach out on the repo)","x":-131,"y":-120,"width":623,"height":257},{"id":"9c168db7948ae50a","type":"text","text":"","x":-260,"y":1600,"width":385,"height":420,"color":"6"},{"id":"5fdb171ce82f69ef","type":"text","text":"","x":203,"y":1600,"width":398,"height":420,"color":"6"},{"id":"ffbe198b39af63cb","type":"text","text":"You can use the same syntax for including or excluding note titles and properties as you can in normal note embeds. (see [[1. Referencing notes.canvas|1. Referencing notes]])","x":660,"y":1340,"width":440,"height":120},{"id":"cdfbde60f7de0699","type":"text","text":"Which of these notes looks most interesting:\n\n```dataview\nLIST\nFROM #cannoliArticle\n```","x":-272,"y":2380,"width":339,"height":280,"color":"0"},{"id":"e05c95af482766e8","type":"text","text":"","x":195,"y":2490,"width":385,"height":516,"color":"6"},{"id":"522c7968323ab01f","type":"text","text":"","x":-228,"y":2946,"width":398,"height":160,"color":"6"},{"id":"480170f0f0cf1c3d","type":"text","text":"Do you find this note interesting?\n\n{{@mostInteresting}}","x":-228,"y":2748,"width":250,"height":130,"color":"0"},{"id":"fe2b51ed55928420","type":"text","text":"You can also use the note selection syntax on arrows leaving call nodes to get the LLM to output a selection from the links it sees.\n\nFor more on this see [[3. Dynamic note references.canvas|3. Dynamic note references]]","x":-62,"y":2120,"width":503,"height":160}],"edges":[{"id":"2ebd28fb6c5c101d","fromNode":"d496337fb835112d","fromSide":"bottom","toNode":"2a540f6685096f40","toSide":"top","color":"2"},{"id":"8ee71d334a61b7db","fromNode":"0a4607692e99ccc4","fromSide":"bottom","toNode":"4991b1a604f5b0c0","toSide":"top","color":"2"},{"id":"a9b3dffa5e282eac","fromNode":"86b5e262c31686a5","fromSide":"bottom","toNode":"9c168db7948ae50a","toSide":"top","color":"2"},{"id":"a7d1263d7926e2df","fromNode":"e00b70c20e8b5de4","fromSide":"bottom","toNode":"5fdb171ce82f69ef","toSide":"top","color":"2"},{"id":"c66428ad3bf6bee0","fromNode":"480170f0f0cf1c3d","fromSide":"right","toNode":"e05c95af482766e8","toSide":"left","color":"2"},{"id":"dc0fdfc897e3f0d4","fromNode":"cdfbde60f7de0699","fromSide":"bottom","toNode":"480170f0f0cf1c3d","toSide":"top","label":"[mostInteresting"},{"id":"5c40358a63c8ae10","fromNode":"480170f0f0cf1c3d","fromSide":"bottom","toNode":"522c7968323ab01f","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"abdd7f206ec179b5","type":"group","x":-292,"y":2360,"width":926,"height":786,"label":"Selecting notes from Dataview queries"}, + {"id":"866cf47b85828224","type":"group","x":-280,"y":200,"width":901,"height":800,"label":"Dataview Queries"}, + {"id":"54821284bfffa404","type":"group","x":-280,"y":1240,"width":901,"height":800,"label":"Embedding notes with Dataview"}, + {"id":"d496337fb835112d","type":"text","text":"Here is a dataview query:\n```dataview\nLIST\nFROM #cannoliArticle\n```\nWhat do you think are inside these notes?","x":-237,"y":220,"width":339,"height":246,"color":"0"}, + {"id":"0a4607692e99ccc4","type":"text","text":"Tell me about this table\n\n```dataview\nTABLE file.name,file.ctime\nFROM #cannoliArticle\n```","x":207,"y":220,"width":390,"height":255,"color":"0"}, + {"id":"2a540f6685096f40","type":"text","text":"","x":-260,"y":560,"width":385,"height":420,"color":"6"}, + {"id":"4991b1a604f5b0c0","type":"text","text":"","x":203,"y":560,"width":398,"height":420,"color":"6"}, + {"id":"86b5e262c31686a5","type":"text","text":"Read these notes and write a haiku about each one:\n\n{{\n```dataview\nLIST\nFROM #cannoliArticle\n```\n}}","x":-237,"y":1260,"width":339,"height":280,"color":"0"}, + {"id":"e00b70c20e8b5de4","type":"text","text":"Read these notes and write a haiku about each one:\n\n{{\n```dataview\nLIST\nFROM #cannoliArticle\n```\n!#}}","x":207,"y":1260,"width":390,"height":280,"color":"0"}, + {"id":"af6026eb8c26d15b","type":"text","text":"Sometimes you want the LLM to see the contents of all of the resulting links of a dataview query. To do that you can simply wrap the query in double curly brackets the way you would with a note embed. This looks better with lists than with tables.","x":-160,"y":1080,"width":680,"height":108}, + {"id":"025b43bd8ffaa90d","type":"text","text":"Cannoli renders Dataview DQL queries so the LLM can see them. \n\nIf you have the Dataview plugin enabled on a vault, and there's a valid query inside of a node or embedded note, the LLM will see the results of that query as a Markdown list or table.\n\nDataviewJS queries are not implemented yet, but we're still working to get that in as well. (p.s. if you're reading this and have arcane dataview knowledge that might help please reach out on the repo)","x":-131,"y":-120,"width":623,"height":257}, + {"id":"9c168db7948ae50a","type":"text","text":"","x":-260,"y":1600,"width":385,"height":420,"color":"6"}, + {"id":"5fdb171ce82f69ef","type":"text","text":"","x":203,"y":1600,"width":398,"height":420,"color":"6"}, + {"id":"ffbe198b39af63cb","type":"text","text":"You can use the same syntax for including or excluding note titles and properties as you can in normal note embeds. (see [[1. Referencing notes.canvas|1. Referencing notes]])","x":660,"y":1340,"width":440,"height":120}, + {"id":"cdfbde60f7de0699","type":"text","text":"Which of these notes looks most interesting:\n\n```dataview\nLIST\nFROM #cannoliArticle\n```","x":-272,"y":2380,"width":339,"height":280,"color":"0"}, + {"id":"e05c95af482766e8","type":"text","text":"","x":195,"y":2490,"width":385,"height":516,"color":"6"}, + {"id":"522c7968323ab01f","type":"text","text":"","x":-228,"y":2946,"width":398,"height":160,"color":"6"}, + {"id":"480170f0f0cf1c3d","type":"text","text":"Do you find this note interesting?\n\n{{@mostInteresting}}","x":-228,"y":2748,"width":250,"height":130,"color":"0"}, + {"id":"fe2b51ed55928420","type":"text","text":"You can also use the note selection syntax on arrows leaving call nodes to get the LLM to output a selection from the links it sees.\n\nFor more on this see [[3. Dynamic note references.canvas|3. Dynamic note references]]","x":-62,"y":2120,"width":503,"height":160} + ], + "edges":[ + {"id":"2ebd28fb6c5c101d","fromNode":"d496337fb835112d","fromSide":"bottom","toNode":"2a540f6685096f40","toSide":"top","color":"2"}, + {"id":"8ee71d334a61b7db","fromNode":"0a4607692e99ccc4","fromSide":"bottom","toNode":"4991b1a604f5b0c0","toSide":"top","color":"2"}, + {"id":"a9b3dffa5e282eac","fromNode":"86b5e262c31686a5","fromSide":"bottom","toNode":"9c168db7948ae50a","toSide":"top","color":"2"}, + {"id":"a7d1263d7926e2df","fromNode":"e00b70c20e8b5de4","fromSide":"bottom","toNode":"5fdb171ce82f69ef","toSide":"top","color":"2"}, + {"id":"c66428ad3bf6bee0","fromNode":"480170f0f0cf1c3d","fromSide":"right","toNode":"e05c95af482766e8","toSide":"left","color":"2"}, + {"id":"dc0fdfc897e3f0d4","fromNode":"cdfbde60f7de0699","fromSide":"bottom","toNode":"480170f0f0cf1c3d","toSide":"top","label":"[mostInteresting"}, + {"id":"5c40358a63c8ae10","fromNode":"480170f0f0cf1c3d","fromSide":"bottom","toNode":"522c7968323ab01f","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/7. Embedding Search (Smart Connections).canvas b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/7. Embedding Search (Smart Connections).canvas index 257b5cb..8cb4afb 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/7. Embedding Search (Smart Connections).canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/4. Vault interaction/7. Embedding Search (Smart Connections).canvas @@ -1 +1,28 @@ -{"nodes":[{"id":"6343f06af4ec924a","type":"group","x":-775,"y":-280,"width":1084,"height":1140,"label":"Using Smart Connections to search"},{"id":"b74952d80e6a6d39","type":"group","x":-684,"y":-1313,"width":901,"height":800,"label":"Rendering Smart Connection search"},{"id":"48769029686ff688","type":"text","text":"","x":-664,"y":-913,"width":385,"height":380,"color":"6"},{"id":"d244ad86313a5ef4","type":"text","text":"","x":-201,"y":-913,"width":398,"height":380,"color":"6"},{"id":"46c4ce310ed88cf1","type":"text","text":"Here is a smart connections dynamic codeblock:\n\n```smart-connections\nAyy lmao\n```\nWhat's the most similar note probably about?","x":-641,"y":-1293,"width":339,"height":340},{"id":"6ce747453d1d423f","type":"text","text":"Cannoli can leverage Smart Connections to do embedding search on your vault.\n\nSmart Connections is a popular plugin which, among many other features, can embed your whole vault using a variety of embeddings models. This lets you search for notes or blocks that are semantically similar to a given note or query.\n\nIf you have Smart Connections enabled on this vault, you can write a dynamic code block (triple backticks with \"smart-connections\" following the first set of backticks). Then you can show an LLM the resulting similarity ranking table or embed the most similar X notes.\n\n","x":-540,"y":-1700,"width":615,"height":320},{"id":"38595c66057d2f38","type":"text","text":"Here we've embedded the top 3 results of the similarity search:\n\n{{3\n```smart-connections\nAyy lmao\n```\n#@}}\n\nSummarize the first note","x":-171,"y":-1293,"width":339,"height":340},{"id":"b4ec110ce33df376","type":"text","text":"To include the contents of the top results, wrap the whole code block in curly braces and newlines.\n\nYou can define the number of results to include using an integer after the first set of braces.\n\nYou can also include the modifiers as you would with note reference nodes. This time we included the new \"@\" link modifier to include the markdown link above the note. This will help make cannolis that can browse and search.","x":240,"y":-1266,"width":480,"height":287},{"id":"6e728caab4a543a8","type":"text","text":"What was the metaphor about the earth in that poem about walking?","x":-387,"y":-260,"width":462,"height":80,"color":"6"},{"id":"b4a0c102d3eeac17","type":"text","text":"Embedding search enables lots of cool stuff. You can make open queries about your vault or even have the LLM generate queries where needed, then zero in on the results and inject them as context wherever needed.","x":-572,"y":-440,"width":607,"height":103},{"id":"5db01d3546fde562","type":"text","text":"Which of the notes below fits the search query best?\n\nQuery: \"{{query}}\"\n\n{{4\n```smart-connections\n{{query}}\n```\n@}}","x":-726,"y":-90,"width":339,"height":280},{"id":"5230a36585d39219","type":"text","text":"","x":-112,"y":-137,"width":385,"height":615,"color":"6"},{"id":"44636ef212354a8b","type":"text","text":"Here's a note that resulted from a search:\n\n{{@bestFit}}\n\nUse that note to answer this query: \"{{query}}\"","x":-510,"y":280,"width":241,"height":198},{"id":"79b80456d62de306","type":"text","text":"","x":-678,"y":520,"width":577,"height":300,"color":"6"},{"id":"9f3d2a5adb087657","type":"text","text":"In this cannoli we perform an embedding search on a query, have the LLM select the most relevant note from the top 4, and use that as context to answer the initial query.","x":-1180,"y":17,"width":383,"height":154}],"edges":[{"id":"9c97bc5b033f7912","fromNode":"46c4ce310ed88cf1","fromSide":"bottom","toNode":"48769029686ff688","toSide":"top","color":"2"},{"id":"8488abe3896113e6","fromNode":"5db01d3546fde562","fromSide":"bottom","toNode":"44636ef212354a8b","toSide":"top","label":"[bestFit"},{"id":"e0bd7da21aff0c3d","fromNode":"44636ef212354a8b","fromSide":"right","toNode":"5230a36585d39219","toSide":"left","color":"2"},{"id":"782881c8520b4911","fromNode":"44636ef212354a8b","fromSide":"bottom","toNode":"79b80456d62de306","toSide":"top"},{"id":"8780fbd775315770","fromNode":"38595c66057d2f38","fromSide":"bottom","toNode":"d244ad86313a5ef4","toSide":"top","color":"2"},{"id":"2df29e8ef4d81f5d","fromNode":"6e728caab4a543a8","fromSide":"bottom","toNode":"5db01d3546fde562","toSide":"top","label":"query"},{"id":"73a455ab933fce60","fromNode":"6e728caab4a543a8","fromSide":"bottom","toNode":"44636ef212354a8b","toSide":"top","label":"query"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"6343f06af4ec924a","type":"group","x":-775,"y":-280,"width":1084,"height":1140,"label":"Using Smart Connections to search"}, + {"id":"b74952d80e6a6d39","type":"group","x":-684,"y":-1313,"width":901,"height":800,"label":"Rendering Smart Connection search"}, + {"id":"48769029686ff688","type":"text","text":"","x":-664,"y":-913,"width":385,"height":380,"color":"6"}, + {"id":"d244ad86313a5ef4","type":"text","text":"","x":-201,"y":-913,"width":398,"height":380,"color":"6"}, + {"id":"46c4ce310ed88cf1","type":"text","text":"Here is a smart connections dynamic codeblock:\n\n```smart-connections\nAyy lmao\n```\nWhat's the most similar note probably about?","x":-641,"y":-1293,"width":339,"height":340}, + {"id":"6ce747453d1d423f","type":"text","text":"Cannoli can leverage Smart Connections to do embedding search on your vault.\n\nSmart Connections is a popular plugin which, among many other features, can embed your whole vault using a variety of embeddings models. This lets you search for notes or blocks that are semantically similar to a given note or query.\n\nIf you have Smart Connections enabled on this vault, you can write a dynamic code block (triple backticks with \"smart-connections\" following the first set of backticks). Then you can show an LLM the resulting similarity ranking table or embed the most similar X notes.\n\n","x":-540,"y":-1700,"width":615,"height":320}, + {"id":"38595c66057d2f38","type":"text","text":"Here we've embedded the top 3 results of the similarity search:\n\n{{3\n```smart-connections\nAyy lmao\n```\n#@}}\n\nSummarize the first note","x":-171,"y":-1293,"width":339,"height":340}, + {"id":"b4ec110ce33df376","type":"text","text":"To include the contents of the top results, wrap the whole code block in curly braces and newlines.\n\nYou can define the number of results to include using an integer after the first set of braces.\n\nYou can also include the modifiers as you would with note reference nodes. This time we included the new \"@\" link modifier to include the markdown link above the note. This will help make cannolis that can browse and search.","x":240,"y":-1266,"width":480,"height":287}, + {"id":"6e728caab4a543a8","type":"text","text":"What was the metaphor about the earth in that poem about walking?","x":-387,"y":-260,"width":462,"height":80,"color":"6"}, + {"id":"b4a0c102d3eeac17","type":"text","text":"Embedding search enables lots of cool stuff. You can make open queries about your vault or even have the LLM generate queries where needed, then zero in on the results and inject them as context wherever needed.","x":-572,"y":-440,"width":607,"height":103}, + {"id":"5db01d3546fde562","type":"text","text":"Which of the notes below fits the search query best?\n\nQuery: \"{{query}}\"\n\n{{4\n```smart-connections\n{{query}}\n```\n@}}","x":-726,"y":-90,"width":339,"height":280}, + {"id":"5230a36585d39219","type":"text","text":"","x":-112,"y":-137,"width":385,"height":615,"color":"6"}, + {"id":"44636ef212354a8b","type":"text","text":"Here's a note that resulted from a search:\n\n{{@bestFit}}\n\nUse that note to answer this query: \"{{query}}\"","x":-510,"y":280,"width":241,"height":198}, + {"id":"79b80456d62de306","type":"text","text":"","x":-678,"y":520,"width":577,"height":300,"color":"6"}, + {"id":"9f3d2a5adb087657","type":"text","text":"In this cannoli we perform an embedding search on a query, have the LLM select the most relevant note from the top 4, and use that as context to answer the initial query.","x":-1180,"y":17,"width":383,"height":154} + ], + "edges":[ + {"id":"9c97bc5b033f7912","fromNode":"46c4ce310ed88cf1","fromSide":"bottom","toNode":"48769029686ff688","toSide":"top","color":"2"}, + {"id":"8488abe3896113e6","fromNode":"5db01d3546fde562","fromSide":"bottom","toNode":"44636ef212354a8b","toSide":"top","label":"[bestFit"}, + {"id":"e0bd7da21aff0c3d","fromNode":"44636ef212354a8b","fromSide":"right","toNode":"5230a36585d39219","toSide":"left","color":"2"}, + {"id":"782881c8520b4911","fromNode":"44636ef212354a8b","fromSide":"bottom","toNode":"79b80456d62de306","toSide":"top"}, + {"id":"8780fbd775315770","fromNode":"38595c66057d2f38","fromSide":"bottom","toNode":"d244ad86313a5ef4","toSide":"top","color":"2"}, + {"id":"2df29e8ef4d81f5d","fromNode":"6e728caab4a543a8","fromSide":"bottom","toNode":"5db01d3546fde562","toSide":"top","label":"query"}, + {"id":"73a455ab933fce60","fromNode":"6e728caab4a543a8","fromSide":"bottom","toNode":"44636ef212354a8b","toSide":"top","label":"query"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/1. Basic groups.canvas b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/1. Basic groups.canvas index 86ac61a..ff94e95 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/1. Basic groups.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/1. Basic groups.canvas @@ -1 +1,27 @@ -{"nodes":[{"type":"group","id":"3507f53b8ef19875","x":-400,"y":-280,"width":610,"height":940,"label":"Basic Groups"},{"type":"group","id":"9ea4603066155724","x":-100,"y":-220,"width":290,"height":273,"label":"Group 1"},{"type":"group","id":"9d076987e99ce6a6","x":-100,"y":260,"width":290,"height":240,"label":"Group 2"},{"type":"text","text":"Hey what model are you?","id":"554b1577865f24d4","x":-80,"y":280,"width":250,"height":60},{"type":"text","text":"Actually you don't know that.","id":"35881fd57b1d4269","x":-80,"y":420,"width":250,"height":60},{"type":"text","text":"","id":"fd9b2131408190a4","x":-80,"y":520,"width":250,"height":120,"color":"6"},{"type":"text","text":"gpt-4","id":"e7d78cc1a7a948f8","x":-320,"y":250,"width":105,"height":60,"color":"6"},{"type":"text","text":"Rubiks cube","id":"e83b4c5b2409b738","x":-370,"y":-163,"width":180,"height":57,"color":"6"},{"type":"text","text":"Here we use a basic group to provide all of the member nodes with a variable.","id":"1354395dbba49c59","x":-700,"y":-163,"width":290,"height":93},{"type":"text","text":"Basic groups allow you to conveniently provide variables or change config settings of multiple nodes.\n\nFunctionally, its the same as drawing arrows to every node in the group.","id":"cb4e55a56aa20105","x":-320,"y":-500,"width":423,"height":170},{"type":"text","text":"Groups whose label is not an integer are basic groups.","id":"ad8c877c4bdbc784","x":-298,"y":-620,"width":380,"height":94},{"type":"text","text":"You can use {{a}} in this node","id":"3f724ea642f3f39d","x":-80,"y":-200,"width":250,"height":60},{"type":"text","text":"And you can use {{a}} in this node","id":"6b128a864045c0e7","x":-80,"y":-27,"width":250,"height":60},{"type":"text","text":"","id":"b6f9f0b26ae8e68e","x":-80,"y":80,"width":250,"height":100,"color":"6"},{"type":"text","text":"Here we change the model config setting of all the member nodes of a group.","id":"e58e6effa966f52b","x":-728,"y":242,"width":318,"height":98}],"edges":[{"id":"3986f98e5c79c58a","fromNode":"e83b4c5b2409b738","fromSide":"right","toNode":"9ea4603066155724","toSide":"left","label":"a"},{"id":"b54add99d36d3b53","fromNode":"e7d78cc1a7a948f8","fromSide":"right","toNode":"9d076987e99ce6a6","toSide":"left","color":"2","label":"model"},{"id":"3ec08b096671959f","fromNode":"3f724ea642f3f39d","fromSide":"bottom","toNode":"6b128a864045c0e7","toSide":"top"},{"id":"71449d8dc3ac9bac","fromNode":"6b128a864045c0e7","fromSide":"bottom","toNode":"b6f9f0b26ae8e68e","toSide":"top","color":"2"},{"id":"b2ca430257741d71","fromNode":"554b1577865f24d4","fromSide":"bottom","toNode":"35881fd57b1d4269","toSide":"top"},{"id":"948da6eeffd07b7e","fromNode":"35881fd57b1d4269","fromSide":"bottom","toNode":"fd9b2131408190a4","toSide":"top","color":"2"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"3507f53b8ef19875","x":-400,"y":-280,"width":610,"height":940,"label":"Basic Groups"}, + {"type":"group","id":"9ea4603066155724","x":-100,"y":-220,"width":290,"height":273,"label":"Group 1"}, + {"type":"group","id":"9d076987e99ce6a6","x":-100,"y":260,"width":290,"height":240,"label":"Group 2"}, + {"type":"text","text":"Hey what model are you?","id":"554b1577865f24d4","x":-80,"y":280,"width":250,"height":60}, + {"type":"text","text":"Actually you don't know that.","id":"35881fd57b1d4269","x":-80,"y":420,"width":250,"height":60}, + {"type":"text","text":"","id":"fd9b2131408190a4","x":-80,"y":520,"width":250,"height":120,"color":"6"}, + {"type":"text","text":"gpt-4","id":"e7d78cc1a7a948f8","x":-320,"y":250,"width":105,"height":60,"color":"6"}, + {"type":"text","text":"Rubiks cube","id":"e83b4c5b2409b738","x":-370,"y":-163,"width":180,"height":57,"color":"6"}, + {"type":"text","text":"Here we use a basic group to provide all of the member nodes with a variable.","id":"1354395dbba49c59","x":-700,"y":-163,"width":290,"height":93}, + {"type":"text","text":"Basic groups allow you to conveniently provide variables or change config settings of multiple nodes.\n\nFunctionally, its the same as drawing arrows to every node in the group.","id":"cb4e55a56aa20105","x":-320,"y":-500,"width":423,"height":170}, + {"type":"text","text":"Groups whose label is not an integer are basic groups.","id":"ad8c877c4bdbc784","x":-298,"y":-620,"width":380,"height":94}, + {"type":"text","text":"You can use {{a}} in this node","id":"3f724ea642f3f39d","x":-80,"y":-200,"width":250,"height":60}, + {"type":"text","text":"And you can use {{a}} in this node","id":"6b128a864045c0e7","x":-80,"y":-27,"width":250,"height":60}, + {"type":"text","text":"","id":"b6f9f0b26ae8e68e","x":-80,"y":80,"width":250,"height":100,"color":"6"}, + {"type":"text","text":"Here we change the model config setting of all the member nodes of a group.","id":"e58e6effa966f52b","x":-728,"y":242,"width":318,"height":98} + ], + "edges":[ + {"id":"3986f98e5c79c58a","fromNode":"e83b4c5b2409b738","fromSide":"right","toNode":"9ea4603066155724","toSide":"left","label":"a"}, + {"id":"b54add99d36d3b53","fromNode":"e7d78cc1a7a948f8","fromSide":"right","toNode":"9d076987e99ce6a6","toSide":"left","color":"2","label":"model"}, + {"id":"3ec08b096671959f","fromNode":"3f724ea642f3f39d","fromSide":"bottom","toNode":"6b128a864045c0e7","toSide":"top"}, + {"id":"71449d8dc3ac9bac","fromNode":"6b128a864045c0e7","fromSide":"bottom","toNode":"b6f9f0b26ae8e68e","toSide":"top","color":"2"}, + {"id":"b2ca430257741d71","fromNode":"554b1577865f24d4","fromSide":"bottom","toNode":"35881fd57b1d4269","toSide":"top"}, + {"id":"948da6eeffd07b7e","fromNode":"35881fd57b1d4269","fromSide":"bottom","toNode":"fd9b2131408190a4","toSide":"top","color":"2"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/2. Loop groups.canvas b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/2. Loop groups.canvas index 7327706..a1255b9 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/2. Loop groups.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/2. Loop groups.canvas @@ -1 +1,39 @@ -{"nodes":[{"type":"group","id":"33e7457728f9ef47","x":-320,"y":-80,"width":820,"height":560,"label":"Nested loop groups"},{"type":"group","id":"0064c11720e6cf20","x":-320,"y":560,"width":820,"height":480,"label":"The loop number variable"},{"type":"group","id":"81cdef3b9de52df9","x":-200,"y":-880,"width":460,"height":680,"label":"Loop groups"},{"type":"group","id":"df42bd1da1866b7f","x":-300,"y":0,"width":330,"height":420,"label":"2"},{"type":"group","id":"2ae53ef6008eeb4e","x":-300,"y":640,"width":360,"height":360,"label":"2"},{"type":"group","id":"986991747df080b2","x":-115,"y":-720,"width":290,"height":260,"label":"3"},{"type":"group","id":"d83bf39a509c67bd","x":-280,"y":150,"width":280,"height":250,"label":"2"},{"type":"group","id":"76b98e9977f73412","x":-280,"y":790,"width":310,"height":190,"label":"2"},{"type":"text","text":"When all the nodes in a loop group are finished, all nodes will reset and the group will restart. \n\nIt will loop as many times as are defined in the label, and only the result of the final loop will be sent along the arrows leaving the group.","id":"6e5fbad373215bd8","x":-660,"y":-695,"width":441,"height":170},{"type":"text","text":"Loop groups are colorless groups that have a positive integer in their label.","id":"a408edeafd6bc62f","x":-169,"y":-1040,"width":399,"height":89},{"type":"text","text":"This message will be sent once","id":"2a9251ad533d8576","x":-95,"y":-860,"width":250,"height":60},{"type":"text","text":"This one will be sent 3 times","id":"896ace77fa0c6a7e","x":-95,"y":-700,"width":250,"height":60},{"type":"text","text":"Only the last response will be written to the content node outside the loop.","id":"c6b8d6a1f384022f","x":-95,"y":-610,"width":250,"height":120},{"type":"text","text":"","id":"96f3935e8174877f","x":-95,"y":-400,"width":250,"height":180,"color":"6"},{"type":"text","text":"Nested loop groups will fully reset, meaning in this case the inner group will repeat 4 times.","id":"24835b0cc486957f","x":-690,"y":64,"width":350,"height":106},{"type":"text","text":"This message will be sent 2 times","id":"d09815f95971b8a6","x":-260,"y":20,"width":250,"height":60},{"type":"text","text":"This will be sent 4 times","id":"479bd3009fb464b0","x":-260,"y":170,"width":250,"height":60},{"type":"text","text":"","id":"cdc967d2e777ade5","x":85,"y":-40,"width":395,"height":500,"color":"6"},{"type":"text","text":"Be careful with nested loop groups","id":"bc61ab59035be49d","x":-260,"y":280,"width":250,"height":90},{"type":"text","text":"Logging edges from loop groups will log out what happens on each loop and sub-loop (if its nested)","id":"17c0c46b3378bd79","x":520,"y":120,"width":321,"height":102},{"type":"text","text":"","id":"7b6747a24b1ed36e","x":85,"y":600,"width":395,"height":400,"color":"6"},{"type":"text","text":"Inner loop number: {{#}}\nOuter loop number: {{##}}","id":"a1e4bbbafcec0850","x":-260,"y":840,"width":270,"height":100},{"id":"f029d4309bd2b1fc","type":"text","text":"You can access the current loop number/iteration of the loop group a node is in using the variable {{#}} or {{##...}}.\n\nThe number of \"#\"s corresponds to the depth of the loop number you want to see, in the case of nested loops.","x":-650,"y":665,"width":310,"height":260},{"type":"text","text":"Hello there","id":"4b6e4eac00d4ca2a","x":-250,"y":680,"width":250,"height":60},{"id":"ea53365b1b01a031","type":"text","text":"This is useful for processing lists of items using the loop group, as you can tell the LLM to handle a specific item in the list iteratively.","x":520,"y":740,"width":356,"height":217}],"edges":[{"id":"270794f37f25bb76","fromNode":"c6b8d6a1f384022f","fromSide":"bottom","toNode":"96f3935e8174877f","toSide":"top"},{"id":"fa5fd9941ce413fa","fromNode":"896ace77fa0c6a7e","fromSide":"bottom","toNode":"c6b8d6a1f384022f","toSide":"top"},{"id":"f0286819a9f22127","fromNode":"2a9251ad533d8576","fromSide":"bottom","toNode":"896ace77fa0c6a7e","toSide":"top"},{"id":"007d49590f64ef9d","fromNode":"d09815f95971b8a6","fromSide":"bottom","toNode":"479bd3009fb464b0","toSide":"top"},{"id":"65ef095c89dded80","fromNode":"479bd3009fb464b0","fromSide":"bottom","toNode":"bc61ab59035be49d","toSide":"top"},{"id":"adc29be9103fb02b","fromNode":"bc61ab59035be49d","fromSide":"right","toNode":"cdc967d2e777ade5","toSide":"left","color":"2"},{"id":"734208df80c9a33e","fromNode":"a1e4bbbafcec0850","fromSide":"right","toNode":"7b6747a24b1ed36e","toSide":"left","color":"2"},{"id":"8c921de751762ac3","fromNode":"4b6e4eac00d4ca2a","fromSide":"bottom","toNode":"a1e4bbbafcec0850","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"33e7457728f9ef47","x":-320,"y":-80,"width":820,"height":560,"label":"Nested loop groups"}, + {"type":"group","id":"0064c11720e6cf20","x":-320,"y":560,"width":820,"height":480,"label":"The loop number variable"}, + {"type":"group","id":"81cdef3b9de52df9","x":-200,"y":-880,"width":460,"height":680,"label":"Loop groups"}, + {"type":"group","id":"df42bd1da1866b7f","x":-300,"y":0,"width":330,"height":420,"label":"2"}, + {"type":"group","id":"2ae53ef6008eeb4e","x":-300,"y":640,"width":360,"height":360,"label":"2"}, + {"type":"group","id":"986991747df080b2","x":-115,"y":-720,"width":290,"height":260,"label":"3"}, + {"type":"group","id":"d83bf39a509c67bd","x":-280,"y":150,"width":280,"height":250,"label":"2"}, + {"type":"group","id":"76b98e9977f73412","x":-280,"y":790,"width":310,"height":190,"label":"2"}, + {"type":"text","text":"When all the nodes in a loop group are finished, all nodes will reset and the group will restart. \n\nIt will loop as many times as are defined in the label, and only the result of the final loop will be sent along the arrows leaving the group.","id":"6e5fbad373215bd8","x":-660,"y":-695,"width":441,"height":170}, + {"type":"text","text":"Loop groups are colorless groups that have a positive integer in their label.","id":"a408edeafd6bc62f","x":-169,"y":-1040,"width":399,"height":89}, + {"type":"text","text":"This message will be sent once","id":"2a9251ad533d8576","x":-95,"y":-860,"width":250,"height":60}, + {"type":"text","text":"This one will be sent 3 times","id":"896ace77fa0c6a7e","x":-95,"y":-700,"width":250,"height":60}, + {"type":"text","text":"Only the last response will be written to the content node outside the loop.","id":"c6b8d6a1f384022f","x":-95,"y":-610,"width":250,"height":120}, + {"type":"text","text":"","id":"96f3935e8174877f","x":-95,"y":-400,"width":250,"height":180,"color":"6"}, + {"type":"text","text":"Nested loop groups will fully reset, meaning in this case the inner group will repeat 4 times.","id":"24835b0cc486957f","x":-690,"y":64,"width":350,"height":106}, + {"type":"text","text":"This message will be sent 2 times","id":"d09815f95971b8a6","x":-260,"y":20,"width":250,"height":60}, + {"type":"text","text":"This will be sent 4 times","id":"479bd3009fb464b0","x":-260,"y":170,"width":250,"height":60}, + {"type":"text","text":"","id":"cdc967d2e777ade5","x":85,"y":-40,"width":395,"height":500,"color":"6"}, + {"type":"text","text":"Be careful with nested loop groups","id":"bc61ab59035be49d","x":-260,"y":280,"width":250,"height":90}, + {"type":"text","text":"Logging edges from loop groups will log out what happens on each loop and sub-loop (if its nested)","id":"17c0c46b3378bd79","x":520,"y":120,"width":321,"height":102}, + {"type":"text","text":"","id":"7b6747a24b1ed36e","x":85,"y":600,"width":395,"height":400,"color":"6"}, + {"type":"text","text":"Inner loop number: {{#}}\nOuter loop number: {{##}}","id":"a1e4bbbafcec0850","x":-260,"y":840,"width":270,"height":100}, + {"id":"f029d4309bd2b1fc","type":"text","text":"You can access the current loop number/iteration of the loop group a node is in using the variable {{#}} or {{##...}}.\n\nThe number of \"#\"s corresponds to the depth of the loop number you want to see, in the case of nested loops.","x":-650,"y":665,"width":310,"height":260}, + {"type":"text","text":"Hello there","id":"4b6e4eac00d4ca2a","x":-250,"y":680,"width":250,"height":60}, + {"id":"ea53365b1b01a031","type":"text","text":"This is useful for processing lists of items using the loop group, as you can tell the LLM to handle a specific item in the list iteratively.","x":520,"y":740,"width":356,"height":217} + ], + "edges":[ + {"id":"270794f37f25bb76","fromNode":"c6b8d6a1f384022f","fromSide":"bottom","toNode":"96f3935e8174877f","toSide":"top"}, + {"id":"fa5fd9941ce413fa","fromNode":"896ace77fa0c6a7e","fromSide":"bottom","toNode":"c6b8d6a1f384022f","toSide":"top"}, + {"id":"f0286819a9f22127","fromNode":"2a9251ad533d8576","fromSide":"bottom","toNode":"896ace77fa0c6a7e","toSide":"top"}, + {"id":"007d49590f64ef9d","fromNode":"d09815f95971b8a6","fromSide":"bottom","toNode":"479bd3009fb464b0","toSide":"top"}, + {"id":"65ef095c89dded80","fromNode":"479bd3009fb464b0","fromSide":"bottom","toNode":"bc61ab59035be49d","toSide":"top"}, + {"id":"adc29be9103fb02b","fromNode":"bc61ab59035be49d","fromSide":"right","toNode":"cdc967d2e777ade5","toSide":"left","color":"2"}, + {"id":"734208df80c9a33e","fromNode":"a1e4bbbafcec0850","fromSide":"right","toNode":"7b6747a24b1ed36e","toSide":"left","color":"2"}, + {"id":"8c921de751762ac3","fromNode":"4b6e4eac00d4ca2a","fromSide":"bottom","toNode":"a1e4bbbafcec0850","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/3. Loop group features.canvas b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/3. Loop group features.canvas index 0379c78..a880302 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/3. Loop group features.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/3. Loop group features.canvas @@ -1 +1,40 @@ -{"nodes":[{"type":"group","id":"cd5aefdec24485a6","x":-395,"y":920,"width":1200,"height":1187,"label":"Conditional loop groups"},{"type":"group","id":"b41f5d77d2587137","x":-215,"y":-344,"width":840,"height":948,"label":"Feedback variables"},{"type":"group","id":"a8db6171d1ed7037","x":-375,"y":987,"width":680,"height":1040,"label":"3"},{"type":"group","id":"308eacb6bc673cc4","x":5,"y":-136,"width":290,"height":240,"label":"3"},{"type":"text","text":"Crisp shell, sweet delight, Ricotta whispers within, Sicily's soft night.","id":"8bd344c2d351a946","x":25,"y":-324,"width":250,"height":100,"color":"6"},{"type":"text","text":"If a variable edge is pointing from a group member to the group itself, this variable will be accessible on subsequent loops. (This is an exception to the rule that the Cannoli must be a DAG)","id":"69c0aa7ba528fd7f","x":25,"y":-604,"width":378,"height":187},{"type":"text","text":"Critique this haiku:\n{{a}}","id":"4522c0d5f13ecbf2","x":25,"y":-104,"width":250,"height":60},{"type":"text","text":"Respond with a rewrite. Nothing else should be in your response.","id":"08d62752b952d1b9","x":25,"y":-14,"width":250,"height":90},{"type":"text","text":"If there are multiple available arrows with the same name, the node will prefer the self-group-pointing one.\n\nYou can use this to pre-load variables with an initial version for the first loop, which will be written over in later loops.","id":"1547e2e1c8e36e01","x":-625,"y":-214,"width":390,"height":221},{"type":"text","text":"This is an example of a rewrite loop, where we have the LLM rewrite a piece of content several times and output the final result.","id":"39f5077b01de86bc","x":-618,"y":215,"width":383,"height":121},{"type":"text","text":"","id":"0209622577e4d8e4","x":-195,"y":196,"width":270,"height":205,"color":"6"},{"type":"text","text":"","id":"a8c82e1399aa0667","x":144,"y":217,"width":461,"height":367,"color":"6"},{"type":"text","text":"If a loop group has incoming arrows from within itself, it will only loop if they are all activated.\n\nThis means you can use choice arrows to create groups that stop looping based on a decision the LLM makes.","id":"109c6d143c904ac2","x":-40,"y":700,"width":559,"height":153},{"type":"text","text":"Are there any obvious improvements to this article?\n\n{{article}}","id":"c9ac27366825fb46","x":-271,"y":1327,"width":283,"height":122},{"type":"text","text":"What would you change?","id":"42e65836e7bc0d2d","x":-254,"y":1540,"width":250,"height":60},{"type":"file","file":"Cannoli College/Example notes/Lemons for Cleaning.md","text":"{{[[Lemons for Cleaning]]}}","id":"9b09ade8a96fdc49","x":-330,"y":1025,"width":400,"height":203},{"type":"text","text":"In this example, we use choice arrows to have the LLM decide whether to edit a note.\n\nThe decision to edit it activates a path that points to the group itself, so the group will loop again once it is done.\n\nIf that path is rejected, the group will not loop again.","id":"3ae1b1035e633274","x":-814,"y":1228,"width":402,"height":259},{"type":"text","text":"Respond with a rewrite based on your feedback.","id":"92dee3525bb5528a","x":-289,"y":1660,"width":320,"height":100},{"type":"text","text":"","id":"65d12403b1902562","x":120,"y":1328,"width":165,"height":121,"color":"6"},{"type":"text","text":"","id":"c19decb87eb68f4e","x":340,"y":1443,"width":440,"height":535,"color":"6"},{"type":"text","text":"It doesn't matter what the node pointing at the group is, or what kind of arrow. In this case we use a blank arrow to signal that the rewrite path was chosen and add the chat history suppression suffix (~) so we don't continue the conversation in the next loop.","id":"07a8d464729bd7db","x":-800,"y":1864,"width":388,"height":196},{"type":"file","file":"Cannoli College/Example notes/Lemons for Cleaning.md","text":"{{[[Lemons for Cleaning]]}}","id":"a447b4af7f9b59af","x":-329,"y":1820,"width":400,"height":180}],"edges":[{"id":"98bface3c4272939","fromNode":"08d62752b952d1b9","fromSide":"right","toNode":"308eacb6bc673cc4","toSide":"right","label":"a"},{"id":"01117e93ffd16810","fromNode":"8bd344c2d351a946","fromSide":"bottom","toNode":"4522c0d5f13ecbf2","toSide":"top","label":"a"},{"id":"4705bd8c3ac7a1dd","fromNode":"4522c0d5f13ecbf2","fromSide":"bottom","toNode":"08d62752b952d1b9","toSide":"top"},{"id":"09153b08d8afc249","fromNode":"08d62752b952d1b9","fromSide":"bottom","toNode":"0209622577e4d8e4","toSide":"top"},{"id":"d74b679a0e9c5a8e","fromNode":"08d62752b952d1b9","fromSide":"bottom","toNode":"a8c82e1399aa0667","toSide":"top","color":"2"},{"id":"313f7dba1ac082e7","fromNode":"a447b4af7f9b59af","fromSide":"bottom","toNode":"a8db6171d1ed7037","toSide":"bottom","label":"~"},{"id":"ae86725de62f454c","fromNode":"92dee3525bb5528a","fromSide":"right","toNode":"c19decb87eb68f4e","toSide":"left","color":"2"},{"id":"28dd5bf26534621f","fromNode":"9b09ade8a96fdc49","fromSide":"bottom","toNode":"c9ac27366825fb46","toSide":"top","label":"article"},{"id":"cb414a8bed4cab51","fromNode":"c9ac27366825fb46","fromSide":"bottom","toNode":"42e65836e7bc0d2d","toSide":"top","color":"3","label":"yes"},{"id":"8e14d432eb6409d9","fromNode":"c9ac27366825fb46","fromSide":"right","toNode":"65d12403b1902562","toSide":"left","color":"3","label":"no"},{"id":"e151468f90fae46f","fromNode":"42e65836e7bc0d2d","fromSide":"bottom","toNode":"92dee3525bb5528a","toSide":"top"},{"id":"e9279e94dd7a9109","fromNode":"92dee3525bb5528a","fromSide":"bottom","toNode":"a447b4af7f9b59af","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"type":"group","id":"cd5aefdec24485a6","x":-395,"y":920,"width":1200,"height":1187,"label":"Conditional loop groups"}, + {"type":"group","id":"b41f5d77d2587137","x":-215,"y":-344,"width":840,"height":948,"label":"Feedback variables"}, + {"type":"group","id":"a8db6171d1ed7037","x":-375,"y":987,"width":680,"height":1040,"label":"3"}, + {"type":"group","id":"308eacb6bc673cc4","x":5,"y":-136,"width":290,"height":240,"label":"3"}, + {"type":"text","text":"Crisp shell, sweet delight, Ricotta whispers within, Sicily's soft night.","id":"8bd344c2d351a946","x":25,"y":-324,"width":250,"height":100,"color":"6"}, + {"type":"text","text":"If a variable edge is pointing from a group member to the group itself, this variable will be accessible on subsequent loops. (This is an exception to the rule that the Cannoli must be a DAG)","id":"69c0aa7ba528fd7f","x":25,"y":-604,"width":378,"height":187}, + {"type":"text","text":"Critique this haiku:\n{{a}}","id":"4522c0d5f13ecbf2","x":25,"y":-104,"width":250,"height":60}, + {"type":"text","text":"Respond with a rewrite. Nothing else should be in your response.","id":"08d62752b952d1b9","x":25,"y":-14,"width":250,"height":90}, + {"type":"text","text":"If there are multiple available arrows with the same name, the node will prefer the self-group-pointing one.\n\nYou can use this to pre-load variables with an initial version for the first loop, which will be written over in later loops.","id":"1547e2e1c8e36e01","x":-625,"y":-214,"width":390,"height":221}, + {"type":"text","text":"This is an example of a rewrite loop, where we have the LLM rewrite a piece of content several times and output the final result.","id":"39f5077b01de86bc","x":-618,"y":215,"width":383,"height":121}, + {"type":"text","text":"","id":"0209622577e4d8e4","x":-195,"y":196,"width":270,"height":205,"color":"6"}, + {"type":"text","text":"","id":"a8c82e1399aa0667","x":144,"y":217,"width":461,"height":367,"color":"6"}, + {"type":"text","text":"If a loop group has incoming arrows from within itself, it will only loop if they are all activated.\n\nThis means you can use choice arrows to create groups that stop looping based on a decision the LLM makes.","id":"109c6d143c904ac2","x":-40,"y":700,"width":559,"height":153}, + {"type":"text","text":"Are there any obvious improvements to this article?\n\n{{article}}","id":"c9ac27366825fb46","x":-271,"y":1327,"width":283,"height":122}, + {"type":"text","text":"What would you change?","id":"42e65836e7bc0d2d","x":-254,"y":1540,"width":250,"height":60}, + {"type":"file","file":"Cannoli College/Example notes/Lemons for Cleaning.md","text":"{{[[Lemons for Cleaning]]}}","id":"9b09ade8a96fdc49","x":-330,"y":1025,"width":400,"height":203}, + {"type":"text","text":"In this example, we use choice arrows to have the LLM decide whether to edit a note.\n\nThe decision to edit it activates a path that points to the group itself, so the group will loop again once it is done.\n\nIf that path is rejected, the group will not loop again.","id":"3ae1b1035e633274","x":-814,"y":1228,"width":402,"height":259}, + {"type":"text","text":"Respond with a rewrite based on your feedback.","id":"92dee3525bb5528a","x":-289,"y":1660,"width":320,"height":100}, + {"type":"text","text":"","id":"65d12403b1902562","x":120,"y":1328,"width":165,"height":121,"color":"6"}, + {"type":"text","text":"","id":"c19decb87eb68f4e","x":340,"y":1443,"width":440,"height":535,"color":"6"}, + {"type":"text","text":"It doesn't matter what the node pointing at the group is, or what kind of arrow. In this case we use a blank arrow to signal that the rewrite path was chosen and add the chat history suppression suffix (~) so we don't continue the conversation in the next loop.","id":"07a8d464729bd7db","x":-800,"y":1864,"width":388,"height":196}, + {"type":"file","file":"Cannoli College/Example notes/Lemons for Cleaning.md","text":"{{[[Lemons for Cleaning]]}}","id":"a447b4af7f9b59af","x":-329,"y":1820,"width":400,"height":180} + ], + "edges":[ + {"id":"98bface3c4272939","fromNode":"08d62752b952d1b9","fromSide":"right","toNode":"308eacb6bc673cc4","toSide":"right","label":"a"}, + {"id":"01117e93ffd16810","fromNode":"8bd344c2d351a946","fromSide":"bottom","toNode":"4522c0d5f13ecbf2","toSide":"top","label":"a"}, + {"id":"4705bd8c3ac7a1dd","fromNode":"4522c0d5f13ecbf2","fromSide":"bottom","toNode":"08d62752b952d1b9","toSide":"top"}, + {"id":"09153b08d8afc249","fromNode":"08d62752b952d1b9","fromSide":"bottom","toNode":"0209622577e4d8e4","toSide":"top"}, + {"id":"d74b679a0e9c5a8e","fromNode":"08d62752b952d1b9","fromSide":"bottom","toNode":"a8c82e1399aa0667","toSide":"top","color":"2"}, + {"id":"313f7dba1ac082e7","fromNode":"a447b4af7f9b59af","fromSide":"bottom","toNode":"a8db6171d1ed7037","toSide":"bottom","label":"~"}, + {"id":"ae86725de62f454c","fromNode":"92dee3525bb5528a","fromSide":"right","toNode":"c19decb87eb68f4e","toSide":"left","color":"2"}, + {"id":"28dd5bf26534621f","fromNode":"9b09ade8a96fdc49","fromSide":"bottom","toNode":"c9ac27366825fb46","toSide":"top","label":"article"}, + {"id":"cb414a8bed4cab51","fromNode":"c9ac27366825fb46","fromSide":"bottom","toNode":"42e65836e7bc0d2d","toSide":"top","color":"3","label":"yes"}, + {"id":"8e14d432eb6409d9","fromNode":"c9ac27366825fb46","fromSide":"right","toNode":"65d12403b1902562","toSide":"left","color":"3","label":"no"}, + {"id":"e151468f90fae46f","fromNode":"42e65836e7bc0d2d","fromSide":"bottom","toNode":"92dee3525bb5528a","toSide":"top"}, + {"id":"e9279e94dd7a9109","fromNode":"92dee3525bb5528a","fromSide":"bottom","toNode":"a447b4af7f9b59af","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/4. Parallel groups.canvas b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/4. Parallel groups.canvas index 3e1f0ab..8a643e8 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/5. Groups/4. Parallel groups.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/5. Groups/4. Parallel groups.canvas @@ -1 +1,41 @@ -{"nodes":[{"id":"e0f003ced217a6f7","type":"group","x":-539,"y":1345,"width":1014,"height":1030,"label":"Nested parallel groups"},{"id":"a582b0f31eb5b273","type":"group","x":-305,"y":-524,"width":933,"height":777,"label":"Static list input"},{"id":"65c66e6f113726aa","type":"group","x":-333,"y":338,"width":555,"height":926,"label":"Dynamic list input"},{"id":"0d7740a882d40f92","type":"group","x":-272,"y":1532,"width":454,"height":426,"color":"5","label":"2"},{"id":"6c63c8db5daf8225","type":"group","x":-243,"y":561,"width":383,"height":272,"color":"5","label":"2"},{"id":"83456d09f082fe8a","type":"group","x":-246,"y":1741,"width":399,"height":191,"color":"5","label":"2"},{"id":"bf04efea7cb87629","type":"group","x":-259,"y":-301,"width":383,"height":160,"color":"5","label":"2"},{"id":"c0e7756d10aed69f","type":"text","text":"","x":-260,"y":-114,"width":385,"height":346,"color":"6"},{"id":"9bc6d0bb497eb44c","type":"text","text":"Parallel groups are Cyan groups with a number in their label\n\nThey will copy all of their member nodes and arrows based on the number in their label, and each will run in parallel","x":-657,"y":-510,"width":330,"height":208},{"id":"3668418bbe12ccd5","type":"text","text":"List arrows can also come from AI nodes. They will try to parse a list from either markdown list format or from a JSON array.","x":-696,"y":423,"width":342,"height":129},{"id":"1e0f6e1a8645a214","type":"text","text":"The \"season\" arrow in this group is a list arrow (cyan color). When a parallel group has a list arrow pointing to it, each copy of the group will get a different item from the list\n\nThe number of the group doesn't always have to match the number of items, it just serves as a limit. Only that many copies will be made.","x":-751,"y":-270,"width":427,"height":230},{"id":"0dc3d3584861444b","type":"text","text":"By default, the arrow leaving the group will simply combine all of the content from each version of the node with no formatting.\n\nThere are several pre-made formats you can use (read below), but you can also define your own output formats using a formatter node. This could be used to write CSVs, for example.","x":-840,"y":14,"width":513,"height":208},{"id":"f28b98b566aff8a3","type":"text","text":"Write a list of 5 obscure colors (markdown format)","x":-175,"y":358,"width":250,"height":94},{"id":"e92c8263c3cbedd9","type":"text","text":"In a sentence, describe {{color}}.","x":-199,"y":594,"width":294,"height":89},{"id":"03f168ccb5370bb2","type":"text","text":"Give an even more obscure term for it.","x":-195,"y":713,"width":288,"height":87},{"id":"7b28e3a04655a650","type":"text","text":"","x":-300,"y":896,"width":501,"height":346,"color":"6"},{"id":"ac89af9188e32032","type":"text","text":"The arrow leaving this group has a \"`_`\" prefix. This means we will render the results as a markdown table.\n\nThe current merge arrow prefixes are:\n\n`#`: Headers\n`-`: List\n`_`: Table\n","x":-733,"y":797,"width":383,"height":255},{"id":"b04d27fecfd47af4","type":"text","text":"Parallel groups can be nested! Just be wary of how many AI nodes will be executed at the most nested levels.\n\nIn this example we merge the result using the \"-\" prefix, which formats it as a nested list.\n\nArbitrary nesting works for the headers (`#`) and list (`-`) prefixes, but the table (`_`) prefix works best with 2 levels parallel groups (2 dimensions of the table)","x":-967,"y":1505,"width":405,"height":301},{"id":"22d9b1ea6f478316","type":"text","text":"","x":-490,"y":1990,"width":886,"height":346,"color":"6"},{"id":"b3938cc38770d918","type":"text","text":"List the 3 steps to make a PBJ sandwich (markdown format)","x":-172,"y":1362,"width":250,"height":94},{"id":"8b3843db8e3a0626","type":"text","text":"- summer\n- winter","x":-191,"y":-504,"width":250,"height":94,"color":"6"},{"id":"beb438d1c026fe71","type":"text","text":"Just list the most popular events in the {{season}} olympics","x":-215,"y":-268,"width":294,"height":89},{"id":"ad1b9b99f7179469","type":"text","text":"Break this step in making a PBJ sandwich down into 2 sub-steps (markdown list):\n{{step}}","x":-228,"y":1566,"width":372,"height":103},{"id":"60a2a625e8300dc9","type":"text","text":"Break this substep in making a PBJ sandwich into 2 sub-sub-steps (markdown list):\n{{substep}}","x":-202,"y":1774,"width":311,"height":123},{"id":"0305c934c9aace83","type":"text","text":"","x":153,"y":-115,"width":433,"height":339,"color":"6"},{"id":"071083739c5edbf9","type":"text","text":"Logging edges exiting parallel groups will give information about each copy.","x":213,"y":-336,"width":341,"height":84}],"edges":[{"id":"5bd1086a494d6e32","fromNode":"8b3843db8e3a0626","fromSide":"bottom","toNode":"bf04efea7cb87629","toSide":"top","color":"5","label":"season"},{"id":"ae4c863a53cd9348","fromNode":"beb438d1c026fe71","fromSide":"bottom","toNode":"c0e7756d10aed69f","toSide":"top"},{"id":"425c2f28bb3e0b99","fromNode":"f28b98b566aff8a3","fromSide":"bottom","toNode":"6c63c8db5daf8225","toSide":"top","color":"5","label":"color"},{"id":"73233b93df26e03e","fromNode":"e92c8263c3cbedd9","fromSide":"bottom","toNode":"03f168ccb5370bb2","toSide":"top"},{"id":"0caf1bba05c8aa27","fromNode":"03f168ccb5370bb2","fromSide":"bottom","toNode":"7b28e3a04655a650","toSide":"top","label":"_"},{"id":"607232d635891e37","fromNode":"b3938cc38770d918","fromSide":"bottom","toNode":"0d7740a882d40f92","toSide":"top","color":"5","label":"step"},{"id":"432d78d795c6f4ec","fromNode":"ad1b9b99f7179469","fromSide":"bottom","toNode":"83456d09f082fe8a","toSide":"top","color":"5","label":"substep"},{"id":"7565755b265a1759","fromNode":"60a2a625e8300dc9","fromSide":"bottom","toNode":"22d9b1ea6f478316","toSide":"top","label":"-"},{"id":"48ca5d2dc4865bce","fromNode":"beb438d1c026fe71","fromSide":"right","toNode":"0305c934c9aace83","toSide":"top","color":"2"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"e0f003ced217a6f7","type":"group","x":-539,"y":1345,"width":1014,"height":1030,"label":"Nested parallel groups"}, + {"id":"a582b0f31eb5b273","type":"group","x":-305,"y":-524,"width":933,"height":777,"label":"Static list input"}, + {"id":"65c66e6f113726aa","type":"group","x":-333,"y":338,"width":555,"height":926,"label":"Dynamic list input"}, + {"id":"0d7740a882d40f92","type":"group","x":-272,"y":1532,"width":454,"height":426,"color":"5","label":"2"}, + {"id":"6c63c8db5daf8225","type":"group","x":-243,"y":561,"width":383,"height":272,"color":"5","label":"2"}, + {"id":"83456d09f082fe8a","type":"group","x":-246,"y":1741,"width":399,"height":191,"color":"5","label":"2"}, + {"id":"bf04efea7cb87629","type":"group","x":-259,"y":-301,"width":383,"height":160,"color":"5","label":"2"}, + {"id":"c0e7756d10aed69f","type":"text","text":"","x":-260,"y":-114,"width":385,"height":346,"color":"6"}, + {"id":"9bc6d0bb497eb44c","type":"text","text":"Parallel groups are Cyan groups with a number in their label\n\nThey will copy all of their member nodes and arrows based on the number in their label, and each will run in parallel","x":-657,"y":-510,"width":330,"height":208}, + {"id":"3668418bbe12ccd5","type":"text","text":"List arrows can also come from AI nodes. They will try to parse a list from either markdown list format or from a JSON array.","x":-696,"y":423,"width":342,"height":129}, + {"id":"1e0f6e1a8645a214","type":"text","text":"The \"season\" arrow in this group is a list arrow (cyan color). When a parallel group has a list arrow pointing to it, each copy of the group will get a different item from the list\n\nThe number of the group doesn't always have to match the number of items, it just serves as a limit. Only that many copies will be made.","x":-751,"y":-270,"width":427,"height":230}, + {"id":"0dc3d3584861444b","type":"text","text":"By default, the arrow leaving the group will simply combine all of the content from each version of the node with no formatting.\n\nThere are several pre-made formats you can use (read below), but you can also define your own output formats using a formatter node. This could be used to write CSVs, for example.","x":-840,"y":14,"width":513,"height":208}, + {"id":"f28b98b566aff8a3","type":"text","text":"Write a list of 5 obscure colors (markdown format)","x":-175,"y":358,"width":250,"height":94}, + {"id":"e92c8263c3cbedd9","type":"text","text":"In a sentence, describe {{color}}.","x":-199,"y":594,"width":294,"height":89}, + {"id":"03f168ccb5370bb2","type":"text","text":"Give an even more obscure term for it.","x":-195,"y":713,"width":288,"height":87}, + {"id":"7b28e3a04655a650","type":"text","text":"","x":-300,"y":896,"width":501,"height":346,"color":"6"}, + {"id":"ac89af9188e32032","type":"text","text":"The arrow leaving this group has a \"`_`\" prefix. This means we will render the results as a markdown table.\n\nThe current merge arrow prefixes are:\n\n`#`: Headers\n`-`: List\n`_`: Table\n","x":-733,"y":797,"width":383,"height":255}, + {"id":"b04d27fecfd47af4","type":"text","text":"Parallel groups can be nested! Just be wary of how many AI nodes will be executed at the most nested levels.\n\nIn this example we merge the result using the \"-\" prefix, which formats it as a nested list.\n\nArbitrary nesting works for the headers (`#`) and list (`-`) prefixes, but the table (`_`) prefix works best with 2 levels parallel groups (2 dimensions of the table)","x":-967,"y":1505,"width":405,"height":301}, + {"id":"22d9b1ea6f478316","type":"text","text":"","x":-490,"y":1990,"width":886,"height":346,"color":"6"}, + {"id":"b3938cc38770d918","type":"text","text":"List the 3 steps to make a PBJ sandwich (markdown format)","x":-172,"y":1362,"width":250,"height":94}, + {"id":"8b3843db8e3a0626","type":"text","text":"- summer\n- winter","x":-191,"y":-504,"width":250,"height":94,"color":"6"}, + {"id":"beb438d1c026fe71","type":"text","text":"Just list the most popular events in the {{season}} olympics","x":-215,"y":-268,"width":294,"height":89}, + {"id":"ad1b9b99f7179469","type":"text","text":"Break this step in making a PBJ sandwich down into 2 sub-steps (markdown list):\n{{step}}","x":-228,"y":1566,"width":372,"height":103}, + {"id":"60a2a625e8300dc9","type":"text","text":"Break this substep in making a PBJ sandwich into 2 sub-sub-steps (markdown list):\n{{substep}}","x":-202,"y":1774,"width":311,"height":123}, + {"id":"0305c934c9aace83","type":"text","text":"","x":153,"y":-115,"width":433,"height":339,"color":"6"}, + {"id":"071083739c5edbf9","type":"text","text":"Logging edges exiting parallel groups will give information about each copy.","x":213,"y":-336,"width":341,"height":84} + ], + "edges":[ + {"id":"5bd1086a494d6e32","fromNode":"8b3843db8e3a0626","fromSide":"bottom","toNode":"bf04efea7cb87629","toSide":"top","color":"5","label":"season"}, + {"id":"ae4c863a53cd9348","fromNode":"beb438d1c026fe71","fromSide":"bottom","toNode":"c0e7756d10aed69f","toSide":"top"}, + {"id":"425c2f28bb3e0b99","fromNode":"f28b98b566aff8a3","fromSide":"bottom","toNode":"6c63c8db5daf8225","toSide":"top","color":"5","label":"color"}, + {"id":"73233b93df26e03e","fromNode":"e92c8263c3cbedd9","fromSide":"bottom","toNode":"03f168ccb5370bb2","toSide":"top"}, + {"id":"0caf1bba05c8aa27","fromNode":"03f168ccb5370bb2","fromSide":"bottom","toNode":"7b28e3a04655a650","toSide":"top","label":"_"}, + {"id":"607232d635891e37","fromNode":"b3938cc38770d918","fromSide":"bottom","toNode":"0d7740a882d40f92","toSide":"top","color":"5","label":"step"}, + {"id":"432d78d795c6f4ec","fromNode":"ad1b9b99f7179469","fromSide":"bottom","toNode":"83456d09f082fe8a","toSide":"top","color":"5","label":"substep"}, + {"id":"7565755b265a1759","fromNode":"60a2a625e8300dc9","fromSide":"bottom","toNode":"22d9b1ea6f478316","toSide":"top","label":"-"}, + {"id":"48ca5d2dc4865bce","fromNode":"beb438d1c026fe71","fromSide":"right","toNode":"0305c934c9aace83","toSide":"top","color":"2"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/1. Dalle.canvas b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/1. Dalle.canvas index 19460f6..dd3fe82 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/1. Dalle.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/1. Dalle.canvas @@ -1 +1,25 @@ -{"nodes":[{"id":"9c131929cf9cd0ae","type":"group","x":-436,"y":579,"width":858,"height":1205,"label":"Template prompt"},{"id":"52b5f0705400f7d5","type":"group","x":-314,"y":-276,"width":588,"height":789,"label":"Standard use"},{"id":"1d951e2c23093a2b","type":"text","text":"The template-able argument of the dalle action is the prompt","x":-708,"y":685,"width":255,"height":109},{"id":"b9ea77725ca55e8f","type":"text","text":"make a picture of a frog at a concert","x":-154,"y":-256,"width":250,"height":60,"color":"6"},{"id":"8a701ef86405bac2","type":"text","text":"dalle","x":-152,"y":-120,"width":250,"height":60,"color":"2"},{"id":"1cb415bf1256f272","type":"text","text":"","x":-294,"y":-11,"width":534,"height":504,"color":"6"},{"id":"bf9bc6d3de30f54b","type":"text","text":"The built-in dalle action can be referenced by the name \"dalle\"\n\nArguments:\n- prompt (required)\n- size (one of the following)\n\t- 256x256\n\t- 512x512\n\t- 1024x1024 (default)\n\t- 1024x1792\n\t- 1792x1024\n- model\n\t- dall-e-3 (default)\n\t- dall-e-2","x":-648,"y":-172,"width":311,"height":417},{"id":"41ad397423fb17d8","type":"text","text":"Note that the dalle action currently only returns a link to the images it produces, so if you want to save the image to you're vault you have to copy the image itself, as OpenAI will not maintain these image links permanently.\n\n(if you'd benefit from an option to save images, please let us know)","x":286,"y":-8,"width":433,"height":236},{"id":"c36034b72096726f","type":"text","text":"disco","x":-143,"y":599,"width":250,"height":60,"color":"6"},{"id":"0a4a5477edeb0a9b","type":"text","text":"guinea pig","x":-416,"y":601,"width":250,"height":60,"color":"6"},{"id":"f66a3d132929fc8d","type":"text","text":"1024x1792","x":152,"y":633,"width":250,"height":60,"color":"6"},{"id":"4c9b9042079da5ed","type":"text","text":"[dalle]\nmake a picture of a {{animal}} at a {{event}}","x":-142,"y":731,"width":250,"height":98,"color":"2"},{"id":"5b2a6b4b87c80207","type":"text","text":"","x":-284,"y":878,"width":534,"height":883,"color":"6"}],"edges":[{"id":"a2a83b896a844f8b","fromNode":"b9ea77725ca55e8f","fromSide":"bottom","toNode":"8a701ef86405bac2","toSide":"top","label":"prompt"},{"id":"7ef0ede979ae0cf7","fromNode":"4c9b9042079da5ed","fromSide":"bottom","toNode":"5b2a6b4b87c80207","toSide":"top"},{"id":"e3be85b19da03b44","fromNode":"f66a3d132929fc8d","fromSide":"bottom","toNode":"4c9b9042079da5ed","toSide":"right","label":"size"},{"id":"abab8814929330b2","fromNode":"0a4a5477edeb0a9b","fromSide":"bottom","toNode":"4c9b9042079da5ed","toSide":"left","label":"animal"},{"id":"6bed803745429637","fromNode":"c36034b72096726f","fromSide":"bottom","toNode":"4c9b9042079da5ed","toSide":"top"},{"id":"f2bde8c9ede6acdf","fromNode":"8a701ef86405bac2","fromSide":"bottom","toNode":"1cb415bf1256f272","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"9c131929cf9cd0ae","type":"group","x":-436,"y":579,"width":858,"height":1205,"label":"Template prompt"}, + {"id":"52b5f0705400f7d5","type":"group","x":-314,"y":-276,"width":588,"height":789,"label":"Standard use"}, + {"id":"1d951e2c23093a2b","type":"text","text":"The template-able argument of the dalle action is the prompt","x":-708,"y":685,"width":255,"height":109}, + {"id":"b9ea77725ca55e8f","type":"text","text":"make a picture of a frog at a concert","x":-154,"y":-256,"width":250,"height":60,"color":"6"}, + {"id":"8a701ef86405bac2","type":"text","text":"dalle","x":-152,"y":-120,"width":250,"height":60,"color":"2"}, + {"id":"1cb415bf1256f272","type":"text","text":"","x":-294,"y":-11,"width":534,"height":504,"color":"6"}, + {"id":"bf9bc6d3de30f54b","type":"text","text":"The built-in dalle action can be referenced by the name \"dalle\"\n\nArguments:\n- prompt (required)\n- size (one of the following)\n\t- 256x256\n\t- 512x512\n\t- 1024x1024 (default)\n\t- 1024x1792\n\t- 1792x1024\n- model\n\t- dall-e-3 (default)\n\t- dall-e-2","x":-648,"y":-172,"width":311,"height":417}, + {"id":"41ad397423fb17d8","type":"text","text":"Note that the dalle action currently only returns a link to the images it produces, so if you want to save the image to you're vault you have to copy the image itself, as OpenAI will not maintain these image links permanently.\n\n(if you'd benefit from an option to save images, please let us know)","x":286,"y":-8,"width":433,"height":236}, + {"id":"c36034b72096726f","type":"text","text":"disco","x":-143,"y":599,"width":250,"height":60,"color":"6"}, + {"id":"0a4a5477edeb0a9b","type":"text","text":"guinea pig","x":-416,"y":601,"width":250,"height":60,"color":"6"}, + {"id":"f66a3d132929fc8d","type":"text","text":"1024x1792","x":152,"y":633,"width":250,"height":60,"color":"6"}, + {"id":"4c9b9042079da5ed","type":"text","text":"[dalle]\nmake a picture of a {{animal}} at a {{event}}","x":-142,"y":731,"width":250,"height":98,"color":"2"}, + {"id":"5b2a6b4b87c80207","type":"text","text":"","x":-284,"y":878,"width":534,"height":883,"color":"6"} + ], + "edges":[ + {"id":"a2a83b896a844f8b","fromNode":"b9ea77725ca55e8f","fromSide":"bottom","toNode":"8a701ef86405bac2","toSide":"top","label":"prompt"}, + {"id":"7ef0ede979ae0cf7","fromNode":"4c9b9042079da5ed","fromSide":"bottom","toNode":"5b2a6b4b87c80207","toSide":"top"}, + {"id":"e3be85b19da03b44","fromNode":"f66a3d132929fc8d","fromSide":"bottom","toNode":"4c9b9042079da5ed","toSide":"right","label":"size"}, + {"id":"abab8814929330b2","fromNode":"0a4a5477edeb0a9b","fromSide":"bottom","toNode":"4c9b9042079da5ed","toSide":"left","label":"animal"}, + {"id":"6bed803745429637","fromNode":"c36034b72096726f","fromSide":"bottom","toNode":"4c9b9042079da5ed","toSide":"top","label":"event"}, + {"id":"f2bde8c9ede6acdf","fromNode":"8a701ef86405bac2","fromSide":"bottom","toNode":"1cb415bf1256f272","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/2. Dataview.canvas b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/2. Dataview.canvas index 7af170f..da03bbe 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/2. Dataview.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/2. Dataview.canvas @@ -1 +1,24 @@ -{"nodes":[{"id":"acb78f98d8b00913","type":"group","x":-319,"y":-932,"width":588,"height":691,"label":"Standard use"},{"id":"70a335690d6f3304","type":"group","x":-333,"y":-178,"width":593,"height":575,"label":"Template query"},{"id":"903bca98ef7b01be","type":"text","text":"The built-in dataview action can be referenced by the name \"dataview\"\n\nArguments:\n- query (required)\n- limit (number of results)\n\t- 10 (default)\n\n- extract (include note content)\n\t- true (default)\n\t- false\n\n- includeName (include note name)\n\t- true (default)\n\t- false\n\n- includeProperties (include note properties)\n\t- true (default)\n\t- false\n\n- includeLink (include note link)\n\t- true (default)\n\t- false","x":-743,"y":-926,"width":401,"height":550},{"id":"2b10baa2c609a70a","type":"text","text":"LIST","x":-163,"y":-910,"width":250,"height":60,"color":"6"},{"id":"857d57b6ba48ce87","type":"text","text":"1","x":130,"y":-140,"width":65,"height":60,"color":"6"},{"id":"0430a809b1fd17b6","type":"text","text":"The template-able argument of the dataview action is the query","x":-605,"y":-105,"width":255,"height":109},{"id":"4ab88afc5fa0b412","type":"text","text":"false","x":-87,"y":-140,"width":90,"height":60,"color":"6"},{"id":"cb66f2c70f112232","type":"text","text":"dataview","x":-100,"y":-729,"width":125,"height":60,"color":"2"},{"id":"304c8c5e68c78157","type":"text","text":"","x":-283,"y":-606,"width":491,"height":333,"color":"6"},{"id":"100e3d66407985a5","type":"text","text":"[dataview]\nLIST\nFROM \"{{folder}}\"","x":-57,"y":80,"width":283,"height":164,"color":"2"},{"id":"0915de73d2a47fc4","type":"text","text":"Cannoli College","x":-317,"y":-14,"width":175,"height":60,"color":"6"},{"id":"f77904f417984d33","type":"text","text":"","x":-33,"y":297,"width":234,"height":76,"color":"6"}],"edges":[{"id":"50b6daa0957a1bd3","fromNode":"100e3d66407985a5","fromSide":"bottom","toNode":"f77904f417984d33","toSide":"top"},{"id":"b4cf20d89df45ecf","fromNode":"857d57b6ba48ce87","fromSide":"bottom","toNode":"100e3d66407985a5","toSide":"top","label":"limit"},{"id":"20d6e49a7368b908","fromNode":"4ab88afc5fa0b412","fromSide":"bottom","toNode":"100e3d66407985a5","toSide":"top","label":"extract"},{"id":"a8a5608da79cbd7c","fromNode":"cb66f2c70f112232","fromSide":"bottom","toNode":"304c8c5e68c78157","toSide":"top"},{"id":"b5af2401aa1d2e2e","fromNode":"2b10baa2c609a70a","fromSide":"bottom","toNode":"cb66f2c70f112232","toSide":"top","label":"query"},{"id":"ca796e31dd6ef529","fromNode":"0915de73d2a47fc4","fromSide":"bottom","toNode":"100e3d66407985a5","toSide":"left","label":"folder"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"acb78f98d8b00913","type":"group","x":-319,"y":-932,"width":588,"height":691,"label":"Standard use"}, + {"id":"70a335690d6f3304","type":"group","x":-333,"y":-178,"width":593,"height":575,"label":"Template query"}, + {"id":"903bca98ef7b01be","type":"text","text":"The built-in dataview action can be referenced by the name \"dataview\"\n\nArguments:\n- query (required)\n- limit (number of results)\n\t- 10 (default)\n\n- extract (include note content)\n\t- true (default)\n\t- false\n\n- includeName (include note name)\n\t- true (default)\n\t- false\n\n- includeProperties (include note properties)\n\t- true (default)\n\t- false\n\n- includeLink (include note link)\n\t- true (default)\n\t- false","x":-743,"y":-926,"width":401,"height":550}, + {"id":"2b10baa2c609a70a","type":"text","text":"LIST","x":-163,"y":-910,"width":250,"height":60,"color":"6"}, + {"id":"857d57b6ba48ce87","type":"text","text":"1","x":130,"y":-140,"width":65,"height":60,"color":"6"}, + {"id":"0430a809b1fd17b6","type":"text","text":"The template-able argument of the dataview action is the query","x":-605,"y":-105,"width":255,"height":109}, + {"id":"4ab88afc5fa0b412","type":"text","text":"false","x":-87,"y":-140,"width":90,"height":60,"color":"6"}, + {"id":"cb66f2c70f112232","type":"text","text":"dataview","x":-100,"y":-729,"width":125,"height":60,"color":"2"}, + {"id":"304c8c5e68c78157","type":"text","text":"","x":-283,"y":-606,"width":491,"height":333,"color":"6"}, + {"id":"100e3d66407985a5","type":"text","text":"[dataview]\nLIST\nFROM \"{{folder}}\"","x":-57,"y":80,"width":283,"height":164,"color":"2"}, + {"id":"0915de73d2a47fc4","type":"text","text":"Cannoli College","x":-317,"y":-14,"width":175,"height":60,"color":"6"}, + {"id":"f77904f417984d33","type":"text","text":"","x":-33,"y":297,"width":234,"height":76,"color":"6"} + ], + "edges":[ + {"id":"50b6daa0957a1bd3","fromNode":"100e3d66407985a5","fromSide":"bottom","toNode":"f77904f417984d33","toSide":"top"}, + {"id":"b4cf20d89df45ecf","fromNode":"857d57b6ba48ce87","fromSide":"bottom","toNode":"100e3d66407985a5","toSide":"top","label":"limit"}, + {"id":"20d6e49a7368b908","fromNode":"4ab88afc5fa0b412","fromSide":"bottom","toNode":"100e3d66407985a5","toSide":"top","label":"extract"}, + {"id":"a8a5608da79cbd7c","fromNode":"cb66f2c70f112232","fromSide":"bottom","toNode":"304c8c5e68c78157","toSide":"top"}, + {"id":"b5af2401aa1d2e2e","fromNode":"2b10baa2c609a70a","fromSide":"bottom","toNode":"cb66f2c70f112232","toSide":"top","label":"query"}, + {"id":"ca796e31dd6ef529","fromNode":"0915de73d2a47fc4","fromSide":"bottom","toNode":"100e3d66407985a5","toSide":"left","label":"folder"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/3. Smart-connections.canvas b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/3. Smart-connections.canvas index 2409aff..8883d1e 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/3. Smart-connections.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/3. Smart-connections.canvas @@ -1 +1,24 @@ -{"nodes":[{"id":"381c8163bec12c57","type":"group","x":-304,"y":-664,"width":588,"height":691,"label":"Standard use"},{"id":"337c91c6b1038d20","type":"group","x":-318,"y":90,"width":593,"height":575,"label":"Template query"},{"id":"eebc9eee68ff25b2","type":"text","text":"The built-in Smart-connections action can be referenced by the name \"smart-connections\"\n\nArguments:\n- query (required)\n- limit (number of results)\n\t- 10 (default)\n\n- extract (include note content)\n\t- true (default)\n\t- false\n\n- includeName (include note name)\n\t- true (default)\n\t- false\n\n- includeProperties (include note properties)\n\t- true (default)\n\t- false\n\n- includeLink (include note link)\n\t- true (default)\n\t- false","x":-728,"y":-658,"width":401,"height":550},{"id":"a60fd5c5154313d4","type":"text","text":"","x":-268,"y":-338,"width":491,"height":333,"color":"6"},{"id":"4f26794b185fb5db","type":"text","text":"[smart-connections]\nMeeting where {{person}} was present","x":-42,"y":348,"width":283,"height":164,"color":"2"},{"id":"77a40e58452bd8b1","type":"text","text":"Bob","x":-302,"y":254,"width":175,"height":60,"color":"6"},{"id":"0f0046972783b7ae","type":"text","text":"1","x":145,"y":128,"width":65,"height":60,"color":"6"},{"id":"56da36d986c561ce","type":"text","text":"The template-able argument of the smart-connections action is the query","x":-590,"y":163,"width":255,"height":123},{"id":"4a6faca7ddcffbfe","type":"text","text":"false","x":-72,"y":128,"width":90,"height":60,"color":"6"},{"id":"8c604bda53107ee1","type":"text","text":"","x":-18,"y":565,"width":234,"height":76,"color":"6"},{"id":"52b0052571a6eb61","type":"text","text":"Apples and stuff","x":-148,"y":-642,"width":250,"height":60,"color":"6"},{"id":"062536681a6f3d7c","type":"text","text":"smart-connections","x":-121,"y":-481,"width":197,"height":60,"color":"2"}],"edges":[{"id":"4b3d5fabd9a12016","fromNode":"062536681a6f3d7c","fromSide":"bottom","toNode":"a60fd5c5154313d4","toSide":"top"},{"id":"b63496bcc3abd047","fromNode":"52b0052571a6eb61","fromSide":"bottom","toNode":"062536681a6f3d7c","toSide":"top","label":"query"},{"id":"8486791d9c376c0b","fromNode":"4f26794b185fb5db","fromSide":"bottom","toNode":"8c604bda53107ee1","toSide":"top"},{"id":"9fef641e0bceee50","fromNode":"0f0046972783b7ae","fromSide":"bottom","toNode":"4f26794b185fb5db","toSide":"top","label":"limit"},{"id":"b4439e67ea4fbde8","fromNode":"4a6faca7ddcffbfe","fromSide":"bottom","toNode":"4f26794b185fb5db","toSide":"top","label":"extract"},{"id":"e0726e65d794c7f3","fromNode":"77a40e58452bd8b1","fromSide":"bottom","toNode":"4f26794b185fb5db","toSide":"left","label":"person"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"381c8163bec12c57","type":"group","x":-304,"y":-664,"width":588,"height":691,"label":"Standard use"}, + {"id":"337c91c6b1038d20","type":"group","x":-318,"y":90,"width":593,"height":575,"label":"Template query"}, + {"id":"eebc9eee68ff25b2","type":"text","text":"The built-in Smart-connections action can be referenced by the name \"smart-connections\"\n\nArguments:\n- query (required)\n- limit (number of results)\n\t- 10 (default)\n\n- extract (include note content)\n\t- true (default)\n\t- false\n\n- includeName (include note name)\n\t- true (default)\n\t- false\n\n- includeProperties (include note properties)\n\t- true (default)\n\t- false\n\n- includeLink (include note link)\n\t- true (default)\n\t- false","x":-728,"y":-658,"width":401,"height":550}, + {"id":"a60fd5c5154313d4","type":"text","text":"","x":-268,"y":-338,"width":491,"height":333,"color":"6"}, + {"id":"4f26794b185fb5db","type":"text","text":"[smart-connections]\nMeeting where {{person}} was present","x":-42,"y":348,"width":283,"height":164,"color":"2"}, + {"id":"77a40e58452bd8b1","type":"text","text":"Bob","x":-302,"y":254,"width":175,"height":60,"color":"6"}, + {"id":"0f0046972783b7ae","type":"text","text":"1","x":145,"y":128,"width":65,"height":60,"color":"6"}, + {"id":"56da36d986c561ce","type":"text","text":"The template-able argument of the smart-connections action is the query","x":-590,"y":163,"width":255,"height":123}, + {"id":"4a6faca7ddcffbfe","type":"text","text":"false","x":-72,"y":128,"width":90,"height":60,"color":"6"}, + {"id":"8c604bda53107ee1","type":"text","text":"","x":-18,"y":565,"width":234,"height":76,"color":"6"}, + {"id":"52b0052571a6eb61","type":"text","text":"Apples and stuff","x":-148,"y":-642,"width":250,"height":60,"color":"6"}, + {"id":"062536681a6f3d7c","type":"text","text":"smart-connections","x":-121,"y":-481,"width":197,"height":60,"color":"2"} + ], + "edges":[ + {"id":"4b3d5fabd9a12016","fromNode":"062536681a6f3d7c","fromSide":"bottom","toNode":"a60fd5c5154313d4","toSide":"top"}, + {"id":"b63496bcc3abd047","fromNode":"52b0052571a6eb61","fromSide":"bottom","toNode":"062536681a6f3d7c","toSide":"top","label":"query"}, + {"id":"8486791d9c376c0b","fromNode":"4f26794b185fb5db","fromSide":"bottom","toNode":"8c604bda53107ee1","toSide":"top"}, + {"id":"9fef641e0bceee50","fromNode":"0f0046972783b7ae","fromSide":"bottom","toNode":"4f26794b185fb5db","toSide":"top","label":"limit"}, + {"id":"b4439e67ea4fbde8","fromNode":"4a6faca7ddcffbfe","fromSide":"bottom","toNode":"4f26794b185fb5db","toSide":"top","label":"extract"}, + {"id":"e0726e65d794c7f3","fromNode":"77a40e58452bd8b1","fromSide":"bottom","toNode":"4f26794b185fb5db","toSide":"left","label":"person"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/4. Val Town Evaluate.canvas b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/4. Val Town Evaluate.canvas index 8d6bc4a..06a1609 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/4. Val Town Evaluate.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/4. Val Town Evaluate.canvas @@ -1 +1,26 @@ -{"nodes":[{"id":"426db25be12ba40f","type":"group","x":-289,"y":-1430,"width":820,"height":797,"label":"Standard use"},{"id":"f8a5be321df2fbec","type":"group","x":-111,"y":-557,"width":342,"height":449,"label":"Template code"},{"id":"7a11cb94f7d0a8d9","type":"text","text":"Calculate the first 50 numbers in the Fibonacci sequence\n\nEnsure your code is valid JavaScript or TypeScript which directly returns a result by using immediately invoked function expressions or top-level return statements.","x":-248,"y":-1367,"width":372,"height":207},{"id":"49b6ae2b97ed3a38","type":"text","text":"","x":11,"y":-1139,"width":450,"height":252,"color":"6"},{"id":"8a0f1fa1e0365f15","type":"text","text":"valtown-eval","x":-262,"y":-991,"width":250,"height":60,"color":"2"},{"id":"c3dcd82eb0f1017b","type":"text","text":"[valtown-eval]\n{{x}} + {{y}}","x":-39,"y":-347,"width":187,"height":95,"color":"2"},{"id":"eadd2c38885af3d9","type":"text","text":"45","x":-79,"y":-520,"width":88,"height":60,"color":"6"},{"id":"6ef4d0c132d7d762","type":"text","text":"62","x":120,"y":-526,"width":86,"height":60,"color":"6"},{"id":"aacc42db1df0493a","type":"text","text":"The template-able argument of the eval action is the code","x":-411,"y":-506,"width":283,"height":85},{"id":"1616346be6267f84","x":-702,"y":-982,"width":393,"height":87,"type":"text","text":"If there are code blocks in the \"code\" variable, the action node will use the code inside them."},{"id":"41aeb1a64a1a9bd9","type":"text","text":"The API this action uses expects code in a specific format to work.\n\nThe second paragraph of the prompt here is a good start if you want to use LLMs to generate code.","x":-643,"y":-1190,"width":322,"height":175},{"id":"058972517fb03fd3","type":"text","text":"The built-in action for evaluating JS/TS code using Val Town can be referenced by the name \"valtown-eval\"\n\nArguments:\n- code (required)","x":-661,"y":-1441,"width":349,"height":228},{"id":"dae97d54e71fc555","type":"text","text":"","x":13,"y":-205,"width":83,"height":64,"color":"6"},{"id":"50b7d8d43e23789d","type":"text","text":"","x":-271,"y":-785,"width":781,"height":137,"color":"6"}],"edges":[{"id":"a7b3b55a2c457ab1","fromNode":"7a11cb94f7d0a8d9","fromSide":"bottom","toNode":"8a0f1fa1e0365f15","toSide":"top","label":"code"},{"id":"dbfc20e9c20d4ed0","fromNode":"8a0f1fa1e0365f15","fromSide":"bottom","toNode":"50b7d8d43e23789d","toSide":"top"},{"id":"9499a9b78e4f5769","fromNode":"c3dcd82eb0f1017b","fromSide":"bottom","toNode":"dae97d54e71fc555","toSide":"top"},{"id":"e263ee8a71eb7e5d","fromNode":"7a11cb94f7d0a8d9","fromSide":"right","toNode":"49b6ae2b97ed3a38","toSide":"top"},{"id":"d70989613dcd001b","fromNode":"eadd2c38885af3d9","fromSide":"bottom","toNode":"c3dcd82eb0f1017b","toSide":"top","label":"x"},{"id":"f13dcc3d02c075e0","fromNode":"6ef4d0c132d7d762","fromSide":"bottom","toNode":"c3dcd82eb0f1017b","toSide":"top","label":"y"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"426db25be12ba40f","type":"group","x":-289,"y":-1430,"width":820,"height":797,"label":"Standard use"}, + {"id":"f8a5be321df2fbec","type":"group","x":-111,"y":-557,"width":342,"height":449,"label":"Template code"}, + {"id":"7a11cb94f7d0a8d9","type":"text","text":"Calculate the first 50 numbers in the Fibonacci sequence\n\nEnsure your code is valid JavaScript or TypeScript which directly returns a result by using immediately invoked function expressions or top-level return statements.","x":-248,"y":-1367,"width":372,"height":207}, + {"id":"49b6ae2b97ed3a38","type":"text","text":"","x":11,"y":-1139,"width":450,"height":252,"color":"6"}, + {"id":"8a0f1fa1e0365f15","type":"text","text":"valtown-eval","x":-262,"y":-991,"width":250,"height":60,"color":"2"}, + {"id":"c3dcd82eb0f1017b","type":"text","text":"[valtown-eval]\n{{x}} + {{y}}","x":-39,"y":-347,"width":187,"height":95,"color":"2"}, + {"id":"eadd2c38885af3d9","type":"text","text":"45","x":-79,"y":-520,"width":88,"height":60,"color":"6"}, + {"id":"6ef4d0c132d7d762","type":"text","text":"62","x":120,"y":-526,"width":86,"height":60,"color":"6"}, + {"id":"aacc42db1df0493a","type":"text","text":"The template-able argument of the eval action is the code","x":-411,"y":-506,"width":283,"height":85}, + {"id":"1616346be6267f84","x":-702,"y":-982,"width":393,"height":87,"type":"text","text":"If there are code blocks in the \"code\" variable, the action node will use the code inside them."}, + {"id":"41aeb1a64a1a9bd9","type":"text","text":"The API this action uses expects code in a specific format to work.\n\nThe second paragraph of the prompt here is a good start if you want to use LLMs to generate code.","x":-643,"y":-1190,"width":322,"height":175}, + {"id":"058972517fb03fd3","type":"text","text":"The built-in action for evaluating JS/TS code using Val Town can be referenced by the name \"valtown-eval\"\n\nArguments:\n- code (required)","x":-661,"y":-1441,"width":349,"height":228}, + {"id":"dae97d54e71fc555","type":"text","text":"","x":13,"y":-205,"width":83,"height":64,"color":"6"}, + {"id":"50b7d8d43e23789d","type":"text","text":"","x":-271,"y":-785,"width":781,"height":137,"color":"6"} + ], + "edges":[ + {"id":"a7b3b55a2c457ab1","fromNode":"7a11cb94f7d0a8d9","fromSide":"bottom","toNode":"8a0f1fa1e0365f15","toSide":"top","label":"code"}, + {"id":"dbfc20e9c20d4ed0","fromNode":"8a0f1fa1e0365f15","fromSide":"bottom","toNode":"50b7d8d43e23789d","toSide":"top"}, + {"id":"9499a9b78e4f5769","fromNode":"c3dcd82eb0f1017b","fromSide":"bottom","toNode":"dae97d54e71fc555","toSide":"top"}, + {"id":"e263ee8a71eb7e5d","fromNode":"7a11cb94f7d0a8d9","fromSide":"right","toNode":"49b6ae2b97ed3a38","toSide":"top"}, + {"id":"d70989613dcd001b","fromNode":"eadd2c38885af3d9","fromSide":"bottom","toNode":"c3dcd82eb0f1017b","toSide":"top","label":"x"}, + {"id":"f13dcc3d02c075e0","fromNode":"6ef4d0c132d7d762","fromSide":"bottom","toNode":"c3dcd82eb0f1017b","toSide":"top","label":"y"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/5. Val Town Email.canvas b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/5. Val Town Email.canvas index 8cf5cf5..d35cf24 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/5. Val Town Email.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/6. Built-in Actions/5. Val Town Email.canvas @@ -1 +1,20 @@ -{"nodes":[{"id":"bd1323cef1df06fa","type":"group","x":-119,"y":-626,"width":383,"height":562,"label":"Standard use"},{"id":"8c5767aa3f7ca516","type":"group","x":-141,"y":16,"width":413,"height":384,"label":"Template code"},{"id":"913b0d8d220c7bd0","type":"text","text":"valtown-email","x":-49,"y":-363,"width":250,"height":60,"color":"2"},{"id":"7f1cf8283ccfede1","type":"text","text":"","x":-49,"y":-237,"width":250,"height":125,"color":"6"},{"id":"2fb0dc4fa990745f","type":"text","text":"The built-in action for sending emails using Val Town can be referenced by the name \"valtown-emaill\"\n\nArguments:\n- body (required)\n- subject\n- html (html content of the email)\n- to (needs pro Val Town account)\n\t- Your email (default)","x":-499,"y":-601,"width":349,"height":321},{"id":"15f3a210252c5f5b","type":"text","text":"Write a brief email of greeting in Swahili","x":-102,"y":-601,"width":352,"height":75},{"id":"096fe78f8953a6c7","type":"text","text":"[valtown-email]\nHey,\n{{content}}\n\n{{signoff}},\nTony","x":22,"y":198,"width":227,"height":179,"color":"2"},{"id":"8834acb33b5b05a2","type":"text","text":"Lemme know when you're free.","x":1,"y":31,"width":250,"height":60,"color":"6"},{"id":"b65bae1aca259538","type":"text","text":"See you when I see you","x":-126,"y":121,"width":157,"height":60,"color":"6"},{"id":"d26a2c4e397daeb0","type":"text","text":"The template-able argument of the email action is the body","x":-436,"y":110,"width":283,"height":85}],"edges":[{"id":"9479867c29fc61c3","fromNode":"15f3a210252c5f5b","fromSide":"bottom","toNode":"913b0d8d220c7bd0","toSide":"top","color":"6","label":"body\nsubject"},{"id":"d4e9920a5aaaae47","fromNode":"913b0d8d220c7bd0","fromSide":"bottom","toNode":"7f1cf8283ccfede1","toSide":"top"},{"id":"c3f31ca08528ffd9","fromNode":"b65bae1aca259538","fromSide":"bottom","toNode":"096fe78f8953a6c7","toSide":"left","label":"signoff"},{"id":"a5620842eb411ddb","fromNode":"8834acb33b5b05a2","fromSide":"bottom","toNode":"096fe78f8953a6c7","toSide":"top","label":"content"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"bd1323cef1df06fa","type":"group","x":-119,"y":-626,"width":383,"height":562,"label":"Standard use"}, + {"id":"8c5767aa3f7ca516","type":"group","x":-141,"y":16,"width":413,"height":384,"label":"Template code"}, + {"id":"913b0d8d220c7bd0","type":"text","text":"valtown-email","x":-49,"y":-363,"width":250,"height":60,"color":"2"}, + {"id":"7f1cf8283ccfede1","type":"text","text":"","x":-49,"y":-237,"width":250,"height":125,"color":"6"}, + {"id":"2fb0dc4fa990745f","type":"text","text":"The built-in action for sending emails using Val Town can be referenced by the name \"valtown-emaill\"\n\nArguments:\n- body (required)\n- subject\n- html (html content of the email)\n- to (needs pro Val Town account)\n\t- Your email (default)","x":-499,"y":-601,"width":349,"height":321}, + {"id":"15f3a210252c5f5b","type":"text","text":"Write a brief email of greeting in Swahili","x":-102,"y":-601,"width":352,"height":75}, + {"id":"096fe78f8953a6c7","type":"text","text":"[valtown-email]\nHey,\n{{content}}\n\n{{signoff}},\nTony","x":22,"y":198,"width":227,"height":179,"color":"2"}, + {"id":"8834acb33b5b05a2","type":"text","text":"Lemme know when you're free.","x":1,"y":31,"width":250,"height":60,"color":"6"}, + {"id":"b65bae1aca259538","type":"text","text":"See you when I see you","x":-126,"y":121,"width":157,"height":60,"color":"6"}, + {"id":"d26a2c4e397daeb0","type":"text","text":"The template-able argument of the email action is the body","x":-436,"y":110,"width":283,"height":85} + ], + "edges":[ + {"id":"9479867c29fc61c3","fromNode":"15f3a210252c5f5b","fromSide":"bottom","toNode":"913b0d8d220c7bd0","toSide":"top","color":"6","label":"body\nsubject"}, + {"id":"d4e9920a5aaaae47","fromNode":"913b0d8d220c7bd0","fromSide":"bottom","toNode":"7f1cf8283ccfede1","toSide":"top"}, + {"id":"c3f31ca08528ffd9","fromNode":"b65bae1aca259538","fromSide":"bottom","toNode":"096fe78f8953a6c7","toSide":"left","label":"signoff"}, + {"id":"a5620842eb411ddb","fromNode":"8834acb33b5b05a2","fromSide":"bottom","toNode":"096fe78f8953a6c7","toSide":"top","label":"content"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/1. Vision.canvas b/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/1. Vision.canvas index e00344a..55590df 100644 --- a/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/1. Vision.canvas +++ b/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/1. Vision.canvas @@ -1 +1,20 @@ -{"nodes":[{"id":"7be62958bc86b912","x":-213,"y":-452,"width":529,"height":680,"type":"group","label":"Embedding images"},{"id":"b258a15559b32956","type":"text","text":"What is this?\n\n![nice](https://thisitaliankitchen.com/wp-content/uploads/2023/06/ricotta-cannolis.jpg)","x":-91,"y":-432,"width":285,"height":403},{"id":"885ecd1433cb7016","type":"text","text":"","x":-193,"y":19,"width":489,"height":189,"color":"6"},{"id":"ef5e7ce3002cecdc","x":-608,"y":-267,"width":371,"height":129,"type":"text","text":"If there's a markdown image embed anywhere in the chat history being sent in an AI node, it will be included as an image to be seen by multi-modal LLMs"},{"id":"9b331c6bba11b723","x":-583,"y":-97,"width":344,"height":243,"type":"text","text":"Embedding urls from the web:\n```\n![description](link)\n```\n\nEmbedding images from your vault:\n```\n![[image.jpg]]\n```"}],"edges":[{"id":"f6a6fc6a3202bc06","fromNode":"b258a15559b32956","fromSide":"bottom","toNode":"885ecd1433cb7016","toSide":"top"}]} \ No newline at end of file +{ + "nodes":[ + {"id":"a2a3d07c8e04b7fb","type":"group","x":-264,"y":321,"width":614,"height":658,"label":"Disabling vision"}, + {"id":"7be62958bc86b912","type":"group","x":-213,"y":-452,"width":529,"height":680,"label":"Embedding images"}, + {"id":"b258a15559b32956","type":"text","text":"What is this?\n\n![nice](https://thisitaliankitchen.com/wp-content/uploads/2023/06/ricotta-cannolis.jpg)","x":-91,"y":-432,"width":285,"height":403}, + {"id":"885ecd1433cb7016","type":"text","text":"","x":-193,"y":19,"width":489,"height":189,"color":"6"}, + {"id":"ef5e7ce3002cecdc","type":"text","text":"If there's a markdown image embed anywhere in the chat history being sent in an AI node, it will be included as an image to be seen by multi-modal LLMs","x":-608,"y":-267,"width":371,"height":129}, + {"id":"9b331c6bba11b723","type":"text","text":"Embedding urls from the web:\n```\n![description](link)\n```\n\nEmbedding images from your vault:\n```\n![[image.jpg]]\n```","x":-583,"y":-97,"width":344,"height":243}, + {"id":"f853930eb8a28a12","type":"text","text":"What is this?\n\n![nice](https://static.scientificamerican.com/sciam/cache/file/41DF7DA0-EE58-4259-AA815A390FB37C55_source.jpg?w=900)","x":-26,"y":348,"width":340,"height":290}, + {"id":"4cc364fe8b26d5fe","type":"text","text":"false","x":-233,"y":358,"width":110,"height":60,"color":"6"}, + {"id":"689e145cde7ec714","type":"text","text":"","x":-183,"y":741,"width":489,"height":189,"color":"6"}, + {"id":"f8ff937e38d8cd72","type":"text","text":"Vision is enabled by default, but you can disable it at the top of the settings tab, and override that setting at the node level using a config arrow labeled \"enableVision\"","x":-654,"y":418,"width":375,"height":150}, + {"id":"b7d929b4a01df064","x":-640,"y":781,"width":355,"height":96,"type":"text","text":"The LLM will still see the link, but we won't pass it the content of the image."} + ], + "edges":[ + {"id":"f6a6fc6a3202bc06","fromNode":"b258a15559b32956","fromSide":"bottom","toNode":"885ecd1433cb7016","toSide":"top"}, + {"id":"b44dfaaff63347b5","fromNode":"f853930eb8a28a12","fromSide":"bottom","toNode":"689e145cde7ec714","toSide":"top"}, + {"id":"d5deb032b93596f3","fromNode":"4cc364fe8b26d5fe","fromSide":"bottom","toNode":"f853930eb8a28a12","toSide":"left","color":"2","label":"enableVision"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/2. Running subsets of a canvas.canvas b/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/2. Running subsets of a canvas.canvas new file mode 100644 index 0000000..0860dd3 --- /dev/null +++ b/packages/cannoli-plugin/assets/Cannoli College/7. Additional features/2. Running subsets of a canvas.canvas @@ -0,0 +1,30 @@ +{ + "nodes":[ + {"id":"cefc78df00b335d0","type":"group","x":-139,"y":-15,"width":1050,"height":446,"label":"Multiple \"cannoli\" groups"}, + {"id":"d8e91535899d2710","type":"group","x":-151,"y":-537,"width":693,"height":446,"label":"\"cannoli\" groups"}, + {"id":"fcb4324889bc2035","type":"group","x":-107,"y":-482,"width":290,"height":362,"label":"cannoli"}, + {"id":"b59d6c3fdb77444b","type":"group","x":-95,"y":40,"width":290,"height":362,"label":"cannoli"}, + {"id":"0e3927260d444185","type":"group","x":566,"y":39,"width":290,"height":362,"label":"cannoli"}, + {"id":"5e872db1381df5e5","type":"text","text":"hello!","x":329,"y":-463,"width":112,"height":60}, + {"id":"4817b55892e44954","type":"text","text":"","x":261,"y":-290,"width":250,"height":149,"color":"6"}, + {"id":"2c62a49f4d7d07f9","type":"text","text":"If you'd only like a specific part of a canvas to be run as a cannoli, you can wrap it in a group labeled \"cannoli\".\n\nIf a group with that label is present on a canvas, when we run it, only the nodes within \"cannoli\" groups will be run.","x":-607,"y":-411,"width":433,"height":205}, + {"id":"92889b47100a022a","type":"text","text":"hello!","x":-19,"y":-462,"width":112,"height":60}, + {"id":"7d4766ac0a8356f2","type":"text","text":"","x":-87,"y":-289,"width":250,"height":149,"color":"6"}, + {"id":"791a20c14bc962c7","type":"text","text":"hello!","x":-7,"y":60,"width":112,"height":60}, + {"id":"76a7b1f7be41b27a","type":"text","text":"","x":-75,"y":233,"width":250,"height":149,"color":"6"}, + {"id":"b2d4aec8efc72155","type":"text","text":"If you'd only like a specific part of a canvas to be run as a cannoli, you can wrap it in a group labeled \"cannoli\".\n\nIf a group with that label is present on a canvas, when we run it, only the nodes within \"cannoli\" groups will be run.","x":-595,"y":111,"width":433,"height":205}, + {"id":"e0064917d60d3a1e","type":"text","text":"","x":259,"y":229,"width":250,"height":149,"color":"6"}, + {"id":"63c6531a4f4afe03","type":"text","text":"hello!","x":328,"y":62,"width":112,"height":60}, + {"id":"e9af95fbd2cc5541","type":"text","text":"hello!","x":653,"y":62,"width":112,"height":60}, + {"id":"5ec3f63efea0a200","type":"text","text":"","x":584,"y":234,"width":250,"height":149,"color":"6"}, + {"id":"e3b07a284fbf614e","x":-584,"y":-128,"width":395,"height":164,"type":"text","text":"It's important to note that arrows entering \"cannoli\" groups from outside it will not be run as part of the cannoli, so they will not pass content to nodes inside the group."}, + {"id":"6701e0a23ee498e3","x":587,"y":-454,"width":446,"height":245,"type":"text","text":"If you'd like to ensure that you only run parts of any canvas which you've specified with \"cannoli\" groups, you can enable the \"Only run canvases with a 'cannoli' group\" setting, in the \"Canvas preferences\" section of the settings tab.\n\nThis will mean that canvases without any \"cannoli\" groups will not be run at all."} + ], + "edges":[ + {"id":"8494f89ecf0405e8","fromNode":"92889b47100a022a","fromSide":"bottom","toNode":"7d4766ac0a8356f2","toSide":"top"}, + {"id":"7bae9bee7dc75c20","fromNode":"5e872db1381df5e5","fromSide":"bottom","toNode":"4817b55892e44954","toSide":"top"}, + {"id":"4a0ba2bef1aa5c20","fromNode":"e9af95fbd2cc5541","fromSide":"bottom","toNode":"5ec3f63efea0a200","toSide":"top"}, + {"id":"7dd99e00e4b9a462","fromNode":"791a20c14bc962c7","fromSide":"bottom","toNode":"76a7b1f7be41b27a","toSide":"top"}, + {"id":"bb7daccfc6f53f57","fromNode":"63c6531a4f4afe03","fromSide":"bottom","toNode":"e0064917d60d3a1e","toSide":"top"} + ] +} \ No newline at end of file diff --git a/packages/cannoli-plugin/assets/cannoliCollege.js b/packages/cannoli-plugin/assets/cannoliCollege.js index 261d006..58536ed 100644 --- a/packages/cannoli-plugin/assets/cannoliCollege.js +++ b/packages/cannoli-plugin/assets/cannoliCollege.js @@ -112,7 +112,7 @@ export const cannoliCollege = { "6. Built-in Actions": [ { name: "1. Dalle.canvas", - content: "{\"nodes\":[{\"id\":\"9c131929cf9cd0ae\",\"type\":\"group\",\"x\":-436,\"y\":579,\"width\":858,\"height\":1205,\"label\":\"Template prompt\"},{\"id\":\"52b5f0705400f7d5\",\"type\":\"group\",\"x\":-314,\"y\":-276,\"width\":588,\"height\":789,\"label\":\"Standard use\"},{\"id\":\"1d951e2c23093a2b\",\"type\":\"text\",\"text\":\"The template-able argument of the dalle action is the prompt\",\"x\":-708,\"y\":685,\"width\":255,\"height\":109},{\"id\":\"b9ea77725ca55e8f\",\"type\":\"text\",\"text\":\"make a picture of a frog at a concert\",\"x\":-154,\"y\":-256,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"8a701ef86405bac2\",\"type\":\"text\",\"text\":\"dalle\",\"x\":-152,\"y\":-120,\"width\":250,\"height\":60,\"color\":\"2\"},{\"id\":\"1cb415bf1256f272\",\"type\":\"text\",\"text\":\"\",\"x\":-294,\"y\":-11,\"width\":534,\"height\":504,\"color\":\"6\"},{\"id\":\"bf9bc6d3de30f54b\",\"type\":\"text\",\"text\":\"The built-in dalle action can be referenced by the name \\\"dalle\\\"\\n\\nArguments:\\n- prompt (required)\\n- size (one of the following)\\n\\t- 256x256\\n\\t- 512x512\\n\\t- 1024x1024 (default)\\n\\t- 1024x1792\\n\\t- 1792x1024\\n- model\\n\\t- dall-e-3 (default)\\n\\t- dall-e-2\",\"x\":-648,\"y\":-172,\"width\":311,\"height\":417},{\"id\":\"41ad397423fb17d8\",\"type\":\"text\",\"text\":\"Note that the dalle action currently only returns a link to the images it produces, so if you want to save the image to you're vault you have to copy the image itself, as OpenAI will not maintain these image links permanently.\\n\\n(if you'd benefit from an option to save images, please let us know)\",\"x\":286,\"y\":-8,\"width\":433,\"height\":236},{\"id\":\"c36034b72096726f\",\"type\":\"text\",\"text\":\"disco\",\"x\":-143,\"y\":599,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"0a4a5477edeb0a9b\",\"type\":\"text\",\"text\":\"guinea pig\",\"x\":-416,\"y\":601,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"f66a3d132929fc8d\",\"type\":\"text\",\"text\":\"1024x1792\",\"x\":152,\"y\":633,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"4c9b9042079da5ed\",\"type\":\"text\",\"text\":\"[dalle]\\nmake a picture of a {{animal}} at a {{event}}\",\"x\":-142,\"y\":731,\"width\":250,\"height\":98,\"color\":\"2\"},{\"id\":\"5b2a6b4b87c80207\",\"type\":\"text\",\"text\":\"\",\"x\":-284,\"y\":878,\"width\":534,\"height\":883,\"color\":\"6\"}],\"edges\":[{\"id\":\"a2a83b896a844f8b\",\"fromNode\":\"b9ea77725ca55e8f\",\"fromSide\":\"bottom\",\"toNode\":\"8a701ef86405bac2\",\"toSide\":\"top\",\"label\":\"prompt\"},{\"id\":\"7ef0ede979ae0cf7\",\"fromNode\":\"4c9b9042079da5ed\",\"fromSide\":\"bottom\",\"toNode\":\"5b2a6b4b87c80207\",\"toSide\":\"top\"},{\"id\":\"e3be85b19da03b44\",\"fromNode\":\"f66a3d132929fc8d\",\"fromSide\":\"bottom\",\"toNode\":\"4c9b9042079da5ed\",\"toSide\":\"right\",\"label\":\"size\"},{\"id\":\"abab8814929330b2\",\"fromNode\":\"0a4a5477edeb0a9b\",\"fromSide\":\"bottom\",\"toNode\":\"4c9b9042079da5ed\",\"toSide\":\"left\",\"label\":\"animal\"},{\"id\":\"6bed803745429637\",\"fromNode\":\"c36034b72096726f\",\"fromSide\":\"bottom\",\"toNode\":\"4c9b9042079da5ed\",\"toSide\":\"top\"},{\"id\":\"f2bde8c9ede6acdf\",\"fromNode\":\"8a701ef86405bac2\",\"fromSide\":\"bottom\",\"toNode\":\"1cb415bf1256f272\",\"toSide\":\"top\"}]}" + content: "{\"nodes\":[{\"id\":\"9c131929cf9cd0ae\",\"type\":\"group\",\"x\":-436,\"y\":579,\"width\":858,\"height\":1205,\"label\":\"Template prompt\"},{\"id\":\"52b5f0705400f7d5\",\"type\":\"group\",\"x\":-314,\"y\":-276,\"width\":588,\"height\":789,\"label\":\"Standard use\"},{\"id\":\"1d951e2c23093a2b\",\"type\":\"text\",\"text\":\"The template-able argument of the dalle action is the prompt\",\"x\":-708,\"y\":685,\"width\":255,\"height\":109},{\"id\":\"b9ea77725ca55e8f\",\"type\":\"text\",\"text\":\"make a picture of a frog at a concert\",\"x\":-154,\"y\":-256,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"8a701ef86405bac2\",\"type\":\"text\",\"text\":\"dalle\",\"x\":-152,\"y\":-120,\"width\":250,\"height\":60,\"color\":\"2\"},{\"id\":\"1cb415bf1256f272\",\"type\":\"text\",\"text\":\"\",\"x\":-294,\"y\":-11,\"width\":534,\"height\":504,\"color\":\"6\"},{\"id\":\"bf9bc6d3de30f54b\",\"type\":\"text\",\"text\":\"The built-in dalle action can be referenced by the name \\\"dalle\\\"\\n\\nArguments:\\n- prompt (required)\\n- size (one of the following)\\n\\t- 256x256\\n\\t- 512x512\\n\\t- 1024x1024 (default)\\n\\t- 1024x1792\\n\\t- 1792x1024\\n- model\\n\\t- dall-e-3 (default)\\n\\t- dall-e-2\",\"x\":-648,\"y\":-172,\"width\":311,\"height\":417},{\"id\":\"41ad397423fb17d8\",\"type\":\"text\",\"text\":\"Note that the dalle action currently only returns a link to the images it produces, so if you want to save the image to you're vault you have to copy the image itself, as OpenAI will not maintain these image links permanently.\\n\\n(if you'd benefit from an option to save images, please let us know)\",\"x\":286,\"y\":-8,\"width\":433,\"height\":236},{\"id\":\"c36034b72096726f\",\"type\":\"text\",\"text\":\"disco\",\"x\":-143,\"y\":599,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"0a4a5477edeb0a9b\",\"type\":\"text\",\"text\":\"guinea pig\",\"x\":-416,\"y\":601,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"f66a3d132929fc8d\",\"type\":\"text\",\"text\":\"1024x1792\",\"x\":152,\"y\":633,\"width\":250,\"height\":60,\"color\":\"6\"},{\"id\":\"4c9b9042079da5ed\",\"type\":\"text\",\"text\":\"[dalle]\\nmake a picture of a {{animal}} at a {{event}}\",\"x\":-142,\"y\":731,\"width\":250,\"height\":98,\"color\":\"2\"},{\"id\":\"5b2a6b4b87c80207\",\"type\":\"text\",\"text\":\"\",\"x\":-284,\"y\":878,\"width\":534,\"height\":883,\"color\":\"6\"}],\"edges\":[{\"id\":\"a2a83b896a844f8b\",\"fromNode\":\"b9ea77725ca55e8f\",\"fromSide\":\"bottom\",\"toNode\":\"8a701ef86405bac2\",\"toSide\":\"top\",\"label\":\"prompt\"},{\"id\":\"7ef0ede979ae0cf7\",\"fromNode\":\"4c9b9042079da5ed\",\"fromSide\":\"bottom\",\"toNode\":\"5b2a6b4b87c80207\",\"toSide\":\"top\"},{\"id\":\"e3be85b19da03b44\",\"fromNode\":\"f66a3d132929fc8d\",\"fromSide\":\"bottom\",\"toNode\":\"4c9b9042079da5ed\",\"toSide\":\"right\",\"label\":\"size\"},{\"id\":\"abab8814929330b2\",\"fromNode\":\"0a4a5477edeb0a9b\",\"fromSide\":\"bottom\",\"toNode\":\"4c9b9042079da5ed\",\"toSide\":\"left\",\"label\":\"animal\"},{\"id\":\"6bed803745429637\",\"fromNode\":\"c36034b72096726f\",\"fromSide\":\"bottom\",\"toNode\":\"4c9b9042079da5ed\",\"toSide\":\"top\",\"label\":\"event\"},{\"id\":\"f2bde8c9ede6acdf\",\"fromNode\":\"8a701ef86405bac2\",\"fromSide\":\"bottom\",\"toNode\":\"1cb415bf1256f272\",\"toSide\":\"top\"}]}" }, { name: "2. Dataview.canvas", @@ -138,7 +138,11 @@ export const cannoliCollege = { "7. Additional features": [ { name: "1. Vision.canvas", - content: "{\"nodes\":[{\"id\":\"7be62958bc86b912\",\"x\":-213,\"y\":-452,\"width\":529,\"height\":680,\"type\":\"group\",\"label\":\"Embedding images\"},{\"id\":\"b258a15559b32956\",\"type\":\"text\",\"text\":\"What is this?\\n\\n![nice](https://thisitaliankitchen.com/wp-content/uploads/2023/06/ricotta-cannolis.jpg)\",\"x\":-91,\"y\":-432,\"width\":285,\"height\":403},{\"id\":\"885ecd1433cb7016\",\"type\":\"text\",\"text\":\"\",\"x\":-193,\"y\":19,\"width\":489,\"height\":189,\"color\":\"6\"},{\"id\":\"ef5e7ce3002cecdc\",\"x\":-608,\"y\":-267,\"width\":371,\"height\":129,\"type\":\"text\",\"text\":\"If there's a markdown image embed anywhere in the chat history being sent in an AI node, it will be included as an image to be seen by multi-modal LLMs\"},{\"id\":\"9b331c6bba11b723\",\"x\":-583,\"y\":-97,\"width\":344,\"height\":243,\"type\":\"text\",\"text\":\"Embedding urls from the web:\\n```\\n![description](link)\\n```\\n\\nEmbedding images from your vault:\\n```\\n![[image.jpg]]\\n```\"}],\"edges\":[{\"id\":\"f6a6fc6a3202bc06\",\"fromNode\":\"b258a15559b32956\",\"fromSide\":\"bottom\",\"toNode\":\"885ecd1433cb7016\",\"toSide\":\"top\"}]}" + content: "{\"nodes\":[{\"id\":\"a2a3d07c8e04b7fb\",\"type\":\"group\",\"x\":-264,\"y\":321,\"width\":614,\"height\":658,\"label\":\"Disabling vision\"},{\"id\":\"7be62958bc86b912\",\"type\":\"group\",\"x\":-213,\"y\":-452,\"width\":529,\"height\":680,\"label\":\"Embedding images\"},{\"id\":\"b258a15559b32956\",\"type\":\"text\",\"text\":\"What is this?\\n\\n![nice](https://thisitaliankitchen.com/wp-content/uploads/2023/06/ricotta-cannolis.jpg)\",\"x\":-91,\"y\":-432,\"width\":285,\"height\":403},{\"id\":\"885ecd1433cb7016\",\"type\":\"text\",\"text\":\"\",\"x\":-193,\"y\":19,\"width\":489,\"height\":189,\"color\":\"6\"},{\"id\":\"ef5e7ce3002cecdc\",\"type\":\"text\",\"text\":\"If there's a markdown image embed anywhere in the chat history being sent in an AI node, it will be included as an image to be seen by multi-modal LLMs\",\"x\":-608,\"y\":-267,\"width\":371,\"height\":129},{\"id\":\"9b331c6bba11b723\",\"type\":\"text\",\"text\":\"Embedding urls from the web:\\n```\\n![description](link)\\n```\\n\\nEmbedding images from your vault:\\n```\\n![[image.jpg]]\\n```\",\"x\":-583,\"y\":-97,\"width\":344,\"height\":243},{\"id\":\"f853930eb8a28a12\",\"type\":\"text\",\"text\":\"What is this?\\n\\n![nice](https://static.scientificamerican.com/sciam/cache/file/41DF7DA0-EE58-4259-AA815A390FB37C55_source.jpg?w=900)\",\"x\":-26,\"y\":348,\"width\":340,\"height\":290},{\"id\":\"4cc364fe8b26d5fe\",\"type\":\"text\",\"text\":\"false\",\"x\":-233,\"y\":358,\"width\":110,\"height\":60,\"color\":\"6\"},{\"id\":\"689e145cde7ec714\",\"type\":\"text\",\"text\":\"\",\"x\":-183,\"y\":741,\"width\":489,\"height\":189,\"color\":\"6\"},{\"id\":\"f8ff937e38d8cd72\",\"type\":\"text\",\"text\":\"Vision is enabled by default, but you can disable it at the top of the settings tab, and override that setting at the node level using a config arrow labeled \\\"enableVision\\\"\",\"x\":-654,\"y\":418,\"width\":375,\"height\":150},{\"id\":\"b7d929b4a01df064\",\"x\":-640,\"y\":781,\"width\":355,\"height\":96,\"type\":\"text\",\"text\":\"The LLM will still see the link, but we won't pass it the content of the image.\"}],\"edges\":[{\"id\":\"f6a6fc6a3202bc06\",\"fromNode\":\"b258a15559b32956\",\"fromSide\":\"bottom\",\"toNode\":\"885ecd1433cb7016\",\"toSide\":\"top\"},{\"id\":\"b44dfaaff63347b5\",\"fromNode\":\"f853930eb8a28a12\",\"fromSide\":\"bottom\",\"toNode\":\"689e145cde7ec714\",\"toSide\":\"top\"},{\"id\":\"d5deb032b93596f3\",\"fromNode\":\"4cc364fe8b26d5fe\",\"fromSide\":\"bottom\",\"toNode\":\"f853930eb8a28a12\",\"toSide\":\"left\",\"color\":\"2\",\"label\":\"enableVision\"}]}" + }, + { + name: "2. Running subsets of a canvas.canvas", + content: "{\"nodes\":[{\"id\":\"cefc78df00b335d0\",\"type\":\"group\",\"x\":-139,\"y\":-15,\"width\":1050,\"height\":446,\"label\":\"Multiple \\\"cannoli\\\" groups\"},{\"id\":\"d8e91535899d2710\",\"type\":\"group\",\"x\":-151,\"y\":-537,\"width\":693,\"height\":446,\"label\":\"\\\"cannoli\\\" groups\"},{\"id\":\"fcb4324889bc2035\",\"type\":\"group\",\"x\":-107,\"y\":-482,\"width\":290,\"height\":362,\"label\":\"cannoli\"},{\"id\":\"b59d6c3fdb77444b\",\"type\":\"group\",\"x\":-95,\"y\":40,\"width\":290,\"height\":362,\"label\":\"cannoli\"},{\"id\":\"0e3927260d444185\",\"type\":\"group\",\"x\":566,\"y\":39,\"width\":290,\"height\":362,\"label\":\"cannoli\"},{\"id\":\"5e872db1381df5e5\",\"type\":\"text\",\"text\":\"hello!\",\"x\":329,\"y\":-463,\"width\":112,\"height\":60},{\"id\":\"4817b55892e44954\",\"type\":\"text\",\"text\":\"\",\"x\":261,\"y\":-290,\"width\":250,\"height\":149,\"color\":\"6\"},{\"id\":\"2c62a49f4d7d07f9\",\"type\":\"text\",\"text\":\"If you'd only like a specific part of a canvas to be run as a cannoli, you can wrap it in a group labeled \\\"cannoli\\\".\\n\\nIf a group with that label is present on a canvas, when we run it, only the nodes within \\\"cannoli\\\" groups will be run.\",\"x\":-607,\"y\":-411,\"width\":433,\"height\":205},{\"id\":\"92889b47100a022a\",\"type\":\"text\",\"text\":\"hello!\",\"x\":-19,\"y\":-462,\"width\":112,\"height\":60},{\"id\":\"7d4766ac0a8356f2\",\"type\":\"text\",\"text\":\"\",\"x\":-87,\"y\":-289,\"width\":250,\"height\":149,\"color\":\"6\"},{\"id\":\"791a20c14bc962c7\",\"type\":\"text\",\"text\":\"hello!\",\"x\":-7,\"y\":60,\"width\":112,\"height\":60},{\"id\":\"76a7b1f7be41b27a\",\"type\":\"text\",\"text\":\"\",\"x\":-75,\"y\":233,\"width\":250,\"height\":149,\"color\":\"6\"},{\"id\":\"b2d4aec8efc72155\",\"type\":\"text\",\"text\":\"If you'd only like a specific part of a canvas to be run as a cannoli, you can wrap it in a group labeled \\\"cannoli\\\".\\n\\nIf a group with that label is present on a canvas, when we run it, only the nodes within \\\"cannoli\\\" groups will be run.\",\"x\":-595,\"y\":111,\"width\":433,\"height\":205},{\"id\":\"e0064917d60d3a1e\",\"type\":\"text\",\"text\":\"\",\"x\":259,\"y\":229,\"width\":250,\"height\":149,\"color\":\"6\"},{\"id\":\"63c6531a4f4afe03\",\"type\":\"text\",\"text\":\"hello!\",\"x\":328,\"y\":62,\"width\":112,\"height\":60},{\"id\":\"e9af95fbd2cc5541\",\"type\":\"text\",\"text\":\"hello!\",\"x\":653,\"y\":62,\"width\":112,\"height\":60},{\"id\":\"5ec3f63efea0a200\",\"type\":\"text\",\"text\":\"\",\"x\":584,\"y\":234,\"width\":250,\"height\":149,\"color\":\"6\"},{\"id\":\"e3b07a284fbf614e\",\"x\":-584,\"y\":-128,\"width\":395,\"height\":164,\"type\":\"text\",\"text\":\"It's important to note that arrows entering \\\"cannoli\\\" groups from outside it will not be run as part of the cannoli, so they will not pass content to nodes inside the group.\"},{\"id\":\"6701e0a23ee498e3\",\"x\":587,\"y\":-454,\"width\":446,\"height\":245,\"type\":\"text\",\"text\":\"If you'd like to ensure that you only run parts of any canvas which you've specified with \\\"cannoli\\\" groups, you can enable the \\\"Only run canvases with a 'cannoli' group\\\" setting, in the \\\"Canvas preferences\\\" section of the settings tab.\\n\\nThis will mean that canvases without any \\\"cannoli\\\" groups will not be run at all.\"}],\"edges\":[{\"id\":\"8494f89ecf0405e8\",\"fromNode\":\"92889b47100a022a\",\"fromSide\":\"bottom\",\"toNode\":\"7d4766ac0a8356f2\",\"toSide\":\"top\"},{\"id\":\"7bae9bee7dc75c20\",\"fromNode\":\"5e872db1381df5e5\",\"fromSide\":\"bottom\",\"toNode\":\"4817b55892e44954\",\"toSide\":\"top\"},{\"id\":\"4a0ba2bef1aa5c20\",\"fromNode\":\"e9af95fbd2cc5541\",\"fromSide\":\"bottom\",\"toNode\":\"5ec3f63efea0a200\",\"toSide\":\"top\"},{\"id\":\"7dd99e00e4b9a462\",\"fromNode\":\"791a20c14bc962c7\",\"fromSide\":\"bottom\",\"toNode\":\"76a7b1f7be41b27a\",\"toSide\":\"top\"},{\"id\":\"bb7daccfc6f53f57\",\"fromNode\":\"63c6531a4f4afe03\",\"fromSide\":\"bottom\",\"toNode\":\"e0064917d60d3a1e\",\"toSide\":\"top\"}]}" }, ], "Example notes": [ diff --git a/packages/cannoli-plugin/src/main.ts b/packages/cannoli-plugin/src/main.ts index d9bcb6d..652231e 100644 --- a/packages/cannoli-plugin/src/main.ts +++ b/packages/cannoli-plugin/src/main.ts @@ -1261,11 +1261,6 @@ export default class Cannoli extends Plugin { if (this.encloses(groupRectangle, nodeRectangle)) { nodeIds.push(node.id); - } else if (this.overlaps(groupRectangle, nodeRectangle)) { - new Notice(`Invalid layout: Node with id ${node.id} overlaps with the group but is not fully enclosed. Nodes should be fully inside or outside of each group.`); - throw new Error( - `Invalid layout: Node with id ${node.id} overlaps with the group but is not fully enclosed. Nodes should be fully inside or outside of each group.` - ); } }