Skip to content

Release: Adds version 3.61.0#5918

Merged
Meghana-Palaparthi merged 4 commits into
mainfrom
users/Meghana-Palaparthi/release-3.61.0
Jun 2, 2026
Merged

Release: Adds version 3.61.0#5918
Meghana-Palaparthi merged 4 commits into
mainfrom
users/Meghana-Palaparthi/release-3.61.0

Conversation

@Meghana-Palaparthi
Copy link
Copy Markdown
Contributor

@Meghana-Palaparthi Meghana-Palaparthi commented Jun 2, 2026

Release 3.61.0

Version Changes

Property Previous New
ClientOfficialVersion 3.60.0 3.61.0
ClientPreviewVersion 3.61.0 3.62.0
ClientPreviewSuffixVersion preview.0 preview.0

Changelog (3.61.0 GA)

Features Added

  • 5815 Read Consistency Strategy: Adds hub region header for LastCommittedSingleWriteRegion strategy.
  • 5848 VectorEmbeddingPolicy: Adds EmbeddingSource block to Embedding model
  • 5867 Diagnostics: Adds hedging detection API
  • 5600 HPK: Adds id to partition key when "/id" is the last path in partition key definition.

Bugs Fixed

  • 5827 ChangeFeedEstimator: Change feed estimator threw ArgumentNullException when an inmemory lease container was being used.
  • 5910 Upgraded Direct package to 3.43.2.
  • 5910 Direct: Fixed RNTBD thread-pool starvation by making Dispatcher.OnIdleTimer asynchronous.

Other Changes

  • 5887 Direct: Documents that MaxTcpConnectionsPerEndpoint accepts any positive value.

Changelog (3.62.0-preview.0 - preview only)

Features Added

  • 5838 EmbeddingGenerator: Adds ICosmosEmbeddingGenerator client-wide configuration (preview)
  • 5911 DistributedTransaction: Adds DistributedReadTransaction and DistributedWriteTransaction APIs (preview)

API Contract Diff (GA)

diff --git "a/Microsoft.Azure.Cosmos\\contracts\\API_3.60.0.txt" "b/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0.txt"
index ad39f9b28..767b792c9 100644
--- "a/Microsoft.Azure.Cosmos\\contracts\\API_3.60.0.txt"
+++ "b/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0.txt"
@@ -434,7 +434,10 @@ namespace Microsoft.Azure.Cosmos
         public abstract IReadOnlyList<ValueTuple<string, Uri>> GetContactedRegions();
         public virtual int GetFailedRequestCount();
         public virtual ServerSideCumulativeMetrics GetQueryMetrics();
+        public virtual IReadOnlyList<RequestedRegion> GetRequestedRegions();
+        public virtual IReadOnlyList<string> GetRespondedRegions();
         public virtual Nullable<DateTime> GetStartTimeUtc();
+        public virtual bool HedgingStarted();
         public abstract override string ToString();
     }
     public class CosmosException : Exception, ICloneable
@@ -1033,6 +1036,28 @@ namespace Microsoft.Azure.Cosmos
         public const string WestUS2 = "West US 2";
         public const string WestUS3 = "West US 3";
     }
+    public struct RequestedRegion : IEquatable<RequestedRegion>
+    {
+        public RequestedRegion(string regionName, RequestedRegionReason reason);
+        public RequestedRegionReason Reason { get; }
+        public string RegionName { get; }
+        public bool Equals(RequestedRegion other);
+        public override bool Equals(object obj);
+        public override int GetHashCode();
+        public override string ToString();
+    }
+    public enum RequestedRegionReason : byte
+    {
+        CircuitBreakerProbe = (byte)6,
+        Hedging = (byte)4,
+        Initial = (byte)1,
+        OperationRetry = (byte)2,
+        RegionFailover = (byte)5,
+        TransportRetry = (byte)3,
+        Unknown = (byte)0,
+    }
     public abstract class RequestHandler
     {
         protected RequestHandler();

API Contract Diff (Preview)

diff --git "a/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0-preview.0.txt" "b/Microsoft.Azure.Cosmos\\contracts\\API_3.62.0-preview.0.txt"
index efd0a077d..02f51c190 100644
--- "a/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0-preview.0.txt"
+++ "b/Microsoft.Azure.Cosmos\\contracts\\API_3.62.0-preview.0.txt"
@@ -367,6 +367,7 @@ namespace Microsoft.Azure.Cosmos
         public CosmosClient(string connectionString, CosmosClientOptions clientOptions=null);
         public CosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions=null);
         public virtual CosmosClientOptions ClientOptions { get; }
