diff --git a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj index 172c5eb96..01cb77def 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj +++ b/src/Plugins/BotSharp.Plugin.Planner/BotSharp.Plugin.Planner.csproj @@ -16,6 +16,7 @@ + @@ -49,6 +50,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs index 2e7cdaafc..b818c4585 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/SecondaryStagePlanFn.cs @@ -21,34 +21,26 @@ public async Task Execute(RoleDialogModel message) var agentService = _services.GetRequiredService(); var knowledgeService = _services.GetRequiredService(); var knowledgeSettings = _services.GetRequiredService(); - + var states = _services.GetRequiredService(); + var msgSecondary = RoleDialogModel.From(message); - var taskPrimary = JsonSerializer.Deserialize(message.FunctionArgs); var collectionName = knowledgeSettings.Default.CollectionName ?? KnowledgeCollectionName.BotSharp; - - msgSecondary.FunctionArgs = JsonSerializer.Serialize(new SecondaryBreakdownTask - { - TaskDescription = taskPrimary.Requirements - }); + var planPrimary = states.GetState("planning_result"); + var taskPrimary = states.GetState("requirement_detail"); var taskSecondary = JsonSerializer.Deserialize(msgSecondary.FunctionArgs); - var items = msgSecondary.Content.JsonArrayContent(); - + // Search knowledgebase - foreach (var item in items) + var knowledges = await knowledgeService.SearchVectorKnowledge(taskSecondary.SolutionQuestion, collectionName, new VectorSearchOptions { - if (!item.NeedAdditionalInformation) continue; - - var knowledges = await knowledgeService.SearchVectorKnowledge(item.Task, collectionName, new VectorSearchOptions - { - Confidence = 0.6f - }); - message.Content += string.Join("\r\n\r\n=====\r\n", knowledges.Select(x => x.ToQuestionAnswer())); - } + Confidence = 0.6f + }); + var knowledgeResults = ""; + knowledgeResults = string.Join("\r\n\r\n=====\r\n", knowledges.Select(x => x.ToQuestionAnswer())); // Get second stage planning prompt var currentAgent = await agentService.LoadAgent(message.CurrentAgentId); - var secondPlanningPrompt = await GetSecondStagePlanPrompt(taskSecondary.TaskDescription, message); + var secondPlanningPrompt = await GetSecondStagePlanPrompt(taskSecondary.TaskDescription, planPrimary, knowledgeResults, message); _logger.LogInformation(secondPlanningPrompt); var plannerAgent = new Agent @@ -64,12 +56,11 @@ public async Task Execute(RoleDialogModel message) message.Content = response.Content; _logger.LogInformation(response.Content); - var states = _services.GetRequiredService(); states.SetState("planning_result", response.Content); return true; } - private async Task GetSecondStagePlanPrompt(string taskDescription, RoleDialogModel message) + private async Task GetSecondStagePlanPrompt(string taskDescription, string planPrimary, string knowledgeResults, RoleDialogModel message) { var agentService = _services.GetRequiredService(); var render = _services.GetRequiredService(); @@ -85,7 +76,8 @@ private async Task GetSecondStagePlanPrompt(string taskDescription, Role return render.Render(template, new Dictionary { { "task_description", taskDescription }, - { "primary_plan", new[]{ message.Content } }, + { "primary_plan", planPrimary }, + { "additional_knowledge", knowledgeResults }, { "response_format", responseFormat } }); } diff --git a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs index 1c53a6c5a..7c930c39d 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs +++ b/src/Plugins/BotSharp.Plugin.Planner/Functions/SummaryPlanFn.cs @@ -35,7 +35,7 @@ public async Task Execute(RoleDialogModel message) var allTables = new List(); var ddlStatements = ""; var relevantKnowledge = states.GetState("planning_result"); - relevantKnowledge += states.GetState("dictionary_items"); + var dictionaryItems = states.GetState("dictionary_items"); foreach (var step in steps) { @@ -49,12 +49,12 @@ public async Task Execute(RoleDialogModel message) { table = table, }); - await fn.InvokeFunction("get_table_definition", msgCopy); + await fn.InvokeFunction("sql_table_definition", msgCopy); ddlStatements += "\r\n" + msgCopy.Content; } // Summarize and generate query - var summaryPlanPrompt = await GetSummaryPlanPrompt(taskRequirement, relevantKnowledge, ddlStatements); + var summaryPlanPrompt = await GetSummaryPlanPrompt(taskRequirement, relevantKnowledge, dictionaryItems, ddlStatements); _logger.LogInformation($"Summary plan prompt:\r\n{summaryPlanPrompt}"); var plannerAgent = new Agent @@ -74,7 +74,7 @@ await HookEmitter.Emit(_services, x => return true; } - private async Task GetSummaryPlanPrompt(string taskDescription, string relevantKnowledge, string ddlStatement) + private async Task GetSummaryPlanPrompt(string taskDescription, string relevantKnowledge, string dictionaryItems, string ddlStatement) { var agentService = _services.GetRequiredService(); var render = _services.GetRequiredService(); @@ -94,6 +94,7 @@ await HookEmitter.Emit(_services, async x => { "task_description", taskDescription }, { "summary_requirements", string.Join("\r\n",additionalRequirements) }, { "relevant_knowledges", relevantKnowledge }, + { "dictionary_items", dictionaryItems }, { "table_structure", ddlStatement }, }); } diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_primary_stage.json b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_primary_stage.json index e1162634c..e38c75f69 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_primary_stage.json +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/functions/plan_primary_stage.json @@ -13,7 +13,7 @@ "description": "User requirements in detail, don't miss any information especially for those line items, values and numbers.", "items": { "type": "string", - "description": "Question converted from requirement in different ways to search in the knowledge base, be short" + "description": "Question converted from requirement in different ways to search in the knowledge base, be short and you can refer to the global knowledge." } } }, diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.dictionary.sql.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.dictionary.sql.liquid new file mode 100644 index 000000000..d0c09ce53 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.dictionary.sql.liquid @@ -0,0 +1,10 @@ +You are a sql statement corrector. You will need to refer to the table structure and rewrite the original sql statement so it's using the correct information, e.g. column name. +Output the sql statement only without comments, in JSON format: {{ response_format }} + +===== +Original Sql: +{{ original_sql }} + +===== +Table Structure: +{{ table_structure }} diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.summarize.mysql.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.summarize.mysql.liquid index 15cd22d30..515deffd5 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.summarize.mysql.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/database.summarize.mysql.liquid @@ -18,3 +18,4 @@ For example, you should use SET @id = select max(id) from table; *** the generated sql query MUST be basedd on the provided table structure. *** *** All queries return a maximum of 20 records. *** *** Only select user friendly columns. *** +*** Try to use id instead of string in where clause if you have the dictionary. *** diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid index 22cc3c5f6..f6e8f5579 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.1st.plan.liquid @@ -8,7 +8,7 @@ Thinking process: - If there is extra knowledge or relationship needed between steps, set the need_additional_information to true for both steps. - If the solution mentioned "related solutions" is needed, set the need_additional_information to true. - You should find the relationships between data structure based on the task knowledge strictly. If lack of information, set the need_additional_information to true. - - If you need to verify or get the enum/term/dictionary value, set the need_additional_information to true. + - If you need to lookup the dictionary to verify or get the enum/term/dictionary value, set the need_additional_information to true. 3. Input argument must reference to corresponding variable name that retrieved by previous steps, variable name must start with '@'; 4. Output all the subtasks as much detail as possible in JSON: [{{ response_format }}] 5. You can NOT generate the final query before calling function plan_summary. diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.2nd.plan.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.2nd.plan.liquid index 5437d3be9..d4bd15b54 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.2nd.plan.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.2nd.plan.liquid @@ -11,8 +11,13 @@ Additional Requirements: * "output_results" is variable name that needed to be used in the next step. ===== -TASK: {{ task_description }} +Sub Task Description: +{{ task_description }} ===== Primary Planning: -{{ primary_plan }} \ No newline at end of file +{{ primary_plan }} + +===== +Additional Knowledge: +{{ additional_knowledge }} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid index 9b7ced71d..23b6aa53a 100644 --- a/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid +++ b/src/Plugins/BotSharp.Plugin.Planner/data/agents/282a7128-69a1-44b0-878c-a9159b88f3b9/templates/two_stage.summarize.liquid @@ -11,6 +11,10 @@ Task description: Relevant Knowledges: {{ relevant_knowledges }} +===== +Dictionary Items: +{{ dictionary_items }} + ===== Table Structure: {{ table_structure }} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj index 90a645b8f..35f167077 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/BotSharp.Plugin.SqlDriver.csproj @@ -17,32 +17,34 @@ - - + + - + + PreserveNewest + PreserveNewest PreserveNewest - + PreserveNewest - + PreserveNewest @@ -54,9 +56,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -81,4 +80,8 @@ + + + + diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs index b3a4862ae..4d9142caf 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Enum/Utility.cs @@ -4,4 +4,5 @@ public class Utility { public const string SqlExecutor = "sql-executor"; public const string SqlDictionaryLookup = "sql-dictionary-lookup"; + public const string SqlTableDefinition = "sql-table-definition"; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableDefinitionFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableDefinitionFn.cs index cf7d26c6d..b3a3c134e 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableDefinitionFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableDefinitionFn.cs @@ -8,7 +8,7 @@ namespace BotSharp.Plugin.SqlDriver.Functions; public class GetTableDefinitionFn : IFunctionCallback { - public string Name => "get_table_definition"; + public string Name => "sql_table_definition"; public string Indication => "Obtain the relevant data structure definitions."; private readonly IServiceProvider _services; private readonly ILogger _logger; @@ -38,6 +38,9 @@ public async Task Execute(RoleDialogModel message) message.Content = string.Join("\r\n\r\n", tableDdls); + //var states = _services.GetRequiredService(); + //states.SetState($"table_definition_{args.Table}", message.Content); + return true; } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/LookupDictionaryFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/LookupDictionaryFn.cs index 3c8a8cc4a..e0f9d5292 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/LookupDictionaryFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/LookupDictionaryFn.cs @@ -1,10 +1,14 @@ using Azure; using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.MLTasks; +using BotSharp.Abstraction.Routing; +using BotSharp.Core.Agents.Services; using BotSharp.Core.Infrastructures; using BotSharp.Plugin.SqlDriver.Models; using MySqlConnector; +using System.Text.RegularExpressions; using static Dapper.SqlMapper; +using static System.Net.Mime.MediaTypeNames; namespace BotSharp.Plugin.SqlDriver.Functions; @@ -22,6 +26,26 @@ public async Task Execute(RoleDialogModel message) { var args = JsonSerializer.Deserialize(message.FunctionArgs); + // get table DDL + var fn = _services.GetRequiredService(); + var msgCopy = RoleDialogModel.From(message); + await fn.InvokeFunction("sql_table_definition", msgCopy); + + // refine SQL + var agentService = _services.GetRequiredService(); + var currentAgent = await agentService.LoadAgent(message.CurrentAgentId); + var dictionarySqlPrompt = await GetDictionarySQLPrompt(args.SqlStatement, msgCopy.Content); + var plannerAgent = new Agent + { + Id = string.Empty, + Name = "sqlDriver_DictionarySearch", + Instruction = dictionarySqlPrompt, + TemplateDict = new Dictionary(), + LlmConfig = currentAgent.LlmConfig + }; + var response = await GetAiResponse(plannerAgent); + args = JsonSerializer.Deserialize(response.Content); + // check if need to instantely var settings = _services.GetRequiredService(); using var connection = new MySqlConnection(settings.MySqlExecutionConnectionString); @@ -37,9 +61,37 @@ public async Task Execute(RoleDialogModel message) } var states = _services.GetRequiredService(); var dictionaryItems = states.GetState("dictionary_items", ""); - dictionaryItems += "\r\n\r\n" + args.Reason + ":\r\n" + message.Content + "\r\n"; + dictionaryItems += "\r\n\r\n" + args.Table + ":\r\n" + args.Reason + ":\r\n" + message.Content + "\r\n"; states.SetState("dictionary_items", dictionaryItems); return true; } + private async Task GetDictionarySQLPrompt(string originalSql, string tableStructure) + { + var agentService = _services.GetRequiredService(); + var render = _services.GetRequiredService(); + var knowledgeHooks = _services.GetServices(); + + var agent = await agentService.GetAgent(BuiltInAgentId.Planner); + var template = agent.Templates.FirstOrDefault(x => x.Name == "database.dictionary.sql")?.Content ?? string.Empty; + var responseFormat = JsonSerializer.Serialize(new LookupDictionary{ }); + + return render.Render(template, new Dictionary + { + { "original_sql", originalSql }, + { "table_structure", tableStructure }, + { "response_format", responseFormat } + }); + } + private async Task GetAiResponse(Agent plannerAgent) + { + var text = "Check and correct the SQL statement."; + var message = new RoleDialogModel(AgentRole.User, text); + + var completion = CompletionProvider.GetChatCompletion(_services, + provider: plannerAgent.LlmConfig.Provider, + model: plannerAgent.LlmConfig.Model); + + return await completion.GetChatCompletions(plannerAgent, new List { message }); + } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs new file mode 100644 index 000000000..bcfd20934 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/GetTableDefinitionHook.cs @@ -0,0 +1,84 @@ +using BotSharp.Abstraction.Agents.Enums; +using BotSharp.Abstraction.Agents.Settings; +using BotSharp.Abstraction.Functions.Models; +using BotSharp.Abstraction.Repositories; + +namespace BotSharp.Plugin.SqlDriver.Hooks; + +public class GetTableDefinitionHook : AgentHookBase, IAgentHook +{ + private const string SQL_EXECUTOR_TEMPLATE = "sql_table_definition.fn"; + private IEnumerable _targetSqlExecutorFunctions = new List + { + "sql_table_definition", + }; + + public override string SelfId => BuiltInAgentId.Planner; + + public GetTableDefinitionHook(IServiceProvider services, AgentSettings settings) : base(services, settings) + { + } + + public override void OnAgentLoaded(Agent agent) + { + var conv = _services.GetRequiredService(); + var isConvMode = conv.IsConversationMode(); + var isEnabled = !agent.Utilities.IsNullOrEmpty() && agent.Utilities.Contains(Utility.SqlTableDefinition); + + if (isConvMode && isEnabled) + { + var (prompt, fns) = GetPromptAndFunctions(); + if (!fns.IsNullOrEmpty()) + { + if (!string.IsNullOrWhiteSpace(prompt)) + { + agent.Instruction += $"\r\n\r\n{prompt}\r\n\r\n"; + } + + if (agent.Functions == null) + { + agent.Functions = fns; + } + else + { + agent.Functions.AddRange(fns); + } + } + } + + base.OnAgentLoaded(agent); + } + + private (string, List?) GetPromptAndFunctions() + { + var db = _services.GetRequiredService(); + var agent = db.GetAgent(BuiltInAgentId.UtilityAssistant); + var fns = agent?.Functions?.Where(x => _targetSqlExecutorFunctions.Contains(x.Name))?.ToList(); + + var prompt = agent?.Templates?.FirstOrDefault(x => x.Name.IsEqualTo(SQL_EXECUTOR_TEMPLATE))?.Content ?? string.Empty; + var dbType = GetDatabaseType(); + var render = _services.GetRequiredService(); + prompt = render.Render(prompt, new Dictionary + { + { "db_type", dbType } + }); + + return (prompt, fns); + } + + private string GetDatabaseType() + { + var settings = _services.GetRequiredService(); + var dbType = "MySQL"; + + if (!string.IsNullOrWhiteSpace(settings?.SqlServerConnectionString)) + { + dbType = "SQL Server"; + } + else if (!string.IsNullOrWhiteSpace(settings?.SqlLiteConnectionString)) + { + dbType = "SQL Lite"; + } + return dbType; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs index ecb4e2920..07483b2f2 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlExecutorHook.cs @@ -11,7 +11,7 @@ public class SqlExecutorHook : AgentHookBase, IAgentHook private IEnumerable _targetSqlExecutorFunctions = new List { "sql_select", - "get_table_definition", + "sql_table_definition", }; public override string SelfId => string.Empty; diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs index 5ab8e7237..daac8cba2 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlUtilityHook.cs @@ -6,5 +6,6 @@ public void AddUtilities(List utilities) { utilities.Add(Utility.SqlExecutor); utilities.Add(Utility.SqlDictionaryLookup); + utilities.Add(Utility.SqlTableDefinition); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index a41490d42..58a382d8e 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -24,5 +24,6 @@ public void RegisterDI(IServiceCollection services, IConfiguration config) services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_table_definition.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_table_definition.json new file mode 100644 index 000000000..e973feb89 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/sql_table_definition.json @@ -0,0 +1,18 @@ +{ + "name": "sql_table_definition", + "description": "Get table structure from database by table name", + "parameters": { + "type": "object", + "properties": { + "table": { + "type": "string", + "description": "table name" + }, + "reason": { + "type": "string", + "description": "the reason why you need to call sql_table_definition" + } + }, + "required": [ "table", "reason" ] + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/get_table_definition.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/get_table_definition.fn.liquid deleted file mode 100644 index e659e0125..000000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/get_table_definition.fn.liquid +++ /dev/null @@ -1 +0,0 @@ -Call get_table_definition to get the table definition of the table you want to query. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_dictionary_lookup.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_dictionary_lookup.fn.liquid index d9d4c93bf..73dcb58da 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_dictionary_lookup.fn.liquid +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_dictionary_lookup.fn.liquid @@ -1,7 +1,7 @@ Dictionary Lookup Rules: ===== Please call function sql_dictionary_lookup if user wants to get or retrieve dictionary/enum/term from data tables. -You must return the id and name/code. +You must return the id and name/code. The table name must come from the planning in conversation. You are connecting to {{ db_type }} database. You can run provided SQL statements by following {{ db_type }} rules. Dictionary table pattern is table name starting with "data_". You can only query the dictionary table without join other non-dictionary tables. diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid new file mode 100644 index 000000000..9a8dee70f --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/templates/sql_table_definition.fn.liquid @@ -0,0 +1 @@ +Call sql_table_definition to get the table definition of the table. \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/get_table_definition.json b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json similarity index 89% rename from src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/get_table_definition.json rename to src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json index 52a747fe7..748202b4f 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/get_table_definition.json +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/functions/sql_table_definition.json @@ -1,5 +1,5 @@ { - "name": "get_table_definition", + "name": "sql_table_definition", "description": "Get the DDL, including data structure, data field and relationship for table", "parameters": { "type": "object", diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/templates/sql_dictionary_lookup.liquid b/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/templates/sql_dictionary_lookup.liquid deleted file mode 100644 index cf5b190aa..000000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/data/agents/beda4c12-e1ec-4b4b-b328-3df4a6687c4f/templates/sql_dictionary_lookup.liquid +++ /dev/null @@ -1,9 +0,0 @@ -DICTIONARY: - -{% for item in items %} -* {{ item }} -{% endfor %} - -===== -Which item is the best matching with "{{ keyword }}"? -You must return Id and Name field. \ No newline at end of file