当前位置: 首页 > news >正文

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码:https://github.com/lishuangquan1987/XFYun.SparkChat
工具效果截图:
在这里插入图片描述
支持流式输出:
在这里插入图片描述

其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请,免费的。
申请地址:https://xinghuo.xfyun.cn/
在这里插入图片描述
注册之后,在如下的服务管理里面即可看到自己的ApiKey/ApiSecret/AppId
在这里插入图片描述
在这里插入图片描述

拿到了那三个东西之后填入就可以进行聊天啦。
核心代码C#如下:

namespace XFYun.SparkChat.SDK
{public class SparkWebSDK{private string _appId;private string _apiSecret;private string _apiKey;private SparkVersions _version;private ClientWebSocket _webSocketClient;public SparkWebSDK(){}public void Setup(string appId, string apiSecret, string apiKey, SparkVersions version = SparkVersions.V3_0){this._apiKey = apiKey;this._apiSecret = apiSecret;this._appId = appId;this._version = version;}private string GetAuthUrl(string baseUrl, string apiSecret, string apiKey){string date = DateTime.UtcNow.ToString("r");Uri uri = new Uri(baseUrl);var str = $"host: {uri.Host}\ndate: {date}\nGET {uri.LocalPath} HTTP/1.1";//使用apisecret,HMACSHA256算法加密strvar sha256Bytes = new HMACSHA256(Encoding.UTF8.GetBytes(apiSecret)).ComputeHash(Encoding.UTF8.GetBytes(str));var sha256Str = Convert.ToBase64String(sha256Bytes);var authorization = $"api_key=\"{apiKey}\",algorithm=\"hmac-sha256\",headers=\"host date request-line\",signature=\"{sha256Str}\"";//date要做url处理date = Uri.EscapeDataString(date);string newUrl = $"ws://{uri.Host}{uri.LocalPath}?authorization={Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))}&date={date}&host={uri.Host}";return newUrl;}/// <summary>/// 询问问题,流式调用response/// 返回结果表示调用成功还是失败,如果调用失败,则返回失败原因/// </summary>/// <param name="question"></param>/// <param name="response"></param>/// <returns></returns>public async Task<(bool, string)> Ask(List<string> questions, CancellationToken token, Action<List<string>> responseHandler){try{string url = "";string domain = "";switch (this._version){case SparkVersions.V1_5:url = "ws://spark-api.xf-yun.com/v1.1/chat";domain = "general";break;case SparkVersions.V2_0:url = "ws://spark-api.xf-yun.com/v2.1/chat";domain = "generalv2";break;case SparkVersions.V3_0:url = "ws://spark-api.xf-yun.com/v3.1/chat";domain = "generalv3";break;}var newUrl = GetAuthUrl(url, this._apiSecret, this._apiKey);this._webSocketClient = new ClientWebSocket();await this._webSocketClient.ConnectAsync(new Uri(newUrl), token);var request = new JsonRequest(){Header = new RequestHeader(){AppId = this._appId,Uid = "123"},Parameter = new RequestParameter(){Chat = new RequestChat(){Domain = domain,Temperature = 0.5,MaxTokens = 1024,}},Payload = new RequestPayload(){Message = new RequestMessage(){Text = questions.Select(x => new ReuqestContent(){Role = "user",Content = x}).ToList()}}};var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(request);await this._webSocketClient.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes(jsonStr)), WebSocketMessageType.Text, true, token);var recvBuffer = new byte[1024];while (true){WebSocketReceiveResult result = await this._webSocketClient.ReceiveAsync(new ArraySegment<byte>(recvBuffer), token);if (result.CloseStatus.HasValue) return (true, "");if (result.MessageType == WebSocketMessageType.Text){string recvMsg = Encoding.UTF8.GetString(recvBuffer, 0, result.Count);var response = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonResponse>(recvMsg);if (response.Header.Code != 0){return (false, response.Header.Message);}if (response.Payload.Choices.Status == 2)//最后一个消息{responseHandler?.Invoke(response.Payload.Choices.Text.Select(x => x.Content).ToList());return (true, "调用成功!");}responseHandler?.Invoke(response.Payload.Choices.Text.Select(x => x.Content).ToList());}else if (result.MessageType == WebSocketMessageType.Close){return (false, result.CloseStatusDescription);}}}catch (Exception e){return (false, e.Message);}finally{await this._webSocketClient?.CloseAsync( WebSocketCloseStatus.NormalClosure,"client raise close request",token);}}public async void Close(){if (_webSocketClient != null){await _webSocketClient.CloseAsync(WebSocketCloseStatus.NormalClosure, "正常关闭", new CancellationToken());}}}public enum SparkVersions{V1_5,V2_0,V3_0}}

相关文章:

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码&#xff1a;https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图&#xff1a; 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请&#xff0c;免费的。 申请地址&#xff1a;https://xinghuo.xfyun.cn/ 注册之…...

科普测量开关电源输出波形的三种方法及电源波形自动化测试步骤

开关电源波形测试就是对开关电源的输出波形进行检测和分析&#xff0c;观察开关电源参数变化&#xff0c;以此来判断开关电源的性能是否符合要求。好的开关电源对于设备以及整个电路的正常运行是非常重要的&#xff0c;因此开关电源输出波形测试是开关电源测试的重要环节&#…...

【优化版】DOSBox及常用汇编工具的详细安装教程

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、图解数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. dosbox的介绍、下载和安装1.1 dosbos简介1.2 dosbox的下载1.2.1 方式一&a…...

【Devchat 插件】创建一个GUI应用程序,使用Python进行加密和解密

VSCode 插件 DevChat——国内开源的 AI 编程&#xff01; 写在最前面DevChat是什么&#xff1f;什么是以提示为中心的软件开发 &#xff08;PCSD&#xff09;&#xff1f;为什么选择DevChat&#xff1f;功能概述情境构建添加到上下文生成提交消息提示扩展 KOL粉丝专属福利介绍D…...

运行pytest时,给出警告 PytestConfigWarning: Unknown config option: result_log

问题&#xff1a;在ini中配置了一些选项后运行pytest&#xff0c;会出现下面的警告信息 解决&#xff1a;在ini中增加配置&#xff1a;addopts -p no:warnings...

初始MySQL(五)(自我复制数据,合并查询,外连接,MySQL约束:主键,not null,unique,foreign key)

目录 表复制 自我复制数据(蠕虫复制) 合并查询 union all(不会去重) union(会自动去重) MySQL表的外连接 左连接 右连接 MySQL的约束 主键 not null unique(唯一) foreign key(外键) 表复制 自我复制数据(蠕虫复制) #为了对某个sql语句进行效率测试,我们需要海量…...

ssh秘钥登录

1.设置 SSH 通过密钥登录 密钥形式登录的原理是&#xff1a;利用密钥生成器制作一对密钥——一只公钥和一只私钥。 将公钥添加到服务器的某个账户上&#xff0c;然后在客户端利用私钥即可完成认证并登录。这样一来&#xff0c;没有私钥&#xff0c;任何人都无法通过 SSH 暴力…...

Vue3+NodeJS 接入文心一言, 发布一个 VSCode 大模型问答插件

目录 一&#xff1a;首先明确插件开发方式 二&#xff1a;新建一个Vscode 插件项目 1. 官网教程地址 2. 一步一步来创建 3. 分析目录结构以及运行插件 三&#xff1a;新建一个Vue3 项目&#xff0c;在侧边栏中展示&#xff0c;实现vscode插件 <> vue项目 双向消息传…...

VUE element组件生成的全选框如何获取值

//先声明 const Selection ref([]);//获取 const handleSelectCodeForTicket (val) > {console.log(val);// values.value val;Selection.value [];val.forEach((v) > {Selection.value.push(v);});console.log(Selection.value); }; <el-table selection-change…...

第三章:代码块

系列文章目录 文章目录 系列文章目录前言一、代码块总结 前言 代码块是只有方法体的类成员。 一、代码块 代码块又成为初始化块&#xff0c;属于类中的成员&#xff0c;类似于方法&#xff0c;将逻辑语句封装在方法体中&#xff0c;通过{}包围起来。但与方法不同&#xff0c;…...

javaEE案例,前后端交互,计算机和用户登录

加法计算机,前端的代码如下 : 浏览器访问的效果如图 : 后端的代码如下 再在浏览器进行输入点击相加,就能获得结果 开发中程序报错,如何定位问题 1.先定位前端还是后端(通过日志分析) 1)前端 : F12 看控制台 2)后端 : 接口,控制台日志 举个例子: 如果出现了错误,我们就在后端…...

安卓学习记录

文章目录 Text_View基础属性字体阴影跑马灯**activity_main.xml**MyTextview button Text_View ctrl右键可以看到属性 代码整理采用的快捷键是ctrlaltL(电脑qq锁定快捷键&#xff0c;退一下qq就行了) 基础属性 字体阴影 <?xml version"1.0" encoding"utf-…...

gradle 使用记录

gradle 使用记录 下载与设置android studio 配置 参考 IDEA如何配置 Gradle 及 Gradle 安装过程&#xff08;详细版&#xff09; 设置Gradle国内镜像并配置本地仓库地址 下载与设置 腾讯镜像下载 比如gradle-8.4-bin.zip 新建环境变量 GRADLE_HOME 为 D:\java\gradle &#…...

电源基础元件

文章目录 电源基础元件理想电压源理想电流源受控电源 电源基础元件 理想电压源 定义 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源 理想电压源的电压、电流关系 1.电源两端电压由电源本身决定&#xff0c;与外电路无关&…...

[RK-Linux] updateEngine工具使用以及代码分析

Rockchip Linux 平台支持两种启动方案,Recovery 模式和Linux A/B 模式: Recovery 模式,设备上有一个单独的分区(recovery)用于升级操作。Linux A/B 模式,设备上有两套固件,可切换使用。两种启动方案的对比如下: 升级方案代码路径是否支持Recovey启动模式升级是否支持A/B启…...

MySQL | 数据库的表的增删改查【进阶】

MySQL | 数据库的表的增删改查【进阶】 文章目录 MySQL | 数据库的表的增删改查【进阶】系列文章目录本节目标&#xff1a;数据库约束约束类型NULL约束UNIQUE&#xff1a;唯一约束DEFAULT&#xff1a;默认值PRIMARY KEY&#xff1a;主键FOREIGN KEY&#xff1a;外键CHECK 表的设…...

爱剪辑如何将视频旋转90度,详细操作流程

爱剪辑是一款电脑端常用的视频剪辑类软件&#xff0c;基本上囊括了视频剪辑所需的所有功能&#xff0c;此处主要介绍&#xff0c;爱剪辑是如何对视频进行旋转操作的&#xff0c;水平旋转或者垂直旋转爱剪辑都是可以操作的&#xff0c;整体操作的详细过程将在下方为大家讲解。 …...

三国杀中的概率学问题3——王荣

前言 本文是三国杀中的概率学问题系列文章中的一篇&#xff0c;将详细讨论王荣吉占的期望摸牌数问题。并加上连续情形作为拓展。 值得说明的是&#xff0c;本文的思路受到了一篇文章的启发&#xff0c;在此特别鸣谢&#xff0c;这是文章的链接。 王荣吉占的期望摸牌数 王荣的…...

Linux - 实现一个简单的 shell

前言 之前我们对进程的替换&#xff0c;进程地址空间等等的概念进行了说明&#xff0c;本篇博客会基于这些知识点来 实现一个简单的 shell &#xff0c;如有疑问&#xff0c;可以参考下述博客&#xff1a;Linux - 进程程序替换 - C/C 如何实现与各个语言之间的相互调用 - 替换…...

不同优化器的应用

简单用用&#xff0c;优化器具体参考 深度学习中的优化器原理(SGD,SGDMomentum,Adagrad,RMSProp,Adam)_哔哩哔哩_bilibili 收藏版&#xff5c;史上最全机器学习优化器Optimizer汇总 - 知乎 (zhihu.com) import numpy as np import matplotlib.pyplot as plt import torch # …...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...