C#调用大模型DeepSeek API 完整实例,结果逐字动态输出在界面上
zhezhongyun 2025-04-30 21:17 23 浏览
前言
如何运用开发语言 C#对 DeepSeek API 进行调用,使其能够如同 DeepSeek 官方网站那样涵盖分析、推理等流程,最终以类似于动态打字的效果将答案输出至界面。本文章包含了全部需要的运行代码,代码下载后,只需要修改deepseek API key就可以完美运行,效果呈现如下:
deepseek API key
需要前往 DeepSeek 官方网站去申请 API Key,具体操作方式如下所示,该API Key是后续调用 DeepSeek API 进行开发和应用的重要凭证,务必妥善保管和使用。
Windows 窗体设计
首先,创建一个 C# 的 Windows 窗体应用程序。在这个过程中,采用 panel 控件来进行布局,以实现更加合理和美观的界面设计。在界面中,答案部分设置为一个 RichTextBox 控件,用于展示详细和丰富的答案内容。而在其下方的问题部分,同样也设置一个 RichTextBox 控件,方便用户输入和编辑相关的问题。此外,还需创建一个 Button 控件,并且对其 Text 属性进行修改,将其设定为“DeepSeek”。 设计界面如下:
API类函数
对 API 函数予以封装,并将其存于一个类文件之内,同时,APIKey 置于类的 app.config 文件之中,完整代码如下:
using System;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text.Json;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using System.Configuration;
using System.Runtime.InteropServices;
namespace DeepSeekService
{
public class DeepSeepClient
{
public static string ApiKey { get { return ConfigurationManager.AppSettings["DeepseekAPI_KEY"].ToString(); } }
private readonly HttpClient client;
private const string ApiUrl = "https://api.deepseek.com/v1/chat/completions";
private const string ModelName = "deepseek-chat";
public DeepSeepClient() {
client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", #34;Bearer {ApiKey}");
client.DefaultRequestHeaders.Add("Accept", "text/event-stream");
}
enum ProcessingPhase
{
Analyzing,
Researching,
Reasoning,
Finalizing
}
public async Task RunDeepSeek(RichTextBox rt, string prompt)
{
var requestData = new
{
model = ModelName,
messages = new[]
{
new { role = "system", content = "请按以下步骤回答:1.分析问题 2.联网资料 3.推理 4.答案. 提供的参考知识库:\n\\n经典作品常常与我们自己的生活息息相关。在《经典常谈》中,作者通过对比古今文化,指出许多经典所讨论的主题,例如爱情、死亡、自由与责任,依然是人类永恒的心结。这些主题在不同的历史阶段被赋予了全新的意义,使我们在面对生活中的困惑与挑战时,能够从中寻找到启发与指引。阅读经典,让我意识到自己的生活困扰其实早已被前人探讨过,不同的是我们面对这些问题的态度与答案。我们在阅读经典的同时,也在审视自己的价值观和人生观。我开始意识到,经典作品所引发的思考往往比作品本身更为重要。与其一味追求书中所传达的思想,不如在阅读中找到与自己内心的对话,发掘出属于自己的理解与感悟。\\n\\n最后,经典的吸引力在于它们的共鸣。正是这些作品,让我们在个体经验与历史智慧之间架起了一座桥梁。在这个信息碎片化的时代,经典作品无疑为我们的精神世界提供了一种持久的滋养。它们教会我们如何在复杂的社会中保持清醒,自省以及不断追求更高的理想。\\n\\n《经典常谈》带给我的新认识是,经典不仅是文化的承载体,更是人类思考与自我发现的工具。在未来的日子里,我将继续怀揣这份对经典的敬畏与热爱,让其在我的人生旅途中指引前行的方向。\";" },
new { role = "user", content = prompt }
},
stream = true
};
try
{
using (var request = new HttpRequestMessage(HttpMethod.Post, ApiUrl))
{
request.Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json");
using (var response = await client.SendAsync(
request,
HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
var currentPhase = ProcessingPhase.Analyzing;
var phaseBuffer = new StringBuilder();
var fullAnswer = new StringBuilder();
rt.AppendText(" Thinking...");
rt.AppendText(Environment.NewLine);
rt.Refresh();
using (var stream = await response.Content.ReadAsStreamAsync())
using (var reader = new System.IO.StreamReader(stream))
{
while (!reader.EndOfStream)
{
var line = await reader.ReadLineAsync();
if (string.IsNullOrWhiteSpace(line)) continue;
if (line.StartsWith("data: "))
{
var jsonData = line.Substring(6).Trim();
if (jsonData == "[DONE]") break;
using (var jsonDoc = JsonDocument.Parse(jsonData))
{
var choices = jsonDoc.RootElement
.GetProperty("choices");
foreach (var choice in choices.EnumerateArray())
{
var delta = choice.GetProperty("delta");
if (delta.TryGetProperty("content", out var content))
{
var text = content.GetString();
phaseBuffer.Append(text);
fullAnswer.Append(text);
#region "enabled if required" // 检测阶段标记
//var bufferStr = phaseBuffer.ToString();
//if (bufferStr.Contains("【分析】"))
//{
// UpdatePhase(ref currentPhase, ProcessingPhase.Analyzing, "问题分析",rt);
// phaseBuffer.Clear();
//}
//else if (bufferStr.Contains("【资料】"))
//{
// UpdatePhase(ref currentPhase, ProcessingPhase.Researching, "信息检索",rt);
// phaseBuffer.Clear();
//}
//else if (bufferStr.Contains("【推理】"))
//{
// UpdatePhase(ref currentPhase, ProcessingPhase.Reasoning, "逻辑推理",rt);
// phaseBuffer.Clear();
//}
#endregion
// output
AddTextToRichTextBox(rt, text);
}
}
}
}
}
}
Console.ForegroundColor = ConsoleColor.Green;
}
}
}
catch (Exception e)
{
Console.WriteLine(#34;\n exception handling: {e.Message}");
}
}
private static void AddTextToRichTextBox(RichTextBox rt, string text)
{
rt.SuspendLayout();
rt.AppendText(text);
rt.SelectionStart = rt.TextLength;
rt.ScrollToCaret();
rt.ResumeLayout();
}
static void UpdatePhase(ref ProcessingPhase currentPhase, ProcessingPhase newPhase, string phaseName,RichTextBox rt)
{
if (currentPhase == newPhase) return;
currentPhase = newPhase;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(#34;\n\n Current Phase:{phaseName}");
rt.AppendText("Current Phase:{phaseName}");
rt.ScrollToCaret();
Console.ResetColor();
}
}
}
app.config配置
于 app.config 配置文件当中,对 API key 的配置情况如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<appSettings>
<add key="DeepseekAPI_KEY" value=你的deepseek API Key />
</appSettings>
</configuration>
Windows 窗体代码
创建一个 Windows 窗体,借助 Panel 来实施布局,而后创建两个 RichTextBox ,分别用以呈现输入的内容以及答案。创建一个button,命名为btDeepseek
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DeepSeekService;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
}
private async void btDeepseek_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(rtbAnswer.Text.Trim()))
{
rtbAnswer.AppendText(Environment.NewLine);
rtbAnswer.AppendText(Environment.NewLine);
}
DeepSeepClient dsClient = new DeepSeepClient();
await dsClient.RunDeepSeek(rtbAnswer, rtbQuestion.Text);
}
}
}
总结
当运行以上代码之后,便成功地实现了对 deepseek api 的调用。在此过程中,能够根据具体的输入,动态地输出相应的结果内容,欢迎大家提出问题。
相关推荐
- DevExpress使用教程:GridView经验小结
-
下面是笔者自己总结的使用DevExpressGridview的一些经验小结,分享给大家:1、去除GridView头上的"Dragacolumnheaderheretogroup...
- ComponentOne 新版本发布,新增 .NET 6 和 Blazor 平台控件支持
-
ComponentOneEnterprise是葡萄城推出的一款内置300多种开发控件的.NET控件集,可满足WinForm、WPF、Blazor、ASP.NETMVC等平台下的系统开发...
- Wijmo5 Flexgrid基础教程:数据绑定
-
WijmoEnterprise下载>FlexGrid在JavaScript程序中启动添加Wijmo引用;添加wijmo控件的扩展;在JavaScript中初始化wijmo控件;(可选)添加cs...
- Wijmo5 Flexgrid基础教程:InlineEdit
-
WijmoEnterprise下载>对于flexgrid,可以直接在单元格内进行编辑。但另外还有一种编辑方式,即在一行添加按钮,统一的编辑和提交数据。本文主要介绍给flexgrid添加编辑按钮...
- WinForms Data Grid控件升级(winform devexpress控件)
-
告诉大家一个好消息:慧都将于近期隆重推出“DevExpress14.2新版发布会”。心动不如行动,赶快报名吧!我们期待与您相约DevExpress14.2新版发布会。>>新增Wind...
- XAML控件宽度为另一控件的一半、静态属性绑定
-
控件上当某些数据需要根据其他数据的变化而变化很多时候,想让某个控件的宽度或者高度是另一个已有控件的一半,一开始打算使用ObjectDataProvider来实现,因为在控件上当某些数据需要根据其他数据...
- 用 CSS Grid 布局制作一个响应式柱状图
-
最新一段时间比较喜欢玩弄图表,出于好奇,我想找出比较好的用CSS制作图表的方案。开始学习网上开源图表库,它对我学习新的和不熟悉的前端技术很有帮助,比如这个:CSSGrid。今天和大家分享我学到的...
- Grid 移动端双列瀑布流(移动端瀑布流布局)
-
预览图:原理合理使用Grid的属性:display:设置为grid指明当前容器为Grid布局grid-template-columns:定义每一列的列宽(百分比或绝对单位)grid-templa...
- DevExpress导出GridControl控件数据
-
前言:使用C#做桌面应用时,我们会常常使用Winform作为我们的开发界面,但是windows自带的控件由于长时间不更新,已经不能够满足当前开发需要所以使用DevExpress控件作为Winform...
- css grid 布局的那些事儿(css grid布局和flex布局)
-
CSSGrid是一种为Web开发创建网站布局的方式。它已经存在了很多年,随着更多浏览器的支持,它终于变得越来越流行。接下来我们将了解下CSSGrid及其工作原理。了解下它如何使用。CSS...
- Grid.js - 跨框架的前端表格插件(前端table框架)
-
只想简简单单画个表格,但React,Vue,Angular,…,这么多前端框架,各自都有不同的表格渲染库。就没有表格库能“一次画表,到处运行”吗?来看看Grid.js这个跨框架的前端表格插件吧!...
- WPF开发教程01-布局控件(wpf tablecontrol控件)
-
布局控件是用于进行控件布局的容器类控件,其内部控件按照一定规律自动排列,且在父控件改变大小时,会自动适应。常用布局控件如下:1.一维布局控件(StackPanel)其内部控件按照某个维度自动排列,排...
- wxPython - 高级控件之表格Grid(wxpython grid刷新数据)
-
实战wxPython系列-043wx.grid.Grid及其相关类用于显示和编辑表格数据。它们提供了一组丰富的功能,用于显示、编辑和与各种数据源交互。wx.grid.Grid是一个功能强大的但是又稍微...
- 前端 BFC、IFC、GFC 和 FFC,这些你都知道吗?
-
如果觉得我的文章不错,可以关注我,想要看其他的进阶知识可以查看我发布过的文章!编辑搜图请点击输入图片描述BFC(Blockformattingcontexts):块级格式上下文页面上的一个隔离的...
- 20多个好用的 Vue 组件库,请查收
-
在本文中,我们将探讨一些最常见的vuejs组件。你可以收藏一波。VueTables-2地址:https://github.com/matfish2/vue-tables-2VueTables2...
- 一周热门
- 最近发表
-
- DevExpress使用教程:GridView经验小结
- ComponentOne 新版本发布,新增 .NET 6 和 Blazor 平台控件支持
- Wijmo5 Flexgrid基础教程:数据绑定
- Wijmo5 Flexgrid基础教程:InlineEdit
- WinForms Data Grid控件升级(winform devexpress控件)
- XAML控件宽度为另一控件的一半、静态属性绑定
- 用 CSS Grid 布局制作一个响应式柱状图
- Grid 移动端双列瀑布流(移动端瀑布流布局)
- DevExpress导出GridControl控件数据
- css grid 布局的那些事儿(css grid布局和flex布局)
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)