Tangani Pesan

Dengan menggunakan Agent 365 SDK, agen Anda dapat menangani event aktivitas platform seperti pemasangan dan pencopotan, serta mengirim beberapa pesan terpisah dalam satu giliran. Artikel ini menjelaskan pola-pola penting untuk merespons pengguna dan menjaga mereka tetap mendapat informasi selama agen Anda memproses permintaan.

Menangani event instalasi dan uninstall agen

Ketika pengguna menginstal atau menghapus instalasi agen Anda di Teams atau saluran lain yang dihosting oleh Agent 365, platform akan mengirimkan aktivitas InstallationUpdate (juga disebut sebagai peristiwa agentInstanceCreated). Agen Anda dapat menangani event ini untuk mengirim pesan selamat datang saat diinstal dan pesan perpisahan saat instalasi dihapus.

Tindakan Deskripsi
add Pengguna menginstal agen
remove Pengguna menghapus instalasi agen

Berbeda dengan penanganan notifikasi, penanganan InstallationUpdate tidak memerlukan autentikasi karena peristiwa instalasi atau penghapusan terjadi sebelum atau setelah sesi aktif pengguna.

Daftarkan penanganan instalasi dan penghapusan

Daftarkan penangan aktivitas untuk tipe aktivitas InstallationUpdate dalam inisialisasi agen Anda:

@agent_app.activity("installationUpdate")
async def on_installation_update(context: TurnContext, state: TurnState):
    action = context.activity.action
    from_prop = context.activity.from_property
    logger.info(
        "InstallationUpdate received — Action: '%s', DisplayName: '%s', UserId: '%s'",
        action or "(none)",
        getattr(from_prop, "name", "(unknown)") if from_prop else "(unknown)",
        getattr(from_prop, "id", "(unknown)") if from_prop else "(unknown)",
    )
    if action == "add":
        await context.send_activity("Thank you for hiring me! Looking forward to assisting you in your professional journey!")
    elif action == "remove":
        await context.send_activity("Thank you for your time, I enjoyed working with you.")

Activity.action adalah set string untuk "add" saat Anda menginstal agen atau "remove" saat Anda menghapus instalasi agen tersebut. Activity.from_property adalah instans ChannelAccount yang berisi identitas pengguna.

Mengirim beberapa pesan

Agent 365 dapat mengirim beberapa pesan terpisah sebagai respons terhadap satu perintah pengguna. Untuk melakukan ini, panggil SendActivityAsync (.NET), send_activity (Python), atau sendActivity (JavaScript) beberapa kali dalam satu putaran.

Penting

Teams tidak mendukung respons streaming untuk identitas agentik. SDK mendeteksi identitas agen dan menyangga aliran ke dalam satu pesan. Gunakan SendActivityAsync, send_activity, atau sendActivity secara langsung untuk mengirim pesan segera dan terpisah kepada pengguna.

Contoh berikut menunjukkan pola dengan mengirimkan konfirmasi langsung sebelum respons LLM:

@agent_app.activity("message")
async def on_message(context: TurnContext, state: TurnState):
    # Message 1: immediate ack — reaches the user right away
    await context.send_activity("Got it — working on it…")

    # ... LLM processing ...

    # Message 2: the LLM response
    await context.send_activity(response)

Sampel menunjukkan pola ini dalam on_message (host_agent_server.py) dengan mengirimkan pengakuan langsung sebelum respons LLM.

Setiap panggilan ke sendActivity, send_activity, atau SendActivityAsync membuat pesan terpisah. Anda dapat memanggilnya sebanyak yang diperlukan untuk mengirim pembaruan kemajuan, hasil parsial, atau jawaban akhir.

Indikator pengetikan

Indikator pengetikan menunjukkan ... animasi kemajuan di Teams:

  • Indikator ini memiliki batas waktu visual bawaan sekitar 5 detik dan itu harus di-refresh dalam perulangan sekitar setiap empat detik.
  • Indikator ini hanya terlihat dalam obrolan satu lawan satu dan obrolan grup kecil, bukan di saluran.

Agen mengirim indikator pengetikan secara berulang setiap empat detik untuk menjaga animasi ... tetap aktif selama LLM memproses permintaan:

# Message 1: immediate ack — reaches the user right away
await context.send_activity("Got it — working on it…")

# Send typing indicator immediately (awaited so it arrives before the LLM call starts).
await context.send_activity(Activity(type="typing"))

# Background loop refreshes the "..." animation every ~4s (it times out after ~5s).
async def _typing_loop():
    try:
        while True:
            await asyncio.sleep(4)
            await context.send_activity(Activity(type="typing"))
    except asyncio.CancelledError:
        pass  # Expected on cancel.

typing_task = asyncio.create_task(_typing_loop())
try:
    response = await agent.process_user_message(...)
    await context.send_activity(response)
finally:
    typing_task.cancel()
    try:
        await typing_task
    except asyncio.CancelledError:
        pass