Skip to content

Commit 8f28848

Browse files
committed
fix: reuse existing bm project for repeated benchmark runs
Signed-off-by: phernandez <paul@basicmachines.co>
1 parent 5f9704a commit 8f28848

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ __pycache__/
33
.venv/
44
.pytest_cache/
55
.ruff_cache/
6+
.idea/
67

78
# Generated benchmark outputs
89
benchmarks/runs/
@@ -12,3 +13,4 @@ benchmarks/generated/
1213
# Downloaded datasets (source distribution may be restricted)
1314
benchmarks/datasets/locomo/locomo10.json
1415
benchmarks/datasets/locomo/locomo10.provenance.json
16+
.env

src/basic_memory_benchmarks/providers/bm_local.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import annotations
44

55
import json
6+
import re
67
import subprocess
78
from pathlib import Path
89
from typing import Any, cast
@@ -15,9 +16,21 @@
1516
class BasicMemoryLocalProvider(BenchmarkProvider):
1617
name = "bm-local"
1718

19+
def __init__(self) -> None:
20+
self._resolved_project_name: str | None = None
21+
1822
def _project_name(self, run_config: RunConfig) -> str:
23+
if self._resolved_project_name is not None:
24+
return self._resolved_project_name
1925
return f"bm-bench-{run_config.run_id}"
2026

27+
@staticmethod
28+
def _extract_existing_project_name(message: str) -> str | None:
29+
match = re.search(r"existing project '([^']+)'", message)
30+
if match:
31+
return match.group(1)
32+
return None
33+
2134
def ingest(self, corpus_path: Path, run_config: RunConfig) -> None:
2235
project_name = self._project_name(run_config)
2336

@@ -29,8 +42,16 @@ def ingest(self, corpus_path: Path, run_config: RunConfig) -> None:
2942
run_command(add_args)
3043
except subprocess.CalledProcessError as exc:
3144
merged = (exc.stdout or "") + "\n" + (exc.stderr or "")
32-
if "already exists" not in merged.lower():
33-
raise
45+
merged_lower = merged.lower()
46+
if "already exists" in merged_lower:
47+
pass
48+
else:
49+
existing = self._extract_existing_project_name(merged)
50+
if existing is None:
51+
raise
52+
project_name = existing
53+
54+
self._resolved_project_name = project_name
3455

3556
try:
3657
run_command(["bm", "reindex", "--search", "--embeddings", "-p", project_name])
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from basic_memory_benchmarks.providers.bm_local import BasicMemoryLocalProvider
2+
3+
4+
def test_extract_existing_project_name_from_bm_error() -> None:
5+
message = (
6+
"Error adding project: Cannot create project at '/tmp/docs': "
7+
"path is nested within existing project 'bm-bench-abc123' at '/tmp/docs'."
8+
)
9+
assert BasicMemoryLocalProvider._extract_existing_project_name(message) == "bm-bench-abc123"
10+
11+
12+
def test_extract_existing_project_name_none_without_match() -> None:
13+
message = "Error adding project: unknown failure"
14+
assert BasicMemoryLocalProvider._extract_existing_project_name(message) is None

0 commit comments

Comments
 (0)