Add request options bag to high level requests and include Meta (#970)
Co-authored-by: Stephen Toub <stoub@microsoft.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
parent
627de76ca6
commit
c447973972
1 changed files with 882 additions and 164 deletions
|
|
@ -68,19 +68,19 @@ public abstract partial class McpServer : McpSession
|
|||
/// Requests to sample an LLM via the client using the provided chat messages and options.
|
||||
/// </summary>
|
||||
/// <param name="messages">The messages to send as part of the request.</param>
|
||||
/// <param name="options">The options to use for the request, including model parameters and constraints.</param>
|
||||
/// <param name="chatOptions">The options to use for the request, including model parameters and constraints.</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> to monitor for cancellation requests. The default is <see cref="CancellationToken.None"/>.</param>
|
||||
/// <returns>A task containing the chat response from the model.</returns>
|
||||
/// <exception cref="ArgumentNullException"><paramref name="messages"/> is <see langword="null"/>.</exception>
|
||||
/// <exception cref="InvalidOperationException">The client does not support sampling.</exception>
|
||||
public async Task<ChatResponse> SampleAsync(
|
||||
IEnumerable<ChatMessage> messages, ChatOptions? options = default, CancellationToken cancellationToken = default)
|
||||
IEnumerable<ChatMessage> messages, ChatOptions? chatOptions = default, CancellationToken cancellationToken = default)
|
||||
{
|
||||
Throw.IfNull(messages);
|
||||
|
||||
StringBuilder? systemPrompt = null;
|
||||
|
||||
if (options?.Instructions is { } instructions)
|
||||
if (chatOptions?.Instructions is { } instructions)
|
||||
{
|
||||
(systemPrompt ??= new()).Append(instructions);
|
||||
}
|
||||
|
|
@ -126,15 +126,15 @@ public abstract partial class McpServer : McpSession
|
|||
}
|
||||
|
||||
ModelPreferences? modelPreferences = null;
|
||||
if (options?.ModelId is { } modelId)
|
||||
if (chatOptions?.ModelId is { } modelId)
|
||||
{
|
||||
modelPreferences = new() { Hints = [new() { Name = modelId }] };
|
||||
}
|
||||
|
||||
IList<Tool>? tools = null;
|
||||
if (options?.Tools is { Count: > 0 })
|
||||
if (chatOptions?.Tools is { Count: > 0 })
|
||||
{
|
||||
foreach (var tool in options.Tools)
|
||||
foreach (var tool in chatOptions.Tools)
|
||||
{
|
||||
if (tool is AIFunctionDeclaration af)
|
||||
{
|
||||
|
|
@ -149,7 +149,7 @@ public abstract partial class McpServer : McpSession
|
|||
}
|
||||
}
|
||||
|
||||
ToolChoice? toolChoice = options?.ToolMode switch
|
||||
ToolChoice? toolChoice = chatOptions?.ToolMode switch
|
||||
{
|
||||
NoneChatToolMode => new() { Mode = ToolChoice.ModeNone },
|
||||
AutoChatToolMode => new() { Mode = ToolChoice.ModeAuto },
|
||||
|
|
@ -159,15 +159,15 @@ public abstract partial class McpServer : McpSession
|
|||
|
||||
var result = await SampleAsync(new()
|
||||
{
|
||||
MaxTokens = options?.MaxOutputTokens ?? ServerOptions.MaxSamplingOutputTokens,
|
||||
MaxTokens = chatOptions?.MaxOutputTokens ?? ServerOptions.MaxSamplingOutputTokens,
|
||||
Messages = samplingMessages,
|
||||
ModelPreferences = modelPreferences,
|
||||
StopSequences = options?.StopSequences?.ToArray(),
|
||||
StopSequences = chatOptions?.StopSequences?.ToArray(),
|
||||
SystemPrompt = systemPrompt?.ToString(),
|
||||
Temperature = options?.Temperature,
|
||||
Temperature = chatOptions?.Temperature,
|
||||
ToolChoice = toolChoice,
|
||||
Tools = tools,
|
||||
Meta = options?.AdditionalProperties?.ToJsonObject(),
|
||||
Meta = chatOptions?.AdditionalProperties?.ToJsonObject(),
|
||||
}, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
List<AIContent> responseContents = [];
|
||||
|
|
@ -472,14 +472,14 @@ public abstract partial class McpServer : McpSession
|
|||
private readonly McpServer _server = server;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Task<ChatResponse> GetResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions? options = null, CancellationToken cancellationToken = default) =>
|
||||
_server.SampleAsync(messages, options, cancellationToken);
|
||||
public Task<ChatResponse> GetResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions? chatOptions = null, CancellationToken cancellationToken = default) =>
|
||||
_server.SampleAsync(messages, chatOptions, cancellationToken);
|
||||
|
||||
/// <inheritdoc/>
|
||||
async IAsyncEnumerable<ChatResponseUpdate> IChatClient.GetStreamingResponseAsync(
|
||||
IEnumerable<ChatMessage> messages, ChatOptions? options, [EnumeratorCancellation] CancellationToken cancellationToken)
|
||||
IEnumerable<ChatMessage> messages, ChatOptions? chatOptions, [EnumeratorCancellation] CancellationToken cancellationToken)
|
||||
{
|
||||
var response = await GetResponseAsync(messages, options, cancellationToken).ConfigureAwait(false);
|
||||
var response = await GetResponseAsync(messages, chatOptions, cancellationToken).ConfigureAwait(false);
|
||||
foreach (var update in response.ToChatResponseUpdates())
|
||||
{
|
||||
yield return update;
|
||||
|
|
|
|||
Loading…
Reference in a new issue