Mesajları Ele Al

Agent 365 SDK'yi kullanarak, aracınınız platform etkinliklerini (örneğin yükleme ve kaldırma) işleyebilir ve tek bir turda birden fazla ayrı mesaj gönderebilir. Bu makale, aracınınız istekleri işlerken kullanıcılara yanıt verme ve onları bilgilendirme için temel yöntemleri açıklar.

Aracı kurulum ve kaldırma etkinliklerini yönetin

Bir kullanıcı, aracınınızı Teams veya diğer Agent 365 tarafından barındırılan kanallarda yüklediğinde veya kaldırdığında, platform bir InstallationUpdate etkinliği (aynı zamanda agentInstanceCreated olayı olarak da bilinir) gönderir. Aracınınız, kurulduğunda bir hoş geldiniz mesajı ve kaldırıldığında bir veda mesajı göndermek için bu olayları işleyebilir.

Eylem Açıklama
add Kullanıcı aracıı yükler
remove Kullanıcı aracıı kaldırır

Bildirim işleyicilerinin aksine, InstallationUpdate işleyicisi kimlik doğrulaması gerektirmez çünkü yükleme veya kaldırma olayı, kullanıcının aktif bir oturumu olduktan önce veya sonra tetiklenir.

Kurulum ve kaldırma işleyicisini kaydedin

Aracınızın başlatılması sırasında InstallationUpdate etkinlik türü için bir etkinlik işleyicisi kaydedin:

@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, aracı yüklediğinizde "add" veya kaldırdığınızda "remove" değerine ayarlanmış bir dizedir. Activity.from_property, kullanıcının kimliğini içeren bir ChannelAccount nesnesidir.

Birden fazla mesaj gönderin

Agent 365 aracıları, tek bir kullanıcı istemine yanıt olarak birden fazla ayrı mesaj gönderebilir. Bunu yapmak için, tek bir tur içinde SendActivityAsync (.NET), send_activity (Python) veya sendActivity (JavaScript) yöntemini birden fazla kez çağırın.

Önemli

Teams, aracı kimlikleri için akış yanıtlarını desteklemez. SDK, aracı kimliğini algılar ve akışı tek bir mesaja tamponlar. Kullanıcıya anında, birbirinden bağımsız mesajlar göndermek için SendActivityAsync, send_activity veya sendActivity'ü doğrudan kullanın.

Aşağıdaki örnekler, LLM yanıtından önce anında bir onay göndererek bu deseni göstermektedir:

@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)

Örnek, on_message (host_agent_server.py dosyasında) LLM yanıtından önce anında bir onay göndererek bu modeli göstermektedir.

Her çağrı sendActivity, send_activity veya SendActivityAsync ayrı bir mesaj oluşturur. İlerleme güncellemeleri, kısmi sonuçlar veya nihai bir yanıt göndermek için bu fonksiyonu dilediğiniz kadar çağırabilirsiniz.

Yazma göstergeleri

Teams'teki yazma göstergeleri bir ... ilerleme animasyonu gösterir:

  • Yaklaşık 5 saniyelik yerleşik görsel zaman aşımına sahip ve bu süre her dört saniyede bir döngüde yenilenmesi gerekiyor.
  • Yalnızca bire bir sohbetlerde ve küçük grup sohbetlerinde görünürler, kanallarda görünmezler.

Aracı, LLM isteği işlenirken ... animasyonunun aktif kalmasını sağlamak için yaklaşık her dört saniyede bir döngü halinde yazma göstergeleri gönderir:

# 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