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