Set Step Redesign

by Zoran Slamkov

We are excited to announce the redesign of the Set Step in Voiceflow! The updated Set Step now includes:

  • Improved Interface: A more intuitive design for easier navigation and configuration.
  • New error messages: We're revamped our error messages for the value input to make it easier to debug.
  • Labels: Option to rename and label individual variable sets for better organization and clarity.
  • Improved canvas visibility: More visibility on your configuration available directly on the step.

Introducing the new Message step

We're excited to announce a significant update coming in July: the introduction of new Message step and CMS and in Webchat projects. This update will unlock the ability to users to have manage all their agent text responses in a central location, re-use the same message across multiple steps in your agent, and add conditions directly to your response variants. As part of this update, we will be automatically migrating all Text steps to the new Message step.


Key Changes

Introduction of Message Steps:
We are introducing a new type of step called Message along with a new Messages CMS page in webchat projects to manage all your agent text messages. All webchat and voice projects will contain a new property called responseMessages that will replace existing responseVariants.

Automatic Conversion:
All existing Text steps will be automatically converted into Message steps when a project is opened in-app. This migration ensures that all existing functionalities are preserved while providing the benefits of the new system.


Technical Overview

The new Message step structure is outlined below:

Webchat Projects - Properties Affected:

  • Fields Added: responseMessages
  • Fields Modified: response now has a new field called type
  • Fields Removed: responseVariants, responseAttachments, and nodes with type text

Voice Projects - Properties Affected:

  • Fields Added: responseMessages
  • Fields Modified: response now has a new field called type
  • Fields Removed: responseVariants and responseAttachments

Additional Notes:

  • On webchat projects, all text steps are now messages. Text steps will have a few new features, and all text data will no longer be stored in the node itself but in a new field called response/responseMessages.
  • On both webchat and voice projects, requiredEntities re-prompts will be attached to response/messages instead of response/variants (variants will be sunset as well).

Example of Message Node Definition

{
  "type": "message",
  "data": {
    "name": "",
    "draft": false,
    "portsV2": {
      "byKey": {
        "next": {
          "type": "next",
          "target": null,
          "id": "unique-port-id"
        }
      },
      "builtIn": {},
      "dynamic": []
    },
    "messageID": "unique-message-id"
  },
  "nodeID": "unique-node-id"
}

Updated Response Structure

{
  "responses": [
    {
      "id": "unique-response-id",
      "name": "Required entity reprompt",
      "createdByID": 22,
      "folderID": null,
      "type": "message",
      "draft": false,
      "createdAt": "2024-07-03T02:29:25.000Z",
      "updatedAt": "2024-07-03T02:29:25.000Z",
      "updatedByID": 22
    }
  ],
  "responseMessages": [
    {
      "id": "unique-message-id-1",
      "discriminatorID": "unique-discriminator-id-1",
      "text": [
        {
          "text": [
            "my reprompt"
          ]
        }
      ],
      "condition": null,
      "delay": null,
      "createdAt": "2024-07-03T01:30:53.000Z"
    },
    {
      "id": "unique-message-id-2",
      "discriminatorID": "unique-discriminator-id-2",
      "text": [
        {
          "text": [""]
        }
      ],
      "condition": {
        "type": "expression",
        "assertions": [...]
      },
      "delay": 10000,
      "createdAt": "2024-07-03T01:19:22.000Z"
    }
  ],
  "responseDiscriminators": [
    {
      "id": "unique-discriminator-id-1",
      "channel": "default",
      "language": "en-us",
      "responseID": "unique-response-id",
      "variantOrder": [
        "unique-variant-id"
      ],
      "createdAt": "2024-07-03T02:29:25.000Z"
    }
  ]
}

Migration Example

To illustrate how the migration transforms Text nodes into Message nodes, here are examples before and after the migration:

Webchat Example

Before Migration:

