Skip to content

Commit c110e54

Browse files
authored
[System.ClientModel] Add support for configurable max cache size in ClientCache (Azure#49298)
[System.ClientModel] Configure maxCacheSize in ClientCache
1 parent 3a3faf0 commit c110e54

File tree

14 files changed

+122
-26
lines changed

14 files changed

+122
-26
lines changed

sdk/ai/Azure.AI.Inference/src/Azure.AI.Inference.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
</ItemGroup>
1818
<ItemGroup>
1919
<PackageReference Include="Azure.Core" />
20-
<PackageReference Include="System.ClientModel" VersionOverride="1.4.0-beta.1" />
20+
</ItemGroup>
21+
22+
<ItemGroup>
23+
<ProjectReference Include="..\..\..\core\System.ClientModel\src\System.ClientModel.csproj" />
2124
</ItemGroup>
2225

2326
</Project>

sdk/ai/Azure.AI.Projects/api/Azure.AI.Projects.net8.0.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -460,11 +460,11 @@ public static partial class AIClientModelFactory
460460
}
461461
public partial class AIProjectClient : System.ClientModel.Primitives.ConnectionProvider
462462
{
463-
protected AIProjectClient() { }
464-
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential = null) { }
465-
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) { }
466-
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential) { }
467-
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) { }
463+
protected AIProjectClient() : base (default(int)) { }
464+
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential = null) : base (default(int)) { }
465+
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) : base (default(int)) { }
466+
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential) : base (default(int)) { }
467+
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) : base (default(int)) { }
468468
public virtual Azure.Core.Pipeline.HttpPipeline Pipeline { get { throw null; } }
469469
public virtual Azure.AI.Projects.AgentsClient GetAgentsClient(string apiVersion = "2024-07-01-preview") { throw null; }
470470
public override System.Collections.Generic.IEnumerable<System.ClientModel.Primitives.ClientConnection> GetAllConnections() { throw null; }
@@ -476,6 +476,7 @@ public AIProjectClient(System.Uri endpoint, string subscriptionId, string resour
476476
public partial class AIProjectClientOptions : Azure.Core.ClientOptions
477477
{
478478
public AIProjectClientOptions(Azure.AI.Projects.AIProjectClientOptions.ServiceVersion version = Azure.AI.Projects.AIProjectClientOptions.ServiceVersion.V2024_07_01_Preview) { }
479+
public int ClientCacheSize { get { throw null; } set { } }
479480
public enum ServiceVersion
480481
{
481482
V2024_07_01_Preview = 1,

sdk/ai/Azure.AI.Projects/api/Azure.AI.Projects.netstandard2.0.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -460,11 +460,11 @@ public static partial class AIClientModelFactory
460460
}
461461
public partial class AIProjectClient : System.ClientModel.Primitives.ConnectionProvider
462462
{
463-
protected AIProjectClient() { }
464-
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential = null) { }
465-
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) { }
466-
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential) { }
467-
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) { }
463+
protected AIProjectClient() : base (default(int)) { }
464+
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential = null) : base (default(int)) { }
465+
public AIProjectClient(string connectionString, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) : base (default(int)) { }
466+
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential) : base (default(int)) { }
467+
public AIProjectClient(System.Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, Azure.Core.TokenCredential credential, Azure.AI.Projects.AIProjectClientOptions options) : base (default(int)) { }
468468
public virtual Azure.Core.Pipeline.HttpPipeline Pipeline { get { throw null; } }
469469
public virtual Azure.AI.Projects.AgentsClient GetAgentsClient(string apiVersion = "2024-07-01-preview") { throw null; }
470470
public override System.Collections.Generic.IEnumerable<System.ClientModel.Primitives.ClientConnection> GetAllConnections() { throw null; }
@@ -476,6 +476,7 @@ public AIProjectClient(System.Uri endpoint, string subscriptionId, string resour
476476
public partial class AIProjectClientOptions : Azure.Core.ClientOptions
477477
{
478478
public AIProjectClientOptions(Azure.AI.Projects.AIProjectClientOptions.ServiceVersion version = Azure.AI.Projects.AIProjectClientOptions.ServiceVersion.V2024_07_01_Preview) { }
479+
public int ClientCacheSize { get { throw null; } set { } }
479480
public enum ServiceVersion
480481
{
481482
V2024_07_01_Preview = 1,

sdk/ai/Azure.AI.Projects/src/Azure.AI.Projects.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414

1515
<ItemGroup>
1616
<PackageReference Include="Azure.Core" />
17-
<PackageReference Include="System.ClientModel" VersionOverride="1.4.0-beta.1" />
1817
<PackageReference Include="Azure.Identity" />
1918
</ItemGroup>
2019

20+
<ItemGroup>
21+
<ProjectReference Include="..\..\..\core\System.ClientModel\src\System.ClientModel.csproj" />
22+
</ItemGroup>
23+
2124
<!-- Shared source from Azure.Core -->
2225
<ItemGroup>
2326
<Compile Include="$(AzureCoreSharedSources)ArrayBufferWriter.cs" LinkBase="Shared" />

sdk/ai/Azure.AI.Projects/src/Custom/AIProjectClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public AIProjectClient(string connectionString, TokenCredential credential, AIPr
5454
/// <exception cref="ArgumentNullException"> <paramref name="endpoint"/>, <paramref name="subscriptionId"/>, <paramref name="resourceGroupName"/>, <paramref name="projectName"/> or <paramref name="credential"/> is null. </exception>
5555
/// <exception cref="ArgumentException"> <paramref name="subscriptionId"/>, <paramref name="resourceGroupName"/> or <paramref name="projectName"/> is an empty string, and was expected to be non-empty. </exception>
5656
public AIProjectClient(Uri endpoint, string subscriptionId, string resourceGroupName, string projectName, TokenCredential credential, AIProjectClientOptions options)
57+
: base(options.ClientCacheSize)
5758
{
5859
Argument.AssertNotNull(endpoint, nameof(endpoint));
5960
Argument.AssertNotNullOrEmpty(subscriptionId, nameof(subscriptionId));
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using Azure.Core;
5+
6+
namespace Azure.AI.Projects
7+
{
8+
/// <summary> Client options for AIProjectClient. </summary>
9+
public partial class AIProjectClientOptions : ClientOptions
10+
{
11+
/// <summary> The size of the client cache. </summary>
12+
public int ClientCacheSize { get; set; }
13+
}
14+
}

sdk/core/System.ClientModel/api/System.ClientModel.net6.0.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public enum ClientAuthenticationMethod
9090
}
9191
public partial class ClientCache
9292
{
93-
public ClientCache() { }
93+
public ClientCache(int maxSize = 100) { }
9494
public T GetClient<T>(System.Func<T> createClient, string? id) where T : class { throw null; }
9595
}
9696
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
@@ -182,7 +182,7 @@ public void AddRange(System.Collections.Generic.IEnumerable<System.ClientModel.P
182182
}
183183
public abstract partial class ConnectionProvider
184184
{
185-
protected ConnectionProvider() { }
185+
protected ConnectionProvider(int maxCacheSize = 100) { }
186186
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
187187
public System.ClientModel.Primitives.ClientCache Subclients { get { throw null; } }
188188
public abstract System.Collections.Generic.IEnumerable<System.ClientModel.Primitives.ClientConnection> GetAllConnections();

sdk/core/System.ClientModel/api/System.ClientModel.net8.0.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public enum ClientAuthenticationMethod
9090
}
9191
public partial class ClientCache
9292
{
93-
public ClientCache() { }
93+
public ClientCache(int maxSize = 100) { }
9494
public T GetClient<T>(System.Func<T> createClient, string? id) where T : class { throw null; }
9595
}
9696
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
@@ -182,7 +182,7 @@ public void AddRange(System.Collections.Generic.IEnumerable<System.ClientModel.P
182182
}
183183
public abstract partial class ConnectionProvider
184184
{
185-
protected ConnectionProvider() { }
185+
protected ConnectionProvider(int maxCacheSize = 100) { }
186186
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
187187
public System.ClientModel.Primitives.ClientCache Subclients { get { throw null; } }
188188
public abstract System.Collections.Generic.IEnumerable<System.ClientModel.Primitives.ClientConnection> GetAllConnections();

sdk/core/System.ClientModel/api/System.ClientModel.netstandard2.0.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public enum ClientAuthenticationMethod
9090
}
9191
public partial class ClientCache
9292
{
93-
public ClientCache() { }
93+
public ClientCache(int maxSize = 100) { }
9494
public T GetClient<T>(System.Func<T> createClient, string? id) where T : class { throw null; }
9595
}
9696
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
@@ -182,7 +182,7 @@ public void AddRange(System.Collections.Generic.IEnumerable<System.ClientModel.P
182182
}
183183
public abstract partial class ConnectionProvider
184184
{
185-
protected ConnectionProvider() { }
185+
protected ConnectionProvider(int maxCacheSize = 100) { }
186186
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
187187
public System.ClientModel.Primitives.ClientCache Subclients { get { throw null; } }
188188
public abstract System.Collections.Generic.IEnumerable<System.ClientModel.Primitives.ClientConnection> GetAllConnections();

sdk/core/System.ClientModel/src/Convenience/ClientCache.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,16 @@ public class ClientCache
1717
private readonly Dictionary<(Type, string), ClientEntry> _clients = new();
1818
private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.SupportsRecursion);
1919

20-
private const int MaxCacheSize = 100;
20+
private readonly int _maxSize;
21+
22+
/// <summary>
23+
/// Initializes the ClientCache with a configurable cache size.
24+
/// </summary>
25+
/// <param name="maxSize">The maximum number of clients to store in the cache.</param>
26+
public ClientCache(int maxSize = 100)
27+
{
28+
_maxSize = maxSize;
29+
}
2130

2231
/// <summary>
2332
/// Retrieves a client from the cache or creates a new one if it doesn't exist.
@@ -46,7 +55,7 @@ public T GetClient<T>(Func<T> createClient, string? id) where T : class
4655
_clients[key] = new ClientEntry(created, Stopwatch.GetTimestamp());
4756

4857
// After insertion, if cache exceeds the limit, perform cleanup.
49-
if (_clients.Count > MaxCacheSize)
58+
if (_clients.Count > _maxSize)
5059
{
5160
Cleanup();
5261
}
@@ -63,7 +72,7 @@ public T GetClient<T>(Func<T> createClient, string? id) where T : class
6372
/// </summary>
6473
private void Cleanup()
6574
{
66-
int excess = _clients.Count - MaxCacheSize;
75+
int excess = _clients.Count - _maxSize;
6776
if (excess <= 0)
6877
{
6978
return;

0 commit comments

Comments
 (0)