mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2025-04-27 15:39:47 +00:00
Merge a682302b6b
into 7bf5b5cf7a
This commit is contained in:
commit
40a0b19d91
@ -8,51 +8,23 @@
|
||||
<PreviewExperimental ApplyInnerScrollingFix="true"/>
|
||||
|
||||
<ProviderSelection @bind-ProviderSettings="@this.providerSettings"/>
|
||||
<MudButton Variant="Variant.Filled" StartIcon="@Icons.Material.Filled.Download" OnClick="@(() => this.LoadTextFile())" Color="Color.Primary" Class="mb-2">
|
||||
Load a text file
|
||||
</MudButton>
|
||||
<InnerScrolling>
|
||||
<ChildContent>
|
||||
<MudTextField
|
||||
@ref="@this.textField"
|
||||
T="string"
|
||||
Label="Write your text"
|
||||
@bind-Text="@this.userInput"
|
||||
Immediate="@true"
|
||||
Lines="16"
|
||||
MaxLines="16"
|
||||
Typo="Typo.body1"
|
||||
Variant="Variant.Outlined"
|
||||
InputMode="InputMode.text"
|
||||
FullWidth="@true"
|
||||
OnKeyDown="@this.InputKeyEvent"
|
||||
UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||
|
||||
<MudTextField
|
||||
T="string"
|
||||
Label="Your stage directions"
|
||||
@bind-Text="@this.userDirection"
|
||||
Immediate="@true"
|
||||
Lines="4"
|
||||
MaxLines="4"
|
||||
Typo="Typo.body1"
|
||||
Variant="Variant.Outlined"
|
||||
InputMode="InputMode.text"
|
||||
FullWidth="@true"
|
||||
UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||
@foreach (var chunk in this.chunks)
|
||||
{
|
||||
<MudJustifiedText Typo="Typo.body1" Class="ma-3 write-mode-chunk">
|
||||
@chunk.Content
|
||||
</MudJustifiedText>
|
||||
}
|
||||
</ChildContent>
|
||||
<FooterContent>
|
||||
@if (this.isStreaming)
|
||||
{
|
||||
<MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="mb-6" />
|
||||
}
|
||||
<MudTextField
|
||||
T="string"
|
||||
Label="Suggestion"
|
||||
@bind-Text="@this.suggestion"
|
||||
ReadOnly="@true"
|
||||
Lines="3"
|
||||
Typo="Typo.body1"
|
||||
Variant="Variant.Outlined"
|
||||
FullWidth="@true"
|
||||
UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||
</FooterContent>
|
||||
</InnerScrolling>
|
||||
</div>
|
@ -1,6 +1,9 @@
|
||||
using System.Text;
|
||||
|
||||
using AIStudio.Chat;
|
||||
using AIStudio.Components;
|
||||
using AIStudio.Provider;
|
||||
using AIStudio.Tools.Services;
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
@ -14,6 +17,9 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable
|
||||
[Inject]
|
||||
private ILogger<Chat> Logger { get; init; } = null!;
|
||||
|
||||
[Inject]
|
||||
private RustService RustService { get; init; } = null!;
|
||||
|
||||
private static readonly Dictionary<string, object?> USER_INPUT_ATTRIBUTES = new();
|
||||
private readonly Timer typeTimer = new(TimeSpan.FromMilliseconds(1_500));
|
||||
|
||||
@ -22,6 +28,7 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable
|
||||
private ChatThread? chatThread;
|
||||
private bool isStreaming;
|
||||
private string userInput = string.Empty;
|
||||
private List<WriterChunk> chunks = new();
|
||||
private string userDirection = string.Empty;
|
||||
private string suggestion = string.Empty;
|
||||
|
||||
@ -46,6 +53,39 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable
|
||||
#endregion
|
||||
|
||||
private bool IsProviderSelected => this.providerSettings.UsedLLMProvider != LLMProviders.NONE;
|
||||
|
||||
private async Task LoadTextFile()
|
||||
{
|
||||
var result = await this.RustService.SelectFile("Load a text file");
|
||||
if(result.UserCancelled)
|
||||
return;
|
||||
|
||||
if(!File.Exists(result.SelectedFilePath))
|
||||
return;
|
||||
|
||||
var text = await File.ReadAllTextAsync(result.SelectedFilePath, Encoding.UTF8);
|
||||
this.userInput = text;
|
||||
this.ChunkText();
|
||||
}
|
||||
|
||||
private void ChunkText()
|
||||
{
|
||||
this.chunks.Clear();
|
||||
var startIndex = 0;
|
||||
var contentSpan = this.userInput.AsSpan();
|
||||
for (var index = 0; index < contentSpan.Length; index++)
|
||||
{
|
||||
if (contentSpan[index] is '\n')
|
||||
{
|
||||
var endIndex = index;
|
||||
var lineMemory = this.userInput.AsMemory(startIndex..endIndex);
|
||||
this.chunks.Add(new WriterChunk(lineMemory, false, false));
|
||||
startIndex = endIndex + 1;
|
||||
}
|
||||
}
|
||||
|
||||
this.StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task InputKeyEvent(KeyboardEventArgs keyEvent)
|
||||
{
|
||||
|
10
app/MindWork AI Studio/Tools/WriterChunk.cs
Normal file
10
app/MindWork AI Studio/Tools/WriterChunk.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace AIStudio.Tools;
|
||||
|
||||
public sealed class WriterChunk(ReadOnlyMemory<char> content, bool isSelected, bool isProcessing)
|
||||
{
|
||||
public ReadOnlyMemory<char> Content = content;
|
||||
|
||||
public bool IsSelected = isSelected;
|
||||
|
||||
public bool IsProcessing = isProcessing;
|
||||
}
|
@ -38,6 +38,28 @@
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.write-mode-chunk {
|
||||
font-size: large;
|
||||
padding-left: 1.5em;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.write-mode-chunk::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 10%;
|
||||
height: 80%;
|
||||
width: 0.8em;
|
||||
background-color: transparent;
|
||||
border-radius: 0.4em;
|
||||
transition: background-color 0.5s ease;
|
||||
}
|
||||
|
||||
.write-mode-chunk:hover::before {
|
||||
background-color: #5894f3; /* Balkenfarbe im hover-Zustand */
|
||||
}
|
||||
|
||||
.plugin-icon-container {
|
||||
width: var(--mud-icon-size-large);
|
||||
height: var(--mud-icon-size-large);
|
||||
|
Loading…
Reference in New Issue
Block a user