Aller au contenu
getnextpdf.com

Enterprise édition

Accelerator — Référence approfondie (sidecar GPU, fabrique de fournisseurs KMS)

Cette page constitue la référence approfondie de la surface d’accélération publique de NextPDF\Enterprise\Accelerator. Elle couvre la pile de fournisseurs KMS — la fabrique, le contrat de fournisseur, le fournisseur local et le résultat de métadonnées de clé — ainsi que les services du sidecar GPU pour l’embedding et la recherche vectorielle. Elle précise les paramètres, les valeurs par défaut, les modes de défaillance et la posture de garde des clés. Lis d’abord la page de capacité Accelerator pour des conseils sur les workflows. Les autres symboles du même namespace relèvent d’autres capacités et sortent du périmètre de cette page.

Cette capacité est livrée dans NextPDF Enterprise (nextpdf/enterprise) et s’active avec une enveloppe de licence de niveau Enterprise. Un déploiement dépourvu de ce droit ne charge pas les classes de la capacité. Compare les éditions et obtiens une licence.

Le fournisseur KMS est sélectionné à l’exécution ; le code appelant dépend du contrat de fournisseur, non du fournisseur concret. Les services d’embedding et d’index vectoriel implémentent les contrats Core EmbeddingServiceInterface et VectorIndexInterface.

