Skip to content

Scan for line breaks in a single pass in SpanLineEnumerator - #682

Merged
SimonCropp merged 1 commit into
mainfrom
perf/span-line-enumerator
Oct 12, 2026
Merged

SimonCropp merged 1 commit into
mainfrom
perf/span-line-enumerator

Conversation

@SimonCropp

Copy link
Copy Markdown
Owner

SpanLineEnumerator.MoveNext (the EnumerateLines polyfill, active below net6) searched for the next line break with remaining.IndexOfAny(newlines) over six values. On runtimes where the span IndexOfAny(values) is not vectorized (the System.Memory package on .NET Framework / netstandard2.0) that call scans the whole remainder once per value and keeps the lowest hit. \n is the last value in the list, so on LF-only text every MoveNext rescanned the rest of the input for the five values that never occur, making enumeration quadratic.

This replaces the call with a single forward pass that tests each char against \n, \r, \f, U+0085, U+2028 and U+2029. The set of recognised line breaks, \r\n handling and the trailing-empty-line behaviour are unchanged.

Measurements

net48, Release, x64, best of 3, enumerating 8,000 lines of ~30 chars:

input before after
LF only 2,209 ms 0.91 ms
CRLF 0.63 ms 0.45 ms

Tests

New PolyfillTests_SpanLineEnumerator.cs (runs against the polyfill below net6 and the BCL from net6):

  • a table of inputs covering each of the six line breaks, \r\n as one break, \n\r as two, leading/trailing/consecutive breaks, the empty string, and neighbouring chars that must not split (\v, \t, U+0084, U+0086, U+2027, U+202A)
  • an exhaustive pass over every BMP char asserting exactly those six split a line
  • 5,000 LF-terminated lines (the previously quadratic shape)
  • MoveNext keeps returning false after the end

@SimonCropp SimonCropp added this to the 11.4.5 milestone Oct 12, 2026
@SimonCropp
SimonCropp merged commit f33f077 into main Oct 12, 2026
5 checks passed
@SimonCropp
SimonCropp deleted the perf/span-line-enumerator branch October 12, 2026 12:04
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