Bagikan melalui


Templat respons terstruktur

BERLAKU UNTUK: SDK v4

Templat respons terstruktur memungkinkan pengembang menentukan struktur kompleks yang mendukung fungsionalitas ekstensif Pembuatan bahasa (LG), seperti templat, komposisi, sambil meninggalkan interpretasi respons terstruktur hingga pemanggil pustaka LG.

Untuk aplikasi bot, dukungan berikut disediakan:

Templat aktivitas Bot Framework menyertakan beberapa bidang yang dapat disesuaikan. Properti berikut adalah yang paling umum digunakan dan dapat dikonfigurasi melalui definisi templat aktivitas:

Properti Gunakan huruf besar
Teks Tampilkan teks yang digunakan oleh saluran untuk dirender secara visual
Bicara Teks lisan yang digunakan oleh saluran untuk dirender dengan lantang
Lampiran Daftar lampiran dengan jenisnya. Digunakan oleh saluran untuk dirender sebagai kartu UI atau jenis lampiran file generik lainnya.
SuggestedActions Daftar tindakan yang dirender sebagai saran kepada pengguna.
InputHint Mengontrol status aliran pengambilan audio pada perangkat yang mendukung input lisan. Nilai yang mungkin termasuk accepting, expecting, atau ignoring.

Tidak ada perilaku fallback default yang diterapkan oleh pemecah masalah templat. Jika properti tidak ditentukan, properti tetap tidak ditentukan. Misalnya, Speak properti tidak secara otomatis ditetapkan menjadi Text properti jika hanya properti yang Text ditentukan.

Devinisi

Berikut definisi templat terstruktur:

# 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
]

Berikut adalah contoh templat teks dasar:

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

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

Berikut adalah contoh teks dengan tindakan yang disarankan. Gunakan | untuk menunjukkan daftar.

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

Berikut adalah contoh definisi kartu Hero:

# 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
]

Catatan

LG menyediakan beberapa varianabilitas dalam definisi kartu, yang dikonversi agar selaras dengan definisi kartu SDK. Misalnya, bidang image dan images didukung dalam semua definisi kartu di LG meskipun hanya images didukung dalam definisi kartu SDK.

Nilai yang ditentukan dalam semua image bidang dan images dalam Kartu Hero atau kartu gambar mini digabungkan dan dikonversi ke daftar gambar dalam kartu yang dihasilkan. Untuk jenis kartu lainnya, nilai terakhir yang ditentukan dalam templat akan ditetapkan ke image bidang . Nilai yang Anda tetapkan ke image/images bidang bisa berupa string, ekspresi adaptif, atau array dalam format menggunakan |.

Di bawah ini adalah kombinasi templat sebelumnya:

# 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
]

Secara default, referensi templat apa pun dievaluasi sekali selama evaluasi templat terstruktur.

Misalnya, # AskForAge.prompt mengembalikan teks resolusi yang sama untuk Speak properti dan Text .

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

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

Anda dapat menggunakan <TemplateName>!() untuk meminta evaluasi baru pada setiap referensi dalam templat terstruktur.

Dalam contoh di bawah ini, Speak dan Text mungkin memiliki teks resolusi yang berbeda karena GetAge dievaluasi ulang pada setiap instans.

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

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

Berikut cara menampilkan carousel kartu:

# 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
]

Gunakan \ sebagai karakter escape.

> 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
]

Komposisi templat terstruktur

Perilaku komposisi berikut didukung dengan templat terstruktur:

  • Komposisi sadar konteks struktur. Jika templat target yang dirujuk juga merupakan templat terstruktur, maka jenis struktur harus cocok. Misalnya, ActivityTemplate dapat dirujuk di ActivityTemplate lain.
  • Referensi ke templat respons sederhana atau bersyarkat dapat ada di mana saja di dalam templat terstruktur.

Misalkan Anda memiliki templat berikut:

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

# T2
- This is awesome

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

Panggilan ke evaluateTemplate('T1') akan menghasilkan struktur internal berikut:

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

Referensi lengkap ke templat terstruktur lain

Anda dapat menyertakan referensi ke templat terstruktur lain sebagai properti di templat terstruktur lain, atau sebagai referensi dalam templat respons sederhana atau bersyarkat lainnya

Berikut adalah contoh referensi lengkap ke templat terstruktur lainnya:

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

Dengan konten ini, panggilan ke evaluateTemplate('ST1') akan menghasilkan struktur internal berikut:

[MyStruct
    Text = foo
    Speak = bar
]

Ketika properti yang sama ada di templat panggilan serta templat yang dipanggil, konten dalam pemanggil akan menimpa konten apa pun dalam templat yang disebut.

Berikut contohnya:

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

Dengan konteks ini, panggilan ke evaluateTemplate('ST1') akan menghasilkan struktur internal berikut:

[MyStruct
    Text = foo
    Speak = bar
]

Perhatikan bahwa gaya komposisi ini hanya dapat ada di tingkat akar. Jika ada referensi ke templat terstruktur lain dalam properti, maka resolusinya kontekstual dengan properti tersebut.

Referensi file eksternal dalam lampiran terstruktur

Ada dua fungsi bawaan yang digunakan untuk mereferensikan file secara eksternal

  1. fromFile(fileAbsoluteOrRelativePath) memuat file tertentu. Konten yang dikembalikan oleh fungsi ini akan mendukung evaluasi konten. Referensi templat, properti, dan ekspresi dievaluasi.
  2. ActivityAttachment(content, contentType)contentType mengatur jika belum ditentukan dalam konten.

Dengan dua fungsi bawaan ini, Anda dapat menarik konten apa pun yang ditentukan secara eksternal, termasuk semua jenis kartu. Gunakan LG terstruktur berikut untuk menyusun aktivitas:

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

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

Anda juga dapat menggunakan lampiran, yang terlihat di bawah ini:

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

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

Informasi Tambahan