1

I tried this solution: Custom fields with FormBuilder in the Microsoft Bot Framework

But failed to get it working....The problem I encountered is that when I assign the base.Form = value, the _prompt in the _field gets a default recognizer, and it won't get overriden in the next line's SetRecognizer call, that only replaces the _field's recognizer.

However the matching process uses the _prompt's recognizer internally ( ? ).

Here is my code:

public class LuisIntentRecognizer<T> : RecognizePrimitive<T>
 where T : class
{

public LuisIntentRecognizer(IField<T> field, string luisModelID, string    luisSubscriptionKey)
    : base(field)
   {
    _luisModelID = luisModelID;
    _luisSubscriptionKey = luisSubscriptionKey;
    }

public override DescribeAttribute ValueDescription(object value)
{
    return new DescribeAttribute((string)value);
}

public override IEnumerable<string> ValidInputs(object value)
{
    yield return (string)value;
}

public override TermMatch Parse(string input)
{
    TermMatch result = null;
    if (!string.IsNullOrWhiteSpace(input))
    {
        var luisModel = new LuisModelAttribute(_luisModelID, _luisSubscriptionKey);
        var luisService = new LuisService(luisModel);
        var luisResult = luisService.QueryAsync(input).Result; // TODO  refactor somehow to async

        var winner = luisResult.Intents.MaxBy(i => i.Score ?? 0d);
        if (winner != null && !string.IsNullOrEmpty(winner.Intent))
        {
            result = new TermMatch(0, winner.Intent.Length, 0.0, winner.Intent);
        }
        else
        {
            result = new TermMatch(0, input.Length, 0.0, input);
        }
    }

    return result;
}

public override string Help(T state, object defaultValue)
{
    var prompt = new Prompter<T>(_field.Template(TemplateUsage.StringHelp), _field.Form, null);
    var args = HelpArgs(state, defaultValue);
    return prompt.Prompt(state, _field.Name, args.ToArray()).Prompt;
}

private string _luisModelID;
private string _luisSubscriptionKey;
}

 public class LuisIntentField<T> : FieldReflector<T>
  where T : class
{
    public LuisIntentField(string name, string luisModelID, string luisSubscriptionKey,  bool ignoreAnnotations = false)
        : base(name, ignoreAnnotations)
    {
        _luisModelID = luisModelID;
        _luisSubscriptionKey = luisSubscriptionKey;
    }

public override IForm<T> Form
{
    set
    {
        base.Form = value;
        base.SetRecognizer(new LuisIntentRecognizer<T>(this, _luisModelID, _luisSubscriptionKey));                
    }
}

private string _luisModelID;
private string _luisSubscriptionKey;
}

Could anyone get it working? Thanks

Community
  • 1
  • 1
tmszucs
  • 11
  • 1
  • 2

1 Answers1

0

It seems to be a bug in the framework indeed: https://github.com/Microsoft/BotBuilder/issues/879

tmszucs
  • 11
  • 1
  • 2