From 4ee72e89fff533d434436351dfe1f5cb24634ffb Mon Sep 17 00:00:00 2001 From: Corina Gum <> Date: Tue, 17 Mar 2026 15:45:28 -0700 Subject: [PATCH 1/3] Add documentation for quoted replies --- .../sending-messages/csharp.incl.md | 80 ++++++++++++++++++ .../sending-messages/python.incl.md | 80 ++++++++++++++++++ .../sending-messages/typescript.incl.md | 82 +++++++++++++++++++ .../essentials/sending-messages/README.mdx | 36 +++++++- 4 files changed, 276 insertions(+), 2 deletions(-) diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md index 9bc4775a6..9ce344c63 100644 --- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md @@ -86,3 +86,83 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction ``` ::: + + + + +`GetQuotedMessages()` + + + +`Reply()` + + + +`QuoteReply()` + + + +`app.Send()` + + + +`AddQuotedReply()` + + + +```csharp +app.OnMessage(async context => +{ + var quotes = context.Activity.GetQuotedMessages(); + + if (quotes.Count > 0) + { + var quote = quotes[0].QuotedReply; + await context.Reply( + $"You quoted message {quote.MessageId} from {quote.SenderName}: \"{quote.Preview}\""); + } +}); +``` + + + +```csharp +app.OnMessage(async context => +{ + // Reply() automatically quotes the inbound message + await context.Reply("Got it!"); +}); +``` + + + +```csharp +app.OnMessage(async context => +{ + // Quote a specific message by its ID + await context.QuoteReply("1772050244572", "Referencing an earlier message"); +}); +``` + + + +```csharp +// Single quote with response below it +var msg = new MessageActivity() + .AddQuotedReply("1772050244572", "Here is my response"); +await app.Send(conversationId, msg); + +// Multiple quotes with interleaved responses +var msg = new MessageActivity() + .AddQuotedReply("msg-1", "response to first") + .AddQuotedReply("msg-2", "response to second"); +await app.Send(conversationId, msg); + +// Grouped quotes — omit response to group quotes together +var msg = new MessageActivity("see below for previous messages") + .AddQuotedReply("msg-1") + .AddQuotedReply("msg-2", "response to both"); +await app.Send(conversationId, msg); +``` + + \ No newline at end of file diff --git a/teams.md/src/components/include/essentials/sending-messages/python.incl.md b/teams.md/src/components/include/essentials/sending-messages/python.incl.md index ddfb14fd8..9348b4fe2 100644 --- a/teams.md/src/components/include/essentials/sending-messages/python.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/python.incl.md @@ -67,5 +67,85 @@ async def handle_message(ctx: ActivityContext[MessageActivity]): ``` +N/A +N/A + + + +`get_quoted_messages()` + + + +`reply()` + + + +`quote_reply()` + + + +`app.send()` + + + +`add_quoted_reply()` + + + +```python +@app.on_message +async def handle_message(ctx: ActivityContext[MessageActivity]): + quotes = ctx.activity.get_quoted_messages() + + if quotes: + quote = quotes[0].quoted_reply + await ctx.reply( + f"You quoted message {quote.message_id} from {quote.sender_name}: \"{quote.preview}\"" + ) +``` + + + +```python +@app.on_message +async def handle_message(ctx: ActivityContext[MessageActivity]): + # reply() automatically quotes the inbound message + await ctx.reply("Got it!") +``` + + + +```python +@app.on_message +async def handle_message(ctx: ActivityContext[MessageActivity]): + # Quote a specific message by its ID + await ctx.quote_reply("1772050244572", "Referencing an earlier message") +``` + + + +```python +from microsoft_teams.api.activities.message import MessageActivityInput + +# Single quote with response below it +msg = (MessageActivityInput() + .add_quoted_reply("1772050244572", "Here is my response")) +await app.send(conversation_id, msg) + +# Multiple quotes with interleaved responses +msg = (MessageActivityInput() + .add_quoted_reply("msg-1", "response to first") + .add_quoted_reply("msg-2", "response to second")) +await app.send(conversation_id, msg) + +# Grouped quotes — omit response to group quotes together +msg = (MessageActivityInput(text="see below for previous messages") + .add_quoted_reply("msg-1") + .add_quoted_reply("msg-2", "response to both")) +await app.send(conversation_id, msg) +``` + + +N/A diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md index 920a47873..26c0f4bd0 100644 --- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md @@ -61,5 +61,87 @@ app.on('message', async ({ send, activity }) => { ``` +N/A +N/A + + + + +`getQuotedMessages()` + + + +`reply()` + + + +`quoteReply()` + + + +`app.send()` + + + +`addQuotedReply()` + + + +```typescript +app.on('message', async ({ activity, reply }) => { + const quotes = activity.getQuotedMessages(); + + if (quotes.length > 0) { + const quote = quotes[0].quotedReply; + await reply( + `You quoted message ${quote.messageId} from ${quote.senderName}: "${quote.preview}"` + ); + } +}); +``` + + + +```typescript +app.on('message', async ({ reply }) => { + // reply() automatically quotes the inbound message + await reply('Got it!'); +}); +``` + + + +```typescript +app.on('message', async ({ quoteReply }) => { + // Quote a specific message by its ID + await quoteReply('1772050244572', 'Referencing an earlier message'); +}); +``` + + + +```typescript +import { MessageActivity } from '@microsoft/teams.api'; + +// Single quote with response below it +const msg = new MessageActivity() + .addQuotedReply('1772050244572', 'Here is my response'); +await app.send(conversationId, msg); + +// Multiple quotes with interleaved responses +const msg = new MessageActivity() + .addQuotedReply('msg-1', 'response to first') + .addQuotedReply('msg-2', 'response to second'); +await app.send(conversationId, msg); + +// Grouped quotes — omit response to group quotes together +const msg = new MessageActivity('see below for previous messages') + .addQuotedReply('msg-1') + .addQuotedReply('msg-2', 'response to both'); +await app.send(conversationId, msg); +``` + + +N/A \ No newline at end of file diff --git a/teams.md/src/pages/templates/essentials/sending-messages/README.mdx b/teams.md/src/pages/templates/essentials/sending-messages/README.mdx index 5ffbf4058..4db938c6c 100644 --- a/teams.md/src/pages/templates/essentials/sending-messages/README.mdx +++ b/teams.md/src/pages/templates/essentials/sending-messages/README.mdx @@ -50,7 +50,6 @@ To send a targeted message when responding to an incoming activity, use the -### Targeted messages in preview ## Reactions @@ -61,6 +60,39 @@ Reactions are currently in preview. Reactions allow your agent to add or remove emoji reactions on messages in a conversation. The reactions client is available via the API client. -### Reactions in preview + +## Quoted Replies + +:::info[Preview] +Quoted replies are currently in preview. +::: + +Quoted replies let your agent reference a previous message in the conversation. When a user sends a message that quotes another message, your agent receives structured metadata about the quoted content. Your agent can also send messages that quote previous messages. + +### Receiving Quoted Replies + +When a user quotes a message and sends it to your agent, the quoted reply metadata is available on the inbound activity. Use the method to access all quoted reply entities. + + + +Each quoted reply entity contains the quoted message's ID, sender information, a preview of the quoted text, and whether the quoted message has been deleted. + +### Sending a Quoted Reply + +When your agent calls , the SDK automatically stamps a quoted reply entity referencing the inbound message. No extra code is needed — the reply will appear as a quoted reply in Teams. + + + +To quote a different message in the same conversation (not the inbound message), use the method with the message ID you want to quote. + + + +### Building Quoted Replies for Proactive Send + +For proactive scenarios (using ) or when quoting multiple messages, use the method on a message activity. Pass the message ID and an optional response text. + + + + \ No newline at end of file From b4dc892f3f9e6de1c58a444082e3df9ecc2f0d76 Mon Sep 17 00:00:00 2001 From: Corina Gum <> Date: Mon, 23 Mar 2026 16:44:15 -0700 Subject: [PATCH 2/3] Fix quoted replies doc examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix variable redeclaration in builder examples (TS: const→let, C#: drop duplicate var) - Add .NET ExperimentalTeamsQuotedReplies preview note matching targeted/reactions pattern Co-Authored-By: Claude Opus 4.6 (1M context) --- .../essentials/sending-messages/csharp.incl.md | 16 +++++++++++++--- .../sending-messages/typescript.incl.md | 6 +++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md index 9ce344c63..7c9a471cf 100644 --- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md @@ -153,16 +153,26 @@ var msg = new MessageActivity() await app.Send(conversationId, msg); // Multiple quotes with interleaved responses -var msg = new MessageActivity() +msg = new MessageActivity() .AddQuotedReply("msg-1", "response to first") .AddQuotedReply("msg-2", "response to second"); await app.Send(conversationId, msg); // Grouped quotes — omit response to group quotes together -var msg = new MessageActivity("see below for previous messages") +msg = new MessageActivity("see below for previous messages") .AddQuotedReply("msg-1") .AddQuotedReply("msg-2", "response to both"); await app.Send(conversationId, msg); ``` - \ No newline at end of file + + +:::tip[.NET] +In .NET, quoted reply APIs are marked with `[Experimental("ExperimentalTeamsQuotedReplies")]` and will produce a compiler error until you opt in. Suppress the diagnostic inline with `#pragma warning disable ExperimentalTeamsQuotedReplies` or project-wide in your `.csproj`: + +```xml + + $(NoWarn);ExperimentalTeamsQuotedReplies + +``` +::: \ No newline at end of file diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md index 26c0f4bd0..6f9777760 100644 --- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md @@ -126,18 +126,18 @@ app.on('message', async ({ quoteReply }) => { import { MessageActivity } from '@microsoft/teams.api'; // Single quote with response below it -const msg = new MessageActivity() +let msg = new MessageActivity() .addQuotedReply('1772050244572', 'Here is my response'); await app.send(conversationId, msg); // Multiple quotes with interleaved responses -const msg = new MessageActivity() +msg = new MessageActivity() .addQuotedReply('msg-1', 'response to first') .addQuotedReply('msg-2', 'response to second'); await app.send(conversationId, msg); // Grouped quotes — omit response to group quotes together -const msg = new MessageActivity('see below for previous messages') +msg = new MessageActivity('see below for previous messages') .addQuotedReply('msg-1') .addQuotedReply('msg-2', 'response to both'); await app.send(conversationId, msg); From 9323eabdbbb6a149b734434b80b9aa32f125978a Mon Sep 17 00:00:00 2001 From: Corina Gum <14900841+corinagum@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:43:02 -0700 Subject: [PATCH 3/3] Update docs to reflect renamed quote methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit quoteReply → quote, addQuotedReply → addQuote across all three languages. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../essentials/sending-messages/csharp.incl.md | 16 ++++++++-------- .../essentials/sending-messages/python.incl.md | 16 ++++++++-------- .../sending-messages/typescript.incl.md | 18 +++++++++--------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md index 7c9a471cf..c8fade896 100644 --- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md @@ -98,7 +98,7 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction -`QuoteReply()` +`Quote()` @@ -106,7 +106,7 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction -`AddQuotedReply()` +`AddQuote()` @@ -140,7 +140,7 @@ app.OnMessage(async context => app.OnMessage(async context => { // Quote a specific message by its ID - await context.QuoteReply("1772050244572", "Referencing an earlier message"); + await context.Quote("1772050244572", "Referencing an earlier message"); }); ``` @@ -149,19 +149,19 @@ app.OnMessage(async context => ```csharp // Single quote with response below it var msg = new MessageActivity() - .AddQuotedReply("1772050244572", "Here is my response"); + .AddQuote("1772050244572", "Here is my response"); await app.Send(conversationId, msg); // Multiple quotes with interleaved responses msg = new MessageActivity() - .AddQuotedReply("msg-1", "response to first") - .AddQuotedReply("msg-2", "response to second"); + .AddQuote("msg-1", "response to first") + .AddQuote("msg-2", "response to second"); await app.Send(conversationId, msg); // Grouped quotes — omit response to group quotes together msg = new MessageActivity("see below for previous messages") - .AddQuotedReply("msg-1") - .AddQuotedReply("msg-2", "response to both"); + .AddQuote("msg-1") + .AddQuote("msg-2", "response to both"); await app.Send(conversationId, msg); ``` diff --git a/teams.md/src/components/include/essentials/sending-messages/python.incl.md b/teams.md/src/components/include/essentials/sending-messages/python.incl.md index 9348b4fe2..d8c0fa790 100644 --- a/teams.md/src/components/include/essentials/sending-messages/python.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/python.incl.md @@ -82,7 +82,7 @@ N/A -`quote_reply()` +`quote()` @@ -90,7 +90,7 @@ N/A -`add_quoted_reply()` +`add_quote()` @@ -121,7 +121,7 @@ async def handle_message(ctx: ActivityContext[MessageActivity]): @app.on_message async def handle_message(ctx: ActivityContext[MessageActivity]): # Quote a specific message by its ID - await ctx.quote_reply("1772050244572", "Referencing an earlier message") + await ctx.quote("1772050244572", "Referencing an earlier message") ``` @@ -131,19 +131,19 @@ from microsoft_teams.api.activities.message import MessageActivityInput # Single quote with response below it msg = (MessageActivityInput() - .add_quoted_reply("1772050244572", "Here is my response")) + .add_quote("1772050244572", "Here is my response")) await app.send(conversation_id, msg) # Multiple quotes with interleaved responses msg = (MessageActivityInput() - .add_quoted_reply("msg-1", "response to first") - .add_quoted_reply("msg-2", "response to second")) + .add_quote("msg-1", "response to first") + .add_quote("msg-2", "response to second")) await app.send(conversation_id, msg) # Grouped quotes — omit response to group quotes together msg = (MessageActivityInput(text="see below for previous messages") - .add_quoted_reply("msg-1") - .add_quoted_reply("msg-2", "response to both")) + .add_quote("msg-1") + .add_quote("msg-2", "response to both")) await app.send(conversation_id, msg) ``` diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md index 6f9777760..53c019cca 100644 --- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md +++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md @@ -77,7 +77,7 @@ N/A -`quoteReply()` +`quote()` @@ -85,7 +85,7 @@ N/A -`addQuotedReply()` +`addQuote()` @@ -114,9 +114,9 @@ app.on('message', async ({ reply }) => { ```typescript -app.on('message', async ({ quoteReply }) => { +app.on('message', async ({ quote }) => { // Quote a specific message by its ID - await quoteReply('1772050244572', 'Referencing an earlier message'); + await quote('1772050244572', 'Referencing an earlier message'); }); ``` @@ -127,19 +127,19 @@ import { MessageActivity } from '@microsoft/teams.api'; // Single quote with response below it let msg = new MessageActivity() - .addQuotedReply('1772050244572', 'Here is my response'); + .addQuote('1772050244572', 'Here is my response'); await app.send(conversationId, msg); // Multiple quotes with interleaved responses msg = new MessageActivity() - .addQuotedReply('msg-1', 'response to first') - .addQuotedReply('msg-2', 'response to second'); + .addQuote('msg-1', 'response to first') + .addQuote('msg-2', 'response to second'); await app.send(conversationId, msg); // Grouped quotes — omit response to group quotes together msg = new MessageActivity('see below for previous messages') - .addQuotedReply('msg-1') - .addQuotedReply('msg-2', 'response to both'); + .addQuote('msg-1') + .addQuote('msg-2', 'response to both'); await app.send(conversationId, msg); ```