Skip to content

Commit f6ed659

Browse files
committed
Resolve embedding provider by model identifier for taxonomy embeddings
1 parent 8be1cbc commit f6ed659

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

src/contracts/Search/Embedding/EmbeddingProviderResolverInterface.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ interface EmbeddingProviderResolverInterface
1414
* @throws \Ibexa\Contracts\Core\Search\Embedding\EmbeddingResolverNotFoundException
1515
*/
1616
public function resolve(): EmbeddingProviderInterface;
17+
18+
/**
19+
* @throws \Ibexa\Contracts\Core\Search\Embedding\EmbeddingResolverNotFoundException
20+
*/
21+
public function resolveByModelIdentifier(string $modelIdentifier): EmbeddingProviderInterface;
1722
}

src/lib/Search/Embedding/EmbeddingProviderResolver.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,18 @@ public function resolve(): EmbeddingProviderInterface
4040

4141
return $this->registry->getEmbeddingProvider($defaultEmbeddingProvider);
4242
}
43+
44+
public function resolveByModelIdentifier(string $modelIdentifier): EmbeddingProviderInterface
45+
{
46+
$model = $this->embeddingConfiguration->getModel($modelIdentifier);
47+
$providerIdentifier = $model['embedding_provider'];
48+
49+
if (!$this->registry->hasEmbeddingProvider($providerIdentifier)) {
50+
throw new EmbeddingResolverNotFoundException(
51+
$providerIdentifier
52+
);
53+
}
54+
55+
return $this->registry->getEmbeddingProvider($providerIdentifier);
56+
}
4357
}

tests/lib/Search/Embedding/EmbeddingProviderResolverTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,36 @@ public function testResolveThrowsWhenProviderMissing(): void
7979

8080
$this->resolver->resolve();
8181
}
82+
83+
public function testResolveByModelIdentifierReturnsProviderConfiguredForModel(): void
84+
{
85+
$modelIdentifier = 'gemini_embedding_001_1536';
86+
$embeddingProviderIdentifier = 'ibexa_gemini';
87+
$mockProvider = $this->createMock(EmbeddingProviderInterface::class);
88+
89+
$this->configuration
90+
->expects(self::once())
91+
->method('getModel')
92+
->with($modelIdentifier)
93+
->willReturn([
94+
'name' => 'models/gemini-embedding-001',
95+
'dimensions' => 1536,
96+
'field_suffix' => 'gemini_1536',
97+
'embedding_provider' => $embeddingProviderIdentifier,
98+
]);
99+
100+
$this->registry
101+
->expects(self::once())
102+
->method('hasEmbeddingProvider')
103+
->with($embeddingProviderIdentifier)
104+
->willReturn(true);
105+
106+
$this->registry
107+
->expects(self::once())
108+
->method('getEmbeddingProvider')
109+
->with($embeddingProviderIdentifier)
110+
->willReturn($mockProvider);
111+
112+
self::assertSame($mockProvider, $this->resolver->resolveByModelIdentifier($modelIdentifier));
113+
}
82114
}

0 commit comments

Comments
 (0)