node的服务端对接科大讯飞-火星ai解决方案

序:

        官方给的node对接火星的demo其实只适用于node开发的web应用,但是对于纯node 作为服务端,也就是作为webapi来调用,你会发现,location.host直接是获取不到location的。这个时候,其实要单独起个wss的服务的,关于这点,雪狼写了本篇教程,

        1、博主的node:v18.12.1

        2、ws:v8.14.1(WebSocket)

        3、CryptoJS:4.0.0

正文:

1.、来首先我们安装依赖,下面两个命令

cnpm install crypto-js@4.0.0 -S
cnpm install ws@8.14.1 -S

2、引入

import WebSocket from "ws";
import CryptoJS from 'crypto-js'

3、写初始化url

function getWebsocketUrl(){return new Promise((resolve, reject) => {var apiKey = "你的apiKey"var apiSecret = "你的apiSecret"var url = 'wss://spark-api.xf-yun.com/v1.1/chat'var host = "localhost:8001"var date = new Date().toGMTString()var algorithm = 'hmac-sha256'var headers = 'host date request-line'var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v1.1/chat HTTP/1.1`var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret)var signature = CryptoJS.enc.Base64.stringify(signatureSha)var authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`var authorization = btoa(authorizationOrigin)url = `${url}?authorization=${authorization}&date=${date}&host=${host}`resolve(url)})}

注意,这里localhost:8001你直接写8001!,后续你调试直接监听这个端口接口

4、开始监听

