2026-10-21 13:52:26 +02:00
using AIStudio.Chat ;
using AIStudio.Provider ;
2026-10-22 10:57:04 +02:00
using AIStudio.Provider.SelfHosted ;
2026-10-21 13:52:26 +02:00
namespace AIStudio.Tests.Provider ;
/// <summary>
/// Checks how large an image may be when we send it through a provider.
/// </summary>
/// <remarks>
2026-10-22 10:57:04 +02:00
/// A provider or a self-hosted engine states its limit or says nothing. Either way, we never send
/// more than our own limit, so a larger limit of a provider must never reach the image preparation.
2026-10-21 13:52:26 +02:00
/// </remarks>
[TestFixture]
public sealed class ImageSizeLimitTests
{
[Test]
public void AnthropicLeavesRoomForTheBase64OfTheImage ()
{
2026-11-01 20:32:16 +01:00
using ( Assert . EnterMultipleScope ())
2026-10-21 13:52:26 +02:00
{
Assert . That ( LLMProviders . ANTHROPIC . GetMaxImageSizeBytes (), Is . EqualTo ( 3_932_160 ));
2026-10-22 10:57:04 +02:00
Assert . That ( IImageSourceExtensions . MaxImageSizeBytesFor ( ProviderOf ( LLMProviders . ANTHROPIC )), Is . EqualTo ( 3_932_160 ));
2026-11-01 20:32:16 +01:00
}
2026-10-21 13:52:26 +02:00
}
[Test]
public void AProviderWithoutAStatedLimitGetsOurOwn ()
{
2026-11-01 20:32:16 +01:00
using ( Assert . EnterMultipleScope ())
2026-10-21 13:52:26 +02:00
{
Assert . That ( LLMProviders . OPEN_AI . GetMaxImageSizeBytes (), Is . Null , "Nobody stated a limit, and no number stands in for that." );
2026-10-22 10:57:04 +02:00
Assert . That ( IImageSourceExtensions . MaxImageSizeBytesFor ( ProviderOf ( LLMProviders . OPEN_AI )), Is . EqualTo ( IImageSourceExtensions . MAX_IMAGE_SIZE_BYTES ));
2026-11-01 20:32:16 +01:00
}
2026-10-21 13:52:26 +02:00
}
[Test]
2026-10-22 10:57:04 +02:00
public void LlmmanLeavesRoomForTheTextOfTheConversation ()
2026-10-21 13:52:26 +02:00
{
2026-11-01 20:32:16 +01:00
using ( Assert . EnterMultipleScope ())
2026-10-21 13:52:26 +02:00
{
2026-10-22 10:57:04 +02:00
Assert . That ( Host . LLMMAN . GetMaxImageSizeBytes (), Is . EqualTo ( 1_048_576 ));
Assert . That ( IImageSourceExtensions . MaxImageSizeBytesFor ( ProviderOf ( LLMProviders . SELF_HOSTED , Host . LLMMAN )), Is . EqualTo ( 1_048_576 ));
Assert . That ( IImageSourceExtensions . MaxImageSizeBytesFor ( ProviderOf ( LLMProviders . SELF_HOSTED , Host . OLLAMA )), Is . EqualTo ( IImageSourceExtensions . MAX_IMAGE_SIZE_BYTES ), "Ollama states no limit we know of." );
2026-11-01 20:32:16 +01:00
}
2026-10-21 13:52:26 +02:00
}
2026-10-22 10:57:04 +02:00
[Test]
public void AnEngineCountsOnlyForSelfHostedProviders ()
{
// A provider keeps the host it was once configured with, even after somebody switched it
// to a cloud provider in the dialog:
var cloudProviderWithAnOldHost = ProviderOf ( LLMProviders . OPEN_AI , Host . LLMMAN );
Assert . That ( IImageSourceExtensions . MaxImageSizeBytesFor ( cloudProviderWithAnOldHost ), Is . EqualTo ( IImageSourceExtensions . MAX_IMAGE_SIZE_BYTES ));
}
[Test]
public void NoProviderGetsMoreThanOurOwnLimit ()
{
2026-11-01 20:32:16 +01:00
using ( Assert . EnterMultipleScope ())
2026-10-22 10:57:04 +02:00
{
foreach ( var llmProvider in Enum . GetValues < LLMProviders >())
foreach ( var host in Enum . GetValues < Host >())
Assert . That ( IImageSourceExtensions . MaxImageSizeBytesFor ( ProviderOf ( llmProvider , host )), Is . LessThanOrEqualTo ( IImageSourceExtensions . MAX_IMAGE_SIZE_BYTES ), $"{llmProvider} with {host}" );
2026-11-01 20:32:16 +01:00
}
2026-10-22 10:57:04 +02:00
}
private static AIStudio . Settings . Provider ProviderOf ( LLMProviders llmProvider , Host host = Host . NONE ) => new ( 0 , "test" , "Test" , llmProvider , new AIStudio . Provider . Model ( "model" , null ), Host : host );
2026-10-21 13:52:26 +02:00
}