false, 'data' => null, 'error' => json_last_error_msg(), ]; } // Required top-level keys $requiredKeys = [ 'llmProviders', 'vectorDBProviders', 'adminAssistant', 'publicChat' ]; foreach ( $requiredKeys as $key ) { if ( ! isset( $decoded[ $key ] ) || ! is_array( $decoded[ $key ] ) ) { return [ 'valid' => false, 'data' => null, 'error' => sprintf( 'Missing or invalid key: %s', $key ), ]; } } // Validate LLM providers structure $llm = $decoded['llmProviders']; if ( ! isset( $llm['google'] ) || ! is_array( $llm['google'] ) || ! array_key_exists( 'apiKey', $llm['google'] ) ) { return [ 'valid' => false, 'data' => null, 'error' => 'Missing llmProviders.google.apiKey', ]; } if ( ! isset( $llm['openai'] ) || ! is_array( $llm['openai'] ) || ! array_key_exists( 'apiKey', $llm['openai'] ) ) { return [ 'valid' => false, 'data' => null, 'error' => 'Missing llmProviders.openai.apiKey', ]; } // Validate vector DB providers structure $vectorDB = $decoded['vectorDBProviders']; if ( ! isset( $vectorDB['pinecone'] ) || ! is_array( $vectorDB['pinecone'] ) ) { return [ 'valid' => false, 'data' => null, 'error' => 'Missing vectorDBProviders.pinecone', ]; } return [ 'valid' => true, 'data' => $decoded, 'error' => null, ]; } }