使用C#、OpenAI和Spectre.Console创建控制台ChatGPT客户端
用只有35行代码创建一个简单的ChatGPT客户端
本文将指导您如何使用C#和.NET 8构建基于控制台的ChatGPT客户端。
我们将使用官方的.NET库来调用OpenAI API(https://github.com/openai/openai-dotnet)和Spectre.Console 来构建这个应用程序。Spectre.Console 是一个.NET库,可以帮助我们更轻松地创建漂亮的控制台应用程序。
获取OpenAI API密钥
如果您还没有API密钥,请访问此页面创建新的OpenAI API密钥: https://platform.openai.com/api-keys
创建控制台应用程序项目
打开您的Visual Studio并创建一个新的控制台应用程序项目。
设置项目名称和位置。选择.NET 8作为框架,然后点击【创建】按钮。
安装OpenAI和Spectre.Console包
打开 NuGet 包管理器并安装 OpenAI 库:
接下来,搜索Spectre.Console并安装它:
写代码。
配置
打开Program.cs文件。需要两个using语句:
using OpenAI.Chat;
using Spectre.Console;
我们需要定义模型和API密钥:
const string model = "gpt-4o";
const string apiKey = "YOUR OPEN AI API KEY";
创建聊天客户端
var client = new ChatClient(model, apiKey);
var messages = new List<ChatMessage>();
ChatClient 是一个实例,使用模型和 API 密钥与 OpenAI 的 API 进行通信。 消息列表跟踪用户与 GPT 之间的对话历史,以保持上下文。
用户界面设置
AnsiConsole.Write(new FigletText("ConsoleGPT").Centered().Color(Color.Yellow));
AnsiConsole.Write(new Text("Type '/q' to quit the program.\n", new Style(Color.Grey)).Centered());
FigletText 在控制台顶部用大号的黄色字体显示“ConsoleGPT”。下面的文本以灰色显示简单的指示,告诉用户如何退出应用程序。
主要聊天循环
循环将继续,直到用户决定退出:
while (true)
{
AnsiConsole.Write(new Rule { Style = "grey" });
var input = AnsiConsole.Ask<string>("[blue]You:[/]");
AnsiConsole.Write(new Rule { Style = "grey dim" });
if (input?.ToLower() == "/q") break;
messages.Add(new UserChatMessage(input));
这段代码管理控制台中用户的输入。它首先画一条灰线,然后以蓝色提示用户输入他们的消息“你:”。
在捕捉输入后,为了清晰起见,会再画一条深灰线。如果输入是“/q”,则循环退出并结束聊天。否则,用户的消息会被添加到消息列表中,作为UserChatMessage来跟踪对话历史,以便ChatGPT进行处理。
处理用户输入
var completion = await AnsiConsole.Status()
.StartAsync("ChatGPT is thinking...", async ctx =>
await client.CompleteChatAsync(messages.TakeLast(10)));
该代码使用 AnsiConsole.Status 来显示“ChatGPT正在思考...”,并等待API响应。然后调用 CompleteChatAsync 来发送最后10条消息到OpenAI API,以保持对话上下文。
显示响应
var responseText = completion.Value.Content[0].Text;
AnsiConsole.Markup("[green]ChatGPT:[/]\n");
Console.WriteLine(responseText.Trim());
messages.Add(new AssistantChatMessage(responseText));
这段代码通过访问内容的第一个元素提取完成对象的响应文本,并将其赋值给responseText。
然后使用 AnsiConsole.Markup 在控制台上以绿色显示“ChatGPT:”。实际的响应文本通过 Console.WriteLine 方法打印到控制台上。
最后,响应文本被添加到消息列表中作为一个AssistantChatMessage,以确保在发送下一个聊天时保持对话的上下文。
完整的代码
以下是整个代码,仅仅包含35行代码:
using OpenAI.Chat;
using Spectre.Console;
const string model = "gpt-4o";
const string apiKey = "sk-proj-udHkcJPpwywDVtBZFKbxT3BlbkFJpUqLQ6kP6dVtOaNhF7gu";
var client = new ChatClient(model, apiKey);
var messages = new List<ChatMessage>();
AnsiConsole.Write(new FigletText("ConsoleGPT").Centered().Color(Color.Yellow));
AnsiConsole.Write(new Text("Type '/q' to quit the program.\n", new Style(Color.Grey)).Centered());
while (true)
{
AnsiConsole.Write(new Rule { Style = "grey" });
var input = AnsiConsole.Ask<string>("[blue]You:[/]");
AnsiConsole.Write(new Rule { Style = "grey dim" });
if (input?.ToLower() == "/q") break;
messages.Add(new UserChatMessage(input));
var completion = await AnsiConsole.Status()
.StartAsync("ChatGPT is thinking...", async ctx =>
await client.CompleteChatAsync(messages.TakeLast(10)));
var responseText = completion.Value.Content[0].Text;
AnsiConsole.Markup("[green]ChatGPT:[/]\n");
Console.WriteLine(responseText.Trim());
messages.Add(new AssistantChatMessage(responseText));
}
运行应用程序
按F5键开始向ChatGPT提问:
这个项目展示了通过简单的代码向应用程序添加人工智能有多容易。它为那些对在.NET环境中探索生成式人工智能感兴趣的人提供了一个很好的起点。