Skip to content

Commit

Permalink
Enhance agent chat features and update tokenizer model
Browse files Browse the repository at this point in the history
- Modified `AgentGroupChatPage.razor` to use lambda expressions for button clicks and added a new example button.
- Updated `AgentGroupChatPage.razor.cs` to use `UpsertAssistantMessage` for streaming response and enhanced `UseExample` method to import plugins.
- Improved `AutoSelectNextAgent` logic in `GroupChat.cs` to prevent infinite loops.
- Switched to `InvokeStreamingAsync` in `ChatCompletionGroup.cs` and added output formatting.
- Updated default tokenizer model to `gpt-4o`.
  • Loading branch information
HillPhelmuth committed Sep 23, 2024
1 parent ae5b075 commit 636aa5a
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 13 deletions.
3 changes: 2 additions & 1 deletion BlazorWithSematicKernel/Pages/AgentGroupChatPage.razor
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
<RadzenStepsItem Text="Build Agent Group" NextText="Start Group Chat">
<RadzenRow>
<RadzenColumn>
<RadzenButton Size=ButtonSize.Small Click="UseExample" Text="Use Art Director Example"></RadzenButton>
<RadzenButton Size=ButtonSize.Small Click="@(() => UseExample())" Text="Use Art Director Example"></RadzenButton>
<RadzenButton Size=ButtonSize.Small Click="@(() => UseExample("agentsExample-researcher.json"))" Text="Use Researcher Example"></RadzenButton>
</RadzenColumn>
<RadzenColumn>
<RadzenTemplateForm TItem="FileUploadData" Data="_fileUploadData" Submit="HandleFile">
Expand Down
13 changes: 9 additions & 4 deletions BlazorWithSematicKernel/Pages/AgentGroupChatPage.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,7 @@ private void Reset()
}
private async void HandleMessage(string message)
{
Console.WriteLine("Message handled");
_chatView?.ChatState?.AddAssistantMessage(message);
_chatView?.ChatState?.UpsertAssistantMessage(message);
}

private void HandleAgentProxies(AgentGroupCompletedArgs agentGroupCompleted)
Expand All @@ -85,9 +84,15 @@ private void HandleAgentProxies(AgentGroupCompletedArgs agentGroupCompleted)
_step = 2;
StateHasChanged();
}
private void UseExample()
private void UseExample(string agentsexampleSkJson = "AgentsExample-sk.json")
{
_agentProxies = FileHelper.ExtractFromAssembly<List<AgentProxy>>("AgentsExample-sk.json");
_agentProxies = FileHelper.ExtractFromAssembly<List<AgentProxy>>(agentsexampleSkJson);
foreach (var agent in _agentProxies.Where(agent => agent.PluginNames.Count > 0))
{
Console.WriteLine($"Agent {agent.Name} has {agent.PluginNames.Count} Plugins");
var pluginNames = agent.PluginNames;
agent.Plugins.AddRange(_allKernelPlugins.Where(x => pluginNames.Contains(x.Name)));
}
StateHasChanged();

}
Expand Down
2 changes: 1 addition & 1 deletion SemanticKernelAgentOrchestration/Group/GroupChat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ private async Task<ChatAgent> SelectNextSpeaker(ChatAgent lastSpeaker,
}
else
{
nextSpeaker = await AutoSelectNextAgent(groupConversion, agents, ct);
nextSpeaker = await AutoSelectNextAgent(groupConversion, agents.Where(x => x.Name != lastSpeaker.Name), ct);
}

return nextSpeaker;
Expand Down
10 changes: 7 additions & 3 deletions SkPluginLibrary/Agents/SkAgents/ChatCompletionGroup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,15 @@ public async Task RunAsync(string input, IEnumerable<Agent>? terminationAgents =
// Invoke chat and display messages.

chat.AddChatMessage(new ChatMessageContent(AuthorRole.User, input));


await foreach (var content in chat.InvokeAsync())
var currentAgent = "";
await foreach (var content in chat.InvokeStreamingAsync())
{
WriteLine($"**{content.Role} - {content.AuthorName ?? "*"}:** '{content.Content}'");
var isCurrent = content.AuthorName == currentAgent;
var output = isCurrent ? content.Content : $"**{content.Role} - {content.AuthorName ?? "*"}:** '{content.Content}'";
currentAgent = content.AuthorName ?? "";
if (string.IsNullOrEmpty(output)) continue;
WriteLine(output);
}

WriteLine($"_IS COMPLETE:_ {chat.IsComplete}");
Expand Down
1 change: 0 additions & 1 deletion SkPluginLibrary/CoreKernelService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ public static Kernel CreateKernel(AIModel aiModel = AIModel.Gpt4OMini)
});
});
var providor = aiModel.GetModelProvidors().FirstOrDefault();
Console.WriteLine($"AI: {providor}");
if (providor.Contains("OpenAI"))
kernelBuilder.AddAIChatCompletion(aiModel);
if (providor == "GoogleAI")
Expand Down
8 changes: 5 additions & 3 deletions SkPluginLibrary/Models/Helpers/StringHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ namespace SkPluginLibrary.Models.Helpers
public static class StringHelpers
{
private static Encoding? _tokenizer;

static StringHelpers()
{
_tokenizer = Encoding.ForModel("gpt-3.5-turbo");
_tokenizer = Encoding.ForModel("gpt-4o");
}
public static List<TokenString> EncodeDecodeWithSpaces(string? input)
{
if (input == null) return new List<TokenString>();
_tokenizer ??= Encoding.ForModel("gpt-3.5-turbo");
_tokenizer ??= Encoding.ForModel("gpt-4o");
//encode string and keep spaces
var encodedValues = new List<int>();
var words = input.Split(' ');
Expand Down Expand Up @@ -45,9 +46,10 @@ public static List<TokenString> EncodeDecodeWithSpaces(string? input)

public static int GetTokens(string text)
{
_tokenizer ??= Encoding.ForModel("gpt-3.5-turbo");
_tokenizer ??= Encoding.ForModel("gpt-4o");
return _tokenizer.CountTokens(text);
}


public static string ExtractBase64FromDataUrl(this string dataUrl)
{
Expand Down

0 comments on commit 636aa5a

Please # to comment.