getSupportedCapabilities(); foreach ($capabilities as $capability) { if ($capability->isTextGeneration()) { return new PerplexityTextGenerationModel($modelMetadata, $providerMetadata); } } // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Internal exception message, never rendered as HTML output. throw new RuntimeException( 'Unsupported model capabilities: ' . implode(', ', $capabilities) ); } /** * {@inheritDoc} * * @since 1.0.0 */ protected static function createProviderMetadata(): ProviderMetadata { $providerMetadataArgs = [ 'perplexity', 'Perplexity', ProviderTypeEnum::cloud(), 'https://www.perplexity.ai/account/api/keys', RequestAuthenticationMethod::apiKey() ]; // Provider description support was added in 1.2.0. if (version_compare(AiClient::VERSION, '1.2.0', '>=')) { // For WordPress, we should translate the description. if (function_exists('__')) { $providerMetadataArgs[] = __('Web-grounded text generation with Sonar.', 'ai-provider-for-perplexity'); } else { $providerMetadataArgs[] = 'Web-grounded text generation with Sonar.'; } } // Provider logoPath support was added in 1.3.0. if (version_compare(AiClient::VERSION, '1.3.0', '>=')) { $providerMetadataArgs[] = dirname(__DIR__, 2) . '/assets/images/perplexity.svg'; } return new ProviderMetadata(...$providerMetadataArgs); } /** * {@inheritDoc} * * Perplexity has no model listing endpoint for its Sonar chat models, so availability * is verified with a minimal text generation request instead of a list-models request. * * @since 1.0.0 */ protected static function createProviderAvailability(): ProviderAvailabilityInterface { $modelMetadata = static::modelMetadataDirectory()->getModelMetadata(self::AVAILABILITY_MODEL_ID); $model = static::createModel($modelMetadata, static::metadata()); return new PerplexityProviderAvailability($model); } /** * {@inheritDoc} * * @since 1.0.0 */ protected static function createModelMetadataDirectory(): ModelMetadataDirectoryInterface { return new PerplexityModelMetadataDirectory(); } }