Changelog for Furhat SDK

Important note: Currently, the new SDK (> 1.4.0) is not compatible with the old Furhat robots. 0.3.5 is the latest compatible version for the old generation robot. For documentation for the <= 0.3.5 SDK, please see the legacy version of these docs.

Unstable versions


  • Fixed bug where a virtual user created in the web interface would appear in the wrong position
  • Fixed bug where NLU intents and entities would always use the en-US examples despite the input language being set to another language
  • Matthew (Male, en-US) is now the default voice in the Furhat SDK
  • Re-added timeout, endSil and maxSpeech parameters to furhat.listen() and furhat.ask()
  • Added method to raise intents, raise(intent), in addition to the previously existing raise(response, [intent])
  • Improvements for Furhat web interface on iPads and other tablet size devices
  • Improvements to the look and feel of the web interface
  • Other small bug fixes and improvements to the platform


  • Reverting some changes to skills logging features.
  • The SDK now has file where you can decide what log-behavior you want to have for the SDK. You really only need to modify this if you are experiencing some oddity and we ask you for log outputs to help diagnose the problem.


  • Several fixes to the web interface.
  • Attention fix: Furhat not looking down when camera looses an attended user. This is up to the skill developer to handle.
  • Removed unnecessary log outputs from development server and skill.
  • Wizard buttons now have a key attribute that allows you to assign a keyboard-button-press to a button.
  • Wizard buttons now have a visible attribute that allows you to hide specific buttons, likely in combination with the key attribute mentioned above.
  • New method to detect if a user is gazing at (facing) a location, user.gazingAt() : Boolean.

Stable versions


  • Bugfixes:
    • The event SenseSkillGUIConnected, that Skill GUIs require to let the skill know a skill has connected, was re-added after being accidentally removed.
    • Removed the currently broken text-input in dashboard and wizard interface.


  • Bugfixes in various areas, notably in speech input where several improvements have been done.
  • New page added to the web interface for Wizarding Furhat skills - with more space and assignable sections for wizard buttons.
Skill creation and runtime:
  • The SDK is now started with a standalone script instead of using the previous gradle script, allowing a much faster startup, see getting started.
  • The skills page of the web interface has been removed and skill creation moved to a command-line tool that also has a command for packaging skills so that they can be uploaded to the robot building and creating skills.
  • Skills now run as binaries on robots, allowing a much faster startup. As part of this, on-robot compilation of skills has been removed.
  • Credentials for Amazon Web Services and Google Cloud are now not longer needed for 3rd party developers but instead these functions come bundled with the SDK.
NLU improvements:
  • Pre-loading and re-loading of intents, for faster and more dynamic natural language understanding, see NLU docs.
  • Support for lists of intents for handling several intents in the same way, see in NLU docs.
  • Multi-intent classification, allowing you to catch two intents in one, for example "hi there, I want to order a burger". See in Listening docs.
  • Complex Enum entities now supports wildcards, allowing you to catch patterns like "remind @who to @what". See in NLU docs.
  • Added Wikidata NLU entities that allow lookup of rich and deep entities for chit-chat purposes. See in NLU docs.
  • Changed Grammar entity syntax to be more compact. See in NLU docs.
Flow improvements:
  • Added snippets - a conversational building block that can be used together with the normal state machine to build chit-chat type skills or enrich your existing task-oriented skills with chit-chat. See Snippets.
  • Support for raising responses and optionally attaching a new intent. See how this allows you to pass the response object around in Flow docs and how this can be used to, similar to lists of intents as mentioned above, group functionality for several types of intents - in NLU docs.
  • The syntax has changed for Utterances used in ask. Previously you could do furhat.ask({ +"A text to be spoken" }) but we have now moved the utterance builder last so that you can do a more Kotlinesque furhat.ask { +"A text to be spoken" } without the parentheses. A similar change for furhat.say will be implemented in the next release.
  • Added partial states and the possibility to include these into your states, as a flexible way of reusing triggers without using inheritance. More info, see Flow docs.
  • Dialog logger functionality added, allowing you to log robot and user utterances, matched intents and audio of user-speech. The logging can be done locally or to the cloud. See Logging docs.
  • Flow logger added, allowing you to log state transitions and triggers to trouble-shoot complex flows. See Logging docs.

Legacy versions


  • Bugfix for issue related to Amazon Polly voices.


  • Introduction of an Utterance object that can be used instead of a string in furhat.say() and furhat.ask(). An Utterance allows for behaviors (such as gestures) in the middle of the text, audio playback, and randomized parts. Read more
  • Voice ssml functionality callable from within flow without hard-coding ssml for different providers. Read more
  • Introduction of automatic behavior (microexpressions- blinking, facial movements, eye movements) configuration . Read more
  • Hierarchy of Gestures to resolve conflicting gestures (for example CloseEyes and Blink conflicting) as well as persistent gestures. Read more
  • Hosted GUI's can now have a static port defined in skill.
  • SkillGUI removed in favor of HostedGUI and RemoteGUI. Read more
  • Bugfixes


  • Fixes to hosted GUI's running deployed on robot that previously was using the wrong broker address.


  • Fixes to remote GUI default hostname.
  • Important bugfixes.


  • Fixed bug related to stemming for Intents when using input languages other than Swedish, German, and English.


  • New trigger: onTime for executing timed actions. See onTime docs.
  • Delay method delay() is now correctly accepting events while waiting. See Delay docs
  • The FlowEvent class has been deprecated. Instead, use the Event class.
  • Added convenient method to create events. See Raising and sending events
  • Anonymous called states added for convenient wrapping of blocking methods (for example API-calls). See Calling anonymous states
  • Important: To prevent undesired side-effects, from now on, triggers in caller state will cancel execution in called states. To avoid this, you must add the parameter instant=true to the trigger. Such triggers are not allowed to call other states. In most cases, you will not have to change much in your old skills. See Flow docs for further information.
  • furhat.glance, furhat.attend, and furhat.gesture are now all per default called asynchronously.

