mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-10-07 22:49:40 +00:00
Added tool calling support (#731)
Co-authored-by: krut_ni <nils.kruthoff@dlr.de> Co-authored-by: Thorsten Sommer <SommerEngineering@users.noreply.github.com>
This commit is contained in:
266 files changed
+11186
-740
No files matched your search
@@ -1,8 +1,11 @@
|
||||
using System.Globalization;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
using AIStudio.Components;
|
||||
using AIStudio.Provider;
|
||||
using AIStudio.Settings;
|
||||
using AIStudio.Settings.DataModel;
|
||||
using AIStudio.Tools.ToolCallingSystem;
|
||||
using AIStudio.Tools.ERIClient.DataModel;
|
||||
|
||||
namespace AIStudio.Chat;
|
||||
@@ -50,6 +53,18 @@ public sealed record ChatThread
|
||||
/// </summary>
|
||||
public string SelectedChatTemplate { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies the tools selected for the chat thread, as the user chose them.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Null means the thread never stored a selection, which is the case for every chat written
|
||||
/// before tools existed: those open with the defaults of their component. An empty set is the
|
||||
/// opposite statement — the user switched every tool off and wants it to stay that way.<br/><br/>
|
||||
/// This is the unfiltered selection. What a provider may actually run is decided per request,
|
||||
/// because a provider with too little confidence must not cost the user a tool permanently.
|
||||
/// </remarks>
|
||||
public HashSet<string>? SelectedToolIds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether to include the current date and time in the system prompt.
|
||||
/// False by default for backward compatibility.
|
||||
@@ -76,6 +91,18 @@ public sealed record ChatThread
|
||||
/// </summary>
|
||||
public DataSourceSecurity DataSecurity { get; set; } = DataSourceSecurity.NOT_SPECIFIED;
|
||||
|
||||
/// <summary>
|
||||
/// The minimum confidence required for providers that continue this chat after a tool returned sensitive data.
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public ConfidenceLevel RequiredProviderConfidence { get; private set; } = ConfidenceLevel.NONE;
|
||||
|
||||
public void RequireProviderConfidence(ConfidenceLevel minimumProviderConfidence)
|
||||
{
|
||||
if (minimumProviderConfidence > this.RequiredProviderConfidence)
|
||||
this.RequiredProviderConfidence = minimumProviderConfidence;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The name of the chat thread. Usually generated by an AI model or manually edited by the user.
|
||||
/// </summary>
|
||||
@@ -90,6 +117,31 @@ public sealed record ChatThread
|
||||
/// The content blocks of the chat thread.
|
||||
/// </summary>
|
||||
public List<ContentBlock> Blocks { get; init; } = [];
|
||||
|
||||
[JsonIgnore]
|
||||
public AIStudio.Tools.Components RuntimeComponent { get; set; } = AIStudio.Tools.Components.CHAT;
|
||||
|
||||
[JsonIgnore]
|
||||
public HashSet<string> RuntimeSelectedToolIds { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Whether the tools of this run were named by the assistant's own rules instead of chosen by
|
||||
/// the user.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// A user who cannot see a tool selection must not get tools they never picked, which is why
|
||||
/// running tools normally requires a visible selection. That rule misses the case where nobody
|
||||
/// asked the user in the first place: a document analysis policy or an assistant plugin names
|
||||
/// its tools, and hiding the selection is the point rather than an obstacle. This flag tells
|
||||
/// the providers which of the two they are looking at.
|
||||
/// </remarks>
|
||||
[JsonIgnore]
|
||||
public bool RuntimeToolsAreAssistantManaged { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether this thread may run tools at all.
|
||||
/// </summary>
|
||||
public bool MayRunTools(SettingsManager settingsManager) => this.RuntimeToolsAreAssistantManaged || settingsManager.IsToolSelectionVisible(this.RuntimeComponent);
|
||||
|
||||
private bool allowProfile = true;
|
||||
|
||||
@@ -102,8 +154,9 @@ public sealed record ChatThread
|
||||
/// is extended with the profile chosen.
|
||||
/// </remarks>
|
||||
/// <param name="settingsManager">The settings manager instance to use.</param>
|
||||
/// <param name="runnableToolDefinitions">The tools which may run in this thread. Their instructions become part of the system prompt. Null when the thread runs without tools.</param>
|
||||
/// <returns>The prepared system prompt.</returns>
|
||||
public string PrepareSystemPrompt(SettingsManager settingsManager)
|
||||
public string PrepareSystemPrompt(SettingsManager settingsManager, IEnumerable<ToolDefinition>? runnableToolDefinitions = null)
|
||||
{
|
||||
this.allowProfile = true;
|
||||
|
||||
@@ -198,6 +251,17 @@ public sealed record ChatThread
|
||||
}
|
||||
|
||||
LOGGER.LogInformation(logMessage);
|
||||
|
||||
var toolPolicy = ToolSelectionRules.BuildToolPolicyPrompt(runnableToolDefinitions ?? []);
|
||||
if (!string.IsNullOrWhiteSpace(toolPolicy))
|
||||
{
|
||||
systemPromptText = $"""
|
||||
{systemPromptText}
|
||||
|
||||
{toolPolicy}
|
||||
""";
|
||||
}
|
||||
|
||||
if(!this.IncludeDateTime)
|
||||
return systemPromptText;
|
||||
|
||||
@@ -314,4 +378,4 @@ public sealed record ChatThread
|
||||
|
||||
return new Tools.ERIClient.DataModel.ChatThread { ContentBlocks = contentBlocks };
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user