settings = $settings; } /** * Create embeddings provider based on settings * * @return EmbeddingsProviderInterface * @throws \Exception If provider is not configured or unsupported. */ public function create(): EmbeddingsProviderInterface { $provider = $this->settings->get( 'vectorDBProviders.pinecone.embeddingProvider', 'gemini' ); $model = $this->settings->get( 'vectorDBProviders.pinecone.embeddingModel', 'text-embedding-004' ); $dims = $this->settings->get( 'vectorDBProviders.pinecone.embeddingDimensions' ); switch ( $provider ) { case 'gemini': return $this->createGeminiProvider( $model, $dims ); case 'openai': return $this->createOpenAIProvider( $model, $dims ); default: throw new \Exception( sprintf( /* translators: %s: provider name */ __( 'Unsupported embeddings provider: %s', 'aisentic' ), // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped esc_html( $provider ) ) ); } } /** * Create Gemini embeddings provider * * @param string $model Model name. * @param mixed $dimensions Embedding dimensions. * @return GeminiEmbeddingsProvider * @throws \Exception If API key is not configured. */ private function createGeminiProvider( string $model, $dimensions = null ): GeminiEmbeddingsProvider { $api_key = $this->settings->get( 'llmProviders.google.apiKey' ); if ( empty( $api_key ) ) { throw new \Exception( 'Google API key is not configured for Gemini embeddings.' ); } $config = []; if ( is_int( $dimensions ) && $dimensions > 0 ) { // Gemini embeddings supports outputDimensionality config $config['outputDimensionality'] = $dimensions; } return new GeminiEmbeddingsProvider( key: $api_key, model: $model, config: $config ); } /** * Create OpenAI embeddings provider * * @param string $model Model name. * @param mixed $dimensions Embedding dimensions. * @return OpenAIEmbeddingsProvider * @throws \Exception If API key is not configured. */ private function createOpenAIProvider( string $model, $dimensions = null ): OpenAIEmbeddingsProvider { $api_key = $this->settings->get( 'llmProviders.openai.apiKey' ); if ( empty( $api_key ) ) { throw new \Exception( 'OpenAI API key is not configured for OpenAI embeddings.' ); } // The provider accepts dimensions and defaults to 1024 if omitted $dims = ( is_int( $dimensions ) && $dimensions > 0 ) ? $dimensions : 1024; return new OpenAIEmbeddingsProvider( key: $api_key, model: $model, dimensions: $dims ); } }