Added audio and video transcription for chats and assistants (#856)
Build and Release / Determine run mode (push) Waiting to run
Build and Release / Read metadata (push) Blocked by required conditions
Build and Release / Sync Flatpak repo (push) Blocked by required conditions
Build and Release / Collect Flatpak artifacts (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Prepare & create release (push) Blocked by required conditions
Build and Release / Publish release (push) Blocked by required conditions

This commit is contained in:
Thorsten Sommer authored and GitHub committed 2026-07-15 12:53:30 +02:00
1 parent 5dc6282908
commit aaf77b6882
83 files changed
+5985 -442

No files matched your search

@@ -0,0 +1,15 @@
using AIStudio.Chat;
namespace AIStudio.Tools.Media;
/// <summary>Pending media results waiting for one concrete UI target.</summary>
public sealed record MediaImportDelivery
{
public required MediaImportTarget Target { get; init; }
public IReadOnlyList<FileAttachment> Attachments { get; init; } = [];
public string? Text { get; init; }
public bool IsEmpty => this.Attachments.Count is 0 && this.Text is null;
}
@@ -0,0 +1,6 @@
using AIStudio.Tools.Rust;
namespace AIStudio.Tools.Media;
/// <summary>One user-visible failure retained until its owner is displayed.</summary>
public sealed record MediaImportFailure(string FileName, string UserMessage, MediaJobErrorCode? ErrorCode = null);
@@ -0,0 +1,13 @@
namespace AIStudio.Tools.Media;
/// <summary>Terminal batch outcome retained until its owner is displayed.</summary>
public sealed record MediaImportOutcome
{
public required MediaImportOwner Owner { get; init; }
public required MediaImportStatus Status { get; init; }
public IReadOnlyList<MediaImportFailure> Failures { get; init; } = [];
public IReadOnlyList<MediaImportWarning> Warnings { get; init; } = [];
}
@@ -0,0 +1,11 @@
using AIStudio.Tools.AssistantSessions;
namespace AIStudio.Tools.Media;
/// <summary>Identifies the chat or assistant that owns a media import.</summary>
public readonly record struct MediaImportOwner(MediaImportOwnerKind Kind, string Id)
{
public static MediaImportOwner ForChat(Guid chatId) => new(MediaImportOwnerKind.CHAT, chatId.ToString("N"));
public static MediaImportOwner ForAssistant(AssistantSessionKey key) => new(MediaImportOwnerKind.ASSISTANT, key.ToString());
}
@@ -0,0 +1,8 @@
namespace AIStudio.Tools.Media;
/// <summary>Supported persistent media-operation owners.</summary>
public enum MediaImportOwnerKind
{
CHAT,
ASSISTANT,
}
@@ -0,0 +1,19 @@
namespace AIStudio.Tools.Media;
/// <summary>Copied owner-specific state suitable for rendering after navigation.</summary>
public sealed record MediaImportSnapshot
{
public required MediaImportOwner Owner { get; init; }
public required MediaImportTarget Target { get; init; }
public required MediaTranscriptionPhase Phase { get; init; }
public required MediaImportStatus Status { get; init; }
public string CurrentFileName { get; init; } = string.Empty;
public double? Progress { get; init; }
public bool IsBusy => this.Status is MediaImportStatus.QUEUED or MediaImportStatus.RUNNING or MediaImportStatus.CANCELING;
}
@@ -0,0 +1,13 @@
namespace AIStudio.Tools.Media;
/// <summary>Lifecycle status retained independently for each owner.</summary>
public enum MediaImportStatus
{
QUEUED,
RUNNING,
CANCELING,
SUCCEEDED,
WARNING,
FAILED,
CANCELLED,
}
@@ -0,0 +1,4 @@
namespace AIStudio.Tools.Media;
/// <summary>Identifies the concrete attachment or file-content field inside an owner.</summary>
public readonly record struct MediaImportTarget(MediaImportOwner Owner, string TargetId);
@@ -0,0 +1,4 @@
namespace AIStudio.Tools.Media;
/// <summary>One user-visible media warning retained until its owner is displayed.</summary>
public sealed record MediaImportWarning(string FileName, string UserMessage);
@@ -0,0 +1,23 @@
namespace AIStudio.Tools.Media;
/// <summary>Visible phases of the serialized media import lane.</summary>
public enum MediaTranscriptionPhase
{
/// <summary>No import is active.</summary>
IDLE,
/// <summary>The operation is waiting for the serialized runtime lane.</summary>
QUEUED,
/// <summary>The runtime is inspecting the input.</summary>
PROBING,
/// <summary>The runtime is preparing normalized audio.</summary>
TRANSCODING,
/// <summary>The normalized audio is being transcribed by the provider.</summary>
UPLOADING,
/// <summary>Cancellation was requested and runtime cleanup is in progress.</summary>
CANCELING,
}
@@ -0,0 +1,32 @@
using AIStudio.Tools.Rust;
namespace AIStudio.Tools.Media;
/// <summary>
/// Typed terminal result returned by media import and voice operations.
/// </summary>
/// <param name="Status">Terminal operation status.</param>
/// <param name="Text">Transcript text for a successful operation.</param>
/// <param name="UserMessage">Localized message suitable for display after a warning or failure.</param>
/// <param name="ErrorCode">Optional stable runtime failure category.</param>
public sealed record MediaTranscriptionResult(MediaTranscriptionResultStatus Status, string Text, string UserMessage, MediaJobErrorCode? ErrorCode = null)
{
/// <summary>Creates a successful result.</summary>
/// <param name="text">Provider transcript.</param>
public static MediaTranscriptionResult Succeeded(string text) => new(MediaTranscriptionResultStatus.SUCCEEDED, text, string.Empty);
/// <summary>Creates a failed result.</summary>
/// <param name="userMessage">Localized visible message.</param>
/// <param name="errorCode">Optional runtime error category.</param>
public static MediaTranscriptionResult Failed(string userMessage, MediaJobErrorCode? errorCode = null) => new(MediaTranscriptionResultStatus.FAILED, string.Empty, userMessage, errorCode);
/// <summary>Creates a warning result for media without an audible signal.</summary>
/// <param name="userMessage">Localized visible warning.</param>
public static MediaTranscriptionResult NoAudibleSignal(string userMessage) => new(
MediaTranscriptionResultStatus.NO_AUDIBLE_SIGNAL,
string.Empty,
userMessage);
/// <summary>Creates a cancelled result without relying on visible text.</summary>
public static MediaTranscriptionResult Cancelled() => new(MediaTranscriptionResultStatus.CANCELLED, string.Empty, string.Empty, MediaJobErrorCode.CANCELLED);
}
@@ -0,0 +1,19 @@
namespace AIStudio.Tools.Media;
/// <summary>
/// Terminal outcome of a media transcription operation.
/// </summary>
public enum MediaTranscriptionResultStatus
{
/// <summary>The provider returned a usable transcript.</summary>
SUCCEEDED,
/// <summary>The operation failed.</summary>
FAILED,
/// <summary>The media contains no signal above the practical-silence threshold.</summary>
NO_AUDIBLE_SIGNAL,
/// <summary>The caller or user cancelled the operation.</summary>
CANCELLED,
}