Model access is through IModelProvider (src/SharpClaw.Code.Providers/Abstractions/IModelProvider.cs):
ProviderName— stable id used byIModelProviderResolverGetAuthStatusAsyncStartStreamAsync— returnsProviderStreamHandlewithIAsyncEnumerable<ProviderEvent>
Registered implementations (see ProvidersServiceCollectionExtensions):
AnthropicProvider— HTTP client fromAnthropicProviderOptionsOpenAiCompatibleProvider— HTTP client fromOpenAiCompatibleProviderOptions
Both are registered as IModelProvider singletons; ModelProviderResolver builds a case-insensitive dictionary by ProviderName.
ProviderRequestPreflight (IProviderRequestPreflight) normalizes ProviderRequest:
- Applies
ProviderCatalogOptions.ModelAliases(e.g."default"→ provider + model id). - Supports qualified model forms (implementation parses
provider/model). - Fills default provider name from
ProviderCatalogOptions.DefaultProviderwhen missing.
Default catalog (ProviderCatalogOptions) uses DefaultProvider = "openai-compatible" if not configured.
When using AddSharpClawRuntime(IConfiguration) (CLI host):
| Section | Options type |
|---|---|
SharpClaw:Providers:Catalog |
ProviderCatalogOptions |
SharpClaw:Providers:Anthropic |
AnthropicProviderOptions (ProviderName defaults to "anthropic", BaseUrl, API key binding as in options class) |
SharpClaw:Providers:OpenAiCompatible |
OpenAiCompatibleProviderOptions (ProviderName defaults to "openai-compatible") |
There is no checked-in appsettings.json in the repo; add one next to the CLI project or rely on environment variables / user secrets per standard .NET configuration.
IAuthFlowService / AuthFlowService answer whether a provider name is authenticated (used by ProviderBackedAgentKernel). If not authenticated, the kernel may return a placeholder completion (see kernel logs) rather than calling the remote API.
Hard failures use ProviderExecutionException with ProviderFailureKind: MissingProvider, AuthenticationUnavailable, StreamFailed.
- Implement
IModelProvider(stream events usingProviderEventfrom Protocol). - Register the implementation in
ProvidersServiceCollectionExtensions(or a testIServiceCollection) asAddSingleton<IModelProvider, YourProvider>. - Ensure
ModelProviderResolvercan resolve yourProviderName(unique among registered providers). - Extend
ProviderCatalogOptions(defaults / aliases) viaIConfigurationorConfigure<ProviderCatalogOptions>/PostConfigure.
Test pattern: SharpClaw.Code.MockProvider registers DeterministicMockModelProvider with PostConfigure<ProviderCatalogOptions> so default maps to provider name mock (MockProviderServiceCollectionExtensions).