symfony/ai-azure-platform
Symfony AI bridge for Microsoft Azure AI: connect to Azure OpenAI and Azure AI Foundry (including Responses API) via Symfony components. Provides integration points to call Azure-hosted models from Symfony AI with links to official Azure references.
Install the Package:
composer require symfony/ai-azure-platform symfony/http-client
Configure Azure Credentials in .env:
AZURE_OPENAI_API_KEY=your_api_key_here
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
AZURE_FOUNDRY_ENDPOINT=https://your-foundry-resource.azure.com
Register the Service in config/services.php:
'azure_ai' => [
'api_key' => env('AZURE_OPENAI_API_KEY'),
'endpoint' => env('AZURE_OPENAI_ENDPOINT'),
'foundry_endpoint' => env('AZURE_FOUNDRY_ENDPOINT'),
],
Bind the Client in AppServiceProvider:
use Symfony\Component\AI\Azure\ModelClient;
use Symfony\Contracts\HttpClient\HttpClientInterface;
public function register()
{
$this->app->bind(ModelClient::class, function ($app) {
return new ModelClient(
$app->make(HttpClientInterface::class),
$app['config']['services.azure_ai']
);
});
}
First Use Case: Chat Completion
use Symfony\Component\AI\Azure\ModelClient;
public function generateResponse(ModelClient $client)
{
$response = $client->complete(
"Explain Laravel dependency injection in simple terms",
['model' => 'gpt-35-turbo']
);
return response()->json($response);
}
ClientInterface.// Using Responses API (v0.6.0+)
$response = $client->complete(
"Summarize this text: {$userInput}",
[
'model' => 'gpt-4',
'temperature' => 0.7,
'max_tokens' => 100,
]
);
$response = $client->complete(
"Extract entities from: 'Apple is looking at buying U.K. startup for $1 billion'",
[
'model' => 'gpt-35-turbo',
'structuredOutput' => [
'schema' => [
'type' => 'object',
'properties' => [
'companies' => ['type' => 'array', 'items' => ['type' => 'string']],
'amount' => ['type' => 'number'],
],
],
],
]
);
// Parse with Laravel Validator or spatie/laravel-array-to-object
// config/ai.php
'providers' => [
'azure_openai' => [
'class' => \Symfony\Component\AI\Azure\Provider\AzureOpenAIProvider::class,
'config' => config('services.azure_ai'),
'models' => ['gpt-35-turbo', 'gpt-4'],
],
'azure_foundry' => [
'class' => \Symfony\Component\AI\Azure\Provider\AzureFoundryProvider::class,
'config' => config('services.azure_foundry'),
'models' => ['llama-2-70b'],
],
];
// In a service:
$provider = app(\Symfony\Component\AI\Azure\Provider\AzureOpenAIProvider::class);
$response = $provider->getModel('gpt-4')->complete($prompt);
$foundryClient = new \Symfony\Component\AI\Azure\ModelClient(
$httpClient,
config('services.azure_foundry')
);
$response = $foundryClient->complete(
"Run this Python code: print('hello')",
['model' => 'llama-2-70b', 'deployment' => 'my-llama-deployment']
);
use Illuminate\Http\Request;
use Symfony\Component\AI\Azure\ModelClient;
public function aiEndpoint(Request $request, ModelClient $client)
{
$prompt = $request->input('prompt');
$response = $client->complete($prompt, [
'model' => config('ai.default_model'),
'temperature' => $request->input('temperature', 0.7),
]);
return response()->json($response);
}
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Symfony\Component\AI\Azure\ModelClient;
class AiGenerationJob implements ShouldQueue
{
use Queueable;
public function handle(ModelClient $client)
{
$response = $client->complete($this->prompt);
// Store in DB or broadcast
}
}
// Helper function
function aiGenerate($prompt)
{
return app(ModelClient::class)->complete($prompt);
}
// In Blade
@php
$aiResponse = aiGenerate("Write a blog intro about Laravel");
@endphp
<div>{{ $aiResponse['choices'][0]['message']['content'] }}</div>
HttpClientInterface for consistency:
$this->app->bind(HttpClientInterface::class, function () {
return \Illuminate\Support\Facades\Http::client();
});
$response = cache()->remember("ai_{$prompt}", now()->addHours(1), function () use ($client, $prompt) {
return $client->complete($prompt);
});
use Symfony\Component\AI\Event\AiEvent;
$dispatcher->dispatch(new AiEvent($response));
Validator:
$validator = Validator::make($response, [
'data' => 'required|array',
'data.*.text' => 'string|max:500',
]);
String Payload Errors (v0.6.0 Fix)
ModelClient throws InvalidArgumentException.// Wrong:
$client->complete("Hello"); // Fails
// Right:
$client->complete("Hello", []); // Works
Deployment Name Required for Foundry (v0.7.0 Fix)
deployment parameter.$client->complete($prompt, ['deployment' => 'my-llama-deployment']);
Structured Output Parsing
json_decode doesn’t handle gracefully.spatie/laravel-array-to-object or custom accessors:
use Spatie\ArrayToObject\ArrayToObject;
$structuredData = ArrayToObject::convert($response['data']);
Rate Limiting
429 errors.spatie/laravel-retryable:
use Spatie\Retryable\Retryable;
Retryable::retryIf(function () use ($client, $prompt) {
return $client->complete($prompt);
}, 3, function ($e) {
return $e->getCode() === 429;
});
Cold Start Latency
cache()->rememberForever()How can I help you explore Laravel packages today?