{
  "type": "text",
  "data": {
    "name": "Text",
    "texts": [
      {
        "id": "text-id-1",
        "content": [{ "children": [{ "text": "My root message " }] }],
        "messageDelayMilliseconds": 10000
      },
      {
        "id": "text-id-2",
        "content": [{ "children": [{ "text": "My first variant" }] }]
      }
    ],
    "canvasVisibility": "preview",
    "portsV2": {
      "byKey": {},
      "builtIn": {
        "next": {
          "type": "next",
          "target": null,
          "id": "unique-port-id"
        }
      },
      "dynamic": []
    }
  },
  "nodeID": "unique-node-id"
}

After Migration:

{
  "type": "message",
  "data": {
    "name": "",
    "draft": false,
    "portsV2": {
      "byKey": {
        "next": {
          "type": "next",
          "target": null,
          "id": "unique-port-id"
        }
      },
      "builtIn": {},
      "dynamic": []
    },
    "messageID": "unique-message-id"
  },
  "nodeID": "unique-node-id"
}
  1. All text data will be saved into responses (responses/discriminator/messages) instead of node data. In message node data, there will only be messageID which references response.id.
  2. repromptID in required entities is a reference to response.id, and its text data is now saved under responseMessages instead of responseVariants.
  3. draft in the message node data means that your message step has no content and will not display the response on the CMS until you have content, so draft is false.

Voice Example

Before Migration

{
	...
  "requiredEntities": [
    {
      "id": "6684b7854986c834e67ee772",
      "entityID": "6642a6fee94258e65e603fdd",
      "intentID": "6642aa05e94258e65e603fe0",
      "repromptID": "6684b7854986c834e67ee76f",
      "createdAt": "2024-07-03T02:29:25.000Z"
    }
  ],
  "responses": [
    {
      "id": "6684b7854986c834e67ee76f",
      "name": "Required entity reprompt",
      "createdByID": 22,
      "folderID": null,
      "type": "message",
      "draft": false,
      "createdAt": "2024-07-03T02:29:25.000Z",
      "updatedAt": "2024-07-03T02:29:25.000Z",
      "updatedByID": 22
    }
  ],
  "responseDiscriminators": [
    {
      "id": "6684b7854986c834e67ee770",
      "channel": "default",
      "language": "en-us",
      "responseID": "6684b7854986c834e67ee76f",
      "variantOrder": [
        "6684b7854986c834e67ee771"
      ],
      "createdAt": "2024-07-03T02:29:25.000Z"
    }
  ],
  "responseVariants": [
    {
      "id": "6684b7854986c834e67ee771",
      "conditionID": null,
      "discriminatorID": "6684b7854986c834e67ee770",
      "attachmentOrder": [],
      "text": [
        {
          "text": [
            "my reprompt"
          ]
        }
      ],
      "speed": null,
      "cardLayout": "carousel",
      "createdAt": "2024-07-03T02:29:25.000Z",
      "type": "text"
    }
  ],
  "responseAttachments": [...],
}

After Migration

