Fix package bug.

This commit is contained in:
Haiping Chen 2023-09-21 10:10:24 -05:00
parent 1ff154c682
commit 25ac948510
10 changed files with 83 additions and 97 deletions

View file

@ -2,7 +2,7 @@
<PropertyGroup>
<LangVersion>10.0</LangVersion>
<OutputPath>..\..\..\packages</OutputPath>
<BotSharpVersion>0.14.1</BotSharpVersion>
<BotSharpVersion>0.14.2</BotSharpVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>

View file

@ -75,19 +75,9 @@
</ItemGroup>
<ItemGroup>
<None Remove="Routing\Prompts\reasoning_functions.liquid" />
<None Remove="Routing\router_prompt.liquid" />
</ItemGroup>
<ItemGroup>
<Content Include="Routing\Prompts\reasoning_functions.liquid">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Routing\Prompts\router_prompt.liquid">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<None Include="..\..\..\arts\Icon.png">
<Pack>True</Pack>

View file

@ -0,0 +1,72 @@
namespace BotSharp.Core.Routing;
public class PromptConst
{
public const string ROUTER_PROMPT = @"
You're a Router with reasoning, you can dispatch request to different agent to complete the task.
### Agents:
{% for agent in routing_records %}
* {{ agent.name }}
{{ agent.description }}
{% if agent.required_fields != empty -%}Required information: {{ agent.required_fields }}.{%- endif %}
{% endfor %}
### Functions
{% if enable_reasoning == false -%}
* route_to_agent
Route request to appropriate agent.
Parameters:
1. agent_name: the name of the agent;
2. reason: why route to this agent;
3. args: parameters extracted from context;
{%- endif %}
* task_end
Call this function when current task is completed.
Parameters:
1. abandoned_arguments: the arguments next task can't reuse;
* conversation_end
Call this function when user wants to end this conversation or all tasks have been completed.
* transfer_to_csr
Reach out to a real customer representative to help.
{{ reasoning_functions }}
### Your response must meet below requirements strictly
{% if enable_reasoning == false %}
* If you can find an appropriate Agent, you must call function route_to_agent with required arguments.
{% endif %}
### Conversation context:";
public const string REASONING_FUNCTIONS = @"
* retrieve_data_from_agent
Retrieve data from appropriate agent.
Parameters:
1. agent_name: the name of the agent;
2. question: the question you will ask the agent to get the necessary data;
3. reason: why retrieve data;
4. args: required parameters extracted from question and hand over to the next agent. The args should be in JSON format;
* continue_execute_task
Continue to execute user's request without further information retrival.
Parameters:
1. agent_name: the name of the agent;
2. args: required parameters extracted from question;
3. reason: why continue to execute current task;
* interrupt_task_execution
Can't continue user's request becauase the requirements are not met.
Parameters:
1. reason: the reason why the request is interrupted;
2. answer: the content response to user;
* response_to_user
You have already known the answer according the dialogs.
Parameters:
1. answer: the response of user's request;
2. reason: why response to user;";
}

View file

@ -1,26 +0,0 @@
* retrieve_data_from_agent
Retrieve data from appropriate agent.
Parameters:
1. agent_name: the name of the agent;
2. question: the question you will ask the agent to get the necessary data;
3. reason: why retrieve data;
4. args: required parameters extracted from question and hand over to the next agent. The args should be in JSON format;
* continue_execute_task
Continue to execute user's request without further information retrival.
Parameters:
1. agent_name: the name of the agent;
2. args: required parameters extracted from question;
3. reason: why continue to execute current task;
* interrupt_task_execution
Can't continue user's request becauase the requirements are not met.
Parameters:
1. reason: the reason why the request is interrupted;
2. answer: the content response to user;
* response_to_user
You have already known the answer according the dialogs.
Parameters:
1. answer: the response of user's request;
2. reason: why response to user;

View file

@ -1,38 +0,0 @@
You're a Router with reasoning, you can dispatch request to different agent to complete the task.
### Agents:
{% for agent in routing_records %}
* {{ agent.name }}
{{ agent.description }}
{% if agent.required_fields != empty -%}Required information: {{ agent.required_fields }}.{%- endif %}
{% endfor %}
### Functions
{% if enable_reasoning == false -%}
* route_to_agent
Route request to appropriate agent.
Parameters:
1. agent_name: the name of the agent;
2. reason: why route to this agent;
3. args: parameters extracted from context;
{%- endif %}
* task_end
Call this function when current task is completed.
Parameters:
1. abandoned_arguments: the arguments next task can't reuse;
* conversation_end
Call this function when user wants to end this conversation or all tasks have been completed.
* transfer_to_csr
Reach out to a real customer representative to help.
{{ reasoning_functions }}
### Your response must meet below requirements strictly
{% if enable_reasoning == false %}
* If you can find an appropriate Agent, you must call function route_to_agent with required arguments.
{% endif %}
### Conversation context:

View file

@ -224,17 +224,14 @@ public class RoutingService : IRoutingService
.ToArray()
}).ToArray();
var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Routing", "Prompts");
var template = File.ReadAllText(Path.Combine(dir, "router_prompt.liquid"));
dict["enable_reasoning"] = _settings.EnableReasoning;
if (_settings.EnableReasoning)
{
dict["reasoning_functions"] = File.ReadAllText(Path.Combine(dir, "reasoning_functions.liquid"));
dict["reasoning_functions"] = PromptConst.REASONING_FUNCTIONS;
}
var render = _services.GetRequiredService<ITemplateRender>();
router.Instruction = render.Render(template, dict);
router.Instruction = render.Render(PromptConst.ROUTER_PROMPT, dict);
return router;
}

View file

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<LangVersion>$(LangVersion)</LangVersion>
<VersionPrefix>$(PackageVersion)</VersionPrefix>
<VersionPrefix>$(BotSharpVersion)</VersionPrefix>
<GeneratePackageOnBuild>$(GeneratePackageOnBuild)</GeneratePackageOnBuild>
</PropertyGroup>

View file

@ -4,11 +4,17 @@
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<LangVersion>$(LangVersion)</LangVersion>
<VersionPrefix>$(BotSharpVersion)</VersionPrefix>
<GeneratePackageOnBuild>$(GeneratePackageOnBuild)</GeneratePackageOnBuild>
<OutputPath>..\..\packages</OutputPath>
</PropertyGroup>
<ItemGroup Condition="$(SolutionName)==PizzaBot">
<PackageReference Include="BotSharp.Core" Version="$(BotSharpVersion)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BotSharp.Core" Version="0.12.2" />
<ProjectReference Include="..\..\src\Infrastructure\BotSharp.Core\BotSharp.Core.csproj" />
</ItemGroup>
</Project>

View file

@ -1,14 +0,0 @@
using BotSharp.Abstraction.Conversations.Models;
namespace BotSharp.Plugin.PizzaBot.Functions;
public class OrderFoundFn : IFunctionCallback
{
public string Name => "order_found";
public async Task<bool> Execute(RoleDialogModel message)
{
message.ExecutionResult = "The order number is P123-01";
return true;
}
}

View file

@ -11,7 +11,6 @@ public class PizzaBotPlugin : IBotSharpPlugin
services.AddScoped<IFunctionCallback, GetPizzaTypesFn>();
services.AddScoped<IFunctionCallback, GetPizzaPricesFn>();
services.AddScoped<IFunctionCallback, PlaceOrderFn>();
services.AddScoped<IFunctionCallback, OrderFoundFn>();
services.AddScoped<IFunctionCallback, GetOrderStatusFn>();
services.AddScoped<IFunctionCallback, MakePaymentFn>();