When you trigger an AI command, the AI is given a prompt composed of a request + your data.
The challenge of writing prompts is that it's hard to get it right the first time. To get it right necessitates rapid iteration cycles where you can compare and contrast results, and you need to understand exactly what gets sent to AI when you run that command.
Building a command: When you use a command that requires a prompt, a button will appear called "Prompt workbench".
Opening the prompt workbench: This opens up a new panel where you can do rapid iteration testing of a prompt and its parameters to see the kind of answer they yield.
Node to test with (required): This is necessary context to set so the workbench has a real node to test the prompt on. The context is sent by default after the prompt.
Custom prompt (required): This is where you build your prompt which gets sent to an AI. You must include some kind of reference to or expression that embeds your content into the prompt, otherwise the job will run context-less. A prompt expression looks like this: ${name}. For more, see below.
Expanded prompt: When you have composed your prompt with the expressions, you can preview what gets sent to AI. It will show your custom prompts with the expressions replaced with actual content based on the node you're testing with. You'll also see an estimate of how many tokens the prompt shown will cost if you send it.
Configure and test: Use the sliding scale to increase model creativity.
Ready to test: When you're ready to send a test job, hit "Test AI completion". This does spend AI credits, which you can monitor by running the command Open GPT log monitor
Prompt expressions in Tana are built like Title expressions, with some extra functionality:
To get the name of the node that you are targeting, use ${name}
To reference field values, use ${field label}.
To reference the entire node context with all fields and children in Tana Paste format, use ${sys:context}
To return a node's supertags, use ${sys:tags}
To show a node's children (excluding content inherited from supertag), use ${sys:content}
To insert the current date/date and time, use ${sys:currentDate} and ${sys:currentDateTime} respectively. Keep in mind that GPT doesn't know the current date or time natively.
To return the URL and ID of the node, use ${sys:nodeURL} and ${sys:nodeId} respectively.
All of the normal title expressions are also available.
Extra: to get the full context of the field content, use a field definition.
Reminder: Prompt expressions only work in nodes. They do not work if within references.
This operator will include the expanded owned content of references that are direct children of the target. This is handy if you want to include content that is not directly related to the node you're running the command on, if you want the results of a search node reference to be included, or if there are field values you want expanded in the prompt.
Making an API request involves specifying the API endpoint, choosing the appropriate HTTP method, providing any necessary headers or authentication, and handling the response from the API. This process allows different software systems to exchange data and functionality seamlessly.
Takes a list of children, gets embeddings, and does unsupervised clustering. Given that you have to manually specify number of clusters, this is more of an experiment until we have server-side processing.
Send a meeting agent to a video call to transcribe what participants are saying. Many of these fields map onto the ones being synced by the Calendar integration.
Meeting link (required): Where to find the link to the meeting
Works well with Google Meet and Zoom. Coming soon: MS Teams
Transcript field (required): Where to place the transcript of the meeting
Attendees field: Where to find attendees for the meeting
Having attendees here improves participant identification during the transcription process and when making meeting notes and attributing who said what
Recording target: The link to the recording will be placed here. It will be deleted after 7 day
Meeting date field: Where to find the date of the meeting. The bot will join automatically when the meeting starts.
If a meeting has no date filled in, it will join immediately when you hit "Add meeting agent" button.
Transcription provider: Which provider to use for transcription
Meeting bot name: Name of the bot to use for the meeting
When the agent joins the meeting, the name of the agent can be changed here to "Tam's assistant"
Post process command: Command to run after transcription is completed. The default is a command with the Text processing agent, see below.
Transcript source (required): Where to find the transcript. The field with the text for processing.
Could be a meeting transcript, article, voice memo or similar.
Status attribute: Use this if you need to override the default system provided status attribute.
You may be using several text processors on the same transcript. You can have each text processor triggered based on a different status field.
Text processing agent mode: Which mode to run the text processing agent in. Defaults to meeting if not set. Available modes: meeting|generic.
There are two modes: meeting or generic. For standard meetings, we recommend the meeting setting as it has been optimized to process action items, entities, and attribution of ideas to attendees. For other uses like processing a voice memo, we recommend generic. Default: meeting
Note: If all you define is the Transcript source, the processing agent will create a summary of the transcript, output as a child of the node.
Summary prompt: Prompt to use for generating the summary
Augment prompt: Prompt to use for augmenting the attendees
Action items prompt: Prompt to use for detecting action items. Use ${sys:actionItemTags} to get configured tags
Entities prompt: Prompt to use for detecting new entities, Use ${sys:entityTags} to get configured tags
Extracted items user prompt: Additional prompt to use for extracting items (optional).
EXAMPLE PROMPT:
GOAL: - You are a senior UX researcher tasked with finding relevant “user observations” in an onboarding transcript and reporting them back classified according to the provided tags. TASK: - Find all moments in the transcript when the user experience any of the described types of observation found in the supplied tags. - You work for Acme Inc., and it is the experiences of the user - not the team member - you want to observe and capture. The person with the #team acme tag works at Acme Inc. The person being onboarded is tagged #person. - Find at least 10 items, and at least 2 of each type.
Description: Prompt expression - same syntax as title expression, but can be multiline. ${sys:context} gives context of node and children.
Source: Tana
Note: While you can use references in prompts, any variables like ${sys:context} will not convert. See FAQ on why prompt variables have to be plain nodes.
Description: References to other fields on the same node. If any of these fields are empty, and have AI turned on, then their AI prompts will be run before evaluating this command.
Description: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. OpenAI generally recommends altering this or top_p but not both. Defaults to 0.
Description: An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. OpenAI generally recommends altering this or temperature but not both. Defaults to 1.
Description: Generates best_of completions server-side and returns the "best" (the one with the highest log probability per token). When used with n, best_of controls the number of candidate completions and n specifies how many to return – best_of must be greater than n.
Description: Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence. One sequence on each node.
Description: Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. Defaults to 0.
Description: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. Defaults to 0.
Description: The presence of this field enables splitting up a long context into multiple prompts, which can optionally be combined with the Combination prompt. The field ${sys:context} is determined by the dropdown options, or by a reference to a field or a node.
Description: The context window size includes both the prompt and the response. This parameter takes a number from 0 to 1, and determines the percentage of the context window that the prompt is allowed to fill - both for individual and batched prompts. The default is 0.5, which means that the prompt and response are equal in size.
Description: The size of the generated images. Must be one of 256x256, 512x512, or 1024x1024 for dall-e-2. Must be one of 1024x1024, 1792x1024, or 1024x1792 for dall-e-3 models.
Description: Write out the commands you want to run.
If you're uncertain about how a command is written out, navigate to it through the command line, create a custom shortcut, and go to Settings > Private keyboard shortcuts to the shortcut you just made and expand it. You'll find the command written out in a node.
Description: Either a date, or use Lookup field to reference a field. If reference date is May 1, and relative date is in two weeks, the output will be May 15th.
Description: Allows you to specify the granularity of the date object. Use the dropdown to set year, month, week, day, hour, minute, second, or millisecond.
ImprovedYou can now use Draft panel as the Target node all command nodes that support Target node (press space to choose), which will open an ephemeral panel to the right with the output, with the option to move or insert in daily node ()
FixedFixed bug where Transcribe Youtube video command didn't recognize certain valid Youtube URLs ()
Why are my prompt variables not getting replaced with the actual values?
Nov 26, 2024
In the command line, Set [field] -> [value] doesn't show all my fields, why?
Sep 26, 2024
How do I share a supertag from my private workspace to a shared one?
Sep 26, 2024
Can a command move the current node to a field of a new node?
Sep 26, 2024
Examples
A keyboard shortcut to invoke a set of commands
Nov 21, 2024
🙏 Thanks to Chuck for surfacing this excellent tip for all keyboard users out there doing incremental/bullet journaling and who find that command buttons just aren't their thing! For more stuff like this, join our community to share and learn about all things Tana 🫶
For this example, we're going to build one command that brings up a set of commands for a bullet journaling practice. People who practice bullet journalling (or BuJo) usually decide on a list of keys or "signifiers": bullet symbols that mean different things to the writer. Here's an example of things that might be in this list:
In Tana, we can assume each item in the list is a separate supertag.
Decide on a prefix for your commands. In this example, we'll use "Bujo:".
For each of the signifiers
Create a new command called Bujo: [signifier]
Add the command Add tag, and insert the supertag definition to the parameter
Create a keyboard shortcut: Run Create keyboard shortcut in the command line, then record the shortcut you want to use. In this case, we're using Cmd/Ctrl+Shift+P. In the parameter Commands, write the words Bujo:.
🙏 Thanks to many community members but especially Ready and Navigator Dee for surfacing this tip in a recent conversation! For more stuff like this, join our community to share and learn about all things Tana 🫶
To move all nodes to a single place when they get tagged. This is useful if you want nodes of a certain type to live in a place that makes sense for breadcrumb navigation.
In the parameter Move node target, pick the Library from the dropdown. There are other locations to choose from as well, and you can insert a reference to any node you want as the target
Add parameter Remove references after moving node and give it your desired setting. Most would want it unchecked so it leaves a reference of the node in the original location
Add parameter Move original node and check it. This ensures that even when you use the Add tag action on a reference, it moves the original node to the desired location and not the reference (which won't achieve the goal of this command)
Add the command to the config of the supertag in question. Go to AI and Commands > On added, and add a reference to the command here.
In the parameter Commands, write Notify @[your tana account email]. Example: Notify @fei@tana.inc
Go to the supertag config you want to be notified on, to the section Trigger commands on events, and add a reference to the command to the On added section:
One command to toggle the related content section on/off
Nov 12, 2024
🙏 Thanks to Navigator Theo for sharing how to implement this "focus mode" idea on Related content sections! For more stuff like this, join our community to share and learn about all things Tana 🫶
To configure the related content sections you want to toggle the visibility on, each section will need a node filter where the checked state of the is visible field determines whether they show up or not:
Navigate to the Related content section in the configuration:
For supertags, Cmd/Ctrl+Shift click on the tag itself
For nodes, run the command Configure node
For every related content section
Run the command Add contextual content on the related content nodes, and add >Node filter:: >is visible:: true (checked)
A single command that toggles the checked/unchecked state of a field
Nov 12, 2024
🙏 Credit goes to Ulises RJ and Navigator Theo for coming up with this elegant solution! Join our community to share and learn about all things Tana 🫶
You want to build one command that toggles the state of something, like a checkbox. The key that unlocks this is the obscure Run commands in parallel command, and this is an excellent use for it. The uses for a toggle are endless; this example will demonstrate how to build a visibility switch for command buttons.
Let's call it the single-command toggle.
Note: This is more like a proto-command, something that isn't useful on its own, but unlocks many creative uses.
To configure the commands you want to toggle the visibility on, each command will need a node filter where the checked state of the is visible field determines whether they show up or not:
Create or find a node that has many command buttons you want to hide
For every command, add the >Node filter:: >is visible:: true (checked)
As you do this, the buttons should, one by one, disappear from the node.
There is a command called Set view definition. It can set the Group, Sort and Display settings of a node view.
There is no good UX for this at the moment, so the instructions are not conventional nor friendly for beginners. But right now, this is one way of doing it:
Mock up a node that will have sample child nodes representing the data you'll be applying this command on
Then, create the exact view settings you want with Group, Sort and Display.
Go Cmd/Ctrl+K > Debug Node on the parent node and look at Views for node:
Clone the fields over to the command node so it looks like this:
When you run this command on a node, this should change the view settings according to your configuration.
How can I add supertags on things that I send from Tana Capture?
Sep 26, 2024
While it isn't possible to tag things when you're sending things from Tana Capture, you can have Tana do some post-processing magic to convert written-out tags to real tags once they arrive the Inbox—no AI needed!
This method uses a simple Tana Paste command that you can run on the Inbox node, which targets all new children that have "#" in them.
Once you've created the command, you must add it to the On child added section of the Inbox node. You can find it by running the command Debug node on the title of the Inbox.
"All it does is paste the nodes that have # in them and that are not tagged, using Tana Paste.
Say we add this through Tana Capture:
buy milk #todo
The command will paste that exact text back in with Tana Paste, where ${name} is buy milk #todo and ${sys:content} are any child notes that are present. Using Tana Paste, #todo will be added as a tag.
Note: this creates a new node, so the created date will change, meaning you’ll lose the time that the node was captured through Tana Capture."