.net Core 和 .net freamwork 调用 deepseek api 使用流输出文本(对话补全)

news2025/4/13 7:29:27

.net Core 调用 deepseek api 使用流输出文本

    • 下面直接上代码(.net core):
    • 最后再贴一个 .net Freamwork 4 可以用的代码
    • TLS 的代码至关重要的:(下面这个)

在官网里面有许多的案例:我们通过查看下面地址和截图可以发现,有 Csharp(C# 的案例,但是没有具体介绍流的部分)

并在 .net freamwork 环境下,出现报错:网络错误: 请求被中止: 未能创建 SSL/TLS 安全通道。我们在文章最后也贴了解决方案。

https://api-docs.deepseek.com/zh-cn/api/create-chat-completion 

在这里插入图片描述

下面直接上代码(.net core):

using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    // 主函数,程序入口
    static async Task Main()
    {
        // 定义API的URL
        string url = "https://api.deepseek.com/chat/completions";

        // 使用HttpClient发送HTTP请求
        using (HttpClient client = new HttpClient())
        {
            // 创建一个POST请求
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            // 设置请求头,接受JSON格式的响应
            request.Headers.Add("Accept", "application/json");
            // 设置请求头,添加授权信息
            request.Headers.Add("Authorization", "Bearer <TOKEN>");

            // 定义请求数据
            var data = new
            {
                // 定义消息数组,包含系统和用户的消息
                messages = new[]
                {
                    new { role = "system", content = "你是一个助手" },
                    new { role = "user", content = "帮我用js写一段冒泡算法" }
                },
                // 指定使用的模型
                model = "deepseek-chat",
                // 启用流模式
                stream = true,
                // 设置最大令牌数
                max_tokens = 2048,
                // 设置温度参数
                temperature = 1
            };

            // 将请求数据序列化为JSON格式
            var json = JsonSerializer.Serialize(data);
            // 设置请求内容为JSON格式
            request.Content = new StringContent(json, Encoding.UTF8, "application/json");

            // 发送请求并获取响应
            using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
            {
                // 如果响应状态码表示成功
                if (response.IsSuccessStatusCode)
                {
                    // 读取响应内容作为流
                    using (var stream = await response.Content.ReadAsStreamAsync())
                    using (var reader = new StreamReader(stream))
                    {
                        string line;
                        // 逐行读取流中的数据
                        while ((line = await reader.ReadLineAsync()) != null)
                        {
                            // 如果行以"data:"开头
                            if (line.StartsWith("data:"))
                            {
                                // 去除"data:"前缀并去除空格
                                var dataStr = line.Substring(5).Trim();
                                // 如果数据不是"[DONE]"
                                if (dataStr != "[DONE]")
                                {
                                    try
                                    {
                                        // 反序列化JSON数据
                                        var chunkData = JsonSerializer.Deserialize<JsonElement>(dataStr);
                                        // 获取生成的文本内容
                                        var content = chunkData.GetProperty("choices")[0].GetProperty("delta").GetProperty("content").GetString();
                                        // 如果内容不为空
                                        if (!string.IsNullOrEmpty(content))
                                        {
                                            // 输出内容到控制台
                                            Console.Write(content);
                                        }
                                    }
                                    catch (JsonException)
                                    {
                                        // 忽略JSON解析错误
                                    }
                                }
                            }
                        }
                    }
                    // 最后换行
                    Console.WriteLine();
                }
                else
                {
                    // 输出请求失败的状态码和内容
                    Console.WriteLine($"请求失败,状态码: {response.StatusCode}");
                    Console.WriteLine(await response.Content.ReadAsStringAsync());
                }
            }
        }
    }
}


是需要去官网申请的:

访问下面地址:

https://platform.deepseek.com/api_keys

在这里插入图片描述

最后再贴一个 .net Freamwork 4 可以用的代码

using System;
using System.IO;
using System.Net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

