Basics

Socket Timeout Configuration (PSR-18 Compatible Clients)

The PhpMistral library is fully PSR-18 compatible, meaning it relies on standardized HTTP clients for sending requests. This allows developers to plug in any compliant HTTP client (e.g., Symfony HttpClient, Guzzle, Curl) and configure network options such as timeouts easily.

This guide explains how to configure socket timeouts with different HTTP clients and integrate them with MistralClient.


Symfony HttpClient

Installation

composer require symfony/http-client nyholm/psr7

Configuration Example

use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpClient\Psr18Client;
use Partitech\PhpMistral\MistralClient;
use Partitech\PhpMistral\Messages;
use Partitech\PhpMistral\MistralClientException;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;

// Initialize Mistral client
$client = new MistralClient(apiKey: $apiKey);

// Configure Symfony HttpClient with timeouts
$httpClient = HttpClient::create([
    'timeout' => 1.0,          // Total request timeout in seconds
    'max_duration' => 2.0,     // Maximum execution time (including retries)
]);

// Wrap in PSR-18 compatible client
$psr18Client = new Psr18Client($httpClient);
$client->setClient($psr18Client);

// Prepare messages
$messages = $client->getMessages()->addUserMessage('What is the best French cheese?');

$params = [
    'model' => 'mistral-large-latest',
    'temperature' => 0.7,
    'top_p' => 1,
    'max_tokens' => null,
    'safe_prompt' => false,
    'random_seed' => null
];

try {
    foreach ($client->chat($messages, $params, true) as $chunk) {
        echo $chunk->getChunk();
    }
} catch (MistralClientException $e) {
    echo $e->getMessage();
    exit(1);
} catch (TransportExceptionInterface $e) {
    echo 'Idle timeout reached' . PHP_EOL;
}

If you are using Symfony, you can configure the HttpClient directly in your services.yaml and let Symfony handle dependency injection:

services:
    Symfony\Contracts\HttpClient\HttpClientInterface:
        factory: ['Symfony\Component\HttpClient\HttpClient', create]
        arguments:
            $options:
                timeout: 1.0
                max_duration: 2.0

You can then autowire HttpClientInterface or Psr18Client into your services and pass it to MistralClient.


Guzzle HTTP Client

Installation

composer require guzzlehttp/guzzle

Configuration Example

use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\RequestOptions;
use Http\Adapter\Guzzle7\Client as GuzzleAdapter;
use Partitech\PhpMistral\MistralClient;

$guzzleClient = new GuzzleClient([
    RequestOptions::CONNECT_TIMEOUT => 1.0, // Connection timeout
    RequestOptions::TIMEOUT => 0.6,          // Total request timeout
]);

$psr18Client = new GuzzleAdapter($guzzleClient);

$client = new MistralClient($apiKey);
$client->setClient($psr18Client);

Curl HTTP Client

Installation

composer require php-http/curl-client php-http/message nyholm/psr7

Configuration Example

use Http\Client\Curl\Client as CurlClient;
use Partitech\PhpMistral\MistralClient;

$curlClient = new CurlClient(null, null, [
    CURLOPT_CONNECTTIMEOUT => 3,  // Time to establish connection
    CURLOPT_TIMEOUT => 3,         // Total execution time
]);

$client = new MistralClient(apiKey: $apiKey);
$client->setClient($curlClient);

// Use the client as usual...

Laravel Integration (Custom Configuration)

In Laravel, you can create a custom binding for PSR-18 clients in a service provider:

use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpClient\Psr18Client;

$this->app->singleton(Psr18Client::class, function () {
    $httpClient = HttpClient::create([
        'timeout' => 1.0,
        'max_duration' => 2.0,
    ]);
    return new Psr18Client($httpClient);
});

You can inject this PSR-18 client into your services or directly into MistralClient.


Conclusion

By leveraging PSR-18 HTTP clients, PhpMistral allows flexible and customizable HTTP configurations. You can use your preferred HTTP client (Symfony, Guzzle, Curl) and set timeouts to avoid blocking issues when dealing with AI services.

  • Symfony offers built-in integration with autowiring.
  • Guzzle is widely used and flexible.
  • Curl provides low-level control.

Choose the client that best suits your application and always configure timeouts to ensure stability and reliability.