+        public virtual ICosmosEmbeddingGenerator EmbeddingGenerator { get; }
         public virtual Uri Endpoint { get; }
         public virtual CosmosResponseFactory ResponseFactory { get; }
         public static Task<CosmosClient> CreateAndInitializeAsync(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, IReadOnlyList<ValueTuple<string, string>> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken));
@@ -378,6 +379,8 @@ namespace Microsoft.Azure.Cosmos
         public virtual Task<DatabaseResponse> CreateDatabaseIfNotExistsAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken));
         public virtual Task<DatabaseResponse> CreateDatabaseIfNotExistsAsync(string id, Nullable<int> throughput=default(Nullable<int>), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken));
         public virtual Task<ResponseMessage> CreateDatabaseStreamAsync(DatabaseProperties databaseProperties, Nullable<int> throughput=default(Nullable<int>), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken));
+        public virtual DistributedReadTransaction CreateDistributedReadTransaction();
+        public virtual DistributedWriteTransaction CreateDistributedWriteTransaction();
         public void Dispose();
         protected virtual void Dispose(bool disposing);
         public virtual Container GetContainer(string databaseId, string containerId);
@@ -401,6 +404,7 @@ namespace Microsoft.Azure.Cosmos
         public Nullable<ConsistencyLevel> ConsistencyLevel { get; set; }
         public CosmosClientTelemetryOptions CosmosClientTelemetryOptions { get; set; }
         public Collection<RequestHandler> CustomHandlers { get; }
+        public ICosmosEmbeddingGenerator EmbeddingGenerator { get; set; }
         public Nullable<bool> EnableContentResponseOnWrite { get; set; }
         public bool EnableRemoteRegionPreferredForSessionRetry { get; set; }
         public bool EnableTcpConnectionEndpointRediscovery { get; set; }
@@ -511,9 +515,19 @@ namespace Microsoft.Azure.Cosmos
         public abstract IReadOnlyList<ValueTuple<string, Uri>> GetContactedRegions();
         public virtual int GetFailedRequestCount();
         public virtual ServerSideCumulativeMetrics GetQueryMetrics();
+        public virtual IReadOnlyList<RequestedRegion> GetRequestedRegions();
+        public virtual IReadOnlyList<string> GetRespondedRegions();
         public virtual Nullable<DateTime> GetStartTimeUtc();
+        public virtual bool HedgingStarted();
         public abstract override string ToString();
     }
+    public sealed class CosmosEmbeddingResult
+    {
+        public CosmosEmbeddingResult(IReadOnlyList<ReadOnlyMemory<float>> vectors, Nullable<int> totalTokens=default(Nullable<int>), Nullable<TimeSpan> latency=default(Nullable<TimeSpan>));
+        public Nullable<TimeSpan> Latency { get; }
+        public Nullable<int> TotalTokens { get; }
+        public IReadOnlyList<ReadOnlyMemory<float>> Vectors { get; }
+    }
     public class CosmosException : Exception, ICloneable
     {
         public CosmosException(string message, HttpStatusCode statusCode, int subStatusCode, string activityId, double requestCharge);
@@ -668,6 +682,69 @@ namespace Microsoft.Azure.Cosmos
         DotProduct = 2,
         Euclidean = 0,
     }
