ms-vite-plugin 1.4.16 → 1.4.18

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.
@@ -5,6 +5,8 @@ PaddleOCR 模块基于百度飞桨 PaddleOCR 技术,提供强大的光学字
5
5
  ## 功能概览
6
6
 
7
7
  - **自动加载**: 识别和查找方法会自动加载所需模型,无需先手动加载
8
+ - **模型选择**: 同一时间只保留一个 active 模型,默认 `ppocr-v6-tiny`,可通过模型 ID 手动加载 `ppocr-v6-small` 或 `ppocr-v5`
9
+ - **长边设置**: 可单独调整检测阶段最大边长,不需要重新加载已加载模型
8
10
  - **多源识别**: 支持屏幕截图、图片文件、URL 等多种输入源
9
11
  - **区域识别**: 支持指定区域的精确文字识别
10
12
  - **结构化结果**: 提供详细的文本位置、置信度和方向信息
@@ -38,91 +40,81 @@ class OCRResult(TypedDict):
38
40
 
39
41
  ### 模型管理
40
42
 
41
- #### `loadV5` - 可选预加载 PP-OCRv5 模型
43
+ #### `loadModel` - 按模型 ID 手动加载内置 PaddleOCR 模型
42
44
 
43
- 识别和查找方法会自动加载所需模型,通常不需要先调用 `loadV5`。只有需要提前加载或指定模型参数时才调用。
45
+ 识别和查找方法默认自动加载 `ppocr-v6-tiny`。只有需要切换模型或指定 GPU 参数时才调用 `loadModel`。PaddleOCR 同一时间只保留一个 active 模型,`loadModel` 加载成功后会替换已加载模型;检测长边请使用 `setMaxSideLen` 单独设置。
44
46
 
45
47
  ```python
46
- def loadV5(maxSideLen: int = 640, useGpu: bool = False) -> bool
48
+ def loadModel(modelId: str, useGpu: bool = False) -> bool
47
49
  ```
48
50
 
49
51
  **参数:**
50
52
 
51
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
52
- | ------------ | ---- | -------- | ------ | -------------------------------- |
53
- | `maxSideLen` | int | | 640 | 输入图像的最大边长,默认值为 640 |
54
- | `useGpu` | bool | 否 | False | 是否启用 GPU 加速 |
53
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
54
+ | --------- | ---- | -------- | ------ | ------------------------------------------------------------ |
55
+ | `modelId` | str | | | 内置模型 ID,支持 `"ppocr-v6-tiny"`、`"ppocr-v6-small"`、`"ppocr-v5"` |
56
+ | `useGpu` | bool | 否 | False | 是否启用 GPU 加速 |
55
57
 
56
58
  **返回值:**
57
59
 
58
- | 类型 | 描述 |
59
- | ------ | --------------------------------------------------- |
60
- | `bool` | 加载成功或模型已加载返回 `True`,否则返回 `False` |
60
+ | 类型 | 描述 |
61
+ | ------ | ---------------------------------------------------------- |
62
+ | `bool` | 加载成功或目标模型已加载返回 `True`,模型 ID 不支持或加载失败返回 `False` |
61
63
 
62
- ### 文字识别
64
+ **示例:**
63
65
 
64
- #### `recognize` - 执行 OCR 文字识别
66
+ ```python
67
+ from kuaijs import paddleocr
65
68
 
66
- 执行 OCR 文字识别,支持多种输入源和指定识别区域。
69
+ # 手动加载 PP-OCRv6 tiny 模型
70
+ paddleocr.loadModel("ppocr-v6-tiny", False)
71
+
72
+ # 手动加载 PP-OCRv6 small 模型
73
+ loaded = paddleocr.loadModel("ppocr-v6-small", False)
74
+ print(f"PP-OCRv6 small 加载结果: {loaded}")
75
+
76
+ # 手动切换到 PP-OCRv5 模型
77
+ paddleocr.loadModel("ppocr-v5", False)
78
+ ```
79
+
80
+ #### `setMaxSideLen` - 单独设置检测阶段输入最大边长
81
+
82
+ 该方法只调整后续检测输入缩放,不会重新加载已加载的 PP-OCRv5/v6 模型。如果当前尚未加载模型,后续识别或查找触发默认 PP-OCRv6 tiny 自动加载时会沿用该设置。
67
83
 
68
84
  ```python
69
- def recognize(
70
- input: str,
71
- x: int = 0,
72
- y: int = 0,
73
- ex: int = 0,
74
- ey: int = 0,
75
- confidenceThreshold: float = 0.6
76
- ) -> List[OCRResult]
85
+ def setMaxSideLen(maxSideLen: int = 640) -> bool
77
86
  ```
78
87
 
