appium-mcp 1.72.16 → 1.73.0
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 +6 -0
- package/dist/scripts/eval-documentation-rag.d.ts +23 -0
- package/dist/scripts/eval-documentation-rag.d.ts.map +1 -0
- package/dist/scripts/eval-documentation-rag.js +212 -0
- package/dist/scripts/eval-documentation-rag.js.map +1 -0
- package/dist/scripts/rag-eval-dataset.json +218 -0
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +4 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts.map +1 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.js +10 -3
- package/dist/tools/documentation/sentence-transformers-embeddings.js.map +1 -1
- package/dist/tools/documentation/simple-pdf-indexer.d.ts.map +1 -1
- package/dist/tools/documentation/simple-pdf-indexer.js +11 -2
- package/dist/tools/documentation/simple-pdf-indexer.js.map +1 -1
- package/package.json +4 -2
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/scripts/eval-documentation-rag.ts +312 -0
- package/src/scripts/rag-eval-dataset.json +218 -0
- package/src/tools/documentation/sentence-transformers-embeddings.ts +11 -4
- package/src/tools/documentation/simple-pdf-indexer.ts +11 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [1.73.0](https://github.com/appium/appium-mcp/compare/v1.72.16...v1.73.0) (2026-05-14)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* **rag:** upgrade to BGE-small-v1.5 + add retrieval eval harness ([#334](https://github.com/appium/appium-mcp/issues/334)) ([bcfe254](https://github.com/appium/appium-mcp/commit/bcfe2542e2f270d0a2fe314c64e7c54e752933ff))
|
|
6
|
+
|
|
1
7
|
## [1.72.16](https://github.com/appium/appium-mcp/compare/v1.72.15...v1.72.16) (2026-05-14)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG retrieval eval harness for the Appium documentation tool.
|
|
3
|
+
*
|
|
4
|
+
* Usage (after `npm run build`):
|
|
5
|
+
* node dist/scripts/eval-documentation-rag.js [--quiet] [--save] [--top-chunks=N]
|
|
6
|
+
*
|
|
7
|
+
* What it does:
|
|
8
|
+
* 1. Loads the eval dataset (src/scripts/rag-eval-dataset.json).
|
|
9
|
+
* 2. For each query, calls the existing queryVectorStore() with `topChunks`
|
|
10
|
+
* chunks (default 30), dedupes by source (preserving rank), and matches
|
|
11
|
+
* the resulting source list against expectedSources.
|
|
12
|
+
* 3. Reports Recall@{1,3,5,10} and MRR, broken down by difficulty.
|
|
13
|
+
* 4. Persists results to src/scripts/eval-results/<ISO>.json plus a
|
|
14
|
+
* `latest.json` so successive runs can be diffed.
|
|
15
|
+
*
|
|
16
|
+
* Notes:
|
|
17
|
+
* - The first run after a server restart pays the embedding cold start
|
|
18
|
+
* (~30-60s for the current corpus).
|
|
19
|
+
* - Match strategy: a retrieved source matches an expected source if its
|
|
20
|
+
* `relativePath` ends with the expected path (case-sensitive).
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=eval-documentation-rag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-documentation-rag.d.ts","sourceRoot":"","sources":["../../src/scripts/eval-documentation-rag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG retrieval eval harness for the Appium documentation tool.
|
|
3
|
+
*
|
|
4
|
+
* Usage (after `npm run build`):
|
|
5
|
+
* node dist/scripts/eval-documentation-rag.js [--quiet] [--save] [--top-chunks=N]
|
|
6
|
+
*
|
|
7
|
+
* What it does:
|
|
8
|
+
* 1. Loads the eval dataset (src/scripts/rag-eval-dataset.json).
|
|
9
|
+
* 2. For each query, calls the existing queryVectorStore() with `topChunks`
|
|
10
|
+
* chunks (default 30), dedupes by source (preserving rank), and matches
|
|
11
|
+
* the resulting source list against expectedSources.
|
|
12
|
+
* 3. Reports Recall@{1,3,5,10} and MRR, broken down by difficulty.
|
|
13
|
+
* 4. Persists results to src/scripts/eval-results/<ISO>.json plus a
|
|
14
|
+
* `latest.json` so successive runs can be diffed.
|
|
15
|
+
*
|
|
16
|
+
* Notes:
|
|
17
|
+
* - The first run after a server restart pays the embedding cold start
|
|
18
|
+
* (~30-60s for the current corpus).
|
|
19
|
+
* - Match strategy: a retrieved source matches an expected source if its
|
|
20
|
+
* `relativePath` ends with the expected path (case-sensitive).
|
|
21
|
+
*/
|
|
22
|
+
import * as fs from 'node:fs';
|
|
23
|
+
import * as path from 'node:path';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
|
|
26
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
27
|
+
const __dirname = path.dirname(__filename);
|
|
28
|
+
const args = new Set(process.argv.slice(2));
|
|
29
|
+
const QUIET = args.has('--quiet');
|
|
30
|
+
const NO_SAVE = !args.has('--save');
|
|
31
|
+
const topChunksArg = process.argv.find((a) => a.startsWith('--top-chunks='));
|
|
32
|
+
const TOP_CHUNKS = topChunksArg ? Number(topChunksArg.split('=')[1]) : 30;
|
|
33
|
+
function resolveDatasetPath() {
|
|
34
|
+
// When compiled, this file lives in dist/scripts/. We look for the dataset
|
|
35
|
+
// beside it first (copy-docs build step), then fall back to src/scripts/.
|
|
36
|
+
const candidates = [
|
|
37
|
+
path.resolve(__dirname, 'rag-eval-dataset.json'),
|
|
38
|
+
path.resolve(__dirname, '../../src/scripts/rag-eval-dataset.json'),
|
|
39
|
+
];
|
|
40
|
+
for (const p of candidates) {
|
|
41
|
+
if (fs.existsSync(p)) {
|
|
42
|
+
return p;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`Could not find rag-eval-dataset.json in any of: ${candidates.join(', ')}`);
|
|
46
|
+
}
|
|
47
|
+
function resolveResultsDir() {
|
|
48
|
+
// Always write results into the source tree so they're easy to diff/commit.
|
|
49
|
+
const candidates = [
|
|
50
|
+
path.resolve(__dirname, '../../src/scripts/eval-results'),
|
|
51
|
+
path.resolve(__dirname, 'eval-results'),
|
|
52
|
+
];
|
|
53
|
+
const dir = candidates[0];
|
|
54
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
55
|
+
return dir;
|
|
56
|
+
}
|
|
57
|
+
function matches(retrievedRelPath, expected) {
|
|
58
|
+
return retrievedRelPath === expected || retrievedRelPath.endsWith(expected);
|
|
59
|
+
}
|
|
60
|
+
function dedupeBySource(chunks) {
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
const ordered = [];
|
|
63
|
+
for (const c of chunks) {
|
|
64
|
+
const src = c.relativePath;
|
|
65
|
+
if (!src || seen.has(src)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
seen.add(src);
|
|
69
|
+
ordered.push(src);
|
|
70
|
+
}
|
|
71
|
+
return ordered;
|
|
72
|
+
}
|
|
73
|
+
function evalQuery(retrievedSources, expectedSources) {
|
|
74
|
+
for (let i = 0; i < retrievedSources.length; i++) {
|
|
75
|
+
const hit = expectedSources.find((e) => matches(retrievedSources[i], e));
|
|
76
|
+
if (hit) {
|
|
77
|
+
return { matchedAtRank: i + 1, matchedSource: retrievedSources[i] };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { matchedAtRank: null, matchedSource: null };
|
|
81
|
+
}
|
|
82
|
+
function aggregate(results) {
|
|
83
|
+
if (results.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
count: 0,
|
|
86
|
+
recallAt1: 0,
|
|
87
|
+
recallAt3: 0,
|
|
88
|
+
recallAt5: 0,
|
|
89
|
+
recallAt10: 0,
|
|
90
|
+
mrr: 0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const n = results.length;
|
|
94
|
+
const sum = (k) => results.reduce((acc, r) => acc + r[k], 0);
|
|
95
|
+
return {
|
|
96
|
+
count: n,
|
|
97
|
+
recallAt1: sum('recallAt1') / n,
|
|
98
|
+
recallAt3: sum('recallAt3') / n,
|
|
99
|
+
recallAt5: sum('recallAt5') / n,
|
|
100
|
+
recallAt10: sum('recallAt10') / n,
|
|
101
|
+
mrr: sum('reciprocalRank') / n,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function fmt(n) {
|
|
105
|
+
return n.toFixed(3);
|
|
106
|
+
}
|
|
107
|
+
function rankStr(rank) {
|
|
108
|
+
return rank === null ? ' - ' : String(rank).padStart(3, ' ');
|
|
109
|
+
}
|
|
110
|
+
function printPerQueryTable(results) {
|
|
111
|
+
const rows = results.map((r) => ({
|
|
112
|
+
id: r.id,
|
|
113
|
+
diff: r.difficulty,
|
|
114
|
+
rank: rankStr(r.matchedAtRank),
|
|
115
|
+
query: r.query.length > 56 ? r.query.slice(0, 53) + '...' : r.query,
|
|
116
|
+
matched: r.matchedSource ?? '(none of expected found in top results)',
|
|
117
|
+
}));
|
|
118
|
+
const widths = {
|
|
119
|
+
id: 4,
|
|
120
|
+
diff: 7,
|
|
121
|
+
rank: 4,
|
|
122
|
+
query: Math.max(...rows.map((r) => r.query.length), 5),
|
|
123
|
+
matched: Math.max(...rows.map((r) => r.matched.length), 7),
|
|
124
|
+
};
|
|
125
|
+
const header = `${'id'.padEnd(widths.id)} | ${'diff'.padEnd(widths.diff)} | ${'rank'.padStart(widths.rank)} | ${'query'.padEnd(widths.query)} | matched`;
|
|
126
|
+
const sep = '-'.repeat(header.length + 10);
|
|
127
|
+
console.log(sep);
|
|
128
|
+
console.log(header);
|
|
129
|
+
console.log(sep);
|
|
130
|
+
for (const r of rows) {
|
|
131
|
+
console.log(`${r.id.padEnd(widths.id)} | ${r.diff.padEnd(widths.diff)} | ${r.rank.padStart(widths.rank)} | ${r.query.padEnd(widths.query)} | ${r.matched}`);
|
|
132
|
+
}
|
|
133
|
+
console.log(sep);
|
|
134
|
+
}
|
|
135
|
+
function printAggregate(label, m) {
|
|
136
|
+
const tag = `${label} (n=${m.count})`.padEnd(20);
|
|
137
|
+
console.log(`${tag} R@1=${fmt(m.recallAt1)} R@3=${fmt(m.recallAt3)} R@5=${fmt(m.recallAt5)} R@10=${fmt(m.recallAt10)} MRR=${fmt(m.mrr)}`);
|
|
138
|
+
}
|
|
139
|
+
async function runEval() {
|
|
140
|
+
const datasetPath = resolveDatasetPath();
|
|
141
|
+
const dataset = JSON.parse(fs.readFileSync(datasetPath, 'utf-8'));
|
|
142
|
+
if (!QUIET) {
|
|
143
|
+
console.log(`\n=== Appium RAG eval ===`);
|
|
144
|
+
console.log(`Dataset: ${datasetPath}`);
|
|
145
|
+
console.log(`Queries: ${dataset.queries.length} | topChunks: ${TOP_CHUNKS} | match: endsWith\n`);
|
|
146
|
+
}
|
|
147
|
+
const perQuery = [];
|
|
148
|
+
for (const q of dataset.queries) {
|
|
149
|
+
const docs = await queryVectorStore(q.query, TOP_CHUNKS);
|
|
150
|
+
const retrievedSources = dedupeBySource(docs.map((d) => ({
|
|
151
|
+
relativePath: d.metadata?.relativePath ??
|
|
152
|
+
d.metadata?.filename ??
|
|
153
|
+
d.metadata?.source,
|
|
154
|
+
})));
|
|
155
|
+
const { matchedAtRank, matchedSource } = evalQuery(retrievedSources, q.expectedSources);
|
|
156
|
+
perQuery.push({
|
|
157
|
+
id: q.id,
|
|
158
|
+
query: q.query,
|
|
159
|
+
difficulty: q.difficulty,
|
|
160
|
+
category: q.category,
|
|
161
|
+
expectedSources: q.expectedSources,
|
|
162
|
+
retrievedSources,
|
|
163
|
+
matchedAtRank,
|
|
164
|
+
matchedSource,
|
|
165
|
+
recallAt1: matchedAtRank !== null && matchedAtRank <= 1 ? 1 : 0,
|
|
166
|
+
recallAt3: matchedAtRank !== null && matchedAtRank <= 3 ? 1 : 0,
|
|
167
|
+
recallAt5: matchedAtRank !== null && matchedAtRank <= 5 ? 1 : 0,
|
|
168
|
+
recallAt10: matchedAtRank !== null && matchedAtRank <= 10 ? 1 : 0,
|
|
169
|
+
reciprocalRank: matchedAtRank !== null ? 1 / matchedAtRank : 0,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (!QUIET) {
|
|
173
|
+
printPerQueryTable(perQuery);
|
|
174
|
+
}
|
|
175
|
+
const overall = aggregate(perQuery);
|
|
176
|
+
const byDifficulty = {};
|
|
177
|
+
for (const d of ['easy', 'medium', 'vague']) {
|
|
178
|
+
byDifficulty[d] = aggregate(perQuery.filter((r) => r.difficulty === d));
|
|
179
|
+
}
|
|
180
|
+
console.log('');
|
|
181
|
+
printAggregate('overall', overall);
|
|
182
|
+
for (const d of ['easy', 'medium', 'vague']) {
|
|
183
|
+
printAggregate(d, byDifficulty[d]);
|
|
184
|
+
}
|
|
185
|
+
console.log('');
|
|
186
|
+
if (!NO_SAVE) {
|
|
187
|
+
const run = {
|
|
188
|
+
timestamp: new Date().toISOString(),
|
|
189
|
+
datasetVersion: dataset.version,
|
|
190
|
+
topChunks: TOP_CHUNKS,
|
|
191
|
+
overall,
|
|
192
|
+
byDifficulty,
|
|
193
|
+
perQuery,
|
|
194
|
+
};
|
|
195
|
+
const dir = resolveResultsDir();
|
|
196
|
+
const stamp = run.timestamp.replace(/[:.]/g, '-');
|
|
197
|
+
const outPath = path.join(dir, `${stamp}.json`);
|
|
198
|
+
const latestPath = path.join(dir, 'latest.json');
|
|
199
|
+
fs.writeFileSync(outPath, JSON.stringify(run, null, 2));
|
|
200
|
+
fs.writeFileSync(latestPath, JSON.stringify(run, null, 2));
|
|
201
|
+
console.log(`Saved: ${path.relative(process.cwd(), outPath)}`);
|
|
202
|
+
console.log(` ${path.relative(process.cwd(), latestPath)}\n`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
await runEval();
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
console.error('Eval failed:', err);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=eval-documentation-rag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-documentation-rag.js","sourceRoot":"","sources":["../../src/scripts/eval-documentation-rag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"description": "Realistic user queries for the Appium documentation RAG tool. Each query maps to one or more source files that should appear in the retrieved sources (substring match against the chunk's relativePath metadata). Difficulty buckets: easy (specific terms that should be near-trivial to retrieve), medium (real-world phrasing), vague (natural human phrasing with less direct cues).",
|
|
4
|
+
"matchMode": "endsWith",
|
|
5
|
+
"queries": [
|
|
6
|
+
{
|
|
7
|
+
"id": "q01",
|
|
8
|
+
"query": "How do I install Appium?",
|
|
9
|
+
"expectedSources": ["appium/quickstart/install.md"],
|
|
10
|
+
"difficulty": "easy",
|
|
11
|
+
"category": "setup"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "q02",
|
|
15
|
+
"query": "What capabilities does the XCUITest driver support?",
|
|
16
|
+
"expectedSources": ["appium-xcuitest-driver/reference/capabilities.md"],
|
|
17
|
+
"difficulty": "easy",
|
|
18
|
+
"category": "capabilities"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "q03",
|
|
22
|
+
"query": "how to run iOS tests in parallel",
|
|
23
|
+
"expectedSources": ["appium-xcuitest-driver/guides/parallel-tests.md"],
|
|
24
|
+
"difficulty": "easy",
|
|
25
|
+
"category": "ios"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "q04",
|
|
29
|
+
"query": "push and pull files from an iOS device",
|
|
30
|
+
"expectedSources": ["appium-xcuitest-driver/guides/file-transfer.md"],
|
|
31
|
+
"difficulty": "easy",
|
|
32
|
+
"category": "ios"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "q05",
|
|
36
|
+
"query": "read and write the clipboard on iOS",
|
|
37
|
+
"expectedSources": ["appium-xcuitest-driver/guides/clipboard.md"],
|
|
38
|
+
"difficulty": "easy",
|
|
39
|
+
"category": "ios"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "q06",
|
|
43
|
+
"query": "what locator strategies are supported by XCUITest",
|
|
44
|
+
"expectedSources": [
|
|
45
|
+
"appium-xcuitest-driver/reference/locator-strategies.md"
|
|
46
|
+
],
|
|
47
|
+
"difficulty": "easy",
|
|
48
|
+
"category": "locators"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "q07",
|
|
52
|
+
"query": "how do I use iOS predicate strings to find elements",
|
|
53
|
+
"expectedSources": ["appium-xcuitest-driver/reference/ios-predicate.md"],
|
|
54
|
+
"difficulty": "easy",
|
|
55
|
+
"category": "locators"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "q08",
|
|
59
|
+
"query": "uiautomator2 driver capabilities",
|
|
60
|
+
"expectedSources": ["appium-uiautomator2-driver/capability-sets.md"],
|
|
61
|
+
"difficulty": "easy",
|
|
62
|
+
"category": "android"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "q09",
|
|
66
|
+
"query": "Appium server command line arguments",
|
|
67
|
+
"expectedSources": ["appium/cli/args.md"],
|
|
68
|
+
"difficulty": "easy",
|
|
69
|
+
"category": "cli"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "q10",
|
|
73
|
+
"query": "install a root certificate on an iOS device",
|
|
74
|
+
"expectedSources": [
|
|
75
|
+
"appium-xcuitest-driver/guides/install-certificate.md"
|
|
76
|
+
],
|
|
77
|
+
"difficulty": "easy",
|
|
78
|
+
"category": "ios"
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
{
|
|
82
|
+
"id": "q11",
|
|
83
|
+
"query": "I'm new to Appium, where should I start?",
|
|
84
|
+
"expectedSources": [
|
|
85
|
+
"appium/quickstart/index.md",
|
|
86
|
+
"appium/intro/index.md",
|
|
87
|
+
"appium/quickstart/requirements.md"
|
|
88
|
+
],
|
|
89
|
+
"difficulty": "medium",
|
|
90
|
+
"category": "intro"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "q12",
|
|
94
|
+
"query": "which driver should I use to automate android",
|
|
95
|
+
"expectedSources": [
|
|
96
|
+
"appium/quickstart/uiauto2-driver.md",
|
|
97
|
+
"appium/intro/drivers.md",
|
|
98
|
+
"appium/ecosystem/drivers.md"
|
|
99
|
+
],
|
|
100
|
+
"difficulty": "medium",
|
|
101
|
+
"category": "android"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "q13",
|
|
105
|
+
"query": "how do I switch to a webview in an iOS hybrid app",
|
|
106
|
+
"expectedSources": [
|
|
107
|
+
"appium-xcuitest-driver/guides/hybrid.md",
|
|
108
|
+
"appium/guides/context.md"
|
|
109
|
+
],
|
|
110
|
+
"difficulty": "medium",
|
|
111
|
+
"category": "hybrid"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "q14",
|
|
115
|
+
"query": "how to set up code signing for real iPhone testing",
|
|
116
|
+
"expectedSources": [
|
|
117
|
+
"appium-xcuitest-driver/preparation/real-device-config.md",
|
|
118
|
+
"appium-xcuitest-driver/preparation/prov-profile-basic-auto.md",
|
|
119
|
+
"appium-xcuitest-driver/preparation/prov-profile-basic-manual.md"
|
|
120
|
+
],
|
|
121
|
+
"difficulty": "medium",
|
|
122
|
+
"category": "ios-real-device"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "q15",
|
|
126
|
+
"query": "swipe gesture on android",
|
|
127
|
+
"expectedSources": [
|
|
128
|
+
"appium-uiautomator2-driver/android-mobile-gestures.md"
|
|
129
|
+
],
|
|
130
|
+
"difficulty": "medium",
|
|
131
|
+
"category": "gestures"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"id": "q16",
|
|
135
|
+
"query": "running tests against an .aab Android App Bundle",
|
|
136
|
+
"expectedSources": ["appium-uiautomator2-driver/android-appbundle.md"],
|
|
137
|
+
"difficulty": "medium",
|
|
138
|
+
"category": "android"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "q17",
|
|
142
|
+
"query": "differences between Appium 1 and Appium 2",
|
|
143
|
+
"expectedSources": ["appium/guides/migrating-1-to-2.md"],
|
|
144
|
+
"difficulty": "medium",
|
|
145
|
+
"category": "migration"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "q18",
|
|
149
|
+
"query": "enable Touch ID in an iOS simulator test",
|
|
150
|
+
"expectedSources": ["appium-xcuitest-driver/guides/touch-id.md"],
|
|
151
|
+
"difficulty": "medium",
|
|
152
|
+
"category": "ios"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "q19",
|
|
156
|
+
"query": "use a custom WebDriverAgent server",
|
|
157
|
+
"expectedSources": [
|
|
158
|
+
"appium-xcuitest-driver/guides/wda-custom-server.md",
|
|
159
|
+
"appium-xcuitest-driver/guides/run-prebuilt-wda.md"
|
|
160
|
+
],
|
|
161
|
+
"difficulty": "medium",
|
|
162
|
+
"category": "wda"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "q20",
|
|
166
|
+
"query": "setting up Appium on a CI server",
|
|
167
|
+
"expectedSources": ["appium-xcuitest-driver/guides/ci-setup.md"],
|
|
168
|
+
"difficulty": "medium",
|
|
169
|
+
"category": "ci"
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
{
|
|
173
|
+
"id": "q21",
|
|
174
|
+
"query": "my tests are super slow on iOS, what's going on",
|
|
175
|
+
"expectedSources": [
|
|
176
|
+
"appium-xcuitest-driver/guides/wda-slowness.md",
|
|
177
|
+
"appium-xcuitest-driver/guides/troubleshooting.md"
|
|
178
|
+
],
|
|
179
|
+
"difficulty": "vague",
|
|
180
|
+
"category": "troubleshooting"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"id": "q22",
|
|
184
|
+
"query": "appium can't find my button",
|
|
185
|
+
"expectedSources": [
|
|
186
|
+
"appium-xcuitest-driver/guides/elements-lookup-troubleshooting.md",
|
|
187
|
+
"appium-xcuitest-driver/reference/locator-strategies.md"
|
|
188
|
+
],
|
|
189
|
+
"difficulty": "vague",
|
|
190
|
+
"category": "troubleshooting"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"id": "q23",
|
|
194
|
+
"query": "I switched xcode versions and now nothing works",
|
|
195
|
+
"expectedSources": [
|
|
196
|
+
"appium-xcuitest-driver/guides/multiple-xcode-versions.md"
|
|
197
|
+
],
|
|
198
|
+
"difficulty": "vague",
|
|
199
|
+
"category": "troubleshooting"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "q24",
|
|
203
|
+
"query": "can I reuse a WebDriverAgent that's already running",
|
|
204
|
+
"expectedSources": [
|
|
205
|
+
"appium-xcuitest-driver/guides/attach-to-running-wda.md"
|
|
206
|
+
],
|
|
207
|
+
"difficulty": "vague",
|
|
208
|
+
"category": "wda"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "q25",
|
|
212
|
+
"query": "show me how to write a test in python",
|
|
213
|
+
"expectedSources": ["appium/quickstart/test-py.md"],
|
|
214
|
+
"difficulty": "vague",
|
|
215
|
+
"category": "clients"
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
@@ -10,13 +10,16 @@
|
|
|
10
10
|
export declare class SentenceTransformersEmbeddings {
|
|
11
11
|
private model;
|
|
12
12
|
private modelName;
|
|
13
|
+
private queryInstruction;
|
|
13
14
|
private isInitialized;
|
|
14
15
|
private transformers;
|
|
15
16
|
constructor(options?: {
|
|
16
17
|
modelName?: string;
|
|
18
|
+
queryInstruction?: string;
|
|
17
19
|
});
|
|
18
20
|
/**
|
|
19
|
-
* Generate embeddings for a single text (LangChain interface)
|
|
21
|
+
* Generate embeddings for a single text (LangChain interface).
|
|
22
|
+
* Applies queryInstruction prefix when set.
|
|
20
23
|
*/
|
|
21
24
|
embedQuery(text: string): Promise<number[]>;
|
|
22
25
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentence-transformers-embeddings.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,qBAAa,8BAA8B;IACzC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAa;gBAErB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;
|
|
1
|
+
{"version":3,"file":"sentence-transformers-embeddings.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,qBAAa,8BAA8B;IACzC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAa;gBAErB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO;IAO3E;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4BjD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA0C1D;;OAEG;YACW,sBAAsB;IAoBpC;;OAEG;YACW,eAAe;CAyB9B"}
|
|
@@ -11,14 +11,18 @@ import log from '../../logger.js';
|
|
|
11
11
|
export class SentenceTransformersEmbeddings {
|
|
12
12
|
model = null;
|
|
13
13
|
modelName;
|
|
14
|
+
queryInstruction;
|
|
14
15
|
isInitialized = false;
|
|
15
16
|
transformers = null;
|
|
16
17
|
constructor(options = {}) {
|
|
17
|
-
// Use a lightweight, fast model by default
|
|
18
18
|
this.modelName = options.modelName || 'Xenova/all-MiniLM-L6-v2';
|
|
19
|
+
// Optional prefix prepended only to queries (not documents).
|
|
20
|
+
// BGE models use this to close the question/passage style gap.
|
|
21
|
+
this.queryInstruction = options.queryInstruction ?? '';
|
|
19
22
|
}
|
|
20
23
|
/**
|
|
21
|
-
* Generate embeddings for a single text (LangChain interface)
|
|
24
|
+
* Generate embeddings for a single text (LangChain interface).
|
|
25
|
+
* Applies queryInstruction prefix when set.
|
|
22
26
|
*/
|
|
23
27
|
async embedQuery(text) {
|
|
24
28
|
await this.initializeModel();
|
|
@@ -26,7 +30,10 @@ export class SentenceTransformersEmbeddings {
|
|
|
26
30
|
throw new Error('Model not initialized');
|
|
27
31
|
}
|
|
28
32
|
try {
|
|
29
|
-
const
|
|
33
|
+
const input = this.queryInstruction
|
|
34
|
+
? `${this.queryInstruction}${text}`
|
|
35
|
+
: text;
|
|
36
|
+
const result = await this.model(input, {
|
|
30
37
|
pooling: 'mean',
|
|
31
38
|
normalize: true,
|
|
32
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentence-transformers-embeddings.js","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAElC;;GAEG;AACH,MAAM,OAAO,8BAA8B;IACjC,KAAK,GAAQ,IAAI,CAAC;IAClB,SAAS,CAAS;IAClB,aAAa,GAAY,KAAK,CAAC;IAC/B,YAAY,GAAQ,IAAI,CAAC;IAEjC,YAAY,
|
|
1
|
+
{"version":3,"file":"sentence-transformers-embeddings.js","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-pdf-indexer.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/simple-pdf-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"simple-pdf-indexer.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/simple-pdf-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AA6D3E;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAAa,EACxB,YAAY,GAAE,MAAY,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAwC5B;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CA2CnB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAAa,EACxB,YAAY,GAAE,MAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAa,EACxB,YAAY,GAAE,MAAY,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsFnB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6BrB"}
|
|
@@ -27,8 +27,17 @@ function getEmbeddings() {
|
|
|
27
27
|
try {
|
|
28
28
|
// Use local sentence-transformers (no API key required)
|
|
29
29
|
log.info('Using local sentence-transformers embeddings');
|
|
30
|
-
const modelName = process.env.SENTENCE_TRANSFORMERS_MODEL || 'Xenova/
|
|
31
|
-
|
|
30
|
+
const modelName = process.env.SENTENCE_TRANSFORMERS_MODEL || 'Xenova/bge-small-en-v1.5';
|
|
31
|
+
// BGE models benefit from a query instruction prefix to align the
|
|
32
|
+
// embedding space between short questions and longer document passages.
|
|
33
|
+
// Applied to embedQuery() only; embedDocuments() is unchanged.
|
|
34
|
+
const queryInstruction = modelName.includes('bge')
|
|
35
|
+
? 'Represent this sentence for searching relevant passages: '
|
|
36
|
+
: '';
|
|
37
|
+
embeddings = new SentenceTransformersEmbeddings({
|
|
38
|
+
modelName,
|
|
39
|
+
queryInstruction,
|
|
40
|
+
});
|
|
32
41
|
log.info(`Using sentence-transformers model: ${modelName}`);
|
|
33
42
|
}
|
|
34
43
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-pdf-indexer.js","sourceRoot":"","sources":["../../../src/tools/documentation/simple-pdf-indexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"simple-pdf-indexer.js","sourceRoot":"","sources":["../../../src/tools/documentation/simple-pdf-indexer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-mcp",
|
|
3
3
|
"mcpName": "io.github.appium/appium-mcp",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.73.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
19
|
"build": "rimraf dist tsconfig.tsbuildinfo && tsc -b && chmod +x dist/index.js && npm run copy-docs",
|
|
20
|
-
"copy-docs": "mkdir -p dist/tools/documentation/uploads && cp -f src/tools/documentation/uploads/documents.json dist/tools/documentation/uploads/documents.json 2>/dev/null || true",
|
|
20
|
+
"copy-docs": "mkdir -p dist/tools/documentation/uploads dist/scripts && cp -f src/tools/documentation/uploads/documents.json dist/tools/documentation/uploads/documents.json 2>/dev/null || true && cp -f src/scripts/rag-eval-dataset.json dist/scripts/rag-eval-dataset.json 2>/dev/null || true",
|
|
21
21
|
"start": "node dist/index.js",
|
|
22
22
|
"start:stdio": "node dist/index.js",
|
|
23
23
|
"start:httpStream": "node dist/index.js --httpStream",
|
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
"check": "npm run lint && npm run format:check",
|
|
36
36
|
"index-docs": "node dist/scripts/simple-index-documentation.js",
|
|
37
37
|
"query-docs": "node dist/scripts/simple-query-documentation.js",
|
|
38
|
+
"eval-docs": "node dist/scripts/eval-documentation-rag.js",
|
|
39
|
+
"eval-docs:save": "node dist/scripts/eval-documentation-rag.js --save",
|
|
38
40
|
"sync-version": "node scripts/sync-version.mjs",
|
|
39
41
|
"version": "npm run sync-version",
|
|
40
42
|
"zip-assets": "node scripts/zip-assets.mjs zip",
|
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.appium/appium-mcp",
|
|
4
4
|
"title": "MCP Appium - Mobile Development and Automation Server",
|
|
5
5
|
"description": "MCP server for Appium mobile automation on iOS and Android devices with test creation tools.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.73.0",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "appium-mcp",
|
|
11
|
-
"version": "1.
|
|
11
|
+
"version": "1.73.0",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
|
Binary file
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG retrieval eval harness for the Appium documentation tool.
|
|
3
|
+
*
|
|
4
|
+
* Usage (after `npm run build`):
|
|
5
|
+
* node dist/scripts/eval-documentation-rag.js [--quiet] [--save] [--top-chunks=N]
|
|
6
|
+
*
|
|
7
|
+
* What it does:
|
|
8
|
+
* 1. Loads the eval dataset (src/scripts/rag-eval-dataset.json).
|
|
9
|
+
* 2. For each query, calls the existing queryVectorStore() with `topChunks`
|
|
10
|
+
* chunks (default 30), dedupes by source (preserving rank), and matches
|
|
11
|
+
* the resulting source list against expectedSources.
|
|
12
|
+
* 3. Reports Recall@{1,3,5,10} and MRR, broken down by difficulty.
|
|
13
|
+
* 4. Persists results to src/scripts/eval-results/<ISO>.json plus a
|
|
14
|
+
* `latest.json` so successive runs can be diffed.
|
|
15
|
+
*
|
|
16
|
+
* Notes:
|
|
17
|
+
* - The first run after a server restart pays the embedding cold start
|
|
18
|
+
* (~30-60s for the current corpus).
|
|
19
|
+
* - Match strategy: a retrieved source matches an expected source if its
|
|
20
|
+
* `relativePath` ends with the expected path (case-sensitive).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import * as fs from 'node:fs';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
|
|
27
|
+
import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
|
|
28
|
+
|
|
29
|
+
interface EvalQuery {
|
|
30
|
+
id: string;
|
|
31
|
+
query: string;
|
|
32
|
+
expectedSources: string[];
|
|
33
|
+
difficulty: 'easy' | 'medium' | 'vague';
|
|
34
|
+
category?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface EvalDataset {
|
|
38
|
+
version: number;
|
|
39
|
+
description: string;
|
|
40
|
+
matchMode?: 'endsWith' | 'exact';
|
|
41
|
+
queries: EvalQuery[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface PerQueryResult {
|
|
45
|
+
id: string;
|
|
46
|
+
query: string;
|
|
47
|
+
difficulty: EvalQuery['difficulty'];
|
|
48
|
+
category?: string;
|
|
49
|
+
expectedSources: string[];
|
|
50
|
+
retrievedSources: string[];
|
|
51
|
+
matchedAtRank: number | null;
|
|
52
|
+
matchedSource: string | null;
|
|
53
|
+
recallAt1: 0 | 1;
|
|
54
|
+
recallAt3: 0 | 1;
|
|
55
|
+
recallAt5: 0 | 1;
|
|
56
|
+
recallAt10: 0 | 1;
|
|
57
|
+
reciprocalRank: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface AggregateMetrics {
|
|
61
|
+
count: number;
|
|
62
|
+
recallAt1: number;
|
|
63
|
+
recallAt3: number;
|
|
64
|
+
recallAt5: number;
|
|
65
|
+
recallAt10: number;
|
|
66
|
+
mrr: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface EvalRun {
|
|
70
|
+
timestamp: string;
|
|
71
|
+
datasetVersion: number;
|
|
72
|
+
topChunks: number;
|
|
73
|
+
overall: AggregateMetrics;
|
|
74
|
+
byDifficulty: Record<string, AggregateMetrics>;
|
|
75
|
+
perQuery: PerQueryResult[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
79
|
+
const __dirname = path.dirname(__filename);
|
|
80
|
+
|
|
81
|
+
const args = new Set(process.argv.slice(2));
|
|
82
|
+
const QUIET = args.has('--quiet');
|
|
83
|
+
const NO_SAVE = !args.has('--save');
|
|
84
|
+
const topChunksArg = process.argv.find((a) => a.startsWith('--top-chunks='));
|
|
85
|
+
const TOP_CHUNKS = topChunksArg ? Number(topChunksArg.split('=')[1]) : 30;
|
|
86
|
+
|
|
87
|
+
function resolveDatasetPath(): string {
|
|
88
|
+
// When compiled, this file lives in dist/scripts/. We look for the dataset
|
|
89
|
+
// beside it first (copy-docs build step), then fall back to src/scripts/.
|
|
90
|
+
const candidates = [
|
|
91
|
+
path.resolve(__dirname, 'rag-eval-dataset.json'),
|
|
92
|
+
path.resolve(__dirname, '../../src/scripts/rag-eval-dataset.json'),
|
|
93
|
+
];
|
|
94
|
+
for (const p of candidates) {
|
|
95
|
+
if (fs.existsSync(p)) {
|
|
96
|
+
return p;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Could not find rag-eval-dataset.json in any of: ${candidates.join(', ')}`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function resolveResultsDir(): string {
|
|
105
|
+
// Always write results into the source tree so they're easy to diff/commit.
|
|
106
|
+
const candidates = [
|
|
107
|
+
path.resolve(__dirname, '../../src/scripts/eval-results'),
|
|
108
|
+
path.resolve(__dirname, 'eval-results'),
|
|
109
|
+
];
|
|
110
|
+
const dir = candidates[0];
|
|
111
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
112
|
+
return dir;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function matches(retrievedRelPath: string, expected: string): boolean {
|
|
116
|
+
return retrievedRelPath === expected || retrievedRelPath.endsWith(expected);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function dedupeBySource(
|
|
120
|
+
chunks: Array<{ relativePath: string | undefined }>
|
|
121
|
+
): string[] {
|
|
122
|
+
const seen = new Set<string>();
|
|
123
|
+
const ordered: string[] = [];
|
|
124
|
+
for (const c of chunks) {
|
|
125
|
+
const src = c.relativePath;
|
|
126
|
+
if (!src || seen.has(src)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
seen.add(src);
|
|
130
|
+
ordered.push(src);
|
|
131
|
+
}
|
|
132
|
+
return ordered;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function evalQuery(
|
|
136
|
+
retrievedSources: string[],
|
|
137
|
+
expectedSources: string[]
|
|
138
|
+
): {
|
|
139
|
+
matchedAtRank: number | null;
|
|
140
|
+
matchedSource: string | null;
|
|
141
|
+
} {
|
|
142
|
+
for (let i = 0; i < retrievedSources.length; i++) {
|
|
143
|
+
const hit = expectedSources.find((e) => matches(retrievedSources[i], e));
|
|
144
|
+
if (hit) {
|
|
145
|
+
return { matchedAtRank: i + 1, matchedSource: retrievedSources[i] };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { matchedAtRank: null, matchedSource: null };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function aggregate(results: PerQueryResult[]): AggregateMetrics {
|
|
152
|
+
if (results.length === 0) {
|
|
153
|
+
return {
|
|
154
|
+
count: 0,
|
|
155
|
+
recallAt1: 0,
|
|
156
|
+
recallAt3: 0,
|
|
157
|
+
recallAt5: 0,
|
|
158
|
+
recallAt10: 0,
|
|
159
|
+
mrr: 0,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const n = results.length;
|
|
163
|
+
const sum = (k: keyof PerQueryResult): number =>
|
|
164
|
+
results.reduce((acc, r) => acc + (r[k] as number), 0);
|
|
165
|
+
return {
|
|
166
|
+
count: n,
|
|
167
|
+
recallAt1: sum('recallAt1') / n,
|
|
168
|
+
recallAt3: sum('recallAt3') / n,
|
|
169
|
+
recallAt5: sum('recallAt5') / n,
|
|
170
|
+
recallAt10: sum('recallAt10') / n,
|
|
171
|
+
mrr: sum('reciprocalRank') / n,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function fmt(n: number): string {
|
|
176
|
+
return n.toFixed(3);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function rankStr(rank: number | null): string {
|
|
180
|
+
return rank === null ? ' - ' : String(rank).padStart(3, ' ');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function printPerQueryTable(results: PerQueryResult[]): void {
|
|
184
|
+
const rows = results.map((r) => ({
|
|
185
|
+
id: r.id,
|
|
186
|
+
diff: r.difficulty,
|
|
187
|
+
rank: rankStr(r.matchedAtRank),
|
|
188
|
+
query: r.query.length > 56 ? r.query.slice(0, 53) + '...' : r.query,
|
|
189
|
+
matched: r.matchedSource ?? '(none of expected found in top results)',
|
|
190
|
+
}));
|
|
191
|
+
|
|
192
|
+
const widths = {
|
|
193
|
+
id: 4,
|
|
194
|
+
diff: 7,
|
|
195
|
+
rank: 4,
|
|
196
|
+
query: Math.max(...rows.map((r) => r.query.length), 5),
|
|
197
|
+
matched: Math.max(...rows.map((r) => r.matched.length), 7),
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const header = `${'id'.padEnd(widths.id)} | ${'diff'.padEnd(widths.diff)} | ${'rank'.padStart(widths.rank)} | ${'query'.padEnd(widths.query)} | matched`;
|
|
201
|
+
const sep = '-'.repeat(header.length + 10);
|
|
202
|
+
|
|
203
|
+
console.log(sep);
|
|
204
|
+
console.log(header);
|
|
205
|
+
console.log(sep);
|
|
206
|
+
for (const r of rows) {
|
|
207
|
+
console.log(
|
|
208
|
+
`${r.id.padEnd(widths.id)} | ${r.diff.padEnd(widths.diff)} | ${r.rank.padStart(widths.rank)} | ${r.query.padEnd(widths.query)} | ${r.matched}`
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
console.log(sep);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function printAggregate(label: string, m: AggregateMetrics): void {
|
|
215
|
+
const tag = `${label} (n=${m.count})`.padEnd(20);
|
|
216
|
+
console.log(
|
|
217
|
+
`${tag} R@1=${fmt(m.recallAt1)} R@3=${fmt(m.recallAt3)} R@5=${fmt(m.recallAt5)} R@10=${fmt(m.recallAt10)} MRR=${fmt(m.mrr)}`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async function runEval(): Promise<void> {
|
|
222
|
+
const datasetPath = resolveDatasetPath();
|
|
223
|
+
const dataset: EvalDataset = JSON.parse(
|
|
224
|
+
fs.readFileSync(datasetPath, 'utf-8')
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
if (!QUIET) {
|
|
228
|
+
console.log(`\n=== Appium RAG eval ===`);
|
|
229
|
+
console.log(`Dataset: ${datasetPath}`);
|
|
230
|
+
console.log(
|
|
231
|
+
`Queries: ${dataset.queries.length} | topChunks: ${TOP_CHUNKS} | match: endsWith\n`
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const perQuery: PerQueryResult[] = [];
|
|
236
|
+
|
|
237
|
+
for (const q of dataset.queries) {
|
|
238
|
+
const docs = await queryVectorStore(q.query, TOP_CHUNKS);
|
|
239
|
+
const retrievedSources = dedupeBySource(
|
|
240
|
+
docs.map((d) => ({
|
|
241
|
+
relativePath:
|
|
242
|
+
(d.metadata?.relativePath as string | undefined) ??
|
|
243
|
+
(d.metadata?.filename as string | undefined) ??
|
|
244
|
+
(d.metadata?.source as string | undefined),
|
|
245
|
+
}))
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
const { matchedAtRank, matchedSource } = evalQuery(
|
|
249
|
+
retrievedSources,
|
|
250
|
+
q.expectedSources
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
perQuery.push({
|
|
254
|
+
id: q.id,
|
|
255
|
+
query: q.query,
|
|
256
|
+
difficulty: q.difficulty,
|
|
257
|
+
category: q.category,
|
|
258
|
+
expectedSources: q.expectedSources,
|
|
259
|
+
retrievedSources,
|
|
260
|
+
matchedAtRank,
|
|
261
|
+
matchedSource,
|
|
262
|
+
recallAt1: matchedAtRank !== null && matchedAtRank <= 1 ? 1 : 0,
|
|
263
|
+
recallAt3: matchedAtRank !== null && matchedAtRank <= 3 ? 1 : 0,
|
|
264
|
+
recallAt5: matchedAtRank !== null && matchedAtRank <= 5 ? 1 : 0,
|
|
265
|
+
recallAt10: matchedAtRank !== null && matchedAtRank <= 10 ? 1 : 0,
|
|
266
|
+
reciprocalRank: matchedAtRank !== null ? 1 / matchedAtRank : 0,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (!QUIET) {
|
|
271
|
+
printPerQueryTable(perQuery);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const overall = aggregate(perQuery);
|
|
275
|
+
const byDifficulty: Record<string, AggregateMetrics> = {};
|
|
276
|
+
for (const d of ['easy', 'medium', 'vague'] as const) {
|
|
277
|
+
byDifficulty[d] = aggregate(perQuery.filter((r) => r.difficulty === d));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
console.log('');
|
|
281
|
+
printAggregate('overall', overall);
|
|
282
|
+
for (const d of ['easy', 'medium', 'vague'] as const) {
|
|
283
|
+
printAggregate(d, byDifficulty[d]);
|
|
284
|
+
}
|
|
285
|
+
console.log('');
|
|
286
|
+
|
|
287
|
+
if (!NO_SAVE) {
|
|
288
|
+
const run: EvalRun = {
|
|
289
|
+
timestamp: new Date().toISOString(),
|
|
290
|
+
datasetVersion: dataset.version,
|
|
291
|
+
topChunks: TOP_CHUNKS,
|
|
292
|
+
overall,
|
|
293
|
+
byDifficulty,
|
|
294
|
+
perQuery,
|
|
295
|
+
};
|
|
296
|
+
const dir = resolveResultsDir();
|
|
297
|
+
const stamp = run.timestamp.replace(/[:.]/g, '-');
|
|
298
|
+
const outPath = path.join(dir, `${stamp}.json`);
|
|
299
|
+
const latestPath = path.join(dir, 'latest.json');
|
|
300
|
+
fs.writeFileSync(outPath, JSON.stringify(run, null, 2));
|
|
301
|
+
fs.writeFileSync(latestPath, JSON.stringify(run, null, 2));
|
|
302
|
+
console.log(`Saved: ${path.relative(process.cwd(), outPath)}`);
|
|
303
|
+
console.log(` ${path.relative(process.cwd(), latestPath)}\n`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
try {
|
|
308
|
+
await runEval();
|
|
309
|
+
} catch (err) {
|
|
310
|
+
console.error('Eval failed:', err);
|
|
311
|
+
process.exit(1);
|
|
312
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"description": "Realistic user queries for the Appium documentation RAG tool. Each query maps to one or more source files that should appear in the retrieved sources (substring match against the chunk's relativePath metadata). Difficulty buckets: easy (specific terms that should be near-trivial to retrieve), medium (real-world phrasing), vague (natural human phrasing with less direct cues).",
|
|
4
|
+
"matchMode": "endsWith",
|
|
5
|
+
"queries": [
|
|
6
|
+
{
|
|
7
|
+
"id": "q01",
|
|
8
|
+
"query": "How do I install Appium?",
|
|
9
|
+
"expectedSources": ["appium/quickstart/install.md"],
|
|
10
|
+
"difficulty": "easy",
|
|
11
|
+
"category": "setup"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "q02",
|
|
15
|
+
"query": "What capabilities does the XCUITest driver support?",
|
|
16
|
+
"expectedSources": ["appium-xcuitest-driver/reference/capabilities.md"],
|
|
17
|
+
"difficulty": "easy",
|
|
18
|
+
"category": "capabilities"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "q03",
|
|
22
|
+
"query": "how to run iOS tests in parallel",
|
|
23
|
+
"expectedSources": ["appium-xcuitest-driver/guides/parallel-tests.md"],
|
|
24
|
+
"difficulty": "easy",
|
|
25
|
+
"category": "ios"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "q04",
|
|
29
|
+
"query": "push and pull files from an iOS device",
|
|
30
|
+
"expectedSources": ["appium-xcuitest-driver/guides/file-transfer.md"],
|
|
31
|
+
"difficulty": "easy",
|
|
32
|
+
"category": "ios"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "q05",
|
|
36
|
+
"query": "read and write the clipboard on iOS",
|
|
37
|
+
"expectedSources": ["appium-xcuitest-driver/guides/clipboard.md"],
|
|
38
|
+
"difficulty": "easy",
|
|
39
|
+
"category": "ios"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "q06",
|
|
43
|
+
"query": "what locator strategies are supported by XCUITest",
|
|
44
|
+
"expectedSources": [
|
|
45
|
+
"appium-xcuitest-driver/reference/locator-strategies.md"
|
|
46
|
+
],
|
|
47
|
+
"difficulty": "easy",
|
|
48
|
+
"category": "locators"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "q07",
|
|
52
|
+
"query": "how do I use iOS predicate strings to find elements",
|
|
53
|
+
"expectedSources": ["appium-xcuitest-driver/reference/ios-predicate.md"],
|
|
54
|
+
"difficulty": "easy",
|
|
55
|
+
"category": "locators"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "q08",
|
|
59
|
+
"query": "uiautomator2 driver capabilities",
|
|
60
|
+
"expectedSources": ["appium-uiautomator2-driver/capability-sets.md"],
|
|
61
|
+
"difficulty": "easy",
|
|
62
|
+
"category": "android"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "q09",
|
|
66
|
+
"query": "Appium server command line arguments",
|
|
67
|
+
"expectedSources": ["appium/cli/args.md"],
|
|
68
|
+
"difficulty": "easy",
|
|
69
|
+
"category": "cli"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "q10",
|
|
73
|
+
"query": "install a root certificate on an iOS device",
|
|
74
|
+
"expectedSources": [
|
|
75
|
+
"appium-xcuitest-driver/guides/install-certificate.md"
|
|
76
|
+
],
|
|
77
|
+
"difficulty": "easy",
|
|
78
|
+
"category": "ios"
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
{
|
|
82
|
+
"id": "q11",
|
|
83
|
+
"query": "I'm new to Appium, where should I start?",
|
|
84
|
+
"expectedSources": [
|
|
85
|
+
"appium/quickstart/index.md",
|
|
86
|
+
"appium/intro/index.md",
|
|
87
|
+
"appium/quickstart/requirements.md"
|
|
88
|
+
],
|
|
89
|
+
"difficulty": "medium",
|
|
90
|
+
"category": "intro"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "q12",
|
|
94
|
+
"query": "which driver should I use to automate android",
|
|
95
|
+
"expectedSources": [
|
|
96
|
+
"appium/quickstart/uiauto2-driver.md",
|
|
97
|
+
"appium/intro/drivers.md",
|
|
98
|
+
"appium/ecosystem/drivers.md"
|
|
99
|
+
],
|
|
100
|
+
"difficulty": "medium",
|
|
101
|
+
"category": "android"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "q13",
|
|
105
|
+
"query": "how do I switch to a webview in an iOS hybrid app",
|
|
106
|
+
"expectedSources": [
|
|
107
|
+
"appium-xcuitest-driver/guides/hybrid.md",
|
|
108
|
+
"appium/guides/context.md"
|
|
109
|
+
],
|
|
110
|
+
"difficulty": "medium",
|
|
111
|
+
"category": "hybrid"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "q14",
|
|
115
|
+
"query": "how to set up code signing for real iPhone testing",
|
|
116
|
+
"expectedSources": [
|
|
117
|
+
"appium-xcuitest-driver/preparation/real-device-config.md",
|
|
118
|
+
"appium-xcuitest-driver/preparation/prov-profile-basic-auto.md",
|
|
119
|
+
"appium-xcuitest-driver/preparation/prov-profile-basic-manual.md"
|
|
120
|
+
],
|
|
121
|
+
"difficulty": "medium",
|
|
122
|
+
"category": "ios-real-device"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "q15",
|
|
126
|
+
"query": "swipe gesture on android",
|
|
127
|
+
"expectedSources": [
|
|
128
|
+
"appium-uiautomator2-driver/android-mobile-gestures.md"
|
|
129
|
+
],
|
|
130
|
+
"difficulty": "medium",
|
|
131
|
+
"category": "gestures"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"id": "q16",
|
|
135
|
+
"query": "running tests against an .aab Android App Bundle",
|
|
136
|
+
"expectedSources": ["appium-uiautomator2-driver/android-appbundle.md"],
|
|
137
|
+
"difficulty": "medium",
|
|
138
|
+
"category": "android"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "q17",
|
|
142
|
+
"query": "differences between Appium 1 and Appium 2",
|
|
143
|
+
"expectedSources": ["appium/guides/migrating-1-to-2.md"],
|
|
144
|
+
"difficulty": "medium",
|
|
145
|
+
"category": "migration"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "q18",
|
|
149
|
+
"query": "enable Touch ID in an iOS simulator test",
|
|
150
|
+
"expectedSources": ["appium-xcuitest-driver/guides/touch-id.md"],
|
|
151
|
+
"difficulty": "medium",
|
|
152
|
+
"category": "ios"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "q19",
|
|
156
|
+
"query": "use a custom WebDriverAgent server",
|
|
157
|
+
"expectedSources": [
|
|
158
|
+
"appium-xcuitest-driver/guides/wda-custom-server.md",
|
|
159
|
+
"appium-xcuitest-driver/guides/run-prebuilt-wda.md"
|
|
160
|
+
],
|
|
161
|
+
"difficulty": "medium",
|
|
162
|
+
"category": "wda"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "q20",
|
|
166
|
+
"query": "setting up Appium on a CI server",
|
|
167
|
+
"expectedSources": ["appium-xcuitest-driver/guides/ci-setup.md"],
|
|
168
|
+
"difficulty": "medium",
|
|
169
|
+
"category": "ci"
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
{
|
|
173
|
+
"id": "q21",
|
|
174
|
+
"query": "my tests are super slow on iOS, what's going on",
|
|
175
|
+
"expectedSources": [
|
|
176
|
+
"appium-xcuitest-driver/guides/wda-slowness.md",
|
|
177
|
+
"appium-xcuitest-driver/guides/troubleshooting.md"
|
|
178
|
+
],
|
|
179
|
+
"difficulty": "vague",
|
|
180
|
+
"category": "troubleshooting"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"id": "q22",
|
|
184
|
+
"query": "appium can't find my button",
|
|
185
|
+
"expectedSources": [
|
|
186
|
+
"appium-xcuitest-driver/guides/elements-lookup-troubleshooting.md",
|
|
187
|
+
"appium-xcuitest-driver/reference/locator-strategies.md"
|
|
188
|
+
],
|
|
189
|
+
"difficulty": "vague",
|
|
190
|
+
"category": "troubleshooting"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"id": "q23",
|
|
194
|
+
"query": "I switched xcode versions and now nothing works",
|
|
195
|
+
"expectedSources": [
|
|
196
|
+
"appium-xcuitest-driver/guides/multiple-xcode-versions.md"
|
|
197
|
+
],
|
|
198
|
+
"difficulty": "vague",
|
|
199
|
+
"category": "troubleshooting"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "q24",
|
|
203
|
+
"query": "can I reuse a WebDriverAgent that's already running",
|
|
204
|
+
"expectedSources": [
|
|
205
|
+
"appium-xcuitest-driver/guides/attach-to-running-wda.md"
|
|
206
|
+
],
|
|
207
|
+
"difficulty": "vague",
|
|
208
|
+
"category": "wda"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "q25",
|
|
212
|
+
"query": "show me how to write a test in python",
|
|
213
|
+
"expectedSources": ["appium/quickstart/test-py.md"],
|
|
214
|
+
"difficulty": "vague",
|
|
215
|
+
"category": "clients"
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
@@ -13,16 +13,20 @@ import log from '../../logger.js';
|
|
|
13
13
|
export class SentenceTransformersEmbeddings {
|
|
14
14
|
private model: any = null;
|
|
15
15
|
private modelName: string;
|
|
16
|
+
private queryInstruction: string;
|
|
16
17
|
private isInitialized: boolean = false;
|
|
17
18
|
private transformers: any = null;
|
|
18
19
|
|
|
19
|
-
constructor(options: { modelName?: string } = {}) {
|
|
20
|
-
// Use a lightweight, fast model by default
|
|
20
|
+
constructor(options: { modelName?: string; queryInstruction?: string } = {}) {
|
|
21
21
|
this.modelName = options.modelName || 'Xenova/all-MiniLM-L6-v2';
|
|
22
|
+
// Optional prefix prepended only to queries (not documents).
|
|
23
|
+
// BGE models use this to close the question/passage style gap.
|
|
24
|
+
this.queryInstruction = options.queryInstruction ?? '';
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
/**
|
|
25
|
-
* Generate embeddings for a single text (LangChain interface)
|
|
28
|
+
* Generate embeddings for a single text (LangChain interface).
|
|
29
|
+
* Applies queryInstruction prefix when set.
|
|
26
30
|
*/
|
|
27
31
|
async embedQuery(text: string): Promise<number[]> {
|
|
28
32
|
await this.initializeModel();
|
|
@@ -32,7 +36,10 @@ export class SentenceTransformersEmbeddings {
|
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
try {
|
|
35
|
-
const
|
|
39
|
+
const input = this.queryInstruction
|
|
40
|
+
? `${this.queryInstruction}${text}`
|
|
41
|
+
: text;
|
|
42
|
+
const result = await this.model(input, {
|
|
36
43
|
pooling: 'mean',
|
|
37
44
|
normalize: true,
|
|
38
45
|
});
|
|
@@ -33,8 +33,17 @@ function getEmbeddings(): SentenceTransformersEmbeddings {
|
|
|
33
33
|
// Use local sentence-transformers (no API key required)
|
|
34
34
|
log.info('Using local sentence-transformers embeddings');
|
|
35
35
|
const modelName =
|
|
36
|
-
process.env.SENTENCE_TRANSFORMERS_MODEL || 'Xenova/
|
|
37
|
-
|
|
36
|
+
process.env.SENTENCE_TRANSFORMERS_MODEL || 'Xenova/bge-small-en-v1.5';
|
|
37
|
+
// BGE models benefit from a query instruction prefix to align the
|
|
38
|
+
// embedding space between short questions and longer document passages.
|
|
39
|
+
// Applied to embedQuery() only; embedDocuments() is unchanged.
|
|
40
|
+
const queryInstruction = modelName.includes('bge')
|
|
41
|
+
? 'Represent this sentence for searching relevant passages: '
|
|
42
|
+
: '';
|
|
43
|
+
embeddings = new SentenceTransformersEmbeddings({
|
|
44
|
+
modelName,
|
|
45
|
+
queryInstruction,
|
|
46
|
+
});
|
|
38
47
|
log.info(`Using sentence-transformers model: ${modelName}`);
|
|
39
48
|
} catch (error) {
|
|
40
49
|
throw new Error(
|