Skip to content

Commit dbbf5d2

Browse files
authored
Merge pull request #167 from clawdotnet/Dynamic-Native-LLM-Provider
Fix Issue #166: Dynamic Native LLM Provider Unavailable During Model Profile Construction
2 parents 6d03e2e + 49710c6 commit dbbf5d2

9 files changed

Lines changed: 435 additions & 11 deletions

src/OpenClaw.Gateway/Composition/RuntimeInitializationExtensions.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,12 @@ public static async Task<GatewayAppRuntime> InitializeOpenClawRuntimeAsync(
103103

104104
if (!services.ProviderRegistry.MarkDefault(config.Llm.Provider) && !services.ProviderRegistry.TryGet(config.Llm.Provider, out _))
105105
{
106-
var suffix = builtInInitError is null
107-
? string.Empty
108-
: $" Built-in provider initialization failed: {builtInInitError}.";
106+
var suffix = builtInInitError is null ? string.Empty : $" Built-in provider initialization failed: {builtInInitError}.";
109107
throw new InvalidOperationException(
110108
$"Configured provider '{config.Llm.Provider}' is not available.{suffix} " +
111109
"Register it as the built-in provider or via a compatible plugin.");
112110
}
111+
services.ModelProfiles.SetDefaultProfileId();
113112

114113
var chatClient = services.ProviderRegistry.TryGet("default", out var defaultRegistration) && defaultRegistration is not null
115114
? defaultRegistration.Client

src/OpenClaw.Gateway/Endpoints/AdminEndpoints.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,12 @@ public static void MapOpenClawAdminEndpoints(
8686
?? new SetupVerificationSnapshotStore(startup.Config.Memory.StoragePath);
8787
var modelProfiles = app.Services.GetService<IModelProfileRegistry>()
8888
?? runtime.Operations.ModelProfiles as IModelProfileRegistry
89-
?? new ConfiguredModelProfileRegistry(startup.Config, NullLogger<ConfiguredModelProfileRegistry>.Instance);
89+
?? ConfiguredModelProfileRegistry.CreateInitialized(startup.Config);
9090
var modelEvaluationRunner = app.Services.GetService<ModelEvaluationRunner>()
9191
?? new ModelEvaluationRunner(
9292
runtime.Operations.ModelProfiles as ConfiguredModelProfileRegistry
93-
?? new ConfiguredModelProfileRegistry(startup.Config, NullLogger<ConfiguredModelProfileRegistry>.Instance),
93+
?? modelProfiles as ConfiguredModelProfileRegistry
94+
?? ConfiguredModelProfileRegistry.CreateInitialized(startup.Config),
9495
startup.Config,
9596
NullLogger<ModelEvaluationRunner>.Instance);
9697
var redaction = app.Services.GetService<IRedactionPipeline>();

src/OpenClaw.Gateway/Endpoints/DiagnosticsEndpoints.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static void MapOpenClawDiagnosticsEndpoints(
2525
var operatorAccounts = app.Services.GetRequiredService<OperatorAccountService>();
2626
var modelProfiles = app.Services.GetService<IModelProfileRegistry>()
2727
?? runtime.Operations.ModelProfiles as IModelProfileRegistry
28-
?? new ConfiguredModelProfileRegistry(startup.Config, NullLogger<ConfiguredModelProfileRegistry>.Instance);
28+
?? ConfiguredModelProfileRegistry.CreateInitialized(startup.Config);
2929
var providerSmokeRegistry = app.Services.GetService<ProviderSmokeRegistry>()
3030
?? new ProviderSmokeRegistry();
3131

src/OpenClaw.Gateway/GatewayLlmExecutionService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,7 @@ private static string DecodeRouteSegment(string value)
898898
private static CompatibilityServices CreateCompatibilityServices(GatewayConfig config, LlmProviderRegistry registry)
899899
{
900900
var modelProfiles = new ConfiguredModelProfileRegistry(config, NullLogger<ConfiguredModelProfileRegistry>.Instance, registry);
901+
modelProfiles.SetDefaultProfileId();
901902
return new CompatibilityServices
902903
{
903904
Registry = modelProfiles,

src/OpenClaw.Gateway/Models/ConfiguredModelProfileRegistry.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Concurrent;
22
using Microsoft.Extensions.AI;
33
using Microsoft.Extensions.Logging;
4+
using Microsoft.Extensions.Logging.Abstractions;
45
using OpenClaw.Core.Abstractions;
56
using OpenClaw.Core.Models;
67
using OpenClaw.Core.Security;
@@ -26,6 +27,7 @@ internal sealed class Registration
2627
private readonly ILogger<ConfiguredModelProfileRegistry> _logger;
2728
private readonly LlmProviderRegistry? _providerRegistry;
2829
private readonly IVideoFrameExtractionService? _videoFrameExtraction;
30+
private readonly GatewayConfig _config;
2931

3032
public ConfiguredModelProfileRegistry(GatewayConfig config, ILogger<ConfiguredModelProfileRegistry> logger)
3133
: this(config, logger, null)
@@ -38,13 +40,27 @@ public ConfiguredModelProfileRegistry(
3840
LlmProviderRegistry? providerRegistry,
3941
IVideoFrameExtractionService? videoFrameExtraction = null)
4042
{
43+
_config = config;
4144
_logger = logger;
4245
_providerRegistry = providerRegistry;
4346
_videoFrameExtraction = videoFrameExtraction;
44-
DefaultProfileId = BuildRegistrations(config);
4547
}
4648

47-
public string? DefaultProfileId { get; }
49+
public string? DefaultProfileId { get; private set; }
50+
51+
internal static ConfiguredModelProfileRegistry CreateInitialized(GatewayConfig config)
52+
{
53+
var registry = new ConfiguredModelProfileRegistry(config, NullLogger<ConfiguredModelProfileRegistry>.Instance);
54+
registry.SetDefaultProfileId();
55+
return registry;
56+
}
57+
58+
public void SetDefaultProfileId()
59+
{
60+
if (DefaultProfileId is not null)
61+
return;
62+
DefaultProfileId = BuildRegistrations(_config);
63+
}
4864

4965
public bool TryGet(string profileId, out ModelProfile? profile)
5066
{

0 commit comments

Comments
 (0)