Skip to content

Make the SkipLast polyfill streaming - #692

Merged
SimonCropp merged 2 commits into
mainfrom
perf/skiplast-streaming
Oct 12, 2026
Merged

SimonCropp merged 2 commits into
mainfrom
perf/skiplast-streaming

Conversation

@SimonCropp

@SimonCropp SimonCropp commented Oct 12, 2026 •

Copy link
Copy Markdown
Owner

The SkipLast polyfill (.NET Framework / netstandard2.0) was target.Reverse().Skip(count).Reverse(). That pulls the entire source and buffers it twice before the first item is yielded, so source.SkipLast(3).Take(3) over 1,000,000 items enumerated all 1,000,000.

It now uses the existing TakeRangeFromEndIterator helper (range 0..^count), which is what the BCL does:

  • when the count is known without enumerating (ICollection<T> / ICollection), it yields the first Count - count items and stops;
  • otherwise it streams through a queue that holds back at most count items.

count <= 0 returns target.Skip(0) as the BCL does. A null source still throws ArgumentNullException (parameter name source, as before) when SkipLast is called, and execution is still deferred.

Results are identical. The difference is in when the source is pulled: items are yielded as they become available, where before the whole source was consumed on the first MoveNext.

Measurements

net48, Release, x64, Stopwatch, best of 5, microseconds per call:

Scenario Before After
SkipLast(3).Take(3) over a 1,000,000 item iterator 22,821 0.14
SkipLast(3) over a List<int> of 1,000,000, fully enumerated 15,923 11,422
SkipLast(3) over a 1,000,000 item iterator, fully enumerated 20,203 12,169 to 25,785 (shared machine, two runs)
SkipLast(3) over a List<int> of 20 0.47 0.32
SkipLast(3) over a 20 item iterator 0.63 0.66

Full enumeration costs about the same time, without the two full-size buffers (the queue holds 3 items here).

Tests

Added to PolyfillTests_IEnumerable.cs:

  • results for skip counts from int.MinValue to int.MaxValue against an array, List<T>, Queue<T>, HashSet<T> and an iterator, for lengths 0, 1, 2 and 10, including enumerating the result twice;
  • reference types with nulls;
  • streaming: SkipLast(3).Take(3) over a 1,000,000 item iterator pulls at most 7 items;
  • deferred execution: nothing is pulled until enumeration, and list changes after the call are seen;
  • a null source throws when called, for positive and zero counts.

The deferred-execution test skips its list assertion on .NET 5 (checked at run time): the real SkipLast there fixes its bounds over a list when it is called, which .NET 6 changed.

