Custom Skills
Extend what Dot can do.
This is a premium feature. Please contact us for access.
Custom skills allows you to teach new things to Dot. It's mostly intended for connecting to external systems. Here are some of the things you might want to do.
Common Use Cases
Workflow automation based on data analysis results from Dot: Create Jira/Linear tickets, update Notion docs, send Slack/email messages with findings from Dot.
Enrich Analysis with Additional Data: Connect data that is not available in your data warehouse, like customer info from a CRM or real-time data from a WMS.
Advanced Analysis Beyond SQL: Run small ML models inside the sandbox, or host them on a server behind an API that Dot can call. This opens up a whole new world of ML and other analysis. For example forecasting important metrics on the fly.
How Custom Skills Work
Custom skills appear as natural extensions of Dot's capabilities. Users simply ask questions in plain language, and Dot automatically:
Identifies when a custom skill is relevant based on the query
Extracts required parameters from the conversation context
Executes the skill and presents results accordingly.
Creating Custom Skills
Admins create and manage skills through the UI.
Navigate to the model page → skill tab (/skills page) and you will find the section to add custom skills.

Here you can define the following:
Name: Name of the custom skill. Be descriptive as it will help Dot use the skill more effectively (e.g., add_issue_to_jira). Limited to alphanumeric characters, underscores, and hyphens (maximum 128 characters).
Description: Explain what the skill does and when to use it—this helps Dot select the appropriate skill for user queries. Be detailed: add all information that a developer would need to use this function. If there are common mistakes that Dot might make when using the skill, mention them here.
Parameters: Define the inputs your function requires. Remember that Dot will decide all these parameters when calling this function. Keep them minimal and simple. If you have static values (API endpoints, hard-coded params), define them as variables.
Types:
str
,number
,bool
,dataframe
. Note that if the type is dataframe, the skill can only be used in Agentic mode.
Code: Your Python function. Parameters are passed as global variables at runtime to this script. Use print(variable) to pass data back to Dot.
Secrets: Encrypted storage for API keys and credentials.
Groups: Control which user groups can access this skill.
Active: Toggle to enable or disable the skill.
Use the Test button to validate your skill with sample data before saving.
Custom Skills in Normal Chat vs Agentic Mode
If any of the input parameters for the custom skill is a dataframe
- the skill can only be used in agentic mode.
What this means in practice is that it is better to reserve complex tools like data prediction or data manipulation tools for the agentic mode.
The key difference: In Deep Analysis mode, Dot can chain multiple operations together, using output from your skill as input for further analysis. Skills become building blocks in a larger analytical workflow.
Technical Architecture
Execution Environment
Isolation: Each execution runs in a Docker container with process-level isolation and resource limitations.
Timeout: 600 seconds maximum per execution
Python Version: 3.12
Available Packages
Pre-installed in the execution environment:
pandas
- Data manipulation and analysisnumpy
- Numerical computingrequests
- HTTP requestsIf you need additional packages, please contact us and we will be happy to assist.
Best Practices
1. Parameter Validation
There is a chance Dot makes a mistake. Try to catch as many errors as possible programmatically. Be defensive and provide good feedback. Validation need not be limited to just types—it can be more complex (e.g., len(df) < 1000, check if combinations of parameters are valid).
# process_data function
# argument: df: pd.DataFrame, threshold: float
# Validate dataframe
if df.empty:
print("Error: Empty dataframe provided")
required_columns = ['amount', 'date', 'category']
missing = [col for col in required_columns if col not in df.columns]
if missing:
print(f"Error: Missing columns: {missing}")
# Validate threshold
if not 0 <= threshold <= 1:
print("Error: Threshold must be between 0 and 1")
2. Result Handling
You can pass back results using the print()
statement.
In agentic mode, you can pass back a dataframe to Dot by doing:
print(dataframe)
— we will automatically handle the logic to convert this into a format that Dot can understand.
Currently we only support print statements with one argument inside (print(a,b) will not work).
Structure your print statements to be clear and easily understandable for Dot. Include only the relevant info and no unnecessary logs.
If something goes wrong during execution, handle it gracefully. Be explicit. Always try to pass back the status of the tool execution (complete/partial/failed). If failed or partial, provide feedback to Dot on what went wrong and how to fix it.
Last updated