Microsoft Bot Framework中使用FormBuilder的自定义字段 - 无法正常工作

时间:2016-08-03 13:47:51

标签: botframework

我尝试了这个解决方案:Custom fields with FormBuilder in the Microsoft Bot Framework

但是没能让它工作......我遇到的问题是当我分配base.Form = value时,_field中的_prompt会得到一个默认的识别器,并且它不会被覆盖。下一行的SetRecognizer调用,只替换_field的识别器。

然而,匹配过程在内部使用_prompt识别器(?)。

这是我的代码:

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;
}

有人能让它运转吗? 感谢

1 个答案:

答案 0 :(得分:0)

这确实是框架中的一个错误:https://github.com/Microsoft/BotBuilder/issues/879