Skip to content

Commit 3c3ebe6

Browse files
committed
PR feedback: Add an extension method to handle Ollama's resilience handler settings instead of the hardcoded calls in Web/Program.cs
1 parent e2c700b commit 3c3ebe6

File tree

6 files changed

+86
-39
lines changed

6 files changed

+86
-39
lines changed

src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/.template.config/template.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,17 @@
6060
"ChatWithCustomData-CSharp.AppHost/**",
6161
"ChatWithCustomData-CSharp.ServiceDefaults/**",
6262
"ChatWithCustomData-CSharp.Web/Program.Aspire.cs",
63+
"ChatWithCustomData-CSharp.Web/AspireOllamaResilienceHandlerExtensions.cs",
6364
"README.Aspire.md",
6465
"*.sln"
6566
]
6667
},
68+
{
69+
"condition": "(IsAspire && !IsOllama)",
70+
"exclude": [
71+
"ChatWithCustomData-CSharp.Web/AspireOllamaResilienceHandlerExtensions.cs"
72+
]
73+
},
6774
{
6875
"condition": "(IsAspire)",
6976
"exclude": [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
namespace ChatWithCustomData_CSharp.Web.Services;
5+
6+
public static class AspireOllamaResilienceHandlerExtensions
7+
{
8+
public static IServiceCollection AddOllamaHttpClientResilience(this IServiceCollection services)
9+
{
10+
services.ConfigureHttpClientDefaults(http =>
11+
{
12+
#pragma warning disable EXTEXP0001 // RemoveAllResilienceHandlers is experimental
13+
http.RemoveAllResilienceHandlers();
14+
#pragma warning restore EXTEXP0001
15+
16+
// Turn on resilience by default
17+
http.AddStandardResilienceHandler(config =>
18+
{
19+
// Extend the HTTP Client timeout for Ollama
20+
config.AttemptTimeout.Timeout = TimeSpan.FromMinutes(3);
21+
22+
// Must be at least double the AttemptTimeout to pass options validation
23+
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
24+
config.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(10);
25+
});
26+
27+
// Turn on service discovery by default
28+
http.AddServiceDiscovery();
29+
});
30+
31+
return services;
32+
}
33+
}
34+

src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/ChatWithCustomData-CSharp.Web/Program.Aspire.cs

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -51,36 +51,11 @@
5151
builder.Services.AddScoped<DataIngestor>();
5252
builder.Services.AddSingleton<SemanticSearch>();
5353
#if (IsOllama)
54-
// Get the IHttpClientBuilder for chat_httpClient
55-
var chatClientBuilder = builder.Services.AddHttpClient("chat_httpClient");
56-
#pragma warning disable EXTEXP0001 // RemoveAllResilienceHandlers is experimental
57-
chatClientBuilder.RemoveAllResilienceHandlers();
58-
#pragma warning restore EXTEXP0001
59-
// Override resilience for this client
60-
chatClientBuilder.AddStandardResilienceHandler(config =>
61-
{
62-
// Extend the HTTP Client timeout for Ollama
63-
config.AttemptTimeout.Timeout = TimeSpan.FromMinutes(3);
64-
// Must be at least double the AttemptTimeout to pass options validation
65-
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
66-
config.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(10);
67-
});
68-
chatClientBuilder.AddServiceDiscovery();
69-
// Get the IHttpClientBuilder for embeddings_httpClient
70-
var embeddingsClientBuilder = builder.Services.AddHttpClient("embeddings_httpClient");
71-
#pragma warning disable EXTEXP0001 // RemoveAllResilienceHandlers is experimental
72-
embeddingsClientBuilder.RemoveAllResilienceHandlers();
73-
#pragma warning restore EXTEXP0001
74-
// Override resilience for this client
75-
embeddingsClientBuilder.AddStandardResilienceHandler(config =>
76-
{
77-
// Extend the HTTP Client timeout for Ollama
78-
config.AttemptTimeout.Timeout = TimeSpan.FromMinutes(3);
79-
// Must be at least double the AttemptTimeout to pass options validation
80-
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
81-
config.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(10);
82-
});
83-
embeddingsClientBuilder.AddServiceDiscovery();
54+
// Applies robust HTTP resilience settings for all HttpClients in the Web project,
55+
// not across the entire solution. It's aimed at supporting Ollama scenarios due
56+
// to its self-hosted nature and potentially slow responses.
57+
// Remove this if you want to use the global or a different HTTP resilience policy instead.
58+
builder.Services.AddOllamaHttpClientResilience();
8459
#endif
8560

8661
var app = builder.Build();

test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.Ollama_Qdrant.verified/aichatweb/aichatweb.ServiceDefaults/Extensions.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,7 @@ public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where
3030
#pragma warning restore EXTEXP0001
3131

3232
// Turn on resilience by default
33-
http.AddStandardResilienceHandler(config =>
34-
{
35-
// Extend the HTTP Client timeout for Ollama
36-
config.AttemptTimeout.Timeout = TimeSpan.FromMinutes(3);
37-
38-
// Must be at least double the AttemptTimeout to pass options validation
39-
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
40-
config.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(10);
41-
});
33+
http.AddStandardResilienceHandler();
4234

4335
// Turn on service discovery by default
4436
http.AddServiceDiscovery();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
namespace aichatweb.Web.Services;
5+
6+
public static class AspireOllamaResilienceHandlerExtensions
7+
{
8+
public static IServiceCollection AddOllamaHttpClientResilience(this IServiceCollection services)
9+
{
10+
services.ConfigureHttpClientDefaults(http =>
11+
{
12+
#pragma warning disable EXTEXP0001 // RemoveAllResilienceHandlers is experimental
13+
http.RemoveAllResilienceHandlers();
14+
#pragma warning restore EXTEXP0001
15+
16+
// Turn on resilience by default
17+
http.AddStandardResilienceHandler(config =>
18+
{
19+
// Extend the HTTP Client timeout for Ollama
20+
config.AttemptTimeout.Timeout = TimeSpan.FromMinutes(3);
21+
22+
// Must be at least double the AttemptTimeout to pass options validation
23+
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
24+
config.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(10);
25+
});
26+
27+
// Turn on service discovery by default
28+
http.AddServiceDiscovery();
29+
});
30+
31+
return services;
32+
}
33+
}
34+

test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.Ollama_Qdrant.verified/aichatweb/aichatweb.Web/Program.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
builder.Services.AddQdrantCollection<Guid, IngestedDocument>("data-aichatweb-documents");
2121
builder.Services.AddScoped<DataIngestor>();
2222
builder.Services.AddSingleton<SemanticSearch>();
23+
// Applies robust HTTP resilience settings for all HttpClients in the Web project,
24+
// not across the entire solution. It's aimed at supporting Ollama scenarios due
25+
// to its self-hosted nature and potentially slow responses.
26+
// Remove this if you want to use the global or a different HTTP resilience policy instead.
27+
builder.Services.AddOllamaHttpClientResilience();
2328

2429
var app = builder.Build();
2530

0 commit comments

Comments
 (0)