npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

xiruilink-llm

v2.0.4

Published

xiruilink-llm-api-js-package

Downloads

5

Readme

xiruilink-llm 使用说明

author: li xingyuan

latest-time: 2024-05-17

xiruilink-llm,封装了对大模型调用的相关代码。功能包将对外暴露的功能函数统一封装成为了class,并使用了单例模式对class进行管理,保证在大模型流式生成的生产环境下的行为一致性,对各种可能出现的问题进行的预防。

下面介绍如何使用XiruiModel api

0 安装和引入

目前,XiruiModel通过NPM包的形式对外暴露,通过:

npm install xiruilink-llm

获取最新的NPM包。

然后,在项目中,使用:

import XiruiModel from 'xiruilink-llm'

即可将class引入需要使用的地方。

1.初始化和销毁实例

XiruiModel使用单例模式,在使用前需要对实例进行初始化。

使用下述代码,即可初始化一个XiruiModel实例。

new XiruiModel({
  app_id: '',
  app_secret: '',
  app_key: ''
})

其中:

// 应用ID
app_id

// 应用公钥
app_secret

// 应用私钥
app_key

XiruiModel api默认设置了若干属性,如果您有需要,可以根据需求,在初始化的同时传入对应字段,修改默认配置。

// 可选输入

//是否启用历史问题关联,开启后将携带历史提问一同发出请求。注意,该功能将额外消耗大量的tokens.
use_history: false | true,

// 历史栈长度,无论是否开启use_history,历史栈都会记录提问,历史栈默认长度为20。注意,该值只能为大于1的偶数.
history_length: num

// 请求地址,输入为一个ws(s)协议的地址
request_url: ws(s)://url

// 是否输出LOG
show_log: true | false

// 指定底层socket类型。 默认为空,即不指定类型
socket_type: '' | 'h5' | 'uniapp'

// 单次回答tokens限制
tokens_limit: 32 <= num <= 2048

// 是否启用稳流器,默认开启,平缓输出
use_retarder: true || false

// 稳流器输出时间步长
retarder_step: 50

// 容错配置, 由于星火大模型做了严格限制,domain字段必须符合一定格式,为了确保模型调通,设置了此配置,一般无需处理
general: 'generalv3'

// 是否输出原始数据
output_origin: true | false

// url函数
url_method: funciton

// url函数发生错误的回调
onurlError: function

其中,socket_type 属性的相关逻辑较为复杂,将在 [第四节] 进行详细说明。

下面是一份完整的配置,您可以直接复制使用:

const setting = {
  // 必备信息
  app_id: '', app_key: '', app_secret: '',
  // 是否启用历史记录
  use_history: true,
  // 历史队列长度
  history_length: 20,
  // 请求地址
  request_url: 'wss://spark-api.xf-yun.com/v3.1/chat',
  // 是否显示log信息
  show_log: true,
  // 使用哪一种socket: h5 uniapp 两种可选, 默认为空,根据环境自动选择
  socket_type: '',
  // 单次回答最大token用量
  tokens_limit: 30,
  // 启用缓流器, 优化输出效果
  use_retarder: true,
  // 缓流器步长,开启环流器后才生效
  retarder_step: 30,
  // 模板函数,调试用,无需处理
  prompt: function,
}

初始化后,您可以接收和保存new方法后返回的实例对象来使用该实例。或者,通过下面方法在任意地方获取该实例。

XiruiModel.getInstance()

警告:在调用该方法前,您必须保证实例已经被初始化。否则,将会抛出错误:

[xiruilink-llm]: instance are not initialized.

注意,您只需要初始化一次实例即可。如果重复初始化,旧的实例将会被释放,同时会在控制台输出警告。

[xiruilink-llm]: existing instance has been rebuild.

如果您想要释放实例,调用下述静态方法即可:

XiruiModel.destroy()

此外,关于历史栈, 历史栈会自动记录用户提问和大模型生成的回答,但如果大模型生成失败,那么本次用户的提问也将不会被记录。

2.发送请求和接收数据

XiruiModel对外暴露了 sendToServer() 方法来对服务器发送请求,具体的参数如下。

XiruiModel.sendToServer(
  // 必要输入
  target,
  // 可选
  callback,
  // 可选
  endback
)

其中,target为一个对象,当前包括两个字段:

{
  // 问题内容
  content,
  // 用户ID(非必要)
  uuid
}

callbackendback 是function,传入将会进行校验,如果为非函数类型,将会抛出错误:

[xiruilink-llm]: callback or endback is not a function.

callback 将会在大模型回答生成过程中被 连续调用 ,并传入Text对象。

{
  // 状态码,成功为0
  code: 0,
  // 生成内容。单次返回内容不完整,需要自行进行拼接
  content: '',
  // 角色,固定为assistant
  role:"assistant",
  // 队列号
  seq:'',
  // 指示码,0 生成开始,1 生成中,2 生成结束
  status:0
}

endback为生成结束后的回调,只会调用一次。endback会接受一个对象,包含:

{
  // 状态码, 成功为0
  code: 0,
  // WebSocket结束事件
  event,
  // 生成的完整回答
  full_text,
  // 提示信息
  message,
  // token用量
  usage
}

下面是vue中的一个示例:

XiruiModel.sendToServer(
  {
    content: this.postMessage,
    uuid: 'test'
  },
  this.handleAnswerStream,
  this.handleAnswerStreamOver
)
.then(res => {
  // do something
})
.catch(err => {
  // do something
})

handleAnswerStream(t) {
  console.log(t)
}

handleAnswerStreamOver(t) {
  console.log(t)
}

通过上面的示例,您可以注意到,sendToServer() 方法可以使用 then() 方法。

