Skip to content

Commit a741f68

Browse files
committed
refactor(platform): ElevenLabs improvement
1 parent d06ff59 commit a741f68

File tree

19 files changed

+146
-133
lines changed

19 files changed

+146
-133
lines changed

UPGRADE.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
UPGRADE FROM 0.4 to 0.5
2+
=======================
3+
4+
Platform
5+
--------
6+
7+
* The `hostUrl` parameter for `ElevenLabsClient` has been removed
8+
* The `host` parameter for `ElevenLabsApiCatalog` has been removed
9+
* The `hostUrl` parameter for `PlatformFactory::create()` in `ElevenLabs` has been renamed to `endpoint`
10+
111
UPGRADE FROM 0.3 to 0.4
212
=======================
313

examples/elevenlabs/speech-to-text.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414

1515
require_once dirname(__DIR__).'/bootstrap.php';
1616

17-
$platform = PlatformFactory::create(
18-
apiKey: env('ELEVEN_LABS_API_KEY'),
19-
httpClient: http_client()
20-
);
17+
$platform = PlatformFactory::create(env('ELEVEN_LABS_API_KEY'), httpClient: http_client());
2118

2219
$result = $platform->invoke('scribe_v1', Audio::fromFile(dirname(__DIR__, 2).'/fixtures/audio.mp3'));
2320

examples/elevenlabs/text-to-speech-as-stream.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414

1515
require_once dirname(__DIR__).'/bootstrap.php';
1616

17-
$platform = PlatformFactory::create(
18-
apiKey: env('ELEVEN_LABS_API_KEY'),
19-
httpClient: http_client(),
20-
);
17+
$platform = PlatformFactory::create(env('ELEVEN_LABS_API_KEY'), httpClient: http_client());
2118