{
	...
  "requiredEntities": [
    {
      "id": "6684b7854986c834e67ee772",
      "entityID": "6642a6fee94258e65e603fdd",
      "intentID": "6642aa05e94258e65e603fe0",
      "repromptID": "6684b7854986c834e67ee76f",
      "createdAt": "2024-07-03T02:29:25.000Z"
    }
  ],
  "responses": [
    {
      "id": "6684b7854986c834e67ee76f",
      "name": "Required entity reprompt",
      "createdByID": 22,
      "folderID": null,
      "type": "message",
      "draft": false,
      "createdAt": "2024-07-03T02:29:25.000Z",
      "updatedAt": "2024-07-03T02:29:25.000Z",
      "updatedByID": 22
    }
  ],
  "responseMessages": [
    {
      "id": "6684a9cc3ad70f045227d820",
      "discriminatorID": "6684a9cc3ad70f045227d81f",
      "text": [
        {
          "text": [
            "my reprompt"
          ]
        }
      ],
      "condition": null,
      "delay": null,
      "createdAt": "2024-07-03T01:30:53.000Z"
    },
     {
      "id": "6684a71a3ad70f045227d810",
      "discriminatorID": "6684a7173ad70f045227d807",
      "text": [
        {
          "text": [
            ""
          ]
        }
      ],
      "condition": {
	      "type": "expression",
	      "assertions": [...]
      },
      "delay": 10000,
      "createdAt": "2024-07-03T01:19:22.000Z"
    },
  ],
  "responseDiscriminators": [
    {
      "id": "6684a9cc3ad70f045227d81f",
      "channel": "default",
      "language": "en-us",
      "responseID": "6684b7854986c834e67ee76f",
      "variantOrder": [
        "6684b7854986c834e67ee771"
      ],
      "createdAt": "2024-07-03T02:29:25.000Z"
    }
  ],
}
  1. repromptID in required entities is a reference to response.id, and its text data is now saved under responseMessages instead of responseVariants.
  2. draft in the message node data means that your message step has no content and will not display the response on the CMS until you have content, so draft is false.

Next Steps

As we approach the completion date of this project, we will announce the exact release date for this migration. We encourage all users who rely on the Voiceflow project export file to familiarize themselves with these changes to leverage the improved functionality and design flexibility in their agents. As always, our support team is available to assist with any questions or issues related to this migration.

We are excited to announce a powerful new feature in Voiceflow's Knowledge Base: the ability to handle tabular data, enrich all data sources with metadata, and perform advanced query filtering. This enhancement provides our users with more flexibility, precision, and control over their AI agents, ensuring they deliver the most relevant and contextually accurate responses.

Key Features

Tabular Data Support
With the introduction of tabular data support, users can now upload structured data in table format. This is ideal for scenarios where information is best represented in rows and columns, such as product catalogs, inventories, or detailed records. This structured format allows for more organized and efficient data management within your Voiceflow agents.

Metadata Enrichment
Metadata is a critical component for enhancing the context and relevance of your data. You can now attach key-value pairs to all your data sources, providing additional layers of information that can be used to fine-tune your AI agent’s responses. Whether it’s categorizing products, tagging items with specific attributes, or adding detailed descriptions, metadata makes your data more insightful and searchable.

Advanced Query Filtering
Our new query filtering capabilities enable users to perform precise searches within their data using a robust set of operators. You can apply various filters to your data, such as:

  • Equality and Comparison: $eq, $ne, $gt, $gte, $lt, $lte
  • Array Operations: $in, $nin, $all
  • Logical Operators: $and, $or

This means you can now create complex queries to retrieve exactly what you need, whether it’s finding products under a certain price, filtering by multiple tags, or combining multiple conditions.

How to Use

Inserting Metadata to Your Data Sources

Voiceflow supports adding metadata to your data sources through three methods: FILE upload, URL upload, and TABLE upload. Depending on the type of document being uploaded, follow the respective method below:

  1. FILE Upload
curl --request POST \ 
--url 'https://api.voiceflow.com/v1/knowledge-base/docs/upload?overwrite=true' \ 
--header 'Authorization: YOUR_DM_API_KEY' \
--header 'Content-Type: multipart/form-data' \ 
--header 'User-Agent: insomnia/8.0.0' \  
--form 'file=@/path/to/your/file.pdf' \  
--form 'metadata={"inner": {"text": "some test value", "price": 5, "tags": ["t1", "t2", "t3", "t4"]}}'
  1. URL Upload
curl --request POST  
  --url '<https://api.voiceflow.com/v1/knowledge-base/docs/upload>  
  --header 'Authorization: YOUR_DM_API_KEY'  
  --header 'Content-Type: application/json'  
  --data '{  
    "data": {  
        "type": "url",  
        "url": "<https://example.com/">,  
        "metadata": {"test": 5}  
    }  
}'
  1. TABLE Upload