Required changes:

  • In Interaction state, add (instant=true) to onUserEnter and onUserLeave triggers. i.e. onUserLeave(instant = true) due to the above change.
  • In Interaction state, change glance(it, 1) to glance(it) since 1 implies 1 millisecond which was an error in the skill template.
  • Change FlowEvent to Event in your flows.


  • The "Roll" parameter in the face settings menu has adjusted it's scale changed from being -0.3 - 0.3, to now being -1.0-1.0


Required change (A) : New Skill loading system. Skills will no longer be loaded from furhatSkills.gradle .

  • For SDK users, please remove your furhatSkills.gradle file and reimport skills either via the interface or by adding the absolute path to the skills in skillLocations.txt. Skills should be newline separated.
  • For Robots, please export your skills before updating, then delete the skills from the skills list, do the update and then reimport your Skills.

Required change (B) : Skills now have to define their furhat-commons version explicitly in their build.gradle file. To always use the latest version of furhat-commons use "+" instead of a number. Here is an example build.gradle file .

buildscript {
    repositories {
        maven { url "" }

    dependencies {
        classpath 'com.furhatrobotics.furhatos:skill-configuration:+'

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.2.30"

apply plugin: 'com.furhatrobotics.skill-configuration'

repositories {
    maven { url "" }

dependencies {
    compile 'com.furhatrobotics.furhatos:furhat-commons:0.2.8'

Required change (C) : Intents that use examples need to update their getExamples(lang: Language?) method to using Language instead of Language?.

  • Added support for dynamic intents through the classes SimpleIntent and DynamicIntent, see NLU docs.
  • Fixed issue with importing skills and skills causing issues with SDK when using different furhat-commons versions.
  • Robots created with this will be able to start without an internet connection.
  • Random blocks now consistently working as intended.
  • Fixed bug loading Color enum, and general bug for using enums with onResponse.
  • States that are called will show their buttons on the web interface alongside buttons from the state that called them.
  • Added a reference to UserManager in Furhat.
  • Console is now showing errors and logs from the System and Skill.
  • Cereproc gesture tags now work as part of other text.
  • Classes implementing the interface TextGenerator should no longer implement fromPattern(), use generate() instead
  • Updated NLU engine. Contact us if your NLU examples now cause odd behaviour.


  • Internal builds for testing


  • SDK's will now update to the latest version when first installed.
  • FurhatActionWrapper renamed to FurhatAPI: intended use is outside of the flow.
  • FurhatFlowWrapper renamed to Furhat: intended to be used inside the flow. Extend methods to this class when you need reusable methods inside the flow (see docs on this here).
  • Sample Welsh text updated, from native speakers feedback.


  • Improved template for skills containing boilerplate situation management (handling users entering and leaving). New skills will use this template. See skill files.


  • Default voice is now Brian, a British voice from Amazon Polly
  • Automatically set the microphone when first starting up the SDK to the default OS microphone.
  • No longer able to adjust furhat's gaze when clicking on the gaze panel. Should make it easier to add virtual users without accidentally moving furhat's gaze.
  • Now "stemming" enum entities by default. Adding the word "apple" will by default also handle cases like "apples".


  • BugFix: SkillGUIs now able correctly using templates


  • Bugfix: furhat now continously attends users
  • Bugfix: New Linux and Windows virtual furhats, fixing issue where some machines can't start the virtual furhat.
  • Bugfix: Linux skills will now appear inside the root folder's skills/ folder
  • Bugfix: All textures use the same configuration file, no more needing to manually save all textures to the same configuration.


  • Bugfix: Texture change is now enabled on Mac devices.
  • Moved the file containing the google ASR credentials (google_credentials.json) to the properties folder.

Required change: move your google_credentials.json into properties/ or re-enter it in the web interface.

  • Added several methods to furhat: furhat.stopSpeaking(), furhat.stopListening(), and furhat.isSpeaking, furhat.isListening.
  • Performance fix: New virtual furhat builds that use less memory. Now running at 30 fps. If you experience lag, you may have an improved experience by reducing the window size.
  • Persona have been removed.

Required change: Use methods like furhat.setTexture(String) and furhat.setVoice(String)


  • Introduced furhat and users top level objects and moved all actions and user management methods as object methods. Remaining top-level methods are all flow-related (i.e transitioning between states etc.).

Required change: Refactor according to actions and users docs, for example change all say() calls to furhat.say() and currentUser to users.current

  • Renamed createdSkills.gradle to furhatSkills.gradle.

Required change: If you had a createdSkills.gradle please rename it to furhatSkills.gradle

  • Renamed skill/ folder to skills/.

Required change: Rename your skill folder and update your furhatSkills.gradle file

  • Properties (*.properties) files now live inside properties/ with the exception of and that should be in the root.

Required change: If you had property files, for example with your amazon credentials, please move them to properties/

  • createPersona() has been removed and a Persona class has been introduced. For usage, see Persona. The previous setPersona() has been moved to the furhat top level class, so you use it with furhat.setPersona(Persona(...))

Required change: Refactor your persona management according to the Persona docs.


  • Bugfixes.