Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Použitím Agent 365 SDK může váš agent zpracovávat události aktivity platformy, jako je instalace a odinstalace, a posílat více samostatných zpráv během jedné interakce. Tento článek se zabývá klíčovými postupy, jak odpovídat uživatelům a informovat je během zpracování požadavků vaším agentem.
Zpracování událostí instalace a odinstalace agenta
Když uživatel nainstaluje nebo odinstaluje vašeho agenta v Teams nebo jiných kanálech hostovaných Agentem 365, platforma odešle aktivitu InstallationUpdate (také označovanou jako událost agentInstanceCreated). Váš agent může tyto události zpracovat a při instalaci odeslat uvítací zprávu, při odinstalaci zprávu na rozloučenou.
| Akce | Popis |
|---|---|
add |
Uživatel nainstaluje agenta |
remove |
Uživatel odinstaluje agenta |
Na rozdíl od obslužných rutin oznámení obslužná rutina InstallationUpdate nevyžaduje ověření, protože událost instalace nebo odinstalace se spouští před zahájením nebo po ukončení aktivní relace uživatele.
Registrace obslužné rutiny instalace a odinstalace
Zaregistrujte obslužnou rutinu pro typ aktivity InstallationUpdate v inicializaci vašeho agenta:
@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 je řetězec nastavený na "add" při instalaci agenta nebo na "remove" při jeho odinstalaci.
Activity.from_property je instance ChannelAccount, která obsahuje identitu uživatele.
Odesílání více zpráv
Agenti Agent 365 mohou odesílat více jednotlivých zpráv v odpovědi na jeden uživatelský prompt. K tomu zavolejte SendActivityAsync (.NET), send_activity (Python) nebo sendActivity (JavaScript) několikrát v rámci jednoho kroku.
Důležité
Teams nepodporuje streamování odpovědí pro agentické identity. SDK detekuje agentickou identitu a ukládá stream do jedné zprávy. Použijte SendActivityAsync, send_activity nebo sendActivity přímo k odeslání okamžitých, samostatných zpráv uživateli.
Následující příklady ukazují tento vzorec tím, že před odpovědí LLM je zasláno okamžité potvrzení:
@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)
Ukázka tento vzor demonstruje v on_message (host_agent_server.py) tím, že okamžitě pošle potvrzení před odpovědí LLM.
Každé volání sendActivity, send_activity nebo SendActivityAsync vytvoří samostatnou zprávu. Můžete ji volat tolikrát, kolikrát je potřeba, abyste zaslali aktualizace průběhu, dílčí výsledky nebo konečnou odpověď.
Indikátory psaní
Indikátory psaní ukazují animaci postupu ... v Teams:
- Mají vestavěný vizuální časový limit přibližně 5 sekund, který je třeba pravidelně obnovovat přibližně každé čtyři sekundy.
- Jsou viditelné pouze v chatech jeden na jednoho a malých skupinových chatech, ne v kanálech.
Agent pravidelně každé čtyři sekundy posílá indikátory psaní, aby udržel animaci ... aktivní, zatímco LLM zpracovává požadavek:
# 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