Gestire i messaggi

Utilizzando l'SDK Agent 365, il tuo agente può gestire eventi di attività della piattaforma come l'installazione e la disinstallazione, e inviare più messaggi distinti all'interno di un singolo turno. Questo articolo presenta i modelli chiave per rispondere agli utenti e tenerli informati mentre il tuo agente elabora le richieste.

Gestione degli eventi di installazione e disinstallazione dell'agente

Quando un utente installa o disinstalla il tuo agente su Teams o altri canali ospitati da Agent 365, la piattaforma invia un'attività InstallationUpdate (nota anche come evento agentInstanceCreated). Il tuo agente può gestire questi eventi per inviare un messaggio di benvenuto all'installazione e un messaggio di addio alla disinstallazione.

Azione Descrizione
add L'utente installa l'agente
remove L'utente disinstalla l'agente

A differenza dei gestori di notifiche, il gestore InstallationUpdate non richiede l'autenticazione perché l'evento di installazione o disinstallazione si attiva prima o dopo che l'utente ha una sessione attiva.

Registrare il gestore di installazione e disinstallazione

Registra un gestore di attività per il tipo di attività InstallationUpdate durante l'inizializzazione del tuo agente:

@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 è una stringa impostata su "add" quando installi l'agente o su "remove" quando lo disinstalli. Activity.from_property è un'istanza di ChannelAccount che contiene l'identità dell'utente.

Inviare più messaggi

Gli agenti di Agent 365 possono inviare più messaggi distinti in risposta a un singolo prompt dell'utente. Per farlo, chiama SendActivityAsync (.NET), send_activity (Python) o sendActivity (JavaScript) più volte in un solo turno.

Importante

Teams non supporta risposte in streaming per le identità agentiche. Lo SDK rileva l'identità agentica e raggruppa lo stream in un unico messaggio. Usa SendActivityAsync, send_activity o sendActivity direttamente per inviare messaggi immediati e distinti all'utente.

I seguenti esempi dimostrano lo schema inviando un messaggio di conferma immediato prima della risposta del 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)

L'esempio dimostra questo schema in on_messagePython (host_agent_server.py) inviando un messaggio di conferma immediato prima della risposta dell'LLM.

Ogni chiamata a sendActivity, send_activity o SendActivityAsync genera un messaggio separato. Puoi eseguire la chiamata tutte le volte necessarie per inviare aggiornamenti sullo stato di avanzamento, risultati parziali o una risposta finale.

Indicatori di digitazione

Gli indicatori di digitazione mostrano un'animazione di avanzamento ... in Teams.

  • Hanno un timeout visivo integrato di circa 5 secondi che deve essere aggiornato in un ciclo ogni circa quattro secondi.
  • Sono visibili solo nelle chat uno a uno e nei piccoli gruppi, non nei canali.

L'agente invia indicatori di digitazione in un ciclo ogni quattro secondi per mantenere attiva l'animazione ... mentre l'LLM elabora la richiesta:

# 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