Fixed missing image capability validation after changing the model

This commit is contained in:
Thorsten Sommer 2026-08-02 19:20:49 +02:00
parent f1bcfbc2c0
commit 007f4992ea
Signed by untrusted user who does not match committer: tsommer
GPG Key ID: 371BBA77A02C0108
6 changed files with 49 additions and 4 deletions

View File

@ -2410,6 +2410,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
-- Creates a new version from the current sources and instructions while keeping the current structure and design.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2703645157"] = "Creates a new version from the current sources and instructions while keeping the current structure and design."
-- Images are not supported by the selected provider and model. Select a model with image support, or remove the image sources.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2720475627"] = "Images are not supported by the selected provider and model. Select a model with image support, or remove the image sources."
-- Import as copy
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2745663129"] = "Import as copy"

View File

@ -1,4 +1,6 @@
using AIStudio.Provider;
using AIStudio.Settings;
using AIStudio.Tools.Rust;
using ProviderSettings = AIStudio.Settings.Provider;
@ -15,6 +17,15 @@ public partial class VisualBriefingAssistant
/// </remarks>
private bool HasSourceMaterial => this.selectedBriefing?.Sources.Any(source => source.Kind is VisualBriefingSourceKind.SOURCE_MATERIAL) == true;
/// <summary>Gets whether any stored source reaches the model as an image.</summary>
/// <remarks>
/// Both source kinds can end up as an image: source preparation converts every visual asset into an
/// image attachment, and a source material file is attached as it is, where the attachment type is
/// derived from the file extension alone. Checking the extension therefore covers both, and it
/// matches the rule the attachment control already applies while a file is being added.
/// </remarks>
private bool HasImageSources => this.selectedBriefing?.Sources.Any(source => FileTypes.IsAllowedPath(source.Path, FileTypes.IMAGE)) == true;
/// <summary>Gets all current field, source, and revision issues shown below the actions.</summary>
/// <remarks>
/// This is the complete list for the user. The generate buttons disable themselves from the same
@ -53,6 +64,12 @@ public partial class VisualBriefingAssistant
}
/// <summary>Gets the issues with the stored sources, which block only the modes that read them.</summary>
/// <remarks>
/// The image check belongs here rather than to the fields, even though it depends on the selected
/// model: it only matters for the modes that hand the sources to the model at all. Changing just the
/// design reuses the stored evidence and sends no attachments, which is the same distinction the
/// build orchestrator makes before it runs source preparation.
/// </remarks>
private IReadOnlyList<string> SourceIssues
{
get
@ -64,6 +81,11 @@ public partial class VisualBriefingAssistant
if (!this.HasSourceMaterial)
issues.Add(T("Please add at least one source material file."));
// A model can be selected long after the images were attached, so the capability that was
// checked while attaching them has to be checked again here:
if (this.HasImageSources && this.editor.Provider != ProviderSettings.NONE && !this.editor.Provider.SupportsImageInput())
issues.Add(T("Images are not supported by the selected provider and model. Select a model with image support, or remove the image sources."));
foreach (var source in this.selectedBriefing.Sources)
{
var fileName = Path.GetFileName(source.Path);

View File

@ -2412,6 +2412,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
-- Creates a new version from the current sources and instructions while keeping the current structure and design.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2703645157"] = "Erstellt eine neue Version aus dem aktuellen Ausgangsmaterial und Anweisungen, wobei die bestehende Struktur und das Design beibehalten werden."
-- Images are not supported by the selected provider and model. Select a model with image support, or remove the image sources.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2720475627"] = "Bilder werden vom ausgewählten Anbieter und Modell nicht unterstützt. Wählen Sie ein Modell mit Bildunterstützung aus oder entfernen Sie die Bildquellen."
-- Import as copy
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2745663129"] = "Als Kopie importieren"

View File

@ -2412,6 +2412,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
-- Creates a new version from the current sources and instructions while keeping the current structure and design.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2703645157"] = "Creates a new version from the current sources and instructions while keeping the current structure and design."
-- Images are not supported by the selected provider and model. Select a model with image support, or remove the image sources.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2720475627"] = "Images are not supported by the selected provider and model. Select a model with image support, or remove the image sources."
-- Import as copy
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2745663129"] = "Import as copy"

View File

@ -15,6 +15,23 @@ public static partial class ProviderExtensions
return provider.CapabilityOverrides?.ApplyTo(automaticCapabilities) ?? automaticCapabilities;
}
/// <summary>
/// Get whether the model used by the configured provider accepts images as input.
/// </summary>
/// <remarks>
/// Two capabilities express image input, one for a single image and one for several. Anything that
/// wants to know whether an image may be sent has to accept both, which is why the question is asked
/// here instead of at each call site: attaching a file and validating an already attached file must
/// never disagree about it.
/// </remarks>
/// <param name="provider">The configured provider.</param>
/// <returns><c>true</c> when the model accepts image input.</returns>
public static bool SupportsImageInput(this Provider provider)
{
var capabilities = provider.GetModelCapabilities();
return capabilities.Contains(Capability.SINGLE_IMAGE_INPUT) || capabilities.Contains(Capability.MULTIPLE_IMAGE_INPUT);
}
/// <summary>
/// Get the capabilities of a model for a specific provider.
/// </summary>

View File

@ -1,4 +1,3 @@
using AIStudio.Provider;
using AIStudio.Settings;
using AIStudio.Tools.PluginSystem;
using AIStudio.Tools.Rust;
@ -59,7 +58,6 @@ public static class FileExtensionValidation
return false;
}
var capabilities = provider?.GetModelCapabilities() ?? new();
if (FileTypes.IsAllowedPath(filePath, FileTypes.IMAGE))
{
switch (useCae)
@ -76,8 +74,7 @@ public static class FileExtensionValidation
return true;
// In this use case, we can check the provider capabilities:
case UseCase.ATTACHING_CONTENT when capabilities.Contains(Capability.SINGLE_IMAGE_INPUT) ||
capabilities.Contains(Capability.MULTIPLE_IMAGE_INPUT):
case UseCase.ATTACHING_CONTENT when provider?.SupportsImageInput() is true:
return true;
// We know that images are not supported: