Changelog for Furhat SDK

Breaking changes will update the minor version (i.e. 0.0.19 -> 0.1.0 introduced a breaking change).


  • 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.