Fenêtre de terminal
composer require nextpdf/enterprise:^3
SymboleParamètresComportement par défautRetourneLève ou échoue avecNotes
KmsProviderFactory::fromEnvironmentaucunConstruit le fournisseur nommé par la variable de sélection ; non définie ou vide sélectionne localKmsProviderInterfaceRuntimeException en cas de clé maître manquante, de fournisseur cloud indisponible ou de nom inconnuPoint d’entrée statique
KmsProviderFactory::createstring $providerType, array $config = []Construit le fournisseur nommé à partir d’une configuration expliciteKmsProviderInterfaceRuntimeException lorsque local ne possède pas de encryption_key non vide, ou en cas de nom inconnulocal est le seul nom constructible dans cette version
KmsProviderInterface::getEncryptionKeystring $collectionIdRetourne les métadonnées de clé actuelles de la collectionEncryptionKeyResultRuntimeException lorsque le fournisseur est inaccessible ou mal configuré (contrat)Métadonnées uniquement ; jamais les octets bruts de la clé
KmsProviderInterface::rotateKeystring $collectionIdFait avancer la version de cléEncryptionKeyResultRuntimeException lorsque la rotation échoue (contrat)La rotation est un signal de rechiffrement adressé à l’appelant
KmsProviderInterface::providerNameaucunIndique le nom canonique du fournisseurstringRien de déclarélocal, aws, gcp, azure, vault
LocalKmsProvider::__constructstring $encryptionKey (sensible)Valide une clé maître hexadécimale d’au moins 64 caractères hexadécimaux (32 octets)LocalKmsProviderInvalidArgumentException en cas de valeur trop courte ou non hexadécimaleGarde fail-fast ; n’effectue elle-même aucune dérivation
LocalKmsProvider::getEncryptionKeystring $collectionIdÉmet local:{collectionId}:v{version} ; la version vaut 1 par défautEncryptionKeyResultRien de déclaréLibellé d’algorithme AES-256-GCM
LocalKmsProvider::rotateKeystring $collectionIdIncrémente le compteur de version en mémoire du processusEncryptionKeyResultRien de déclaréL’état de version est propre à chaque instance
EncryptionKeyResult::__constructstring $keyId, int $keyVersion, string $algorithm = 'AES-256-GCM', string $provider = 'local'Objet-valeur de métadonnées immuableEncryptionKeyResultRien de déclaréNe transporte jamais de matériel de clé
GpuEmbeddingService::embedstring $textDélègue à batchEmbed et retourne l’élément zérolist<float>Comme batchEmbedVecteur à 1024 dimensions
GpuEmbeddingService::batchEmbedarray $textsCalcule l’embedding du lot sur le sidecarlist<list<float>>InvalidArgumentException en cas de lot vide ; SpectrumNotAvailableException lorsque le sidecar est inaccessible ; SpectrumApiException en cas de réponse en échec, malformée ou dont le nombre ne correspond pasNe retourne jamais de résultats partiels
GpuEmbeddingService::getDimensionaucunRetourne 1024intRien de déclaréConstant
GpuEmbeddingService::getModelNameaucunRetourne multilingual-e5-largestringRien de déclaréConstant
GpuVectorIndex::__constructSpectrumClient $client, string $collectionId = 'default'Lie le handle à une seule collectionGpuVectorIndexRien de déclaréUn handle par identifiant de collection
GpuVectorIndex::buildarray $vectors, array $idsConstruit l’index de la collection sur le sidecarvoidInvalidArgumentException en cas de lot vide ou de longueurs discordantes ; SpectrumNotAvailableException en cas d’inaccessibilité ; SpectrumApiException en cas de réponse de construction inattendueUne reconstruction remplace l’index
GpuVectorIndex::searcharray $queryVector, int $topK = 10Recherche des plus proches voisins classéelist<VectorSearchResult>SpectrumNotAvailableException en cas d’inaccessibilité ; JsonException en cas de corps de réponse malforméRang par résultat dans les métadonnées
GpuVectorIndex::deletearray $idsRejette toujoursvoid (déclaré)Toujours : SpectrumApiException (non implémenté)L’index construit est immuable ; reconstruis-le à la place
GpuVectorIndex::countaucunLit le total de la collection depuis le sidecarintNe lève rien ; toute défaillance retourne 00 est ambigu : vide ou inaccessible
final class KmsProviderFactory
{
public static function fromEnvironment(): KmsProviderInterface
public static function create(string $providerType, array $config = []): KmsProviderInterface
}
interface KmsProviderInterface
{
public function getEncryptionKey(string $collectionId): EncryptionKeyResult;
public function rotateKey(string $collectionId): EncryptionKeyResult;
public function providerName(): string;
}
final class LocalKmsProvider implements KmsProviderInterface
{
public function __construct(
#[SensitiveParameter]
private readonly string $encryptionKey,
)
}
final readonly class EncryptionKeyResult
{
public function __construct(
public string $keyId,
public int $keyVersion,
public string $algorithm = 'AES-256-GCM',
public string $provider = 'local',
)
}
final class GpuEmbeddingService implements EmbeddingServiceInterface
{
public function __construct(private readonly SpectrumClient $client)
public function embed(string $text): array
public function batchEmbed(array $texts): array
public function getDimension(): int
public function getModelName(): string
}
final class GpuVectorIndex implements VectorIndexInterface
{
public function __construct(
private readonly SpectrumClient $client,
string $collectionId = 'default',
)
public function build(array $vectors, array $ids): void
public function search(array $queryVector, int $topK = 10): array
public function delete(array $ids): void
public function count(): int
}
RéglageConsommateurSignification
SPECTRUM_KMS_PROVIDERfromEnvironment()Sélecteur de fournisseur. Non défini ou vide se résout en local.
SPECTRUM_ENCRYPTION_KEYLe chemin du fournisseur localClé maître encodée en hexadécimal ; au moins 64 caractères hexadécimaux (32 octets). Partagée avec le sidecar.
encryption_keycreate('local', [...])Clé maître explicite ; même format et même validation.

KmsProviderFactory::fromEnvironment lit la variable de sélection et retombe par défaut sur local. Les noms de fournisseurs cloud aws, gcp, azure et vault sont reconnus mais non constructibles dans cette version. Sélectionner aws lève une erreur typée nommant le paquet requis aws/aws-sdk-php ; les trois autres signalent l’intégration comme non implémentée. Un nom inconnu lève une erreur typée énumérant les noms pris en charge. KmsProviderFactory::create accepte un nom de fournisseur explicite et une carte de configuration ; local est le seul nom qu’elle construit.

