2017-03-21 24 views
0

Ich bin zurück mit mehr Fragen. Ich verwende Unity 5.5.1f1 und Watson Developer Cloud Unity SDK v0.13.0. Und anstatt Widgets zu verwenden, verwende ich die Skripte innerhalb von Watson/Examples/ServiceExamples/Scripts, sie funktionierten ziemlich gut und ich konnte den Konversationsdienst in Gang bringen. Ich erkannte jedoch bald, dass ich mit diesem Setup scheinbar keine Kindknoten erreichen kann. Bitte schauen Sie sich das Gespräch Editor Screenshot unten:IBM WATSON Unity SDK kann untergeordneten Knoten nicht erreichen

conversation editor Wenn ich dieses Gespräch Online-Test, wird es wie folgt ausfallen:

Watson: Hello, welcome to the paradise! 
Me: Can you turn off the music please. 
Watson: Ok, let's turn off something, you can say music, ac, and lights. 
Me: music 
Watson: ok, turn the music off. [child node] 

Allerdings, wenn ich dies durch Unity tun, wird es:

Watson: Hello, welcome to the paradise! 
Me: Can you turn off the music please. 
Watson: Ok, let's turn off something, you can say music, ac, and lights. 
Me: music 
Watson: say what? [anything_else node] 

Es scheint, dass die Konversation nur auf den übergeordneten Knoten verbleibt und den untergeordneten Knoten überhaupt nicht erreicht. Oder möglicherweise jede Nachricht an den Server den Dienst zurückgesetzt? Bitte helfen Sie !!

am besten,

+0

eine ähnliche Frage gefunden, http://stackoverflow.com/questions/42180038/slack-app-watson-watson-looses-intent-from-previous-message-received?rq=1 – Ghettokon

+0

„Ich habe ein einfacher Code, der den vorhandenen Kontext nach Slacks user_id gruppiert Wenn bereits ein Kontext für diese user_id existiert, ruft meine App Watson API auf und hängt diesen Kontext an die Anfrage an, damit Watson weiß, dass die Eingabe dieses neuen Benutzers einer vorherigen folgt ein." Wie erkennen wir das tatsächlich in C# Unity? – Ghettokon

Antwort

1

Um die untergeordneten Knoten Sie den Kontext in der Anfrage übergeben müssen zu erreichen. In der Antwort wird eine context Eigenschaft sein, die Sie an die nächste Anfrage weitergeben können.

Conversation m_Conversation = new Conversation(); 

private void SendInitalMessage(string input) 
{ 
    if (string.IsNullOrEmpty(input)) 
    throw new ArgumentNullException("input"); 

    // Send inital message to the service 
    m_Conversation.Message(OnInitalMessage, <workspace-id>, input); 
} 



private void OnInitalMessage(MessageResponse resp, string customData) 
{ 
    if (resp != null) 
    { 
     // Check response here 

     // Create a message request object with the context 
     MessageRequest messageRequest = new MessageRequest(); 
     messageRequest.InputText = <input-text>; 
     messageRequest.alternate_intents = true; 
     messageRequest.ContextData = resp.context; // Context of the conversation 

     // Send the second message 
     SendFollowupMessage(messageRequest); 
    } 
    else 
    { 
     Debug.Log("Message Only: Failed to invoke Message();"); 
    } 
} 


private void SendFollowupMessage(MessageRequest messageRequest) 
{ 
    if (messageRequest == null) 
     throw new ArgumentNullException("messageRequest"); 

    m_Conversation.Message(OnFollowupMessage, <workspace-id>, messageRequest); 
} 


private void OnFollowupMessage(MessageResponse resp, string customData) 
{ 
    if (resp != null) 
    { 
     // Check response here 
    } 
    else 
    { 
     Debug.Log("Full Request: Failed to invoke Message();"); 
    } 
} 

Das Kontextobjekt enthält die ConversationId und andere Daten für den Dienst, um zu verfolgen, wo in dem Gespräch der Benutzer.

"context": { 
    "conversation_id": "<conversation-id>", 
    "system": { 
     "dialog_stack": [ 
      { 
       "dialog_node": "<dialog-node>" 
      } 
     ], 
     "dialog_turn_counter": <turn-counter>, 
     "dialog_request_counter": <request-counter>, 
     "branch_exited": <branch-exited>, 
     "branch_exited_reason": "<exited-reason>" 
    }, 
    "defaultCounter": <default-counter> 
} 

EDIT: Das Datenmodell scheint aktualisiert zu haben. resp.context.system.dialog_stack sollte kein Array von Strings sein. Es sollte ein Array von RuntimeDialogStack-Objekten sein.

[fsObject] 
SystemResponse 
{ 
    public RuntimeDialogStack[] dialog_stack {get;set;} 
    public int dialog_turn_counter {get;set;} 
    public int dialog_request_counter {get;set;} 
} 

[fsObject] 
public class RuntimeDialogStack 
{ 
    public string dialog_node {get;set;} 
    public bool invoked_subdialog {get;set;} 
} 

EDIT 2: Sieht so aus, als ob ich mit nicht übereinstimmenden Versionsstrings getestet habe. Bitte versuchen Sie dieses Datenmodell und stellen Sie sicher, dass das Versionsparam 2017-02-03 im VisualRecognition-Datenmodell ist.

[fsObject] 
SystemResponse 
{ 
    public DialogNode[] dialog_stack {get;set;} 
    public int dialog_turn_counter {get;set;} 
    public int dialog_request_counter {get;set;} 
} 

[fsObject] 
DialogNode 
{ 
    public string dialog_node {get;set;} 
    public bool invoked_subdialog {get;set;} 
} 
+0

Hi @taj, realisierte ich und habe das genau gemacht, aber es funktioniert immer noch nicht, also habe ich ein bisschen Debugging gemacht und irgendwie herausgefunden, dass mein resp.context.system.dialog_stack immer leer ist (Length = 0). Ich habe auch den gleichen Arbeitsplatz mit dem TJbot-Code auf meinem respberry-Pi ausprobiert, es funktioniert so, wie ich es sollte, also nahm ich das dialog_stack-Array von dort und schrieb es manuell in dialog_stack, bevor es messageRequest 'resp.context.system.dialog_stack = new zugewiesen wurde string [] {"node_4_1489256441002"}; 'Es funktioniert auf diese Weise perfekt. Also habe ich etwas falsches mit dem dialog_stack in Unity angenommen !? – Ghettokon

+0

@ Ghettokon Das Datenmodell wurde anscheinend aktualisiert. Ich habe die Antwort aktualisiert - bitte geben Sie eine Chance. – taj

+0

I Debug.Log dialog_stack, es erscheint in der Konsole als 'System.String []' ... – Ghettokon

Verwandte Themen