Skip to content

Commit 8f68f90

Browse files
ViveliDuChjeffhandley
authored andcommitted
Scope Ollama resilience settings to Web/Program.cs and restore ServiceDefaults (#6850)
Move Ollama-specific HTTP client resiliency configuration out of Extensions.cs in ServiceDefaults to an extension method called later in Web/Program.cs.
1 parent 1da25b8 commit 8f68f90

File tree

7 files changed

+87
-22
lines changed

7 files changed

+87
-22
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@
6464
"*.sln"
6565
]
6666
},
67+
{
68+
"condition": "(!IsAspire || !IsOllama)",
69+
"exclude": [
70+
"ChatWithCustomData-CSharp.Web/OllamaResilienceHandlerExtensions.cs"
71+
]
72+
},
6773
{
6874
"condition": "(IsAspire)",
6975
"exclude": [

src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/ChatWithCustomData-CSharp.ServiceDefaults/Extensions.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,8 @@ public static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where
2929
http.RemoveAllResilienceHandlers();
3030
#pragma warning restore EXTEXP0001
3131

32-
#if (IsOllama)
33-
// Turn on resilience by default
34-
http.AddStandardResilienceHandler(config =>
35-
{
36-
// Extend the HTTP Client timeout for Ollama
37-
config.AttemptTimeout.Timeout = TimeSpan.FromMinutes(3);
38-
39-
// Must be at least double the AttemptTimeout to pass options validation
40-
config.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(10);
41-
config.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(10);
42-
});
43-
#else
4432
// Turn on resilience by default
4533
http.AddStandardResilienceHandler();
46-
#endif
4734

4835
// Turn on service discovery by default
4936
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 ChatWithCustomData_CSharp.Web.Services;
5+
6+
public static class OllamaResilienceHandlerExtensions
7+
{
8+
public static IServiceCollection AddOllamaResilienceHandler(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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@
5050
#endif
5151
builder.Services.AddScoped<DataIngestor>();
5252
builder.Services.AddSingleton<SemanticSearch>();
53+
#if (IsOllama)
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.AddOllamaResilienceHandler();
59+
#endif
5360

5461
var app = builder.Build();
5562

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 OllamaResilienceHandlerExtensions
7+
{
8+
public static IServiceCollection AddOllamaResilienceHandler(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.AddOllamaResilienceHandler();
2328

2429
var app = builder.Build();
2530

0 commit comments

Comments
 (0)