Building and customizing solutions using Microsoft 365 Copilot APIs and tools
Yes. The supported pattern is to have each topic return structured outputs that explicitly report what it already answered, and let the orchestration layer compose the final response from those outputs instead of having each topic write overlapping user-facing answers.
Why this happens:
- In generative orchestration, multiple components can participate in one turn.
- If a topic answers part of the request but doesn’t clearly report that completion through outputs such as an answered-state flag and returned values, later orchestration can treat that part as still unanswered.
- The orchestration layer can proactively use knowledge along with topics and tools, so it may try to answer both parts of a multi-part request unless each component reports exactly what it handled.
- This is especially common when context only contains plain text and not the fact that a topic already showed an answer to the user.
What to do:
- Change each topic so it returns outputs, not just message-node text.
- Return the actual result as an output variable.
- Return an
answeredoutput that istruewhen that topic already handled its part.
- Update each topic description so the orchestration layer knows when not to answer again. The documented pattern is:
Apply the same pattern to Topic A and Topic B with their own outputs.This topic handles account balance requests. If its answered output is true, the user has already received their response and it should not be answered again. - For multi-part requests, have each topic return only its own structured result and completion state. Then let the orchestrator combine those outputs into one final response.
- If a topic currently writes the answer directly to the user, make sure it also reports what it answered and any values needed by later steps. Otherwise another component can answer again.
- If one component fully handles the request, use End all topics so the orchestration layer has no reason to add another response.
- Test with the exact model configured for the agent. Whether the orchestrator restates or duplicates an answer can vary by model.
About suppressing default orchestration:
It can’t be forced to use a specific knowledge article or prevented from using knowledge simply because a topic exists. The documented approach is not to suppress orchestration globally, but to design topics as mini-agents that:
- return outputs instead of only messages,
- include answered-state outputs,
- return any values later steps need,
- clearly describe in the topic description how the orchestrator should treat those outputs.
Also note:
- Knowledge can complement topics and tools proactively, not only as fallback.
- In standard harness context, plain text from topics may be available, but the fact that the user already saw an answer is not reliably preserved unless returned as outputs.
- Adaptive Card interactions are a known source of context mismatch, so card selections should also be returned as outputs.
For the behavior described, the root cause is consistent with duplicate-message design issues in generative orchestration: each topic answers its own part correctly, but the orchestration layer still sees the other part as unanswered and generates an additional partial answer. The fix is to make both topics explicitly report completion and values through outputs, then rely on orchestration to merge those outputs into one response.
References:
- Design best practices to avoid duplicate messages
- Design topics as mini-agents that avoid duplicate messages
- Troubleshoot duplicate messages and missed answers
- Apply generative orchestration capabilities
- Context distribution in the standard harness
- Orchestrate agent behavior with generative AI
- Inconsistent Output Behavior in Generative AI Action within Copilot Studio Topic - Microsoft Q&A