mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-11-10 16:07:21 +00:00
Added an introduction and an onboarding chat to the BeyondFacts Lab (#1178)
This commit is contained in:
1 parent
79e0c80031
commit
22d94eb8fd
35 files changed
+1377
-361
No files matched your search
@@ -13,9 +13,15 @@
|
||||
</MudStack>
|
||||
|
||||
<InnerScrolling>
|
||||
<MudText Typo="Typo.body1" Class="mb-3 mr-3">
|
||||
@TA("Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.")
|
||||
</MudText>
|
||||
@* How to work with the lab opens by itself while there is no preparation yet. *@
|
||||
<MudExpansionPanels MultiExpansion="@true" Class="mb-6 mr-3">
|
||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.School" HeaderText="@T("Working with the lab")" IsExpanded="@this.introductionExpanded" ExpandedChanged="@this.IntroductionExpandedChanged">
|
||||
<BflIntroduction/>
|
||||
</ExpansionPanel>
|
||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.HelpOutline" HeaderText="@T("Is the lab right for my task?")">
|
||||
<BflOnboarding/>
|
||||
</ExpansionPanel>
|
||||
</MudExpansionPanels>
|
||||
|
||||
<MudText Typo="Typo.h5" Class="mb-1">@TA("Your preparations")</MudText>
|
||||
@if (this.projects.Count == 0)
|
||||
@@ -129,7 +135,7 @@
|
||||
</MudAlert>
|
||||
}
|
||||
|
||||
<BflStepChat Location="@(new BflThreadLocation(project.ProjectId, this.activeStep))" Provider="@this.providerSettings" ProviderIssue="@this.ValidateProvider(this.providerSettings)"/>
|
||||
<BflChat Location="@(new BflStepThreadLocation(project.ProjectId, this.activeStep))" Provider="@this.providerSettings" ProviderIssue="@this.ValidateProvider(this.providerSettings)"/>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
|
||||
+3
@@ -87,6 +87,9 @@ public partial class BeyondFactsLabAssistant
|
||||
var project = await this.Store.CreateAsync(name);
|
||||
await this.Store.RememberSelectionAsync(project.ProjectId);
|
||||
await this.ReloadProjectsAsync(project.ProjectId);
|
||||
|
||||
// The new preparation comes into view:
|
||||
this.introductionExpanded = false;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -50,6 +50,11 @@ public partial class BeyondFactsLabAssistant : MSGComponentBase
|
||||
/// </summary>
|
||||
private bool scrollToActiveStep;
|
||||
|
||||
/// <summary>
|
||||
/// Whether the area which tells how to work with the lab is open.
|
||||
/// </summary>
|
||||
private bool introductionExpanded;
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
@@ -63,6 +68,9 @@ public partial class BeyondFactsLabAssistant : MSGComponentBase
|
||||
this.ApplyFilters([], [Event.CONFIGURATION_CHANGED]);
|
||||
this.mayOpen = true;
|
||||
await this.RunStoreActionAsync(() => this.ReloadProjectsAsync(null));
|
||||
|
||||
// Whoever has no preparation yet needs to know how the lab works first:
|
||||
this.introductionExpanded = this.projects.Count is 0;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -119,5 +127,15 @@ public partial class BeyondFactsLabAssistant : MSGComponentBase
|
||||
await base.ProcessIncomingMessage(sendingComponent, triggeredEvent, data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remembers whether the person opened or closed the area which tells how to work with the lab.
|
||||
/// </summary>
|
||||
/// <param name="isExpanded">Whether the area is open now.</param>
|
||||
private Task IntroductionExpandedChanged(bool isExpanded)
|
||||
{
|
||||
this.introductionExpanded = isExpanded;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private async Task OpenSettingsDialogAsync() => await this.DialogService.ShowAsync<SettingsDialogBeyondFactsLab>(null, new DialogParameters(), DialogOptions.FULLSCREEN);
|
||||
}
|
||||
@@ -7,16 +7,26 @@ namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
public sealed partial class BeyondFactsLabStore
|
||||
{
|
||||
/// <summary>
|
||||
/// The file of a step which holds its chat.
|
||||
/// The file which holds a chat of the lab.
|
||||
/// </summary>
|
||||
private const string THREAD_FILE_NAME = "thread.json";
|
||||
|
||||
/// <summary>
|
||||
/// Loads the chat of a step.
|
||||
/// The folder of the conversation about whether the lab fits a task. It is no ID, so no preparation can have it.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
private const string ONBOARDING_DIRECTORY_NAME = "onboarding";
|
||||
|
||||
/// <summary>
|
||||
/// Guards the conversation about whether the lab fits a task, which belongs to no preparation.
|
||||
/// </summary>
|
||||
private readonly SemaphoreSlim onboardingLock = new(1, 1);
|
||||
|
||||
/// <summary>
|
||||
/// Loads a chat of the lab.
|
||||
/// </summary>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="token">The cancellation token.</param>
|
||||
/// <returns>The chat, or null while the step has none.</returns>
|
||||
/// <returns>The chat, or null while there is none.</returns>
|
||||
/// <exception cref="InvalidDataException">This version cannot open the chat.</exception>
|
||||
public async Task<ChatThread?> LoadThreadAsync(BflThreadLocation location, CancellationToken token = default)
|
||||
{
|
||||
@@ -25,34 +35,34 @@ public sealed partial class BeyondFactsLabStore
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stores the chat of a step and counts it as a change of the preparation.
|
||||
/// Stores a chat of the lab. The chat of a step counts as a change of its preparation.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="thread">The chat.</param>
|
||||
/// <param name="token">The cancellation token.</param>
|
||||
/// <returns>The preparation with its new time of change.</returns>
|
||||
/// <exception cref="FileNotFoundException">The preparation does not exist, e.g., because the person deleted it while the model answered.</exception>
|
||||
/// <exception cref="FileNotFoundException">The preparation of the step does not exist, e.g., because the person deleted it while the model answered.</exception>
|
||||
/// <exception cref="InvalidDataException">This version cannot open the preparation or the stored chat, so it does not write them either.</exception>
|
||||
public async Task<BflProject> SaveThreadAsync(BflThreadLocation location, ChatThread thread, CancellationToken token = default)
|
||||
public async Task SaveThreadAsync(BflThreadLocation location, ChatThread thread, CancellationToken token = default)
|
||||
{
|
||||
if (thread.ChatId != location.ChatId)
|
||||
throw new ArgumentException("The chat belongs to another step.", nameof(thread));
|
||||
throw new ArgumentException("The chat belongs to another place.", nameof(thread));
|
||||
|
||||
await this.InitializeAsync(token);
|
||||
var gate = this.GetLock(location.ProjectId);
|
||||
var gate = this.ThreadLock(location);
|
||||
await gate.WaitAsync(token);
|
||||
try
|
||||
{
|
||||
var project = await this.LoadRequiredWithoutInitializeAsync(location.ProjectId, token);
|
||||
var project = location is BflStepThreadLocation stepLocation ? await this.LoadRequiredWithoutInitializeAsync(stepLocation.ProjectId, token) : null;
|
||||
|
||||
// A chat which a newer version stored, or which is damaged, stays as it is:
|
||||
await this.LoadThreadWithoutInitializeAsync(location, token);
|
||||
|
||||
await WriteTextAtomicAsync(this.ThreadPath(location), JsonSerializer.Serialize(thread, WorkspaceBehaviour.JSON_OPTIONS), token);
|
||||
if (project is null)
|
||||
return;
|
||||
|
||||
project.ModifiedAtUtc = DateTimeOffset.UtcNow;
|
||||
await this.StoreProjectAsync(project, token);
|
||||
return project;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -61,18 +71,18 @@ public sealed partial class BeyondFactsLabStore
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the chat of a step, so that its conversation starts over.
|
||||
/// Deletes a chat of the lab, so that its conversation starts over.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Unlike the other files of a step, a chat which this version cannot open is deleted as well: the person asked
|
||||
/// to start the conversation over, and nothing else refers to it.
|
||||
/// </remarks>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="token">The cancellation token.</param>
|
||||
public async Task DeleteThreadAsync(BflThreadLocation location, CancellationToken token = default)
|
||||
{
|
||||
await this.InitializeAsync(token);
|
||||
var gate = this.GetLock(location.ProjectId);
|
||||
var gate = this.ThreadLock(location);
|
||||
await gate.WaitAsync(token);
|
||||
try
|
||||
{
|
||||
@@ -87,40 +97,43 @@ public sealed partial class BeyondFactsLabStore
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds the chats of every preparation on the disk, from the folders alone.
|
||||
/// Finds every chat of the lab on the disk, from the folders alone.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For the cleanup of the provenance store at the start, which must know every chat which may refer to an entry,
|
||||
/// also when the lab is switched off. A preparation this version cannot open keeps its chats as well.
|
||||
/// </remarks>
|
||||
/// <returns>The step of each chat, by the ID of the chat.</returns>
|
||||
/// <returns>The place of each chat, by the ID of the chat.</returns>
|
||||
public IReadOnlyDictionary<Guid, BflThreadLocation> ReadAllThreadLocations()
|
||||
{
|
||||
var locations = new Dictionary<Guid, BflThreadLocation>();
|
||||
if (!Directory.Exists(this.RootDirectory))
|
||||
return locations;
|
||||
|
||||
AddWhenStored(BflOnboardingThreadLocation.INSTANCE);
|
||||
foreach (var directory in Directory.EnumerateDirectories(this.RootDirectory))
|
||||
{
|
||||
if (!Guid.TryParse(Path.GetFileName(directory), out var projectId))
|
||||
continue;
|
||||
|
||||
foreach (var step in BflStep.All)
|
||||
{
|
||||
var location = new BflThreadLocation(projectId, step);
|
||||
if (File.Exists(this.ThreadPath(location)))
|
||||
locations[location.ChatId] = location;
|
||||
}
|
||||
AddWhenStored(new BflStepThreadLocation(projectId, step));
|
||||
}
|
||||
|
||||
return locations;
|
||||
|
||||
void AddWhenStored(BflThreadLocation location)
|
||||
{
|
||||
if (File.Exists(this.ThreadPath(location)))
|
||||
locations[location.ChatId] = location;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tells when the chat of a step was last written.
|
||||
/// Tells when a chat of the lab was last written.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <returns>The time, or null when the step has no chat.</returns>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <returns>The time, or null when there is no chat.</returns>
|
||||
public DateTimeOffset? GetThreadWrittenAt(BflThreadLocation location)
|
||||
{
|
||||
var path = this.ThreadPath(location);
|
||||
@@ -128,9 +141,9 @@ public sealed partial class BeyondFactsLabStore
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads the chat of a step without the first start of the store.
|
||||
/// Reads a chat of the lab without the first start of the store.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="token">The cancellation token.</param>
|
||||
/// <returns>The chat, or null when there is no file.</returns>
|
||||
/// <exception cref="InvalidDataException">This version cannot open the chat.</exception>
|
||||
@@ -151,7 +164,7 @@ public sealed partial class BeyondFactsLabStore
|
||||
throw new InvalidDataException("This version of AI Studio cannot open the chat.", exception);
|
||||
}
|
||||
|
||||
// A chat copied into another step would mix up what the provenance store keeps for it:
|
||||
// A chat copied into another place would mix up what the provenance store keeps for it:
|
||||
if (thread is null || thread.ChatId != location.ChatId || IsNull(thread.Blocks))
|
||||
throw new InvalidDataException("This version of AI Studio cannot open the chat.");
|
||||
|
||||
@@ -159,8 +172,26 @@ public sealed partial class BeyondFactsLabStore
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the file of the chat of a step.
|
||||
/// Gets the file of a chat of the lab.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
private string ThreadPath(BflThreadLocation location) => Path.Combine(this.ProjectDirectory(location.ProjectId), STEPS_DIRECTORY_NAME, location.Step.FolderName, THREAD_FILE_NAME);
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
private string ThreadPath(BflThreadLocation location) => location switch
|
||||
{
|
||||
BflStepThreadLocation stepLocation => Path.Combine(this.ProjectDirectory(stepLocation.ProjectId), STEPS_DIRECTORY_NAME, stepLocation.Step.FolderName, THREAD_FILE_NAME),
|
||||
BflOnboardingThreadLocation => Path.Combine(this.RootDirectory, ONBOARDING_DIRECTORY_NAME, THREAD_FILE_NAME),
|
||||
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(location), location, "The lab keeps no chat there.")
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the lock which guards a chat of the lab: the chat of a step shares the lock of its preparation.
|
||||
/// </summary>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
private SemaphoreSlim ThreadLock(BflThreadLocation location) => location switch
|
||||
{
|
||||
BflStepThreadLocation stepLocation => this.GetLock(stepLocation.ProjectId),
|
||||
BflOnboardingThreadLocation => this.onboardingLock,
|
||||
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(location), location, "The lab keeps no chat there.")
|
||||
};
|
||||
}
|
||||
@@ -10,7 +10,8 @@ namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
/// Stores the preparations of the BeyondFacts Lab as files below the data directory.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Each preparation lives in a folder named by its ID. The store keeps no paths: it derives every path from
|
||||
/// Each preparation lives in a folder named by its ID; the conversation about whether the lab fits a task, which
|
||||
/// belongs to no preparation, lives in a folder of its own. The store keeps no paths: it derives every path from
|
||||
/// IDs, so a backup works on another computer as well. It writes each file atomically, guards each preparation
|
||||
/// with a lock of its own, and never deletes anything on its own; only the person deletes a preparation.
|
||||
/// </remarks>
|
||||
|
||||
+7
-6
@@ -1,7 +1,10 @@
|
||||
@using AIStudio.Chat
|
||||
@inherits MSGComponentBase
|
||||
|
||||
<MudText Typo="Typo.h6" Class="mt-6 mb-2">@T("Conversation")</MudText>
|
||||
@if (this.ShowHeading)
|
||||
{
|
||||
<MudText Typo="Typo.h6" Class="mt-6 mb-2">@T("Conversation")</MudText>
|
||||
}
|
||||
@if (this.conversation is null)
|
||||
{
|
||||
<MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="mb-3"/>
|
||||
@@ -9,7 +12,7 @@
|
||||
else if (this.conversation.Thread is not { } thread)
|
||||
{
|
||||
<MudAlert Severity="Severity.Error" Variant="Variant.Outlined" Class="mb-3">
|
||||
@TA("AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.")
|
||||
@TA("AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.")
|
||||
</MudAlert>
|
||||
<MudButton StartIcon="@Icons.Material.Filled.RestartAlt" Color="Color.Error" OnClick="@this.ResetAsync">@T("Start over")</MudButton>
|
||||
}
|
||||
@@ -17,9 +20,7 @@ else
|
||||
{
|
||||
@if (!this.conversation.HasVisibleMessages && !this.IsRunning)
|
||||
{
|
||||
<MudText Typo="Typo.body2" Class="mb-3">
|
||||
@TA("The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.")
|
||||
</MudText>
|
||||
<MudText Typo="Typo.body2" Class="mb-3">@this.Introduction</MudText>
|
||||
<div class="mb-4">
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Forum" OnClick="@this.StartAsync" Disabled="@(!this.CanSend)">
|
||||
@T("Start the conversation")
|
||||
@@ -32,7 +33,7 @@ else
|
||||
{
|
||||
@if (block is { HideFromUser: false, Content: not null })
|
||||
{
|
||||
<ContentBlockComponent Role="@block.Role" Type="@block.ContentType" Time="@block.Time" Content="@block.Content" ExportTitle="@T("Export message")" ExportFileName="@this.Location.Step.Title"/>
|
||||
<ContentBlockComponent Role="@block.Role" Type="@block.ContentType" Time="@block.Time" Content="@block.Content" ExportTitle="@T("Export message")" ExportFileName="@this.ExportFileName"/>
|
||||
}
|
||||
}
|
||||
}
|
||||
+44
-11
@@ -12,20 +12,26 @@ using DialogOptions = AIStudio.Dialogs.DialogOptions;
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// The chat of one step of the BeyondFacts Lab, below its form "Your details".
|
||||
/// A chat of the BeyondFacts Lab, such as the one of a step below its form "Your details".
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The chat itself lives in BflConversationService, so an answer goes on while the person looks elsewhere; this
|
||||
/// component shows it and renders whenever the service says it changed. It offers no "send to": the lab neither
|
||||
/// receives content from other assistants nor hands its answers on.
|
||||
/// </remarks>
|
||||
public partial class BflStepChat : MSGComponentBase
|
||||
public partial class BflChat : MSGComponentBase
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the step of the preparation whose chat to show.
|
||||
/// Gets or sets where the chat to show belongs, e.g., to a step of a preparation.
|
||||
/// </summary>
|
||||
[Parameter, EditorRequired]
|
||||
public BflThreadLocation Location { get; set; }
|
||||
public BflThreadLocation Location { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether the chat shows a heading of its own; it needs none where its place already names it.
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public bool ShowHeading { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the provider which answers.
|
||||
@@ -46,7 +52,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
private IDialogService DialogService { get; init; } = null!;
|
||||
|
||||
[Inject]
|
||||
private ILogger<BflStepChat> Logger { get; init; } = null!;
|
||||
private ILogger<BflChat> Logger { get; init; } = null!;
|
||||
|
||||
[Inject]
|
||||
private ConversationTokenCounter TokenCounter { get; init; } = null!;
|
||||
@@ -72,7 +78,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
private BflConversation? conversation;
|
||||
|
||||
/// <summary>
|
||||
/// The step whose chat is shown, to notice when the parent shows another one.
|
||||
/// Where the chat shown belongs, to notice when the parent shows another one.
|
||||
/// </summary>
|
||||
private BflThreadLocation? shownLocation;
|
||||
|
||||
@@ -94,6 +100,33 @@ public partial class BflStepChat : MSGComponentBase
|
||||
|
||||
private bool CanSendMessage => this.CanSend && !string.IsNullOrWhiteSpace(this.userInput);
|
||||
|
||||
/// <summary>
|
||||
/// Gets what the chat says before its conversation begins.
|
||||
/// </summary>
|
||||
private string Introduction => this.Location switch
|
||||
{
|
||||
BflOnboardingThreadLocation => TA("Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin."),
|
||||
_ => TA("The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.")
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the name a message gets when the person exports it.
|
||||
/// </summary>
|
||||
private string ExportFileName => this.Location switch
|
||||
{
|
||||
BflStepThreadLocation stepLocation => stepLocation.Step.Title,
|
||||
_ => T("Is the lab right for my task?")
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Gets the question before the conversation starts over.
|
||||
/// </summary>
|
||||
private string ResetQuestion => this.Location switch
|
||||
{
|
||||
BflStepThreadLocation => TA("Delete the conversation of this step and start it over? Your details stay as they are."),
|
||||
_ => TA("Delete this conversation and start it over?")
|
||||
};
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
@@ -130,7 +163,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
/// <summary>
|
||||
/// Renders the chat again when the service changed it, and counts again once an answer is complete.
|
||||
/// </summary>
|
||||
/// <param name="location">The step whose chat changed.</param>
|
||||
/// <param name="location">Where the chat which changed belongs.</param>
|
||||
private Task OnConversationChangedAsync(BflThreadLocation location)
|
||||
{
|
||||
if (location != this.Location)
|
||||
@@ -146,7 +179,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Counts what the next request of the chat carries: the system prompt with the guide, and the conversation.
|
||||
/// Counts what the next request of the chat carries: the system prompt, e.g., with the guide, and the conversation.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Only while no answer runs: the request appends to the conversation which the count reads. The message being
|
||||
@@ -216,7 +249,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Lets the model open the conversation of the step.
|
||||
/// Lets the model open the conversation.
|
||||
/// </summary>
|
||||
private async Task StartAsync()
|
||||
{
|
||||
@@ -259,7 +292,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
{
|
||||
var parameters = new DialogParameters<ConfirmDialog>
|
||||
{
|
||||
{ dialog => dialog.Message, TA("Delete the conversation of this step and start it over? Your details stay as they are.") }
|
||||
{ dialog => dialog.Message, this.ResetQuestion }
|
||||
};
|
||||
|
||||
var reference = await this.DialogService.ShowAsync<ConfirmDialog>(T("Start over"), parameters, DialogOptions.FULLSCREEN);
|
||||
@@ -273,7 +306,7 @@ public partial class BflStepChat : MSGComponentBase
|
||||
}
|
||||
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException)
|
||||
{
|
||||
this.Logger.LogError(exception, "Could not delete the chat of a step in the BeyondFacts Lab.");
|
||||
this.Logger.LogError(exception, "Could not delete the chat '{Location}' of the BeyondFacts Lab.", this.Location.Key);
|
||||
await this.MessageBus.SendError(new(Icons.Material.Filled.DeleteForever, TA("AI Studio could not delete this conversation. Please try again.")));
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ using AIStudio.Chat;
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// The chat of a step of the BeyondFacts Lab, as BflConversationService keeps it while the app runs.
|
||||
/// A chat of the BeyondFacts Lab, as BflConversationService keeps it while the app runs.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The service keeps it beyond the page, so that an answer goes on while the person looks at another page, and the
|
||||
@@ -12,7 +12,7 @@ namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
public sealed class BflConversation
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the step of the preparation the chat belongs to.
|
||||
/// Gets where the chat belongs, e.g., to a step of a preparation.
|
||||
/// </summary>
|
||||
public required BflThreadLocation Location { get; init; }
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ using AIStudio.Tools.AssistantSessions;
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// Runs the chats of the steps of the BeyondFacts Lab.
|
||||
/// Runs the chats of the BeyondFacts Lab, such as those of the steps of a preparation.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// A singleton, so that an answer goes on while the person looks at another page: the page asks for the chat again
|
||||
@@ -30,17 +30,21 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
/// </remarks>
|
||||
public const string OPENING_REQUEST = "Beginne das Gespräch dieses Schritts mit deiner ersten Nachricht, wie es der Abschnitt „Dieser Schritt“ beschreibt.";
|
||||
|
||||
/// <summary>
|
||||
/// The request which lets the model open the conversation about whether the lab fits a task. The person does not
|
||||
/// see it.
|
||||
/// </summary>
|
||||
public const string ONBOARDING_OPENING_REQUEST = "Beginne das Gespräch mit deiner ersten Nachricht, wie es der Abschnitt „Gesprächsführung“ beschreibt.";
|
||||
|
||||
/// <summary>
|
||||
/// How often a streamed answer renders at most.
|
||||
/// </summary>
|
||||
private static readonly TimeSpan STREAMING_RENDER_MIN_TIME = TimeSpan.FromMilliseconds(100);
|
||||
|
||||
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(BflConversationService).Namespace, nameof(BflConversationService));
|
||||
|
||||
private static string TA(string fallbackEN) => Tools.PluginSystem.I18N.I.TA(fallbackEN, typeof(BflConversationService).Namespace, nameof(BflConversationService));
|
||||
|
||||
/// <summary>
|
||||
/// The chats loaded so far, by their steps.
|
||||
/// The chats loaded so far, by their places.
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<BflThreadLocation, BflConversation> conversations = new();
|
||||
|
||||
@@ -63,9 +67,9 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
public event Func<BflThreadLocation, Task>? ConversationChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the chat of a step, loading it on the first call.
|
||||
/// Gets a chat, loading it on the first call.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="token">The cancellation token.</param>
|
||||
/// <returns>The chat; it is not available when this version cannot open the stored one.</returns>
|
||||
public async Task<BflConversation> GetAsync(BflThreadLocation location, CancellationToken token = default)
|
||||
@@ -87,7 +91,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
catch (InvalidDataException exception)
|
||||
{
|
||||
// The file stays as it is, see BeyondFactsLabStore.SaveThreadAsync:
|
||||
logger.LogWarning(exception, "Could not open the chat of the step '{Step}' of the preparation '{ProjectId}' of the BeyondFacts Lab.", location.Step, location.ProjectId);
|
||||
logger.LogWarning(exception, "Could not open the chat '{Location}' of the BeyondFacts Lab.", location.Key);
|
||||
thread = null;
|
||||
}
|
||||
|
||||
@@ -102,11 +106,18 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lets the model open the conversation of a step, as the prompt of the step describes.
|
||||
/// Lets the model open a conversation, as its prompt describes.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="provider">The provider which answers.</param>
|
||||
public Task StartAsync(BflThreadLocation location, AIStudio.Settings.Provider provider) => this.SendAsync(location, provider, OPENING_REQUEST, isHidden: true);
|
||||
public Task StartAsync(BflThreadLocation location, AIStudio.Settings.Provider provider) => this.SendAsync(location, provider, OpeningRequestFor(location), isHidden: true);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the request which lets the model open a conversation.
|
||||
/// </summary>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <returns>The request, which names the section of the prompt that describes the first message.</returns>
|
||||
public static string OpeningRequestFor(BflThreadLocation location) => location is BflOnboardingThreadLocation ? ONBOARDING_OPENING_REQUEST : OPENING_REQUEST;
|
||||
|
||||
/// <summary>
|
||||
/// Sends a message of the person and lets the model answer it.
|
||||
@@ -115,7 +126,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
/// The message is stored before the model answers, so that a crash loses at most the answer. What goes wrong is
|
||||
/// reported through the message bus; the method itself does not fail.
|
||||
/// </remarks>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="provider">The provider which answers.</param>
|
||||
/// <param name="text">The message.</param>
|
||||
/// <param name="isHidden">Whether the person does not see the message, e.g., the request which opens a conversation.</param>
|
||||
@@ -125,7 +136,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
return;
|
||||
|
||||
var conversation = await this.GetAsync(location);
|
||||
if (conversation.Thread is not { } thread || !await this.CheckProviderAsync(thread, provider))
|
||||
if (conversation.Thread is not { } thread || !await this.CheckProviderAsync(location, thread, provider))
|
||||
return;
|
||||
|
||||
string systemPrompt;
|
||||
@@ -135,8 +146,8 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or FormatException)
|
||||
{
|
||||
logger.LogError(exception, "The BeyondFacts Lab could not put together the system prompt of the step '{Step}'.", location.Step);
|
||||
await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, TB("The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.")));
|
||||
logger.LogError(exception, "The BeyondFacts Lab could not put together the system prompt of the chat '{Location}'.", location.Key);
|
||||
await messageBus.SendError(new(Icons.Material.Filled.ErrorOutline, TA("The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.")));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -208,7 +219,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException)
|
||||
{
|
||||
logger.LogError(exception, "The BeyondFacts Lab could not store the chat of the step '{Step}'.", location.Step);
|
||||
logger.LogError(exception, "The BeyondFacts Lab could not store the chat '{Location}'.", location.Key);
|
||||
await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not save this conversation. Please try again.")));
|
||||
}
|
||||
finally
|
||||
@@ -218,16 +229,16 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops the answer the model writes in a step.
|
||||
/// Stops the answer the model writes in a chat.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
public Task CancelAsync(BflThreadLocation location) => sessionService.CancelAsync(SessionKey(location));
|
||||
|
||||
/// <summary>
|
||||
/// Deletes the conversation of a step, so that it starts over.
|
||||
/// Deletes a conversation, so that it starts over.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <returns>False while the model answers in the step.</returns>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <returns>False while the model answers in the chat.</returns>
|
||||
public async Task<bool> ResetAsync(BflThreadLocation location)
|
||||
{
|
||||
var conversation = await this.GetAsync(location);
|
||||
@@ -253,7 +264,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
/// <returns>The IDs of the chats the preparation could have had.</returns>
|
||||
public async Task<IReadOnlyList<Guid>> ForgetProjectAsync(Guid projectId)
|
||||
{
|
||||
var locations = BflStep.All.Select(step => new BflThreadLocation(projectId, step)).ToList();
|
||||
var locations = BflStep.All.Select(step => new BflStepThreadLocation(projectId, step)).ToList();
|
||||
foreach (var location in locations)
|
||||
{
|
||||
await sessionService.CancelAsync(SessionKey(location));
|
||||
@@ -264,35 +275,47 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Puts together the system prompt of a step, anew for every request, so that changed details and a changed form
|
||||
/// Puts together the system prompt of a chat, anew for every request, so that changed details and a changed form
|
||||
/// of address count right away. The chat also uses it to count what the next request carries.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <returns>The system prompt.</returns>
|
||||
/// <exception cref="FileNotFoundException">The app comes without one of the prompts.</exception>
|
||||
/// <exception cref="FormatException">A prompt has a placeholder without a value.</exception>
|
||||
public async Task<string> ComposeSystemPromptAsync(BflThreadLocation location)
|
||||
{
|
||||
var forms = await store.LoadFormsAsync(location.ProjectId);
|
||||
var parts = await BflPromptLibrary.LoadPartsAsync(location.Step, Tools.PluginSystem.I18N.I.AddressForm);
|
||||
var addressForm = Tools.PluginSystem.I18N.I.AddressForm;
|
||||
var language = (await settingsManager.GetActiveLanguagePlugin()).LangName;
|
||||
return BflPromptComposer.Compose(parts, location.Step, forms, language);
|
||||
switch (location)
|
||||
{
|
||||
case BflStepThreadLocation stepLocation:
|
||||
var forms = await store.LoadFormsAsync(stepLocation.ProjectId);
|
||||
var parts = await BflPromptLibrary.LoadPartsAsync(stepLocation.Step, addressForm);
|
||||
return BflPromptComposer.Compose(parts, stepLocation.Step, forms, language);
|
||||
|
||||
case BflOnboardingThreadLocation:
|
||||
return BflPromptComposer.ComposeOnboarding(await BflPromptLibrary.LoadOnboardingPartsAsync(addressForm), language);
|
||||
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(location), location, "The lab has no prompt for this chat.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether a provider may answer in a chat, and tells the person why not.
|
||||
/// </summary>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="thread">The chat.</param>
|
||||
/// <param name="provider">The provider.</param>
|
||||
/// <returns>True when the provider may answer.</returns>
|
||||
private async Task<bool> CheckProviderAsync(ChatThread thread, AIStudio.Settings.Provider provider)
|
||||
private async Task<bool> CheckProviderAsync(BflThreadLocation location, ChatThread thread, AIStudio.Settings.Provider provider)
|
||||
{
|
||||
string? reason = null;
|
||||
if (provider.UsedLLMProvider is LLMProviders.NONE)
|
||||
reason = TA("Please select a provider.");
|
||||
else if (!settingsManager.IsProviderConfident(provider, Tools.Components.BEYOND_FACTS_LAB_ASSISTANT) || !thread.IsLLMProviderAllowed(provider))
|
||||
reason = TA("The selected provider may not see your preparation. Please select another provider.");
|
||||
else if (!BflModelRequirements.HasEnoughContext(provider.GetModelProfile().Context))
|
||||
else if (!BflModelRequirements.HasEnoughContext(location, provider.GetModelProfile().Context))
|
||||
reason = TA("The model of the selected provider reads too little at once for the lab. Please select another provider.");
|
||||
|
||||
if (reason is null)
|
||||
@@ -328,7 +351,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException)
|
||||
{
|
||||
logger.LogError(exception, "The BeyondFacts Lab could not store the chat of the step '{Step}'.", conversation.Location.Step);
|
||||
logger.LogError(exception, "The BeyondFacts Lab could not store the chat '{Location}'.", conversation.Location.Key);
|
||||
await messageBus.SendError(new(Icons.Material.Filled.SaveAs, TA("AI Studio could not save this conversation. Please try again.")));
|
||||
}
|
||||
}
|
||||
@@ -350,7 +373,7 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
/// <summary>
|
||||
/// Tells every page which listens that a chat changed.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the chat.</param>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
private async Task NotifyAsync(BflThreadLocation location)
|
||||
{
|
||||
if (this.ConversationChanged is not { } handlers)
|
||||
@@ -371,8 +394,8 @@ public sealed class BflConversationService(BeyondFactsLabStore store, SettingsMa
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the key under which a request of a step registers in AssistantSessionService.
|
||||
/// Gets the key under which a request of a chat registers in AssistantSessionService.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation.</param>
|
||||
private static AssistantSessionKey SessionKey(BflThreadLocation location) => new(Tools.Components.BEYOND_FACTS_LAB_ASSISTANT, $"{location.ProjectId:D}/{location.Step.FolderName}");
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
private static AssistantSessionKey SessionKey(BflThreadLocation location) => new(Tools.Components.BEYOND_FACTS_LAB_ASSISTANT, location.Key);
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
@inherits MSGComponentBase
|
||||
|
||||
<MudText Typo="Typo.subtitle1" Class="mb-2"><b>@T("Reflect. Take a position. Communicate.")</b></MudText>
|
||||
<MudJustifiedText Typo="Typo.body1" Class="mb-2">
|
||||
@TA("The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.")
|
||||
</MudJustifiedText>
|
||||
<MudJustifiedText Typo="Typo.body1" Class="mb-3">
|
||||
@T("The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM).")
|
||||
</MudJustifiedText>
|
||||
|
||||
<MudAlert Severity="Severity.Info" Variant="Variant.Outlined" Icon="@Icons.Material.Filled.Schedule" Class="mb-4">
|
||||
<MudJustifiedText Typo="Typo.body1">
|
||||
@TA("Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.")
|
||||
</MudJustifiedText>
|
||||
</MudAlert>
|
||||
|
||||
<MudText Typo="Typo.h6" Class="mb-1">@T("What the lab does not do")</MudText>
|
||||
<MudJustifiedText Typo="Typo.body1" Class="mb-4">
|
||||
@TA("The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.")
|
||||
</MudJustifiedText>
|
||||
|
||||
@* Laid out like MudTextList, whose items have a header of their own: justified and hyphenated, with the icon at the first line. *@
|
||||
<MudText Typo="Typo.h6">@T("How to proceed")</MudText>
|
||||
<MudList T="string" ReadOnly="@true" Dense="@true" Class="mud-text-list mb-3">
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.LooksOne" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("Create a preparation for your event with 'New preparation'.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.LooksTwo" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.Looks3" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.Looks4" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
</MudList>
|
||||
|
||||
<MudText Typo="Typo.h6">@T("How to recognize good results")</MudText>
|
||||
<MudList T="string" ReadOnly="@true" Dense="@true" Class="mud-text-list mb-3">
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.TaskAlt" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("The answers refer to your event and your details.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.TaskAlt" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("You can tell evidence, interpretation, assumptions about values, and recommendations apart.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.TaskAlt" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("Uncertainties and the limits of your expertise stay visible.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.TaskAlt" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@T("Counterarguments are presented fairly.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.TaskAlt" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("The strategy fits your real speaking time and focuses on a few key messages.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
<MudListItem T="string" Icon="@Icons.Material.Filled.TaskAlt" Style="@LIST_ITEM_STYLE">
|
||||
<MudJustifiedText Typo="Typo.body1">@TA("You keep the decision about which position you take.")</MudJustifiedText>
|
||||
</MudListItem>
|
||||
</MudList>
|
||||
|
||||
<MudJustifiedText Typo="Typo.body1">
|
||||
@TA("Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.")
|
||||
</MudJustifiedText>
|
||||
@@ -0,0 +1,19 @@
|
||||
using AIStudio.Components;
|
||||
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// Tells how to work with the BeyondFacts Lab: what it is for and what not, how long a preparation takes, how to
|
||||
/// proceed, and how to recognize good results.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The texts follow the short guide for users by Lara Wüster. They describe the lab as this version has it, so a
|
||||
/// change of the lab may need a change here as well, and in the prompt of the onboarding.
|
||||
/// </remarks>
|
||||
public partial class BflIntroduction : MSGComponentBase
|
||||
{
|
||||
/// <summary>
|
||||
/// Puts the icon of a list item at the first line of its text, like MudTextList does.
|
||||
/// </summary>
|
||||
private const string LIST_ITEM_STYLE = "display: flex; align-items: flex-start;";
|
||||
}
|
||||
@@ -6,8 +6,10 @@ namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
/// What a model needs to run the chats of the BeyondFacts Lab.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Every chat of the lab keeps its guide in the context, which alone takes about 20,000 tokens. A model with a
|
||||
/// smaller context window would lose the beginning of each conversation, or fail right away.
|
||||
/// Every chat of a step keeps the guide of the lab in the context, which alone takes about 20,000 tokens. A model
|
||||
/// with a smaller context window would lose the beginning of each conversation, or fail right away. The conversation
|
||||
/// about whether the lab fits a task leaves out the guide, so it runs with any model; its token budget tells the
|
||||
/// person when it grows too long.
|
||||
/// </remarks>
|
||||
public static class BflModelRequirements
|
||||
{
|
||||
@@ -30,4 +32,12 @@ public static class BflModelRequirements
|
||||
/// <param name="contextWindow">The context window of the model.</param>
|
||||
/// <returns>True when the window is large enough or unknown.</returns>
|
||||
public static bool HasEnoughContext(ContextWindow contextWindow) => !contextWindow.IsKnown || contextWindow.DefaultTokens >= MINIMUM_CONTEXT_TOKENS;
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether a model reads enough at once for a chat of the lab.
|
||||
/// </summary>
|
||||
/// <param name="location">Where the chat belongs.</param>
|
||||
/// <param name="contextWindow">The context window of the model.</param>
|
||||
/// <returns>True when the chat needs no minimum, or when the window is large enough or unknown.</returns>
|
||||
public static bool HasEnoughContext(BflThreadLocation location, ContextWindow contextWindow) => location is BflOnboardingThreadLocation || HasEnoughContext(contextWindow);
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
@inherits MSGComponentBase
|
||||
|
||||
<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidateProvider"/>
|
||||
<BflChat Location="@BflOnboardingThreadLocation.INSTANCE" Provider="@this.providerSettings" ProviderIssue="@this.ValidateProvider(this.providerSettings)" ShowHeading="@false"/>
|
||||
@@ -0,0 +1,45 @@
|
||||
using AIStudio.Components;
|
||||
using AIStudio.Provider;
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// The conversation in which the BeyondFacts Lab tells whether it fits a task and how to work with it.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// It belongs to no preparation, so it has a provider of its own. The person may describe an unpublished task here,
|
||||
/// so the lab offers the same providers as for a preparation; but its prompt leaves out the guide, so any model may
|
||||
/// answer.
|
||||
/// </remarks>
|
||||
public partial class BflOnboarding : MSGComponentBase
|
||||
{
|
||||
[Inject]
|
||||
private BflConversationService ConversationService { get; init; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// The provider which answers.
|
||||
/// </summary>
|
||||
private AIStudio.Settings.Provider providerSettings = Settings.Provider.NONE;
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await base.OnInitializedAsync();
|
||||
|
||||
// The provider which answered last, as long as its confidence is still high enough, otherwise the preselected one:
|
||||
var conversation = await this.ConversationService.GetAsync(BflOnboardingThreadLocation.INSTANCE);
|
||||
this.providerSettings = this.SettingsManager.GetPreselectedProvider(Tools.Components.BEYOND_FACTS_LAB_ASSISTANT, conversation.Thread?.SelectedProvider);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks whether a provider can run the conversation.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The confidence is checked before: the selection offers only providers whose confidence is high enough.
|
||||
/// </remarks>
|
||||
/// <param name="provider">The provider.</param>
|
||||
/// <returns>Why the provider cannot run the conversation, or null when it can.</returns>
|
||||
private string? ValidateProvider(AIStudio.Settings.Provider provider) => provider.UsedLLMProvider is LLMProviders.NONE ? TA("Please select a provider.") : null;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// The texts which the system prompt of the conversation about whether the lab fits a task is made of, as they come
|
||||
/// with the app.
|
||||
/// </summary>
|
||||
/// <param name="Onboarding">The prompt of the conversation with its placeholders.</param>
|
||||
/// <param name="Address">The instruction for the form of address.</param>
|
||||
public sealed record BflOnboardingPromptParts(string Onboarding, string Address);
|
||||
@@ -0,0 +1,33 @@
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// The place of the conversation in which the lab tells whether it fits a task and how to work with it.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The lab keeps one such conversation, apart from all preparations: it comes before the first one.
|
||||
/// </remarks>
|
||||
public sealed record BflOnboardingThreadLocation : BflThreadLocation
|
||||
{
|
||||
/// <summary>
|
||||
/// The only place of this kind.
|
||||
/// </summary>
|
||||
public static readonly BflOnboardingThreadLocation INSTANCE = new();
|
||||
|
||||
/// <summary>
|
||||
/// The name of the conversation, the same on every computer.
|
||||
/// </summary>
|
||||
private const string NAME = "onboarding";
|
||||
|
||||
private BflOnboardingThreadLocation()
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override Guid ChatId => BflThreadId.ONBOARDING;
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string Key => NAME;
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ChatName => NAME;
|
||||
}
|
||||
@@ -3,7 +3,7 @@ using System.Text;
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// Puts together the system prompt of a step of the BeyondFacts Lab.
|
||||
/// Puts together the system prompts of the BeyondFacts Lab.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The same parts and forms always give the same prompt, byte by byte, on every system. The parts which stay the
|
||||
@@ -36,6 +36,22 @@ public static class BflPromptComposer
|
||||
[BflPromptTemplate.MISSING_DETAILS] = MissingDetails(step, forms)
|
||||
}).ReplaceLineEndings(LINE_BREAK.ToString());
|
||||
|
||||
/// <summary>
|
||||
/// Puts together the system prompt of the conversation about whether the lab fits a task.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// It knows no preparation and leaves out the guide, so that it stays short.
|
||||
/// </remarks>
|
||||
/// <param name="parts">The texts of the prompt.</param>
|
||||
/// <param name="responseLanguage">The name of the language the model answers in, e.g., the language of the app.</param>
|
||||
/// <returns>The system prompt.</returns>
|
||||
/// <exception cref="FormatException">The prompt has a placeholder without a value.</exception>
|
||||
public static string ComposeOnboarding(BflOnboardingPromptParts parts, string responseLanguage) => BflPromptTemplate.Fill(parts.Onboarding, new Dictionary<string, string>(StringComparer.Ordinal)
|
||||
{
|
||||
[BflPromptTemplate.RESPONSE_LANGUAGE] = responseLanguage,
|
||||
[BflPromptTemplate.ADDRESS_FORM] = parts.Address.Trim()
|
||||
}).ReplaceLineEndings(LINE_BREAK.ToString());
|
||||
|
||||
/// <summary>
|
||||
/// Lists what the person entered into the forms, step by step.
|
||||
/// </summary>
|
||||
|
||||
@@ -26,6 +26,12 @@ public static class BflPromptLibrary
|
||||
/// </summary>
|
||||
public const string KNOWLEDGE_PATH = FOLDER + "/Knowledge/beyondfacts-paper.md";
|
||||
|
||||
/// <summary>
|
||||
/// The prompt of the conversation in which the lab tells whether it fits a task. It stands on its own, without
|
||||
/// the core and the guide.
|
||||
/// </summary>
|
||||
public const string ONBOARDING_PATH = FOLDER + "/Prompts/onboarding.md";
|
||||
|
||||
/// <summary>
|
||||
/// The instruction to address the person formally.
|
||||
/// </summary>
|
||||
@@ -55,6 +61,7 @@ public static class BflPromptLibrary
|
||||
[
|
||||
CORE_PATH,
|
||||
KNOWLEDGE_PATH,
|
||||
ONBOARDING_PATH,
|
||||
..Enum.GetValues<AddressForm>().Select(AddressPath).Distinct(),
|
||||
..BflStep.All.Select(StepPath)
|
||||
];
|
||||
@@ -73,6 +80,17 @@ public static class BflPromptLibrary
|
||||
await ReadAsync(StepPath(step), token),
|
||||
await ReadAsync(AddressPath(addressForm), token));
|
||||
|
||||
/// <summary>
|
||||
/// Reads the texts of the system prompt of the conversation about whether the lab fits a task.
|
||||
/// </summary>
|
||||
/// <param name="addressForm">How the model addresses the person.</param>
|
||||
/// <param name="token">The cancellation token.</param>
|
||||
/// <returns>The texts, which BflPromptComposer puts together.</returns>
|
||||
/// <exception cref="FileNotFoundException">The app comes without one of the files.</exception>
|
||||
public static async Task<BflOnboardingPromptParts> LoadOnboardingPartsAsync(AddressForm addressForm, CancellationToken token = default) => new(
|
||||
await ReadAsync(ONBOARDING_PATH, token),
|
||||
await ReadAsync(AddressPath(addressForm), token));
|
||||
|
||||
/// <summary>
|
||||
/// Reads a file of the lab's prompts.
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// The place of the chat of a step of a preparation.
|
||||
/// </summary>
|
||||
/// <param name="ProjectId">The ID of the preparation.</param>
|
||||
/// <param name="Step">The step.</param>
|
||||
public sealed record BflStepThreadLocation(Guid ProjectId, BflStep Step) : BflThreadLocation
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public override Guid ChatId => BflThreadId.Of(this.ProjectId, this.Step);
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string Key => $"{this.ProjectId:D}/{this.Step.FolderName}";
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ChatName => this.Step.FolderName;
|
||||
}
|
||||
@@ -13,15 +13,15 @@ namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
public static class BflThreadFactory
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates the chat of a step, without any messages.
|
||||
/// Creates a chat of the lab, without any messages.
|
||||
/// </summary>
|
||||
/// <param name="location">The step of the preparation the chat belongs to.</param>
|
||||
/// <param name="location">Where the chat belongs, e.g., to a step of a preparation.</param>
|
||||
/// <returns>The chat.</returns>
|
||||
public static ChatThread Create(BflThreadLocation location) => new()
|
||||
{
|
||||
ChatId = location.ChatId,
|
||||
WorkspaceId = Guid.Empty,
|
||||
Name = location.Step.FolderName,
|
||||
Name = location.ChatName,
|
||||
IncludeDateTime = true,
|
||||
SelectedProfile = Profile.NO_PROFILE.Id,
|
||||
SelectedChatTemplate = ChatTemplate.NO_CHAT_TEMPLATE.Id,
|
||||
@@ -38,7 +38,7 @@ public static class BflThreadFactory
|
||||
/// </remarks>
|
||||
/// <param name="thread">The chat.</param>
|
||||
/// <param name="provider">The provider which answers.</param>
|
||||
/// <param name="systemPrompt">The system prompt of the step, see BflPromptComposer.</param>
|
||||
/// <param name="systemPrompt">The system prompt of the chat, see BflPromptComposer.</param>
|
||||
public static void PrepareForRequest(ChatThread thread, AIStudio.Settings.Provider provider, string systemPrompt)
|
||||
{
|
||||
thread.SystemPrompt = systemPrompt;
|
||||
|
||||
@@ -8,10 +8,10 @@ namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The provenance store keeps what a chat received by the ID of the chat, and its cleanup at the start removes what
|
||||
/// belongs to no chat on the disk. With IDs which follow from the preparation and the step, the cleanup finds the
|
||||
/// chats of the lab from the folders alone, without reading a single chat; see ProvenanceCleanup. A chat started
|
||||
/// over keeps its ID, so what the old conversation received becomes unreferenced and goes at the next cleanup.
|
||||
/// The ID is a version 8 UUID after RFC 9562, built from a SHA-256 hash.
|
||||
/// belongs to no chat on the disk. With IDs which follow from the place of a chat, such as the preparation and the
|
||||
/// step, the cleanup finds the chats of the lab from the folders alone, without reading a single chat; see
|
||||
/// ProvenanceCleanup. A chat started over keeps its ID, so what the old conversation received becomes unreferenced
|
||||
/// and goes at the next cleanup. The ID is a version 8 UUID after RFC 9562, built from a SHA-256 hash.
|
||||
/// </remarks>
|
||||
public static class BflThreadId
|
||||
{
|
||||
@@ -20,17 +20,29 @@ public static class BflThreadId
|
||||
/// </summary>
|
||||
private const string NAMESPACE = "beyondfacts-lab/thread/";
|
||||
|
||||
/// <summary>
|
||||
/// The ID of the conversation in which the lab tells whether it fits a task.
|
||||
/// </summary>
|
||||
public static readonly Guid ONBOARDING = FromName("onboarding");
|
||||
|
||||
/// <summary>
|
||||
/// Gets the ID of the chat of a step.
|
||||
/// </summary>
|
||||
/// <param name="projectId">The ID of the preparation.</param>
|
||||
/// <param name="step">The step.</param>
|
||||
/// <returns>The ID, the same on every computer and in every run.</returns>
|
||||
public static Guid Of(Guid projectId, BflStep step)
|
||||
public static Guid Of(Guid projectId, BflStep step) => FromName($"{projectId:D}/{step.FolderName}");
|
||||
|
||||
/// <summary>
|
||||
/// Builds the ID of a chat from the name of its place.
|
||||
/// </summary>
|
||||
/// <param name="name">The name of the place, which no other place has.</param>
|
||||
/// <returns>The ID, the same on every computer and in every run.</returns>
|
||||
private static Guid FromName(string name)
|
||||
{
|
||||
var name = Encoding.UTF8.GetBytes($"{NAMESPACE}{projectId:D}/{step.FolderName}");
|
||||
var bytesOfName = Encoding.UTF8.GetBytes($"{NAMESPACE}{name}");
|
||||
Span<byte> hash = stackalloc byte[SHA256.HashSizeInBytes];
|
||||
SHA256.HashData(name, hash);
|
||||
SHA256.HashData(bytesOfName, hash);
|
||||
|
||||
var bytes = hash[..16];
|
||||
bytes[6] = (byte)((bytes[6] & 0x0F) | 0x80);
|
||||
|
||||
@@ -1,14 +1,26 @@
|
||||
namespace AIStudio.Assistants.BeyondFactsLab;
|
||||
|
||||
/// <summary>
|
||||
/// Where the BeyondFacts Lab keeps a chat: the step of a preparation it belongs to.
|
||||
/// Where the BeyondFacts Lab keeps a chat, e.g., in a step of a preparation.
|
||||
/// </summary>
|
||||
/// <param name="ProjectId">The ID of the preparation.</param>
|
||||
/// <param name="Step">The step.</param>
|
||||
public readonly record struct BflThreadLocation(Guid ProjectId, BflStep Step)
|
||||
/// <remarks>
|
||||
/// Each place holds one chat at most, and the ID of the chat follows from the place, see BflThreadId. Two places of
|
||||
/// the same kind with the same values are equal, so a place serves as a key.
|
||||
/// </remarks>
|
||||
public abstract record BflThreadLocation
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the ID of the chat, which follows from its place, see BflThreadId.
|
||||
/// Gets the ID of the chat, which follows from its place.
|
||||
/// </summary>
|
||||
public Guid ChatId => BflThreadId.Of(this.ProjectId, this.Step);
|
||||
public abstract Guid ChatId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a key which no other place has, e.g., for the registry of running assistant sessions and for the log.
|
||||
/// </summary>
|
||||
public abstract string Key { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the name the chat stores, which tells people who look into its file where it belongs.
|
||||
/// </summary>
|
||||
public abstract string ChatName { get; }
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
# Rolle und Ziel
|
||||
|
||||
Du bist das „BeyondFacts Lab“, ein KI-gestütztes Reflexions- und Trainingswerkzeug in MindWork AI Studio. Es hilft Wissenschaftler*innen und Wissenschaftskommunikator*innen, sich auf einen herausfordernden öffentlichen Auftritt vorzubereiten: etwa einen Vortrag, eine Podiumsdiskussion, ein Interview, einen Medienauftritt oder eine Anhörung. Sein Motto: Reflektieren. Positionieren. Kommunizieren.
|
||||
|
||||
In diesem Gespräch bereitest du noch keinen Auftritt vor. Du hilfst der Person herauszufinden, ob das Lab zu ihrer Aufgabe passt, und erklärst ihr, wie sie damit arbeitet.
|
||||
|
||||
# Was das Lab tut
|
||||
|
||||
Das Lab hilft, einen Auftritt nicht nur inhaltlich, sondern auch strategisch und ethisch vorzubereiten:
|
||||
|
||||
- Ziele und die eigene Rolle klären, etwa Beratung, Vermittlung, offene Interessenvertretung oder Diskurshygiene;
|
||||
- wissenschaftliche Unsicherheiten, die Grenzen der eigenen Expertise und Wertannahmen sichtbar machen;
|
||||
- Framing und andere Perspektiven reflektieren;
|
||||
- eine Strategie mit wenigen Kernbotschaften für die reale Redezeit entwickeln;
|
||||
- kritische Nachfragen und Gegenpositionen durchspielen;
|
||||
- festhalten, was die Person mitnimmt, und auf Wunsch Hilfen erstellen, etwa Karteikarten, eine Redestruktur, einen Folienplan oder einen Gesprächsleitfaden.
|
||||
|
||||
Das Lab nimmt der Person keine Position ab und will sie nicht möglichst überzeugend machen. Es hilft ihr, eine eigene, reflektierte Position zu finden und sie ehrlich, verständlich und belastbar zu vertreten. Grundlage ist ein Leitfaden von Lara Wüster (Technische Universität München) über (Geistes-)Wissenschaft im öffentlichen Diskurs.
|
||||
|
||||
# Wofür das Lab nicht gedacht ist
|
||||
|
||||
- Es schreibt keine Pressemitteilungen, PR-Texte, Social-Media-Beiträge oder fertigen Reden und gestaltet keine fertigen Folien.
|
||||
- Es prüft keine Fakten und ersetzt weder die fachliche Prüfung durch die Person noch die Rechts- oder Datenschutzberatung ihrer Institution.
|
||||
- Es trifft keine politischen oder normativen Entscheidungen für die Person.
|
||||
- Es liefert keine schnellen Ergebnisse: Eine Vorbereitung braucht Zeit und eigenes Nachdenken.
|
||||
|
||||
Für schnelle Texte wie eine Pressemitteilung passen der Chat von AI Studio oder die anderen Assistenten besser. Nenne dabei keinen Assistenten beim Namen; du kennst sie nicht.
|
||||
|
||||
# Wie eine Vorbereitung abläuft
|
||||
|
||||
- Die Person legt mit „Neue Vorbereitung“ eine Vorbereitung an, für jede Veranstaltung eine eigene.
|
||||
- Eine Vorbereitung hat sieben Schritte:
|
||||
1. „Rahmendaten“: worum es bei der Veranstaltung geht, für wen, und was der Auftrag der Person ist.
|
||||
2. „Wissen und Unsicherheit“: was sie sicher weiß, was unsicher ist und wo ihre Expertise endet.
|
||||
3. „Ziele und Rolle“: was sie erreichen will und in welcher Rolle sie spricht.
|
||||
4. „Werte und Perspektiven“: was ihr wichtig ist, was sie berührt und was andere bewegt.
|
||||
5. „Strategie“: wie sie Evidenz, Wertabwägungen und offene Fragen vermittelt.
|
||||
6. „Testsituation“: kritische Nachfragen und Gegenpositionen durchspielen.
|
||||
7. „Ergebnisse und Materialien“: was sie aus der Vorbereitung mitnimmt, und Hilfen für den Auftritt.
|
||||
- Jeder Schritt hat ein Formular „Ihre Angaben“ und ein eigenes Gespräch. Felder dürfen leer bleiben: Das Lab zeigt an, welche wichtigen Angaben fehlen, und fragt im Gespräch danach. Auf jede Frage darf die Person „Ich weiß es nicht“ antworten.
|
||||
- Mit „Gespräch beginnen“ eröffnet das Lab das Gespräch eines Schritts. Die Person kann auch selbst zuerst schreiben und sagen, wobei sie Unterstützung möchte, etwa bei ihrer Rolle, ihrer Strategie oder einer kritischen Fragerunde.
|
||||
- Die Schritte bauen aufeinander auf, die Person kann sie aber in beliebiger Reihenfolge bearbeiten.
|
||||
- Eine Vorbereitung dauert etwa 30 bis 60 Minuten. Die Person kann jederzeit unterbrechen: AI Studio speichert ihre Angaben und Gespräche, und sie macht später dort weiter.
|
||||
- Für jede Vorbereitung wählt die Person einen KI-Anbieter. Das Lab bietet nur Anbieter an, denen sie oder ihre Organisation genug vertraut, und das Modell muss mindestens 32.000 Token auf einmal lesen können.
|
||||
|
||||
# Was diese Version noch nicht kann
|
||||
|
||||
Das Lab ist ein Prototyp. In dieser Version kann die Person noch kein Material wie Notizen oder Vortragstexte hochladen; sie kann aber Auszüge in ihre Angaben oder ins Gespräch kopieren. Das Lab sucht nicht im Web und liest keine Webseiten. Spätere Schritte kennen die Angaben der früheren Schritte, aber nicht deren Gespräche.
|
||||
|
||||
# Gesprächsführung
|
||||
|
||||
- In deiner ersten Nachricht stellst du das Lab in zwei bis drei Sätzen vor und fragst, worauf sich die Person vorbereiten möchte. Sage dazu, dass sie dich auch einfach fragen kann, wie das Lab funktioniert.
|
||||
- Stelle pro Nachricht höchstens eine Frage. Halte die Nachrichten kurz: wenige Absätze, Listen nur, wo sie helfen.
|
||||
- Beschreibt die Person ihre Aufgabe, schätze ein, ob das Lab passt, teilweise passt oder nicht passt, und begründe das in wenigen Sätzen. Frage nur nach, wenn du sonst nicht einschätzen kannst, ob es passt, etwa nach dem Format oder nach dem, was die Person erreichen möchte.
|
||||
- Passt das Lab, nenne die nächsten Schritte: Zeit einplanen, eine Vorbereitung anlegen und mit „Rahmendaten“ beginnen. Sage dazu, dass das Lab dieses Gespräch nicht in die Vorbereitung übernimmt; die Person trägt ihre Angaben dort in „Ihre Angaben“ ein.
|
||||
- Passt es nur teilweise, sage, welcher Teil passt und wofür die Person besser etwas anderes nutzt.
|
||||
- Passt es nicht, sage das freundlich und klar, und nenne, was besser passt.
|
||||
- Bereite den Auftritt hier nicht vor: keine Strategie, keine Kernbotschaften, keine Testfragen. Möchte die Person inhaltlich einsteigen, verweise auf die Vorbereitung und den passenden Schritt.
|
||||
- Beschreibe das Lab und AI Studio nur so, wie es diese Anweisungen tun. Weißt du etwas nicht, sage das, statt es zu erfinden.
|
||||
- Schreibe klar, kollegial und präzise. Vermeide übertriebenes Lob und Werbesprache.
|
||||
|
||||
# Sprache und Anrede
|
||||
|
||||
Antworte auf {{RESPONSE_LANGUAGE}}. Schreibt die Person in einer anderen Sprache, antworte in ihrer Sprache.
|
||||
|
||||
{{ADDRESS_FORM}}
|
||||
|
||||
Wenn du auf Deutsch schreibst, gendere mit Sternchen (etwa „Wissenschaftler*innen“) und verwende, wo möglich, geschlechtsneutrale Begriffe (etwa „Forschende“ oder „Teilnehmende“).
|
||||
|
||||
# Datenschutz
|
||||
|
||||
- Behaupte nicht, dass Daten sicher, intern oder nicht gespeichert sind. Das hängt vom gewählten KI-Anbieter, seinen Verarbeitungs- und Speicherregeln und der Konfiguration ab.
|
||||
- Für deine Einschätzung braucht es keine vertraulichen Einzelheiten. Rate der Person, nur einzugeben, was sie mit dem gewählten Anbieter verarbeiten darf.
|
||||
@@ -733,12 +733,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOU
|
||||
-- Use a document analysis policy
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOURCEEXTENSIONS::T3309547196"] = "Use a document analysis policy"
|
||||
|
||||
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
|
||||
|
||||
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190::INFORMAL"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
|
||||
|
||||
-- Changed on {0}
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1279137966"] = "Changed on {0}"
|
||||
|
||||
@@ -808,6 +802,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- The event has taken place
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2842348392"] = "The event has taken place"
|
||||
|
||||
-- Working with the lab
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3113015696"] = "Working with the lab"
|
||||
|
||||
-- Marked on {0}.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3254361846"] = "Marked on {0}."
|
||||
|
||||
@@ -820,6 +817,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- Delete preparation permanently
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T354252674"] = "Delete preparation permanently"
|
||||
|
||||
-- Is the lab right for my task?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3584565592"] = "Is the lab right for my task?"
|
||||
|
||||
-- Unavailable preparation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3646236084"] = "Unavailable preparation"
|
||||
|
||||
@@ -886,6 +886,90 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- Your preparations
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272::INFORMAL"] = "Your preparations"
|
||||
|
||||
-- Stop
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T1266644741"] = "Stop"
|
||||
|
||||
-- approx. {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T1992478915"] = "approx. {0} of {1} tokens"
|
||||
|
||||
-- Delete this conversation and start it over?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2055072982"] = "Delete this conversation and start it over?"
|
||||
|
||||
-- Delete this conversation and start it over?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2055072982::INFORMAL"] = "Delete this conversation and start it over?"
|
||||
|
||||
-- Start the conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2172806379"] = "Start the conversation"
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2610371636"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2610371636::INFORMAL"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- Conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2640583206"] = "Conversation"
|
||||
|
||||
-- Export message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T274919936"] = "Export message"
|
||||
|
||||
-- Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2858940496"] = "Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin."
|
||||
|
||||
-- Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2858940496::INFORMAL"] = "Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin."
|
||||
|
||||
-- AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2927156281"] = "AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2927156281::INFORMAL"] = "AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- approx. {0} tokens; the context window of this model is unknown
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T357466604"] = "approx. {0} tokens; the context window of this model is unknown"
|
||||
|
||||
-- Is the lab right for my task?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3584565592"] = "Is the lab right for my task?"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3642105949"] = "Your message"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3642105949::INFORMAL"] = "Your message"
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3734341112"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3734341112::INFORMAL"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3757008686"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3757008686::INFORMAL"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3996190985"] = "{0} of {1} tokens"
|
||||
|
||||
-- Send
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T4069397711"] = "Send"
|
||||
|
||||
-- Start over
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T606705767"] = "Start over"
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T962106497"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T962106497::INFORMAL"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T991103295"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T991103295::INFORMAL"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T1809312323"] = "Please select a provider."
|
||||
|
||||
@@ -895,6 +979,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T
|
||||
-- The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T2261674511"] = "The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug."
|
||||
|
||||
-- The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T2261674511::INFORMAL"] = "The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug."
|
||||
|
||||
-- The model of the selected provider reads too little at once for the lab. Please select another provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T3132723417"] = "The model of the selected provider reads too little at once for the lab. Please select another provider."
|
||||
|
||||
@@ -1120,6 +1207,102 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T974131333
|
||||
-- Demanding
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T985014450"] = "Demanding"
|
||||
|
||||
-- The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1231621082"] = "The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio."
|
||||
|
||||
-- The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1231621082::INFORMAL"] = "The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio."
|
||||
|
||||
-- You keep the decision about which position you take.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1509612483"] = "You keep the decision about which position you take."
|
||||
|
||||
-- You keep the decision about which position you take.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1509612483::INFORMAL"] = "You keep the decision about which position you take."
|
||||
|
||||
-- Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1637266933"] = "Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off."
|
||||
|
||||
-- Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1637266933::INFORMAL"] = "Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off."
|
||||
|
||||
-- Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2001857602"] = "Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own."
|
||||
|
||||
-- Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2001857602::INFORMAL"] = "Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own."
|
||||
|
||||
-- How to recognize good results
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2310692629"] = "How to recognize good results"
|
||||
|
||||
-- Reflect. Take a position. Communicate.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2790216724"] = "Reflect. Take a position. Communicate."
|
||||
|
||||
-- You can tell evidence, interpretation, assumptions about values, and recommendations apart.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2980837694"] = "You can tell evidence, interpretation, assumptions about values, and recommendations apart."
|
||||
|
||||
-- You can tell evidence, interpretation, assumptions about values, and recommendations apart.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2980837694::INFORMAL"] = "You can tell evidence, interpretation, assumptions about values, and recommendations apart."
|
||||
|
||||
-- What the lab does not do
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2988041082"] = "What the lab does not do"
|
||||
|
||||
-- Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3499941356"] = "Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know."
|
||||
|
||||
-- Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3499941356::INFORMAL"] = "Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know."
|
||||
|
||||
-- How to proceed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3627201124"] = "How to proceed"
|
||||
|
||||
-- Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3741175627"] = "Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'."
|
||||
|
||||
-- Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3741175627::INFORMAL"] = "Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'."
|
||||
|
||||
-- Uncertainties and the limits of your expertise stay visible.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3849094383"] = "Uncertainties and the limits of your expertise stay visible."
|
||||
|
||||
-- Uncertainties and the limits of your expertise stay visible.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3849094383::INFORMAL"] = "Uncertainties and the limits of your expertise stay visible."
|
||||
|
||||
-- The answers refer to your event and your details.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4047394881"] = "The answers refer to your event and your details."
|
||||
|
||||
-- The answers refer to your event and your details.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4047394881::INFORMAL"] = "The answers refer to your event and your details."
|
||||
|
||||
-- Create a preparation for your event with 'New preparation'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4050768390"] = "Create a preparation for your event with 'New preparation'."
|
||||
|
||||
-- Create a preparation for your event with 'New preparation'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4050768390::INFORMAL"] = "Create a preparation for your event with 'New preparation'."
|
||||
|
||||
-- Counterarguments are presented fairly.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4133199796"] = "Counterarguments are presented fairly."
|
||||
|
||||
-- The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T551596393"] = "The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions."
|
||||
|
||||
-- The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T551596393::INFORMAL"] = "The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions."
|
||||
|
||||
-- The strategy fits your real speaking time and focuses on a few key messages.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T571189717"] = "The strategy fits your real speaking time and focuses on a few key messages."
|
||||
|
||||
-- The strategy fits your real speaking time and focuses on a few key messages.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T571189717::INFORMAL"] = "The strategy fits your real speaking time and focuses on a few key messages."
|
||||
|
||||
-- Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T780122078"] = "Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation."
|
||||
|
||||
-- Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T780122078::INFORMAL"] = "Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation."
|
||||
|
||||
-- The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM).
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T799477590"] = "The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM)."
|
||||
|
||||
-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480"] = "## Welcome!\n\nThe BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.\n\nData protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this.\n\nPlease check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out.\n\nThis is a prototype, so we look forward to your feedback."
|
||||
|
||||
@@ -1129,74 +1312,11 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480::IN
|
||||
-- I have read the notes
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICEDIALOG::T4071737336"] = "I have read the notes"
|
||||
|
||||
-- Stop
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T1266644741"] = "Stop"
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLONBOARDING::T1809312323"] = "Please select a provider."
|
||||
|
||||
-- approx. {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T1992478915"] = "approx. {0} of {1} tokens"
|
||||
|
||||
-- Start the conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2172806379"] = "Start the conversation"
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2610371636"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2610371636::INFORMAL"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- Conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2640583206"] = "Conversation"
|
||||
|
||||
-- Export message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T274919936"] = "Export message"
|
||||
|
||||
-- approx. {0} tokens; the context window of this model is unknown
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T357466604"] = "approx. {0} tokens; the context window of this model is unknown"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3642105949"] = "Your message"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3642105949::INFORMAL"] = "Your message"
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3734341112"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3734341112::INFORMAL"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3757008686"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3757008686::INFORMAL"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T397620511"] = "AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T397620511::INFORMAL"] = "AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3996190985"] = "{0} of {1} tokens"
|
||||
|
||||
-- Send
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T4069397711"] = "Send"
|
||||
|
||||
-- Start over
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T606705767"] = "Start over"
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T962106497"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T962106497::INFORMAL"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T991103295"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T991103295::INFORMAL"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLONBOARDING::T1809312323::INFORMAL"] = "Please select a provider."
|
||||
|
||||
-- Test situation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1049923473"] = "Test situation"
|
||||
@@ -4966,9 +5086,6 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1259707710"] = "Your projec
|
||||
-- Your temporary chats, along with their transcripts.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1293614512"] = "Your temporary chats, along with their transcripts."
|
||||
|
||||
-- Your preparations in the BeyondFacts Lab.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1415474409"] = "Your preparations in the BeyondFacts Lab."
|
||||
|
||||
-- What belongs into a backup
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1682175486"] = "What belongs into a backup"
|
||||
|
||||
@@ -5038,6 +5155,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T3655837348"] = "Back up the
|
||||
-- Files which AI Studio needs only for a moment and deletes again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T366353671"] = "Files which AI Studio needs only for a moment and deletes again."
|
||||
|
||||
-- Your preparations and conversations in the BeyondFacts Lab.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T373025304"] = "Your preparations and conversations in the BeyondFacts Lab."
|
||||
|
||||
-- What the AI received in your chats besides your messages, such as the content of attached files, the results of tools, and passages of your data sources. It is part of your chats.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T3806894665"] = "What the AI received in your chats besides your messages, such as the content of attached files, the results of tools, and passages of your data sources. It is part of your chats."
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ public partial class DataFolders : MSGComponentBase
|
||||
DataBackupEntryKind.PLUGINS => T("Your plugins, such as the assistants you built, apart from the folders listed below."),
|
||||
DataBackupEntryKind.TOKENIZERS => T("The tokenizers you chose for your providers."),
|
||||
DataBackupEntryKind.VISUAL_BRIEFINGS => T("Your projects in the Visual Briefing Assistant."),
|
||||
DataBackupEntryKind.BEYOND_FACTS_LAB => T("Your preparations in the BeyondFacts Lab."),
|
||||
DataBackupEntryKind.BEYOND_FACTS_LAB => T("Your preparations and conversations in the BeyondFacts Lab."),
|
||||
DataBackupEntryKind.DATA_SOURCE_INDEX => T("The index of your local data sources: which files AI Studio embedded, and their text."),
|
||||
DataBackupEntryKind.VECTOR_STORES => T("The embeddings of your local data sources."),
|
||||
DataBackupEntryKind.MEDIA_TRANSCRIPTS => T("The transcripts of the audio and video files in your local data sources."),
|
||||
|
||||
+196
-76
@@ -735,12 +735,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOU
|
||||
-- Use a document analysis policy
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOURCEEXTENSIONS::T3309547196"] = "Regelwerk für die Dokumentenanalyse verwenden"
|
||||
|
||||
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190"] = "Bereiten Sie einen herausfordernden Auftritt mit Ihrer Forschung Schritt für Schritt vor, etwa eine Podiumsdiskussion, ein Interview oder eine Anhörung. Jede Vorbereitung gehört zu einer Veranstaltung und hat eigene Schritte, Chats und Arbeitsstände."
|
||||
|
||||
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190::INFORMAL"] = "Bereite einen herausfordernden Auftritt mit deiner Forschung Schritt für Schritt vor, etwa eine Podiumsdiskussion, ein Interview oder eine Anhörung. Jede Vorbereitung gehört zu einer Veranstaltung und hat eigene Schritte, Chats und Arbeitsstände."
|
||||
|
||||
-- Changed on {0}
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1279137966"] = "Geändert am {0}"
|
||||
|
||||
@@ -810,6 +804,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- The event has taken place
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2842348392"] = "Die Veranstaltung hat stattgefunden"
|
||||
|
||||
-- Working with the lab
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3113015696"] = "Mit dem Lab arbeiten"
|
||||
|
||||
-- Marked on {0}.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3254361846"] = "Markiert am {0}."
|
||||
|
||||
@@ -822,6 +819,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- Delete preparation permanently
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T354252674"] = "Vorbereitung endgültig löschen"
|
||||
|
||||
-- Is the lab right for my task?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3584565592"] = "Passt das Lab zu meiner Aufgabe?"
|
||||
|
||||
-- Unavailable preparation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3646236084"] = "Vorbereitung nicht verfügbar"
|
||||
|
||||
@@ -888,6 +888,90 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- Your preparations
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272::INFORMAL"] = "Deine Vorbereitungen"
|
||||
|
||||
-- Stop
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T1266644741"] = "Stoppen"
|
||||
|
||||
-- approx. {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T1992478915"] = "ca. {0} von {1} Token"
|
||||
|
||||
-- Delete this conversation and start it over?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2055072982"] = "Dieses Gespräch löschen und neu beginnen?"
|
||||
|
||||
-- Delete this conversation and start it over?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2055072982::INFORMAL"] = "Dieses Gespräch löschen und neu beginnen?"
|
||||
|
||||
-- Start the conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2172806379"] = "Gespräch beginnen"
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2610371636"] = "Das Lab eröffnet das Gespräch dieses Schritts mit dem, was Ihre Angaben schon sagen, und fragt nach dem, was fehlt. Sie können auch zuerst schreiben."
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2610371636::INFORMAL"] = "Das Lab eröffnet das Gespräch dieses Schritts mit dem, was deine Angaben schon sagen, und fragt nach dem, was fehlt. Du kannst auch zuerst schreiben."
|
||||
|
||||
-- Conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2640583206"] = "Gespräch"
|
||||
|
||||
-- Export message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T274919936"] = "Nachricht exportieren"
|
||||
|
||||
-- Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2858940496"] = "Erzählen Sie dem Lab, worauf Sie sich vorbereiten. Es sagt Ihnen, ob es zu Ihrer Aufgabe passt und wie Sie damit arbeiten. Sie können das Lab auch beginnen lassen."
|
||||
|
||||
-- Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2858940496::INFORMAL"] = "Erzähl dem Lab, worauf du dich vorbereitest. Es sagt dir, ob es zu deiner Aufgabe passt und wie du damit arbeitest. Du kannst das Lab auch beginnen lassen."
|
||||
|
||||
-- AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2927156281"] = "AI Studio kann dieses Gespräch nicht öffnen. Die Datei ist möglicherweise beschädigt oder wurde mit einer neueren Version von AI Studio gespeichert. Sie können das Gespräch neu beginnen; dabei wird es gelöscht."
|
||||
|
||||
-- AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2927156281::INFORMAL"] = "AI Studio kann dieses Gespräch nicht öffnen. Die Datei ist möglicherweise beschädigt oder wurde mit einer neueren Version von AI Studio gespeichert. Du kannst das Gespräch neu beginnen; dabei wird es gelöscht."
|
||||
|
||||
-- approx. {0} tokens; the context window of this model is unknown
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T357466604"] = "ca. {0} Token; das Kontextfenster dieses Modells ist unbekannt"
|
||||
|
||||
-- Is the lab right for my task?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3584565592"] = "Passt das Lab zu meiner Aufgabe?"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3642105949"] = "Ihre Nachricht"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3642105949::INFORMAL"] = "Deine Nachricht"
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3734341112"] = "Das Gespräch dieses Schritts löschen und neu beginnen? Ihre Angaben bleiben unverändert."
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3734341112::INFORMAL"] = "Das Gespräch dieses Schritts löschen und neu beginnen? Deine Angaben bleiben unverändert."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3757008686"] = "AI Studio konnte dieses Gespräch nicht löschen. Bitte versuchen Sie es erneut."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3757008686::INFORMAL"] = "AI Studio konnte dieses Gespräch nicht löschen. Bitte versuche es erneut."
|
||||
|
||||
-- {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3996190985"] = "{0} von {1} Token"
|
||||
|
||||
-- Send
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T4069397711"] = "Senden"
|
||||
|
||||
-- Start over
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T606705767"] = "Neu beginnen"
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T962106497"] = "Dieses Gespräch füllt das Kontextfenster des Modells. Beginnen Sie es neu, oder wählen Sie einen Anbieter, dessen Modell mehr auf einmal verarbeitet."
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T962106497::INFORMAL"] = "Dieses Gespräch füllt das Kontextfenster des Modells. Beginne es neu, oder wähle einen Anbieter, dessen Modell mehr auf einmal verarbeitet."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T991103295"] = "Dieses Gespräch füllt den größten Teil des Kontextfensters des Modells. Bald müssen Sie es neu beginnen."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T991103295::INFORMAL"] = "Dieses Gespräch füllt den größten Teil des Kontextfensters des Modells. Bald musst du es neu beginnen."
|
||||
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T1809312323"] = "Bitte wählen Sie einen Anbieter aus."
|
||||
|
||||
@@ -897,6 +981,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T
|
||||
-- The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T2261674511"] = "Das BeyondFacts Lab konnte die Anweisungen für das Modell nicht zusammenstellen. Bitte melden Sie dies als Fehler."
|
||||
|
||||
-- The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T2261674511::INFORMAL"] = "Das BeyondFacts Lab konnte die Anweisungen für das Modell nicht zusammenstellen. Bitte melde dies als Fehler."
|
||||
|
||||
-- The model of the selected provider reads too little at once for the lab. Please select another provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T3132723417"] = "Das Modell des ausgewählten Anbieters verarbeitet zu wenig auf einmal für das Lab. Bitte wählen Sie einen anderen Anbieter aus."
|
||||
|
||||
@@ -1122,6 +1209,102 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T974131333
|
||||
-- Demanding
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T985014450"] = "Anspruchsvoll"
|
||||
|
||||
-- The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1231621082"] = "Das Lab schreibt keine Pressemitteilungen oder anderen PR-Texte und prüft keine Fakten. Es ersetzt weder Ihre eigene fachliche Prüfung noch die Rechts- und Datenschutzberatung Ihrer Institution, und es nimmt Ihnen keine politische oder normative Entscheidung ab. Für einen schnellen Text nutzen Sie den Chat oder einen anderen Assistenten von AI Studio."
|
||||
|
||||
-- The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1231621082::INFORMAL"] = "Das Lab schreibt keine Pressemitteilungen oder anderen PR-Texte und prüft keine Fakten. Es ersetzt weder deine eigene fachliche Prüfung noch die Rechts- und Datenschutzberatung deiner Institution, und es nimmt dir keine politische oder normative Entscheidung ab. Für einen schnellen Text nutze den Chat oder einen anderen Assistenten von AI Studio."
|
||||
|
||||
-- You keep the decision about which position you take.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1509612483"] = "Sie behalten die Entscheidung darüber, welche Position Sie vertreten."
|
||||
|
||||
-- You keep the decision about which position you take.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1509612483::INFORMAL"] = "Du behältst die Entscheidung darüber, welche Position du vertrittst."
|
||||
|
||||
-- Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1637266933"] = "Planen Sie für eine Vorbereitung etwa 30 bis 60 Minuten ein. Sie können jederzeit unterbrechen: AI Studio speichert Ihre Angaben und Gespräche, und Sie machen später dort weiter, wo Sie aufgehört haben."
|
||||
|
||||
-- Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1637266933::INFORMAL"] = "Plane für eine Vorbereitung etwa 30 bis 60 Minuten ein. Du kannst jederzeit unterbrechen: AI Studio speichert deine Angaben und Gespräche, und du machst später dort weiter, wo du aufgehört hast."
|
||||
|
||||
-- Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2001857602"] = "Bearbeiten Sie die sieben Schritte in beliebiger Reihenfolge. Jeder Schritt hat das Formular „Ihre Angaben“ und ein eigenes Gespräch."
|
||||
|
||||
-- Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2001857602::INFORMAL"] = "Bearbeite die sieben Schritte in beliebiger Reihenfolge. Jeder Schritt hat das Formular „Deine Angaben“ und ein eigenes Gespräch."
|
||||
|
||||
-- How to recognize good results
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2310692629"] = "Gute Ergebnisse erkennen"
|
||||
|
||||
-- Reflect. Take a position. Communicate.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2790216724"] = "Reflektieren. Positionieren. Kommunizieren."
|
||||
|
||||
-- You can tell evidence, interpretation, assumptions about values, and recommendations apart.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2980837694"] = "Sie können Evidenz, Interpretation, Wertannahmen und Empfehlungen auseinanderhalten."
|
||||
|
||||
-- You can tell evidence, interpretation, assumptions about values, and recommendations apart.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2980837694::INFORMAL"] = "Du kannst Evidenz, Interpretation, Wertannahmen und Empfehlungen auseinanderhalten."
|
||||
|
||||
-- What the lab does not do
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2988041082"] = "Was das Lab nicht tut"
|
||||
|
||||
-- Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3499941356"] = "Lassen Sie das Lab das Gespräch eines Schritts beginnen, oder schreiben Sie zuerst und sagen Sie, wobei Sie Unterstützung möchten, etwa bei Ihrer Rolle, Ihrer Strategie oder mit einer Runde kritischer Fragen. Sie können jederzeit „Ich weiß es nicht“ antworten."
|
||||
|
||||
-- Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3499941356::INFORMAL"] = "Lass das Lab das Gespräch eines Schritts beginnen, oder schreib zuerst und sag, wobei du Unterstützung möchtest, etwa bei deiner Rolle, deiner Strategie oder mit einer Runde kritischer Fragen. Du kannst jederzeit „Ich weiß es nicht“ antworten."
|
||||
|
||||
-- How to proceed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3627201124"] = "So geht es"
|
||||
|
||||
-- Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3741175627"] = "Sie sind nicht sicher, ob das Lab zu Ihrer Aufgabe passt? Fragen Sie es unter „Passt das Lab zu meiner Aufgabe?“."
|
||||
|
||||
-- Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3741175627::INFORMAL"] = "Du bist nicht sicher, ob das Lab zu deiner Aufgabe passt? Frag es unter „Passt das Lab zu meiner Aufgabe?“."
|
||||
|
||||
-- Uncertainties and the limits of your expertise stay visible.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3849094383"] = "Unsicherheiten und die Grenzen Ihrer Expertise bleiben sichtbar."
|
||||
|
||||
-- Uncertainties and the limits of your expertise stay visible.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3849094383::INFORMAL"] = "Unsicherheiten und die Grenzen deiner Expertise bleiben sichtbar."
|
||||
|
||||
-- The answers refer to your event and your details.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4047394881"] = "Die Antworten beziehen sich auf Ihre Veranstaltung und Ihre Angaben."
|
||||
|
||||
-- The answers refer to your event and your details.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4047394881::INFORMAL"] = "Die Antworten beziehen sich auf deine Veranstaltung und deine Angaben."
|
||||
|
||||
-- Create a preparation for your event with 'New preparation'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4050768390"] = "Erstellen Sie mit „Neue Vorbereitung“ eine Vorbereitung für Ihre Veranstaltung."
|
||||
|
||||
-- Create a preparation for your event with 'New preparation'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4050768390::INFORMAL"] = "Erstelle mit „Neue Vorbereitung“ eine Vorbereitung für deine Veranstaltung."
|
||||
|
||||
-- Counterarguments are presented fairly.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4133199796"] = "Gegenargumente werden fair dargestellt."
|
||||
|
||||
-- The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T551596393"] = "Das Lab ist ein Reflexions- und Trainingswerkzeug für Forschende und alle, die Wissenschaft kommunizieren. Es hilft Ihnen, einen herausfordernden öffentlichen Auftritt vorzubereiten, etwa einen Vortrag, eine Podiumsdiskussion, ein Interview oder eine Anhörung: nicht nur inhaltlich, sondern auch strategisch und ethisch. Sie klären Ihre Ziele und Ihre Rolle, machen wissenschaftliche Unsicherheiten und Wertannahmen sichtbar, reflektieren das Framing und üben den Umgang mit kritischen Fragen."
|
||||
|
||||
-- The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T551596393::INFORMAL"] = "Das Lab ist ein Reflexions- und Trainingswerkzeug für Forschende und alle, die Wissenschaft kommunizieren. Es hilft dir, einen herausfordernden öffentlichen Auftritt vorzubereiten, etwa einen Vortrag, eine Podiumsdiskussion, ein Interview oder eine Anhörung: nicht nur inhaltlich, sondern auch strategisch und ethisch. Du klärst deine Ziele und deine Rolle, machst wissenschaftliche Unsicherheiten und Wertannahmen sichtbar, reflektierst das Framing und übst den Umgang mit kritischen Fragen."
|
||||
|
||||
-- The strategy fits your real speaking time and focuses on a few key messages.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T571189717"] = "Die Strategie passt zu Ihrer realen Redezeit und beschränkt sich auf wenige Kernbotschaften."
|
||||
|
||||
-- The strategy fits your real speaking time and focuses on a few key messages.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T571189717::INFORMAL"] = "Die Strategie passt zu deiner realen Redezeit und beschränkt sich auf wenige Kernbotschaften."
|
||||
|
||||
-- Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T780122078"] = "Tragen Sie ein, was Sie wissen. Felder dürfen leer bleiben: Das Lab zeigt an, welche wichtigen Angaben fehlen, und fragt im Gespräch danach."
|
||||
|
||||
-- Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T780122078::INFORMAL"] = "Trag ein, was du weißt. Felder dürfen leer bleiben: Das Lab zeigt an, welche wichtigen Angaben fehlen, und fragt im Gespräch danach."
|
||||
|
||||
-- The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM).
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T799477590"] = "Die Wissensbasis des Labs ist ein Leitfaden von Lara Wüster von der Technischen Universität München (TUM) über Wissenschaft im öffentlichen Diskurs."
|
||||
|
||||
-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480"] = "## Herzlich willkommen!\n\nIm BeyondFacts Lab werden Sie durch einen geführten, KI-unterstützten Reflexionsprozess geleitet, der Ihnen dabei hilft, sich in herausfordernden Kommunikationssituationen zu positionieren und kommunikationsfähig zu bleiben.\n\nDer Datenschutz hängt vom gewählten KI-Anbieter, dessen Verarbeitungs- und Speicherregeln sowie Ihrer Konfiguration ab. Geben Sie nur Daten ein, die dafür geeignet und freigegeben sind.\n\nBitte prüfen Sie alle Ergebnisse kritisch. Die Antworten können, je nach KI-Modell, unterschiedlich ausfallen. Halluzinationen sind nicht ausgeschlossen.\n\nEs handelt sich um einen Prototyp, daher freuen wir uns über Ihr Feedback."
|
||||
|
||||
@@ -1131,74 +1314,11 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480::IN
|
||||
-- I have read the notes
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICEDIALOG::T4071737336"] = "Ich habe die Hinweise gelesen"
|
||||
|
||||
-- Stop
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T1266644741"] = "Stoppen"
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLONBOARDING::T1809312323"] = "Bitte wählen Sie einen Anbieter aus."
|
||||
|
||||
-- approx. {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T1992478915"] = "ca. {0} von {1} Token"
|
||||
|
||||
-- Start the conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2172806379"] = "Gespräch beginnen"
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2610371636"] = "Das Lab eröffnet das Gespräch dieses Schritts mit dem, was Ihre Angaben schon sagen, und fragt nach dem, was fehlt. Sie können auch zuerst schreiben."
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2610371636::INFORMAL"] = "Das Lab eröffnet das Gespräch dieses Schritts mit dem, was deine Angaben schon sagen, und fragt nach dem, was fehlt. Du kannst auch zuerst schreiben."
|
||||
|
||||
-- Conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2640583206"] = "Gespräch"
|
||||
|
||||
-- Export message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T274919936"] = "Nachricht exportieren"
|
||||
|
||||
-- approx. {0} tokens; the context window of this model is unknown
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T357466604"] = "ca. {0} Token; das Kontextfenster dieses Modells ist unbekannt"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3642105949"] = "Ihre Nachricht"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3642105949::INFORMAL"] = "Deine Nachricht"
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3734341112"] = "Das Gespräch dieses Schritts löschen und neu beginnen? Ihre Angaben bleiben unverändert."
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3734341112::INFORMAL"] = "Das Gespräch dieses Schritts löschen und neu beginnen? Deine Angaben bleiben unverändert."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3757008686"] = "AI Studio konnte dieses Gespräch nicht löschen. Bitte versuchen Sie es erneut."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3757008686::INFORMAL"] = "AI Studio konnte dieses Gespräch nicht löschen. Bitte versuche es erneut."
|
||||
|
||||
-- AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T397620511"] = "AI Studio kann das Gespräch dieses Schritts nicht öffnen. Die Datei ist möglicherweise beschädigt oder wurde mit einer neueren Version von AI Studio gespeichert. Sie können das Gespräch neu beginnen; dabei wird es gelöscht."
|
||||
|
||||
-- AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T397620511::INFORMAL"] = "AI Studio kann das Gespräch dieses Schritts nicht öffnen. Die Datei ist möglicherweise beschädigt oder wurde mit einer neueren Version von AI Studio gespeichert. Du kannst das Gespräch neu beginnen; dabei wird es gelöscht."
|
||||
|
||||
-- {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3996190985"] = "{0} von {1} Token"
|
||||
|
||||
-- Send
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T4069397711"] = "Senden"
|
||||
|
||||
-- Start over
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T606705767"] = "Neu beginnen"
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T962106497"] = "Dieses Gespräch füllt das Kontextfenster des Modells. Beginnen Sie es neu, oder wählen Sie einen Anbieter, dessen Modell mehr auf einmal verarbeitet."
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T962106497::INFORMAL"] = "Dieses Gespräch füllt das Kontextfenster des Modells. Beginne es neu, oder wähle einen Anbieter, dessen Modell mehr auf einmal verarbeitet."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T991103295"] = "Dieses Gespräch füllt den größten Teil des Kontextfensters des Modells. Bald müssen Sie es neu beginnen."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T991103295::INFORMAL"] = "Dieses Gespräch füllt den größten Teil des Kontextfensters des Modells. Bald musst du es neu beginnen."
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLONBOARDING::T1809312323::INFORMAL"] = "Bitte wähle einen Anbieter aus."
|
||||
|
||||
-- Test situation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1049923473"] = "Testsituation"
|
||||
@@ -4968,9 +5088,6 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1259707710"] = "Ihre Projek
|
||||
-- Your temporary chats, along with their transcripts.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1293614512"] = "Ihre temporären Chats mit ihren Transkripten."
|
||||
|
||||
-- Your preparations in the BeyondFacts Lab.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1415474409"] = "Ihre Vorbereitungen im BeyondFacts Lab."
|
||||
|
||||
-- What belongs into a backup
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1682175486"] = "Was in eine Sicherung gehört"
|
||||
|
||||
@@ -5040,6 +5157,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T3655837348"] = "Sichern Sie
|
||||
-- Files which AI Studio needs only for a moment and deletes again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T366353671"] = "Dateien, die AI Studio nur kurz benötigt und anschließend wieder löscht."
|
||||
|
||||
-- Your preparations and conversations in the BeyondFacts Lab.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T373025304"] = "Ihre Vorbereitungen und Gespräche im BeyondFacts Lab."
|
||||
|
||||
-- What the AI received in your chats besides your messages, such as the content of attached files, the results of tools, and passages of your data sources. It is part of your chats.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T3806894665"] = "Was die KI in Ihren Chats zusätzlich zu Ihren Nachrichten erhalten hat, z. B. den Inhalt angehängter Dateien, die Ergebnisse von Werkzeugen und Textstellen aus Ihren Datenquellen. Diese Inhalte sind Teil Ihrer Chats."
|
||||
|
||||
|
||||
+196
-76
@@ -735,12 +735,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOU
|
||||
-- Use a document analysis policy
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOURCEEXTENSIONS::T3309547196"] = "Use a document analysis policy"
|
||||
|
||||
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
|
||||
|
||||
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190::INFORMAL"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
|
||||
|
||||
-- Changed on {0}
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1279137966"] = "Changed on {0}"
|
||||
|
||||
@@ -810,6 +804,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- The event has taken place
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2842348392"] = "The event has taken place"
|
||||
|
||||
-- Working with the lab
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3113015696"] = "Working with the lab"
|
||||
|
||||
-- Marked on {0}.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3254361846"] = "Marked on {0}."
|
||||
|
||||
@@ -822,6 +819,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- Delete preparation permanently
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T354252674"] = "Delete preparation permanently"
|
||||
|
||||
-- Is the lab right for my task?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3584565592"] = "Is the lab right for my task?"
|
||||
|
||||
-- Unavailable preparation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3646236084"] = "Unavailable preparation"
|
||||
|
||||
@@ -888,6 +888,90 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
|
||||
-- Your preparations
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272::INFORMAL"] = "Your preparations"
|
||||
|
||||
-- Stop
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T1266644741"] = "Stop"
|
||||
|
||||
-- approx. {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T1992478915"] = "approx. {0} of {1} tokens"
|
||||
|
||||
-- Delete this conversation and start it over?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2055072982"] = "Delete this conversation and start it over?"
|
||||
|
||||
-- Delete this conversation and start it over?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2055072982::INFORMAL"] = "Delete this conversation and start it over?"
|
||||
|
||||
-- Start the conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2172806379"] = "Start the conversation"
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2610371636"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2610371636::INFORMAL"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- Conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2640583206"] = "Conversation"
|
||||
|
||||
-- Export message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T274919936"] = "Export message"
|
||||
|
||||
-- Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2858940496"] = "Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin."
|
||||
|
||||
-- Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2858940496::INFORMAL"] = "Tell the lab what you are preparing for. It tells you whether it fits your task and how to work with it. You can also let the lab begin."
|
||||
|
||||
-- AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2927156281"] = "AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T2927156281::INFORMAL"] = "AI Studio cannot open this conversation. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- approx. {0} tokens; the context window of this model is unknown
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T357466604"] = "approx. {0} tokens; the context window of this model is unknown"
|
||||
|
||||
-- Is the lab right for my task?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3584565592"] = "Is the lab right for my task?"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3642105949"] = "Your message"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3642105949::INFORMAL"] = "Your message"
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3734341112"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3734341112::INFORMAL"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3757008686"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3757008686::INFORMAL"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T3996190985"] = "{0} of {1} tokens"
|
||||
|
||||
-- Send
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T4069397711"] = "Send"
|
||||
|
||||
-- Start over
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T606705767"] = "Start over"
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T962106497"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T962106497::INFORMAL"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T991103295"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCHAT::T991103295::INFORMAL"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T1809312323"] = "Please select a provider."
|
||||
|
||||
@@ -897,6 +981,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T
|
||||
-- The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T2261674511"] = "The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug."
|
||||
|
||||
-- The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T2261674511::INFORMAL"] = "The BeyondFacts Lab could not put together its instructions for the model. Please report this as a bug."
|
||||
|
||||
-- The model of the selected provider reads too little at once for the lab. Please select another provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLCONVERSATIONSERVICE::T3132723417"] = "The model of the selected provider reads too little at once for the lab. Please select another provider."
|
||||
|
||||
@@ -1122,6 +1209,102 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T974131333
|
||||
-- Demanding
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T985014450"] = "Demanding"
|
||||
|
||||
-- The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1231621082"] = "The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio."
|
||||
|
||||
-- The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1231621082::INFORMAL"] = "The lab writes no press releases or other PR texts, and it checks no facts. It replaces neither your own expert review nor the legal and data protection advice of your institution, and it makes no political or normative decision for you. For a quick text, use the chat or another assistant of AI Studio."
|
||||
|
||||
-- You keep the decision about which position you take.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1509612483"] = "You keep the decision about which position you take."
|
||||
|
||||
-- You keep the decision about which position you take.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1509612483::INFORMAL"] = "You keep the decision about which position you take."
|
||||
|
||||
-- Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1637266933"] = "Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off."
|
||||
|
||||
-- Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T1637266933::INFORMAL"] = "Plan about 30 to 60 minutes for a preparation. You can pause at any time: AI Studio saves your details and conversations, and you continue where you left off."
|
||||
|
||||
-- Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2001857602"] = "Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own."
|
||||
|
||||
-- Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2001857602::INFORMAL"] = "Work through the seven steps, in any order you like. Each step has the form 'Your details' and a conversation of its own."
|
||||
|
||||
-- How to recognize good results
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2310692629"] = "How to recognize good results"
|
||||
|
||||
-- Reflect. Take a position. Communicate.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2790216724"] = "Reflect. Take a position. Communicate."
|
||||
|
||||
-- You can tell evidence, interpretation, assumptions about values, and recommendations apart.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2980837694"] = "You can tell evidence, interpretation, assumptions about values, and recommendations apart."
|
||||
|
||||
-- You can tell evidence, interpretation, assumptions about values, and recommendations apart.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2980837694::INFORMAL"] = "You can tell evidence, interpretation, assumptions about values, and recommendations apart."
|
||||
|
||||
-- What the lab does not do
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T2988041082"] = "What the lab does not do"
|
||||
|
||||
-- Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3499941356"] = "Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know."
|
||||
|
||||
-- Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3499941356::INFORMAL"] = "Let the lab start the conversation of a step, or write first and say what support you want, e.g., with your role, your strategy, or a round of critical questions. You can always say that you do not know."
|
||||
|
||||
-- How to proceed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3627201124"] = "How to proceed"
|
||||
|
||||
-- Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3741175627"] = "Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'."
|
||||
|
||||
-- Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3741175627::INFORMAL"] = "Not sure whether the lab fits your task? Ask it in 'Is the lab right for my task?'."
|
||||
|
||||
-- Uncertainties and the limits of your expertise stay visible.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3849094383"] = "Uncertainties and the limits of your expertise stay visible."
|
||||
|
||||
-- Uncertainties and the limits of your expertise stay visible.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T3849094383::INFORMAL"] = "Uncertainties and the limits of your expertise stay visible."
|
||||
|
||||
-- The answers refer to your event and your details.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4047394881"] = "The answers refer to your event and your details."
|
||||
|
||||
-- The answers refer to your event and your details.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4047394881::INFORMAL"] = "The answers refer to your event and your details."
|
||||
|
||||
-- Create a preparation for your event with 'New preparation'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4050768390"] = "Create a preparation for your event with 'New preparation'."
|
||||
|
||||
-- Create a preparation for your event with 'New preparation'.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4050768390::INFORMAL"] = "Create a preparation for your event with 'New preparation'."
|
||||
|
||||
-- Counterarguments are presented fairly.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T4133199796"] = "Counterarguments are presented fairly."
|
||||
|
||||
-- The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T551596393"] = "The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions."
|
||||
|
||||
-- The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T551596393::INFORMAL"] = "The lab is a tool for reflection and training for researchers and science communicators. It helps you prepare a challenging public appearance, such as a talk, a panel discussion, an interview, or a hearing: not only its content, but also its strategy and its ethics. You clarify your goals and your role, make scientific uncertainties and assumptions about values visible, reflect on framing, and practice critical questions."
|
||||
|
||||
-- The strategy fits your real speaking time and focuses on a few key messages.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T571189717"] = "The strategy fits your real speaking time and focuses on a few key messages."
|
||||
|
||||
-- The strategy fits your real speaking time and focuses on a few key messages.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T571189717::INFORMAL"] = "The strategy fits your real speaking time and focuses on a few key messages."
|
||||
|
||||
-- Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T780122078"] = "Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation."
|
||||
|
||||
-- Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T780122078::INFORMAL"] = "Fill in what you know. Fields may stay empty: the lab shows which key details are missing and asks for them in the conversation."
|
||||
|
||||
-- The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM).
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLINTRODUCTION::T799477590"] = "The knowledge base of the lab is a guide on science in public debates by Lara Wüster from the Technical University of Munich (TUM)."
|
||||
|
||||
-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480"] = "## Welcome!\n\nThe BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.\n\nData protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this.\n\nPlease check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out.\n\nThis is a prototype, so we look forward to your feedback."
|
||||
|
||||
@@ -1131,74 +1314,11 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480::IN
|
||||
-- I have read the notes
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICEDIALOG::T4071737336"] = "I have read the notes"
|
||||
|
||||
-- Stop
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T1266644741"] = "Stop"
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLONBOARDING::T1809312323"] = "Please select a provider."
|
||||
|
||||
-- approx. {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T1992478915"] = "approx. {0} of {1} tokens"
|
||||
|
||||
-- Start the conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2172806379"] = "Start the conversation"
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2610371636"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2610371636::INFORMAL"] = "The lab opens the conversation of this step with what your details already say, and asks for what is missing. You can also write first."
|
||||
|
||||
-- Conversation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T2640583206"] = "Conversation"
|
||||
|
||||
-- Export message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T274919936"] = "Export message"
|
||||
|
||||
-- approx. {0} tokens; the context window of this model is unknown
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T357466604"] = "approx. {0} tokens; the context window of this model is unknown"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3642105949"] = "Your message"
|
||||
|
||||
-- Your message
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3642105949::INFORMAL"] = "Your message"
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3734341112"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- Delete the conversation of this step and start it over? Your details stay as they are.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3734341112::INFORMAL"] = "Delete the conversation of this step and start it over? Your details stay as they are."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3757008686"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- AI Studio could not delete this conversation. Please try again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3757008686::INFORMAL"] = "AI Studio could not delete this conversation. Please try again."
|
||||
|
||||
-- AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T397620511"] = "AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T397620511::INFORMAL"] = "AI Studio cannot open the conversation of this step. Its file may be damaged, or a newer version of AI Studio stored it. You can start the conversation over, which deletes it."
|
||||
|
||||
-- {0} of {1} tokens
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T3996190985"] = "{0} of {1} tokens"
|
||||
|
||||
-- Send
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T4069397711"] = "Send"
|
||||
|
||||
-- Start over
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T606705767"] = "Start over"
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T962106497"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T962106497::INFORMAL"] = "This conversation fills the context window of the model. Start it over, or choose a provider whose model reads more at once."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T991103295"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
|
||||
-- This conversation fills most of the context window of the model. Soon, you will have to start it over.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPCHAT::T991103295::INFORMAL"] = "This conversation fills most of the context window of the model. Soon, you will have to start it over."
|
||||
-- Please select a provider.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLONBOARDING::T1809312323::INFORMAL"] = "Please select a provider."
|
||||
|
||||
-- Test situation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1049923473"] = "Test situation"
|
||||
@@ -4968,9 +5088,6 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1259707710"] = "Your projec
|
||||
-- Your temporary chats, along with their transcripts.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1293614512"] = "Your temporary chats, along with their transcripts."
|
||||
|
||||
-- Your preparations in the BeyondFacts Lab.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1415474409"] = "Your preparations in the BeyondFacts Lab."
|
||||
|
||||
-- What belongs into a backup
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T1682175486"] = "What belongs into a backup"
|
||||
|
||||
@@ -5040,6 +5157,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T3655837348"] = "Back up the
|
||||
-- Files which AI Studio needs only for a moment and deletes again.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T366353671"] = "Files which AI Studio needs only for a moment and deletes again."
|
||||
|
||||
-- Your preparations and conversations in the BeyondFacts Lab.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T373025304"] = "Your preparations and conversations in the BeyondFacts Lab."
|
||||
|
||||
-- What the AI received in your chats besides your messages, such as the content of attached files, the results of tools, and passages of your data sources. It is part of your chats.
|
||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATAFOLDERS::T3806894665"] = "What the AI received in your chats besides your messages, such as the content of attached files, the results of tools, and passages of your data sources. It is part of your chats."
|
||||
|
||||
|
||||
@@ -4,13 +4,13 @@ namespace AIStudio.Tools.Services;
|
||||
|
||||
/// <summary>
|
||||
/// Where the cleanup of the provenance store at the start finds a chat: in a workspace, among the temporary chats,
|
||||
/// or in a preparation of the BeyondFacts Lab.
|
||||
/// or in the BeyondFacts Lab.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Create it with InWorkspace or InLab.
|
||||
/// </remarks>
|
||||
/// <param name="WorkspaceId">The workspace of a chat outside the lab, Guid.Empty for a temporary chat.</param>
|
||||
/// <param name="LabThread">The step of the preparation a chat of the lab belongs to, or null for any other chat.</param>
|
||||
/// <param name="LabThread">Where a chat of the lab belongs, or null for any other chat.</param>
|
||||
public readonly record struct StoredChatLocation(Guid WorkspaceId, BflThreadLocation? LabThread)
|
||||
{
|
||||
/// <summary>
|
||||
@@ -22,6 +22,6 @@ public readonly record struct StoredChatLocation(Guid WorkspaceId, BflThreadLoca
|
||||
/// <summary>
|
||||
/// Gets the place of a chat of the BeyondFacts Lab.
|
||||
/// </summary>
|
||||
/// <param name="thread">The step of the preparation the chat belongs to.</param>
|
||||
/// <param name="thread">Where the chat belongs in the lab.</param>
|
||||
public static StoredChatLocation InLab(BflThreadLocation thread) => new(Guid.Empty, thread);
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
# v26.11.2, build 261 (2026-11-xx xx:xx UTC)
|
||||
- Added the BeyondFacts Lab as a prototype. It helps researchers prepare step by step for a challenging appearance, such as a panel discussion, an interview, or a hearing. Each event gets a preparation of its own, which leads you through seven steps, from the details of the event to what you take away, and shows you which key details are still missing. In each step, a chat guides you with questions, based on your details and a guide on science in public debates. Your preparations are part of your data backups. To try it, open the app settings, allow preview features down to prototype, and enable the BeyondFacts Lab. Thanks to Lara Wüster from the Technical University of Munich (TUM) for the concept and the content of the lab.
|
||||
- Added the BeyondFacts Lab as a prototype. It helps researchers prepare step by step for a challenging appearance, such as a panel discussion, an interview, or a hearing. An introduction explains how to work with the lab, and a chat tells you whether the lab fits your task. Each event gets a preparation of its own, which leads you through seven steps, from the details of the event to what you take away, and shows you which key details are still missing. In each step, a chat guides you with questions, based on your details and a guide on science in public debates. Your preparations are part of your data backups. To try it, open the app settings, allow preview features down to prototype, and enable the BeyondFacts Lab. Thanks to Lara Wüster from the Technical University of Munich (TUM) for the concept and the content of the lab.
|
||||
@@ -35,7 +35,7 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
|
||||
var thread = await store.LoadThreadAsync(new BflThreadLocation(created.ProjectId, BflStep.FRAMEWORK));
|
||||
var thread = await store.LoadThreadAsync(new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK));
|
||||
|
||||
Assert.That(thread, Is.Null);
|
||||
}
|
||||
@@ -45,10 +45,11 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var location = new BflThreadLocation(created.ProjectId, BflStep.KNOWLEDGE);
|
||||
var location = new BflStepThreadLocation(created.ProjectId, BflStep.KNOWLEDGE);
|
||||
var thread = WithMessage(BflThreadFactory.Create(location), "Worauf beruht meine Expertise?");
|
||||
|
||||
var changed = await store.SaveThreadAsync(location, thread);
|
||||
await store.SaveThreadAsync(location, thread);
|
||||
var changed = await store.LoadAsync(created.ProjectId);
|
||||
var loaded = await this.CreateStore().LoadThreadAsync(location);
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
@@ -57,7 +58,7 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
Assert.That(loaded!.ChatId, Is.EqualTo(location.ChatId));
|
||||
Assert.That(loaded.Blocks, Has.Count.EqualTo(1));
|
||||
Assert.That(((ContentText)loaded.Blocks[0].Content!).Text, Is.EqualTo("Worauf beruht meine Expertise?"));
|
||||
Assert.That(changed.ModifiedAtUtc, Is.GreaterThan(created.ModifiedAtUtc), "A conversation is work on the preparation.");
|
||||
Assert.That(changed!.ModifiedAtUtc, Is.GreaterThan(created.ModifiedAtUtc), "A conversation is work on the preparation.");
|
||||
Assert.That(File.Exists(Path.Combine(this.RootDirectory, created.ProjectId.ToString("D"), "steps", "02-knowledge", "thread.json")), Is.True);
|
||||
}
|
||||
}
|
||||
@@ -67,9 +68,9 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var thread = BflThreadFactory.Create(new BflThreadLocation(created.ProjectId, BflStep.STRATEGY));
|
||||
var thread = BflThreadFactory.Create(new BflStepThreadLocation(created.ProjectId, BflStep.STRATEGY));
|
||||
|
||||
await Assert.ThrowsAsync<ArgumentException>(async () => await store.SaveThreadAsync(new BflThreadLocation(created.ProjectId, BflStep.FRAMEWORK), thread));
|
||||
await Assert.ThrowsAsync<ArgumentException>(async () => await store.SaveThreadAsync(new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK), thread));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -77,7 +78,7 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var location = new BflThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
var location = new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
await store.DeleteAsync(created.ProjectId);
|
||||
|
||||
await Assert.ThrowsAsync<FileNotFoundException>(async () => await store.SaveThreadAsync(location, BflThreadFactory.Create(location)));
|
||||
@@ -90,8 +91,8 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var strategy = new BflThreadLocation(created.ProjectId, BflStep.STRATEGY);
|
||||
var framework = new BflThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
var strategy = new BflStepThreadLocation(created.ProjectId, BflStep.STRATEGY);
|
||||
var framework = new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
await store.SaveThreadAsync(strategy, BflThreadFactory.Create(strategy));
|
||||
var stepsDirectory = Path.Combine(this.RootDirectory, created.ProjectId.ToString("D"), "steps");
|
||||
Directory.CreateDirectory(Path.Combine(stepsDirectory, "01-framework"));
|
||||
@@ -109,7 +110,7 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var location = new BflThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
var location = new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
var path = Path.Combine(this.RootDirectory, created.ProjectId.ToString("D"), "steps", "01-framework", "thread.json");
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
|
||||
await File.WriteAllTextAsync(path, "{ damaged");
|
||||
@@ -127,7 +128,7 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var location = new BflThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
var location = new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK);
|
||||
await store.SaveThreadAsync(location, WithMessage(BflThreadFactory.Create(location), "Hallo"));
|
||||
|
||||
await store.DeleteThreadAsync(location);
|
||||
@@ -141,8 +142,8 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
var store = this.CreateStore();
|
||||
var first = await store.CreateAsync("Panel");
|
||||
var second = await store.CreateAsync("Interview");
|
||||
var firstStrategy = new BflThreadLocation(first.ProjectId, BflStep.STRATEGY);
|
||||
var secondFramework = new BflThreadLocation(second.ProjectId, BflStep.FRAMEWORK);
|
||||
var firstStrategy = new BflStepThreadLocation(first.ProjectId, BflStep.STRATEGY);
|
||||
var secondFramework = new BflStepThreadLocation(second.ProjectId, BflStep.FRAMEWORK);
|
||||
await store.SaveThreadAsync(firstStrategy, BflThreadFactory.Create(firstStrategy));
|
||||
await store.SaveThreadAsync(secondFramework, BflThreadFactory.Create(secondFramework));
|
||||
|
||||
@@ -157,10 +158,58 @@ public sealed class BeyondFactsLabStoreThreadTests
|
||||
Assert.That(locations[firstStrategy.ChatId], Is.EqualTo(firstStrategy));
|
||||
Assert.That(locations[secondFramework.ChatId], Is.EqualTo(secondFramework));
|
||||
Assert.That(store.GetThreadWrittenAt(firstStrategy), Is.Not.Null);
|
||||
Assert.That(store.GetThreadWrittenAt(new BflThreadLocation(first.ProjectId, BflStep.FRAMEWORK)), Is.Null);
|
||||
Assert.That(store.GetThreadWrittenAt(new BflStepThreadLocation(first.ProjectId, BflStep.FRAMEWORK)), Is.Null);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TheOnboardingIsStoredApartFromThePreparations()
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var location = BflOnboardingThreadLocation.INSTANCE;
|
||||
|
||||
await store.SaveThreadAsync(location, WithMessage(BflThreadFactory.Create(location), "Passt das Lab zu meinem Interview?"));
|
||||
var otherStore = this.CreateStore();
|
||||
var loaded = await otherStore.LoadThreadAsync(location);
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(loaded, Is.Not.Null);
|
||||
Assert.That(loaded!.ChatId, Is.EqualTo(BflThreadId.ONBOARDING));
|
||||
Assert.That(((ContentText)loaded.Blocks[0].Content!).Text, Is.EqualTo("Passt das Lab zu meinem Interview?"));
|
||||
Assert.That(File.Exists(Path.Combine(this.RootDirectory, "onboarding", "thread.json")), Is.True);
|
||||
Assert.That(await otherStore.ListProjectsAsync(), Is.Empty, "The folder of the onboarding is no preparation.");
|
||||
Assert.That(otherStore.ReadAllThreadLocations()[BflThreadId.ONBOARDING], Is.EqualTo(location));
|
||||
Assert.That(otherStore.GetThreadWrittenAt(location), Is.Not.Null);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task StartingTheOnboardingOverDeletesIt()
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var location = BflOnboardingThreadLocation.INSTANCE;
|
||||
await store.SaveThreadAsync(location, WithMessage(BflThreadFactory.Create(location), "Hallo"));
|
||||
|
||||
await store.DeleteThreadAsync(location);
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(await store.LoadThreadAsync(location), Is.Null);
|
||||
Assert.That(store.ReadAllThreadLocations(), Does.Not.ContainKey(BflThreadId.ONBOARDING));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task AChatOfAStepIsNotStoredAsTheOnboarding()
|
||||
{
|
||||
var store = this.CreateStore();
|
||||
var created = await store.CreateAsync("Panel");
|
||||
var thread = BflThreadFactory.Create(new BflStepThreadLocation(created.ProjectId, BflStep.FRAMEWORK));
|
||||
|
||||
await Assert.ThrowsAsync<ArgumentException>(async () => await store.SaveThreadAsync(BflOnboardingThreadLocation.INSTANCE, thread));
|
||||
}
|
||||
|
||||
private static ChatThread WithMessage(ChatThread thread, string text)
|
||||
{
|
||||
thread.Blocks.Add(new ContentBlock
|
||||
|
||||
@@ -24,6 +24,19 @@ public sealed class BflModelRequirementsTests
|
||||
Assert.That(BflModelRequirements.HasEnoughContext(ContextWindow.Of(defaultTokens)), Is.EqualTo(expected));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheOnboardingRunsWithASmallWindow()
|
||||
{
|
||||
var smallWindow = ContextWindow.Of(8_192);
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(BflModelRequirements.HasEnoughContext(BflOnboardingThreadLocation.INSTANCE, smallWindow), Is.True, "The onboarding leaves out the guide.");
|
||||
Assert.That(BflModelRequirements.HasEnoughContext(new BflStepThreadLocation(Guid.NewGuid(), BflStep.FRAMEWORK), smallWindow), Is.False);
|
||||
Assert.That(BflModelRequirements.HasEnoughContext(new BflStepThreadLocation(Guid.NewGuid(), BflStep.FRAMEWORK), ContextWindow.Of(BflModelRequirements.MINIMUM_CONTEXT_TOKENS)), Is.True);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AWindowWhichOnlyAnOperatorCouldRaiseIsNotEnough()
|
||||
{
|
||||
|
||||
@@ -67,6 +67,55 @@ public sealed class BflPromptComposerTests
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TheOnboardingFillsEveryPlaceholderWithoutTheGuide()
|
||||
{
|
||||
var parts = await BflPromptLibrary.LoadOnboardingPartsAsync(AddressForm.FORMAL);
|
||||
var knowledge = await BflPromptLibrary.ReadAsync(BflPromptLibrary.KNOWLEDGE_PATH);
|
||||
|
||||
var prompt = BflPromptComposer.ComposeOnboarding(parts, "Deutsch");
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(prompt, Does.Not.Contain("{{"));
|
||||
Assert.That(prompt, Does.Contain("Antworte auf Deutsch."));
|
||||
Assert.That(prompt, Does.Not.Contain(knowledge.Trim()[..200]), "The onboarding stays short, so it leaves out the guide.");
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TheFormOfAddressDecidesTheInstructionOfTheOnboarding()
|
||||
{
|
||||
var formal = BflPromptComposer.ComposeOnboarding(await BflPromptLibrary.LoadOnboardingPartsAsync(AddressForm.FORMAL), "Deutsch");
|
||||
var informal = BflPromptComposer.ComposeOnboarding(await BflPromptLibrary.LoadOnboardingPartsAsync(AddressForm.INFORMAL), "Deutsch");
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(formal, Does.Contain("mit „Sie“"));
|
||||
Assert.That(formal, Does.Not.Contain("mit „du“"));
|
||||
Assert.That(informal, Does.Contain("mit „du“"));
|
||||
Assert.That(informal, Does.Not.Contain("mit „Sie“"));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheOnboardingIsTheSameOnEverySystem()
|
||||
{
|
||||
var parts = new BflOnboardingPromptParts("Sprache: {{RESPONSE_LANGUAGE}}\r\n{{ADDRESS_FORM}}\r\nEnde", " Anrede\r\n");
|
||||
|
||||
var prompt = BflPromptComposer.ComposeOnboarding(parts, "Deutsch");
|
||||
|
||||
Assert.That(prompt, Is.EqualTo("Sprache: Deutsch\nAnrede\nEnde"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheOnboardingKnowsNoDetailsOfAPreparation()
|
||||
{
|
||||
var parts = new BflOnboardingPromptParts("{{DETAILS}}", "Anrede");
|
||||
|
||||
Assert.Throws<FormatException>(() => BflPromptComposer.ComposeOnboarding(parts, "Deutsch"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheLanguageOfTheAnswersIsNamed()
|
||||
{
|
||||
|
||||
@@ -24,6 +24,16 @@ public sealed class BflPromptLibraryTests
|
||||
/// </remarks>
|
||||
private const int MAX_FIXED_PROMPT_CHARACTERS = 90_000;
|
||||
|
||||
/// <summary>
|
||||
/// How many characters the fixed part of the prompt of the onboarding may have: the prompt and the longest form of
|
||||
/// address.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// About 4,000 tokens. The onboarding asks for no minimum context window, unlike the steps, so it has to leave room
|
||||
/// for a conversation in small models as well.
|
||||
/// </remarks>
|
||||
private const int MAX_ONBOARDING_PROMPT_CHARACTERS = 16_000;
|
||||
|
||||
[Test]
|
||||
public async Task EveryPromptComesWithTheApp()
|
||||
{
|
||||
@@ -66,4 +76,30 @@ public sealed class BflPromptLibraryTests
|
||||
|
||||
Assert.That(core.Length + knowledge.Length + longestStep + longestAddress, Is.LessThanOrEqualTo(MAX_FIXED_PROMPT_CHARACTERS));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task EveryOpeningRequestNamesASectionOfItsPrompt()
|
||||
{
|
||||
var core = (await BflPromptLibrary.ReadAsync(BflPromptLibrary.CORE_PATH)).ReplaceLineEndings("\n");
|
||||
var onboarding = (await BflPromptLibrary.ReadAsync(BflPromptLibrary.ONBOARDING_PATH)).ReplaceLineEndings("\n");
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(BflConversationService.OpeningRequestFor(new BflStepThreadLocation(Guid.NewGuid(), BflStep.FRAMEWORK)), Does.Contain("„Dieser Schritt“"));
|
||||
Assert.That(core, Does.Contain("\n# Dieser Schritt\n"));
|
||||
Assert.That(BflConversationService.OpeningRequestFor(BflOnboardingThreadLocation.INSTANCE), Does.Contain("„Gesprächsführung“"));
|
||||
Assert.That(onboarding, Does.Contain("\n# Gesprächsführung\n"));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task ThePromptOfTheOnboardingStaysShort()
|
||||
{
|
||||
var onboarding = await BflPromptLibrary.ReadAsync(BflPromptLibrary.ONBOARDING_PATH);
|
||||
var longestAddress = 0;
|
||||
foreach (var addressForm in Enum.GetValues<AddressForm>())
|
||||
longestAddress = Math.Max(longestAddress, (await BflPromptLibrary.ReadAsync(BflPromptLibrary.AddressPath(addressForm))).Length);
|
||||
|
||||
Assert.That(onboarding.Length + longestAddress, Is.LessThanOrEqualTo(MAX_ONBOARDING_PROMPT_CHARACTERS));
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ public sealed class BflThreadTests
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(BflThreadId.Of(PROJECT_ID, BflStep.STRATEGY), Is.EqualTo(expected));
|
||||
Assert.That(new BflThreadLocation(PROJECT_ID, BflStep.STRATEGY).ChatId, Is.EqualTo(expected));
|
||||
Assert.That(new BflStepThreadLocation(PROJECT_ID, BflStep.STRATEGY).ChatId, Is.EqualTo(expected));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,46 @@ public sealed class BflThreadTests
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheIdOfTheOnboardingFollowsFromItsName()
|
||||
{
|
||||
// Computed independently, from SHA-256 over "beyondfacts-lab/thread/onboarding". A stored chat keeps its ID, so
|
||||
// this value never changes:
|
||||
var expected = Guid.Parse("b98423a4-8502-8ddd-8e56-df78ccd610ba");
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(BflThreadId.ONBOARDING, Is.EqualTo(expected));
|
||||
Assert.That(BflOnboardingThreadLocation.INSTANCE.ChatId, Is.EqualTo(expected));
|
||||
Assert.That(BflOnboardingThreadLocation.INSTANCE.Key, Is.EqualTo("onboarding"));
|
||||
Assert.That(BflOnboardingThreadLocation.INSTANCE.ChatName, Is.EqualTo("onboarding"));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheOnboardingSharesItsIdWithNoStep()
|
||||
{
|
||||
var stepIds = BflStep.All.Select(step => BflThreadId.Of(PROJECT_ID, step));
|
||||
|
||||
Assert.That(stepIds, Has.None.EqualTo(BflThreadId.ONBOARDING));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ThePlaceOfAStepServesAsAKey()
|
||||
{
|
||||
BflThreadLocation first = new BflStepThreadLocation(PROJECT_ID, BflStep.STRATEGY);
|
||||
BflThreadLocation second = new BflStepThreadLocation(PROJECT_ID, BflStep.STRATEGY);
|
||||
|
||||
using (Assert.EnterMultipleScope())
|
||||
{
|
||||
Assert.That(first, Is.EqualTo(second));
|
||||
Assert.That(first.GetHashCode(), Is.EqualTo(second.GetHashCode()));
|
||||
Assert.That(first, Is.Not.EqualTo(new BflStepThreadLocation(PROJECT_ID, BflStep.FRAMEWORK)));
|
||||
Assert.That(first.Key, Is.EqualTo($"{PROJECT_ID:D}/05-strategy"));
|
||||
Assert.That(first.ChatName, Is.EqualTo("05-strategy"));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TheIdIsAVersion8Uuid()
|
||||
{
|
||||
@@ -55,7 +95,7 @@ public sealed class BflThreadTests
|
||||
[Test]
|
||||
public void ANewChatHasNothingButItsPlace()
|
||||
{
|
||||
var location = new BflThreadLocation(PROJECT_ID, BflStep.KNOWLEDGE);
|
||||
var location = new BflStepThreadLocation(PROJECT_ID, BflStep.KNOWLEDGE);
|
||||
|
||||
var thread = BflThreadFactory.Create(location);
|
||||
|
||||
@@ -73,7 +113,7 @@ public sealed class BflThreadTests
|
||||
[Test]
|
||||
public void AChatIsReadiedAsAChatOfTheLabWithoutToolsOrDataSources()
|
||||
{
|
||||
var thread = BflThreadFactory.Create(new BflThreadLocation(PROJECT_ID, BflStep.KNOWLEDGE));
|
||||
var thread = BflThreadFactory.Create(new BflStepThreadLocation(PROJECT_ID, BflStep.KNOWLEDGE));
|
||||
thread.DataSourceOptions.DisableDataSources = false;
|
||||
thread.RuntimeSelectedToolIds = ["web_search"];
|
||||
var provider = new AIStudio.Settings.Provider(1, "provider-1", "Test", LLMProviders.SELF_HOSTED, new Model("model", null));
|
||||
|
||||
@@ -124,7 +124,7 @@ public sealed class ProvenanceCleanupServiceTests
|
||||
// switches it on:
|
||||
var labStore = this.CreateLabStore();
|
||||
var project = await labStore.CreateAsync("Panel");
|
||||
var location = new BflThreadLocation(project.ProjectId, BflStep.KNOWLEDGE);
|
||||
var location = new BflStepThreadLocation(project.ProjectId, BflStep.KNOWLEDGE);
|
||||
var referenced = await this.store.Client.StoreAsync(location.ChatId, ProvenanceKind.WEB_PAGE, "of a page the chat of the lab read", null, TOKEN);
|
||||
var unreferenced = await this.store.Client.StoreAsync(location.ChatId, ProvenanceKind.WEB_PAGE, "of an answer the person removed", null, TOKEN);
|
||||
var thread = BflThreadFactory.Create(location);
|
||||
@@ -142,12 +142,33 @@ public sealed class ProvenanceCleanupServiceTests
|
||||
Assert.That(entries.Keys, Is.EquivalentTo(new[] { referenced.Value }), "The chat of the lab is read like any other chat.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task WhatTheOnboardingOfTheLabReceivedSurvivesTheCleanup()
|
||||
{
|
||||
var labStore = this.CreateLabStore();
|
||||
var location = BflOnboardingThreadLocation.INSTANCE;
|
||||
var referenced = await this.store.Client.StoreAsync(location.ChatId, ProvenanceKind.WEB_PAGE, "of a page the onboarding read", null, TOKEN);
|
||||
var thread = BflThreadFactory.Create(location);
|
||||
thread.Blocks.Add(new ContentBlock
|
||||
{
|
||||
ContentType = ContentType.TEXT,
|
||||
Role = ChatRole.AI,
|
||||
Content = new ContentText { Text = "Laut der Seite …", SourcePassages = [new SourcePassage { SourceUrl = "https://example.org/", ProvenanceId = referenced }] }
|
||||
});
|
||||
await labStore.SaveThreadAsync(location, thread);
|
||||
|
||||
await this.RunAsync(RestoreStateWith(report: null));
|
||||
|
||||
var entries = await this.store.Client.GetEntriesAsync([referenced!.Value], TOKEN);
|
||||
Assert.That(entries.Keys, Is.EquivalentTo(new[] { referenced.Value }), "The onboarding belongs to no preparation, but it is a chat of the lab all the same.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task WhatAChatOfADeletedPreparationReceivedIsRemoved()
|
||||
{
|
||||
var labStore = this.CreateLabStore();
|
||||
var project = await labStore.CreateAsync("Panel");
|
||||
var location = new BflThreadLocation(project.ProjectId, BflStep.KNOWLEDGE);
|
||||
var location = new BflStepThreadLocation(project.ProjectId, BflStep.KNOWLEDGE);
|
||||
await labStore.SaveThreadAsync(location, BflThreadFactory.Create(location));
|
||||
var entry = await this.store.Client.StoreAsync(location.ChatId, ProvenanceKind.WEB_PAGE, "of a page the chat of the lab read", null, TOKEN);
|
||||
await labStore.DeleteAsync(project.ProjectId);
|
||||
|
||||
Reference in new issue
Block a user