+    public abstract class DistributedReadTransaction : DistributedTransaction
+    {
+        protected DistributedReadTransaction();
+        public abstract DistributedReadTransaction ReadItem(Container container, PartitionKey partitionKey, string id, DistributedTransactionRequestOptions requestOptions=null);
+    }
+    public abstract class DistributedTransaction
+    {
+        protected DistributedTransaction();
+        public abstract Task<DistributedTransactionResponse> CommitTransactionAsync(CancellationToken cancellationToken=default(CancellationToken));
+    }
+    public class DistributedTransactionOperationResult
+    {
+        public virtual string ETag { get; }
+        public virtual int Index { get; }
+        public virtual bool IsSuccessStatusCode { get; }
+        public virtual double RequestCharge { get; }
+        public virtual Stream ResourceStream { get; }
+        public virtual HttpStatusCode StatusCode { get; }
+    }
+    public class DistributedTransactionOperationResult<T> : DistributedTransactionOperationResult
+    {
+        protected DistributedTransactionOperationResult();
+        public virtual T Resource { get; set; }
+    }
+    public class DistributedTransactionRequestOptions : RequestOptions
+    {
+        public DistributedTransactionRequestOptions();
+        public string SessionToken { get; set; }
+    }
+    public class DistributedTransactionResponse : IDisposable, IEnumerable, IEnumerable<DistributedTransactionOperationResult>, IReadOnlyCollection<DistributedTransactionOperationResult>, IReadOnlyList<DistributedTransactionOperationResult>
+    {
+        protected DistributedTransactionResponse();
+        public virtual string ActivityId { get; }
+        public virtual int Count { get; }
+        public virtual CosmosDiagnostics Diagnostics { get; }
+        public virtual string DiagnosticString { get; }
+        public virtual string ErrorMessage { get; }
+        public virtual Headers Headers { get; }
+        public virtual Guid IdempotencyToken { get; }
+        public virtual bool IsRetriable { get; }
+        public virtual bool IsSuccessStatusCode { get; }
+        public virtual DistributedTransactionOperationResult this[int index] { get; }
+        public virtual double RequestCharge { get; }
+        public virtual HttpStatusCode StatusCode { get; }
+        public void Dispose();
+        protected virtual void Dispose(bool disposing);
+        public virtual IEnumerator<DistributedTransactionOperationResult> GetEnumerator();
+        public virtual DistributedTransactionOperationResult<T> GetOperationResultAtIndex<T>(int index);
+        IEnumerator System.Collections.IEnumerable.GetEnumerator();
+    }
+    public abstract class DistributedWriteTransaction : DistributedTransaction
+    {
+        protected DistributedWriteTransaction();
+        public abstract DistributedWriteTransaction CreateItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction CreateItem<T>(Container container, PartitionKey partitionKey, string id, T resource, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction DeleteItem(Container container, PartitionKey partitionKey, string id, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction PatchItem(Container container, PartitionKey partitionKey, string id, IReadOnlyList<PatchOperation> patchOperations, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction PatchItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction ReplaceItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction ReplaceItem<T>(Container container, PartitionKey partitionKey, string id, T resource, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction UpsertItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null);
+        public abstract DistributedWriteTransaction UpsertItem<T>(Container container, PartitionKey partitionKey, string id, T resource, DistributedTransactionRequestOptions requestOptions=null);
+    }
     public class Embedding : IEquatable<Embedding>
     {
         public Embedding();
@@ -809,6 +886,10 @@ namespace Microsoft.Azure.Cosmos
         IEnumerator System.Collections.IEnumerable.GetEnumerator();
         public virtual bool TryGetValue(string headerName, out string value);
     }
+    public interface ICosmosEmbeddingGenerator
+    {
+        Task<CosmosEmbeddingResult> GenerateEmbeddingsAsync(IReadOnlyList<string> texts, string endpoint, string deploymentName, int dimensions, CancellationToken cancellationToken=default(CancellationToken));
+    }
     public sealed class IncludedPath
     {
         public IncludedPath();
@@ -1157,6 +1238,28 @@ namespace Microsoft.Azure.Cosmos
         public const string WestUS2 = "West US 2";
         public const string WestUS3 = "West US 3";
     }
+    public struct RequestedRegion : IEquatable<RequestedRegion>
+    {
+        public RequestedRegion(string regionName, RequestedRegionReason reason);
+        public RequestedRegionReason Reason { get; }
+        public string RegionName { get; }
+        public bool Equals(RequestedRegion other);
+        public override bool Equals(object obj);
+        public override int GetHashCode();
+        public override string ToString();
+    }
+    public enum RequestedRegionReason : byte
+    {
+        CircuitBreakerProbe = (byte)6,
+        Hedging = (byte)4,
+        Initial = (byte)1,
+        OperationRetry = (byte)2,
+        RegionFailover = (byte)5,
+        TransportRetry = (byte)3,
+        Unknown = (byte)0,
+    }
     public abstract class RequestHandler
     {
         protected RequestHandler();
@@ -1526,6 +1629,7 @@ namespace Microsoft.Azure.Cosmos.Fluent
         public CosmosClientBuilder WithContentResponseOnWrite(bool contentResponseOnWrite);
         public CosmosClientBuilder WithCustomAccountEndpoints(IEnumerable<Uri> customAccountEndpoints);
         public CosmosClientBuilder WithCustomSerializer(CosmosSerializer cosmosJsonSerializer);
+        public CosmosClientBuilder WithEmbeddingGenerator(ICosmosEmbeddingGenerator embeddingGenerator);
         public CosmosClientBuilder WithEnableRemoteRegionPreferredForSessionRetry(bool enableRemoteRegionPreferredForSessionRetry);
         public CosmosClientBuilder WithFaultInjection(IFaultInjector faultInjector);
         public CosmosClientBuilder WithHttpClientFactory(Func<HttpClient> httpClientFactory);

Checklist

  • Changelog entries reviewed by team
  • API contract diff reviewed by Kiran and Kirill
  • Preview APIs reviewed (email sent to azurecosmossdkdotnet@microsoft.com)
  • Kiran sign-off obtained

- Updates ClientOfficialVersion to 3.61.0
- Updates ClientPreviewVersion to 3.62.0
- Updates ClientPreviewSuffixVersion to preview.0
- Adds changelog entries for 3.61.0 and 3.62.0-preview.0
- Adds API contract files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment thread changelog.md Outdated
ananth7592
ananth7592 previously approved these changes Jun 2, 2026
Copy link
Copy Markdown
Member

@kundadebdatta kundadebdatta left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Waiting on some clarifications on the RequestedRegions contract

    public struct RequestedRegion : IEquatable<RequestedRegion>
    {
        public RequestedRegion(string regionName, RequestedRegionReason reason);
        public RequestedRegionReason Reason { get; }
        public string RegionName { get; }
        public bool Equals(RequestedRegion other);
        **public override bool Equals(object obj);**
        **public override int GetHashCode();**
        **public static bool operator ==(RequestedRegion left, RequestedRegion right);**
        **public static bool operator !=(RequestedRegion left, RequestedRegion right);**
        public override string ToString();
    }

Meghana-Palaparthi and others added 2 commits June 2, 2026 13:57
Removes operator == and operator != from RequestedRegion struct
(removed by PR #5919: Diagnostics: Removes Unnecessary APIs From Public Contract)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Member

@kundadebdatta kundadebdatta left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM Now.

@Meghana-Palaparthi Meghana-Palaparthi enabled auto-merge (squash) June 2, 2026 19:20
@Meghana-Palaparthi Meghana-Palaparthi enabled auto-merge (squash) June 2, 2026 19:42
@Meghana-Palaparthi Meghana-Palaparthi merged commit 0fa540d into main Jun 2, 2026
35 checks passed
@Meghana-Palaparthi Meghana-Palaparthi deleted the users/Meghana-Palaparthi/release-3.61.0 branch June 2, 2026 20:18
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.

4 participants