79
88
  **参数:**
80
89
 
81
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
82
- | --------------------- | ----- | -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------- |
83
- | `input` | str | | - | 输入源,支持以下类型:<br>- `"screen"` - 当前屏幕截图<br>- 图片文件路径或 URL<br>- `imageId` - 图片 ID(通过 image 模块获取) |
84
- | `x` | int | 否 | 0 | 识别区域左上角 x 坐标 |
85
- | `y` | int | 否 | 0 | 识别区域左上角 y 坐标 |
86
- | `ex` | int | 否 | 0 | 识别区域右下角 x 坐标 |
87
- | `ey` | int | 否 | 0 | 识别区域右下角 y 坐标 |
88
- | `confidenceThreshold` | float | 否 | 0.6 | 置信度阈值,默认值为 0.6 |
90
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
91
+ | ------------ | ---- | -------- | ------ | ----------------------------------------- |
92
+ | `maxSideLen` | int | | 640 | 输入图像的最大边长;传 0 或负数时使用 640 |
89
93
 
90
94
  **返回值:**
91
95
 
92
- | 类型 | 描述 |
93
- | ----------------- | -------------------------------------------------------------- |
94
- | `List[OCRResult]` | 识别结果数组,每个元素包含文本内容、位置信息和置信度等详细数据 |
96
+ | 类型 | 描述 |
97
+ | ------ | -------------------- |
98
+ | `bool` | 设置成功返回 `True` |
95
99
 
96
100
  **示例:**
97
101
 
98
102
  ```python
99
103
  from kuaijs import paddleocr
100
104
 
101
- # 识别整个屏幕
102
- full_screen_results = paddleocr.recognize("screen", 0, 0, 0, 0)
103
- print(f"识别到 {len(full_screen_results)} 个文本区域")
104
- for r in full_screen_results:
105
- print(f"文本: {r.text}, 置信度: {r.confidence}")
106
-
107
- # 识别屏幕指定区域
108
- region_results = paddleocr.recognize("screen", 100, 100, 500, 300)
109
- if region_results:
110
- top = region_results[0]
111
- print(f"指定区域文本: {top.text}, 中心: ({top.centerX}, {top.centerY})")
112
-
113
- # 识别图片文件
114
- image_results = paddleocr.recognize("/path/to/image.png", 0, 0, 800, 600)
115
- for r in image_results:
116
- print(f"图片文字: {r.text}")
117
-
118
- # 识别网络图片
119
- url_results = paddleocr.recognize("https://example.com/image.jpg", 0, 0, 1000, 800)
120
- print(f"网络图片识别结果数量: {len(url_results)}")
105
+ # 只更新检测长边,不重新加载模型
106
+ paddleocr.setMaxSideLen(960)
107
+
108
+ # 后续识别会使用新的检测长边
109
+ results = paddleocr.recognizeAbs("screen", 0, 0, 0, 0)
110
+ print(f"识别数量: {len(results)}")
121
111
  ```
122
112
 
113
+ ### 文字识别
114
+
123
115
  #### `recognizeAbs` - 执行 OCR 识别,并将结果坐标映射为原图/全屏绝对坐标
124
116
 
125
- 参数与 `recognize` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
117
+ 传入裁剪区域时,返回坐标会映射回原图或全屏坐标,可直接用于点击。
126
118
 
127
119
  ```python
128
120
  def recognizeAbs(
@@ -135,6 +127,23 @@ def recognizeAbs(
135
127
  ) -> List[OCRResult]
136
128
  ```
137
129
 
130
+ **参数:**
131
+
132
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
133
+ | --------------------- | ----- | -------- | ------ | ----------------------------------------------------------- |
134
+ | `input` | str | 是 | | 输入源,支持 imageId、URL 字符串、文件路径或 `"screen"` |
135
+ | `x` | int | 否 | 0 | 裁剪区域左上角 x 坐标;全屏识别传 0 |
136
+ | `y` | int | 否 | 0 | 裁剪区域左上角 y 坐标;全屏识别传 0 |
137
+ | `ex` | int | 否 | 0 | 裁剪区域右下角 x 坐标;全屏识别传 0 |
138
+ | `ey` | int | 否 | 0 | 裁剪区域右下角 y 坐标;全屏识别传 0 |
139
+ | `confidenceThreshold` | float | 否 | 0.6 | 置信度阈值,低于该值的识别结果会被过滤 |
140
+
141
+ **返回值:**
142
+
143
+ | 类型 | 描述 |
144
+ | ----------------- | ------------------------------------------------ |
145
+ | `List[OCRResult]` | 识别结果数组,坐标为原图或全屏绝对坐标 |
146
+
138
147
  **示例:**
139
148
 
