更新记录

v1.0.0(2026-04-21)

  • 支持 iOS 与 Android 平台
  • 提供 openAIStream,用于 OpenAI 兼容聊天流式请求
  • 提供 streamRequest,用于通用 SSE 流式请求
  • 支持 abortStreamabortRequest 取消请求
  • 已适配 DashScope 兼容 OpenAI 接口的流式调用方式
  • 提供完整 README、TypeScript 类型说明与示例

平台兼容性

uni-app(3.8.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × - 4.4 15 ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

其他

多语言 暗黑模式 宽屏模式
× ×

vm-openai

vm-openai 是一个 uni-app / uni-app x 的 UTS 插件,用于发起流式 AI 请求。

当前提供两个 API:

  • openAIStream 面向 OpenAI 兼容聊天接口,直接返回增量文本
  • streamRequest 面向通用 SSE 接口,原样返回 event / id / data

如果你希望直接复用聊天界面,可以搭配 vm-openai-ui 一起使用。

效果演示

stream api use

平台支持

项目 说明
支持平台 iOS / Android
使用范围 仅支持 App 平台
普通 uni-app Android 最低版本 API 19
uni-app x Android 最低版本 API 21
iOS 最低版本 iOS 15+

导入方式

import {
  openAIStream,
  abortStream,
  streamRequest,
  abortRequest
} from '@/uni_modules/vm-openai'

TypeScript 导入方式:

import {
  openAIStream,
  abortStream,
  streamRequest,
  abortRequest
} from '@/uni_modules/vm-openai'
import type {
  VMOpenAIChatMessage,
  VMOpenAISSECompleteEvent,
  VMOpenAISSEError,
  VMOpenAISSEEvent,
  VMOpenAIStreamChatOptions,
  VMOpenAIStreamChunkEvent,
  VMOpenAIStreamCompleteEvent,
  VMOpenAIStreamError,
  VMOpenAISSEOptions
} from '@/uni_modules/vm-openai/utssdk/interface.uts'

API 选择

API 适合场景
openAIStream OpenAI 兼容 /chat/completions,直接消费增量文本
streamRequest 通用 SSE 请求,业务层自己处理 data

openAIStream

最小示例:

openAIStream({
  apiKey: 'YOUR_API_KEY',
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
  model: 'qwen-plus',
  messages: [
    { role: 'user', content: '你是谁?' }
  ],
  onOpen(res) {
    console.log('statusCode =', res.statusCode)
  },
  onChunk(res) {
    console.log('deltaText =', res.deltaText)
  },
  onError(err) {
    console.log('error =', err.message, err.statusCode, err.raw)
  },
  onComplete(res) {
    console.log('done =', res.cancelled)
  }
})

TypeScript 示例:

const messages: VMOpenAIChatMessage[] = [
  { role: 'user', content: '你是谁?' }
]

const options: VMOpenAIStreamChatOptions = {
  apiKey: 'YOUR_API_KEY',
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
  model: 'qwen-plus',
  messages,
  onChunk(res: VMOpenAIStreamChunkEvent) {
    console.log(res.deltaText)
  },
  onError(err: VMOpenAIStreamError) {
    console.log(err.message)
  },
  onComplete(res: VMOpenAIStreamCompleteEvent) {
    console.log(res.cancelled)
  }
}

openAIStream(options)

入参

参数 类型 必填 说明
apiKey string API Key
model string 模型名,例如 qwen-plus
messages Array<VMOpenAIChatMessage> 对话消息数组
baseURL string 服务根地址,插件会自动补 /chat/completions
url string 完整请求地址,优先级高于 baseURL
timeout number 超时时间,单位毫秒
temperature number 采样温度
top_p number Top P
max_tokens number 最大输出 token
presence_penalty number presence penalty
frequency_penalty number frequency penalty
onLog (res) => void 调试日志回调
onOpen (res) => void 连接建立成功回调
onChunk (res) => void 增量文本回调
onError (err) => void 错误回调
onComplete (res) => void 结束回调

messages 元素结构:

字段 类型 必填 说明
role string 一般为 system / user / assistant
content string 文本内容

对应 TypeScript 类型:

type VMOpenAIChatMessage = {
  role: string
  content: string
}

回调出参

onLog(res)

字段 类型 说明
message string 调试日志文本

onOpen(res)

字段 类型 说明
statusCode number HTTP 状态码

onChunk(res)

字段 类型 说明
event string SSE 事件名,可能为空
raw string 当前 chunk 的原始 data
deltaText string 当前新增文本

onError(err)

字段 类型 说明
statusCode number HTTP 状态码,失败前未建立连接时可能为 0
message string 错误信息
raw string 原始错误内容

onComplete(res)

字段 类型 说明
statusCode number HTTP 状态码
cancelled boolean 是否主动取消
text string 当前实现不建议作为主输出使用

说明:

  • 如果传 baseURL,插件会自动补 /chat/completions
  • 完整文本建议业务侧在 onChunk 中自行累积

streamRequest

最小示例:

streamRequest({
  url: 'https://example.com/sse',
  method: 'POST',
  headers: {
    Authorization: 'Bearer xxx',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    stream: true
  }),
  onOpen(res) {
    console.log('statusCode =', res.statusCode)
  },
  onEvent(res) {
    console.log('event =', res.event)
    console.log('id =', res.id)
    console.log('data =', res.data)
  },
  onError(err) {
    console.log('error =', err.message, err.statusCode, err.raw)
  },
  onComplete(res) {
    console.log('done =', res.cancelled)
  }
})