Un fournisseur retourne des métadonnées de clé immuables : un identifiant de clé, une version de clé croissant de façon monotone, le libellé d’algorithme et le nom du fournisseur. Il ne retourne jamais les octets bruts de la clé, de sorte qu’une fuite de métadonnées n’expose aucun matériel de clé. Le fournisseur local partage les responsabilités avec le sidecar de l’accélérateur. La classe PHP valide le secret maître à la construction et émet une identité de clé stable et propre à la collection, de la forme local:{collectionId}:v{version}. Le sidecar effectue la dérivation HKDF-SHA256 et le chiffrement AES-256-GCM, en dérivant une clé de chiffrement de données distincte de 32 octets par collection, avec l’identifiant de collection et la version comme séparation de domaine. Les deux côtés lisent le même secret maître configuré. Aucun service KMS externe n’est contacté ; la gestion des clés reste à l’intérieur du déploiement. Le modèle de version et de cycle de vie des clés suit NIST SP 800-57 Part 1 Rev.5 §4.

Un appel de rotation fait avancer la version de clé et retourne les nouvelles métadonnées. L’appelant rechiffre les données de la collection avec la nouvelle version ; le fournisseur ne rechiffre rien lui-même.

La sécurité des clés dépend du KMS ou du secret de clé maître, du déploiement et de l’opérateur — et non de NextPDF Enterprise seul. L’opérateur est responsable du provisionnement de la clé maître, du stockage des secrets, de la configuration du KMS et de la planification des rotations. La responsabilité de protection des clés suit NIST SP 800-57 Part 1 Rev.5 §5.5.2.

GpuEmbeddingService implémente le contrat d’embedding Core et délègue au sidecar. Le sidecar exécute le modèle d’embedding sur un GPU lorsqu’il en existe un et retombe sinon sur le CPU, en marquant les métadonnées de réponse comme dégradées par rapport au GPU. La forme du vecteur est identique dans les deux cas. Le modèle (environ 1.3 GB) est téléchargé et chargé de façon paresseuse à la première requête. La sémantique de lot est du tout-ou-rien : une défaillance sur un élément, un vecteur malformé ou un nombre discordant lève une erreur typée au lieu de retourner des résultats partiels.

GpuVectorIndex implémente le contrat d’index vectoriel Core et lie un handle à un unique identifiant de collection. build construit l’index sur le sidecar ; le sidecar utilise un index GPU lorsqu’il en existe un et un index CPU sinon. L’index est immuable une fois construit : delete rejette toujours avec une erreur typée « non implémenté », et toute suppression nécessite une reconstruction. search retourne des résultats classés avec un rang commençant à un dans les métadonnées de chaque résultat. count demande au sidecar le total de la collection et signale 0 en cas de défaillance plutôt que de lever une erreur.

  • La clé maître doit se décoder depuis l’hexadécimal en au moins 32 octets. Une valeur plus courte ou non hexadécimale lève InvalidArgumentException à la construction, avant tout appel au sidecar.
  • Une variable de sélection non définie ou vide se résout en local ; la fabrique ne devine jamais un autre fournisseur.
  • fromEnvironment sur le chemin local sans la variable de clé maître lève une erreur typée nommant la variable manquante.
  • create('local', [...]) sans entrée encryption_key non vide lève une erreur typée nommant l’entrée manquante.
  • L’état de version de clé est en mémoire du processus et propre à chaque instance de fournisseur. Un nouveau processus observe la version 1 jusqu’à ce qu’une rotation soit de nouveau exécutée. Rends persistants les résultats de rotation en rechiffrant les données, non en te fiant à l’état du fournisseur.
  • Un lot d’embedding vide lève InvalidArgumentException ; le sidecar n’est pas contacté.
  • La disponibilité du sidecar est sondée à chaque appel. Un sidecar inaccessible lève SpectrumNotAvailableException ; les services n’échouent jamais en silence.
  • Un composant non numérique à l’intérieur d’un vecteur d’embedding retourné est converti en 0.0 ; un vecteur manquant ou n’étant pas un tableau lève SpectrumApiException.
  • La première requête d’embedding paie le coût unique de téléchargement et de chargement du modèle ; dimensionne ce délai d’expiration séparément.
  • build et search décodent strictement la réponse du sidecar ; un corps malformé lève JsonException. count absorbe toute défaillance et retourne 0.
  • Un résultat de recherche dépourvu de son identifiant ou de son score prend par défaut une chaîne vide et 0.0 plutôt que de faire échouer le lot.
  • Les codes d’erreur du sidecar et la hiérarchie d’exceptions sont catalogués dans la référence des erreurs Accelerator.