class Program
{
    // 主函数,程序入口
    static void Main(string[] args)
    {
        // 设置安全协议,允许TLS 1.2和TLS 1.1
        ServicePointManager.SecurityProtocol = ((SecurityProtocolType)3072 | (SecurityProtocolType)768 | (SecurityProtocolType)192);
        // API的URL
        var url = "https://api.deepseek.com/chat/completions";
        // API密钥,需要替换为实际的密钥
        var apiKey = "<TOKEN>"; // 替换为你的 API Key

        try
        {
            // 1. 创建请求
            var request = (HttpWebRequest)WebRequest.Create(url);
            // 设置请求方法为POST
            request.Method = "POST";
            // 设置请求头中的Authorization字段,包含API密钥
            request.Headers["Authorization"] = $"Bearer {apiKey}";
            // 设置请求的内容类型为JSON
            request.ContentType = "application/json";
            // 设置接受的响应类型为JSON
            request.Accept = "application/json";

            // 2. 准备请求数据
            var requestData = new
            {
                // 消息数组,包含系统消息和用户消息
                messages = new[]
                {
                    new { role = "system", content = "你是一个助手" },
                    new { role = "user", content = "你好" }
                },
                // 使用的模型
                model = "deepseek-chat",
                // 是否流式响应
                stream = true,
                // 最大令牌数
                max_tokens = 2048,
                // 温度参数
                temperature = 1
            };

            // 将请求数据序列化为JSON字符串
            var json = JsonConvert.SerializeObject(requestData);

            // 3. 写入请求体
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                // 将JSON字符串写入请求体
                streamWriter.Write(json);
                // 刷新缓冲区
                streamWriter.Flush();
            }

            // 4. 获取响应(流式)
            using (var response = (HttpWebResponse)request.GetResponse())
            using (var stream = response.GetResponseStream())
            using (var reader = new StreamReader(stream))
            {
                // 逐行读取响应内容
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if (!string.IsNullOrEmpty(line))
                    {
                        // 如果行以"data:"开头
                        if (line.StartsWith("data:"))
                        {
                            // 去除"data:"前缀并去除前后空格
                            var dataStr = line.Substring(5).Trim();
                            // 如果数据不是"[DONE]"
                            if (dataStr != "[DONE]")
                            {
                                try
                                {
                                    // 解析JSON并提取content
                                    var chunkData = JObject.Parse(dataStr);
                                    var choices = chunkData["choices"];
                                    if (choices != null && choices.HasValues)
                                    {
                                        var delta = choices[0]["delta"];
                                        if (delta != null)
                                        {
                                            var contentValue = delta["content"]?.ToString();
                                            if (!string.IsNullOrEmpty(contentValue))
                                            {
                                                // 输出content内容
                                                Console.Write(contentValue);
                                            }
                                        }
                                    }
                                }
                                catch (JsonException)
                                {
                                    // 忽略JSON解析错误
                                }
                            }
                        }
                    }
                }
                // 最后换行
                Console.WriteLine();
            }
        }
        catch (WebException ex)
        {
            // 处理HTTP错误
            if (ex.Response != null)
            {
                using (var errorResponse = (HttpWebResponse)ex.Response)
                using (var errorStream = errorResponse.GetResponseStream())
                using (var errorReader = new StreamReader(errorStream))
                {
                    // 输出错误信息
                    Console.WriteLine($"请求失败,状态码: {errorResponse.StatusCode}");
                    Console.WriteLine(errorReader.ReadToEnd());
                }
            }
            else
            {
                // 输出网络错误信息
                Console.WriteLine($"网络错误: {ex.Message}");
            }
        }
    }
}

TLS 的代码至关重要的:(下面这个)


        // 设置安全协议,允许TLS 1.2和TLS 1.1
        ServicePointManager.SecurityProtocol = ((SecurityProtocolType)3072 | (SecurityProtocolType)768 | (SecurityProtocolType)192);

网络错误: 请求被中止: 未能创建 SSL/TLS 安全通道。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springcloud整理

问题1.服务拆分后如何进行服务之间的调用 我们该如何跨服务调用&#xff0c;准确的说&#xff0c;如何在cart-service中获取item-service服务中的提供的商品数据呢&#xff1f; 解决办法&#xff1a;Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请…

04-算法打卡-数组-二分查找-leetcode(69)-第四天

1 题目地址 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09;69. x 的平方根 - 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。注意&#xff1a;不允许使用任何内…

[Windows] 字体渲染 mactype v2025.4.11

[Windows] 字体渲染 mactype 链接&#xff1a;https://pan.xunlei.com/s/VONeCUP2hEgO5WIQImgtGUmrA1?pwdyruf# 025.4.11 Variable font support 可变字体支持已到来。 本版本将可变字体支持扩展到所有 GDI 应用程序。 所有 win32 程序中的字体&#xff0c;如 Noto Sans、Se…

VSCode CMake调试CPP程序

文章目录 1 安装C与CMake插件2 配置CMakeLists.txt3 使用CMake编译调试3.1 编译3.2 调试 4 自定义构建调试参考 1 安装C与CMake插件 C插件 CMake插件 2 配置CMakeLists.txt 编写测试程序 #include<iostream>int main(int argc, char const *argv[]) {int a 1, b 2;i…

Halo 设置 GitHub - OAuth2 认证指南

在当今数字化时代&#xff0c;用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言&#xff0c;引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天&#xff0c;我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…

【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——Animator动画】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、状态机复用是什么&#xff1f;二、实战专栏推荐完结 一、状态机复…

C语言--汉诺塔问题

汉诺塔问题是一个典型的递归问题。 递归问题的基本思想&#xff1a;将问题逐步化简为相同思路但是规模更小的问题&#xff0c;直到问题可以直接解决 递归的关键在于基准情形和递归步骤&#xff0c;基准情形也就是退出条件&#xff0c;递归步骤也就是把问题简化为子问题的过程。…

