Berichten verwerken

Door gebruik te maken van de Agent 365 SDK kan uw agent platformactiviteiten zoals installeren en verwijderen afhandelen en meerdere afzonderlijke berichten binnen één beurt verzenden. Dit artikel behandelt de belangrijkste patronen om gebruikers te beantwoorden en hen op de hoogte te houden terwijl uw agent verzoeken verwerkt.

Installatie- en verwijderingsgebeurtenissen voor agents

Wanneer een gebruiker uw agent installeert of verwijdert in Teams of andere door Agent 365 gehoste kanalen, stuurt het platform een InstallationUpdate-activiteit (ook wel de agentInstanceCreated-event genoemd). Uw agent kan deze gebeurtenissen afhandelen door een welkomstbericht te sturen wanneer deze wordt geïnstalleerd en een afscheidsbericht wanneer deze wordt verwijderd.

Actie Omschrijving
add De gebruiker installeert de agent
remove De gebruiker verwijdert de agent

In tegenstelling tot meldingshandlers vereist de InstallationUpdate-handler geen verificatie omdat de installatie- of verwijderingsevent vóór of na een actieve sessie van de gebruiker wordt uitgevoerd.

De installatie- en verwijderhandler registreren

Registreer een activiteitenhandler voor het InstallationUpdate-activiteitstype in de initialisatie van uw agent:

@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 is een tekenreeks die op "add" wordt ingesteld wanneer u de agent installeert of "remove" verwijdert. Activity.from_property is een ChannelAccount-exemplaar met de identiteit van de gebruiker.

Meerdere berichten verzenden

Agent 365-agenten kunnen meerdere afzonderlijke berichten sturen als reactie op één enkele gebruikersprompt. Roep hiervoor SendActivityAsync (.NET), send_activity (Python) of sendActivity (JavaScript) meerdere keren aan binnen één beurt.

Belangrijk

Teams ondersteunt geen streaming-antwoorden voor agentische identiteiten. De SDK detecteert agentische identiteit en buffert de stroom in één bericht. Gebruik SendActivityAsync, send_activity of sendActivity direct om directe, discrete berichten naar de gebruiker te sturen.

De volgende voorbeelden tonen het patroon door direct een bevestiging te sturen vóór het antwoord van de 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)

Het voorbeeld toont dit patroon in on_message (host_agent_server.py) door een onmiddellijke bevestiging te sturen vóór de LLM-respons.

Elke aanroep van sendActivity, send_activity of SendActivityAsync creëert een apart bericht. U kunt het zo vaak aanroepen als nodig is om voortgangsupdates, gedeeltelijke resultaten of een definitief antwoord te sturen.

Typeaanduidingen

Typen-indicatoren tonen een ... voortgangsanimatie in Teams:

  • Ze hebben een ingebouwde visuele time-out van ongeveer 5 seconden en die moet ongeveer elke vier seconden in een lus worden ververst.
  • Ze zijn alleen zichtbaar in één-op-één chats en kleine groepschats, niet in kanalen.

De agent stuurt typen-indicatoren ongeveer elke vier seconden in een lus om de ... animatie levend te houden terwijl de LLM het verzoek verwerkt:

# 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