Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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