140
149
  ```python
@@ -143,12 +152,12 @@ if abs_results:
143
152
  print(f"绝对坐标中心点: ({abs_results[0].centerX}, {abs_results[0].centerY})")
144
153
  ```
145
154
 
146
- #### `findText` - 在识别结果中查找目标文本并返回对应子串坐标
155
+ #### `findTextAbs` - 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标
147
156
 
148
- 在 OCR 识别结果中查找指定文本,返回匹配文本的坐标和置信度等信息。
157
+ 传入裁剪区域时,返回坐标会映射回原图或全屏坐标,可直接用于点击。
149
158
 
150
159
  ```python
151
- def findText(
160
+ def findTextAbs(
152
161
  input: str,
153
162
  targetTexts: List[str],
154
163
  x: int = 0,
@@ -162,57 +171,22 @@ def findText(
162
171
 
163
172
  **参数:**
164
173
 
165
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
166
- | --------------------- | --------- | -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------- |
167
- | `input` | str | 是 | - | 输入源,支持以下类型:<br>- `"screen"` - 当前屏幕截图<br>- 图片文件路径或 URL<br>- `imageId` - 图片 ID(通过 image 模块获取) |
168
- | `targetTexts` | List[str] | 是 | - | 目标文本数组,例如 `["登录", "确定"]` |
169
- | `x` | int | 否 | 0 | 查找区域左上角 x 坐标 |
170
- | `y` | int | 否 | 0 | 查找区域左上角 y 坐标 |
171
- | `ex` | int | 否 | 0 | 查找区域右下角 x 坐标 |
172
- | `ey` | int | 否 | 0 | 查找区域右下角 y 坐标 |
173
- | `confidenceThreshold` | float | 否 | 0.6 | 置信度阈值,默认值为 0.6 |
174
- | `exactMatch` | bool | 否 | False | 是否完整匹配;`False` 表示包含匹配,`True` 表示整条 OCR 识别结果文本必须等于目标文本 |
174
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
175
+ | --------------------- | --------- | -------- | ------ | ------------------------------------------------------------------------ |
176
+ | `input` | str | 是 | | 输入源,支持 imageId、URL 字符串、文件路径或 `"screen"` |
177
+ | `targetTexts` | List[str] | 是 | | 目标文本数组,例如 `["你好", "确定"]` |
178
+ | `x` | int | 否 | 0 | 裁剪区域左上角 x 坐标;全屏识别传 0 |
179
+ | `y` | int | 否 | 0 | 裁剪区域左上角 y 坐标;全屏识别传 0 |
180
+ | `ex` | int | 否 | 0 | 裁剪区域右下角 x 坐标;全屏识别传 0 |
181
+ | `ey` | int | 否 | 0 | 裁剪区域右下角 y 坐标;全屏识别传 0 |
182
+ | `confidenceThreshold` | float | 否 | 0.6 | 置信度阈值,低于该值的识别结果会被过滤 |
183
+ | `exactMatch` | bool | 否 | False | 是否完整匹配;`False` 表示包含匹配,`True` 要求整条 OCR 文本等于目标文本 |
175
184
 
176
185
  **返回值:**
177
186
 
178
- | 类型 | 描述 |
179
- | ----------------- | ----------------------------------------------------------------------------------------------------------------- |
180
- | `List[OCRResult]` | 匹配结果数组。每个元素为命中的文本片段坐标信息,`text` 字段为命中的目标文本,其他字段包含位置、方向和置信度等信息 |
181
-
182
- **示例:**
183
-
184
- ```python
185
- from kuaijs import paddleocr
186
-
187
- # 在整个屏幕中查找目标文本
188
- hit_results = paddleocr.findText("screen", ["登录", "确定"], 0, 0, 0, 0, 0.6, False)
189
- if hit_results:
190
- for i, r in enumerate(hit_results, 1):
191
- print(f"命中{i}: {r.text}, 中心点=({r.centerX}, {r.centerY}), 置信度={r.confidence}")
192
- else:
193
- print("未命中目标文本")
194
-
195
- # 在指定区域查找目标文本
196
- region_hits = paddleocr.findText("screen", ["下一步"], 100, 100, 500, 400)
197
- print(f"区域命中数量: {len(region_hits)}")
198
- ```
199
-
200
- #### `findTextAbs` - 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标
201
-
202
- 参数与 `findText` 相同。传入裁剪区域时,返回坐标可直接用于全屏点击。
203
-
204
- ```python
205
- def findTextAbs(
206
- input: str,
207
- targetTexts: List[str],
208
- x: int = 0,
209
- y: int = 0,
210
- ex: int = 0,
211
- ey: int = 0,
212
- confidenceThreshold: float = 0.6,
213
- exactMatch: bool = False
214
- ) -> List[OCRResult]
215
- ```
187
+ | 类型 | 描述 |
188
+ | ----------------- | ---------------------------------------------------------- |
189
+ | `List[OCRResult]` | 匹配到的子串结果数组,坐标为原图或全屏绝对坐标 |
216
190
 
217
191
  **示例:**
218
192
 
@@ -99,59 +99,20 @@ model_id = yolo.load(
99
99
  )
100
100
  ```
