.Net 7 (Betalgo.OpenAI) 对接 OpenAI 实现流式响应,提高用户体验 ~

前言

本文主要记录我自身使用 C# 对接 OpenAI 对接接口的一些简要步骤,希望对大家有所帮助。

Betalgo.OpenAI

gitHub Betalgo.Open 开源地址

betalgo/openai: OpenAI .NET sdk - ChatGPT (github.com)

详细步骤

1、配置你的 OpenAI key 由官网提供

OpenAI API 官网地址

API keys - OpenAI API

可能需要你充一点 Money

这里就是你的每日费用统计。

2、OpenAI API 介绍

你完全可以选择 Http 调用,OpenAI 给了你传统Restful接口的调用方法。

arduino 复制代码
curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-3.5-turbo",
     "messages": [{"role": "user", "content": "Say this is a test!"}],
     "temperature": 0.7
   }'

OpenAI的记住对话功能:

  • 其实就是用 role 和 content 来实现的: role 指定角色

这是一个使用curl命令向OpenAI API发送请求的示例。该请求使用POST方法发送JSON数据到api.openai.com/v1/chat/com...

在请求中,使用了两个自定义的HTTP标头:

  1. "Content-Type: application/json"指定了请求的内容类型为JSON。
  2. "Authorization: Bearer $OPENAI_API_KEY"包含了一个Bearer令牌,用于身份验证和授权。$OPENAI_API_KEY 为你第一步注册的 key。

请求的主体是一个JSON对象,包含了以下字段:

  1. "model"指定了要使用的模型的名称,这里是"gpt-3.5-turbo"。
  2. "messages"是一个包含了用户消息的数组,每条消息都包含了"role"和"content"字段,指定了消息的角色和内容。
  3. "temperature"指定了用于生成回复的多样性参数,值为0.7。

这种方式非常简单,但是弊端就是响应速度非常非常的慢,特别是你的回答的内容字数非常多时候,响应速度令人发指。这种方式肯定有能用到的地方,但是基于目前的需求,我们还是选择另一种请求方式-流式响应。

3、OpenAI 流式响应

只需要在消息体json中加入stream=True。

流式响应协议 SSE 具体请看我的另一篇文章:

聊天无障碍:OpenAI SSE 协议的流式响应 & Chatgpt带给我的反思 - 掘金 (juejin.cn)

虽然官方给出了流式响应的示例,但是只有 python 和 js 的。C#官方没有给出,请看下文。

4、加入 Betalgo.OpenAI 依赖

xml 复制代码
<ItemGroup>
  <PackageReference Include="Betalgo.OpenAI" Version="7.4.1" />
</ItemGroup>

或者直接 NuGet 搜索 Betalgo.OpenAI 搜索下载。

5、将 OpenAIService 接口注入IOC

ini 复制代码
builder.Services.AddOpenAIService(settings =>
    {
        settings.ApiKey = options.ApiKey;
        settings.BaseDomain = options.BaseDomain;
    });

6、接口实例

一个整套的C#流式响应的过程,仅供参考~

Controller 层

c# 复制代码
[HttpPost("text", Name = "ChatText")]
public async Task<IActionResult> ChatText([FromBody] List<ChatMessage> messages)
{
    try
    {
        HttpContext.Response.ContentType = "text/event-stream";
        HttpContext.Response.Headers.Add("Cache-Control", "no-cache");
        HttpContext.Response.Headers.Add("Connection", "keep-alive");
        
        await foreach (var s in _chatOpenAIService.ChatOpenAI(messages))
        {
            await HttpContext.Response.WriteAsync(s);
            await HttpContext.Response.Body.FlushAsync();
        }
    }
    catch (Exception e)
    {
        Log.Error(e,"");
    }
    
    return new EmptyResult();
}

IService 层

c# 复制代码
public interface IChatOpenAIService
{
    public IAsyncEnumerable<string> ChatOpenAI(List<ChatMessage> messages);
    
    public Task<AIName> getAIName(long id);
}

Service 层

c# 复制代码
public async IAsyncEnumerable<string> ChatOpenAI(List<ChatMessage> messages)
{
    var completionResult = _openAiService.ChatCompletion.CreateCompletionAsStream(new ChatCompletionCreateRequest
    {
        Messages = messages,
        Model = Models.ChatGpt3_5Turbo,
        MaxTokens = 1000
    });
    
    await foreach (var completion in completionResult)
    {
        if (completion.Successful)
        {
            Console.Write(completion.Choices.First().Message.Content);
            yield return completion.Choices.First().Message.Content;
        }
        else
        {
            if (completion.Error == null)
            {
                throw new Exception("Unknown Error");
            }

            Console.WriteLine($"{completion.Error.Code}: {completion.Error.Message}");
        }
    }
}

总结

一定要多思考,如果人永远待在舒适圈的话,人永远不会成长。共勉

觉得作者写的不错的,值得你们借鉴的话,就请点一个免费的赞吧!这个对我来说真的很重要。૮(˶ᵔ ᵕ ᵔ˶)ა

相关推荐
dozenyaoyida9 小时前
AI与大模型新闻日报 | 2026-10-17
人工智能·ai·chatgpt·新闻
XLYcmy12 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包
Summer-Bright15 小时前
浏览器成了AI应用的新入口:智能体接管标签页之后,三本账谁买单
人工智能·chatgpt·agent·浏览器·智能体
用户7884773163415 小时前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#
9i编程16 小时前
4. 带 AI 从零搭低代码平台·踩坑实录:回头补 change-2,欠的账一条条还
人工智能·openai·ai编程
csdn_aspnet17 小时前
C# .NetCore Swagger ISchemaFilter 处理枚举、特殊类型
c#·.netcore·swagger
滴滴答答哒17 小时前
C# 技巧:优雅实现对象的“局部更新”与“字段合并”
开发语言·c#
云卷云舒___________19 小时前
GLM-5.5传1T+参数炸场!OpenAI泄露Astra私版,Astra Pro升级,Gemini 4 一键PDF转交互网页 | 10月17日 AI日报
openai·智能体·ai日报·gpt6·gemini4·glm55·astrapro
code_long1 天前
.net core 连接打印机 使用zpl指令打印机,并且位图本地渲染zpl指令
c#·.netcore·位图·打印机·模板编辑·模板预览
csdn_aspnet1 天前
C# .NetCore Swagger ISchemaFilter Long 转 String 防精度丢失
c#·.netcore·swagger