ms-vite-plugin 1.4.74 → 1.4.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,466 @@
1
+ # AI 模块 (AI)
2
+
3
+ AI 模块让脚本直接在手机上调用大模型:看图回答问题、做是非判断、从屏幕提取结构化数据、多轮对话。
4
+
5
+ 支持三种接口协议,覆盖绝大多数模型服务:
6
+
7
+ | `protocol` | 适用服务 |
8
+ | ----------- | ------------------------------------------------------------------------------------- |
9
+ | `openai` | DeepSeek、通义千问、Kimi、智谱、SiliconFlow、本机 Ollama / vLLM 等 |
10
+ | `anthropic` | 国内一般走 openai 兼容口,不必单独配 |
11
+ | `gemini` | 国内一般走 openai 兼容口,不必单独配 |
12
+
13
+ 模型配置(地址、Key、模型名)直接写在脚本里,脚本开头 `ai.setProvider` 一次即可;脚本停止后配置自动清空,不会存到手机上。
14
+
15
+ 所有方法同步阻塞,失败时返回 `None` / `False`,原因用 `ai.lastError()` 查看。
16
+
17
+ ## 快速开始
18
+
19
+ ```python
20
+ from kuaijs import ai
21
+
22
+ # 1. 脚本开头登记模型(只需一次)。通义千问 Qwen3.5 起原生多模态,看图、问字都能用。
23
+ ai.setProvider({
24
+ "name": "通义千问",
25
+ "protocol": "openai",
26
+ "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
27
+ "apiKey": "sk-xxxxxxxx",
28
+ "model": "qwen3.5-flash",
29
+ })
30
+
31
+ # 2. 直接问
32
+ print(ai.ask("用一句话介绍你自己"))
33
+
34
+ # 3. 看着屏幕判断
35
+ if ai.judge("当前是否已经登录成功?", {"image": "screen"}):
36
+ print("已登录")
37
+
38
+ # 4. 从屏幕某个区域提取数据
39
+ data = ai.extract("提取验证码", {
40
+ "image": "screen", "x": 100, "y": 800, "ex": 600, "ey": 900,
41
+ "schema": {"code": "string"},
42
+ })
43
+ if data:
44
+ print(data.code)
45
+ ```
46
+
47
+ ## 图片参数
48
+
49
+ 图片参数和 image 模块**完全一样**,没有单独的截图开关:
50
+
51
+ | 参数 | 含义 |
52
+ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
53
+ | `image` | `imageId`,与所有 `image.*` 函数的 `imageId` 参数一样:`image.captureScreen()` 等返回的图片 ID、`"screen"`(当前屏幕)、res 目录或手机绝对路径的图片文件 |
54
+ | `x`, `y`, `ex`, `ey` | 对 `image` 裁剪,同 `image.clip(imageId, x, y, ex, ey)`:左上角 / 右下角坐标,全 0 不裁剪。只写区域不写 `image` 时按 `"screen"` |
55
+ | `images` | 多张图的列表,元素同 `image`,不裁剪 |
56
+
57
+ ```python
58
+ from kuaijs import ai, image
59
+
60
+ # 当前全屏
61
+ ai.ask("屏幕上有几个按钮?", {"image": "screen"})
62
+
63
+ # 屏幕区域:左上 (0, 200) 到右下 (750, 600)
64
+ ai.ask("这一块显示的价格是多少?", {"image": "screen", "x": 0, "y": 200, "ex": 750, "ey": 600})
65
+
66
+ # 已有的图片 ID
67
+ img = image.captureScreen()
68
+ ai.ask("描述这张图", {"image": img, "x": 0, "y": 0, "ex": 750, "ey": 400})
69
+ image.release(img)
70
+
71
+ # 图片文件
72
+ ai.ask("这张图里是什么", {"image": "sample.png"})
73
+
74
+ # 一次传多张:模板图 + 当前屏幕
75
+ ai.judge("第二张图里有没有第一张图的图标?", {"images": ["icon.png", "screen"]})
76
+ ```
77
+
78
+ ## 费用说明
79
+
80
+ 模型按 token 计费,其中图片是大头:一张 iPhone 全屏截图约 1400 ~ 1500 token,文字提问通常只有几十个。
81
+
82
+ - **能裁区域就不发全屏。** 只发需要看的那一块,token 通常能少 5 ~ 10 倍。
83
+ - **循环里保持提示词不变。** 三家服务都有「前缀缓存」:连续请求里开头相同的部分按约 1/10 计费。AI 模块已经把 `system` 排最前、文字排在图片之前,循环里每次只有图片变,`system` 和问题文字都能命中缓存。不要往 `system` 或问题里拼时间、序号这类每次都变的内容。
84
+ - **不同场景用不同模型。** 便宜的文本模型做默认,视觉模型只在需要看图时用(见 [setProvider](#setprovider---登记或更新模型供应商))。
85
+
86
+ ## 数据类型
87
+
88
+ ### AiProvider
89
+
90
+ ```python
91
+ from kuaijs._types import KuaiJSNamespace
92
+
93
+ class AiProvider(KuaiJSNamespace):
94
+ id: str # 供应商 id,不传时自动生成
95
+ name: str # 展示名,例如 "DeepSeek",调用时可用它选模型
96
+ protocol: str # "openai" / "anthropic" / "gemini"
97
+ baseUrl: str # 接口根地址,例如 https://api.deepseek.com
98
+ apiKey: str # API Key;openai 协议连本机模型时可为空
99
+ model: str # 默认模型名
100
+ headers: Dict[str, str] # 额外请求头,某些网关需要
101
+ temperature: Optional[float] # 默认温度;不传则不发该字段,用模型自己的默认值
102
+ maxTokens: Optional[int] # 默认最大输出 token;不传则不发,用模型默认值(Anthropic 必填,缺省 2048)
103
+ reasoningEffort: Optional[str] # 思考级别 none/low/medium/high/xhigh,仅 openai;不传不发,用服务商默认
104
+ supportsVision: bool # 是否支持图片输入,默认 True
105
+ isDefault: bool # 是否为默认供应商
106
+ ```
107
+
108
+ ### options 字典
109
+
110
+ `ask` / `judge` / `extract` / `chat` 的第二个参数,所有键可选:
111
+
112
+ | 键 | 类型 | 描述 |
113
+ | ------------- | ------------------ | ---------------------------------------------------------- |
114
+ | `provider` | str | 用哪个供应商:id 或 name;不传用默认 |
115
+ | `model` | str | 临时换模型,覆盖供应商默认模型 |
116
+ | `temperature` | float | 覆盖默认温度 |
117
+ | `maxTokens` | int | 覆盖默认最大输出 token |
118
+ | `timeout` | int | 超时毫秒,默认 90000 |
119
+ | `json` | bool | 要求模型输出 JSON(extract 自动开启) |
120
+ | `system` | str | 系统提示(chat 不用这个,写在 messages 里) |
121
+ | `image` | str | imageId,同 image 模块:图片 ID / `"screen"` / 图片路径 |
122
+ | `x` `y` `ex` `ey` | int | 对 image 裁剪,同 `image.clip`;全 0 不裁剪 |
123
+ | `images` | List[str] | 多张图,元素同 image,不裁剪 |
124
+ | `schema` | str \| dict \| list | 仅 extract:期望的 JSON 结构说明 |
125
+
126
+ ## API 参考
127
+
128
+ ### setProvider - 登记或更新模型供应商。
129
+
130
+ ```python
131
+ def setProvider(config: Dict[str, Any]) -> Optional[AiProvider]:
132
+ ```
133
+
134
+ **参数:**
135
+
136
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
137
+ | -------- | ---------------- | -------- | ------ | ----------------------------------------------------------------------------------- |
138
+ | `config` | `Dict[str, Any]` | 是 | - | 新建至少要有 `baseUrl`、`model`(`protocol` 缺省 openai);同 `id` 更新时没传的字段沿用旧值 |
139
+
140
+ **返回值:**
141
+
142
+ | 类型 | 描述 |
143
+ | ---------------------- | ------------------------------------------------------------------------------- |
144
+ | `Optional[AiProvider]` | 保存后的完整配置;`protocol` 不是三者之一或缺 `baseUrl` / `model` 时返回 `None` |
145
+
146
+ 第一个登记的供应商自动成为默认;`"isDefault": True` 会把默认切到它。
147
+
148
+ **示例:**
149
+
150
+ ```python
151
+ from kuaijs import ai
152
+
153
+ # 只用一个模型(通义能看图)
154
+ ai.setProvider({
155
+ "name": "通义千问", "protocol": "openai",
156
+ "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
157
+ "apiKey": "sk-xxxxxxxx", "model": "qwen3.5-flash",
158
+ })
159
+
160
+ # 多个模型省钱:便宜的文本模型做默认,视觉模型单独一个,用到时按 name 选
161
+ ai.setProvider({
162
+ "name": "文本", "protocol": "openai", "baseUrl": "https://api.deepseek.com",
163
+ "apiKey": "sk-xxxxxxxx", "model": "deepseek-v4-flash", "supportsVision": False, "isDefault": True,
164
+ })
165
+ ai.setProvider({
166
+ "name": "视觉", "protocol": "openai", "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
167
+ "apiKey": "sk-xxxxxxxx", "model": "qwen3.5-flash",
168
+ })
169
+ ai.ask("把这段话翻译成英文:你好") # 走默认的「文本」
170
+ ai.judge("是否出现弹窗?", {"image": "screen", "provider": "视觉"}) # 看图时才用视觉模型
171
+
172
+ # 同一供应商只换模型,不必再登记
173
+ ai.ask("复杂推理题……", {"model": "deepseek-v4-pro"})
174
+
175
+ # 智谱 GLM(OpenAI 兼容口)
176
+ ai.setProvider({
177
+ "name": "智谱 GLM", "protocol": "openai", "baseUrl": "https://open.bigmodel.cn/api/paas/v4",
178
+ "apiKey": "sk-xxxxxxxx", "model": "glm-5.3-flash",
179
+ })
180
+
181
+ # 本机 Ollama,不需要 Key
182
+ ai.setProvider({"name": "本机", "protocol": "openai", "baseUrl": "http://192.168.1.10:11434/v1", "model": "qwen3:8b"})
183
+ ```
184
+
185
+ ### getProviders - 列出已登记的供应商。
186
+
187
+ ```python
188
+ def getProviders() -> List[AiProvider]:
189
+ ```
190
+
191
+ **返回值:**
192
+
193
+ | 类型 | 描述 |
194
+ | ------------------ | -------------------------- |
195
+ | `List[AiProvider]` | 供应商列表,默认项排在最前 |
196
+
197
+ **示例:**
198
+
199
+ ```python
200
+ from kuaijs import ai
201
+ for p in ai.getProviders():
202
+ print(p.name, "->", p.model)
203
+ ```
204
+
205
+ ### getDefaultProvider - 获取默认供应商。
206
+
207
+ ```python
208
+ def getDefaultProvider() -> Optional[AiProvider]:
209
+ ```
210
+
211
+ **返回值:**
212
+
213
+ | 类型 | 描述 |
214
+ | ---------------------- | ------------------------------------- |
215
+ | `Optional[AiProvider]` | 默认供应商;一个都没登记时返回 `None` |
216
+
217
+ ### setDefaultProvider - 切换默认供应商。
218
+
219
+ ```python
220
+ def setDefaultProvider(id: str) -> bool:
221
+ ```
222
+
223
+ **参数:**
224
+
225
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
226
+ | ------ | ---- | -------- | ------ | --------- |
227
+ | `id` | str | 是 | - | 供应商 id 或 name |
228
+
229
+ **返回值:**
230
+
231
+ | 类型 | 描述 |
232
+ | ------ | ------------------ |
233
+ | `bool` | id 或 name 存在返回 `True` |
234
+
235
+ ### removeProvider - 删除供应商。
236
+
237
+ ```python
238
+ def removeProvider(id: str) -> bool:
239
+ ```
240
+
241
+ **参数:**
242
+
243
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
244
+ | ------ | ---- | -------- | ------ | --------- |
245
+ | `id` | str | 是 | - | 供应商 id 或 name |
246
+
247
+ **返回值:**
248
+
249
+ | 类型 | 描述 |
250
+ | ------ | --------------------- |
251
+ | `bool` | 存在并删除返回 `True` |
252
+
253
+ 删掉的是默认供应商时,默认自动转给剩下的第一个。
254
+
255
+ ### ask - 单轮提问,可附带图片。
256
+
257
+ ```python
258
+ def ask(prompt: str, options: Optional[Dict[str, Any]] = None) -> Optional[str]:
259
+ ```
260
+
261
+ **参数:**
262
+
263
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
264
+ | --------- | ---------------- | -------- | ------ | ---------------------------------------------- |
265
+ | `prompt` | str | 是 | - | 问题 |
266
+ | `options` | `Dict[str, Any]` | 否 | `None` | 见 [options 字典](#options-字典),图片参数同 image 模块 |
267
+
268
+ **返回值:**
269
+
270
+ | 类型 | 描述 |
271
+ | --------------- | --------------------------------------------------- |
272
+ | `Optional[str]` | 模型回复文本;失败返回 `None`,原因看 `lastError()` |
273
+
274
+ **示例:**
275
+
276
+ ```python
277
+ from kuaijs import ai
278
+
279
+ # 纯文本
280
+ t = ai.ask("北京到上海高铁大概几小时?")
281
+
282
+ # 带系统提示 + 当前屏幕
283
+ desc = ai.ask("描述当前页面", {"system": "你是手机自动化助手,回答尽量简短。", "image": "screen"})
284
+
285
+ # 只看屏幕某个区域
286
+ price = ai.ask("这个区域里的价格是多少?只回答数字", {"image": "screen", "x": 0, "y": 300, "ex": 750, "ey": 500})
287
+
288
+ # 失败处理
289
+ r = ai.ask("你好")
290
+ if r is None:
291
+ print(ai.lastError())
292
+ ```
293
+
294
+ ### judge - 是非判断。
295
+
296
+ ```python
297
+ def judge(question: str, options: Optional[Dict[str, Any]] = None) -> bool:
298
+ ```
299
+
300
+ 让模型只回答 yes / no,并解析成布尔值。适合做流程分支:「有没有弹窗」「是否到了首页」。
301
+
302
+ **参数:**
303
+
304
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
305
+ | ---------- | ---------------- | -------- | ------ | ------------ |
306
+ | `question` | str | 是 | - | 要判断的问题 |
307
+ | `options` | `Dict[str, Any]` | 否 | `None` | 同 `ask` |
308
+
309
+ **返回值:**
310
+
311
+ | 类型 | 描述 |
312
+ | ------ | ----------------------------------------------------------------------------- |
313
+ | `bool` | 模型回答肯定为 `True`;否定或请求失败为 `False`,失败时 `lastError()` 有内容 |
314
+
315
+ **示例:**
316
+
317
+ ```python
318
+ from kuaijs import ai, action
319
+ import time
320
+
321
+ if ai.judge("屏幕上是否出现了「领取成功」?", {"image": "screen"}):
322
+ print("领取成功")
323
+
324
+ # 只看顶部区域,省 token
325
+ while not ai.judge("顶部是否显示「首页」?", {"image": "screen", "x": 0, "y": 0, "ex": 0, "ey": 200}):
326
+ action.click(375, 1500)
327
+ time.sleep(1)
328
+
329
+ # 区分「回答否」和「请求失败」
330
+ ok = ai.judge("是否已登录?", {"image": "screen"})
331
+ if not ok and ai.lastError():
332
+ print("请求失败:", ai.lastError())
333
+ ```
334
+
335
+ ### extract - 从图片或文本里提取结构化数据。
336
+
337
+ ```python
338
+ def extract(prompt: str, options: Optional[Dict[str, Any]] = None) -> Optional[Any]:
339
+ ```
340
+
341
+ 要求模型输出 JSON 并自动解析。对象返回 namespace(属性访问),数组返回 `list`。`schema` 用来告诉模型你想要的结构。
342
+
343
+ **参数:**
344
+
345
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
346
+ | --------- | ---------------- | -------- | ------ | ---------------------------------------------- |
347
+ | `prompt` | str | 是 | - | 提取要求 |
348
+ | `options` | `Dict[str, Any]` | 否 | `None` | 同 `ask`,另支持 `schema`(字符串、字典或列表) |
349
+
350
+ **返回值:**
351
+
352
+ | 类型 | 描述 |
353
+ | --------------- | --------------------------------------------------------- |
354
+ | `Optional[Any]` | 解析后的数据;模型没有输出合法 JSON 或请求失败返回 `None` |
355
+
356
+ **示例:**
357
+
358
+ ```python
359
+ from kuaijs import ai, action, ime
360
+
361
+ # 提取验证码
362
+ d = ai.extract("提取图中的验证码", {
363
+ "image": "screen", "x": 100, "y": 800, "ex": 600, "ey": 900,
364
+ "schema": {"code": "string"},
365
+ })
366
+ if d:
367
+ ime.input(d.code)
368
+
369
+ # 提取列表
370
+ items = ai.extract("列出屏幕上所有商品的名称和价格", {
371
+ "image": "screen", "schema": [{"name": "string", "price": "number"}],
372
+ })
373
+ if items:
374
+ for it in items:
375
+ print(it.name, it.price)
376
+
377
+ # 让模型给坐标(配合 action.click)
378
+ pos = ai.extract("找到「立即购买」按钮,给出它的中心点像素坐标", {
379
+ "image": "screen", "schema": {"x": "number", "y": "number"},
380
+ })
381
+ if pos:
382
+ action.click(pos.x, pos.y)
383
+ ```
384
+
385
+ ### chat - 多轮对话。
386
+
387
+ ```python
388
+ def chat(messages: List[Union[Dict[str, Any], str]], options: Optional[Dict[str, Any]] = None) -> Optional[str]:
389
+ ```
390
+
391
+ 自己维护完整对话历史时用它;`ask` 是它的单轮封装。模块不记会话,每次都要把到目前为止的消息整表传进来。
392
+
393
+ 图片写在**那一条 user 消息**上,不要用 `options["image"]`。`options["system"]` 也不生效,系统提示写成第一条 `{"role": "system", "content": "..."}`。
394
+
395
+ 失败返回 `None`:不要把空回复推进历史,否则下一轮变成 `user → assistant(None) → user`,Anthropic 会 400。Anthropic 协议下模块会自动合并连续同角色、并在首条是 assistant 时垫一条占位 user;OpenAI 兼容口更宽松,不必为此改脚本。
396
+
397
+ **参数:**
398
+
399
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
400
+ | ---------- | ---------------------------------- | -------- | ------ | ------------------------------------------------------------------------------------- |
401
+ | `messages` | `List[Union[Dict[str, Any], str]]` | 是 | - | 每项 `{"role", "content", 可选 image / x / y / ex / ey / images}`;直接写字符串等于 `user` 消息 |
402
+ | `options` | `Dict[str, Any]` | 否 | `None` | `provider` / `model` / `temperature` / `maxTokens` / `json` / `timeout` |
403
+
404
+ **返回值:**
405
+
406
+ | 类型 | 描述 |
407
+ | --------------- | ------------------------- |
408
+ | `Optional[str]` | 回复文本;失败返回 `None` |
409
+
410
+ **示例:**
411
+
412
+ ```python
413
+ from kuaijs import ai
414
+
415
+ history = [{"role": "system", "content": "你是手机自动化助手"}]
416
+
417
+ def talk(content, extra=None):
418
+ msg = {"role": "user", "content": content}
419
+ if extra:
420
+ msg.update(extra)
421
+ history.append(msg)
422
+ reply = ai.chat(history)
423
+ if reply is None:
424
+ history.pop()
425
+ print(ai.lastError())
426
+ return None
427
+ history.append({"role": "assistant", "content": reply})
428
+ return reply
429
+
430
+ talk("看下现在在哪个页面", {"image": "screen"})
431
+ talk("那下一步该点哪里?")
432
+ ```
433
+
434
+ ### parseJson - 从模型文本里解析 JSON。
435
+
436
+ ```python
437
+ def parseJson(text: str) -> Optional[Any]:
438
+ ```
439
+
440
+ 自动剥掉 Markdown 代码块和前后的解释文字。`extract` 内部就是用它解析。
441
+
442
+ **参数:**
443
+
444
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
445
+ | ------ | ---- | -------- | ------ | -------- |
446
+ | `text` | str | 是 | - | 模型输出 |
447
+
448
+ **返回值:**
449
+
450
+ | 类型 | 描述 |
451
+ | --------------- | ------------------------------------------------- |
452
+ | `Optional[Any]` | 对象为 namespace,数组为 `list`;失败返回 `None` |
453
+
454
+ ### lastError - 最近一次调用失败的原因。
455
+
456
+ ```python
457
+ def lastError() -> Optional[str]:
458
+ ```
459
+
460
+ **返回值:**
461
+
462
+ | 类型 | 描述 |
463
+ | --------------- | ------------------------------------- |
464
+ | `Optional[str]` | 错误文案;上一次调用成功时返回 `None` |
465
+
466
+ 常见错误:未登记供应商、Key 错误 / 余额不足(接口返回的原文)、模型不支持图片、图片无效或裁剪越界、超时、模型没有输出 JSON。
@@ -8,45 +8,6 @@
8
8
  from kuaijs import action, cloud, hid, image, appleocr, paddleocr, yolo, yolocls, system, device, file, mysql, netcard, ime, media, hotupdate, tomatoocr, tts, ui, utils, node, pip, logger
9
9
  ```
10
10
 
11
- ## 下载资源
12
-
13
- - 官方网盘下载:[链接](https://pan.kuai.js.cn/#/_/%E5%BF%AB%E7%82%B9JS)
14
-
15
- ## nodejs 环境
16
-
17
- `快点JS` 开发工具基于 nodejs 环境,因此需要先安装 nodejs 环境。
18
-
19
- ## python 环境
20
-
21
- `快点JS` - Python 基于 Python3.14 版本,因此需要先安装 Python3.14 环境。
22
-
23
- 自行安装:`pip install kuaijs-ios` 以获取代码提示
24
-
25
- ## IDE 配置
26
-
27
- ### Visual Studio Code
28
-
29
- `快点JS` 使用 Visual Studio Code 作为主要开发工具,并安装以下扩展:
30
-
31
- #### 必需扩展
32
-
33
- - **`快点JS开发工具`** - 提供 `快点JS` 相关功能,如创建项目、代码补全、图色工具、节点查找、打包软件包 等
34
-
35
- #### 安装步骤
36
-
37
- 1. 打开 Visual Studio Code
38
- 2. 点击左侧扩展图标(或使用快捷键 `Ctrl+Shift+X`)
39
- 3. 在搜索框中输入 `快点JS开发工具`
40
- <img src="/img/DevPlugin.jpg" width="800" alt="安装快点JS开发工具">
41
- 4. 点击安装按钮安装扩展
42
- 5. 安装完成后,重新启动 Visual Studio Code
43
-
44
- ## 创建项目
45
-
46
- - 参照[创建 JS 项目](../quick/createProject.md)创建项目
47
-
48
- - 创建项目时选择 `Python` 作为项目类型
49
-
50
11
  ## 标准库
51
12
 
52
13
  Python 的标准库大部分都是支持的.
@@ -4,7 +4,6 @@
4
4
 
5
5
  - 已安装 Visual Studio Code 和 快点 JS 开发工具插件
6
6
  - 快点 JS 开发工具插件需要登录`快点JS 开发者账号`,才能创建项目,请点击顶部菜单`开发者后台`注册账号
7
- - 快点 JS APP 也需要注册账号才能使用,注意`快点JS APP的账号`和 `快点JS 开发工具插件`的账号是不同的
8
7
  - 快点 JS APP 需要从`快点JS APP` 上<span style="color: red;">注册账号</span>,注册完成后,需要登录`快点JS APP`,才能使用
9
8
 
10
9
  ## 创建项目
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-vite-plugin",
3
- "version": "1.4.74",
3
+ "version": "1.4.76",
4
4
  "type": "commonjs",
5
5
  "license": "MIT",
6
6
  "publishConfig": {