Le chemin de clé local utilise HKDF-SHA256 pour la dérivation et AES-256-GCM pour le chiffrement ; le sidecar exécute les deux. Le libellé d’algorithme enregistré dans les métadonnées de clé est AES-256-GCM. Lorsque le déploiement s’appuie sur un fournisseur cryptographique validé FIPS, ces primitives s’exécutent dans cette frontière validée. L’usage d’AES-GCM requiert un vecteur d’initialisation unique par clé, conformément à NIST SP 800-38D §5.

NextPDF Enterprise n’est pas un module cryptographique validé FIPS et ne revendique aucune certification FIPS. Il fonctionne dans un mode compatible FIPS uniquement lorsqu’il est configuré avec un fournisseur cryptographique validé FIPS ou un KMS validé FIPS. Aucun artefact de certification FIPS n’existe dans ce dépôt.

AffirmationNormeClause
Le modèle de version et de cycle de vie des clés suit les recommandations sur les états de clé.NIST SP 800-57 Part 1 Rev.5§4
La responsabilité de protection et de garde des clés incombe au propriétaire de la clé et à l’opérateur.NIST SP 800-57 Part 1 Rev.5§5.5.2
AES-GCM requiert un vecteur d’initialisation unique par clé.NIST SP 800-38D§5

Toutes les clauses sont paraphrasées ; NextPDF ne reproduit aucun texte normatif. NextPDF ne revendique aucune certification. L’alignement sur les clauses citées est une déclaration de capacité, non une certification. Cette page concerne la gestion des clés ; la déclaration sur le mode FIPS est une déclaration de compatibilité, non un avis juridique. Consulte tes propres conseillers en conformité et en droit.

  • Le code source du module porte @since 2.1.0 ; cette référence documente la surface telle qu’elle est livrée dans nextpdf/enterprise 3.1.0.
  • Toutes les classes sont final ; EncryptionKeyResult est final readonly. Construis de nouvelles instances au lieu de muter.
  • La clé maître est un paramètre de constructeur sensible (#[SensitiveParameter]) ; PHP la masque dans les traces de pile. Tiens-la à l’écart des journaux applicatifs et des vidages de configuration.
  • SpectrumClient, VectorSearchResult, ainsi que les contrats EmbeddingServiceInterface et VectorIndexInterface proviennent de NextPDF Core ; l’appelant construit et fournit le client du sidecar.
  • Le namespace NextPDF\Enterprise\Accelerator porte également des moteurs de délestage par lot ainsi que les piles de collections de récupération et d’extraction OCR ; ces surfaces sortent du périmètre de cette page.
  • Les détails de mécanisme interne restent dans la documentation interne du dépôt source et sortent du périmètre de ce manuel.

Cette page documente uniquement le comportement observable de l’extérieur et la surface d’API publique prise en charge. Les chemins de namespace internes, les classes utilitaires, les tables de mécanisme, les noms de fichiers de runbook et les préfixes de ticket sortent du périmètre.