Skip to content

Commit

Permalink
feat(cli): /tone option (#25)
Browse files Browse the repository at this point in the history
- add the ability to specify tone for conversation
- fix rendering when line theme is selected
- make theme option parsing case-insensitive because bubble|line does not match Line|Bubble
  • Loading branch information
neon-sunset authored Jun 8, 2023
1 parent dd8d295 commit 88bc2d9
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/dotnet-bingchat/Commands/AskCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
{
try
{
var client = Utils.GetClient();
var client = Utils.GetClient(BingChatTone.Balanced);
var message = string.Join(' ', settings.Message);
var answer = string.Empty;

Expand Down
34 changes: 27 additions & 7 deletions src/dotnet-bingchat/Commands/ConversationCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
AnsiConsole.MarkupLine("[green bold]Welcome to Bing Chat![/]");
AnsiConsole.MarkupLine("Enter message to chat with Bing, or enter [yellow]/help[/] to get command help.");

var client = Utils.GetClient();
IBingChattable? conversation = null;
var tone = BingChatTone.Balanced;
var client = (BingChatClient?)null;
var conversation = (BingChatConversation?)null;

try
{
Expand All @@ -26,7 +27,6 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
var text = AnsiConsole.Ask<string>("[blue bold]>[/]");
if (string.IsNullOrWhiteSpace(text)) continue;


if (text.StartsWith('/'))
{
var cmd = text.TrimStart('/').Split(' ')[0];
Expand All @@ -37,6 +37,8 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
break;

case "reset":
tone = BingChatTone.Balanced;
client = null;
conversation = null;
break;

Expand All @@ -48,7 +50,7 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
break;
}

if (!Enum.TryParse<ChatTheme>(args[1], out var theme))
if (!Enum.TryParse<ChatTheme>(args[1], ignoreCase: true, out var theme))
{
AnsiConsole.MarkupLine(
$"[red]Unknown theme {Markup.Escape(args[1])}. Valid values are bubble or line.[/]");
Expand All @@ -58,6 +60,23 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
settings.Theme = theme;
break;

case "tone":
var toneArgs = text.TrimStart('/').Split(' ', StringSplitOptions.RemoveEmptyEntries);
if (toneArgs.Length < 2)
{
AnsiConsole.MarkupLine("[red]Please specify the tone name. (balanced|creative|precise)[/]");
break;
}

if (!Enum.TryParse(text.TrimStart('/').Split(' ')[1], ignoreCase: true, out tone))
{
AnsiConsole.MarkupLine(
$"[red]Unknown tone {Markup.Escape(toneArgs[1])}. Valid values are balanced, creative or precise.[/]");
break;
}

break;

case "exit":
return 0;

Expand All @@ -69,20 +88,20 @@ public override async Task<int> ExecuteAsync(CommandContext context, Settings se
}
else
{
IAsyncEnumerable<string> stream;

var pos = Console.GetCursorPosition();
Console.SetCursorPosition(0, pos.Top - 1); // back to the last line
Utils.WriteMessage(text, settings);

if (conversation is null)
{
client ??= Utils.GetClient(tone);

AnsiConsole.MarkupLine("[green]Creating new conversation...[/]");
conversation = await client.CreateConversation();
}

AnsiConsole.MarkupLine("[yellow]Bing is thinking...[/]");
stream = conversation.StreamAsync(text);
var stream = conversation.StreamAsync(text);

// AnsiConsole.Status()
// .Spinner(Spinner.Known.BouncingBar)
Expand Down Expand Up @@ -123,6 +142,7 @@ private static void PrintHelp()
table.AddRow("[yellow]/help[/]", "Print command help");
table.AddRow("[yellow]/reset[/]", "Reset current conversation");
table.AddRow("[yellow]/theme <bubble|line>[/]", "Change current theme");
table.AddRow("[yellow]/tone <balanced|creative|precise>[/]", "Change current tone");
table.AddRow("[yellow]/exit[/]", "Exit chat");

AnsiConsole.Write(table);
Expand Down
19 changes: 8 additions & 11 deletions src/dotnet-bingchat/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ namespace BingChat.Cli;

internal static class Utils
{
public static BingChatClient GetClient()
public static BingChatClient GetClient(BingChatTone tone)
{
var cookie = Environment.GetEnvironmentVariable("BING_COOKIE");
return new BingChatClient(new BingChatClientOptions
{
CookieU = string.IsNullOrWhiteSpace(cookie) ? null : cookie,
Tone = BingChatTone.Balanced,
Tone = tone,
});
}

Expand Down Expand Up @@ -103,17 +103,14 @@ await AnsiConsole.Live(initialPanel).StartAsync(async ctx =>
break;

case ChatTheme.Line:
var ruleWrote = false;
var writeRule = () => AnsiConsole
.Write(new Rule("Bing").LeftJustified());

await foreach (var segment in answer)
{
if (!ruleWrote)
{
var rule = new Rule("Bing")
.LeftJustified();
AnsiConsole.Write(rule);
}

AnsiConsole.Write(Markup.Escape(segment));
writeRule?.Invoke();
writeRule = null;
AnsiConsole.Write(Markup.Escape(segment.Replace("\n", "\n\n")));
}

AnsiConsole.WriteLine();
Expand Down

0 comments on commit 88bc2d9

Please # to comment.