[बॉटफ़्रामवर्क]: वाटरफ़ॉल डायलॉग में C#वेब चैट बॉट में दिए गए एडेप्टिव कार्ड के माध्यम से सबमिट किए गए मानों को कैसे कैप्चर/एक्सट्रैक्ट करें?



botframework bots (1)

मेरे पास SDK 4 का उपयोग करके C # में चैटबॉट बनाया गया है, जिसमें कई डायलॉग के प्रत्येक डायलॉग को एक और कॉल किया गया है, एक डायलॉग में मैं STEP # 1 में एडेप्टिव कार्ड दे रहा हूं, जिसमें केवल 2 इनपुट दिए जा रहे हैं ओके बटन: 1. डेट 2. टाइम 3। ओके बटन ताकि मैं एसटीईपी # 2 में ओके बटन के माध्यम से जमा किए गए मानों को अर्क / कैप्चर कर सकूं और प्रक्रिया जारी रख सकूं।

समस्या: चरण # 1 में चरण 1 में दिए गए मानों को C # में एक जलप्रपात संवाद में कैसे निकाला जाए?

भाषा: सी #

बीओटी एसडीके: वी 4

कृपया मदद करें क्योंकि मैं बीओटी के लिए नया हूं और स्टेप गाइड द्वारा चरण प्रदान करके कोडिंग कर रहा हूं?

मैंने पहले से ही कुछ चीजें आजमाई हैं: 1. प्रांप्ट में दिए गए कार्ड को डालना 2. के माध्यम से मूल्य निकालने / कैप्चर करने का प्रयास करें: stepContext.Context.Activity.Value

इससे सभी को कोई फायदा नहीं हुआ।

STEP # 1: var cardAttachment = CreateAdaptiveCardAttachment(this.cards); var reply = stepContext.Context.Activity.CreateReply(); reply.Attachments = new List<Attachment>() { cardAttachment }; return await stepContext.Context.SendActivityAsync(reply); // या return await stepContext.PromptAsync("datetextPrompt", new PromptOptions() { Prompt = reply, });

STEP # 2: मैं मूल्य निकालना या कैप्चर करना चाहता हूँ? यह कैसे करना है?


झरना संवादों के साथ अनुकूली कार्ड का उपयोग करना

मूल रूप से, अनुकूली कार्ड प्रॉम्प्ट की तरह काम नहीं करते हैं। एक संकेत के साथ, संकेत प्रदर्शित होने से पहले उपयोगकर्ता इनपुट की प्रतीक्षा करेगा और प्रतीक्षा करेगा। लेकिन एडेप्टिव कार्ड्स के साथ (भले ही इसमें एक इनपुट बॉक्स और एक सबमिट बटन हो), एडेप्टिव कार्ड में कोई कोड नहीं होता है, जो डायलॉग जारी रखने से पहले उपयोगकर्ता इनपुट के लिए प्रतीक्षा करने के लिए वाटरफॉल डायलॉग का कारण होगा।

इसलिए, यदि आप एक ऐसे एडेप्टिव कार्ड का उपयोग कर रहे हैं जो उपयोगकर्ता इनपुट लेता है, तो आप आम तौर पर वाटरफॉल डायलॉग के संदर्भ में उपयोगकर्ता के सबमर्स को संभालना चाहते हैं।

यह कहा जा रहा है, यदि आप एक वाटरफॉल डायलॉग के हिस्से के रूप में एक एडेप्टिव कार्ड का उपयोग करना चाहते हैं, तो वर्कअराउंड है। मूल रूप से, आप:

  1. एडेप्टिव कार्ड प्रदर्शित करें
  2. एक पाठ संकेत प्रदर्शित करें
  3. उपयोगकर्ता के एडेप्टिव कार्ड इनपुट को टेक्स्ट प्रॉम्प्ट के इनपुट में बदलें

