|null */ private ?array $models = null; /** * {@inheritDoc} * * @since 1.0.0 */ public function listModelMetadata(): array { if ( null === $this->models ) { $this->models = $this->buildCatalog(); } return $this->models; } /** * {@inheritDoc} * * @since 1.0.0 */ public function hasModelMetadata( string $modelId ): bool { foreach ( $this->listModelMetadata() as $model ) { if ( $model->getId() === $modelId ) { return true; } } return false; } /** * {@inheritDoc} * * @since 1.0.0 */ public function getModelMetadata( string $modelId ): ModelMetadata { foreach ( $this->listModelMetadata() as $model ) { if ( $model->getId() === $modelId ) { return $model; } } throw new InvalidArgumentException( esc_html( sprintf( /* translators: %s: fal.ai model id. */ __( 'Unknown fal.ai model: %s', 'ai-provider-for-fal-ai' ), $modelId ) ) ); } /** * Build the static model catalog. * * @since 1.0.0 * @return list */ private function buildCatalog(): array { $capabilities = array( CapabilityEnum::imageGeneration(), ); $options = array( new SupportedOption( OptionEnum::inputModalities(), array( array( ModalityEnum::text() ) ) ), new SupportedOption( OptionEnum::outputModalities(), array( array( ModalityEnum::image() ) ) ), new SupportedOption( OptionEnum::candidateCount() ), new SupportedOption( OptionEnum::outputMimeType(), array( 'image/jpeg', 'image/png', 'image/webp' ) ), new SupportedOption( OptionEnum::outputFileType(), array( FileTypeEnum::remote(), FileTypeEnum::inline() ) ), new SupportedOption( OptionEnum::outputMediaOrientation(), array( MediaOrientationEnum::square(), MediaOrientationEnum::landscape(), MediaOrientationEnum::portrait(), ) ), new SupportedOption( OptionEnum::outputMediaAspectRatio(), array( '1:1', '16:9', '9:16', '4:3', '3:4' ) ), new SupportedOption( OptionEnum::customOptions() ), ); $definitions = array( array( 'bytedance/seedream/v5/pro/text-to-image', 'Seedream 5.0 Pro' ), array( 'openai/gpt-image-2', 'GPT Image 2' ), array( 'fal-ai/nano-banana-pro', 'Nano Banana Pro' ), array( 'fal-ai/nano-banana-2', 'Nano Banana 2' ), array( 'fal-ai/flux/schnell', 'Flux Schnell' ), array( 'fal-ai/flux/dev', 'Flux Dev' ), array( 'fal-ai/flux-pro/v1.1', 'Flux Pro v1.1' ), array( 'fal-ai/flux-pro/v1.1-ultra', 'Flux Pro v1.1 Ultra' ), array( 'fal-ai/recraft-v3', 'Recraft V3' ), ); $models = array(); foreach ( $definitions as $definition ) { $models[] = new ModelMetadata( $definition[0], $definition[1], $capabilities, $options ); } return $models; } }