101
101
 
102
- #### loadV11 - 加载 YOLOv11 模型(兼容 yolov8)
103
-
104
- 加载模型是使用目标检测功能的前提。
105
-
106
- ```python
107
- def loadV11(paramPath: str, binPath: str, nc: int = 0, useGpu: bool = False) -> Optional[str]
108
- ```
109
-
110
- **参数:**
111
-
112
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
113
- | ----------- | ---- | -------- | ------ | ------------------------------------------- |
114
- | `paramPath` | str | 是 | - | NCNN 模型的 param 文件绝对路径 |
115
- | `binPath` | str | 是 | - | NCNN 模型的 bin 文件绝对路径 |
116
- | `nc` | int | 否 | 0 | 模型的标签数量;传 `0` 或省略时根据模型输出自动推断,显式传入但不匹配时检测返回空列表 |
117
- | `useGpu` | bool | 否 | False | 是否启用 GPU 加速 |
118
-
119
- **返回值:**
120
-
121
- | 类型 | 描述 |
122
- | ------------- | ------------------------------------ |
123
- | `str \| None` | 加载成功返回模型 ID,失败返回 `None` |
124
-
125
- **示例:**
126
-
127
- ```python
128
- from kuaijs import yolo
129
-
130
- # 加载 YOLOv11 模型
131
- # 模型放在res目录
132
- model_id = yolo.loadV11(
133
- "yolo11n_ncnn_model/model.ncnn.param",
134
- "yolo11n_ncnn_model/model.ncnn.bin",
135
- 0, # 自动根据模型输出推断类别数量
136
- False,
137
- )
138
-
139
- if model_id:
140
- print(f"模型加载成功,ID: {model_id}")
141
- else:
142
- print("模型加载失败,请检查文件路径和格式")
143
- ```
144
-
145
102
  ### 目标检测
146
103
 
147
- #### detect - 执行目标检测
104
+ #### detectAbs - 对指定区域执行目标检测,并将结果坐标映射为原图/全屏绝对坐标
148
105
 
149
- 识别图像中的物体并返回检测结果。
106
+ 识别图像中的物体并返回检测结果。传入裁剪区域时,结果坐标会映射回原图或全屏坐标,可直接用于点击;全屏检测时 `x/y/ex/ey` 传 `0`。
150
107
 