为了更方便开发人员处理业务,我们对核心方法 sendToServer() 进行了 Promise 对象的包装。该方法实际将返回一个Promise对象,并在对象内部对 resolvereject 进行了处理。所以, sendToServer() 允许您不传入回调函数,使用 then()catch() 方法来处理业务和异常。

在大模型场景下,模型生成回答需要消耗较多算力,在多用户场景下,无法快速为用户生成完整回答。因此,更建议您使用 callback 流式处理数据,减少用户等待时间,优化用户体验。使用 then() 方法返回的全量回答进行后续的处理将会是更好的选择。

需要注意,callbackendback 调用的时机均在 Promise 对象 resolve 或 reject 之前。

3.其他功能函数

除了核心的 sendToServer() 方法,XiruiModel还提供了若干功能函数来辅助处理业务。

  • terminate() 该方法将会中断生成.
  • getHistory() 该方法将会返回XiruiModel记录的历史回答.
  • clearHistory() 该方法将会清空XiruiModel保存的历史栈.
  • setHistory(t) t 为array, 该方法将会用传入的 array 覆盖原有的历史栈。如果超出历史栈设置的长度,将会从尾部截取长度内的数组元素。需要用户保证数组中元素格式正确, 否则将会抛出错误。
  • setProperties(t) t 为array, 该方法将传入的属性数组批量应用到现有实例中。该方法 不会 造成实例的释放。用户需保证 参数类型 正确,否则会抛出警告,同时类型错误的属性将会设置失败。

下面为上述方法的几个示例:

// 停止生成
shutDown() {
  XiruiModel.terminate()
}


// 用户更改配置
save(settings = {}) {
  const {
    use_history = false,
    tokens_limit = 128
  } = settings

  XiruiModel.setProperties([
    { key: 'use_history', value: use_history },
    { key: 'tokens_limit', value: tokens_limit }
  ])
}

// 用户更改对话窗口
changeChatWindow(chatList) {
  // expect
  chatList = [
    ...
    {role: 'assitant', content: ''},
    {role: 'user', content: ''},
    {role: 'assitant', content: ''},
    {role: 'user', content: ''},
    ...
  ]
  //

  XiruiModel.setHistory(chatList)
}

XiruiModel 对方法的调用均提供了两种方式:

// 静态方法方式
XiruiModel.XXX()

// 实例方式
let XiruiModel = XiruiModel.getInstance()
XiruiModel.XXX()

我们更推荐您使用静态的方式进行调用,更简洁且更高效。

4. 对UNIAPP的支持

移动应用端,UNIAPP当前得到了较为广泛的应用,我们也追加了对UNIAPP的支持。

但是,对于WebSocket的使用,Web端和APP端存在差异。对于本JS包,Web端调用的是window对象中的WebSocket,来实现核心功能。

但在UNIAPP的移动端环境中,UNIAPP官方对WebSocket做了单独的封装,并不支持H5原生的WebSocket。并且,封装后,调用方式等都和Web端产生了较大差异。

在这种情况下,为了抹平差异,本JS包对uniapp的websocket进行了二次封装。经过封装,保证本JS包对外暴露的能力在 H5端 和 uniapp APP端 的使用上保持完全一致。于此同时,本JS包对底层调用的差异化处理对使用者完全透明,使用者只需专注于业务逻辑即可。

默认情况下,程序会按照顺序,匹配当前环境可用的WebSocket对象,顺序为 H5原生 > uniapp封装 , 即优先使用h5,如果您有需要,也可以在初始化实例的时候,通过 socket_type 来指定您要使用的WebSocket类型。

更新日志

2.0.4

optimized: 优化角色模板

2.0.3

add: 新增url函数相关逻辑. optimized: 优化错误处理

2.0.2

add: 开放模板自定义.

2.0.1

change: 修改底层设计和结构,极大优化中断函数效果. add: 新增若干功能.

1.8.0

optimized: 优化一些问题

1.7.5

fixed:微信小程序正式环境调用问题

1.7.4

fixed: 修复中断方法BUG

1.7.3

fixed: 修复多环境支持bug

1.7.2

替换btoa函数,提供多环境支持

1.7.1

fixed: FULL_TEXT输出为空的问题

1.7.0

支持多版本调用

1.6.1

追加对错误的展示,现在会把错误数据返回

1.6.0

追加配置,支持原始数据输出

1.5.3

追加对格式化输出的支持

1.5.2

优化稳流器输出

1.5.1

  1. 新增补偿机制 fixed: 模型配置设置

1.5.0

  1. 补充稳流器支持
  2. 优化实例配置方式

1.4.6

追加最大tokens限制校验 fixed: uni-socket close()方法缺失的问题

1.4.5

更新文档

1.4.4

优化输出

1.4.3

补充属性设置功能 补充历史栈设置功能

1.4.2

优化WS建立逻辑 [test] 追加若干属性设置选项

1.4.1

完成对UNI-APP websocket 的统一封装和支持

1.3.4

[test] 修复若干bug

1.3.3

[test] 新增接口支持

1.3.2

[test] 追加对uni-app的支持

1.3.1

更新文档

1.2.3

优化错误信息输出逻辑

1.2.2

优化初始化实例的相关代码逻辑

1.2.1

函数回调和返回值将会同时返回操作code码

1.2.0

新增停止生成功能函数

1.1.5

优化log逻辑

fixed: 状态码为零不能赋值问题

1.1.4

1.新增返回信息追加status状态

2.fixed:isConnedted函数不能正常指示连接状态

1.1.3

追加错误返回信息提示

1.1.2

fixed:队列不能按照限定长度运行

1.1.1

补充history length校验相关逻辑

1.1.0

新增查询历史栈相关功能