getSupportedCapabilities(); foreach ( $capabilities as $capability ) { if ( $capability->isTextGeneration() ) { $supports_text_generation = true; } if ( $capability->isImageGeneration() ) { $supports_image_generation = true; } } if ( $supports_text_generation && $supports_image_generation ) { return new OpenWebUIMultimodalModel( $model_metadata, $provider_metadata ); } if ( $supports_image_generation ) { return new OpenWebUIImageGenerationModel( $model_metadata, $provider_metadata ); } if ( $supports_text_generation ) { return new OpenWebUITextGenerationModel( $model_metadata, $provider_metadata ); } throw new RuntimeException( // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Exception message, not output. 'Unsupported model capabilities: ' . implode( ', ', $capabilities ) ); } /** * {@inheritDoc} * * @since 1.0.0 */ protected static function createProviderMetadata(): ProviderMetadata { $provider_meta = array( 'openwebui', 'Open WebUI', ProviderTypeEnum::cloud(), 'https://docs.openwebui.com/reference/api-endpoints/', RequestAuthenticationMethod::apiKey(), ); if ( version_compare( AiClient::VERSION, '1.2.0', '>=' ) ) { if ( function_exists( '__' ) ) { $provider_meta[] = __( 'Text generation and image generation through Open WebUI API endpoints.', 'ai-provider-for-open-webui' ); } else { $provider_meta[] = 'Text generation and image generation through Open WebUI API endpoints.'; } } if ( version_compare( AiClient::VERSION, '1.3.0', '>=' ) ) { $provider_meta[] = __DIR__ . '/logo-openwebui.png'; } return new ProviderMetadata( ...$provider_meta ); } /** * {@inheritDoc} * * @since 1.0.0 */ protected static function createProviderAvailability(): ProviderAvailabilityInterface { return new ListModelsApiBasedProviderAvailability( static::modelMetadataDirectory() ); } /** * {@inheritDoc} * * @since 1.0.0 */ protected static function createModelMetadataDirectory(): ModelMetadataDirectoryInterface { return new OpenWebUIModelMetadataDirectory(); } }