function wsFun(userSay,callback){getWebsocketUrl().then(url => {let ws = new WebSocket(url);ws.on('error', console.error);ws.on('open', function open() {var params = {"header": {"app_id":"你的app_id",//这里记得替换app_id"uid": "fd3f47e4-d"},"parameter": {"chat": {"domain": "general","temperature": 0.5,"max_tokens": 1024}},"payload": {"message": {"text": [{"role": "user","content": userSay}]}}}ws.send(JSON.stringify(params))});ws.on('close', function close() {});ws.on('message', function message(data) {var msgData=JSON.parse(data)if (msgData.header.code !== 0) {callback("提问失败",2)}else{callback(msgData.payload.choices.text[0].content,msgData.header.status)// 这个就是返回啦}});})}
wsFun("你好啊");

5、断点运行代码

$ node --inspect-brk=8001 index.js

注意,这个8001就是咱刚host写的端口, message里面是火星的回复,大家可以自行监听并回调

#程序员干货  #人间清醒  #前端回忆录  #争议话题  #程序员圈子热点

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

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

相关文章

C++: stack 与 queue

目录 1.stack与queue stack queue 2.priority_queue 2.1相关介绍 2.2模拟实现priority_queue --仿函数: --push --pop --top --size --empty --迭代器区间构造 2.3仿函数 3.容器适配器 stack模拟实现 queue模拟实现 学习目标: 1.stack和queue介绍与使用 2.pri…

PHP8中伪变量“$this->”和操作符“::”的使用-PHP8知识详解

对象不仅可以调用自己的变量和方法,也可以调用类中的变量和方法。PHP8通过伪变量“$this->”和操作符“::”来实现这些功能。 1.伪变量“$this->” 在通过对象名->方法调用对象的方法时,如果不知道对象的名称,而又想调用类中的方法…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Mooctest

开发者 测试框架junit 1.字符串不能除 2.a给了c 3. 4. 5.输入是否>0 6.注释

Python中的用法与常见问题解析

装饰器是Python语言中一种强大且常用的概念。通过装饰器,我们可以在不修改原始函数代码的情况下,给函数添加额外的功能,比如日志记录、性能分析、输入验证等。在本文中,我们将深入探讨Python中装饰器的用法和常见问题,…

Leetcode刷题笔记--Hot51-60

1--环形链表II 主要思路: 快慢指针,快指针每次走两步,慢指针每次走一步; 第一次相遇时,假设慢指针共走了 f 步,则快指针走了 2f 步; 假设起点到环入口结点的长度为 a(不包括入口结点…

【7.Vue 利用Heatmap.js 制作自定义热力图】

1.效果 2.背景 需要根据后端检测的设备的数值显示设备周围的清洁度,用户希望用热力图的方式来显示,于是在网上找了资料,发现可以用Heatmap.js来实现。 Heatmap.js 官网:https://www.patrick-wied.at/static/heatmapjs/ 3.引入组件 安装Heatmap.js npm install Heatmap.…

Nginx之带宽限制解读

目录 基本介绍 指令配置 limit_rate limit_rate_after 实战测试 原理: 令牌桶算法 基本介绍 在高负载的网络环境下,为了保持服务的稳定性,限速 (download rate) 是一种必要的操控拜访量的手法。Nginx 是一款高性能的 Web 服务器和反向代…

踩中AIGC 美图看清自己“工具”本职

日前,美图公司发布 2023 年中期业绩,实现总收入 12.61 亿元,同比增长 29.8%;实现经调整后归母净利润 1.51 亿元,同比增长 320.4%,利润增速是收入增速的十倍。同时,在 AIGC 的加持下,…

JDK21新特性Record Patterns记录模式详解

1 摘要 通过使用记录模式来增强Java编程语言,以解构记录值。记录模式和类型模式可嵌套使用,从而实现强大、声明式和可组合的数据导航和处理形式。 2 发展史 由 JEP 405 提出的预览功能,并在JDK 19发布,然后由 JEP 432 再次预览…

GitLab数据迁移后出现500错误

一、背景 去年做GitLab数据迁移时,写过一篇文章《GitLab的备份与还原》。后来发现新创建的项目没问题,但对于迁移过来的项目,修改名称等信息,或者删除该项目时,会出现500错误,以为是系统问题&#…

websocket请求通过IteratorAggregate实现流式输出

对接国内讯飞星火模型,官方文档接口采用的是websocket跟国外chatgpt有些差异。 虽然官网给出一个简单demo通过while(true),websocket的receive()可以实现逐条接受并输出给前端,但是通用和灵活度不高。不能兼容现有项目框架的流式输出。故模仿…

安卓Compose(一)

为什么学习安卓Compose? 安卓Compose是一个相对新的UI工具包,它的出现为安卓应用程序开发带来了一系列的好处。下面是一些学习Compose的理由: 声明式UI 与传统的安卓XML布局相比,Compose使用了声明式的UI编程范例。这意味着你可以…

Verilog零基础入门(边看边练与测试仿真)-状态机-笔记(7-10讲)

文章目录 第七讲第八讲第九讲第十讲 第七讲 1、最简单的状态机-三角波发生器 1、两种状态的代码: //最简单的状态机,三角波发生器; timescale 1ns/10ps module tri_gen(clk,res,d_out); input clk; input res; o…

小程序搜索词排名优化的诀窍

随着小程序的普及,如何提高小程序在搜索结果中的排名也变得重要。优化小程序搜索词排名可以扩大用户流量,提高曝光度。那么,小程序搜索词排名优化需要注意哪些方面呢?下面我就结合自己的经验,和大家分享些实用技巧。【名即薇】 首先,选择合适的搜索词非常关键。目标是找到既符…

C语言 宏定义使用方式

在C语言中,宏定义是一种预处理指令,用于为代码创建别名或常量。它使用#define关键字来定义宏。 以下是宏定义的使用方式: 1)简单的宏定义: #define PI 3.14159这将为数值3.14159定义一个名为PI的宏。在代码中,每次出…

【Linux】【网络】传输层协议:TCP

文章目录 TCP 协议1. TCP 协议段格式2. TCP 报头解析3. TCP 的可靠性4. 面向字节流5. 粘包问题6. 连接队列维护 TCP 的 确认应答机制TCP 的 超时重传机制TCP 的 三次握手TCP 的 四次挥手setsockopt 函数:设置套接字选项,解决 TIME_WAIT 状态引起的 bind …

在B站上如何把已经上传的视频做成合集?

参考视频: 【在B站上如何把已经上传的视频做成合集?】 https://www.bilibili.com/video/BV1Uf4y1G7eR/?share_sourcecopy_web&vd_source8af85e60c2df9af1f0fd23935753a933 【B站投稿视频合集的几种方式最全攻略】 https://www.bilibili.com/video/BV1jZ4y1h7…

SpringCloud 学习(三)Ribbon 和 Feign

4. Netflix.Ribbon 4.1 简介 (1) 概念 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具。 (2) 负载均衡(LB:LoadBalance)和集群架构 应用集群:将同一应用部署到多台机器上,组成处理集群&…

Android逆向技术高阶大法

原文链接 Android逆向技术高阶大法 安卓应用是一个客户端,与传统软件类似,需要把软件打包,然后通过某种渠道(应用市场)分发给用户,这是常规的发布方式,它的更新节奏很慢,从你在应用…