Updated quoted replies & new quotes features#321
Merged
Conversation
corinagum
force-pushed
the
cg/quoted-replies
branch
from
March 23, 2026 23:43
c96f0af to
6d76792
Compare
corinagum
marked this pull request as ready for review
March 24, 2026 18:19
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates how “quoted replies” are represented and built in the Microsoft Teams SDK for Python by moving from reply_to_id/blockquote HTML to a dedicated quotedReply entity plus a <quoted messageId="..."/> placeholder, and exposes new helper APIs for creating and reading quoted replies.
Changes:
- Add
QuotedReplyData/QuotedReplyEntitymodels and registerQuotedReplyEntityin the entity union. - Update outbound reply building (
ActivityContext.reply()/quote_reply(),MessageActivityInput.add_quoted_reply()) and inbound parsing (MessageActivity.get_quoted_messages()). - Add unit tests and a new
examples/quoted-repliessample app; removewith_reply_to_id().
Reviewed changes
Copilot reviewed 14 out of 16 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| uv.lock | Adds the new quoted-replies example as a workspace member/package entry. |
| packages/apps/tests/test_quoted_reply.py | New tests validating quoted reply stamping/placeholder behavior. |
| packages/apps/tests/test_activity_context.py | Updates reply tests to assert quotedReply entity + placeholder; removes one targeted-send inference test. |
| packages/apps/src/microsoft_teams/apps/routing/activity_context.py | Implements quotedReply stamping in reply() and adds quote_reply(). |
| packages/api/tests/unit/test_quoted_reply_entity.py | Tests serialization/deserialization for the new quoted reply models. |
| packages/api/tests/unit/test_quoted_replies_property.py | Tests inbound filtering (get_quoted_messages) and outbound builder (add_quoted_reply). |
| packages/api/tests/unit/test_activity.py | Removes usage/assertion for the deleted with_reply_to_id() builder. |
| packages/api/src/microsoft_teams/api/models/entity/quoted_reply_entity.py | Introduces QuotedReplyData and QuotedReplyEntity models (experimental). |
| packages/api/src/microsoft_teams/api/models/entity/entity.py | Registers QuotedReplyEntity in the Entity union. |
| packages/api/src/microsoft_teams/api/models/entity/init.py | Exports QuotedReplyData and QuotedReplyEntity. |
| packages/api/src/microsoft_teams/api/models/activity.py | Removes with_reply_to_id() builder. |
| packages/api/src/microsoft_teams/api/activities/message/message.py | Adds get_quoted_messages() and add_quoted_reply() on message activities. |
| examples/quoted-replies/src/main.py | New example bot demonstrating all quoted-reply APIs. |
| examples/quoted-replies/pyproject.toml | Adds project metadata/deps for the new example. |
| examples/quoted-replies/README.md | Adds run instructions and command list for the example. |
| .coverage | Adds a coverage database artifact to the repo (should not be committed). |
corinagum
force-pushed
the
cg/quoted-replies
branch
from
March 24, 2026 23:11
b4d7777 to
a7a0366
Compare
lilyydu
reviewed
Mar 25, 2026
corinagum
force-pushed
the
cg/quoted-replies
branch
from
March 25, 2026 22:16
a2f12d3 to
27f5d89
Compare
heyitsaamir
approved these changes
Mar 26, 2026
lilyydu
reviewed
Mar 27, 2026
lilyydu
reviewed
Mar 27, 2026
lilyydu
approved these changes
Mar 27, 2026
Contributor
Author
|
Re: Copilot review comments
|
lilyydu
approved these changes
Apr 2, 2026
corinagum
force-pushed
the
cg/quoted-replies
branch
from
April 7, 2026 19:16
4236a21 to
d0e3a6f
Compare
corinagum
added a commit
that referenced
this pull request
Apr 13, 2026
- Remove `with_reply_to_id()` method `reply_to_id` is a field on the activity that is used by the service, but any changes to it on the bot side are completely ignored. After thorough testing to confirm, this PR removes the misleading method `with_reply_to_id`; setting replyToId on outgoing activities is a no-op. Originally part of #321 but separated out due to timing concerns for GA
corinagum
force-pushed
the
cg/quoted-replies
branch
2 times, most recently
from
April 27, 2026 22:26
282f981 to
684dc26
Compare
lilyydu
reviewed
May 7, 2026
lilyydu
reviewed
May 7, 2026
added 8 commits
May 7, 2026 10:51
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
corinagum
force-pushed
the
cg/quoted-replies
branch
from
May 7, 2026 17:53
2a3c7c4 to
f70a187
Compare
5 tasks
corinagum
added a commit
that referenced
this pull request
May 14, 2026
## Summary Brings `main` into `release` for the 2.0.11 release, with quoted-replies (PR #321) excluded. Also bumps `version.json` from `2.0.0` to `2.0.11` to align with the teams.ts release cadence. Single squashed commit. > **Branch name note**: the branch is `cg/prep-release-2.0.1` (left over from an earlier draft when alignment hadn't been decided yet). The actual published version per `version.json` is **2.0.11**. ## What's in this release - All commits merged to main since 2.0.0 (the previous release), notably: - **Reactions GA** (PR #427) — `@experimental` removed; sample fixed - Prompt Preview Support (PR #397) - Various dependency bumps and bug fixes ## What's NOT in this release **Quoted-replies feature (PR #321) is excluded:** - `prepend_quote()`, `add_quote()` builder methods — absent - `ctx.quote()` and quote-aware `ctx.reply()` behavior — reverted to legacy `reply_to_id` + blockquote - `examples/quoting` — removed - QR-related tests — removed **Kept intentionally:** - `QuotedReplyEntity` and `QuotedReplyData` types stay in the `Entity` union so inbound activities carrying `quotedReply` entities still parse - `add_targeted_message_info` runtime strip-QR logic — preserves prompt-preview cleanup ## Version `version.json`: `2.0.0` → `2.0.11` This one-time jump aligns teams.py with teams.ts. Going forward, both progress on a shared 2.0.x patch cadence. ## Test plan - [x] `uv run ruff check` — all checks passed - [x] `uv run pyright` — 0 errors, 0 warnings - [x] `uv run pytest` — 571/571 tests - [x] `uv build --all-packages` — wheels produced; consumer install verified (fresh venv, `pip install --no-index --find-links` succeeds, `QuotedReplyEntity` importable, `prepend_quote`/`add_quote` absent, `add_targeted_message_info` present) - [ ] ADO Public publish pipeline (post-merge) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
7 tasks
corinagum
added a commit
that referenced
this pull request
May 27, 2026
## Summary Brings `origin/main` into `release` for the **2.0.12** release. **No carve-outs this time** — Quoted Replies (PR #321) is included. `version.json`: `2.0.11` → `2.0.12`. Aligns with teams.ts/teams.net cadence. ## What's in this release (delta from 2.0.11) **Features** - Quoted Replies & new quotes features (#321) — previously held back - SuggestedActionSubmitActivity for `suggestedAction/submit` invoke (#434) - Default targeted replies for targeted inbound messages (#439) - Reactions API marked GA (#427) — already shipped in 2.0.11 actually, ignore if duplicate - Prompt Preview support (#397) - Sample: opt targeted-messages into slash commands (#430) - Sample: a2a-in-teams (#401) - Sample: proactive message update (#405) - Allow custom HTTP client via `AppOptions` (#416) **Security & fixes** - Lock JsonWebToken trust-boundary contract (#432) - Bump starlette 1.0.0 -> 1.1.0 for PYSEC-2026-161 / BadHost (#441) - warn when bot starts without credentials (#435) - fix(apps): support AAD v1 issuers in Entra token validation (#422) - fix(apps): log inbound activities at info, warn on missing Authorization (#425) - fix(http-stream): wait for in-flight flush before sending final close (#419) - Mark reactions API as GA and fix sample remove flow (#427) - Revert serviceUrl allowlist (ADO 5310460) (#415) - Route `app.get_app_graph` + `ctx.*_graph` to sovereign endpoints via `cloud.graph_scope` (#402) **Deprecations / package changes** - Remove ai, openai, mcpplugin, a2a, and devtools packages (#413) - Restore and deprecate devtools package (#410) - Deprecate ai, openai, mcpplugin, a2a packages (#406) - Add agent framework example, remove chatprompt/mcp client samples (#386) **Dependency bumps** - urllib3 2.6.3 → 2.7.0 (#426) - python-multipart 0.0.26 → 0.0.27 (#424) - microsoft-kiota-http 1.9.7 → 1.9.9 (#423) - idna 3.11 → 3.15 (#431) - starlette 1.0.0 → 1.1.0 (#441, security) - /examples/tab/Web: qs, postcss, uuid, follow-redirects bumps ## Quoted Replies inclusion notes - Teams client rendering is in-sync with the wire format as of 2026-05-06. - APX QR rollout completed: Public 2026-04-10, GCCH/DoD/Gallatin 2026-04-14. - Builder methods (`prepend_quote()`, `add_quote()`), `ctx.quote()`, and the quote-aware `ctx.reply()` behavior are all present in this release. - `examples/quoting` is included. ## Conflict resolution The 2.0.11 release branch had the QR-removed shape for four files; took `main`'s (QR-included) version for all of them: - `examples/targeted-messages/src/main.py` - `packages/api/src/microsoft_teams/api/activities/message/message.py` - `packages/apps/src/microsoft_teams/apps/routing/activity_context.py` - `packages/apps/tests/test_activity_context.py` `version.json` conflict resolved to `2.0.12`. ## Test plan - [x] `uv sync` clean - [x] `poe check` (ruff format + lint) — clean - [x] `poe test` — 609 passed - [x] `pyright` — 0 errors, 0 warnings - [ ] Pipeline build + test stages green on `release` after merge - [ ] Publish pipeline run with **Public** → ESRP approval → PyPI - [ ] `pip install microsoft-teams-apps==2.0.12` smoke install --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: Aamir Jawaid <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]> Co-authored-by: Shanmathi Mayuram Krithivasan <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
QuotedReplyEntityPydantic model with nestedQuotedReplyData(message_idrequired,sender_id/sender_name/preview/time/is_reply_deleted/validated_message_referenceoptional); register in Entity unionget_quoted_messages()onMessageActivityto read inbound quoted reply entitiesadd_quoted_reply(message_id, response?)builder onMessageActivityInputreply()to stampQuotedReplyEntity + <quoted messageId="..."/>placeholder instead of blockquote HTML; removereply_to_idassignmentquote_reply()onActivityContext@experimental