Title: AbstractProvider
Published: May 20, 2026

---

# class AbstractProvider {}

## In this article

 * [Methods](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#methods)
 * [Source](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#source)
 * [Changelog](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#wp--skip-link--target)

Base class for a provider.

## 󠀁[Methods](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#methods)󠁿

| Name | Description | 
| [AbstractProvider::availability](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/availability/) | {@inheritDoc} | 
| [AbstractProvider::createModel](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/createmodel/) | Creates a model instance based on the given model metadata and provider metadata. | 
| [AbstractProvider::createModelMetadataDirectory](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/createmodelmetadatadirectory/) | Creates the model metadata directory instance. | 
| [AbstractProvider::createProviderAvailability](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/createprovideravailability/) | Creates the provider availability instance. | 
| [AbstractProvider::createProviderMetadata](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/createprovidermetadata/) | Creates the provider metadata instance. | 
| [AbstractProvider::metadata](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/metadata/) | {@inheritDoc} | 
| [AbstractProvider::model](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/model/) | {@inheritDoc} | 
| [AbstractProvider::modelMetadataDirectory](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/modelmetadatadirectory/) | {@inheritDoc} |

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#source)󠁿

    ```php
    abstract class AbstractProvider implements ProviderInterface
    {
        /**
         * @var array<string, ProviderMetadata> Cache for provider metadata per class.
         */
        private static array $metadataCache = [];
        /**
         * @var array<string, ProviderAvailabilityInterface> Cache for provider availability per class.
         */
        private static array $availabilityCache = [];
        /**
         * @var array<string, ModelMetadataDirectoryInterface> Cache for model metadata directory per class.
         */
        private static array $modelMetadataDirectoryCache = [];
        /**
         * {@inheritDoc}
         *
         * @since 0.1.0
         */
        final public static function metadata(): ProviderMetadata
        {
            $className = static::class;
            if (!isset(self::$metadataCache[$className])) {
                self::$metadataCache[$className] = static::createProviderMetadata();
            }
            return self::$metadataCache[$className];
        }
        /**
         * {@inheritDoc}
         *
         * @since 0.1.0
         */
        final public static function model(string $modelId, ?ModelConfig $modelConfig = null): ModelInterface
        {
            $providerMetadata = static::metadata();
            $modelMetadata = static::modelMetadataDirectory()->getModelMetadata($modelId);
            $model = static::createModel($modelMetadata, $providerMetadata);
            if ($modelConfig) {
                $model->setConfig($modelConfig);
            }
            return $model;
        }
        /**
         * {@inheritDoc}
         *
         * @since 0.1.0
         */
        final public static function availability(): ProviderAvailabilityInterface
        {
            $className = static::class;
            if (!isset(self::$availabilityCache[$className])) {
                self::$availabilityCache[$className] = static::createProviderAvailability();
            }
            return self::$availabilityCache[$className];
        }
        /**
         * {@inheritDoc}
         *
         * @since 0.1.0
         */
        final public static function modelMetadataDirectory(): ModelMetadataDirectoryInterface
        {
            $className = static::class;
            if (!isset(self::$modelMetadataDirectoryCache[$className])) {
                self::$modelMetadataDirectoryCache[$className] = static::createModelMetadataDirectory();
            }
            return self::$modelMetadataDirectoryCache[$className];
        }
        /**
         * Creates a model instance based on the given model metadata and provider metadata.
         *
         * @since 0.1.0
         *
         * @param ModelMetadata $modelMetadata The model metadata.
         * @param ProviderMetadata $providerMetadata The provider metadata.
         * @return ModelInterface The new model instance.
         */
        abstract protected static function createModel(ModelMetadata $modelMetadata, ProviderMetadata $providerMetadata): ModelInterface;
        /**
         * Creates the provider metadata instance.
         *
         * @since 0.1.0
         *
         * @return ProviderMetadata The provider metadata.
         */
        abstract protected static function createProviderMetadata(): ProviderMetadata;
        /**
         * Creates the provider availability instance.
         *
         * @since 0.1.0
         *
         * @return ProviderAvailabilityInterface The provider availability.
         */
        abstract protected static function createProviderAvailability(): ProviderAvailabilityInterface;
        /**
         * Creates the model metadata directory instance.
         *
         * @since 0.1.0
         *
         * @return ModelMetadataDirectoryInterface The model metadata directory.
         */
        abstract protected static function createModelMetadataDirectory(): ModelMetadataDirectoryInterface;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/php-ai-client/src/providers/abstractprovider.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-includes/php-ai-client/src/Providers/AbstractProvider.php#L18)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-includes/php-ai-client/src/Providers/AbstractProvider.php#L18-L120)

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wordpress-aiclient-providers-abstractprovider/?output_format=md#changelog)󠁿

| Version | Description | 
| [0.1.0](https://developer.wordpress.org/reference/since/0.1.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwordpress-aiclient-providers-abstractprovider%2F)
before being able to contribute a note or feedback.