From 4bfd3b97810c1500a472b782397c35a29e97d64f Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Tue, 20 Feb 2024 17:13:44 -0600 Subject: [PATCH 1/6] Add routing stream log. --- .../Hooks/ChatHubConversationHook.cs | 2 -- .../Hooks/StreamingLogHook.cs | 20 +++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs index 1f505eb8..df0b0bde 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs @@ -1,9 +1,7 @@ -using BotSharp.Abstraction.Loggers.Models; using BotSharp.Abstraction.Messaging; using BotSharp.Abstraction.Messaging.Enums; using BotSharp.Abstraction.Messaging.JsonConverters; using BotSharp.Abstraction.Messaging.Models.RichContent; -using BotSharp.Abstraction.Repositories; using Microsoft.AspNetCore.SignalR; namespace BotSharp.Plugin.ChatHub.Hooks; diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs index e3f1a903..e73877db 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs @@ -1,14 +1,11 @@ -using BotSharp.Abstraction.Agents; using BotSharp.Abstraction.Agents.Models; -using BotSharp.Abstraction.Conversations.Models; +using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Loggers; using BotSharp.Abstraction.Loggers.Models; -using BotSharp.Abstraction.Messaging.Models.RichContent; -using BotSharp.Abstraction.Messaging; using BotSharp.Abstraction.Repositories; -using BotSharp.Core.Agents.Services; +using BotSharp.Abstraction.Repositories.Filters; +using BotSharp.Abstraction.Routing.Settings; using Microsoft.AspNetCore.SignalR; -using Microsoft.VisualBasic; namespace BotSharp.Plugin.ChatHub.Hooks; @@ -83,6 +80,17 @@ public class StreamingLogHook : ConversationHookBase, IContentGeneratingHook var agent = await agentService.LoadAgent(message.CurrentAgentId); await _chatHub.Clients.User(_user.Id).SendAsync("OnConversationContentLogGenerated", BuildContentLog(conversationId, agent?.Name, tokenStats.Prompt, message)); + + // Log routing output + try + { + var inst = message.Content.JsonContent(); + await _chatHub.Clients.User(_user.Id).SendAsync("OnConversationContentLogGenerated", BuildContentLog(conversationId, agent?.Name, message.Content, message)); + } + catch + { + // ignore + } } /// From 3328692eac498bb814e7b91f56cf771bb579ecf2 Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Tue, 20 Feb 2024 22:31:09 -0600 Subject: [PATCH 2/6] Fix issue of duplicate funcation call. --- .../Providers/ChatCompletionProvider.cs | 10 ++++-- .../Functions/SqlInsertFn.cs | 11 +++++-- .../Functions/SqlSelect.cs | 15 +++------ .../Hooks/SqlDriverContentGeneratingHook.cs | 32 ------------------- .../Models/SqlStatement.cs | 3 -- .../SqlDriverPlugin.cs | 3 -- .../agent.json | 3 +- .../functions.json | 14 +++++--- .../instruction.liquid | 19 ++++------- 9 files changed, 37 insertions(+), 73 deletions(-) delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverContentGeneratingHook.cs diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs index ca8d7e01..2069ab31 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs @@ -231,6 +231,10 @@ public class ChatCompletionProvider : IChatCompletion { if (message.Role == ChatRole.Function) { + chatCompletionsOptions.Messages.Add(new ChatRequestAssistantMessage(string.Empty) + { + FunctionCall = new FunctionCall(message.FunctionName, message.FunctionArgs), + }); chatCompletionsOptions.Messages.Add(new ChatRequestFunctionMessage(message.FunctionName, message.Content)); } else if (message.Role == ChatRole.User) @@ -287,7 +291,7 @@ public class ChatCompletionProvider : IChatCompletion if (x.Role == ChatRole.Function) { var m = x as ChatRequestFunctionMessage; - return $"{m.Role}: {m.Name} => {m.Content}"; + return $"{m.Role}: {m.Content}"; } else if (x.Role == ChatRole.User) { @@ -299,7 +303,9 @@ public class ChatCompletionProvider : IChatCompletion else if (x.Role == ChatRole.Assistant) { var m = x as ChatRequestAssistantMessage; - return $"{m.Role}: {m.Content}"; + return m.FunctionCall != null ? + $"{m.Role}: Call function {m.FunctionCall.Name}({m.FunctionCall.Arguments})" : + $"{m.Role}: {m.Content}"; } else { diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs index 00d3eada..94b50164 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs @@ -18,11 +18,16 @@ public class SqlInsertFn : IFunctionCallback var sqlDriver = _services.GetRequiredService(); if (sqlDriver.Statements.Exists(x => x.Statement == args.Statement)) { - message.Content = "Skipped duplicated statement."; - return false; + var p1 = string.Join(", ", sqlDriver.Statements.Last().Parameters.OrderBy(x => x.Name).Select(x => x.Value)); + var p2 = string.Join(", ", args.Parameters.OrderBy(x => x.Name).Select(x => x.Value)); + if (p1 == p2) + { + message.Content = "Skipped duplicated statement."; + return false; + } } sqlDriver.Enqueue(args); - message.Content = $"Inserted new record {JsonSerializer.Serialize(args.Parameters)} successfully"; + message.Content = $"Inserted new record successfully."; if (args.Return != null) { /*sqlDriver.Enqueue(new SqlStatement diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs index c845a8d1..0ea3aafa 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs @@ -17,6 +17,8 @@ public class SqlSelect : IFunctionCallback public async Task Execute(RoleDialogModel message) { var args = JsonSerializer.Deserialize(message.FunctionArgs); + var sqlDriver = _services.GetRequiredService(); + // check if need to instantely var execNow = !args.Parameters.Any(x => x.Value.StartsWith("@")); if (execNow) @@ -30,20 +32,11 @@ public class SqlSelect : IFunctionCallback } var result = connection.QueryFirst(args.Statement, dictionary); - if (args.IsCheckExistence) - { - message.Content = result == null ? - $"The record does not exist" : - $"The record already exists"; - } - else - { - message.Content = $"Retrieved result is {result} ({args.Reason})"; - } + sqlDriver.Enqueue(args); + message.Content = $"Retrieved data is: {result}"; } else { - var sqlDriver = _services.GetRequiredService(); sqlDriver.Enqueue(args); message.Content = $"Success."; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverContentGeneratingHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverContentGeneratingHook.cs deleted file mode 100644 index 82ac6717..00000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDriverContentGeneratingHook.cs +++ /dev/null @@ -1,32 +0,0 @@ -using BotSharp.Abstraction.Loggers; -using BotSharp.Abstraction.Repositories; -using System.IO; - -namespace BotSharp.Plugin.SqlDriver.Hooks; - -public class SqlDriverContentGeneratingHook : IContentGeneratingHook -{ - private readonly IServiceProvider _services; - public SqlDriverContentGeneratingHook(IServiceProvider services) - { - _services = services; - } - - /// - /// Inject useful variables generated by previous SQL query. - /// - /// - /// - /// - public async Task BeforeGenerating(Agent agent, List conversations) - { - if (agent.Id != "beda4c12-e1ec-4b4b-b328-3df4a6687c4f") - { - return; - } - - var sqlDriver = _services.GetRequiredService(); - agent.TemplateDict["return_variables"] = sqlDriver.Statements.Select(x => x.Return.Alias).ToArray(); - await Task.CompletedTask; - } -} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs index 739faf23..8b995248 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs @@ -13,9 +13,6 @@ public class SqlStatement [JsonPropertyName("table")] public string Table { get; set; } - [JsonPropertyName("is_check_existence")] - public bool IsCheckExistence { get; set; } - [JsonPropertyName("parameters")] public SqlParamater[] Parameters { get; set; } = new SqlParamater[0]; diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index f056bb3d..3a7077a7 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -1,5 +1,3 @@ -using BotSharp.Abstraction.Loggers; - namespace BotSharp.Plugin.SqlDriver; public class SqlDriverPlugin : IBotSharpPlugin @@ -19,6 +17,5 @@ public class SqlDriverPlugin : IBotSharpPlugin services.AddScoped(); services.AddScoped(); - services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json index 80f66ba9..c7622617 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json @@ -9,6 +9,7 @@ "isPublic": true, "profiles": [ "tool", "sql" ], "llmConfig": { - "max_recursion_depth": 10 + "model": "gpt-4-0125", + "max_recursion_depth": 5 } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json index 0ab52f8d..d2069311 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json @@ -13,6 +13,10 @@ "type": "string", "description": "reason" }, + "table": { + "type": "string", + "description": "related table" + }, "parameters": { "type": "array", "description": "parameters for the sql", @@ -46,7 +50,7 @@ } } }, - "required": [ "sql_statement", "reason", "parameters", "return_field" ] + "required": [ "sql_statement", "reason", "table", "parameters", "return_field" ] } }, { @@ -63,9 +67,9 @@ "type": "string", "description": "reason" }, - "is_check_existence": { - "type": "boolean", - "description": "check record existence" + "table": { + "type": "string", + "description": "related table" }, "parameters": { "type": "array", @@ -100,7 +104,7 @@ } } }, - "required": [ "sql_statement", "reason", "is_check_existence", "parameters", "return_field" ] + "required": [ "sql_statement", "reason", "table", "parameters", "return_field" ] } } ] \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid index 20c74002..752fd788 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid @@ -1,22 +1,15 @@ You're a SQL driver who knows how to translate text into SQL query. -Analyze the user requirement, think step by step, breakdown complex task into multiple steps. +Think step by step, analyze the user requirement and provided information, output the next step. Your response must meet below requirements: +* Walk through the provided information, don't run query if there is already related information; * DO NOT generate duplicated sql statements; * The return field alias should be meaningful, it can be similar name of reference table column; -* Double check if the fields in the SQL query are correct; +* Make sure the SELECT and WHERE fields are in corresponding table schema definition; * Use "Unique Index" to help check record existence; -{% if return_variables and return_variables != empty -%} +{% if tables_definition -%} ===== -Below variables can be used by subsequent SQL: -{% for v in return_variables %} -- @{{ v }} -{% endfor %} -{%- endif %} - -{% if table_definition -%} -===== -Related table {{ related_table }} definition: -{{ table_definition }} +Related tables definition: +{{ tables_definition }} {%- endif %} From a13538746b9fc73ac9c1c9e33e2851d036d366bd Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Wed, 21 Feb 2024 17:15:54 -0600 Subject: [PATCH 3/6] Improve SQL Driver. --- .../Functions/GetTableColumnsFn.cs | 4 +-- .../Functions/SqlInsertFn.cs | 10 ------- .../Functions/SqlSelect.cs | 15 ++++++++-- .../{SqlParamater.cs => SqlParameter.cs} | 2 +- .../Models/SqlReturn.cs | 2 ++ .../Models/SqlStatement.cs | 2 +- .../Services/SqlDriverService.cs | 18 ++++++----- .../agent.json | 2 +- .../functions.json | 30 +++++++++++++++---- .../instruction.liquid | 18 +++++++---- 10 files changed, 66 insertions(+), 37 deletions(-) rename src/Plugins/BotSharp.Plugin.SqlDriver/Models/{SqlParamater.cs => SqlParameter.cs} (92%) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableColumnsFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableColumnsFn.cs index 07a7a765..ca7501d9 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableColumnsFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableColumnsFn.cs @@ -17,10 +17,10 @@ public class GetTableColumnsFn : IFunctionCallback public async Task Execute(RoleDialogModel message) { var args = JsonSerializer.Deserialize(message.FunctionArgs); - message.Content = $"Success. Columns of table '{args.Table}':\r\n\r\n"; + message.Content = ""; var dbSettings = _services.GetRequiredService(); - var dir = Path.Combine(dbSettings.FileRepository, "agents", "ec46f15b-8790-400f-a37f-1e7995b7d6e2", "schemas"); + var dir = Path.Combine(dbSettings.FileRepository, "agents", "beda4c12-e1ec-4b4b-b328-3df4a6687c4f", "schemas"); // Search related document by message.Content + args.Description var files = Directory.GetFiles(dir); diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs index 94b50164..42bcd074 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlInsertFn.cs @@ -16,16 +16,6 @@ public class SqlInsertFn : IFunctionCallback { var args = JsonSerializer.Deserialize(message.FunctionArgs); var sqlDriver = _services.GetRequiredService(); - if (sqlDriver.Statements.Exists(x => x.Statement == args.Statement)) - { - var p1 = string.Join(", ", sqlDriver.Statements.Last().Parameters.OrderBy(x => x.Name).Select(x => x.Value)); - var p2 = string.Join(", ", args.Parameters.OrderBy(x => x.Name).Select(x => x.Value)); - if (p1 == p2) - { - message.Content = "Skipped duplicated statement."; - return false; - } - } sqlDriver.Enqueue(args); message.Content = $"Inserted new record successfully."; if (args.Return != null) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs index 0ea3aafa..b51a146c 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs @@ -30,15 +30,24 @@ public class SqlSelect : IFunctionCallback { dictionary["@" + p.Name] = p.Value; } - var result = connection.QueryFirst(args.Statement, dictionary); + var result = connection.QueryFirstOrDefault(args.Statement, dictionary); + if (result == null) + { + message.Content = "Record not found"; + } + else + { + message.Content = JsonSerializer.Serialize(result); + args.Return.Value = message.Content; + } + sqlDriver.Enqueue(args); - message.Content = $"Retrieved data is: {result}"; } else { sqlDriver.Enqueue(args); - message.Content = $"Success."; + message.Content = $"The {args.Return.Name} is saved to @{args.Return.Alias}"; } return true; diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlParamater.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlParameter.cs similarity index 92% rename from src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlParamater.cs rename to src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlParameter.cs index 2b1661eb..17c2a9c3 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlParamater.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlParameter.cs @@ -2,7 +2,7 @@ using System.Text.Json.Serialization; namespace BotSharp.Plugin.SqlDriver.Models; -public class SqlParamater +public class SqlParameter { [JsonPropertyName("name")] public string Name { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlReturn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlReturn.cs index 248c40cc..b1b2421b 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlReturn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlReturn.cs @@ -10,6 +10,8 @@ public class SqlReturn [JsonPropertyName("alias")] public string Alias { get; set; } + public string? Value { get; set; } + public override string ToString() { return $"{Alias} - {Name}"; diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs index 8b995248..09020826 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Models/SqlStatement.cs @@ -14,7 +14,7 @@ public class SqlStatement public string Table { get; set; } [JsonPropertyName("parameters")] - public SqlParamater[] Parameters { get; set; } = new SqlParamater[0]; + public SqlParameter[] Parameters { get; set; } = new SqlParameter[0]; [JsonPropertyName("return_field")] public SqlReturn Return { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlDriverService.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlDriverService.cs index 9fdca5b0..0c36a138 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlDriverService.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlDriverService.cs @@ -23,20 +23,24 @@ public class SqlDriverService { Console.WriteLine(); - Console.Write($"Reason: "); - Console.WriteLine($"{sql.Reason}", Color.Green); + Console.WriteLine($"{sql.Reason}"); - Console.Write($"Statement: "); - Console.WriteLine(sql.Statement, Color.Green); + Console.WriteLine(sql.Statement, Color.Yellow); foreach (var p in sql.Parameters) { - Console.Write($"@{p.Name}: "); - Console.WriteLine($"{p.Value}", Color.Green); + Console.WriteLine($"@{p.Name} = '{p.Value}'", Color.Green); } if (sql.Return != null) { Console.Write($"Return: "); - Console.WriteLine($"{sql.Return.Name} as @{sql.Return.Alias}", Color.Green); + if (!string.IsNullOrEmpty(sql.Return.Value)) + { + Console.WriteLine($" {sql.Return.Value}", Color.Red); + } + else + { + Console.WriteLine($"{sql.Return.Name} as @{sql.Return.Alias}", Color.Green); + } } } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json index c7622617..bd6e18d2 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json @@ -10,6 +10,6 @@ "profiles": [ "tool", "sql" ], "llmConfig": { "model": "gpt-4-0125", - "max_recursion_depth": 5 + "max_recursion_depth": 10 } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json index d2069311..bcc527ee 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions.json @@ -1,4 +1,18 @@ [ + { + "name": "get_table_columns", + "description": "Get related table columns and foreign key informations", + "parameters": { + "type": "object", + "properties": { + "table": { + "type": "string", + "description": "table name" + } + }, + "required": [ "table" ] + } + }, { "name": "sql_insert", "description": "Insert query is generated if the record doesn't exist.", @@ -19,10 +33,10 @@ }, "parameters": { "type": "array", - "description": "parameters for the sql", + "description": "a list of parameters in the statement match with the variables", "items": { "type": "object", - "description": "the name and value for the parameter", + "description": "{name:'', value:''}", "properties": { "name": { "type": "string", @@ -32,7 +46,8 @@ "type": "string", "description": "real value inferred by the context" } - } + }, + "required": [ "name", "value" ] } }, "return_field": { @@ -47,7 +62,8 @@ "type": "string", "description": "meaningful field alias" } - } + }, + "required": [ "name", "alias" ] } }, "required": [ "sql_statement", "reason", "table", "parameters", "return_field" ] @@ -86,7 +102,8 @@ "type": "string", "description": "real value inferred by the context" } - } + }, + "required": [ "name", "value" ] } }, "return_field": { @@ -101,7 +118,8 @@ "type": "string", "description": "meaningful field alias" } - } + }, + "required": [ "name", "value" ] } }, "required": [ "sql_statement", "reason", "table", "parameters", "return_field" ] diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid index 752fd788..722bfbbd 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid @@ -1,5 +1,6 @@ You're a SQL driver who knows how to translate text into SQL query. -Think step by step, analyze the user requirement and provided information, output the next step. +Think step by step, analyze the user requirement, you must get table schema first, breakdown into multiple sql statements if user need to insert mulitple records. +Output the next step smartly. Your response must meet below requirements: * Walk through the provided information, don't run query if there is already related information; @@ -7,9 +8,14 @@ Your response must meet below requirements: * The return field alias should be meaningful, it can be similar name of reference table column; * Make sure the SELECT and WHERE fields are in corresponding table schema definition; * Use "Unique Index" to help check record existence; +* For INSERT statement with mutliple records, should return in different meaningful alias; -{% if tables_definition -%} -===== -Related tables definition: -{{ tables_definition }} -{%- endif %} +========== +Domain Knowledge: + +user: How to add client response window (priority)? +assistant: 1. Get client Id by name; + 2. Get ClientServiceCodeId from client_ServiceCode by ClientId and ServiceCodeId + 3. Convert priority to standard value by match the list [2H, 4H, 1D , 2D, 7D], 1D = 24H, 2D = 48H. + 4. Get the Id as PriorityId from data_Priority by standard value; + 5. Insert PriorityId and ClientServiceCodeId into Client_ServiceCodePriority \ No newline at end of file From f5f60b7178ac8e40bb81f77839d906c5eecfa22d Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Wed, 21 Feb 2024 17:20:01 -0600 Subject: [PATCH 4/6] Log routing output --- .../BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs index 4462e47a..684b02d3 100644 --- a/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs +++ b/src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs @@ -79,6 +79,17 @@ public class StreamingLogHook : ConversationHookBase, IContentGeneratingHook var conversationId = _state.GetConversationId(); var agent = await agentService.LoadAgent(message.CurrentAgentId); + // Log routing output + try + { + var inst = message.Content.JsonContent(); + await _chatHub.Clients.User(_user.Id).SendAsync("OnConversationContentLogGenerated", BuildContentLog(conversationId, agent?.Name, message.Content, message)); + } + catch + { + // ignore + } + string log; if (message.Role == AgentRole.Function) { From 6deb147e70b283382faff7dd2ecd931b03b95bd1 Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Wed, 21 Feb 2024 17:22:43 -0600 Subject: [PATCH 5/6] Remove unnecessary instruction. --- .../instruction.liquid | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid index 722bfbbd..a2aac548 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/instruction.liquid @@ -9,13 +9,3 @@ Your response must meet below requirements: * Make sure the SELECT and WHERE fields are in corresponding table schema definition; * Use "Unique Index" to help check record existence; * For INSERT statement with mutliple records, should return in different meaningful alias; - -========== -Domain Knowledge: - -user: How to add client response window (priority)? -assistant: 1. Get client Id by name; - 2. Get ClientServiceCodeId from client_ServiceCode by ClientId and ServiceCodeId - 3. Convert priority to standard value by match the list [2H, 4H, 1D , 2D, 7D], 1D = 24H, 2D = 48H. - 4. Get the Id as PriorityId from data_Priority by standard value; - 5. Insert PriorityId and ClientServiceCodeId into Client_ServiceCodePriority \ No newline at end of file From a13c4c855e2d34f66675c43538db0177827e6215 Mon Sep 17 00:00:00 2001 From: Haiping Chen <101423@smsassist.com> Date: Wed, 21 Feb 2024 17:23:59 -0600 Subject: [PATCH 6/6] Remoev dedicate model. --- .../data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json index bd6e18d2..80f66ba9 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/agent.json @@ -9,7 +9,6 @@ "isPublic": true, "profiles": [ "tool", "sql" ], "llmConfig": { - "model": "gpt-4-0125", "max_recursion_depth": 10 } } \ No newline at end of file