appium-mcp 1.84.0 ā 1.84.2
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.
- package/CHANGELOG.md +12 -0
- package/dist/command.d.ts +9 -0
- package/dist/command.d.ts.map +1 -1
- package/dist/command.js +29 -0
- package/dist/command.js.map +1 -1
- package/dist/tools/interactions/find.d.ts.map +1 -1
- package/dist/tools/interactions/find.js +2 -1
- package/dist/tools/interactions/find.js.map +1 -1
- package/package.json +2 -1
- package/server.json +2 -2
- package/src/command.ts +37 -0
- package/src/tools/interactions/find.ts +6 -1
- package/dist/tests/__mocks__/@appium/support.d.ts +0 -92
- package/dist/tests/__mocks__/@appium/support.d.ts.map +0 -1
- package/dist/tests/__mocks__/@appium/support.js +0 -66
- package/dist/tests/__mocks__/@appium/support.js.map +0 -1
- package/dist/tests/benchmark_model/benchmark_model.d.ts +0 -3
- package/dist/tests/benchmark_model/benchmark_model.d.ts.map +0 -1
- package/dist/tests/benchmark_model/benchmark_model.js +0 -617
- package/dist/tests/benchmark_model/benchmark_model.js.map +0 -1
- package/dist/tests/create-server.test.d.ts +0 -2
- package/dist/tests/create-server.test.d.ts.map +0 -1
- package/dist/tests/create-server.test.js +0 -586
- package/dist/tests/create-server.test.js.map +0 -1
- package/dist/tests/generate-all-locators.test.d.ts +0 -2
- package/dist/tests/generate-all-locators.test.d.ts.map +0 -1
- package/dist/tests/generate-all-locators.test.js +0 -136
- package/dist/tests/generate-all-locators.test.js.map +0 -1
- package/dist/tests/persistence.test.d.ts +0 -2
- package/dist/tests/persistence.test.d.ts.map +0 -1
- package/dist/tests/persistence.test.js +0 -116
- package/dist/tests/persistence.test.js.map +0 -1
- package/dist/tests/plugin.test.d.ts +0 -2
- package/dist/tests/plugin.test.d.ts.map +0 -1
- package/dist/tests/plugin.test.js +0 -399
- package/dist/tests/plugin.test.js.map +0 -1
- package/dist/tests/policy.test.d.ts +0 -2
- package/dist/tests/policy.test.d.ts.map +0 -1
- package/dist/tests/policy.test.js +0 -44
- package/dist/tests/policy.test.js.map +0 -1
- package/dist/tests/screenshot.test.d.ts +0 -2
- package/dist/tests/screenshot.test.d.ts.map +0 -1
- package/dist/tests/screenshot.test.js +0 -243
- package/dist/tests/screenshot.test.js.map +0 -1
- package/dist/tests/session-store.test.d.ts +0 -2
- package/dist/tests/session-store.test.d.ts.map +0 -1
- package/dist/tests/session-store.test.js +0 -459
- package/dist/tests/session-store.test.js.map +0 -1
- package/dist/tests/test-setup-wda.d.ts +0 -2
- package/dist/tests/test-setup-wda.d.ts.map +0 -1
- package/dist/tests/test-setup-wda.js +0 -199
- package/dist/tests/test-setup-wda.js.map +0 -1
- package/dist/tests/tools/evidence.test.d.ts +0 -2
- package/dist/tests/tools/evidence.test.d.ts.map +0 -1
- package/dist/tests/tools/evidence.test.js +0 -158
- package/dist/tests/tools/evidence.test.js.map +0 -1
- package/dist/tests/tools/gestures/ai-element.test.d.ts +0 -2
- package/dist/tests/tools/gestures/ai-element.test.d.ts.map +0 -1
- package/dist/tests/tools/gestures/ai-element.test.js +0 -114
- package/dist/tests/tools/gestures/ai-element.test.js.map +0 -1
- package/dist/tests/tools/gestures/swipe-scroll.test.d.ts +0 -2
- package/dist/tests/tools/gestures/swipe-scroll.test.d.ts.map +0 -1
- package/dist/tests/tools/gestures/swipe-scroll.test.js +0 -63
- package/dist/tests/tools/gestures/swipe-scroll.test.js.map +0 -1
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts +0 -2
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts.map +0 -1
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js +0 -94
- package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js.map +0 -1
- package/dist/tests/tools/llm-wording.test.d.ts +0 -2
- package/dist/tests/tools/llm-wording.test.d.ts.map +0 -1
- package/dist/tests/tools/llm-wording.test.js +0 -89
- package/dist/tests/tools/llm-wording.test.js.map +0 -1
- package/dist/tests/tools/session/device-info.test.d.ts +0 -2
- package/dist/tests/tools/session/device-info.test.d.ts.map +0 -1
- package/dist/tests/tools/session/device-info.test.js +0 -144
- package/dist/tests/tools/session/device-info.test.js.map +0 -1
- package/dist/tests/tools/session/file-transfer.test.d.ts +0 -2
- package/dist/tests/tools/session/file-transfer.test.d.ts.map +0 -1
- package/dist/tests/tools/session/file-transfer.test.js +0 -98
- package/dist/tests/tools/session/file-transfer.test.js.map +0 -1
- package/dist/tests/tools/session/session.test.d.ts +0 -2
- package/dist/tests/tools/session/session.test.d.ts.map +0 -1
- package/dist/tests/tools/session/session.test.js +0 -413
- package/dist/tests/tools/session/session.test.js.map +0 -1
- package/dist/tests/utils/collection.test.d.ts +0 -2
- package/dist/tests/utils/collection.test.d.ts.map +0 -1
- package/dist/tests/utils/collection.test.js +0 -87
- package/dist/tests/utils/collection.test.js.map +0 -1
- package/dist/tests/utils/paths.test.d.ts +0 -2
- package/dist/tests/utils/paths.test.d.ts.map +0 -1
- package/dist/tests/utils/paths.test.js +0 -21
- package/dist/tests/utils/paths.test.js.map +0 -1
- package/dist/tests/verify.test.d.ts +0 -2
- package/dist/tests/verify.test.d.ts.map +0 -1
- package/dist/tests/verify.test.js +0 -148
- package/dist/tests/verify.test.js.map +0 -1
- package/dist/tests/vision-finder.test.d.ts +0 -10
- package/dist/tests/vision-finder.test.d.ts.map +0 -1
- package/dist/tests/vision-finder.test.js +0 -420
- package/dist/tests/vision-finder.test.js.map +0 -1
|
@@ -1,617 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
import * as path from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import { imageUtil } from '@appium/support';
|
|
6
|
-
const sharp = imageUtil.requireSharp();
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = path.dirname(__filename);
|
|
9
|
-
/**
|
|
10
|
-
* Model list for benchmarking
|
|
11
|
-
* Configure coordinate type for each model based on actual test results
|
|
12
|
-
*/
|
|
13
|
-
const MODELS = [
|
|
14
|
-
// Deepseek
|
|
15
|
-
{ name: 'DeepSeek-V3.2', coordType: 'absolute' },
|
|
16
|
-
// Qwen
|
|
17
|
-
{ name: 'qwen3-vl-plus', coordType: 'normalized' },
|
|
18
|
-
{ name: 'qwen3-vl-8b-instruct', coordType: 'normalized' },
|
|
19
|
-
{ name: 'Qwen3-VL-235B-A22B-Instruct', coordType: 'normalized' },
|
|
20
|
-
// tiktok
|
|
21
|
-
{ name: 'doubao-seed-2-0-pro-260215', coordType: 'normalized' },
|
|
22
|
-
// moonshot
|
|
23
|
-
{ name: 'kimi-k2.5', coordType: 'absolute' },
|
|
24
|
-
// openai
|
|
25
|
-
{ name: 'gpt-5.2-pro', coordType: 'absolute' },
|
|
26
|
-
{ name: 'gpt-5.2', coordType: 'absolute' },
|
|
27
|
-
{ name: 'gpt-5.1', coordType: 'absolute' },
|
|
28
|
-
{ name: 'gpt-5-nano', coordType: 'absolute' },
|
|
29
|
-
// claude
|
|
30
|
-
{ name: 'claude-sonnet-4-6', coordType: 'absolute' },
|
|
31
|
-
// google
|
|
32
|
-
{ name: 'gemini-3-flash-preview', coordType: 'absolute' },
|
|
33
|
-
{ name: 'gemini-3-pro-preview', coordType: 'absolute' },
|
|
34
|
-
{ name: 'gemini-2.5-pro', coordType: 'normalized' },
|
|
35
|
-
{ name: 'gemini-2.5-flash', coordType: 'normalized' },
|
|
36
|
-
// xai
|
|
37
|
-
{ name: 'grok-4.1-fast', coordType: 'absolute' },
|
|
38
|
-
];
|
|
39
|
-
/**
|
|
40
|
-
* Generate test prompt with image dimensions
|
|
41
|
-
*/
|
|
42
|
-
function generateTestPrompt(imageWidth, imageHeight) {
|
|
43
|
-
return `You are a professional mobile automation testing expert. Your task is to locate the "Search Button" in the provided UI screenshot.
|
|
44
|
-
|
|
45
|
-
**CRITICAL: Output Format Rules**
|
|
46
|
-
You MUST respond using ONLY this exact format, nothing else:
|
|
47
|
-
|
|
48
|
-
action: **CLICK**
|
|
49
|
-
Parameters: {"target": "<exact visible text or icon description>", "bbox_2d": [<x1>, <y1>, <x2>, <y2>]}
|
|
50
|
-
|
|
51
|
-
**BBox Coordinates**
|
|
52
|
-
- x1: Left edge X coordinate (top-left corner of element)
|
|
53
|
-
- y1: Top edge Y coordinate (top-left corner of element)
|
|
54
|
-
- x2: Right edge X coordinate (bottom-right corner of element)
|
|
55
|
-
- y2: Bottom edge Y coordinate (bottom-right corner of element)
|
|
56
|
-
|
|
57
|
-
**Image Dimensions (ABSOLUTE PIXEL COORDINATES)**
|
|
58
|
-
- Width: ${imageWidth} pixels
|
|
59
|
-
- Height: ${imageHeight} pixels
|
|
60
|
-
- Origin (0,0): Top-left corner
|
|
61
|
-
- Max (${imageWidth}, ${imageHeight}): Bottom-right corner
|
|
62
|
-
- **MUST use integer values between 0-${imageWidth} for x, 0-${imageHeight} for y**
|
|
63
|
-
|
|
64
|
-
**What to Look For**
|
|
65
|
-
- **TARGET**: The YELLOW "ęē“¢é
åŗ" button (ęē“¢é
åŗ means "Search Hotel")
|
|
66
|
-
- **LOCATION**: Bottom section of the screen, large yellow rounded rectangle button
|
|
67
|
-
- **APPEARANCE**: Bright yellow background with black text "ęē“¢é
åŗ"
|
|
68
|
-
- Choose ONLY the main yellow search button
|
|
69
|
-
|
|
70
|
-
**Examples of CORRECT responses:**
|
|
71
|
-
action: **CLICK**
|
|
72
|
-
Parameters: {"target": "Search", "bbox_2d": [100, 200, 300, 280]}
|
|
73
|
-
// target is exact visible text or icon description
|
|
74
|
-
// bbox_2d is absolute pixel coordinates, x1 and y1 are top-left corner, x2 and y2 are bottom-right corner
|
|
75
|
-
|
|
76
|
-
**Your response (STRICT FORMAT ONLY):**`;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Read image as base64
|
|
80
|
-
*/
|
|
81
|
-
function readImageAsBase64(imagePath) {
|
|
82
|
-
const imageBuffer = fs.readFileSync(imagePath);
|
|
83
|
-
return imageBuffer.toString('base64');
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Get MIME type from file extension
|
|
87
|
-
*/
|
|
88
|
-
function getMimeType(imagePath) {
|
|
89
|
-
const ext = path.extname(imagePath).toLowerCase();
|
|
90
|
-
const mimeTypes = {
|
|
91
|
-
'.png': 'image/png',
|
|
92
|
-
'.jpg': 'image/jpeg',
|
|
93
|
-
'.jpeg': 'image/jpeg',
|
|
94
|
-
'.gif': 'image/gif',
|
|
95
|
-
'.webp': 'image/webp',
|
|
96
|
-
};
|
|
97
|
-
return mimeTypes[ext] || 'image/png';
|
|
98
|
-
}
|
|
99
|
-
async function postChatCompletions(baseUrl, token, body, timeoutMs) {
|
|
100
|
-
const controller = new AbortController();
|
|
101
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
102
|
-
try {
|
|
103
|
-
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
104
|
-
method: 'POST',
|
|
105
|
-
headers: {
|
|
106
|
-
'Content-Type': 'application/json',
|
|
107
|
-
Authorization: `Bearer ${token}`,
|
|
108
|
-
},
|
|
109
|
-
body: JSON.stringify(body),
|
|
110
|
-
signal: controller.signal,
|
|
111
|
-
});
|
|
112
|
-
if (!response.ok) {
|
|
113
|
-
const errorData = await response
|
|
114
|
-
.json()
|
|
115
|
-
.catch(async () => ({ message: await response.text() }));
|
|
116
|
-
const errorDetail = errorData?.error?.message ||
|
|
117
|
-
errorData?.message ||
|
|
118
|
-
`HTTP ${response.status}`;
|
|
119
|
-
throw new Error(`HTTP ${response.status}: ${errorDetail}`);
|
|
120
|
-
}
|
|
121
|
-
return (await response.json());
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
125
|
-
throw new Error(`HTTP timeout after ${timeoutMs}ms`, { cause: error });
|
|
126
|
-
}
|
|
127
|
-
throw error;
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
clearTimeout(timeoutId);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Call unified model API
|
|
135
|
-
*/
|
|
136
|
-
async function callModelAPI(model, imageBase64, prompt, mimeType, _imageWidth, _imageHeight) {
|
|
137
|
-
const baseUrl = process.env.API_BASE_URL;
|
|
138
|
-
const token = process.env.API_TOKEN;
|
|
139
|
-
if (!baseUrl) {
|
|
140
|
-
throw new Error('API_BASE_URL environment variable not set');
|
|
141
|
-
}
|
|
142
|
-
if (!token) {
|
|
143
|
-
throw new Error('API_TOKEN environment variable not set');
|
|
144
|
-
}
|
|
145
|
-
const response = await postChatCompletions(baseUrl, token, {
|
|
146
|
-
model: model.name,
|
|
147
|
-
messages: [
|
|
148
|
-
{
|
|
149
|
-
role: 'user',
|
|
150
|
-
content: [
|
|
151
|
-
{
|
|
152
|
-
type: 'text',
|
|
153
|
-
text: prompt,
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
type: 'image_url',
|
|
157
|
-
image_url: {
|
|
158
|
-
url: `data:${mimeType};base64,${imageBase64}`,
|
|
159
|
-
},
|
|
160
|
-
// Add image size control parameters to ensure all models use the same image processing method
|
|
161
|
-
min_pixels: 64 * 32 * 32, // 65536 pixels
|
|
162
|
-
max_pixels: 2560 * 32 * 32, // 2621440 pixels
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
},
|
|
166
|
-
],
|
|
167
|
-
max_tokens: 4096,
|
|
168
|
-
}, 120000);
|
|
169
|
-
const content = response.choices?.[0]?.message?.content;
|
|
170
|
-
if (!content) {
|
|
171
|
-
throw new Error('Model response missing choices[0].message.content');
|
|
172
|
-
}
|
|
173
|
-
return content;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Judge model: Evaluate whether the search button in the annotated image is correctly boxed
|
|
177
|
-
*/
|
|
178
|
-
async function judgeAnnotation(annotatedImagePath, modelName) {
|
|
179
|
-
try {
|
|
180
|
-
console.log(`\nš [Judge] Evaluating ${modelName}...`);
|
|
181
|
-
const imageBase64 = readImageAsBase64(annotatedImagePath);
|
|
182
|
-
const mimeType = getMimeType(annotatedImagePath);
|
|
183
|
-
const judgePrompt = `You are a professional UI testing quality evaluation expert. Please carefully observe this annotated image; there is a red border marking a UI element.
|
|
184
|
-
|
|
185
|
-
**Your Task:**
|
|
186
|
-
Evaluate how accurately the red bounding box encloses the "Search Button" or "Search Input Box". Return a percentage score from 0% to 100%.
|
|
187
|
-
|
|
188
|
-
**Scoring Guidelines:**
|
|
189
|
-
- 100%: Perfect match - The red box exactly and completely encloses the search button/input box with minimal extra space
|
|
190
|
-
- 80-99%: Good match - The red box fully contains the search button with slight extra margins or minor misalignment
|
|
191
|
-
- 60-79%: Fair match - The red box covers most of the search button but misses some edges or includes significant extra area
|
|
192
|
-
- 40-59%: Poor match - The red box partially covers the search button or is significantly misaligned
|
|
193
|
-
- 20-39%: Bad match - The red box barely touches the search button or covers mostly wrong area
|
|
194
|
-
- 0-19%: Very bad match - The red box completely misses the search button, enclosing unrelated elements or empty space
|
|
195
|
-
|
|
196
|
-
**Please strictly return in the following format:**
|
|
197
|
-
Accuracy Score: [0-100]%
|
|
198
|
-
Reason: [One sentence explaining the scoring reason]
|
|
199
|
-
|
|
200
|
-
Example:
|
|
201
|
-
Accuracy Score: 85%
|
|
202
|
-
Reason: The red box completely contains the yellow search button with slight margins on all sides.`;
|
|
203
|
-
const baseUrl = process.env.API_BASE_URL;
|
|
204
|
-
const token = process.env.API_TOKEN;
|
|
205
|
-
// judge model
|
|
206
|
-
if (!baseUrl || !token) {
|
|
207
|
-
throw new Error('API_BASE_URL or API_TOKEN environment variable not set');
|
|
208
|
-
}
|
|
209
|
-
const response = await postChatCompletions(baseUrl, token, {
|
|
210
|
-
model: 'qwen3-vl-plus',
|
|
211
|
-
messages: [
|
|
212
|
-
{
|
|
213
|
-
role: 'user',
|
|
214
|
-
content: [
|
|
215
|
-
{
|
|
216
|
-
type: 'text',
|
|
217
|
-
text: judgePrompt,
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
type: 'image_url',
|
|
221
|
-
image_url: {
|
|
222
|
-
url: `data:${mimeType};base64,${imageBase64}`,
|
|
223
|
-
},
|
|
224
|
-
},
|
|
225
|
-
],
|
|
226
|
-
},
|
|
227
|
-
],
|
|
228
|
-
max_tokens: 1024,
|
|
229
|
-
}, 60000);
|
|
230
|
-
const judgeResponse = response.choices?.[0]?.message?.content ?? '';
|
|
231
|
-
console.log(` Judge response: ${judgeResponse}`);
|
|
232
|
-
// Parse accuracy score
|
|
233
|
-
const scoreMatch = judgeResponse.match(/Accuracy Score[ļ¼:]?\s*(\d+)%?/i);
|
|
234
|
-
const score = scoreMatch ? parseInt(scoreMatch[1], 10) : 0;
|
|
235
|
-
console.log(` š Accuracy Score: ${score}%`);
|
|
236
|
-
return score;
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
console.error(`ā Judge failed for ${modelName}:`, error);
|
|
240
|
-
return 0;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Parse bbox coordinates from model response
|
|
245
|
-
*/
|
|
246
|
-
function parseBBoxFromResponse(response) {
|
|
247
|
-
try {
|
|
248
|
-
// Try to match JSON format bbox
|
|
249
|
-
const jsonMatch = response.match(/\{[^}]*"target"[^}]*"bbox_2d"[^}]*\}/);
|
|
250
|
-
if (jsonMatch) {
|
|
251
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
252
|
-
if (parsed.bbox_2d &&
|
|
253
|
-
Array.isArray(parsed.bbox_2d) &&
|
|
254
|
-
parsed.bbox_2d.length === 4) {
|
|
255
|
-
return parsed;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// Try to match array format [x1, y1, x2, y2]
|
|
259
|
-
const arrayMatch = response.match(/\[(\d+),\s*(\d+),\s*(\d+),\s*(\d+)\]/);
|
|
260
|
-
if (arrayMatch) {
|
|
261
|
-
return {
|
|
262
|
-
target: 'Detected element',
|
|
263
|
-
bbox_2d: [
|
|
264
|
-
parseInt(arrayMatch[1], 10),
|
|
265
|
-
parseInt(arrayMatch[2], 10),
|
|
266
|
-
parseInt(arrayMatch[3], 10),
|
|
267
|
-
parseInt(arrayMatch[4], 10),
|
|
268
|
-
],
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
return null;
|
|
272
|
-
}
|
|
273
|
-
catch (error) {
|
|
274
|
-
console.error('Failed to parse bbox:', error);
|
|
275
|
-
return null;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Draw bounding box on image
|
|
280
|
-
* Process according to the coordinate type configured for the model
|
|
281
|
-
*/
|
|
282
|
-
async function drawBBoxOnImage(originalImagePath, bbox, outputPath, modelName, coordType) {
|
|
283
|
-
try {
|
|
284
|
-
let [x1, y1, x2, y2] = bbox;
|
|
285
|
-
// Read original image to get dimensions
|
|
286
|
-
const image = sharp(originalImagePath);
|
|
287
|
-
const metadata = await image.metadata();
|
|
288
|
-
if (!metadata.width || !metadata.height) {
|
|
289
|
-
throw new Error('Failed to get image dimensions');
|
|
290
|
-
}
|
|
291
|
-
const width = metadata.width;
|
|
292
|
-
const height = metadata.height;
|
|
293
|
-
// Process according to model's configured coordinate type
|
|
294
|
-
if (coordType === 'normalized') {
|
|
295
|
-
// Normalized coordinates (0-1000) ā Absolute pixel coordinates
|
|
296
|
-
const originalCoords = [x1, y1, x2, y2];
|
|
297
|
-
x1 = Math.floor((x1 / 1000) * width);
|
|
298
|
-
y1 = Math.floor((y1 / 1000) * height);
|
|
299
|
-
x2 = Math.floor((x2 / 1000) * width);
|
|
300
|
-
y2 = Math.floor((y2 / 1000) * height);
|
|
301
|
-
console.log(` [${modelName}] Converted normalized coords ${JSON.stringify(originalCoords)} to absolute: [${x1}, ${y1}, ${x2}, ${y2}]`);
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
// Absolute pixel coordinates, use directly
|
|
305
|
-
console.log(` [${modelName}] Using absolute coords: [${x1}, ${y1}, ${x2}, ${y2}]`);
|
|
306
|
-
}
|
|
307
|
-
// Ensure coordinate order is correct (x1 < x2, y1 < y2)
|
|
308
|
-
if (x1 > x2) {
|
|
309
|
-
[x1, x2] = [x2, x1];
|
|
310
|
-
}
|
|
311
|
-
if (y1 > y2) {
|
|
312
|
-
[y1, y2] = [y2, y1];
|
|
313
|
-
}
|
|
314
|
-
// Ensure coordinates are valid
|
|
315
|
-
if (x1 >= x2 || y1 >= y2) {
|
|
316
|
-
throw new Error(`Invalid bbox coordinates after normalization: [${x1}, ${y1}, ${x2}, ${y2}]`);
|
|
317
|
-
}
|
|
318
|
-
// Ensure coordinates are within image bounds
|
|
319
|
-
x1 = Math.max(0, Math.min(x1, width - 1));
|
|
320
|
-
y1 = Math.max(0, Math.min(y1, height - 1));
|
|
321
|
-
x2 = Math.max(0, Math.min(x2, width));
|
|
322
|
-
y2 = Math.max(0, Math.min(y2, height));
|
|
323
|
-
const boxWidth = x2 - x1;
|
|
324
|
-
const boxHeight = y2 - y1;
|
|
325
|
-
// Create SVG red box (3px width)
|
|
326
|
-
const svg = `
|
|
327
|
-
<svg width="${width}" height="${height}">
|
|
328
|
-
<rect x="${x1}" y="${y1}" width="${boxWidth}" height="${boxHeight}"
|
|
329
|
-
fill="none" stroke="red" stroke-width="3"/>
|
|
330
|
-
<text x="${x1 + 5}" y="${y1 - 8}" font-family="Arial" font-size="14"
|
|
331
|
-
fill="red" font-weight="bold">${modelName}</text>
|
|
332
|
-
</svg>
|
|
333
|
-
`;
|
|
334
|
-
// Overlay SVG on original image
|
|
335
|
-
await image
|
|
336
|
-
.composite([
|
|
337
|
-
{
|
|
338
|
-
input: Buffer.from(svg),
|
|
339
|
-
top: 0,
|
|
340
|
-
left: 0,
|
|
341
|
-
},
|
|
342
|
-
])
|
|
343
|
-
.toFile(outputPath);
|
|
344
|
-
console.log(`ā Saved annotated image: ${outputPath}`);
|
|
345
|
-
console.log(` BBox: [${x1}, ${y1}, ${x2}, ${y2}] (${boxWidth}x${boxHeight})`);
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
console.error(`ā Failed to draw bbox for ${modelName}:`, error);
|
|
349
|
-
throw error;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Write content to TEST_REPORT.md
|
|
354
|
-
*/
|
|
355
|
-
function writeToReport(content) {
|
|
356
|
-
const reportPath = path.join(__dirname, 'TEST_REPORT.md');
|
|
357
|
-
fs.appendFileSync(reportPath, content + '\n', 'utf-8');
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Initialize TEST_REPORT.md
|
|
361
|
-
*/
|
|
362
|
-
function initializeReport() {
|
|
363
|
-
const reportPath = path.join(__dirname, 'TEST_REPORT.md');
|
|
364
|
-
const header = `# Model Benchmark Test Report
|
|
365
|
-
|
|
366
|
-
**Test Date:** ${new Date().toLocaleString()}
|
|
367
|
-
**Test Type:** Automation Testing - Click Action Recognition
|
|
368
|
-
|
|
369
|
-
---
|
|
370
|
-
|
|
371
|
-
## Summary
|
|
372
|
-
|
|
373
|
-
| Model Name | Duration(ms) | Status | Accuracy Score | Annotated Image |
|
|
374
|
-
|------------|--------------|--------|----------------|-----------------|
|
|
375
|
-
<!-- SUMMARY_TABLE_ROWS -->
|
|
376
|
-
|
|
377
|
-
### Statistics
|
|
378
|
-
|
|
379
|
-
<!-- STATISTICS_SECTION -->
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## Detailed Results
|
|
384
|
-
|
|
385
|
-
`;
|
|
386
|
-
fs.writeFileSync(reportPath, header, 'utf-8');
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* Update summary table in TEST_REPORT.md with actual results
|
|
390
|
-
*/
|
|
391
|
-
function updateSummaryTable(results) {
|
|
392
|
-
const reportPath = path.join(__dirname, 'TEST_REPORT.md');
|
|
393
|
-
let content = fs.readFileSync(reportPath, 'utf-8');
|
|
394
|
-
// Sort results by accuracy score (descending), failed models go to the end
|
|
395
|
-
const sortedResults = [...results].sort((a, b) => {
|
|
396
|
-
const scoreA = a.error ? -1 : a.judgeResult || 0;
|
|
397
|
-
const scoreB = b.error ? -1 : b.judgeResult || 0;
|
|
398
|
-
return scoreB - scoreA;
|
|
399
|
-
});
|
|
400
|
-
// Generate summary table rows
|
|
401
|
-
const tableRows = sortedResults
|
|
402
|
-
.map((result) => {
|
|
403
|
-
const status = result.error ? 'ā Failed' : 'ā
Success';
|
|
404
|
-
const accuracy = result.judgeResult !== undefined ? `${result.judgeResult}%` : 'N/A';
|
|
405
|
-
const annotatedImage = result.annotatedImagePath
|
|
406
|
-
? `[View](${path.relative(__dirname, result.annotatedImagePath).replace(/\\/g, '/')})`
|
|
407
|
-
: 'N/A';
|
|
408
|
-
return `| ${result.modelName} | ${result.duration} | ${status} | ${accuracy} | ${annotatedImage} |`;
|
|
409
|
-
})
|
|
410
|
-
.join('\n');
|
|
411
|
-
// Replace placeholder with actual rows and remove the placeholder
|
|
412
|
-
if (content.includes('<!-- SUMMARY_TABLE_ROWS -->')) {
|
|
413
|
-
content = content.replace('<!-- SUMMARY_TABLE_ROWS -->', tableRows);
|
|
414
|
-
}
|
|
415
|
-
// Calculate statistics
|
|
416
|
-
const successCount = results.filter((r) => !r.error).length;
|
|
417
|
-
const failCount = results.filter((r) => r.error).length;
|
|
418
|
-
const avgAccuracyScore = results.reduce((sum, r) => sum + (r.judgeResult || 0), 0) / results.length;
|
|
419
|
-
const highAccuracyCount = results.filter((r) => (r.judgeResult || 0) >= 70).length;
|
|
420
|
-
const avgDuration = results.reduce((sum, r) => sum + r.duration, 0) / results.length;
|
|
421
|
-
const minDuration = Math.min(...results.map((r) => r.duration));
|
|
422
|
-
const maxDuration = Math.max(...results.map((r) => r.duration));
|
|
423
|
-
// Generate statistics section
|
|
424
|
-
const statisticsSection = `- **Total**: ${results.length} models
|
|
425
|
-
- **Success**: ${successCount} (${((successCount / results.length) * 100).toFixed(1)}%)
|
|
426
|
-
- **Failed**: ${failCount}
|
|
427
|
-
- **High Accuracy (ā„70%)**: ${highAccuracyCount} (${((highAccuracyCount / results.length) * 100).toFixed(1)}%)
|
|
428
|
-
- **Avg Accuracy Score**: ${avgAccuracyScore.toFixed(1)}%
|
|
429
|
-
- **Average Duration**: ${avgDuration.toFixed(2)}ms
|
|
430
|
-
- **Min Duration**: ${minDuration}ms
|
|
431
|
-
- **Max Duration**: ${maxDuration}ms`;
|
|
432
|
-
// Replace placeholder with actual statistics and remove the placeholder
|
|
433
|
-
if (content.includes('<!-- STATISTICS_SECTION -->')) {
|
|
434
|
-
content = content.replace('<!-- STATISTICS_SECTION -->', statisticsSection);
|
|
435
|
-
}
|
|
436
|
-
fs.writeFileSync(reportPath, content, 'utf-8');
|
|
437
|
-
}
|
|
438
|
-
/**
|
|
439
|
-
* Test a single model
|
|
440
|
-
*/
|
|
441
|
-
async function testModel(model, imageBase64, prompt, mimeType, originalImagePath, imageWidth, imageHeight) {
|
|
442
|
-
const startTime = Date.now();
|
|
443
|
-
const timestamp = new Date().toISOString();
|
|
444
|
-
try {
|
|
445
|
-
const separator = `\n${'='.repeat(60)}`;
|
|
446
|
-
const testingMsg = `Testing: ${model.name}`;
|
|
447
|
-
console.log(separator);
|
|
448
|
-
console.log(testingMsg);
|
|
449
|
-
console.log('='.repeat(60));
|
|
450
|
-
writeToReport(`${separator}\n## ${model.name}\n`);
|
|
451
|
-
writeToReport(`**Started at:** ${new Date().toLocaleString()}\n`);
|
|
452
|
-
const response = await callModelAPI(model, imageBase64, prompt, mimeType, imageWidth, imageHeight);
|
|
453
|
-
const duration = Date.now() - startTime;
|
|
454
|
-
const successMsg = `ā Completed in ${duration}ms`;
|
|
455
|
-
const responseMsg = `\nResponse:\n${response}\n==========`;
|
|
456
|
-
console.log(successMsg);
|
|
457
|
-
console.log(responseMsg);
|
|
458
|
-
// Parse bbox coordinates
|
|
459
|
-
const bboxData = parseBBoxFromResponse(response);
|
|
460
|
-
let bbox;
|
|
461
|
-
if (bboxData) {
|
|
462
|
-
bbox = bboxData.bbox_2d;
|
|
463
|
-
console.log(`ā Parsed bbox: [${bbox.join(', ')}]`);
|
|
464
|
-
console.log(`ā Target: ${bboxData.target}`);
|
|
465
|
-
// Draw annotated image and save to output folder
|
|
466
|
-
const outputDir = path.join(__dirname, 'output');
|
|
467
|
-
// Ensure output directory exists
|
|
468
|
-
if (!fs.existsSync(outputDir)) {
|
|
469
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
470
|
-
}
|
|
471
|
-
const annotatedImageName = `${model.name.replace(/[^a-zA-Z0-9]/g, '_')}_annotated.png`;
|
|
472
|
-
const annotatedImagePath = path.join(outputDir, annotatedImageName);
|
|
473
|
-
await drawBBoxOnImage(originalImagePath, bbox, annotatedImagePath, model.name, model.coordType);
|
|
474
|
-
writeToReport(`**BBox:** [${bbox.join(', ')}]`);
|
|
475
|
-
writeToReport(`**Target:** ${bboxData.target}`);
|
|
476
|
-
writeToReport(`**Annotated Image:** [${annotatedImageName}](output/${annotatedImageName})`);
|
|
477
|
-
// Use judge model to evaluate annotation result
|
|
478
|
-
const judgeResult = await judgeAnnotation(annotatedImagePath, model.name);
|
|
479
|
-
writeToReport(`**Accuracy Score:** ${judgeResult}%`);
|
|
480
|
-
writeToReport(`**Status:** ā
Success`);
|
|
481
|
-
writeToReport(`**Duration:** ${duration}ms`);
|
|
482
|
-
writeToReport(`**Response:**\n\`\`\`\n${response}\n\`\`\`\n`);
|
|
483
|
-
return {
|
|
484
|
-
modelName: model.name,
|
|
485
|
-
response,
|
|
486
|
-
duration,
|
|
487
|
-
timestamp,
|
|
488
|
-
bbox,
|
|
489
|
-
judgeResult,
|
|
490
|
-
annotatedImagePath,
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
console.log('ā No valid bbox found in response');
|
|
495
|
-
writeToReport(`**BBox:** Not found or invalid format`);
|
|
496
|
-
writeToReport(`**Judge Result:** ā No bbox to judge`);
|
|
497
|
-
writeToReport(`**Status:** ā
Success`);
|
|
498
|
-
writeToReport(`**Duration:** ${duration}ms`);
|
|
499
|
-
writeToReport(`**Response:**\n\`\`\`\n${response}\n\`\`\`\n`);
|
|
500
|
-
return {
|
|
501
|
-
modelName: model.name,
|
|
502
|
-
response,
|
|
503
|
-
duration,
|
|
504
|
-
timestamp,
|
|
505
|
-
bbox,
|
|
506
|
-
judgeResult: 0,
|
|
507
|
-
};
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
catch (error) {
|
|
511
|
-
const duration = Date.now() - startTime;
|
|
512
|
-
let errorMessage = 'Unknown error';
|
|
513
|
-
if (error instanceof Error) {
|
|
514
|
-
errorMessage = error.message;
|
|
515
|
-
console.error(`ā Failed (${model.name}): ${errorMessage}`);
|
|
516
|
-
}
|
|
517
|
-
writeToReport(`**Status:** ā Failed`);
|
|
518
|
-
writeToReport(`**Duration:** ${duration}ms`);
|
|
519
|
-
writeToReport(`**Error:** ${errorMessage}\n`);
|
|
520
|
-
return {
|
|
521
|
-
modelName: model.name,
|
|
522
|
-
response: '',
|
|
523
|
-
duration,
|
|
524
|
-
timestamp,
|
|
525
|
-
error: errorMessage,
|
|
526
|
-
judgeResult: 0,
|
|
527
|
-
};
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
/**
|
|
531
|
-
* Print summary table
|
|
532
|
-
*/
|
|
533
|
-
function printSummary(results) {
|
|
534
|
-
const separator = '\n' + '='.repeat(60);
|
|
535
|
-
const summaryTitle = 'BENCHMARK SUMMARY';
|
|
536
|
-
console.log(separator);
|
|
537
|
-
console.log(summaryTitle);
|
|
538
|
-
console.log(separator);
|
|
539
|
-
console.log('\nš Results:\n');
|
|
540
|
-
results.forEach((result) => {
|
|
541
|
-
const status = result.error ? 'ā Failed' : 'ā
Success';
|
|
542
|
-
const duration = `${result.duration}ms`;
|
|
543
|
-
const judgeStatus = result.judgeResult !== undefined ? `${result.judgeResult}%` : 'N/A';
|
|
544
|
-
console.log(` ${result.modelName}: ${status} (${duration}) - Judge: ${judgeStatus}`);
|
|
545
|
-
});
|
|
546
|
-
console.log(`\nš Statistics:\n`);
|
|
547
|
-
const successCount = results.filter((r) => !r.error).length;
|
|
548
|
-
const failCount = results.filter((r) => r.error).length;
|
|
549
|
-
const avgAccuracyScore = results.reduce((sum, r) => sum + (r.judgeResult || 0), 0) / results.length;
|
|
550
|
-
const highAccuracyCount = results.filter((r) => (r.judgeResult || 0) >= 70).length;
|
|
551
|
-
const avgDuration = results.reduce((sum, r) => sum + r.duration, 0) / results.length;
|
|
552
|
-
console.log(` Total: ${results.length} models`);
|
|
553
|
-
console.log(` Success: ${successCount} (${((successCount / results.length) * 100).toFixed(1)}%)`);
|
|
554
|
-
console.log(` Failed: ${failCount}`);
|
|
555
|
-
console.log(` High Accuracy (ā„70%): ${highAccuracyCount} (${((highAccuracyCount / results.length) * 100).toFixed(1)}%)`);
|
|
556
|
-
console.log(` Avg Accuracy Score: ${avgAccuracyScore.toFixed(1)}%`);
|
|
557
|
-
console.log(` Average Duration: ${avgDuration.toFixed(2)}ms`);
|
|
558
|
-
console.log(` Min Duration: ${Math.min(...results.map((r) => r.duration))}ms`);
|
|
559
|
-
console.log(` Max Duration: ${Math.max(...results.map((r) => r.duration))}ms`);
|
|
560
|
-
console.log(`\n---`);
|
|
561
|
-
}
|
|
562
|
-
/**
|
|
563
|
-
* Main benchmark function
|
|
564
|
-
*/
|
|
565
|
-
async function runBenchmark() {
|
|
566
|
-
const args = process.argv.slice(2);
|
|
567
|
-
const imagePath = args[0] || path.join(__dirname, 'image.png');
|
|
568
|
-
// Validate image file exists
|
|
569
|
-
if (!fs.existsSync(imagePath)) {
|
|
570
|
-
console.error(`Error: Image file not found: ${imagePath}`);
|
|
571
|
-
console.log('\nUsage: npx tsx benchmark_model.ts <path-to-image>');
|
|
572
|
-
console.log(' or: npm run benchmark -- <path-to-image>');
|
|
573
|
-
process.exit(1);
|
|
574
|
-
}
|
|
575
|
-
const absoluteImagePath = path.resolve(imagePath);
|
|
576
|
-
try {
|
|
577
|
-
console.log('='.repeat(60));
|
|
578
|
-
console.log('MODEL BENCHMARK TEST');
|
|
579
|
-
console.log('='.repeat(60));
|
|
580
|
-
console.log(`\nTest Image: ${absoluteImagePath}`);
|
|
581
|
-
// Read image and get dimensions
|
|
582
|
-
const imageBase64 = readImageAsBase64(absoluteImagePath);
|
|
583
|
-
const mimeType = getMimeType(absoluteImagePath);
|
|
584
|
-
const imageInfo = await sharp(absoluteImagePath).metadata();
|
|
585
|
-
const imageWidth = imageInfo.width || 0;
|
|
586
|
-
const imageHeight = imageInfo.height || 0;
|
|
587
|
-
console.log(`Image Size: ${imageWidth}x${imageHeight}`);
|
|
588
|
-
console.log(`Models to Test: ${MODELS.length}`);
|
|
589
|
-
console.log(`List: ${MODELS.map((m) => m.name).join(', ')}`);
|
|
590
|
-
// Generate test prompt
|
|
591
|
-
const testPrompt = generateTestPrompt(imageWidth, imageHeight);
|
|
592
|
-
// Initialize report
|
|
593
|
-
initializeReport();
|
|
594
|
-
// Test all models concurrently
|
|
595
|
-
const results = await Promise.all(MODELS.map((model) => testModel(model, imageBase64, testPrompt, mimeType, absoluteImagePath, imageWidth, imageHeight)));
|
|
596
|
-
// Print summary
|
|
597
|
-
printSummary(results);
|
|
598
|
-
// Update summary table in report
|
|
599
|
-
updateSummaryTable(results);
|
|
600
|
-
console.log(`\nā Benchmark completed!`);
|
|
601
|
-
console.log(` Report saved to: TEST_REPORT.md`);
|
|
602
|
-
console.log(` Annotated images saved to: output/ folder`);
|
|
603
|
-
}
|
|
604
|
-
catch (error) {
|
|
605
|
-
console.error('\nā Benchmark failed:', error);
|
|
606
|
-
process.exit(1);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
// Run the benchmark
|
|
610
|
-
try {
|
|
611
|
-
await runBenchmark();
|
|
612
|
-
}
|
|
613
|
-
catch (error) {
|
|
614
|
-
console.error('Fatal error:', error);
|
|
615
|
-
process.exit(1);
|
|
616
|
-
}
|
|
617
|
-
//# sourceMappingURL=benchmark_model.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark_model.js","sourceRoot":"","sources":["../../../src/tests/benchmark_model/benchmark_model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.test.d.ts","sourceRoot":"","sources":["../../src/tests/create-server.test.ts"],"names":[],"mappings":""}
|