TypeScript 示例:

const options: VMOpenAISSEOptions = {
  url: 'https://example.com/sse',
  method: 'POST',
  headers: {
    Authorization: 'Bearer xxx',
    'Content-Type': 'application/json'
  } as UTSJSONObject,
  body: JSON.stringify({ stream: true }),
  onEvent(res: VMOpenAISSEEvent) {
    console.log(res.event, res.id, res.data)
  },
  onError(err: VMOpenAISSEError) {
    console.log(err.message)
  },
  onComplete(res: VMOpenAISSECompleteEvent) {
    console.log(res.cancelled)
  }
}

streamRequest(options)

入参

参数 类型 必填 说明
url string 请求地址
method string 请求方法,默认 GET
headers object 请求头
body string 请求体字符串
timeout number 超时时间,单位毫秒
onLog (res) => void 调试日志回调
onOpen (res) => void 连接建立成功回调
onEvent (res) => void SSE 事件回调
onError (err) => void 错误回调
onComplete (res) => void 结束回调

回调出参

onLog(res)

字段 类型 说明
message string 调试日志文本

onOpen(res)

字段 类型 说明
statusCode number HTTP 状态码

onEvent(res)

字段 类型 说明
event string SSE 事件名
id string SSE 事件 ID
data string SSE 事件数据

onError(err)

字段 类型 说明
statusCode number HTTP 状态码,失败前未建立连接时可能为 0
message string 错误信息
raw string 原始错误内容

onComplete(res)

字段 类型 说明
statusCode number HTTP 状态码
cancelled boolean 是否主动取消

说明:

  • streamRequest 不会帮你做 OpenAI JSON 解码
  • 如果服务端返回的是 OpenAI 兼容 SSE,请在业务层自己解析 res.data

取消请求

API 返回值 说明
abortStream() void 取消当前 openAIStream 请求
abortRequest() void 取消当前 streamRequest 请求

取消后,onComplete 会回调:

onComplete(res) {
  if (res.cancelled) {
    console.log('request cancelled')
  }
}

DashScope / qwen-plus 示例

openAIStream({
  apiKey: 'YOUR_DASHSCOPE_API_KEY',
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
  model: 'qwen-plus',
  messages: [
    { role: 'user', content: '你好' }
  ],
  onChunk(res) {
    console.log(res.deltaText)
  }
})

建议

场景 建议
OpenAI 兼容聊天接口 优先使用 openAIStream
通用 SSE 接口 使用 streamRequest
生产环境 不要直接暴露长期有效 API Key

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。