Dela via


Mall för strukturerade svar

GÄLLER FÖR: SDK v4

Med strukturerade svarsmallar kan utvecklare definiera en komplex struktur som stöder den omfattande funktionen för språkgenerering (LG), till exempel templating, sammansättning, samtidigt som tolkningen av det strukturerade svaret lämnas till anroparen av LG-biblioteket.

För robotprogram tillhandahålls följande stöd:

Bot Framework-aktivitetsmallen innehåller flera anpassningsbara fält. Följande egenskaper är de vanligaste och kan konfigureras via en definition av aktivitetsmallen:

Property Användningsfall
Text Visa text som används av kanalen för att återge visuellt
Tala Talad text som används av kanalen för att återge hörbart
Bifogade filer Lista över bifogade filer med deras typ. Används av kanaler för att återges som användargränssnittskort eller andra typer av generiska filbilagor.
Föreslagna åtgärder Lista över åtgärder som återges som förslag till användare.
InputHint Styr strömtillståndet för ljudupptagning på enheter som stöder talade indata. Möjliga värden är accepting, expectingeller ignoring.

Det finns inget standardåterställningsbeteende som implementeras av malllösaren. Om en egenskap inte har angetts förblir den ospecificerad. Egenskapen tilldelas till exempel Speak inte automatiskt till Text egenskapen om endast egenskapen Text har angetts.

Definition

Här är definitionen av en strukturerad mall:

# TemplateName
> this is a comment
[Structure-name
    Property1 = <plain text> .or. <plain text with template reference> .or. <expression>
    Property2 = list of values are denoted via '|'. e.g. a | b
> this is a comment about this specific property
    Property3 = Nested structures are achieved through composition
]

Här är ett exempel på en grundläggande textmall:

# AskForAge.prompt
[Activity
    Text = ${GetAge()}
    Speak = ${GetAge()}
]

# GetAge
- how old are you?
- what is your age?

Här är ett exempel på text med en föreslagen åtgärd. Använd | för att ange en lista.

> With '|' you are making attachments a list.
# AskForAge.prompt
[Activity
    Text = ${GetAge()}
    SuggestedActions = 10 | 20 | 30
]

Här är ett exempel på en Hero-kortdefinition :

# HeroCard
[Herocard
    title = Hero Card Example
    subtitle = Microsoft Bot Framework
    text = Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.
    images = https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg
    buttons = Option 1| Option 2| Option 3
]

Kommentar

LG ger viss variabilitet i kortdefinitionen, som konverteras för att överensstämma med SDK-kortdefinitionen. Till exempel stöds både image och images fält i alla kortdefinitioner i LG även om endast images stöds i SDK-kortdefinitionen.

Värdena som definieras i alla fälten image och images i ett HeroCard- eller miniatyrkort kombineras och konverteras till en bildlista i det genererade kortet. För de andra korttyperna tilldelas det senast definierade värdet i mallen till fältet image . De värden som du tilldelar fältet image/images kan vara en sträng, ett anpassningsbart uttryck eller en matris i formatet med hjälp av |.

Nedan visas en kombination av tidigare mallar:

# AskForAge.prompt
[Activity
    Text = ${GetAge()}
    Speak = ${GetAge()}
    Attachments = ${HeroCard()}
    SuggestedActions = 10 | 20 | 30
    InputHint = expecting
]

# GetAge
- how old are you?
- what is your age?

# HeroCard
[Herocard
    title = Hero Card Example
    subtitle = Microsoft Bot Framework
    text = Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.
    images = https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg
    buttons = Option 1| Option 2| Option 3
]

Som standard utvärderas alla mallreferenser en gång under utvärderingen av en strukturerad mall.

Returnerar till exempel # AskForAge.prompt samma upplösningstext för både Speak egenskaperna och Text .

# AskForAge.prompt
[Activity
    Text = ${GetAge()}
    Speak = ${GetAge()}
]

# GetAge
- how old are you?
- what is your age?

Du kan använda <TemplateName>!() för att begära en ny utvärdering av varje referens i en strukturerad mall.

I exemplet nedan Speak och Text kan ha olika upplösningstext eftersom GetAge utvärderas på nytt för varje instans.

[Activity
    Text = ${GetAge()}
    Speak = ${GetAge!()}
]

