Пользовательские поля с FormBuilder в Microsoft Bot Framework - не работают

Я попробовал это решение: пользовательские поля с FormBuilder в Microsoft Bot Framework

Но не удалось заставить его работать.... Проблема, с которой я столкнулся, заключается в том, что когда я присваиваю значение base.Form =, _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 ответ

Кажется, это действительно ошибка в рамках: https://github.com/Microsoft/BotBuilder/issues/879

Другие вопросы по тегам