SkipLast was Reverse().Skip(count).Reverse(), which buffered the whole source twice before yielding anything. Use the queue based range iterator, as the BCL does.
@SimonCropp SimonCropp added this to the 11.4.5 milestone Oct 12, 2026
@SimonCropp
SimonCropp merged commit 660e517 into main Oct 12, 2026
5 checks passed
@SimonCropp
SimonCropp deleted the perf/skiplast-streaming branch October 12, 2026 12:07
This was referenced Oct 12, 2026
JacekSmi added a commit to JacekSmi/PolishOpenData that referenced this pull request Nov 11, 2026
Pinned [Microsoft.Bcl.AsyncInterfaces](https://github.com/dotnet/dotnet)
at 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Bcl.AsyncInterfaces's
releases](https://github.com/dotnet/dotnet/releases)._

## 10.0.0-preview.6.25358.103

You can build .NET 10.0 Preview 6 from the repository by cloning the
release tag `v10.0.0-preview.6.25358.103` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.6.25358.103/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.6.25358.103/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 10.0.0-preview.5.25277.114

You can build .NET 10.0 Preview 5 from the repository by cloning the
release tag `v10.0.0-preview.5.25277.114` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.5.25277.114/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.5.25277.114/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 10.0.0-preview.4.25258.110

You can build .NET 10.0 Preview 4 from the repository by cloning the
release tag `v10.0.0-preview.4.25258.110` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.4.25258.110/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.4.25258.110/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 10.0.0-preview.3.25171.5

You can build .NET 10.0 Preview 3 from the repository by cloning the
release tag `v10.0.0-preview.3.25171.5` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.3.25171.5/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.3.25171.5/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 10.0.0-preview.2.25163.2

You can build .NET 10.0 Preview 2 from the repository by cloning the
release tag `v10.0.0-preview.2.25163.2` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.2.25163.2/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.2.25163.2/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 10.0.0-preview.1.25080.5

You can build .NET 10.0 Preview 1 from the repository by cloning the
release tag `v10.0.0-preview.1.25080.5` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.1.25080.5/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v10.0.0-preview.1.25080.5/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.123

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.123` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.123/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.123/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.122

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.122` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.122/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.122/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.121

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.121` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.121/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.121/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.120

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.120` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.120/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.120/README.md#building-from-released-sources).

Attached is a PGP signature for the GitHub generated tarball. You can
find the public key at https://dot.net/release-key-2023

## 9.0.119

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.119` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.119/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.119/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.118

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.118` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.118/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.118/README.md#building-from-released-sources).

Attached is a PGP signature for the GitHub generated tarball. You can
find the public key at https://dot.net/release-key-2023

## 9.0.117

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.117` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.117/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.117/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.116

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.116` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.116/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.116/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.115

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.115` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.115/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.115/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.114

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.114` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.114/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.114/README.md#building-from-released-sources).

Attached is the PGP signature for the GitHub generated tarball. You can
find the public key at https://dot.net/release-key-2023

## 9.0.113

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.113` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.113/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.113/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.112

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.112` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.112/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.112/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.111

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.111` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.111/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.111/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.110

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.110` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.110/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.110/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.109

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.109` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.109/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.109/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.101

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.101` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.101/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.101/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.7

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.7` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.7/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.7/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.6

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.6` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.6/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.6/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.5

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.5` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.5/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.5/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.4

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.4` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.4/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.4/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.3

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.3` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.3/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.3/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.2

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.2` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.2/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.2/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.1

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.1` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.1/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.1/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.0

You can build .NET 9.0 from the repository by cloning the release tag
`v9.0.0` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.0/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.0/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.0-rc.2.24473.5

You can build NET 9.0 RC2 from the repository by cloning the release tag
`v9.0.0-rc.2.24473.5` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.0-rc.2.24473.5/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.0-rc.2.24473.5/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.0-rc.1.24431.7

You can build .NET 9.0 RC1 from the repository by cloning the release
tag `v9.0.0-rc.1.24431.7` and following the build instructions in the
[main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.0-rc.1.24431.7/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.0-rc.1.24431.7/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.0-preview.7.24405.7

You can build .NET 9.0 Preview 7 from the repository by cloning the
release tag `v9.0.0-preview.7.24405.7` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.0-preview.7.24405.7/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.0-preview.7.24405.7/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 9.0.0-preview.6.24327.7

You can build .NET 9.0 Preview 6 from the repository by cloning the
release tag `v9.0.0-preview.6.24327.7` and following the build
instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v9.0.0-preview.6.24327.7/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v9.0.0-preview.6.24327.7/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.133

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.133` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.133/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.133/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.132

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.132` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.132/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.132/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.131

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.131` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.131/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.131/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.130

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.130` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.130/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.130/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.129

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.129` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.129/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.129/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.128

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.128` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.128/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.128/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.127

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.127` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.127/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.127/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.126

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.126` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.126/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.126/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.125

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.125` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.125/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.125/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.124

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.124` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.124/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.124/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.123

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.123` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.123/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.123/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.122

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.122` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.122/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.122/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.121

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.121` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.121/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.121/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.120

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.120` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.120/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.120/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.119

<!-- This file is a template for a GitHub release notes post. -->
<!-- The line prefixed by 'Title:' will be submitted as the title of the
release notes, and the rest of the file will be submitted as the body.
-->

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.119` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.119/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.119/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.18

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.18` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.18/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.18/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.17

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.17` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.17/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.17/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.16

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.16` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.16/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.16/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.15

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.15` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.15/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.15/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.14

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.14` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.14/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.14/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.13

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.13` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.13/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.13/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.12

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.12` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.12/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.12/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.11

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.11` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.11/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.11/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.10

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.10` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.10/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.10/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

## 8.0.8

You can build .NET 8.0 from the repository by cloning the release tag
`v8.0.8` and following the build instructions in the [main
README.md](https://github.com/dotnet/dotnet/blob/v8.0.8/README.md#building).

Alternatively, you can build from the sources attached to this release
directly.
More information on this process can be found in the [dotnet/dotnet
repository](https://github.com/dotnet/dotnet/blob/v8.0.8/README.md#building-from-released-sources).

Attached are PGP signatures for the GitHub generated tarball and
zipball. You can find the public key at https://dot.net/release-key-2023

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.Bcl.AsyncInterfaces](https://github.com/dotnet/dotnet) from
10.0.12 to 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Bcl.AsyncInterfaces's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated [Microsoft.Bcl.TimeProvider](https://github.com/dotnet/dotnet)
from 10.0.12 to 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Bcl.TimeProvider's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.Extensions.AI.Abstractions](https://github.com/dotnet/extensions)
from 10.10.0 to 10.11.0.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.AI.Abstractions's
releases](https://github.com/dotnet/extensions/releases)._

## 10.11.0

# .NET Extensions 10.11.0

This release adds optional scope capture for buffered logs and updates
experimental HTTP latency enrichment APIs. It also includes fixes for AI
streaming and function invocation, evaluation reports, HybridCache
invalidation, and logging.

## Experimental API Changes

### New Experimental APIs

* Optional logging-scope capture for global and per-request log
buffering through `GlobalLogBufferingOptions.IncludeScopes` and
`PerRequestLogBufferingOptions.IncludeScopes` (`EXTEXP0003`) #​7813

### Breaking Changes to Experimental APIs

* Incoming HTTP latency log enrichment: `AddHttpLatencyTelemetry` is
renamed to `AddHttpServerLatencyTelemetry` and moves from
`HttpLatencyTelemetryServiceCollectionExtensions` to
`HttpLoggingServiceCollectionExtensions`. It remains experimental under
`EXTEXP0013` in this release. #​7730

## What's Changed

### AI

* Yield final image when streaming with HostedImageGenerationTool #​7774
by @​iamAdarshh
* Make the default tool-rejection message state that the decision is
final #​7784 by @​manjunathshiva
* AI: Remove obsolete OpenAI JsonPatch workaround #​7815 by @​jozkee
(co-authored by @​Copilot)
* Ignore empty model IDs in streaming responses #​7816 by @​valkiara
* Honor FunctionInvocationContext.Terminate when the function throws
#​7801 by @​gjz22
* Fix ChatResponseUpdate.Clone dropping ContinuationToken #​7699 by
@​dfedoryshchev
* Decode non-base64 data URIs in DataContent to the octets they encode
#​7798 by @​Laurianti

### AI Evaluation

* [M.E.AI.Evaluation.Reporting] Fix context and metric interpretation
visualization #​7738 by @​grafanaKibana
* Fix tokenizer attaching punctuation to number tokens #​7766 by
@​tahakocal
* Order iteration results numerically #​7769 by @​tahakocal
* Score GLEU against the best matching reference #​7768 by @​tahakocal

### Telemetry and Observability

* Optionally preserve logging scopes in buffered log records #​7813 by
@​evgenyfedorov2 (co-authored by @​Copilot)
* Fix OOM from unbounded enumeration of ExtendedLogger tag joiners
#​7819 by @​evgenyfedorov2 (co-authored by @​Copilot)
* Fix log buffering race by removing the rule selector cache #​7803 by
@​evgenyfedorov2 (co-authored by @​Copilot)

### ASP.NET Core Extensions

* Rename AddHttpLatencyTelemetry to AddHttpServerLatencyTelemetry
(API-approved shape) #​7730 by @​EasyL0ver (co-authored by @​Copilot)
* Fix ArgumentNullException in per-request log buffering at the end of a
request #​7811 by @​evgenyfedorov2 (co-authored by @​Copilot)

### AI Project Templates

* Align aichatweb local vector-store keys with Guid record keys #​7804
by @​jongalloway (co-authored by @​adamsitnik @​Copilot)

### Caching

 ... (truncated)

## 10.10.1

This release fixes two OpenAI integration issues: a TypeLoadException on
tool-carrying Responses API calls and a streaming crash against
third-party OpenAI-compatible endpoints, by upgrading the OpenAI SDK to
2.14.0.

## Packages in this release

| Package | Version |
|---------|---------|
| Microsoft.Extensions.AI.OpenAI | `10.10.1` |
| Microsoft.Extensions.AI.Abstractions | `10.10.1` |

## What's Changed

### AI

* Upgrade OpenAI SDK to 2.14.0 #​7761 by @​zxyao145

## Acknowledgements

* @​zxyao145 made their first contribution in #​7761
* @​zxyao145 submitted issue #​7760 (resolved by #​7761)
* @​jozkee @​wtgodbe reviewed pull requests

**Full Changelog**:
https://github.com/dotnet/extensions/compare/v10.10.0...v10.10.1


Commits viewable in [compare
view](https://github.com/dotnet/extensions/compare/v10.10.0...v10.11.0).
</details>

Updated
[Microsoft.Extensions.Caching.Memory](https://github.com/dotnet/dotnet)
from 10.0.12 to 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Caching.Memory's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Pinned
[Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/dotnet)
at 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.DependencyInjection's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Pinned
[Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/dotnet)
at 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.DependencyInjection's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated [Microsoft.Extensions.Hosting](https://github.com/dotnet/dotnet)
from 10.0.12 to 10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Hosting's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Pinned [Microsoft.Extensions.Http](https://github.com/dotnet/dotnet) at
10.0.14.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Http's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated
[Microsoft.Extensions.Http.Resilience](https://github.com/dotnet/extensions)
from 10.10.0 to 10.11.0.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Http.Resilience's
releases](https://github.com/dotnet/extensions/releases)._

## 10.11.0

# .NET Extensions 10.11.0

This release adds optional scope capture for buffered logs and updates
experimental HTTP latency enrichment APIs. It also includes fixes for AI
streaming and function invocation, evaluation reports, HybridCache
invalidation, and logging.

## Experimental API Changes

### New Experimental APIs

* Optional logging-scope capture for global and per-request log
buffering through `GlobalLogBufferingOptions.IncludeScopes` and
`PerRequestLogBufferingOptions.IncludeScopes` (`EXTEXP0003`) #​7813

### Breaking Changes to Experimental APIs

* Incoming HTTP latency log enrichment: `AddHttpLatencyTelemetry` is
renamed to `AddHttpServerLatencyTelemetry` and moves from
`HttpLatencyTelemetryServiceCollectionExtensions` to
`HttpLoggingServiceCollectionExtensions`. It remains experimental under
`EXTEXP0013` in this release. #​7730

## What's Changed

### AI

* Yield final image when streaming with HostedImageGenerationTool #​7774
by @​iamAdarshh
* Make the default tool-rejection message state that the decision is
final #​7784 by @​manjunathshiva
* AI: Remove obsolete OpenAI JsonPatch workaround #​7815 by @​jozkee
(co-authored by @​Copilot)
* Ignore empty model IDs in streaming responses #​7816 by @​valkiara
* Honor FunctionInvocationContext.Terminate when the function throws
#​7801 by @​gjz22
* Fix ChatResponseUpdate.Clone dropping ContinuationToken #​7699 by
@​dfedoryshchev
* Decode non-base64 data URIs in DataContent to the octets they encode
#​7798 by @​Laurianti

### AI Evaluation

* [M.E.AI.Evaluation.Reporting] Fix context and metric interpretation
visualization #​7738 by @​grafanaKibana
* Fix tokenizer attaching punctuation to number tokens #​7766 by
@​tahakocal
* Order iteration results numerically #​7769 by @​tahakocal
* Score GLEU against the best matching reference #​7768 by @​tahakocal

### Telemetry and Observability

* Optionally preserve logging scopes in buffered log records #​7813 by
@​evgenyfedorov2 (co-authored by @​Copilot)
* Fix OOM from unbounded enumeration of ExtendedLogger tag joiners
#​7819 by @​evgenyfedorov2 (co-authored by @​Copilot)
* Fix log buffering race by removing the rule selector cache #​7803 by
@​evgenyfedorov2 (co-authored by @​Copilot)

### ASP.NET Core Extensions

* Rename AddHttpLatencyTelemetry to AddHttpServerLatencyTelemetry
(API-approved shape) #​7730 by @​EasyL0ver (co-authored by @​Copilot)
* Fix ArgumentNullException in per-request log buffering at the end of a
request #​7811 by @​evgenyfedorov2 (co-authored by @​Copilot)

### AI Project Templates

* Align aichatweb local vector-store keys with Guid record keys #​7804
by @​jongalloway (co-authored by @​adamsitnik @​Copilot)

### Caching

 ... (truncated)

## 10.10.1

This release fixes two OpenAI integration issues: a TypeLoadException on
tool-carrying Responses API calls and a streaming crash against
third-party OpenAI-compatible endpoints, by upgrading the OpenAI SDK to
2.14.0.

## Packages in this release

| Package | Version |
|---------|---------|
| Microsoft.Extensions.AI.OpenAI | `10.10.1` |
| Microsoft.Extensions.AI.Abstractions | `10.10.1` |

## What's Changed

### AI

* Upgrade OpenAI SDK to 2.14.0 #​7761 by @​zxyao145

## Acknowledgements

* @​zxyao145 made their first contribution in #​7761
* @​zxyao145 submitted issue #​7760 (resolved by #​7761)
* @​jozkee @​wtgodbe reviewed pull requests

**Full Changelog**:
https://github.com/dotnet/extensions/compare/v10.10.0...v10.10.1


Commits viewable in [compare
view](https://github.com/dotnet/extensions/compare/v10.10.0...v10.11.0).
</details>

Updated
[Microsoft.Extensions.TimeProvider.Testing](https://github.com/dotnet/extensions)
from 10.10.0 to 10.11.0.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.TimeProvider.Testing's
releases](https://github.com/dotnet/extensions/releases)._

## 10.11.0

# .NET Extensions 10.11.0

This release adds optional scope capture for buffered logs and updates
experimental HTTP latency enrichment APIs. It also includes fixes for AI
streaming and function invocation, evaluation reports, HybridCache
invalidation, and logging.

## Experimental API Changes

### New Experimental APIs

* Optional logging-scope capture for global and per-request log
buffering through `GlobalLogBufferingOptions.IncludeScopes` and
`PerRequestLogBufferingOptions.IncludeScopes` (`EXTEXP0003`) #​7813

### Breaking Changes to Experimental APIs

* Incoming HTTP latency log enrichment: `AddHttpLatencyTelemetry` is
renamed to `AddHttpServerLatencyTelemetry` and moves from
`HttpLatencyTelemetryServiceCollectionExtensions` to
`HttpLoggingServiceCollectionExtensions`. It remains experimental under
`EXTEXP0013` in this release. #​7730

## What's Changed

### AI

* Yield final image when streaming with HostedImageGenerationTool #​7774
by @​iamAdarshh
* Make the default tool-rejection message state that the decision is
final #​7784 by @​manjunathshiva
* AI: Remove obsolete OpenAI JsonPatch workaround #​7815 by @​jozkee
(co-authored by @​Copilot)
* Ignore empty model IDs in streaming responses #​7816 by @​valkiara
* Honor FunctionInvocationContext.Terminate when the function throws
#​7801 by @​gjz22
* Fix ChatResponseUpdate.Clone dropping ContinuationToken #​7699 by
@​dfedoryshchev
* Decode non-base64 data URIs in DataContent to the octets they encode
#​7798 by @​Laurianti

### AI Evaluation

* [M.E.AI.Evaluation.Reporting] Fix context and metric interpretation
visualization #​7738 by @​grafanaKibana
* Fix tokenizer attaching punctuation to number tokens #​7766 by
@​tahakocal
* Order iteration results numerically #​7769 by @​tahakocal
* Score GLEU against the best matching reference #​7768 by @​tahakocal

### Telemetry and Observability

* Optionally preserve logging scopes in buffered log records #​7813 by
@​evgenyfedorov2 (co-authored by @​Copilot)
* Fix OOM from unbounded enumeration of ExtendedLogger tag joiners
#​7819 by @​evgenyfedorov2 (co-authored by @​Copilot)
* Fix log buffering race by removing the rule selector cache #​7803 by
@​evgenyfedorov2 (co-authored by @​Copilot)

### ASP.NET Core Extensions

* Rename AddHttpLatencyTelemetry to AddHttpServerLatencyTelemetry
(API-approved shape) #​7730 by @​EasyL0ver (co-authored by @​Copilot)
* Fix ArgumentNullException in per-request log buffering at the end of a
request #​7811 by @​evgenyfedorov2 (co-authored by @​Copilot)

### AI Project Templates

* Align aichatweb local vector-store keys with Guid record keys #​7804
by @​jongalloway (co-authored by @​adamsitnik @​Copilot)

### Caching

 ... (truncated)

## 10.10.1

This release fixes two OpenAI integration issues: a TypeLoadException on
tool-carrying Responses API calls and a streaming crash against
third-party OpenAI-compatible endpoints, by upgrading the OpenAI SDK to
2.14.0.

## Packages in this release

| Package | Version |
|---------|---------|
| Microsoft.Extensions.AI.OpenAI | `10.10.1` |
| Microsoft.Extensions.AI.Abstractions | `10.10.1` |

## What's Changed

### AI

* Upgrade OpenAI SDK to 2.14.0 #​7761 by @​zxyao145

## Acknowledgements

* @​zxyao145 made their first contribution in #​7761
* @​zxyao145 submitted issue #​7760 (resolved by #​7761)
* @​jozkee @​wtgodbe reviewed pull requests

**Full Changelog**:
https://github.com/dotnet/extensions/compare/v10.10.0...v10.10.1


Commits viewable in [compare
view](https://github.com/dotnet/extensions/compare/v10.10.0...v10.11.0).
</details>

Updated
[ModelContextProtocol](https://github.com/modelcontextprotocol/csharp-sdk)
from 2.2.0 to 2.3.0.

<details>
<summary>Release notes</summary>

_Sourced from [ModelContextProtocol's
releases](https://github.com/modelcontextprotocol/csharp-sdk/releases)._

## 2.3.0

This release improves HTTP discovery, OAuth, protocol interoperability,
and shutdown reliability, preserves registration order for server
primitives, and exposes a `TimeProvider` for deterministic client
timeout tests. It also corrects optional server-identity handling;
applications reading `McpClient.ServerInfo` should adopt nullable
handling.

## Breaking Changes

Refer to the [C# SDK
Versioning](https://csharp.sdk.modelcontextprotocol.io/v2/versioning.html)
documentation for details on versioning and breaking change policies.

1. **`McpClient.ServerInfo` is nullable — #​1903**
* Its return annotation changes from `Implementation` to
`Implementation?`. Existing non-nullable assignments or dereferences can
produce nullable warnings and fail warnings-as-errors builds.
* On `2026-07-28` connections, `ServerInfo` is `null` when the server
omits optional identity metadata from `server/discover`. Legacy
`initialize` still requires `serverInfo`. Reading the property before
connecting still throws `InvalidOperationException`.
* Migrate with a null check or a fallback such as
`client.ServerInfo?.Name ?? "Unknown server"`. Self-reported identity
must not be used for security decisions.
* This corrective source-compatibility change is intentionally included
in 2.3.0.

## What's Changed

* Correct protocol-version telemetry for stateless server spans #​1810
by @​luisangelrod
* Preserve HTTP errors and correct discovery fallback handling #​1791 by
@​PranavSenthilnathan (co-authored by @​Copilot)
* Make modern Streamable HTTP status mapping deterministic #​1837 by
@​jstar0
* Modern responses wait for the first protocol message before sending
headers; long-running silent handlers may need progress output or an
appropriate HTTP timeout. Legacy eager-header behavior is preserved.
* Accept opaque legacy metadata and correct request-scoped capabilities
and discovery advertisement #​1852 by @​halter73 (co-authored by
@​Copilot)
* Avoid redundant SSE fallback after discovery is rejected with 400 or
404 #​1855 by @​scottt732
* Close server stdin before waiting for graceful stdio process exit
#​1838 by @​luisangelrod
* Preserve insertion order when listing server tools, prompts, and
resources #​1924 by @​PederHP (co-authored by Claude Opus 5.5)
* Allow missing optional server identity in discovery and make
`ServerInfo` nullable #​1903 by @​Coding-Professional
* Include JSON parse details in Streamable HTTP 400 responses #​1844 by
@​ump45nose
* Exclude OAuth from `DiscoverProbeTimeout`, expose
`McpClientOptions.TimeProvider` for deterministic timeout tests, and
default SSE to legacy initialization #​1719 by @​halter73 (co-authored
by @​Copilot)
* OAuth remains subject to the overall `InitializationTimeout` and
caller cancellation; it is excluded only from the short discovery-probe
budget.
* Modern discovery over SSE requires both explicit
`HttpTransportMode.Sse` and `ProtocolVersion = "2026-07-28"`; pinning
the version with `AutoDetect` is not equivalent.
* Preserve numeric progress tokens in `RequestOptions` serialization
#​1832 by @​dfedoryshchev
* Dispose legacy SSE POST responses to release connections
deterministically #​1841 by @​yalcinfu22 (co-authored by Claude Fable 5)

## Documentation Updates

* Document standing support for new MCP specification revisions #​1826
by @​halter73 (co-authored by @​Copilot)

## Test Improvements

* Stabilize discovery-capable test connections while retaining
initialization deadlines #​1943 by @​tarekgh

## Repository Infrastructure Updates

* Add a source selector for manual documentation publishes #​1828 by
@​jeffhandley (co-authored by @​Copilot)
* Update SourceLink's private build dependency to resolve a vulnerable
Git dependency #​1873 by @​halter73 (co-authored by @​Copilot)
* Correct obsolete `McpServerFactory` references in Copilot instructions
#​1892 by @​Zir0-93
* Update Microsoft.Extensions.AI and AI.Abstractions to 10.11.0 and
align shared System dependencies to 10.0.13 #​1940

## Acknowledgements

* @​scottt732 made their first contribution in #​1855
* @​Zir0-93 made their first contribution in #​1892
* @​Coding-Professional made their first contribution in #​1903
 ... (truncated)

Commits viewable in [compare
view](https://github.com/modelcontextprotocol/csharp-sdk/compare/v2.2.0...v2.3.0).
</details>

Updated [Polyfill](https://github.com/SimonCropp/Polyfill) from 11.4.0
to 11.4.5.

<details>
<summary>Release notes</summary>

_Sourced from [Polyfill's
releases](https://github.com/SimonCropp/Polyfill/releases)._

## 11.4.5

- [x] [#​680](https://github.com/SimonCropp/Polyfill/pull/680) Avoid
per-read char[] allocation in StringStream on older targets
- [x] [#​681](https://github.com/SimonCropp/Polyfill/pull/681) Insert
spans into List with a single shift
- [x] [#​682](https://github.com/SimonCropp/Polyfill/pull/682) Scan for
line breaks in a single pass in SpanLineEnumerator
- [x] [#​683](https://github.com/SimonCropp/Polyfill/pull/683) Encode
Base64Url without intermediate strings and arrays
- [x] [#​684](https://github.com/SimonCropp/Polyfill/pull/684) Override
WriteByte in WritableMemoryStream
- [x] [#​685](https://github.com/SimonCropp/Polyfill/pull/685) Block
copy in List AddRange(ReadOnlySpan) and CopyTo(Span)
- [x] [#​686](https://github.com/SimonCropp/Polyfill/pull/686) Avoid
quadratic separator search in SplitAny for char separators
- [x] [#​687](https://github.com/SimonCropp/Polyfill/pull/687) Cache the
last ReadAsync task in the memory stream polyfills
- [x] [#​688](https://github.com/SimonCropp/Polyfill/pull/688) Use the
span based Convert APIs in the Base64 polyfill
- [x] [#​689](https://github.com/SimonCropp/Polyfill/pull/689) Index
into IList sources in Take(Range) and TakeLast
- [x] [#​690](https://github.com/SimonCropp/Polyfill/pull/690) Find
string separators in a single pass in SplitAny
- [x] [#​691](https://github.com/SimonCropp/Polyfill/pull/691) Defer the
Adler-32 modulo in the ZLibStream polyfill
- [x] [#​692](https://github.com/SimonCropp/Polyfill/pull/692) Make the
SkipLast polyfill streaming
- [x] [#​693](https://github.com/SimonCropp/Polyfill/pull/693) Grow
geometrically in CollectionsMarshal.SetCount
- [x] [#​694](https://github.com/SimonCropp/Polyfill/pull/694) Copy in
blocks in StringBuilder.CopyTo(int, Span<char>, int)
- [x] [#​695](https://github.com/SimonCropp/Polyfill/pull/695) Use the
runtime's HashSet.TryGetValue when it exists
- [x] [#​696](https://github.com/SimonCropp/Polyfill/pull/696) Port the
BCL string algorithm for Path.GetRelativePath
- [x] [#​697](https://github.com/SimonCropp/Polyfill/pull/697) Size the
buffers of the Base64 OperationStatus overloads by the data
- [x] [#​698](https://github.com/SimonCropp/Polyfill/pull/698) Only
materialize the requested range in StringBuilder.Append(StringBuilder,
int, int)
- [x] [#​699](https://github.com/SimonCropp/Polyfill/pull/699) Pre-size
the dict…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant