providers = $providers; return $this; } /** * Instanciate a class for specified provider */ public static function make(string $providerName): ProvidesAIServices { $providerClass = config(sprintf('ai.providers.%s.handler', $providerName)); if (empty($providerClass)) { throw new Exception(sprintf('Unknown AI provider: %s', $providerName)); } return new $providerClass(config(sprintf('ai.providers.%s', $providerName))); } /** * Perform the request. If many providers were selected, and if * $concurrent is false, requests are sent sequentially. Otherwise, all * providers will be queried at once. Beware of performances! */ public function run($concurrent = false) { if ($concurrent) { $responses = $this->runConcurrently(); } else { $responses = $this->runSequentially(); } return Arr::undot( array_map( fn ($response) => $response->json(), $responses ) ); } /** * Run requests concurrently */ protected function runConcurrently() { return Http::pool(fn ($pool) => array_map( fn ($provider) => $provider->prepareRequest($pool), $this->providers )); } /** * Run requests sequentially */ protected function runSequentially() { $responses = []; foreach ($this->providers as $provider) { $responses = $provider->sendRequest(); } return $responses; } }