|
15 | 15 | ) |
16 | 16 | from basic_memory.repository.fastembed_provider import FastEmbedEmbeddingProvider |
17 | 17 | from basic_memory.repository.openai_provider import OpenAIEmbeddingProvider |
| 18 | +from basic_memory.repository.prefixing_provider import PrefixingEmbeddingProvider |
18 | 19 | from basic_memory.repository.semantic_errors import SemanticDependenciesMissingError |
19 | 20 |
|
20 | 21 |
|
@@ -547,6 +548,69 @@ def test_embedding_provider_factory_creates_new_provider_for_different_cache_key |
547 | 548 | assert provider_a is not provider_b |
548 | 549 |
|
549 | 550 |
|
| 551 | +def test_embedding_provider_factory_wraps_provider_when_prefixes_are_configured(): |
| 552 | + """Factory should apply literal prefixes independently of provider backend.""" |
| 553 | + config = BasicMemoryConfig( |
| 554 | + env="test", |
| 555 | + projects={"test-project": "/tmp/basic-memory-test"}, |
| 556 | + default_project="test-project", |
| 557 | + semantic_search_enabled=True, |
| 558 | + semantic_embedding_provider="fastembed", |
| 559 | + semantic_embedding_document_prefix="title: none | text: ", |
| 560 | + semantic_embedding_query_prefix="task: search result | query: ", |
| 561 | + ) |
| 562 | + |
| 563 | + provider = create_embedding_provider(config) |
| 564 | + |
| 565 | + assert isinstance(provider, PrefixingEmbeddingProvider) |
| 566 | + assert isinstance(provider.provider, FastEmbedEmbeddingProvider) |
| 567 | + assert provider.document_prefix == "title: none | text: " |
| 568 | + assert provider.query_prefix == "task: search result | query: " |
| 569 | + |
| 570 | + |
| 571 | +def test_embedding_provider_factory_reuses_provider_for_same_prefixes(): |
| 572 | + """Prefix fields participate in the process-local provider cache key.""" |
| 573 | + config = BasicMemoryConfig( |
| 574 | + env="test", |
| 575 | + projects={"test-project": "/tmp/basic-memory-test"}, |
| 576 | + default_project="test-project", |
| 577 | + semantic_search_enabled=True, |
| 578 | + semantic_embedding_provider="fastembed", |
| 579 | + semantic_embedding_document_prefix="doc: ", |
| 580 | + semantic_embedding_query_prefix="query: ", |
| 581 | + ) |
| 582 | + |
| 583 | + provider_a = create_embedding_provider(config) |
| 584 | + provider_b = create_embedding_provider(config) |
| 585 | + |
| 586 | + assert provider_a is provider_b |
| 587 | + |
| 588 | + |
| 589 | +def test_embedding_provider_factory_separates_cache_for_different_prefixes(): |
| 590 | + """Changing literal prefixes should not reuse a stale cached provider.""" |
| 591 | + shared_config = { |
| 592 | + "env": "test", |
| 593 | + "projects": {"test-project": "/tmp/basic-memory-test"}, |
| 594 | + "default_project": "test-project", |
| 595 | + "semantic_search_enabled": True, |
| 596 | + "semantic_embedding_provider": "fastembed", |
| 597 | + "semantic_embedding_query_prefix": "query: ", |
| 598 | + } |
| 599 | + first_config = BasicMemoryConfig( |
| 600 | + **shared_config, |
| 601 | + semantic_embedding_document_prefix="doc: ", |
| 602 | + ) |
| 603 | + second_config = BasicMemoryConfig( |
| 604 | + **shared_config, |
| 605 | + semantic_embedding_document_prefix="document: ", |
| 606 | + ) |
| 607 | + |
| 608 | + first_provider = create_embedding_provider(first_config) |
| 609 | + second_provider = create_embedding_provider(second_config) |
| 610 | + |
| 611 | + assert first_provider is not second_provider |
| 612 | + |
| 613 | + |
550 | 614 | def test_embedding_provider_factory_reuses_provider_when_only_thread_knobs_differ(): |
551 | 615 | """Thread/parallel knobs tune ONNX execution, not model identity (#872). |
552 | 616 |
|
|
0 commit comments