From e4c5225e1b678ca494c81313a25b7b6ddcb332a4 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Fri, 3 May 2024 11:22:13 -0500 Subject: [PATCH] Fix AnthropicAI prompt log. --- .../Providers/ChatCompletionProvider.cs | 72 ++++++++++++++++--- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs index 4537e92a..87a22ee8 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs @@ -38,9 +38,9 @@ public class ChatCompletionProvider : IChatCompletion var settings = settingsService.GetSetting("anthropic", agent.LlmConfig?.Model ?? "claude-3-haiku"); var client = new AnthropicClient(new APIAuthentication(settings.ApiKey)); - var (prompt, parameters, tools) = PrepareOptions(agent, conversations); + var (prompt, parameters) = PrepareOptions(agent, conversations); - var response = await client.Messages.GetClaudeMessageAsync(parameters, tools); + var response = await client.Messages.GetClaudeMessageAsync(parameters); RoleDialogModel responseMessage; @@ -93,15 +93,15 @@ public class ChatCompletionProvider : IChatCompletion throw new NotImplementedException(); } - private (string, MessageParameters, List) PrepareOptions(Agent agent, List conversations) + private (string, MessageParameters) PrepareOptions(Agent agent, List conversations) { - var prompt = ""; + var instruction = ""; var agentService = _services.GetRequiredService(); if (!string.IsNullOrEmpty(agent.Instruction)) { - prompt += agentService.RenderedInstruction(agent); + instruction += agentService.RenderedInstruction(agent); } /*var routing = _services.GetRequiredService(); @@ -166,7 +166,8 @@ public class ChatCompletionProvider : IChatCompletion Model = AnthropicModels.Claude3Haiku, Stream = false, Temperature = 0m, - SystemMessage = prompt + SystemMessage = instruction, + Tools = new List() { } }; JsonSerializerOptions jsonSerializationOptions = new() @@ -175,7 +176,6 @@ public class ChatCompletionProvider : IChatCompletion Converters = { new JsonStringEnumConverter() }, ReferenceHandler = ReferenceHandler.IgnoreCycles, }; - var tools = new List(); foreach (var fn in agent.Functions) { @@ -197,12 +197,66 @@ public class ChatCompletionProvider : IChatCompletion };*/ string jsonString = JsonSerializer.Serialize(fn.Parameters, jsonSerializationOptions); - tools.Add(new Function(fn.Name, fn.Description, + parameters.Tools.Add(new Function(fn.Name, fn.Description, JsonNode.Parse(jsonString))); } + var prompt = GetPrompt(parameters); - return (prompt, parameters, tools); + return (prompt, parameters); + } + + private string GetPrompt(MessageParameters parameters) + { + var prompt = $"{parameters.SystemMessage}\r\n"; + prompt += "\r\n[CONVERSATION]"; + + var verbose = string.Join("\r\n", parameters.Messages + .Select(x => + { + var role = x.Role.ToString().ToLower(); + + if (x.Role == RoleType.User) + { + var content = string.Join("\r\n", x.Content.Select(c => + { + if (c is TextContent text) + return text.Text; + else if (c is ToolResultContent tool) + return $"{tool.Content}"; + else + return string.Empty; + })); + return $"{role}: {content}"; + } + else if (x.Role == RoleType.Assistant) + { + var content = string.Join("\r\n", x.Content.Select(c => + { + if (c is TextContent text) + return text.Text; + else if (c is ToolUseContent tool) + return $"Call function {tool.Name}({JsonSerializer.Serialize(tool.Input)})"; + else + return string.Empty; + })); + return $"{role}: {content}"; + } + return string.Empty; + })); + + prompt += $"\r\n{verbose}\r\n"; + + if (parameters.Tools != null && parameters.Tools.Count > 0) + { + var functions = string.Join("\r\n", parameters.Tools.Select(x => + { + return $"\r\n{x.Name}: {x.Description}\r\n{JsonSerializer.Serialize(x.Parameters)}"; + })); + prompt += $"\r\n[FUNCTIONS]\r\n{functions}\r\n"; + } + + return prompt; } public void SetModelName(string model)