Building and customizing solutions using Microsoft 365 Copilot APIs and tools
There is no supported Copilot Studio mechanism that displays named textual progress updates and later replaces or removes them consistently across Teams, Microsoft 365 Copilot, Web Chat, and custom clients; use a best-effort Typing activity during processing, send only the final answer as a message, and reserve richer progress UI for clients you control.
Recommended cross-channel design
For agents powered by the standard harness:
- In the topic’s existing polling loop, add an Invoke activity node immediately before each wait/poll cycle.
- Set the activity type to Typing.
- In the cloud flow that performs each polling cycle:
- Query the Dataverse job record.
- If the job is incomplete, use a Delay action before returning control for the next poll.
- If complete, return the final answer.
- If failed or timed out, return a terminal error message rather than continuing indefinitely.
- Repeat the Typing activity while waiting.
- When the final result arrives, leave the loop and send the final answer as the only text message.
The Invoke activity and Event activity nodes documented for this design apply to standard-harness agents. Verify the agent’s harness before packaging this implementation. A Typing activity only asks the channel to show an indicator; each channel decides whether and how to render it.^1^
Use configurable safeguards around the loop, for example:
- A polling interval appropriate for your workload, such as five seconds.
- A maximum elapsed time or maximum poll count.
- Terminal states such as
Completed,Failed, andTimedOut. - Only send Typing when another poll will occur, not after reaching a terminal state.
Typing is best-effort—not a guaranteed visible progress experience. In Teams it expires quickly and must be refreshed, and it is visible only in one-to-one and small group chats, not Teams channels.^2^ Consequently, even this indicator cannot be guaranteed across every channel.
Why textual updates should not be used as the portable option
Messages such as “Checking your device…” are ordinary conversation activities. The available documentation does not define a Copilot Studio abstraction for updating or deleting those activities across all native channels. Clients and channels also differ in their support for message formats and capabilities.^3^
Sending each update as a normal message would therefore leave those messages in the transcript on clients that do not support replacement. Do not model progress as Adaptive Cards if removal is required; card and action support also varies by channel.
Teams response streaming is not a universal substitute:
- It applies only to Teams personal chats, not group chats or channels.
- Teams ends a stream after two minutes.
- Microsoft 365 Copilot does not use the Teams streaming session.
- Text already streamed can remain visible when the final response is delivered separately.^4^
Rich progress where the client is controlled
For a custom website using Direct Line/Web Chat, add an optional channel-specific adapter:
- Send an Event activity containing fields such as job ID, status text, and state.
- Intercept that event in the custom Web Chat client.
- Render it in a temporary status area outside the transcript.
- Replace the status area as new events arrive.
- Remove it when the final message or terminal failure arrives.
Copilot Studio explicitly supports Event activities that a custom Web Chat control can intercept, but the channel decides how events are handled.^1^ Direct Line can deliver activities in real time over WebSockets, making this suitable for controlled web clients.^5^
Treat this as an enhancement, with the cross-channel fallback remaining Typing or no intermediate UI, followed by one final message.
Long-running flow alternative
If customers use environments on the new Power Automate infrastructure, an agent flow can enable Respond to the agent → Settings → Asynchronous response. This allows the flow to exceed the former two-minute limit and return a callback after completion. However, callbacks are fully supported only in Teams, are not supported in Microsoft Copilot or telephony, and other channels are not formally tested.^6^
That option can simplify Teams deployments, but it is not a replacement for your Dataverse/webhook pattern when consistent multi-channel behavior is required.
References