Coverage Service
Check AI model availability across Civitai infrastructure before submitting jobs.
Check Single Model
var checkpointModel = new AirIdentifier(
AirEcosystem.StableDiffusionXl,
AirAssetType.Checkpoint,
AirSource.Civitai,
modelId: 4201,
versionId: 130072);
var checkpointModelFromBuilder = new AirBuilder()
.WithEcosystem(AirEcosystem.StableDiffusionXl)
.WithAssetType(AirAssetType.Checkpoint)
.WithSource(AirSource.Civitai)
.WithModelId(4201)
.WithVersionId(130072)
.Build();
var coverageResult = await sdkClient.Coverage.GetAsync(checkpointModel, cancellationToken);
if (coverageResult is Result<ProviderAssetAvailability>.Success coverageSuccess)
{
Console.WriteLine($"Availability: {coverageSuccess.Data.Availability}");
Console.WriteLine($"Workers: {coverageSuccess.Data.Workers}");
if (coverageSuccess.Data.Availability == AvailabilityStatus.Available)
{
Console.WriteLine($"Model is available with {coverageSuccess.Data.Workers} workers");
}
}
Check Multiple Models
var checkpointModelBatch = new AirIdentifier(
AirEcosystem.StableDiffusionXl,
AirAssetType.Checkpoint,
AirSource.Civitai,
modelId: 4201,
versionId: 130072);
var loraModel = new AirIdentifier(
AirEcosystem.StableDiffusionXl,
AirAssetType.Lora,
AirSource.Civitai,
modelId: 328553,
versionId: 368189);
var vaeModel = new AirIdentifier(
AirEcosystem.StableDiffusion1,
AirAssetType.Vae,
AirSource.Civitai,
modelId: 22354,
versionId: 123456);
AirIdentifier[] modelsToCheck = [checkpointModelBatch, loraModel, vaeModel];
var batchCoverageResult = await sdkClient.Coverage.GetAsync(modelsToCheck, cancellationToken);
if (batchCoverageResult is Result<IReadOnlyDictionary<AirIdentifier, ProviderAssetAvailability>>.Success batchSuccess)
{
foreach (var (modelIdentifier, availability) in batchSuccess.Data)
{
Console.WriteLine($"{modelIdentifier}: {availability.Availability} (Workers: {availability.Workers})");
}
}
Result Properties
ProviderAssetAvailability:
Availability- Status (Available,Unavailable,Degraded)Workers- Worker count (0 = unavailable)
AvailabilityStatus:
Available- Ready for generationUnavailable- Not availableDegraded- Limited capacity
JobSupport:
Unsupported- Provider doesn't support modelUnavailable- Temporarily unavailableAvailable- Ready to process
Availability Checking
// Check if a model is available and get status
var availabilityModel = new AirIdentifier(
AirEcosystem.StableDiffusionXl,
AirAssetType.Checkpoint,
AirSource.Civitai,
modelId: 4201,
versionId: 130072);
var availabilityResult = await sdkClient.Coverage.GetAsync(availabilityModel);
if (availabilityResult is Result<ProviderAssetAvailability>.Success availabilitySuccess)
{
var status = availabilitySuccess.Data.Availability;
switch (status)
{
case AvailabilityStatus.Available:
Console.WriteLine($"Model is ready ({availabilitySuccess.Data.Workers} workers)");
break;
case AvailabilityStatus.Unavailable:
Console.WriteLine("Model is not available");
break;
default:
Console.WriteLine($"Model status: {status}");
break;
}
}
Error Handling
var errorHandlingModel = new AirIdentifier(
AirEcosystem.StableDiffusionXl,
AirAssetType.Checkpoint,
AirSource.Civitai,
modelId: 4201,
versionId: 130072);
var errorResult = await sdkClient.Coverage.GetAsync(errorHandlingModel);
switch (errorResult)
{
case Result<ProviderAssetAvailability>.Success success:
if (success.Data.Availability == AvailabilityStatus.Available)
{
Console.WriteLine($"Model is available ({success.Data.Workers} workers)");
}
else
{
Console.WriteLine($"Model status: {success.Data.Availability}");
}
break;
case Result<ProviderAssetAvailability>.Failure failure:
Console.WriteLine($"Error: {failure.Error.Message}");
// Proceed anyway - coverage check is optional
break;
}
Best Practices
- Cache coverage results
- Batch checks when possible
- Make coverage checks optional
- Use for resource discovery