2219
$result = $platform->invoke('eleven_multilingual_v2', new Text('The first move is what sets everything in motion.'), [
2320
'voice' => 'Dslrhjl3ZpzrctukrQSN', // Brad (https://elevenlabs.io/app/voice-library?voiceId=Dslrhjl3ZpzrctukrQSN)

examples/elevenlabs/text-to-speech.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414

1515
require_once dirname(__DIR__).'/bootstrap.php';
1616

17-
$platform = PlatformFactory::create(
18-
apiKey: env('ELEVEN_LABS_API_KEY'),
19-
httpClient: http_client(),
20-
);
17+
$platform = PlatformFactory::create(env('ELEVEN_LABS_API_KEY'), httpClient: http_client());
2118

2219
$result = $platform->invoke('eleven_multilingual_v2', new Text('Hello world'), [
2320
'voice' => 'Dslrhjl3ZpzrctukrQSN', // Brad (https://elevenlabs.io/app/voice-library?voiceId=Dslrhjl3ZpzrctukrQSN)

src/ai-bundle/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
0.5
5+
---
6+
7+
* [BC BREAK] The `host_url` configuration key for `ElevenLabs` has been renamed `endpoint`
8+
49
0.4
510
---
611

src/ai-bundle/config/platform/elevenlabs.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
return (new ArrayNodeDefinition('elevenlabs'))
1717
->children()
1818
->stringNode('api_key')->isRequired()->end()
19-
->stringNode('host')
20-
->defaultValue('https://api.elevenlabs.io/v1')
19+
->stringNode('endpoint')
20+
->defaultValue('https://api.elevenlabs.io/v1/')
2121
->end()
2222
->stringNode('http_client')
2323
->defaultValue('http_client')

src/ai-bundle/config/services.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
use Symfony\AI\Platform\Bridge\Decart\ModelCatalog as DecartModelCatalog;
3737
use Symfony\AI\Platform\Bridge\DeepSeek\ModelCatalog as DeepSeekModelCatalog;
3838
use Symfony\AI\Platform\Bridge\DockerModelRunner\ModelCatalog as DockerModelRunnerModelCatalog;
39+
use Symfony\AI\Platform\Bridge\ElevenLabs\Contract\ElevenLabsContract;
3940
use Symfony\AI\Platform\Bridge\ElevenLabs\ModelCatalog as ElevenLabsModelCatalog;
4041
use Symfony\AI\Platform\Bridge\Gemini\Contract\GeminiContract;
4142
use Symfony\AI\Platform\Bridge\Gemini\ModelCatalog as GeminiModelCatalog;
@@ -83,6 +84,8 @@
8384
->factory([OpenAiContract::class, 'create'])
8485
->set('ai.platform.contract.anthropic', Contract::class)
8586
->factory([AnthropicContract::class, 'create'])
87+
->set('ai.platform.contract.elevenlabs', Contract::class)
88+
->factory([ElevenLabsContract::class, 'create'])
8689
->set('ai.platform.contract.gemini', Contract::class)
8790
->factory([GeminiContract::class, 'create'])
8891
->set('ai.platform.contract.huggingface', Contract::class)
@@ -107,7 +110,7 @@
107110
->set('ai.platform.model_catalog.deepseek', DeepSeekModelCatalog::class)
108111
->set('ai.platform.model_catalog.dockermodelrunner', DockerModelRunnerModelCatalog::class)
109112
->set('ai.platform.model_catalog.elevenlabs', ElevenLabsModelCatalog::class)
110-
->lazy(true)
113+
->lazy()
111114
->tag('proxy', ['interface' => ModelCatalogInterface::class])
112115
->set('ai.platform.model_catalog.gemini', GeminiModelCatalog::class)
113116
->set('ai.platform.model_catalog.huggingface', HuggingFaceModelCatalog::class)

src/ai-bundle/src/AiBundle.php

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -605,13 +605,29 @@ private function processPlatformConfig(string $type, array $platform, ContainerB
605605
throw new RuntimeException('ElevenLabs platform configuration requires "symfony/ai-eleven-labs-platform" package. Try running "composer require symfony/ai-eleven-labs-platform".');
606606
}
607607

608+
$httpClientReference = new Reference($platform['http_client']);
609+
610+
$scopedHttpClientDefinition = (new Definition(ScopingHttpClient::class))
611+
->setFactory([ScopingHttpClient::class, 'forBaseUri'])
612+
->setArguments([
613+
$httpClientReference,
614+
$platform['endpoint'],
615+
[
616+
'headers' => [
617+
'x-api-key' => $platform['api_key'],
618+
],
619+
],
620+
]);
621+
622+
$container->setDefinition('ai.platform.elevenlabs.scoped_http_client', $scopedHttpClientDefinition);
623+
624+
$httpClientReference = new Reference('ai.platform.elevenlabs.scoped_http_client');
625+
608626
if (\array_key_exists('api_catalog', $platform) && $platform['api_catalog']) {
609627
$catalogDefinition = (new Definition(ElevenLabsApiCatalog::class))
610628
->setLazy(true)
611629
->setArguments([
612-
new Reference($platform['http_client']),
613-
$platform['api_key'],
614-
$platform['host'],
630+
$httpClientReference,
615631
])
616632
->addTag('proxy', ['interface' => ModelCatalogInterface::class]);
617633

@@ -623,10 +639,10 @@ private function processPlatformConfig(string $type, array $platform, ContainerB
623639
->setLazy(true)
624640
->setArguments([
625641
$platform['api_key'],
626-
$platform['host'],
627-
new Reference($platform['http_client'], ContainerInterface::NULL_ON_INVALID_REFERENCE),
642+
$platform['endpoint'],
643+
$httpClientReference,
628644
new Reference('ai.platform.model_catalog.'.$type),
629-
null,
645+
new Reference('ai.platform.contract.'.$type),
630646
new Reference('event_dispatcher'),
631647
])
632648
->addTag('proxy', ['interface' => PlatformInterface::class])

src/ai-bundle/tests/DependencyInjection/AiBundleTest.php

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3895,7 +3895,7 @@ public function testToolboxWithoutExplicitToolsDefined()
38953895
$this->assertTrue($foundOutput, 'Default tool processor should have output tag with full agent ID');
38963896
}
38973897

3898-
public function testElevenLabsPlatformCanBeRegistered()
3898+
public function testElevenLabsPlatformCanBeConfigured()
38993899
{
39003900
$container = $this->buildContainer([
39013901
'ai' => [
@@ -3910,18 +3910,18 @@ public function testElevenLabsPlatformCanBeRegistered()
39103910
$this->assertTrue($container->hasDefinition('ai.platform.elevenlabs'));
39113911

39123912
$definition = $container->getDefinition('ai.platform.elevenlabs');
3913-
39143913
$this->assertTrue($definition->isLazy());
39153914
$this->assertSame([ElevenLabsPlatformFactory::class, 'create'], $definition->getFactory());
39163915

39173916
$this->assertCount(6, $definition->getArguments());
39183917
$this->assertSame('foo', $definition->getArgument(0));
3919-
$this->assertSame('https://api.elevenlabs.io/v1', $definition->getArgument(1));
3918+
$this->assertSame('https://api.elevenlabs.io/v1/', $definition->getArgument(1));
39203919
$this->assertInstanceOf(Reference::class, $definition->getArgument(2));
3921-
$this->assertSame('http_client', (string) $definition->getArgument(2));
3920+
$this->assertSame('ai.platform.elevenlabs.scoped_http_client', (string) $definition->getArgument(2));
39223921
$this->assertInstanceOf(Reference::class, $definition->getArgument(3));
39233922
$this->assertSame('ai.platform.model_catalog.elevenlabs', (string) $definition->getArgument(3));
3924-
$this->assertNull($definition->getArgument(4));
3923+
$this->assertInstanceOf(Reference::class, $definition->getArgument(4));
3924+
$this->assertSame('ai.platform.contract.elevenlabs', (string) $definition->getArgument(4));
39253925
$this->assertInstanceOf(Reference::class, $definition->getArgument(5));
39263926
$this->assertSame('event_dispatcher', (string) $definition->getArgument(5));
39273927

@@ -3940,16 +3940,13 @@ public function testElevenLabsPlatformCanBeRegistered()
39403940

39413941
$this->assertTrue($modelCatalogDefinition->hasTag('proxy'));
39423942
$this->assertSame([['interface' => ModelCatalogInterface::class]], $modelCatalogDefinition->getTag('proxy'));
3943-
}
39443943

3945-
public function testElevenLabsPlatformWithCustomEndpointCanBeRegistered()
3946-
{
39473944
$container = $this->buildContainer([
39483945
'ai' => [
39493946
'platform' => [
39503947
'elevenlabs' => [
3948+
'endpoint' => 'https://api.elevenlabs.io/v2',
39513949
'api_key' => 'foo',
3952-
'host' => 'https://api.elevenlabs.io/v2',
39533950
],
39543951
],
39553952
],
@@ -3958,18 +3955,18 @@ public function testElevenLabsPlatformWithCustomEndpointCanBeRegistered()
39583955
$this->assertTrue($container->hasDefinition('ai.platform.elevenlabs'));
39593956

39603957
$definition = $container->getDefinition('ai.platform.elevenlabs');
3961-
39623958
$this->assertTrue($definition->isLazy());
39633959
$this->assertSame([ElevenLabsPlatformFactory::class, 'create'], $definition->getFactory());
39643960

39653961
$this->assertCount(6, $definition->getArguments());
39663962
$this->assertSame('foo', $definition->getArgument(0));
39673963
$this->assertSame('https://api.elevenlabs.io/v2', $definition->getArgument(1));
39683964
$this->assertInstanceOf(Reference::class, $definition->getArgument(2));
3969-
$this->assertSame('http_client', (string) $definition->getArgument(2));
3965+
$this->assertSame('ai.platform.elevenlabs.scoped_http_client', (string) $definition->getArgument(2));
39703966
$this->assertInstanceOf(Reference::class, $definition->getArgument(3));
39713967
$this->assertSame('ai.platform.model_catalog.elevenlabs', (string) $definition->getArgument(3));
3972-
$this->assertNull($definition->getArgument(4));
3968+
$this->assertInstanceOf(Reference::class, $definition->getArgument(4));
3969+
$this->assertSame('ai.platform.contract.elevenlabs', (string) $definition->getArgument(4));
39733970
$this->assertInstanceOf(Reference::class, $definition->getArgument(5));
39743971
$this->assertSame('event_dispatcher', (string) $definition->getArgument(5));
39753972

@@ -3988,10 +3985,7 @@ public function testElevenLabsPlatformWithCustomEndpointCanBeRegistered()
39883985

39893986
$this->assertTrue($modelCatalogDefinition->hasTag('proxy'));
39903987
$this->assertSame([['interface' => ModelCatalogInterface::class]], $modelCatalogDefinition->getTag('proxy'));
3991-
}
39923988

3993-
public function testElevenLabsPlatformWithCustomHttpClientCanBeRegistered()
3994-
{
39953989
$container = $this->buildContainer([
39963990
'ai' => [
39973991
'platform' => [
@@ -4012,12 +4006,13 @@ public function testElevenLabsPlatformWithCustomHttpClientCanBeRegistered()
40124006

40134007
$this->assertCount(6, $definition->getArguments());
40144008
$this->assertSame('foo', $definition->getArgument(0));
4015-
$this->assertSame('https://api.elevenlabs.io/v1', $definition->getArgument(1));
4009+
$this->assertSame('https://api.elevenlabs.io/v1/', $definition->getArgument(1));
40164010
$this->assertInstanceOf(Reference::class, $definition->getArgument(2));
4017-
$this->assertSame('foo', (string) $definition->getArgument(2));
4011+
$this->assertSame('ai.platform.elevenlabs.scoped_http_client', (string) $definition->getArgument(2));
40184012
$this->assertInstanceOf(Reference::class, $definition->getArgument(3));
40194013
$this->assertSame('ai.platform.model_catalog.elevenlabs', (string) $definition->getArgument(3));
4020-
$this->assertNull($definition->getArgument(4));
4014+
$this->assertInstanceOf(Reference::class, $definition->getArgument(4));
4015+
$this->assertSame('ai.platform.contract.elevenlabs', (string) $definition->getArgument(4));
40214016
$this->assertInstanceOf(Reference::class, $definition->getArgument(5));
40224017
$this->assertSame('event_dispatcher', (string) $definition->getArgument(5));
40234018

@@ -4036,10 +4031,7 @@ public function testElevenLabsPlatformWithCustomHttpClientCanBeRegistered()
40364031

40374032
$this->assertTrue($modelCatalogDefinition->hasTag('proxy'));
40384033
$this->assertSame([['interface' => ModelCatalogInterface::class]], $modelCatalogDefinition->getTag('proxy'));
4039-
}
40404034

4041-
public function testElevenLabsPlatformWithApiCatalogCanBeRegistered()
4042-
{
40434035
$container = $this->buildContainer([
40444036
'ai' => [
40454037
'platform' => [
@@ -4061,12 +4053,13 @@ public function testElevenLabsPlatformWithApiCatalogCanBeRegistered()
40614053

40624054
$this->assertCount(6, $definition->getArguments());
40634055
$this->assertSame('foo', $definition->getArgument(0));
4064-
$this->assertSame('https://api.elevenlabs.io/v1', $definition->getArgument(1));
4056+
$this->assertSame('https://api.elevenlabs.io/v1/', $definition->getArgument(1));
40654057
$this->assertInstanceOf(Reference::class, $definition->getArgument(2));
4066-
$this->assertSame('http_client', (string) $definition->getArgument(2));
4058+
$this->assertSame('ai.platform.elevenlabs.scoped_http_client', (string) $definition->getArgument(2));
40674059
$this->assertInstanceOf(Reference::class, $definition->getArgument(3));
40684060
$this->assertSame('ai.platform.model_catalog.elevenlabs', (string) $definition->getArgument(3));
4069-
$this->assertNull($definition->getArgument(4));
4061+
$this->assertInstanceOf(Reference::class, $definition->getArgument(4));
4062+
$this->assertSame('ai.platform.contract.elevenlabs', (string) $definition->getArgument(4));
40704063
$this->assertInstanceOf(Reference::class, $definition->getArgument(5));
40714064
$this->assertSame('event_dispatcher', (string) $definition->getArgument(5));
40724065

@@ -4082,11 +4075,9 @@ public function testElevenLabsPlatformWithApiCatalogCanBeRegistered()
40824075

40834076
$this->assertSame(ElevenLabsApiCatalog::class, $modelCatalogDefinition->getClass());
40844077
$this->assertTrue($modelCatalogDefinition->isLazy());
4085-
$this->assertCount(3, $modelCatalogDefinition->getArguments());
4078+
$this->assertCount(1, $modelCatalogDefinition->getArguments());
40864079
$this->assertInstanceOf(Reference::class, $modelCatalogDefinition->getArgument(0));
4087-
$this->assertSame('http_client', (string) $modelCatalogDefinition->getArgument(0));
4088-
$this->assertSame('foo', $modelCatalogDefinition->getArgument(1));
4089-
$this->assertSame('https://api.elevenlabs.io/v1', $modelCatalogDefinition->getArgument(2));
4080+
$this->assertSame('ai.platform.elevenlabs.scoped_http_client', (string) $modelCatalogDefinition->getArgument(0));
40904081

40914082
$this->assertTrue($modelCatalogDefinition->hasTag('proxy'));
40924083
$this->assertSame([['interface' => ModelCatalogInterface::class]], $modelCatalogDefinition->getTag('proxy'));
@@ -7602,7 +7593,7 @@ private function getFullConfig(): array
76027593
'api_key' => 'foo',
76037594
],
76047595
'elevenlabs' => [
7605-
'host' => 'https://api.elevenlabs.io/v1',
7596+
'endpoint' => 'https://api.elevenlabs.io/v1',
76067597
'api_key' => 'elevenlabs_key_full',
76077598
],
76087599
'failover' => [

src/platform/src/Bridge/ElevenLabs/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
CHANGELOG
22
=========
33

4+
0.5
5+
---
6+
7+
* [BC BREAK] The `hostUrl` parameter for `ElevenLabsClient` has been removed
8+
* [BC BREAK] The `host` parameter for `ElevenLabsApiCatalog` has been removed
9+
* [BC BREAK] The `hostUrl` parameter for `PlatformFactory::create()` has been renamed to `endpoint`
10+
411
0.3
512
---
613

0 commit comments

Comments
 (0)