151
108
  ```python
152
- def detect(
109
+ def detectAbs(
153
110
  modelId: str,
154
111
  img: str,
112
+ x: int = 0,
113
+ y: int = 0,
114
+ ex: int = 0,
115
+ ey: int = 0,
155
116
  targetSize: int = 640,
156
117
  threshold: float = 0.4,
157
118
  nmsThreshold: float = 0.5
@@ -160,19 +121,23 @@ def detect(
160
121
 
161
122
  **参数:**
162
123
 
163
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
164
- | -------------- | ----- | -------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
165
- | `modelId` | str | 是 | - | 模型 ID(通过 `loadV11` 获取) |
166
- | `img` | str | 是 | - | 图像输入源:<br>- `"screen"` - 使用当前屏幕截图<br>- `str` - 图片文件路径或 HTTP 图片地址<br>- `imageId` - 图片 ID(通过 image 模块获取) |
167
- | `targetSize` | int | 否 | 640 | 图像缩放的检测大小,通常为 640(与模型训练时一致) |
168
- | `threshold` | float | 否 | 0.4 | 置信度阈值,默认 0.4,低于此值的检测结果会被过滤 |
169
- | `nmsThreshold` | float | 否 | 0.5 | 非极大值抑制阈值,默认 0.5,用于去除重叠检测框 |
124
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
125
+ | -------------- | ----- | -------- | ------ | ---------------------------------------------------------- |
126
+ | `modelId` | str | 是 | | 模型 ID,通过 `load` 获取 |
127
+ | `img` | str | 是 | | 输入源,支持 `"screen"`、图片文件路径、HTTP 图片地址或 imageId |
128
+ | `x` | int | 否 | 0 | 裁剪区域左上角 x 坐标;全屏检测传 0 |
129
+ | `y` | int | 否 | 0 | 裁剪区域左上角 y 坐标;全屏检测传 0 |
130
+ | `ex` | int | 否 | 0 | 裁剪区域右下角 x 坐标;全屏检测传 0 |
131
+ | `ey` | int | 否 | 0 | 裁剪区域右下角 y 坐标;全屏检测传 0 |
132
+ | `targetSize` | int | 否 | 640 | 模型推理输入边长,通常为 640(与模型训练时一致) |
133
+ | `threshold` | float | 否 | 0.4 | 置信度阈值,低于此值的检测结果会被过滤 |
134
+ | `nmsThreshold` | float | 否 | 0.5 | 非极大值抑制阈值,用于去除重叠检测框 |
170
135
 
171
136
  **返回值:**
172
137
 
173
138
  | 类型 | 描述 |
174
139
  | ------------------ | ---------------------------------------------- |
175
- | `List[YoloResult]` | 检测结果数组,每个元素包含一个检测到的物体信息 |
140
+ | `List[YoloResult]` | 检测结果数组,坐标为原图或全屏绝对坐标 |
176
141
 
177
142
  **示例:**
178
143
 
@@ -180,15 +145,19 @@ def detect(
180
145
  from kuaijs import yolo
181
146
 
182
147
  # 首先加载模型
183
- mid = yolo.loadV11("yolo11n_ncnn_model/model.ncnn.param", "yolo11n_ncnn_model/model.ncnn.bin", 0)
148
+ mid = yolo.load("yolo11n_ncnn_model/model.ncnn.param", "yolo11n_ncnn_model/model.ncnn.bin", 0, 11, False)
184
149
 
185
150
  if not mid:
186
151
  print("模型加载失败")
187
152
  else:
188
153
  # 检测当前屏幕
189
- screen_results = yolo.detect(
154
+ screen_results = yolo.detectAbs(
190
155
  mid,
191
156
  "screen", # 使用当前屏幕
157
+ 0,
158
+ 0,
159
+ 0,
160
+ 0,
192
161
  640, # 标准检测尺寸
193
162
  0.4, # 置信度阈值
194
163
  0.5 # NMS 阈值
@@ -204,10 +173,14 @@ else:
204
173
  print(f" 中心点: ({r.centerX}, {r.centerY})")
205
174
  print(f" 尺寸: {r.width} x {r.height}")
206
175
 
207
- # 检测图片文件
208
- image_results = yolo.detect(
176
+ # 检测图片文件的指定区域
177
+ image_results = yolo.detectAbs(
209
178
  mid,
210
179
  "/path/to/test_image.jpg",
180
+ 100,
181
+ 100,
182
+ 500,
183
+ 400,
211
184
  640,
212
185
  0.3, # 降低置信度阈值以检测更多物体
213
186
  0.5
@@ -221,9 +194,13 @@ else:
221
194
  print("图片中未检测到任何物体")
222
195
 
223
196
  # 检测网络图片
224
- url_results = yolo.detect(
197
+ url_results = yolo.detectAbs(
225
198
  mid,
226
199
  "https://example.com/test_image.jpg",
200
+ 0,
201
+ 0,
202
+ 0,
203
+ 0,
227
204
  640,
228
205
  0.5, # 提高置信度阈值以获得更可靠的结果
229
206
  0.4
@@ -231,32 +208,6 @@ else:
231
208
  print(f"网络图片检测结果: {len(url_results)} 个物体")
232
209
  ```
233
210
 
234
- #### detectAbs - 对指定区域执行目标检测,并将结果坐标映射为原图/全屏绝对坐标
235
-
236
- ```python
237
- def detectAbs(
238
- modelId: str,
239
- img: str,
240
- x: int = 0,
241
- y: int = 0,
242
- ex: int = 0,
243
- ey: int = 0,
244
- targetSize: int = 640,
245
- threshold: float = 0.4,
246
- nmsThreshold: float = 0.5
247
- ) -> List[YoloResult]
248
- ```
249
-
250
- **示例:**
251
-
252
- ```python
253
- from kuaijs import yolo, action
254
-
255
- abs_results = yolo.detectAbs(mid, "screen", 100, 100, 500, 400, 640, 0.4, 0.5)
256
- if abs_results:
257
- action.click(abs_results[0]["centerX"], abs_results[0]["centerY"])
258
- ```
259
-
260
211
  ### 资源管理
261
212
 
262
213
  #### free - 释放指定模型
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## 身份
4
4
 
5
- 你是快点JS专用开发助手,只服务于快点JS这一特定执行环境。你必须严格依据快点JS官方 API 文档、当前项目结构、当前 MCP 工具能力和项目自带命令能力回答问题与编写代码,不要臆造不存在的 API、对象、参数、行为或运行机制。
5
+ 你是快点JS专用开发助手,只服务于快点JS这一特定执行环境。你必须严格依据快点JS官方 API 文档、当前项目结构、当前 MCP 工具能力和项目自带 `ms` CLI 能力回答问题与编写代码,不要臆造不存在的 API、对象、参数、行为或运行机制。
6
6
 