curl --request POST \
  --url 'https://api.voiceflow.com/v1/knowledge-base/docs/upload/table' \
  --header 'Authorization: YOUR_DM_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "data": {
        "name": "products",
        "schema": {
            "searchableFields": ["name", "description"],
            "metadataFields": ["developer", "project"]
        },
        "items": [
            {
                "name": "example_name",
                "description": "example_description",
                "developer": {
                    "name": "Jane Doe",
                    "level": "senior",
                    "skills": ["Python", "JavaScript"],
                    "languages": [
                        {
                            "name": "Russian"
                        },
                        {
                            "name": "German"
                        }
                    ]
                },
                "project": {
                    "name": "AI Development",
                    "deadline": "2024-12-31"
                }
            }
        ]
    }
}'

Practical Query Examples
Here are some practical examples to demonstrate the power of query filtering using the Query API:

  • Match All Specific Tags: Identify chunks that include every specified tag in the list.
{  
    "filters": {  
        "inner.tags": {  
            "$all": ["t1", "t2"]  
        }  
    }  
}
  • Match Any of the Specified Tags: Find chunks containing any of the tags listed.
{  
    "filters": {  
        "inner.tags": {  
            "$in": ["t1", "t2"]  
        }  
    }  
}
  • Exclude Chunks With Certain Tags: Filter out chunks that include any of the tags specified.
{
    "filters": {
        "developer.tags": {
            "$nin": ["t1", "t2"]
        }
    }
}

  • Combination of Conditions: Search for chunks that either contain a specific tag or match a text value exactly.
{
    "filters": {
        "$or": [
            {
                "developer.tags": {
                    "$in": ["t1"]
                }
            },
            {
                "developer.name": {
                    "$eq": "Jane Doe"
                }
            }
        ]
    }
}


Important Update

We have also updated the route for document upload from https://api.voiceflow.com/v3alpha/knowledge-base/docs/upload to https://api.voiceflow.com/v1/knowledge-base/docs/upload. The v3alpha version is still operational, but we recommend moving over to the new URL for improved performance and support.
Stay tuned for more updates and happy agent building!

Today we're introducing the new Triggers step designed to make it easy to add and manage one or many triggers when developing your agent workflows. This update is part of our ongoing effort to help all Voiceflow users develop their agents for scale by default.

Replacing the Intent Step

With the introduction of the Triggers step, we have migrated all the settings from any existing Intent steps into the new format. The new Triggers step offers a more robust and flexible way to handle multiple user intents within a single Workflow, enhancing both the design and functionality of your agents.

Why This Matters

Our goal with these changes is to simplify the design process and support design best practices. By defining each Workflow as a response to a single user intent and allowing for multiple triggers within that framework, we are aiming to:

  • Enhance Clarity: Users will have a better understanding of how to build efficient Workflows that address user intents effectively.
  • Improving Scalability: These best practices will help users build more complex agents that can scale and adapt to new use cases and collaborations.

Key Changes at a Glance

  • Single Entry Point per Workflow: One entry point ensures clarity and simplicity in Workflow design.
    Commands: We are deprecating Commands so they will no longer be an option on new projects.
  • Right-Click to Add Triggers step: Users can still add multiple entry points if necessary, but the default UX encourages a single entry point.
  • Updated Start Chip: Users can add additional triggers directly on the start chip, offering more flexibility in design.
  • The Event section from the step toolbar has been removed as we . There is still an option to add additional triggers to the canvas available through the right-click on canvas menu.

Stay tuned for more information about designing your AI agent for scale taking advantage of the new tools in Voiceflow.

We've made some updates to our share and export options:

  • Simplified Navigation: We have removed the Share button from the CMS to streamline your navigation. You can now find all export, share prototype, or invite members options under the Agent menu.

  • Enhanced Export Functionality: You now have more control over what you export. We've added options to specify the workflow or component you want to export when selecting PNG and PDF formats. This allows for more precise and tailored exports.

