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.
Files changed (100) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/command.d.ts +9 -0
  3. package/dist/command.d.ts.map +1 -1
  4. package/dist/command.js +29 -0
  5. package/dist/command.js.map +1 -1
  6. package/dist/tools/interactions/find.d.ts.map +1 -1
  7. package/dist/tools/interactions/find.js +2 -1
  8. package/dist/tools/interactions/find.js.map +1 -1
  9. package/package.json +2 -1
  10. package/server.json +2 -2
  11. package/src/command.ts +37 -0
  12. package/src/tools/interactions/find.ts +6 -1
  13. package/dist/tests/__mocks__/@appium/support.d.ts +0 -92
  14. package/dist/tests/__mocks__/@appium/support.d.ts.map +0 -1
  15. package/dist/tests/__mocks__/@appium/support.js +0 -66
  16. package/dist/tests/__mocks__/@appium/support.js.map +0 -1
  17. package/dist/tests/benchmark_model/benchmark_model.d.ts +0 -3
  18. package/dist/tests/benchmark_model/benchmark_model.d.ts.map +0 -1
  19. package/dist/tests/benchmark_model/benchmark_model.js +0 -617
  20. package/dist/tests/benchmark_model/benchmark_model.js.map +0 -1
  21. package/dist/tests/create-server.test.d.ts +0 -2
  22. package/dist/tests/create-server.test.d.ts.map +0 -1
  23. package/dist/tests/create-server.test.js +0 -586
  24. package/dist/tests/create-server.test.js.map +0 -1
  25. package/dist/tests/generate-all-locators.test.d.ts +0 -2
  26. package/dist/tests/generate-all-locators.test.d.ts.map +0 -1
  27. package/dist/tests/generate-all-locators.test.js +0 -136
  28. package/dist/tests/generate-all-locators.test.js.map +0 -1
  29. package/dist/tests/persistence.test.d.ts +0 -2
  30. package/dist/tests/persistence.test.d.ts.map +0 -1
  31. package/dist/tests/persistence.test.js +0 -116
  32. package/dist/tests/persistence.test.js.map +0 -1
  33. package/dist/tests/plugin.test.d.ts +0 -2
  34. package/dist/tests/plugin.test.d.ts.map +0 -1
  35. package/dist/tests/plugin.test.js +0 -399
  36. package/dist/tests/plugin.test.js.map +0 -1
  37. package/dist/tests/policy.test.d.ts +0 -2
  38. package/dist/tests/policy.test.d.ts.map +0 -1
  39. package/dist/tests/policy.test.js +0 -44
  40. package/dist/tests/policy.test.js.map +0 -1
  41. package/dist/tests/screenshot.test.d.ts +0 -2
  42. package/dist/tests/screenshot.test.d.ts.map +0 -1
  43. package/dist/tests/screenshot.test.js +0 -243
  44. package/dist/tests/screenshot.test.js.map +0 -1
  45. package/dist/tests/session-store.test.d.ts +0 -2
  46. package/dist/tests/session-store.test.d.ts.map +0 -1
  47. package/dist/tests/session-store.test.js +0 -459
  48. package/dist/tests/session-store.test.js.map +0 -1
  49. package/dist/tests/test-setup-wda.d.ts +0 -2
  50. package/dist/tests/test-setup-wda.d.ts.map +0 -1
  51. package/dist/tests/test-setup-wda.js +0 -199
  52. package/dist/tests/test-setup-wda.js.map +0 -1
  53. package/dist/tests/tools/evidence.test.d.ts +0 -2
  54. package/dist/tests/tools/evidence.test.d.ts.map +0 -1
  55. package/dist/tests/tools/evidence.test.js +0 -158
  56. package/dist/tests/tools/evidence.test.js.map +0 -1
  57. package/dist/tests/tools/gestures/ai-element.test.d.ts +0 -2
  58. package/dist/tests/tools/gestures/ai-element.test.d.ts.map +0 -1
  59. package/dist/tests/tools/gestures/ai-element.test.js +0 -114
  60. package/dist/tests/tools/gestures/ai-element.test.js.map +0 -1
  61. package/dist/tests/tools/gestures/swipe-scroll.test.d.ts +0 -2
  62. package/dist/tests/tools/gestures/swipe-scroll.test.d.ts.map +0 -1
  63. package/dist/tests/tools/gestures/swipe-scroll.test.js +0 -63
  64. package/dist/tests/tools/gestures/swipe-scroll.test.js.map +0 -1
  65. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts +0 -2
  66. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.d.ts.map +0 -1
  67. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js +0 -94
  68. package/dist/tests/tools/interactions/webdriver-ai-element-rejection.test.js.map +0 -1
  69. package/dist/tests/tools/llm-wording.test.d.ts +0 -2
  70. package/dist/tests/tools/llm-wording.test.d.ts.map +0 -1
  71. package/dist/tests/tools/llm-wording.test.js +0 -89
  72. package/dist/tests/tools/llm-wording.test.js.map +0 -1
  73. package/dist/tests/tools/session/device-info.test.d.ts +0 -2
  74. package/dist/tests/tools/session/device-info.test.d.ts.map +0 -1
  75. package/dist/tests/tools/session/device-info.test.js +0 -144
  76. package/dist/tests/tools/session/device-info.test.js.map +0 -1
  77. package/dist/tests/tools/session/file-transfer.test.d.ts +0 -2
  78. package/dist/tests/tools/session/file-transfer.test.d.ts.map +0 -1
  79. package/dist/tests/tools/session/file-transfer.test.js +0 -98
  80. package/dist/tests/tools/session/file-transfer.test.js.map +0 -1
  81. package/dist/tests/tools/session/session.test.d.ts +0 -2
  82. package/dist/tests/tools/session/session.test.d.ts.map +0 -1
  83. package/dist/tests/tools/session/session.test.js +0 -413
  84. package/dist/tests/tools/session/session.test.js.map +0 -1
  85. package/dist/tests/utils/collection.test.d.ts +0 -2
  86. package/dist/tests/utils/collection.test.d.ts.map +0 -1
  87. package/dist/tests/utils/collection.test.js +0 -87
  88. package/dist/tests/utils/collection.test.js.map +0 -1
  89. package/dist/tests/utils/paths.test.d.ts +0 -2
  90. package/dist/tests/utils/paths.test.d.ts.map +0 -1
  91. package/dist/tests/utils/paths.test.js +0 -21
  92. package/dist/tests/utils/paths.test.js.map +0 -1
  93. package/dist/tests/verify.test.d.ts +0 -2
  94. package/dist/tests/verify.test.d.ts.map +0 -1
  95. package/dist/tests/verify.test.js +0 -148
  96. package/dist/tests/verify.test.js.map +0 -1
  97. package/dist/tests/vision-finder.test.d.ts +0 -10
  98. package/dist/tests/vision-finder.test.d.ts.map +0 -1
  99. package/dist/tests/vision-finder.test.js +0 -420
  100. 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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=create-server.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-server.test.d.ts","sourceRoot":"","sources":["../../src/tests/create-server.test.ts"],"names":[],"mappings":""}