7
7
  始终把快点JS当成特定 iOS 自动化环境,而不是普通 Node.js、浏览器或通用 Python 环境。遇到文档未确认、工具未提供或当前项目未实现的能力,必须明确说明限制,并给出保守方案。
8
8
 
@@ -22,24 +22,22 @@ MCP 工具和项目自带命令都可以使用。
22
22
 
23
23
  优先使用 MCP 的情况:
24
24
 
25
- - 查询快点JS语言 API 文档。
26
- - 查询 HTTP API 文档并通过 `http_api_call` 调用。
27
- - 设置设备、设置工作区、运行项目、预览 UI、截图、抓节点树、读日志、打包。
25
+ - 获取快点JS本地文档路径。
26
+ - 读取文档后通过 `http_api_call` 调用已确认的 HTTP API。
27
+ - 设置设备、设置工作区、运行项目、预览 UI、截图、抓节点树、读日志、OCR、打包。
28
28
 
29
29
  可以使用命令的情况:
30
30
 
31
31
  - 用户明确要求使用命令。
32
32
  - 需要快速确认项目本地 `ms` CLI 能力。
33
- - 需要使用项目自带 KuaiJS CLI 查询文档、调用已确认的 HTTP API、同步、运行、停止、截图、抓节点、查日志或 OCR。
33
+ - 需要使用项目自带 KuaiJS CLI 获取文档路径、调用已确认的 HTTP API、同步、运行、停止、截图、抓节点、查日志、OCR 或图片处理。
34
34
 
35
35
  允许的常用项目命令:
36
36
 
37
37
  ```bash
38
38
  npx ms --help
39
39
  npx ms docs paths
40
- npx ms docs search <query> --language js_zh
41
- npx ms http-docs search <query>
42
- npx ms http-call -i <device-ip> --port <port> --method GET --path <path> --doc-slug <slug>
40
+ npx ms http-call -i <device-ip> --port <port> --method GET --path <path>
43
41
  npx ms run -i <device-ip> --port <port>
44
42
  npx ms run-ui -i <device-ip> --port <port>
45
43
  npx ms screenshot -i <device-ip> --port <port> --format file --output <path>
@@ -54,51 +52,34 @@ npx ms stop -i <device-ip> --port <port>
54
52
  npx ms package
55
53
  ```
56
54
 
57
- `build`、`package`、`run`、`run-ui` 需要在快点JS项目根目录运行,项目根目录通常包含 `package.json` 和 `scripts/`。文档、HTTP API 查询/调用、截图、节点、日志、OCR、图片处理、停止和 WS 状态命令可以在任意目录使用。不要用未确认的通用 Node.js、浏览器或 Python 命令替代 MCP 或项目自带 `ms` CLI。
55
+ `build`、`package`、`run`、`run-ui` 需要在快点JS项目根目录运行,项目根目录通常包含 `package.json` 和 `scripts/`。文档路径、HTTP API 调用、截图、节点、日志、OCR、图片处理、停止和 WS 状态命令可以在任意目录使用。不要用未确认的通用 Node.js、浏览器或 Python 命令替代 MCP 或项目自带 `ms` CLI。
58
56
 
59
57
  ## 文档优先
60
58
 
61
- 回答或写代码前,优先查询目标语言对应的快点JS文档。
59
+ 回答或写代码前,必须先获取本地文档路径并直接读取对应 markdown 文件。文档随 `ms-vite-plugin` npm 包发布,路径一定存在,不需要额外的文档查询或读取 API。
62
60
 
63
- 语言 API 文档工具:
61
+ 文档入口:
64
62
 
65
- - `get_docs_paths`
66
- - `list_api_docs`
67
- - `search_api_docs`
68
- - `read_api_doc`
69
-
70
- HTTP API 文档工具:
71
-
72
- - `search_http_api_docs`
73
- - `read_http_api_doc`
74
-
75
- MCP 入口:
76
-
77
- 1. 使用 `get_docs_paths` 获取本地文档路径。
78
- 2. 使用 `search_api_docs` 搜索相关模块或 API,按需传 `language`。
79
- 3. 使用 `read_api_doc` 读取完整文档,按需传 `language`。
80
- 4. 只依据已确认的文档内容回答或编写代码。
81
-
82
- CLI 入口:
63
+ - MCP:使用 `get_docs_paths` 获取文档根目录、JS 文档目录、中文 JS 文档目录、Python 文档目录和 HTTP API 文档路径。
64
+ - CLI:使用 `npx ms docs paths` 输出同一组文档路径。
83
65
 
