diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php
index a6e6808..7fece4c 100644
--- a/src/ServiceProvider.php
+++ b/src/ServiceProvider.php
@@ -4,6 +4,7 @@
 
 namespace OpenAI\Laravel;
 
+use Illuminate\Container\Container;
 use Illuminate\Contracts\Support\DeferrableProvider;
 use Illuminate\Support\ServiceProvider as BaseServiceProvider;
 use OpenAI;
@@ -12,6 +13,10 @@
 use OpenAI\Laravel\Commands\InstallCommand;
 use OpenAI\Laravel\Exceptions\ApiKeyIsMissing;
 
+use function assert;
+use function config;
+use function is_string;
+
 /**
  * @internal
  */
@@ -22,7 +27,7 @@ final class ServiceProvider extends BaseServiceProvider implements DeferrablePro
      */
     public function register(): void
     {
-        $this->app->singleton(ClientContract::class, static function (): Client {
+        $this->app->bind(OpenAI\Factory::class, static function (): OpenAI\Factory {
             $apiKey = config('openai.api_key');
             $organization = config('openai.organization');
 
@@ -34,10 +39,18 @@ public function register(): void
                 ->withApiKey($apiKey)
                 ->withOrganization($organization)
                 ->withHttpHeader('OpenAI-Beta', 'assistants=v2')
-                ->withHttpClient(new \GuzzleHttp\Client(['timeout' => config('openai.request_timeout', 30)]))
-                ->make();
+                ->withHttpClient(new \GuzzleHttp\Client(['timeout' => config('openai.request_timeout', 30)]));
         });
 
+        $this->app->singleton(ClientContract::class, static function (Container $app): Client {
+            $factory = $app->make(OpenAI\Factory::class);
+            assert($factory instanceof OpenAI\Factory);
+
+            return $factory->make();
+        }
+        );
+
+        $this->app->alias(OpenAI\Factory::class, 'openai.factory');
         $this->app->alias(ClientContract::class, 'openai');
         $this->app->alias(ClientContract::class, Client::class);
     }
@@ -68,7 +81,9 @@ public function provides(): array
         return [
             Client::class,
             ClientContract::class,
+            OpenAI\Factory::class,
             'openai',
+            'openai.factory',
         ];
     }
 }
diff --git a/tests/Arch.php b/tests/Arch.php
index e1ca9cc..d938c68 100644
--- a/tests/Arch.php
+++ b/tests/Arch.php
@@ -18,6 +18,7 @@
     ->toOnlyUse([
         'GuzzleHttp\Client',
         'Illuminate\Support\ServiceProvider',
+        'Illuminate\Container\Container',
         'OpenAI\Laravel',
         'OpenAI',
         'Illuminate\Contracts\Support\DeferrableProvider',
diff --git a/tests/ServiceProvider.php b/tests/ServiceProvider.php
index cae4dd5..bcb5c8d 100644
--- a/tests/ServiceProvider.php
+++ b/tests/ServiceProvider.php
@@ -3,9 +3,24 @@
 use Illuminate\Config\Repository;
 use OpenAI\Client;
 use OpenAI\Contracts\ClientContract;
+use OpenAI\Factory;
 use OpenAI\Laravel\Exceptions\ApiKeyIsMissing;
 use OpenAI\Laravel\ServiceProvider;
 
+it('binds the factory on the container', function () {
+    $app = app();
+
+    $app->bind('config', fn () => new Repository([
+        'openai' => [
+            'api_key' => 'test',
+        ],
+    ]));
+
+    (new ServiceProvider($app))->register();
+
+    expect($app->get(Factory::class))->toBeInstanceOf(Factory::class);
+});
+
 it('binds the client on the container', function () {
     $app = app();
 
@@ -55,6 +70,8 @@
     expect($provides)->toBe([
         Client::class,
         ClientContract::class,
+        Factory::class,
         'openai',
+        'openai.factory',
     ]);
 });