Håndter meldinger

Ved å bruke Agent 365 SDK kan agenten din håndtere plattformaktivitetshendelser som installasjon og avinstallering, og sende flere diskrete meldinger i én samtaleomgang. Denne artikkelen dekker de viktigste mønstrene for å svare brukere og holde dem informert mens agenten din behandler forespørsler.

Håndtering av agentens installasjons- og avinstallasjonshendelser

Når en bruker installerer eller avinstallerer agenten din i Teams eller andre kanaler som hostes av Agent 365, sender plattformen en InstallationUpdate-aktivitet (også kalt agentInstanceCreated-hendelse). Agenten din kan håndtere disse hendelsene ved installasjon ved å sende en velkomstmelding, og ved avinstallasjon ved å sende en avskjedsmelding.

Handling Description
add Brukeren installerer agenten
remove Brukeren avinstallerer agenten

I motsetning til varslingshåndterere krever ikke InstallationUpdate-håndtereren autentisering, fordi installasjons- eller avinstallasjonshendelsen utløses før eller etter at brukeren har en aktiv økt.

Registrer installasjons- og avinstallasjonshåndterer

Registrer en aktivitetshandler for InstallationUpdate aktivitetstypen i agentens initialisering:

@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 er en streng som er satt til "add" når du installerer agenten eller "remove" når du avinstallerer den. Activity.from_property er en instans av ChannelAccount som inneholder brukerens identitet.

Send flere meldinger

Agent 365-agenter kan sende flere separate meldinger som svar på én enkelt brukerspørsmål. For å gjøre dette, kall SendActivityAsync (.NET), send_activity (Python) eller sendActivity (JavaScript) flere ganger i løpet av én runde.

Viktig!

Teams støtter ikke strømming av svar for agentiske identiteter. SDK-en oppdager agentisk identitet og buffrer strømmen til én enkelt melding. Bruk SendActivityAsync, send_activity eller sendActivity direkte for å sende umiddelbare, enkeltstående meldinger til brukeren.

Følgende eksempler demonstrerer mønsteret ved å sende en umiddelbar bekreftelse før LLM-svaret:

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

Eksempelet demonstrerer dette mønsteret i on_messagePython (host_agent_server.py) ved å sende en umiddelbar bekreftelse før LLM-svaret.

Hver gang du kaller sendActivity, send_activity eller SendActivityAsync, opprettes en egen melding. Du kan kalle den så mange ganger som nødvendig for å sende fremdriftsoppdateringer, delvise resultater eller et endelig svar.

Inntastingsindikatorer

Skriveindikatorer viser en ... fremdriftsanimasjon i Teams:

  • De har en innebygd visuell timeout på omtrent 5 sekunder, og den må fornyes i en løkke omtrent hvert fjerde sekund.
  • De er bare synlige i én-til-én-nettprater og små gruppenettprater, ikke i kanaler.

Agenten sender skriveindikatorer med intervaller på cirka fire sekunder for å holde ...-animasjonen synlig mens LLM-en behandler forespørselen:

# 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