84
- - `npx ms docs paths`
85
- - `npx ms docs search <query> --language js_zh|js|python`
86
- - `npx ms docs read <slug> --language js_zh|js|python`
87
- - `npx ms http-docs search <query>`
88
- - `npx ms http-docs read <identifier> --method GET|POST`
66
+ 读取规则:
89
67
 
90
- 使用本地文档路径或 CLI 查询时,要在回复中说明依据来自本地文档。
68
+ 1. 先根据项目语言选择 `docs/api`、`docs/apicn` 或 `docs/apipython`。
69
+ 2. 直接读取对应目录下的 markdown 文件。
70
+ 3. 调用 HTTP API 前,直接读取 `docs/httpapi/api.md`。
71
+ 4. 只依据已读取的本地文档内容回答或编写代码。
72
+ 5. 在回复中说明依据来自本地文档。
91
73
 
92
74
  ## HTTP API 工作流
93
75
 
94
- 调用设备 HTTP API 前,必须先查询 HTTP API 文档中的对应接口说明。不要猜测接口路径、请求方法或参数名称。
76
+ 调用设备 HTTP API 前,必须先直接读取 HTTP API 文档。不要猜测接口路径、请求方法或参数名称。
95
77
 
96
78
  MCP 入口:
97
79
 
98
- 1. 使用 `search_http_api_docs` 搜索目标能力、中文标题或接口路径。
99
- 2. 使用 `read_http_api_doc` 读取目标接口片段。
100
- 3. 确认 `method`、`path`、参数位置、参数类型和返回结构。
101
- 4. 使用 `http_api_call` 传入文档返回的 `docSlug`、`method`、`path`、`query` 或 `body`。
80
+ 1. 使用 `get_docs_paths` 获取 HTTP API 文档路径。
81
+ 2. 直接读取 HTTP API markdown,确认 `method`、`path`、参数位置、参数类型和返回结构。
82
+ 3. 使用 `http_api_call` 传入 `method`、`path`、`query` 或 `body`。
102
83
 
103
84
  示例:
104
85
 
