基于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}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS&#xff1f; 一、NestJS特性&#xff1f;二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS&#xff1f; Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…

【论文阅读】PSDF Fusion:用于动态 3D 数据融合和场景重建的概率符号距离函数

【论文阅读】PSDF Fusion&#xff1a;用于动态 3D 数据融合和场景重建的概率符号距离函数 Abstract1 Introduction3 Overview3.1 Hybrid Data Structure3.2 3D Representations3.3 Pipeline 4 PSDF Fusion and Surface Reconstruction4.1 PSDF Fusion4.2 Inlier Ratio Evaluati…

【AICFD案例教程】汽车外气动-AI加速

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

【C++】this指针讲解超详细!!!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【Redis】set 集合

上一篇&#xff1a;list 列表 https://blog.csdn.net/m0_67930426/article/details/134364315?spm1001.2014.3001.5501 目录 Sadd Smembers Sismember Scard Srem ​编辑Srandomember Spop Smove 集合类 Sdiff Sinter Sunion 官网 https://redis.io/commands/?…

css实现div倾斜效果

效果如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head> <style> *{margin:0;padding: 0;} .box1{margin:30px 100px;width:100px;height:200px;background:blueviolet;} …

虚拟化服务器+华为防火墙+kiwi_syslog访问留痕

一、适用场景 1、大中型企业需要对接入用户的访问进行记录时&#xff0c;以前用3CDaemon时&#xff0c;只能用于小型网络当中&#xff0c;记录的数据量太大时&#xff0c;本例采用破解版的kiwi_syslog。 2、当网监、公安查到有非法访问时&#xff0c;可提供基于五元组的外网访…

Visual Studio 2019 写 Unity 脚本时,烦人又离谱的自动补全!

Visual Studio 2019 写 Unity 脚本时&#xff0c;逆天又离谱的自动补全&#xff01; 血压高升的原因 写脚本的时候&#xff0c;智能提示有哪些函数可以使用&#xff0c;是非常棒的一件事情&#xff0c;有助于游戏开发者编写和检查自己的脚本代码。 但是&#xff01; 我想输入…

基于SpringBoot+Vue的在线学习平台系统

基于SpringBootVue的在线学习平台系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 用户界面 登录界面 管理员界面 摘要 本文设计并实现了一套基于Spri…

敏捷开发是什么?敏捷开发流程是怎么样的?

1. 什么是敏捷开发&#xff1f; 敏捷开发是一种迭代、增量式的软件开发方法&#xff0c;旨在通过灵活、协作和快速响应变化的方式&#xff0c;提高开发团队的效率和产品的质量。相较于传统的瀑布式开发模型&#xff0c;敏捷开发更加注重用户需求的响应和团队协作&#xff0…

LiteVNA 能做什么?

最近入手了一台 LiteVNA 设备&#xff0c;性价比非常高。因为之前没有接触过 VNA 这种测试仪器&#xff0c;所以准备好好研究一下。和它类似的一个项目是 NanoVNA6000&#xff0c;价格要高些&#xff0c;但可能性能要好点&#xff0c;另外&#xff0c;文档也要全一些。 VNA …

单链表按位序与指定结点 删除

按位序删除(带头结点) #define NULL 0 #include<stdlib.h>typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList;//按位序删除&#xff08;带头结点&#xff09; bool ListInsert(LinkList& L, int i, int& e) {if (i < 1)return false;L…