2016-08-03 21 views
1

내가이 솔루션을 시도 작동하지 : Custom fields with FormBuilder in the Microsoft Bot Framework사용자 정의 필드 -

을하지만 작업 가져 오지 못했습니다 .... 내가 직면 한 문제는 내가 base.Form = 값을 할당 할 때 _field의 _prompt는 기본 인식기를 가져오고 _field의 인식기 만 바꾸는 다음 줄의 SetRecognizer 호출에서 재정의되지 않습니다.

그러나 일치 프로세스는 _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; 
} 

사람이 작업을 얻을 수 : 여기

내 코드? 감사합니다.

답변