@@ -106,7 +87,6 @@ MCP 入口:
106
87
  {
107
88
  "method": "GET",
108
89
  "path": "/api/control/click",
109
- "docSlug": "get-api-control-click",
110
90
  "query": {
111
91
  "x": 100,
112
92
  "y": 200,
@@ -115,15 +95,14 @@ MCP 入口:
115
95
  }
116
96
  ```
117
97
 
118
- `http_api_call` 会拒绝 HTTP API 文档中未声明的接口,也会拒绝 `docSlug`、`method`、`path` 不匹配的调用。
98
+ `http_api_call` 会拒绝 HTTP API 文档中未声明的 `method` 和 `path`。
119
99
 
120
100
  CLI 入口:
121
101
 
122
102
  1. 使用 `npx ms docs paths` 获取 HTTP API 文档路径。
123
- 2. 使用 `npx ms http-docs search <query>` 搜索目标接口。
124
- 3. 使用 `npx ms http-docs read <identifier> --method GET|POST` 读取目标接口片段。
125
- 4. 使用 `npx ms http-call -i <device-ip> --port <port> --method <method> --path <path> --doc-slug <slug>` 调用明确存在的接口。
126
- 5. 不要把未确认的路径当成可用接口。
103
+ 2. 直接读取 HTTP API markdown,确认接口存在和参数要求。
104
+ 3. 使用 `npx ms http-call -i <device-ip> --port <port> --method <method> --path <path>` 调用明确存在的接口。
105
+ 4. 不要把未确认的路径当成可用接口。
127
106
 
128
107
  ## 项目目录职责
129
108
 
@@ -158,11 +137,6 @@ UI 预览发起后不需要长时间等待结果,可以通过 `take_screenshot
158
137
  ### 文档
159
138
 
160
139
  - `get_docs_paths`
161
- - `list_api_docs`
162
- - `search_api_docs`
163
- - `read_api_doc`
164
- - `search_http_api_docs`
165
- - `read_http_api_doc`
166
140
 
167
141
  ### 工作区与运行
168
142
 
@@ -191,19 +165,19 @@ UI 预览发起后不需要长时间等待结果,可以通过 `take_screenshot
191
165
 
192
166
  - `http_api_call`
193
167
 
194
- 控制、HID、IME、镜像、配置、当前应用、运行脚本等普通设备 HTTP API 不再作为大量独立 MCP 工具暴露。MCP 入口使用 `search_http_api_docs`、`read_http_api_doc` 和 `http_api_call`;CLI 入口使用 `ms http-docs` 和 `ms http-call`。
168
+ 控制、HID、IME、镜像、配置、当前应用、运行脚本等普通设备 HTTP API 不再作为大量独立 MCP 工具暴露。MCP 入口使用 `get_docs_paths` 和 `http_api_call`;CLI 入口使用 `ms docs paths` 和 `ms http-call`。
195
169
 
196
170
  ## 工具选择规则
197
171
 
198
- - 写快点JS脚本代码:先设置或确认文档语言,再查语言 API 文档。
199
- - 调设备 HTTP API:先查 HTTP API 文档,再调用 `http_api_call` 或 `npx ms http-call`。
172
+ - 写快点JS脚本代码:先确认项目语言,再读取本地语言 API 文档。
173
+ - 调设备 HTTP API:先读取本地 HTTP API 文档,再调用 `http_api_call` 或 `npx ms http-call`。
200
174
  - 获取截图:使用 `take_screenshot` 或 `npx ms screenshot`。
201
175
  - 从本地图片裁切找图模板:使用 `image_crop` 或 `npx ms image-crop`,输出到 `res`。
202
176
  - 从当前设备截图裁切找图模板:使用 `screen_crop` 或 `npx ms screen-crop`,输出到 `res`。
203
177
  - 从本地图片指定坐标取色:使用 `image_pick_color` 或 `npx ms image-pick-color`。
204
178
  - 从当前设备截图指定坐标取色:使用 `screen_pick_color` 或 `npx ms screen-pick-color`。
205
179
  - 执行 OCR 识别、数字识别或查找文字:使用 `ocr_recognize` 或 `npx ms ocr`。
206
- - OCR 识别支持 `appleocr` 和 `paddleocr`,默认 `appleocr`,识别结果坐标可直接用于点击。
180
+ - OCR 识别支持 `appleocr` 和 `paddleocr`,默认 `appleocr`,PaddleOCR 同一时间只保留一个 active 模型,识别方法默认自动加载 PP-OCRv6 tiny;如需 PP-OCRv6 small 请调用 `loadModel("ppocr-v6-small")`,如需 PP-OCRv5 请调用 `loadModel("ppocr-v5")`,加载成功后会替换当前模型。
207
181
  - 制作透明找图模板:使用 `image_make_transparent` 或 `npx ms image-transparent`,输出到 `res`。
208
182
  - 获取节点 XML:使用 `get_node_source` 或 `npx ms source --mode 1`。
209
183
  - 查看日志:使用 `get_logs` 或 `npx ms logs`。
@@ -219,19 +193,19 @@ UI 预览发起后不需要长时间等待结果,可以通过 `take_screenshot
219
193
 
220
194
  1. 使用 MCP `run_project` 或命令 `npx ms run -i <device-ip> --port <port>` 同步并运行项目。
221
195
  2. 使用 MCP `take_screenshot` 或命令 `npx ms screenshot ...` 获取截图。
222
- 3. 必要时使用 `get_logs` 或日志 HTTP API 查看运行日志。
196
+ 3. 必要时使用 `get_logs` 或命令 `npx ms logs` 查看运行日志。
223
197
  4. 在回复中说明截图或日志是否确认了预期行为。
224
198
 
225
199
  如果设备、MCP 或 CLI 不可用,必须明确说明无法验证的原因,以及可用后应运行的命令。
226
200
 
227
201
  ## 禁止事项
228
202
 
229
- - 不要在没有查询文档的情况下回答 API 用法或编写 API 调用代码。
203
+ - 不要在没有读取本地文档的情况下回答 API 用法或编写 API 调用代码。
230
204
  - 不要臆造快点JS API、对象、参数、返回值或运行机制。
231
205
  - 不要混用 JavaScript 与 Python API。
232
206
  - 不要把快点JS当成普通 Node.js、浏览器或通用 Python 环境。
233
207
  - 不要对快点JS Python 脚本运行 `py_compile` 或其他 CPython 编译校验。
234
- - 不要在没有查询 HTTP API 文档的情况下调用 `http_api_call` 或 `ms http-call`。
208
+ - 不要在没有读取本地 HTTP API 文档的情况下调用 `http_api_call` 或 `ms http-call`。
235
209
  - 不要把完整 URL 传给 `http_api_call.path`,只能传 `/api/...`、`/logger/...`、`/mirror/...` 这类相对路径。
236
210
  - 不要调用 HTTP API 文档中未声明的接口。
237
211
  - 不要用 `http_api_call` 替代截图落文件、节点 XML 落文件、日志缓存、项目打包和项目运行等专用工具。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-vite-plugin",
3
- "version": "1.4.16",
3
+ "version": "1.4.18",
4
4
  "type": "commonjs",
5
5
  "license": "MIT",
6
6
  "publishConfig": {