Verify genuine Google CPU hybrid MCP from Windows archive

This commit is contained in:
karl committed 2026-10-13 11:59:33 +02:00
1 parent 3a336ca948
commit 3427abfd0f
2 files changed
+72 -6

No files matched your search

+26
View File
@@ -55,6 +55,32 @@ SHA-256 `fd5cf6244410b2373ffac38cf94e9f25b7c711737401ee96d6cb29721a1f8e51`.
python tools/windows_agent_smoke.py --cli C:/path/to/searchi-cli.exe --work-dir .searchi/qa/new-agent-smoke python tools/windows_agent_smoke.py --cli C:/path/to/searchi-cli.exe --work-dir .searchi/qa/new-agent-smoke
``` ```
### Genuine Google CPU package check
The same harness optionally accepts `--model-dir` and `--embedding-worker`.
It builds a new text-only semantic generation before starting hybrid MCP, with
one CPU inference thread and `SEARCHI_FORCE_CPU=1`. The meaning query
`ending a vendor relationship` must have no lexical matches, retrieve
`contract.txt` as a semantic top result, and return the original cited passage.
The report requires three actual document inference calls, not reused vectors.
The normal archive worker and all 25 DLLs were extracted alongside its CLI.
The Windows CPU check passed, including the optimized Python confirmation,
2026-10-13. Generation 1 contains three chunks; the result reports hybrid mode
and semantic availability. No test worker remained after completion; the
installed desktop's independent query worker was retained.
Ignored confirmed evidence:
`.searchi/qa/agent-mcp-google-confirmed-20261013/report.json`, SHA-256
`5d4bddbe73fdf9a30e19fece1622d0d3d9aefe4e2c19816d3df928ea78c3fde2`.
This tiny document/code fixture proves real package inference and MCP citation
integration. It does not establish broad relevance, media quality, GPU parity
or native UI latency; semantic neighbours can still include irrelevant files.
```powershell
python tools/windows_agent_smoke.py --cli C:/path/to/searchi-cli.exe --work-dir .searchi/qa/new-google-smoke --model-dir C:/path/to/verified/models --embedding-worker C:/path/to/searchi-gemma-worker.exe
```
For names/content only: For names/content only:
```sh ```sh
+46 -6
View File
@@ -15,7 +15,7 @@ def check(condition, message):
raise RuntimeError(message) raise RuntimeError(message)
def smoke(cli, work): def smoke(cli, work, models=None, worker=None):
cli = cli.resolve(strict=True) cli = cli.resolve(strict=True)
work.mkdir(parents=True, exist_ok=False) work.mkdir(parents=True, exist_ok=False)
corpus = work / "documents" corpus = work / "documents"
@@ -34,8 +34,22 @@ def smoke(cli, work):
[str(cli), "index", "--db", str(db), "--root", str(corpus)], [str(cli), "index", "--db", str(db), "--root", str(corpus)],
env=environment, check=True, capture_output=True, timeout=60, env=environment, check=True, capture_output=True, timeout=60,
) )
check((models is None) == (worker is None), "Supply both models and worker")
semantic_args = []
embedding = None
if models is not None:
models = models.resolve(strict=True)
worker = worker.resolve(strict=True)
semantic_args = ["--model-dir", str(models), "--embedding-worker", str(worker),
"--cpu-threads", "1"]
encoded = subprocess.run(
[str(cli), "embed", "--db", str(db), *semantic_args, "--text-only"],
env=environment, check=True, capture_output=True, timeout=180,
text=True, encoding="utf-8",
)
embedding = json.loads(encoded.stdout)
child = subprocess.Popen( child = subprocess.Popen(
[str(cli), "mcp", "--db", str(db)], env=environment, [str(cli), "mcp", "--db", str(db), *semantic_args], env=environment,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,
text=True, encoding="utf-8", text=True, encoding="utf-8",
) )
@@ -86,7 +100,8 @@ def smoke(cli, work):
found = request(3, "tools/call", {"name": "search", "arguments": { found = request(3, "tools/call", {"name": "search", "arguments": {
"query": "termination", "extension": "txt", "limit": 3, "query": "termination", "extension": "txt", "limit": 3,
}})["structuredContent"] }})["structuredContent"]
check(found["mode"] == "lexical_only", "Incorrect readiness mode") expected_mode = "hybrid" if models is not None else "lexical_only"
check(found["mode"] == expected_mode, "Incorrect readiness mode")
check(found["results"][0]["filename"] == "contract.txt", "Wrong document") check(found["results"][0]["filename"] == "contract.txt", "Wrong document")
source = request(4, "tools/call", {"name": "read_source", "arguments": { source = request(4, "tools/call", {"name": "read_source", "arguments": {
"handle": found["results"][0]["source_handle"], "handle": found["results"][0]["source_handle"],
@@ -103,8 +118,31 @@ def smoke(cli, work):
"Code filter included ordinary documents") "Code filter included ordinary documents")
with cli.open("rb") as stream: with cli.open("rb") as stream:
checksum = hashlib.file_digest(stream, "sha256").hexdigest() checksum = hashlib.file_digest(stream, "sha256").hexdigest()
report = {"complete": True, "cli_sha256": checksum, "mode": "lexical_only", semantic = None
"cpu_forced": True, "inference": False, "tool_names": [t["name"] for t in tools], if models is not None:
lexical = subprocess.run(
[str(cli), "search", "--db", str(db), "ending a vendor relationship",
"--extension", "txt", "--json"],
env=environment, check=True, capture_output=True, timeout=15,
text=True, encoding="utf-8",
)
check(json.loads(lexical.stdout) == [], "Meaning query has lexical matches")
check(embedding["document_inference_calls"] == 3,
"Fixture documents were not actually encoded")
semantic = request(7, "tools/call", {"name": "search", "arguments": {
"query": "ending a vendor relationship", "extension": "txt", "limit": 3,
}})["structuredContent"]
check(semantic["mode"] == "hybrid", "Semantic request lost hybrid mode")
check(semantic["results"][0]["filename"] == "contract.txt", "Meaning query failed")
check(semantic["results"][0]["match_kind"] == "semantic", "Not a semantic match")
cited = request(8, "tools/call", {"name": "read_source", "arguments": {
"handle": semantic["results"][0]["source_handle"],
}})["structuredContent"]
check("sixty days" in cited["text"], "Semantic citation lost source text")
report = {"complete": True, "cli_sha256": checksum, "mode": expected_mode,
"cpu_forced": True, "inference": models is not None,
"embedding": embedding, "semantic": semantic,
"tool_names": [t["name"] for t in tools],
"search": found, "source": source, "code": code} "search": found, "source": source, "code": code}
with (work / "report.json").open("x", encoding="utf-8") as stream: with (work / "report.json").open("x", encoding="utf-8") as stream:
json.dump(report, stream, indent=2) json.dump(report, stream, indent=2)
@@ -123,7 +161,9 @@ if __name__ == "__main__":
parser.add_argument("--cli", type=Path, required=True) parser.add_argument("--cli", type=Path, required=True)
parser.add_argument("--work-dir", type=Path, required=True, parser.add_argument("--work-dir", type=Path, required=True,
help="New owned fixture/evidence directory, retained after the run") help="New owned fixture/evidence directory, retained after the run")
parser.add_argument("--model-dir", type=Path)
parser.add_argument("--embedding-worker", type=Path)
args = parser.parse_args() args = parser.parse_args()
result = smoke(args.cli, args.work_dir.resolve()) result = smoke(args.cli, args.work_dir.resolve(), args.model_dir, args.embedding_worker)
print(json.dumps({"complete": result["complete"], "mode": result["mode"], print(json.dumps({"complete": result["complete"], "mode": result["mode"],
"cli_sha256": result["cli_sha256"]})) "cli_sha256": result["cli_sha256"]}))