301.找出3位偶数

2094. 找出 3 位偶数 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> resnew ArrayList<>();List<Integer> linew ArrayList<>();public int[] findEvenNumbers(int[] digits) {Arrays.sort(digits);boolean[] numsnew boolea…

使用Python从零开始构建端到端文本到图像 Transformer大模型

简介&#xff1a;通过特征向量从文本生成图像 回顾&#xff1a;多模态 Transformer 在使用Python从零实现一个端到端多模态 Transformer大模型中&#xff0c;我们调整了字符级 Transformer 以处理图像&#xff08;通过 ResNet 特征&#xff09;和文本提示&#xff0c;用于视觉…

comfyui点击执行没反应一例

以前只遇到过执行工作流时出错的情况&#xff0c;从没试过说点了执行后一点反应都没有的情况。 今天下载 蓝色多脑盒《一键同时换头、换脸、发型、发色之双pulid技巧》分享的工作&#xff0c;第一次发现点击执行没反应。 发现左下角的地方连接错乱了。 更正连接后工作流能正常…

01-libVLC的视频播放器:环境搭建以及介绍

项目展示项目播放器 VLC简介VLC媒体播放器(VideoLAN Client)是一款开源、跨平台的自由多媒体播放器,由VideoLAN项目开发。它支持众多音频与视频格式(如MPEG-2、MPEG-4、H.264、MKV、WebM、WMV、MP3等),以及DVD、VCD和各种流媒体协议。 VLC的特点跨平台支持:Windows、mac…

用css画一条弧线

ui里有一条弧线&#xff0c;现在用css实现 关键代码 border-bottom-left-radius: 100% 7px 两个参数分别代表横向和纵向的深度border-bottom-right-radius: 100% 7px

FPGA上实现SD卡连续多块读的命令

在FPGA上实现SD卡连续多块读的命令 CMD17命令一次只能读取1个块 CMD18命令一次可以连续读取多个块&#xff0c;直到停止命令CMD12 CMD18命令读的块数程序可任意设置 目录 前言 一、SD卡多块读命令CMD18 二、停止读命令CMD12 三、SD卡初始化SD卡连续块读操作的verilog代码 …

从原理图到成品:PCBA设计的常见陷阱与规避方法

在电子设计领域&#xff0c;从原理图到PCBA&#xff08;Printed Circuit Board Assembly&#xff09;的转换过程中&#xff0c;布局布线是决定电路性能的关键环节。然而&#xff0c;许多工程师在实际操作中容易陷入一些常见误区&#xff0c;导致信号完整性、EMI&#xff08;电磁…

.py文件和.ipynb文件的区别:完整教程

一、概述 Python开发者常用的两种文件格式.py和.ipynb各有特点&#xff0c;本教程将通过对比分析、代码示例和场景说明&#xff0c;帮助开发者全面理解二者的区别与联系。 二、核心区别对比 1. 文件格式本质 特性.ipynb文件.py文件文件类型JSON结构化文档纯文本文件存储内容…

【项目管理】第11章 项目成本管理-- 知识点整理

相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 ​ ​ (二)知识笔记​ 第11章 项目成本管理 ​ 1.管理基础…

初学STM32之编码器测速以及测频法的实现

资料来着江协科技 这篇是编码器测速&#xff0c;江科大的源码在测速的时候&#xff0c;定时器TIM2是一直在跑的&#xff0c;不受其它控的&#xff0c;它就一直隔1S读一次CNT的值。它也不管是否有输入信号。源码程序修改一下是可以实现对PWM信号以测频法的方式读取。 笔者稍微改…

Linux 内核知识体系[1]

1 Linux内核知识体系 2.Linux内核学习路线 2.1基础知识准备 操作系统基础&#xff1a;了解操作系统的概念和基本原理&#xff0c;包括进程管理、内存管理、文件系统、输入输出等。 书籍&#xff1a;《操作系统&#xff1a;设计与实现》&#xff08;Andrew S. Tanenbaum&…

Mac 下载 PicGo 的踩坑指南

Mac 下载 PicGo 的踩坑指南 一、安装问题 下载地址&#xff1a;https://github.com/Molunerfinn/PicGo/releases 下载之后直接安装即可&#xff0c;此时打开会报错&#xff1a;Picgo.app 文件已损坏&#xff0c;您应该将它移到废纸篓。 这是因为 macOS 为了保护用户不受恶意…

消失的它:揭开 CoreData 托管对象神秘的消失之谜(上)

概述 使用 CoreData 作为 App 持久存储“定海神针”的小伙伴们想必都知道&#xff0c;我们需要将耗时的数据库查询操作乖巧的放到后台线程中&#xff0c;以便让主线程负责的 UI 获得风驰电掣般地享受。 不过&#xff0c;如何将后台线程中查询获得的托管对象稳妥的传送至主线程…