# GetAge
- how old are you?
- what is your age?

Så här visar du en karusell med kort:

# AskForAge.prompt
[Activity
> Defaults to carousel layout in case of list of cards
    Attachments = ${foreach($cardValues, item, HeroCard(item)}
]

# AskForAge.prompt_2
[Activity
> Explicitly specify an attachment layout
    Attachments = ${foreach($cardValues, item, HeroCard(item)}
    AttachmentLayout = list
]

# HeroCard (title, subtitle, text)
[Herocard
    title = ${title}
    subtitle = ${subtitle}
    text = ${text}
    images = https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg
    buttons = Option 1| Option 2| Option 3
]

Använd \ som escape-tecken.

> You can use '\' as an escape character
> \${GetAge()} would not be evaluated as expression, would be parsed as '${getAge()}' string
# AskForAge.prompt
[Activity
        Text = \${GetAge()}
        SuggestedActions = 10 \| cards | 20 \| cards
]

Strukturerad mallsammansättning

Följande sammansättningsbeteende stöds med strukturerade mallar:

  • Sammansättning är strukturkontextmedveten. Om målmallen som refereras också är en strukturerad mall måste strukturtypen matcha. Till exempel kan en ActivityTemplate refereras till i en annan ActivityTemplate.
  • Referenser till en mall för enkla eller villkorsstyrda svar kan finnas var som helst i en strukturerad mall.

Anta att du har följande mall:

# T1
[Activity
    Text = ${T2()}
    Speak = foo bar ${T3().speak}
]

# T2
- This is awesome

# T3
[Activity
    Speak = I can also speak!
]

Ett anrop till evaluateTemplate('T1') skulle resultera i följande interna struktur:

[Activity
    Text = This is awesome
    Speak = I can also speak!
]

Fullständig referens till en annan strukturerad mall

Du kan inkludera en referens till en annan strukturerad mall som en egenskap i en annan strukturerad mall, eller som referens i en annan enkel eller villkorsstyrd svarsmall

Här är ett exempel på en fullständig referens till en annan strukturerad mall:

# ST1
[MyStruct
    Text = foo
    ${ST2()}
]
# ST2
[MyStruct
    Speak = bar
]

Med det här innehållet resulterar ett anrop till evaluateTemplate('ST1') i följande interna struktur:

[MyStruct
    Text = foo
    Speak = bar
]

När samma egenskap finns i både den anropande mallen och den anropade mallen skriver innehållet i anroparen över allt innehåll i den anropade mallen.

Här är ett exempel:

# ST1
[MyStruct
    Text = foo
    ${ST2()}
]
# ST2
[MyStruct
    Speak = bar
    Text = zoo
]

Med den här kontexten resulterar ett anrop till evaluateTemplate('ST1') i följande interna struktur:

[MyStruct
    Text = foo
    Speak = bar
]

Observera att den här kompositionsstilen bara kan finnas på rotnivå. Om det finns en referens till en annan strukturerad mall i en egenskap är lösningen kontextuell för den egenskapen.

Referens för extern fil i en strukturerad bifogad fil

Det finns två fördefinierade funktioner som används för att referera till filer externt

  1. fromFile(fileAbsoluteOrRelativePath) läser in en angiven fil. Innehåll som returneras av den här funktionen stöder utvärdering av innehåll. Mallreferenser, egenskaper och uttryck utvärderas.
  2. ActivityAttachment(content, contentType)contentType anger om den inte redan har angetts i innehållet.

Med dessa två fördefinierade funktioner kan du hämta allt externt definierat innehåll, inklusive alla korttyper. Använd följande strukturerade LG för att skapa en aktivitet:

# AdaptiveCard
[Activity
                Attachments = ${ActivityAttachment(json(fromFile('../../card.json')), 'adaptiveCard')}
]

# HeroCard
[Activity
                Attachments = ${ActivityAttachment(json(fromFile('../../card.json')), 'heroCard')}
]

Du kan också använda bifogade filer som visas nedan:

# AdaptiveCard
[Attachment
    contenttype = adaptivecard
    content = ${json(fromFile('../../card.json'))}
]

# HeroCard
[Attachment
    contenttype = herocard
    content = ${json(fromFile('../../card.json'))}
]

Ytterligare Information