GPT-4o is now available for use in AI steps and Knowledge Base. Some benefits of this model include:

Faster responses than GPT-4 Turbo with matched performance for English text and code
Significant improvement for non-English languages
50% cheaper than Turbo
Check it out in the model options menu on AI Steps and the Knowledge Base!

We are thrilled to announce the release of Workflows, our latest system designed to improve the way you organize and manage AI agents. At Voiceflow, our mission is to enable you to build scalable, efficient, and collaborative AI solutions, and Workflows is a significant step forward in achieving that goal.

Watch the Video Walkthrough


Streamlined Organization and Management
Workflows provides a clear and intuitive organization structure, replacing our previous system of domains, topics, and subtopics. All your existing designs have been automatically migrated, ensuring no data is lost while giving you immediate access to new features.

In the new Workflows page within the Agent CMS, you can organize your agents by use case, team, or any structure that suits your needs, using the new folder directory system. This high-level visibility allows you to monitor each workflow's progress without needing to navigate to the canvas. Detailed descriptions, intent triggers, and project management features like status and assignee columns provide comprehensive context at a glance.

Enhanced Collaboration
Collaboration is at the heart of Workflows. You can now assign workflows to team members and set statuses to track progress through the development process. This ensures everyone is on the same page and tasks are clearly defined and managed as you scale the complexity of your AI Agent.

Improved Navigation and Usability
Navigating between workflows has never been easier. You can access the canvas directly from the Workflows table or use the new design navigation that mirrors your CMS structure. We’ve also introduced a "Return to Designer" button, allowing you to jump back to your canvas from any page, making your experience more cohesive and streamlined.

What's Changed
With the release of Workflows, we’ve made some other notable changes to improve design practices and reduce visual clutter:

  • Removed Intent Steps from Components: To promote best practices in agent design, we have removed the ability to add intent steps directly within Components.
  • Cleaner Canvas View: The share button and agent navigation menu have been relocated to the Agent CMS, reducing clutter on the canvas and keeping your focus on designing agent workflows.

Overview of Project Data Structure Changes
As part of our transition to the new Workflows system, we are making modifications to the project data structure within Voiceflow. These changes are designed to enhance functionality, improve navigation, and simplify management. Below is a detailed breakdown of what these changes entail:

  1. New workflows field:

We are introducing a new workflows field in the .vf project data file. This field will encapsulate a variety of properties essential for managing and organizing your agents:

{  
    workflows: [  
        {  
            status: "to_do" | "complete" | "in_progress" | null,  
            id: string,  
            createdAt: string,  
            updatedAt: string,  
            updatedByID: number,  
            name: string,  
            folderID: string | null,  
            createdByID: number,  
            description: string | null,  
            diagramID: string,  
            isStart: boolean,  
            assigneeID: number | null,  
            assistantID?: string | undefined,  
            environmentID?: string | undefined  
        }  
    ];  
}

  1. Node Reference Modifications:
  • Replacing goToDomain Nodes: The existing goToDomain nodes within the diagram.nodes will be replaced with goToNode. The goToNode.nodeID will reference the workflow that corresponds to what the domain’s start step previously pointed to.
  • Updating goToNode References: All goToNode nodes that previously referenced a domain’s start block (with the exception of the root/home domain) will be updated to reference the new workflow steps accordingly.
  • Removal of Start Steps: All start steps, except for those in the root/home diagram, will be removed. This simplification is part of our broader effort to streamline navigation and reduce redundancy within the agent design environment.

Learn More
For detailed instructions and more information, please refer to the [Workflows Feature Documentation](Workflows Feature Documentation).

Your Feedback Matters
We are excited about the possibilities Workflows will unlock for your AI projects and look forward to hearing your feedback. This release marks a new chapter in AI agent management, bringing us closer to our vision of providing the world's best agent creation tool.

Thank you for being part of our journey.