更新记录
v1.0.0(2026-04-21)
- 支持 iOS 与 Android 平台
- 提供
openAIStream,用于 OpenAI 兼容聊天流式请求
- 提供
streamRequest,用于通用 SSE 流式请求
- 支持
abortStream 与 abortRequest 取消请求
- 已适配 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 一起使用。
效果演示

平台支持
| 项目 |
说明 |
| 支持平台 |
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 |