आपके झरने के संवाद वर्ग (चरण 1 और 2) में:

    private async Task<DialogTurnResult> DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        // Display the Adaptive Card
        var cardPath = Path.Combine(".", "AdaptiveCard.json");
        var cardJson = File.ReadAllText(cardPath);
        var cardAttachment = new Attachment()
        {
            ContentType = "application/vnd.microsoft.card.adaptive",
            Content = JsonConvert.DeserializeObject(cardJson),
        };
        var message = MessageFactory.Text("");
        message.Attachments = new List<Attachment>() { cardAttachment };
        await stepContext.Context.SendActivityAsync(message, cancellationToken);

        // Create the text prompt
        var opts = new PromptOptions
        {
            Prompt = new Activity
            {
                Type = ActivityTypes.Message,
                Text = "waiting for user input...", // You can comment this out if you don't want to display any text. Still works.
            }
        };

        // Display a Text Prompt and wait for input
        return await stepContext.PromptAsync(nameof(TextPrompt), opts);
    }

    private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        // Do something with step.result
        // Adaptive Card submissions are objects, so you likely need to JObject.Parse(step.result)
        await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}");
        return await stepContext.NextAsync();
    }

आपके मुख्य बॉट क्लास में ( <your-bot>.cs ), OnTurnAsync() तहत, विधि की शुरुआत के पास, कहीं से भी await dialogContext.ContinueDialogAsync(cancellationToken) कहा जाता है (चरण 3):

var activity = turnContext.Activity;

if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
    activity.Text = JsonConvert.SerializeObject(activity.Value);
}

अतिरिक्त संदर्भ

अनुकूली कार्ड नियमित उपयोगकर्ता पाठ की तुलना में अपने जमा परिणाम को थोड़ा अलग भेजते हैं। जब कोई उपयोगकर्ता चैट में टाइप करता है और एक सामान्य संदेश भेजता है, तो यह Context.Activity.Text में समाप्त होता है। जब कोई उपयोगकर्ता किसी एडेप्टिव कार्ड पर इनपुट भरता है, तो यह Context.Activity.Value में समाप्त हो जाता है, जो एक ऐसी वस्तु है जहां आपके कार्ड में मुख्य नाम id होते हैं और एडेप्टिव कार्ड में मान फ़ील्ड मान होते हैं।

उदाहरण के लिए, जसन:

{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "text": "Test Adaptive Card"
        },
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "Text:"
                        }
                    ],
                    "width": 20
                },
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "Input.Text",
                            "id": "userText",
                            "placeholder": "Enter Some Text"
                        }
                    ],
                    "width": 80
                }
            ]
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "Submit"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.0"
}

.. एक कार्ड बनाता है जो दिखता है:

यदि कोई उपयोगकर्ता टेक्स्ट बॉक्स में "टेस्टिंग टेस्टिंग 123" में प्रवेश करता है और सबमिट करता है, तो Context.Activity कुछ इस तरह दिखाई देगी:

{ type: 'message',
  value: { userText: 'Testing Testing 123' },
  from: { id: 'xxxxxxxx-05d4-478a-9daa-9b18c79bb66b', name: 'User' },
  locale: '',
  channelData: { postback: true },
  channelId: 'emulator',
  conversation: { id: 'xxxxxxxx-182b-11e9-be61-091ac0e3a4ac|livechat' },
  id: 'xxxxxxxx-182b-11e9-ad8e-63b45e3ebfa7',
  localTimestamp: 2019-01-14T18:39:21.000Z,
  recipient: { id: '1', name: 'Bot', role: 'bot' },
  timestamp: 2019-01-14T18:39:21.773Z,
  serviceUrl: 'http://localhost:58453' }

उपयोगकर्ता सबमिशन Context.Activity.Value.userText में देखा जा सकता है।

ध्यान दें कि अनुकूली कार्ड प्रस्तुतियाँ एक पोस्टबैक के रूप में भेजी जाती हैं, जिसका अर्थ है कि प्रस्तुत डेटा बातचीत विंडो में बातचीत के हिस्से के रूप में प्रकट नहीं होता है - यह एडेप्टिव कार्ड पर रहता है।





chatbot