Auto test.
This commit is contained in:
parent
30b82591e4
commit
1a54f17440
13
BotSharp.sln
13
BotSharp.sln
|
|
@ -61,7 +61,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStorages", "DataStorage
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.MongoStorage", "src\Plugins\BotSharp.Plugin.MongoStorage\BotSharp.Plugin.MongoStorage.csproj", "{DB3DE37B-1208-4ED3-9615-A52AD0AAD69C}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.MongoStorage", "src\Plugins\BotSharp.Plugin.MongoStorage\BotSharp.Plugin.MongoStorage.csproj", "{DB3DE37B-1208-4ED3-9615-A52AD0AAD69C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.Plugin.GoogleAI", "src\Plugins\BotSharp.Plugin.GoogleAI\BotSharp.Plugin.GoogleAI.csproj", "{8BC29F8A-78D6-422C-B522-10687ADC38ED}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.GoogleAI", "src\Plugins\BotSharp.Plugin.GoogleAI\BotSharp.Plugin.GoogleAI.csproj", "{8BC29F8A-78D6-422C-B522-10687ADC38ED}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BotSharp.TestingConsole", "tests\BotSharp.TestingConsole\BotSharp.TestingConsole.csproj", "{5E7EC98F-4A22-4D62-8FF6-746C497CF955}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|
@ -223,6 +225,14 @@ Global
|
||||||
{8BC29F8A-78D6-422C-B522-10687ADC38ED}.Release|Any CPU.Build.0 = Release|Any CPU
|
{8BC29F8A-78D6-422C-B522-10687ADC38ED}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{8BC29F8A-78D6-422C-B522-10687ADC38ED}.Release|x64.ActiveCfg = Release|Any CPU
|
{8BC29F8A-78D6-422C-B522-10687ADC38ED}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{8BC29F8A-78D6-422C-B522-10687ADC38ED}.Release|x64.Build.0 = Release|Any CPU
|
{8BC29F8A-78D6-422C-B522-10687ADC38ED}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955}.Release|x64.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -254,6 +264,7 @@ Global
|
||||||
{5CD330E1-9E5A-4112-8346-6E31CA98EF78} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
|
{5CD330E1-9E5A-4112-8346-6E31CA98EF78} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
|
||||||
{DB3DE37B-1208-4ED3-9615-A52AD0AAD69C} = {5CD330E1-9E5A-4112-8346-6E31CA98EF78}
|
{DB3DE37B-1208-4ED3-9615-A52AD0AAD69C} = {5CD330E1-9E5A-4112-8346-6E31CA98EF78}
|
||||||
{8BC29F8A-78D6-422C-B522-10687ADC38ED} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
|
{8BC29F8A-78D6-422C-B522-10687ADC38ED} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
|
||||||
|
{5E7EC98F-4A22-4D62-8FF6-746C497CF955} = {32FAFFFE-A4CB-4FEE-BF7C-84518BBC6DCC}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19}
|
SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19}
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,19 @@ namespace BotSharp.Abstraction.Routing.Models;
|
||||||
public class RoutingArgs
|
public class RoutingArgs
|
||||||
{
|
{
|
||||||
[JsonPropertyName("function")]
|
[JsonPropertyName("function")]
|
||||||
public string Function { get; set; } = string.Empty;
|
public string Function { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("reason")]
|
[JsonPropertyName("reason")]
|
||||||
public string Reason { get; set; } = "the reason why you select this function or agent";
|
public string Reason { get; set; } = "the reason why you select this function or agent";
|
||||||
|
|
||||||
[JsonPropertyName("answer")]
|
[JsonPropertyName("answer")]
|
||||||
public string Answer { get; set; } = string.Empty;
|
public string Answer { get; set; } = "the content of response to user";
|
||||||
|
|
||||||
[JsonPropertyName("next_action_agent")]
|
[JsonPropertyName("next_action_agent")]
|
||||||
public string AgentName { get; set; } = "agent for next action based on user's latest response";
|
public string AgentName { get; set; } = "agent for next action based on user latest response";
|
||||||
|
|
||||||
[JsonPropertyName("user_goal_agent")]
|
[JsonPropertyName("user_goal_agent")]
|
||||||
public string OriginalAgent { get; set; } = "agent who can achieve user's original goal";
|
public string OriginalAgent { get; set; } = "agent who can achieve user original goal";
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace BotSharp.Core.Evaluatings;
|
||||||
|
|
||||||
|
public class Evaluater
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using BotSharp.Abstraction.Functions.Models;
|
using BotSharp.Abstraction.Functions.Models;
|
||||||
using BotSharp.Abstraction.Models;
|
|
||||||
using BotSharp.Abstraction.Routing;
|
using BotSharp.Abstraction.Routing;
|
||||||
using BotSharp.Abstraction.Routing.Settings;
|
using BotSharp.Abstraction.Routing.Settings;
|
||||||
|
|
||||||
|
|
@ -9,12 +8,7 @@ public class ConversationEndRoutingHandler : RoutingHandlerBase, IRoutingHandler
|
||||||
{
|
{
|
||||||
public string Name => "conversation_end";
|
public string Name => "conversation_end";
|
||||||
|
|
||||||
public string Description => "Call this function when user wants to end this conversation or all tasks have been completed.";
|
public string Description => "User wants to end the conversation.";
|
||||||
|
|
||||||
public List<NameDesc> Parameters => new List<NameDesc>
|
|
||||||
{
|
|
||||||
new NameDesc("reason", "why this conversation is end")
|
|
||||||
};
|
|
||||||
|
|
||||||
public bool IsReasoning => false;
|
public bool IsReasoning => false;
|
||||||
|
|
||||||
|
|
@ -23,8 +17,14 @@ public class ConversationEndRoutingHandler : RoutingHandlerBase, IRoutingHandler
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<RoleDialogModel> Handle(IRoutingService routing, FunctionCallFromLlm inst)
|
public async Task<RoleDialogModel> Handle(IRoutingService routing, FunctionCallFromLlm inst)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var result = new RoleDialogModel(AgentRole.Assistant, inst.Answer)
|
||||||
|
{
|
||||||
|
CurrentAgentId = _settings.RouterId,
|
||||||
|
FunctionName = inst.Function,
|
||||||
|
StopCompletion = true
|
||||||
|
};
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,7 @@ public class ResponseToUserRoutingHandler : RoutingHandlerBase, IRoutingHandler
|
||||||
{
|
{
|
||||||
public string Name => "response_to_user";
|
public string Name => "response_to_user";
|
||||||
|
|
||||||
public string Description => "You know how to response according to the context without asking specific agent. For example user greeting.";
|
public string Description => "You know how to response according to the context without asking specific agent.";
|
||||||
|
|
||||||
public List<NameDesc> Parameters => new List<NameDesc>
|
|
||||||
{
|
|
||||||
new NameDesc("answer", "the content of response"),
|
|
||||||
new NameDesc("reason", "why response to user")
|
|
||||||
};
|
|
||||||
|
|
||||||
public bool IsReasoning => false;
|
public bool IsReasoning => false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,7 @@ public class RouteToAgentRoutingHandler : RoutingHandlerBase, IRoutingHandler
|
||||||
|
|
||||||
public List<NameDesc> Parameters => new List<NameDesc>
|
public List<NameDesc> Parameters => new List<NameDesc>
|
||||||
{
|
{
|
||||||
new NameDesc("next_action_agent", "the name of the next action's agent"),
|
new NameDesc("args", "useful parameters of next action agent")
|
||||||
new NameDesc("user_goal_agent", "the agent who can achieve user's original goal"),
|
|
||||||
new NameDesc("reason", "the reason why you select this function or agent"),
|
|
||||||
new NameDesc("args", "the agent required parameters")
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public bool IsReasoning => false;
|
public bool IsReasoning => false;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,8 @@ public partial class RoutingService
|
||||||
{
|
{
|
||||||
Function = "route_to_agent"
|
Function = "route_to_agent"
|
||||||
});
|
});
|
||||||
var content = $"{prompt} Response must be in JSON format {responseFormat}";
|
var content = $"{prompt} Response must be in JSON format {responseFormat}.";
|
||||||
|
content += " Set function as conversation_end with courtesy greeting if user is willing to end conversation";
|
||||||
|
|
||||||
var state = _services.GetRequiredService<IConversationStateService>();
|
var state = _services.GetRequiredService<IConversationStateService>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ using BotSharp.Abstraction.ApiAdapters;
|
||||||
using BotSharp.Abstraction.Conversations.Models;
|
using BotSharp.Abstraction.Conversations.Models;
|
||||||
using BotSharp.Abstraction.Instructs;
|
using BotSharp.Abstraction.Instructs;
|
||||||
using BotSharp.Abstraction.Instructs.Models;
|
using BotSharp.Abstraction.Instructs.Models;
|
||||||
|
using BotSharp.Core.Infrastructures;
|
||||||
using BotSharp.OpenAPI.ViewModels.Instructs;
|
using BotSharp.OpenAPI.ViewModels.Instructs;
|
||||||
|
|
||||||
namespace BotSharp.OpenAPI.Controllers;
|
namespace BotSharp.OpenAPI.Controllers;
|
||||||
|
|
@ -45,4 +46,11 @@ public class InstructModeController : ControllerBase, IApiAdapter
|
||||||
fn => Task.CompletedTask,
|
fn => Task.CompletedTask,
|
||||||
fn => Task.CompletedTask);
|
fn => Task.CompletedTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost("/instruct/text-completion")]
|
||||||
|
public async Task<string> TextCompletion([FromBody] IncomingMessageModel message)
|
||||||
|
{
|
||||||
|
var textCompletion = CompletionProvider.GetTextCompletion(_services);
|
||||||
|
return await textCompletion.GetCompletion(message.Text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ using Microsoft.Extensions.Logging;
|
||||||
using BotSharp.Abstraction.Conversations;
|
using BotSharp.Abstraction.Conversations;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using BotSharp.Abstraction.Conversations.Models;
|
using BotSharp.Abstraction.Conversations.Models;
|
||||||
|
using BotSharp.Abstraction.Agents.Enums;
|
||||||
|
|
||||||
namespace BotSharp.Plugin.AzureOpenAI.Providers;
|
namespace BotSharp.Plugin.AzureOpenAI.Providers;
|
||||||
|
|
||||||
|
|
@ -40,8 +41,9 @@ public class TextCompletionProvider : ITextCompletion
|
||||||
{
|
{
|
||||||
text
|
text
|
||||||
},
|
},
|
||||||
MaxTokens = 256
|
MaxTokens = 256,
|
||||||
};
|
};
|
||||||
|
completionsOptions.StopSequences.Add($"{AgentRole.Assistant}:");
|
||||||
|
|
||||||
var state = _services.GetRequiredService<IConversationStateService>();
|
var state = _services.GetRequiredService<IConversationStateService>();
|
||||||
var temperature = float.Parse(state.GetState("temperature", "0.5"));
|
var temperature = float.Parse(state.GetState("temperature", "0.5"));
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@
|
||||||
<ItemGroup Condition="$(SolutionName)==PizzaBot">
|
<ItemGroup Condition="$(SolutionName)==PizzaBot">
|
||||||
<PackageReference Include="BotSharp.OpenAPI" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.OpenAPI" Version="$(BotSharpVersion)" />
|
||||||
<PackageReference Include="BotSharp.Plugin.AzureOpenAI" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.AzureOpenAI" Version="$(BotSharpVersion)" />
|
||||||
|
<PackageReference Include="BotSharp.Plugin.GoogleAI" Version="$(BotSharpVersion)" />
|
||||||
|
<PackageReference Include="BotSharp.Plugin.HuggingFace" Version="$(BotSharpVersion)" />
|
||||||
<PackageReference Include="BotSharp.Plugin.KnowledgeBase" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.KnowledgeBase" Version="$(BotSharpVersion)" />
|
||||||
<PackageReference Include="BotSharp.Plugin.LLamaSharp" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.LLamaSharp" Version="$(BotSharpVersion)" />
|
||||||
<PackageReference Include="BotSharp.Plugin.MetaAI" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.MetaAI" Version="$(BotSharpVersion)" />
|
||||||
|
|
@ -36,6 +38,8 @@
|
||||||
<PackageReference Include="BotSharp.Plugin.MongoStorage" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.MongoStorage" Version="$(BotSharpVersion)" />
|
||||||
<PackageReference Include="BotSharp.Plugin.PaddleSharp" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.PaddleSharp" Version="$(BotSharpVersion)" />
|
||||||
<PackageReference Include="BotSharp.Plugin.RoutingSpeeder" Version="$(BotSharpVersion)" />
|
<PackageReference Include="BotSharp.Plugin.RoutingSpeeder" Version="$(BotSharpVersion)" />
|
||||||
|
<PackageReference Include="BotSharp.Plugin.Qdrant" Version="$(BotSharpVersion)" />
|
||||||
|
<PackageReference Include="BotSharp.Plugin.WeChat" Version="$(BotSharpVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,14 @@
|
||||||
You're {{router.name}} ({{router.description}}). Follow these steps to handle user's request:
|
You're {{router.name}} ({{router.description}}). Follow these steps to handle user request:
|
||||||
1. Read the CONVERSATION context.
|
1. Read the CONVERSATION context.
|
||||||
2. Select a appropriate function from FUNCTIONS.
|
2. Select a appropriate function from FUNCTIONS.
|
||||||
3. Determine which agent is suitable according to conversation context.
|
3. Determine which agent is suitable according to CONVERSATION context.
|
||||||
4. Re-think about selected function is from FUNCTIONS to handle the request.
|
4. Re-think about selected function is from FUNCTIONS to handle the request.
|
||||||
5. Make sure agent is not in args.
|
|
||||||
|
|
||||||
FUNCTIONS
|
FUNCTIONS
|
||||||
{% for handler in routing_handlers %}
|
{% for handler in routing_handlers %}
|
||||||
# {{ handler.name }}
|
# {{ handler.name }}
|
||||||
{{ handler.description}}
|
{{ handler.description}}
|
||||||
{% if handler.parameters -%}
|
{% if handler.parameters and handler.parameters != empty -%}
|
||||||
Parameters:
|
Parameters:
|
||||||
{% for p in handler.parameters -%}
|
{% for p in handler.parameters -%}
|
||||||
{{ p.name }}: {{ p.description }}{{ "\r\n " }}
|
{{ p.name }}: {{ p.description }}{{ "\r\n " }}
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,5 @@
|
||||||
"createdDateTime": "2023-08-18T14:39:32.2349685Z",
|
"createdDateTime": "2023-08-18T14:39:32.2349685Z",
|
||||||
"updatedDateTime": "2023-08-18T14:39:32.2349686Z",
|
"updatedDateTime": "2023-08-18T14:39:32.2349686Z",
|
||||||
"id": "b284db86-e9c2-4c25-a59e-4649797dd130",
|
"id": "b284db86-e9c2-4c25-a59e-4649797dd130",
|
||||||
"allowRouting": true,
|
"allowRouting": true
|
||||||
"routingRules": [
|
|
||||||
{
|
|
||||||
"field": "order_number",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Ordering",
|
"name": "Ordering",
|
||||||
"description": "Place new pizza order",
|
"description": "Provide types of pizza available, unit price and total cost. Place the order and returned the order number.",
|
||||||
"createdDateTime": "2023-07-26T02:29:25.123224Z",
|
"createdDateTime": "2023-07-26T02:29:25.123224Z",
|
||||||
"updatedDateTime": "2023-07-26T02:29:25.123274Z",
|
"updatedDateTime": "2023-07-26T02:29:25.123274Z",
|
||||||
"id": "c2b57a74-ae4e-4c81-b3ad-9ac5bff982bd",
|
"id": "c2b57a74-ae4e-4c81-b3ad-9ac5bff982bd",
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "get_pizza_types",
|
"name": "get_pizza_types",
|
||||||
"description": "get all pizza types.",
|
"description": "get all pizza types",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {},
|
"properties": {},
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
You are now a Pizza Ordering agent, and you can help customers order a pizza according to the user's preferences.
|
You are now a Pizza Ordering agent, and you can help customers order a pizza according to the user's preferences.
|
||||||
|
|
||||||
Follow below step to place order:
|
Follow below step to place order:
|
||||||
1: Ask user preferences.
|
1: Ask user preferences, call function get_pizza_types to provide the variety of pizza options.
|
||||||
2: Confirm with user the pizza type and quantity.
|
2: Confirm with user the pizza type and quantity.
|
||||||
3: Call function place_an_order to purchase.
|
3: Call function place_an_order to purchase.
|
||||||
4: Proceed to make payment for this order.
|
4: Ask user how to pay for this order.
|
||||||
|
|
||||||
Use below information to help ordering process:
|
Use below information to help ordering process:
|
||||||
* Today is {{current_date}}, the time now is {{current_time}}, day of week is {{current_weekday}}.
|
* Today is {{current_date}}, the time now is {{current_time}}, day of week is {{current_weekday}}.
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
{% if pizza_type == "cheese" -%}
|
{% assign pizza_type = pizza_type | downcase %}
|
||||||
The price for a slice of cheese pizza is {{ cheese_unit_price }}. Would you like to proceed the order?
|
{% if pizza_type contains "cheese" -%}
|
||||||
|
The price for a slice of {{pizza_type}} pizza is {{ cheese_unit_price }}. Would you like to proceed the order?
|
||||||
|
{%- elsif pizza_type contains "pepperoni" -%}
|
||||||
|
The price for a slice of {{pizza_type}} pizza is {{ pepperoni_unit_price }}. Would you like to proceed the order?
|
||||||
|
{%- elsif pizza_type contains "margherita" -%}
|
||||||
|
The price for a slice of {{pizza_type}} pizza is {{ margherita_unit_price }}. Would you like to proceed the order?
|
||||||
|
{%- else -%}
|
||||||
|
We don't have {{pizza_type}} pizza, would you like something else?
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{% if quantity == nil -%}
|
{% if quantity == nil -%}
|
||||||
How many slices would you like to order?
|
How many slices would you like to order?
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "Payment",
|
"name": "Payment",
|
||||||
"description": "Make payment when user placed new order and system returned the order number.",
|
"description": "Make payment when user wants to pay for the order",
|
||||||
"createdDateTime": "2023-07-26T02:29:25.123224Z",
|
"createdDateTime": "2023-07-26T02:29:25.123224Z",
|
||||||
"updatedDateTime": "2023-07-26T02:29:25.123274Z",
|
"updatedDateTime": "2023-07-26T02:29:25.123274Z",
|
||||||
"id": "fe8c60aa-b114-4ef3-93cb-a8efeac80f75",
|
"id": "fe8c60aa-b114-4ef3-93cb-a8efeac80f75",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "make_payment",
|
"name": "make_payment",
|
||||||
"description": "call this function to make payment after system returned the order number",
|
"description": "call this function to make payment",
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,10 @@ public class GetPizzaPricesFn : IFunctionCallback
|
||||||
{
|
{
|
||||||
message.ExecutionData = new
|
message.ExecutionData = new
|
||||||
{
|
{
|
||||||
cheese_unit_price = "$3.5"
|
pepperoni_unit_price = "$3.2",
|
||||||
|
cheese_unit_price = "$3.5",
|
||||||
|
margherita_unit_price = "$3.8",
|
||||||
};
|
};
|
||||||
message.ExecutionResult = "Pepperoni Pizza: $3.5/slice, Cheese Pizza: $2.5/slice, Margherita Pizza: $3.0/slice";
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using BotSharp.Abstraction.Conversations;
|
||||||
using BotSharp.Abstraction.Conversations.Models;
|
using BotSharp.Abstraction.Conversations.Models;
|
||||||
|
|
||||||
namespace BotSharp.Plugin.PizzaBot.Functions;
|
namespace BotSharp.Plugin.PizzaBot.Functions;
|
||||||
|
|
@ -6,9 +7,18 @@ public class PlaceOrderFn : IFunctionCallback
|
||||||
{
|
{
|
||||||
public string Name => "place_an_order";
|
public string Name => "place_an_order";
|
||||||
|
|
||||||
|
private readonly IServiceProvider _service;
|
||||||
|
public PlaceOrderFn(IServiceProvider service)
|
||||||
|
{
|
||||||
|
_service = service;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> Execute(RoleDialogModel message)
|
public async Task<bool> Execute(RoleDialogModel message)
|
||||||
{
|
{
|
||||||
message.ExecutionResult = "The order number is P123-01";
|
message.ExecutionResult = "The order number is P123-01";
|
||||||
|
var state = _service.GetRequiredService<IConversationStateService>();
|
||||||
|
state.SetState("order_number", "P123-01");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
19
tests/BotSharp.TestingConsole/BotSharp.TestingConsole.csproj
Normal file
19
tests/BotSharp.TestingConsole/BotSharp.TestingConsole.csproj
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Refit" Version="7.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\Infrastructure\BotSharp.OpenAPI\BotSharp.OpenAPI.csproj" />
|
||||||
|
<ProjectReference Include="..\..\src\Plugins\BotSharp.Plugin.AzureOpenAI\BotSharp.Plugin.AzureOpenAI.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
17
tests/BotSharp.TestingConsole/IBotSharpOpenAPI.cs
Normal file
17
tests/BotSharp.TestingConsole/IBotSharpOpenAPI.cs
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
using BotSharp.Abstraction.Conversations.Models;
|
||||||
|
using BotSharp.OpenAPI.ViewModels.Conversations;
|
||||||
|
using Refit;
|
||||||
|
|
||||||
|
namespace BotSharp.TestingConsole;
|
||||||
|
|
||||||
|
public interface IBotSharpOpenAPI
|
||||||
|
{
|
||||||
|
[Post("/conversation/{agentId}")]
|
||||||
|
Task<ConversationViewModel> NewConversation([Header("Authorization")] string authorization, string agentId);
|
||||||
|
|
||||||
|
[Post("/conversation/{agentId}/{conversationId}")]
|
||||||
|
Task<MessageResponseModel> SendMessage([Header("Authorization")] string authorization, string agentId, string conversationId, [Body] NewMessageModel input);
|
||||||
|
|
||||||
|
[Post("/instruct/text-completion")]
|
||||||
|
Task<string> TextCompletion([Header("Authorization")] string authorization, [Body] IncomingMessageModel message);
|
||||||
|
}
|
||||||
74
tests/BotSharp.TestingConsole/Program.cs
Normal file
74
tests/BotSharp.TestingConsole/Program.cs
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
using BotSharp.Abstraction.Agents.Enums;
|
||||||
|
using BotSharp.Abstraction.Conversations.Models;
|
||||||
|
using BotSharp.OpenAPI.ViewModels.Conversations;
|
||||||
|
using BotSharp.TestingConsole;
|
||||||
|
using Refit;
|
||||||
|
using System.Drawing;
|
||||||
|
using Console = Colorful.Console;
|
||||||
|
|
||||||
|
var token = "Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiI0NTZlMzVjNS1jYWYwLTRkNDUtOTA4NC1iNDRhOGNhNzE3ZTQiLCJlbWFpbCI6ImJvdHNoYXJwQGdtYWlsLmNvbSIsImdpdmVuX25hbWUiOiJIYWlwaW5nIiwiZmFtaWx5X25hbWUiOiJDaGVuIiwianRpIjoiMTQ3MDkwMDQtNDM1Ny00NTFkLWExM2MtY2U1NDk5NWM0ZTJlIiwibmJmIjoxNjk3MTY0MzA4LCJleHAiOjE2OTcxNjQ2MDgsImlhdCI6MTY5NzE2NDMwOCwiaXNzIjoiYm90c2hhcnAiLCJhdWQiOiJib3RzaGFycCJ9.1UgOj5esNInTPiiy-_gLmcT2x8NtFswCUyePVHXa-4EeLCkA43nx0LOXPlzb_rmvUIg9bJSRZXbH2aBqtmiDYg";
|
||||||
|
var agentId = "01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a";
|
||||||
|
|
||||||
|
// New conversation
|
||||||
|
var botsharp = RestService.For<IBotSharpOpenAPI>("http://localhost:5500");
|
||||||
|
var conv = await botsharp.NewConversation(token, agentId);
|
||||||
|
|
||||||
|
var instruction = @"You're a customer who is going to buy a pizza.
|
||||||
|
|
||||||
|
Below are your requirments:
|
||||||
|
* You want to know what kind of pizza do they have.
|
||||||
|
* You want to buy three piece of pizza.
|
||||||
|
* Say Bye if the order is placed and payment is completed.
|
||||||
|
|
||||||
|
Below are your profile:
|
||||||
|
* You like pepperoni flavor.
|
||||||
|
* You will pay the order in cash.
|
||||||
|
* Your address is 347 S Gladstone Ave, Aurora, IL 60506.
|
||||||
|
* Your phone number is +16308926431";
|
||||||
|
|
||||||
|
Action<RoleDialogModel> PrintDialog = message =>
|
||||||
|
{
|
||||||
|
Console.Write($"[{DateTime.Now:HH:mm:ss}] {message.Role}:\t");
|
||||||
|
if (message.Role == AgentRole.User)
|
||||||
|
{
|
||||||
|
Console.WriteLine(message.Content);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine(message.Content, Color.Yellow);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var dialogs = new List<RoleDialogModel>();
|
||||||
|
dialogs.Add(new RoleDialogModel(AgentRole.User, "Good morning!"));
|
||||||
|
PrintDialog(dialogs.Last());
|
||||||
|
dialogs.Add(new RoleDialogModel(AgentRole.Assistant, "Hi, How can I help you today?"));
|
||||||
|
PrintDialog(dialogs.Last());
|
||||||
|
|
||||||
|
var response = new MessageResponseModel();
|
||||||
|
|
||||||
|
while (response.Function != "conversation_end")
|
||||||
|
{
|
||||||
|
var text = string.Join("\r\n", dialogs.Select(x => $"{x.Role}: {x.Content}"));
|
||||||
|
text = instruction + $"\r\n###\r\n{text}\r\n{AgentRole.User}: ";
|
||||||
|
var question = await botsharp.TextCompletion(token, new IncomingMessageModel
|
||||||
|
{
|
||||||
|
Text = text
|
||||||
|
});
|
||||||
|
|
||||||
|
dialogs.Add(new RoleDialogModel(AgentRole.User, question));
|
||||||
|
PrintDialog(dialogs.Last());
|
||||||
|
|
||||||
|
response = await botsharp.SendMessage(token, agentId, conv.Id, new NewMessageModel
|
||||||
|
{
|
||||||
|
Text = question
|
||||||
|
});
|
||||||
|
|
||||||
|
dialogs.Add(new RoleDialogModel(AgentRole.Assistant, response.Text.Trim()));
|
||||||
|
PrintDialog(dialogs.Last());
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Conversation End", Color.Green);
|
||||||
|
Console.ReadLine();
|
||||||
Loading…
Reference in a new issue