Scrydon

Téléverser et gérer les intégrations personnalisées

Téléversez des intégrations personnalisées via l'interface Paramètres ou l'API, et gérez les intégrations installées

Portées des intégrations personnalisées

Les intégrations personnalisées existent à trois portées, toutes exécutées via le même chemin d'exécution en bac à sable :

PortéeOrigineVisibilitéQui peut téléverser
Première partie (org:scrydon:)Intégré dans l'image DockerToutes les organisationsIngénierie Scrydon (livré avec les versions)
Plateforme (org:platform:)Téléversement par l'admin de la plateformeToutes les organisationsAdministrateurs de la plateforme
Organisation (org:{orgId}:)Téléversement par l'admin de l'organisationOrganisation uniqueAdministrateurs de l'organisation

Les trois portées utilisent le même modèle d'exécution en bac à sable. Il n'y a pas de niveaux de confiance — chaque intégration personnalisée s'exécute dans un Worker Thread isolé, quelle que soit son origine.

Téléversement via l'interface Paramètres

Accédez à Paramètres > Plateforme > Intégrations et sélectionnez l'onglet Personnalisé.

URL directe : /settings/platform/integrations#custom

L'onglet Personnalisé propose deux options :

  • Synchronisation Git/OCI — enregistrez une source de pack vers laquelle votre CI/CD publie. Les intégrations personnalisées synchronisées apparaissent dans Ajouter une intégration sous Depuis votre catalogue de packs — en en ajoutant une, elle est installée et activée immédiatement. Lorsqu'un nouvel artefact est publié, la carte affiche un badge Mise à jour ; en cliquant dessus, vous accédez à Paramètres → Plateforme → Packs où vous pouvez examiner l'impact sur les workflows et appliquer la mise à jour. Les intégrations installées restent visibles dans le groupe de catalogue de packs en tant que À jour. Consultez Sources de packs pour la configuration, Gestion des versions de packs pour le processus de mise à jour, et Conditionner une intégration personnalisée dans un pack pour le guide de création de packs.
  • Téléversement manuel — téléversez directement un artefact .bundle.tar.gz unique (jusqu'à 50 Mo).

Les étapes suivantes couvrent le téléversement manuel.

Faites glisser votre fichier .bundle.tar.gz sur la zone de téléversement, ou cliquez sur Parcourir pour le sélectionner depuis votre système de fichiers.

Taille maximale du fichier : 50 Mo.

Cliquez sur Téléverser. La plateforme valide l'artefact et affiche une boîte de dialogue de révision résumant les produits, outils et déclencheurs qu'il fournit — conservez-le téléversé pour plus tard, ou choisissez Téléverser et installer pour l'activer immédiatement.

L'intégration personnalisée apparaît dans le tableau. Vous pouvez l'activer, la désactiver ou la supprimer depuis la colonne des actions.

Téléversement via l'API

Utilisez une requête POST avec des données de formulaire multipart :

curl -X POST https://your-instance.example.com/api/bundle-upload \
  -F "bundle=@dist/my-vendor-1.0.0.bundle.tar.gz" \
  -b "better-auth.session_token=<your-session-token>"

Le jeton de session doit appartenir à un administrateur de l'organisation. Récupérez-le depuis les outils de développement de votre navigateur (Application > Cookies).

Réponse

{
  "vendorId": "my-vendor",
  "version": "1.0.0",
  "toolCount": 3,
  "productCount": 1
}

Réponses d'erreur

StatutSignification
400Bundle invalide (validation du manifeste échouée, fichier trop volumineux, format incorrect)
401Non authentifié
403Pas un administrateur de l'organisation
500Erreur de stockage ou de base de données

Ce qui se passe lors du téléversement

Le pipeline de téléversement effectue ces étapes :

Vérifie que l'appelant est un administrateur d'organisation authentifié.

Extrait le .tar.gz avec des vérifications de sécurité :

  • Aucun lien symbolique autorisé
  • Aucun chemin absolu
  • Aucune traversée de chemin (../)
  • Seules les extensions de fichiers autorisées (.js, .js.map, .json, .svg, .png, .jpg)
  • Taille extraite maximale : 100 Mo

Valide manifest.json par rapport au ManifestSchema (Zod) :

  • Format d'identifiant vendeur : /^[a-z][a-z0-9-]*$/
  • Les identifiants d'outils référencent des préfixes vendeur valides
  • Les types d'informations d'identification d'authentification sont valides
  • Pas d'identifiants de produit en double
  • Les champs requis sont présents

Écrit l'artefact dans le stockage blob :

00_organization/integration-bundles/{vendorId}/{version}/bundle.tar.gz

Enregistre l'intégration avec l'identifiant vendeur, la version, le JSON du manifeste, la clé de stockage, le hachage SHA-256, la portée et l'auteur du téléversement. (Il s'agit de l'enregistrement d'intégration installée de l'organisation — distinct du catalogue de packs utilisé par la synchronisation Git/OCI.)

Gérer les intégrations personnalisées installées

Statuts

StatutSignification
ActifL'intégration personnalisée est disponible pour une utilisation dans les workflows
DésactivéL'intégration personnalisée est installée mais non disponible (désactivée manuellement)
En attente de révisionL'intégration personnalisée a été téléversée mais attend l'approbation de l'admin (si la politique de gouvernance l'exige)
ÉchecL'intégration personnalisée n'a pas pu être chargée à l'exécution (vérifiez le message d'erreur)

Activer / Désactiver

Basculez le statut d'une intégration personnalisée depuis l'onglet Personnalisé. La désactivation d'une intégration personnalisée la supprime de l'éditeur de workflows mais ne supprime pas les fichiers stockés.

Supprimer

La suppression d'une intégration personnalisée supprime l'enregistrement en base de données. Le blob stocké peut être nettoyé séparément.

La suppression d'une intégration personnalisée active interrompra tous les workflows qui référencent ses outils. Désactivez-la d'abord et vérifiez qu'aucun workflow n'en dépend.

Gestion des versions

Téléversez une nouvelle version du même vendeur pour le mettre à jour. La plateforme stocke les intégrations personnalisées par {vendorId}/{version}/, de sorte que plusieurs versions peuvent coexister. La version active la plus récemment téléversée est celle utilisée à l'exécution.

Séquence de démarrage

Au démarrage de la plateforme :

  1. Analyse des bundles première partie — analyse manifest.json depuis /app/bundles/ (image Docker)
  2. Analyse des bundles de plateforme — analyse les manifestes depuis le stockage de la plateforme
  3. Analyse des bundles d'organisation — analyse les manifestes depuis le stockage de chaque organisation
  4. Remplissage du catalogue de manifestes — métadonnées uniquement, aucun code vendeur chargé
  5. Enregistrement du type SandboxActor auprès du runtime Dapr
  6. Prêt à servir — les acteurs s'activent à la demande (première exécution d'outil)

Le code d'intégration personnalisée n'est jamais chargé au démarrage. La plateforme lit uniquement les fichiers manifest.json (analyse JSON légère). Le code se charge de façon différée lors de la première invocation d'un outil, dans un Worker Thread en bac à sable.

Politiques d'organisation

Les politiques d'organisation (configurées par les admins) régissent le comportement des intégrations personnalisées :

Politique d'exécution

{
  "maxConcurrentExecutions": 10,
  "maxTimeoutSeconds": 30,
  "allowedCapabilities": ["llm", "stt", "tools"]
}

Politique de gouvernance

{
  "allowedVendorScopes": ["scrydon", "platform"],
  "allowOrgUploads": true,
  "requireApprovalForUploads": false,
  "blockedVendorIds": []
}
  • allowOrgUploads — indique si les admins de l'organisation peuvent téléverser des intégrations personnalisées
  • requireApprovalForUploads — indique si les téléversements nécessitent l'approbation d'un admin de plateforme
  • blockedVendorIds — identifiants vendeur explicitement bloqués
  • allowedCapabilities — types de capacités autorisés

Format du package

Chaque intégration personnalisée est conditionnée sous forme d'archive .tar.gz avec cette structure :

{vendorId}-{version}.bundle.tar.gz
├── manifest.json           (métadonnées vendeur, JSON Schemas, définitions UI)
├── dist/
│   └── index.js            (ESM compilé, minifié ; toutes les dépendances intégrées)
├── meta/                   (généré automatiquement)
│   ├── sbom.cdx.json       (SBOM CycloneDX 1.6)
│   └── metafile.json       (graphe de dépendances esbuild)
└── assets/                 (optionnel)
    └── icon.svg, icon.png  (icônes vendeur/produit)

Génération du SBOM

Chaque artefact d'intégration personnalisée inclut automatiquement une nomenclature logicielle (SBOM) CycloneDX 1.6 dans meta/sbom.cdx.json. Le SBOM est généré lors de sdk-authoring integrations build sans outils ni configuration supplémentaires.

Contenu du SBOM

Le SBOM liste chaque package NPM qu'esbuild a intégré dans dist/index.js :

  • Nom et version du package — exactement ce qui est dans le bundle
  • Licence — identifiant de licence SPDX depuis package.json
  • URL du package (purl) — identifiant lisible par machine (pkg:npm/zod@3.24.0)
  • Preuve — chemins de fichiers prouvant que le package est réellement intégré (le code élimé par tree-shaking est exclu)

Le SBOM n'inclut que les packages qu'esbuild a réellement intégrés. Si une dépendance a été éliminée par tree-shaking, elle n'apparaîtra pas — ce qui fait du SBOM un reflet fidèle de ce qui est livré dans votre bundle.

Comment il est généré

Lors de sdk-authoring integrations build, l'outil CLI :

  1. Exécute esbuild avec metafile: true pour capturer tous les fichiers d'entrée
  2. Extrait les packages NPM uniques depuis les chemins node_modules/ dans le metafichier
  3. Lit le package.json de chaque package pour le nom, la version, la licence et la description
  4. Sérialise tout en JSON CycloneDX 1.6
  5. Écrit le résultat dans meta/sbom.cdx.json aux côtés du metafichier esbuild

Aucun outil ou dépendance externe n'est requis — la génération est intégrée dans l'outil CLI.

Utilisation par les admins

Après avoir téléversé une intégration personnalisée, l'onglet Dépendances dans la boîte de dialogue de détail du vendeur affiche le nombre de composants SBOM dans l'en-tête de l'onglet et liste tous les packages détectés automatiquement aux côtés des dépendances déclarées. Consultez Révision d'une intégration personnalisée avant activation pour le workflow de révision complet.

Conformité

Le format CycloneDX est largement pris en charge par les outils de conformité. Pour les environnements nécessitant SPDX, convertissez avec :

cyclonedx-cli convert --input-file meta/sbom.cdx.json --output-file sbom.spdx.json --output-format spdxjson

Le graphe de dépendances esbuild brut est également disponible dans meta/metafile.json pour le débogage. Vous pouvez le visualiser sur esbuild.github.io/analyze.

Révision d'une intégration personnalisée avant activation

Après le téléversement d'une intégration personnalisée, les administrateurs peuvent en examiner le contenu avant de l'activer pour l'organisation. La boîte de dialogue de détail du vendeur offre une expérience de révision structurée répartie en plusieurs onglets.

Onglet Capacités

Affiche tous les produits, outils, déclencheurs et capacités d'exécution que fournit l'intégration personnalisée. Les administrateurs peuvent activer ou désactiver des blocs individuels depuis cet onglet. Les capacités d'intelligence (LLM, STT, TTS, Embedding) affichent le nombre de modèles et prennent en charge la configuration de politiques en mode liste d'autorisation. Consultez Capacités pour plus de détails.

Onglet Dépendances

L'onglet Dépendances affiche deux vues complémentaires de l'arborescence de dépendances de l'intégration personnalisée :

  • Dépendances déclarées — entrées rédigées manuellement depuis defineProduct({ dependencies: [...] }) qui incluent une reason lisible par l'homme pour chaque dépendance.
  • Dépendances détectées automatiquement (SBOM) — l'ensemble complet des packages NPM qu'esbuild a intégrés dans dist/index.js, extrait depuis meta/sbom.cdx.json. Chaque entrée affiche le nom du package, la version, la licence et une URL de package lisible par machine (purl).

L'en-tête de l'onglet affiche le nombre total de composants SBOM afin que les administrateurs puissent évaluer rapidement l'empreinte de dépendances de l'intégration personnalisée. Les politiques de dépendances de l'organisation (niveaux de risque, listes de blocage, blocage des scripts post-installation) sont évaluées à la fois par rapport aux dépendances déclarées et détectées automatiquement.

Si une dépendance est bloquée par la politique de l'organisation, elle est signalée dans l'onglet Dépendances avec la raison (par ex. « Le risque 'élevé' dépasse le maximum 'moyen' » ou « Contient des scripts post-installation »). Les dépendances bloquées empêchent l'activation de l'intégration personnalisée jusqu'à ce que la politique soit ajustée ou que le .bundle.tar.gz soit reconstruit sans le package problématique.

Onglet Configuration

Affiche la configuration d'authentification du vendeur (OAuth, Clé API, Jeton Bot, ou Aucune) et permet aux administrateurs de configurer les informations d'identification avant d'activer les capacités du vendeur.

Disposition du stockage

Première partie (intégré dans l'image Docker) :
  /app/bundles/{vendorId}/dist/index.js

Téléversements de plateforme :
  {platformPrefix}/integration-bundles/{vendorId}/{version}/bundle.tar.gz

Téléversements d'organisation :
  {storageKeyPrefix}/00_organization/integration-bundles/{vendorId}/{version}/bundle.tar.gz

Dépannage

Le téléversement échoue avec « Manifeste invalide »

Exécutez le validateur CLI localement pour voir les erreurs détaillées :

bunx @scrydon/sdk-authoring integrations test --level static

Problèmes courants :

  • L'identifiant vendeur contient des majuscules ou des caractères spéciaux
  • L'identifiant d'outil ne commence pas par le préfixe de l'identifiant vendeur
  • Champs requis manquants (id, name, version, icon, auth)
  • Le schéma Zod utilise des types non pris en charge (l'extracteur convertit Zod → JSON Schema)

Le statut de l'intégration personnalisée affiche « Échec »

Vérifiez le message d'erreur dans le tableau des intégrations personnalisées. Causes fréquentes :

  • dist/index.js contient une erreur de syntaxe
  • L'export par défaut n'est pas un résultat de defineVendor()
  • Instruction export default manquante
  • L'import à l'exécution échoue (assurez-vous que toutes les dépendances sont intégrées — esbuild devrait les inclure)

L'outil n'apparaît pas dans l'éditeur de workflows

  1. Vérifiez que le statut de l'intégration personnalisée est Actif dans Paramètres > Plateforme > Intégrations > Personnalisé
  2. Vérifiez que le produit est activé pour votre organisation dans Paramètres > Plateforme > Intégrations
  3. Vérifiez la category du bloc — elle doit être "tools", "blocks" ou "triggers" pour apparaître dans la section correcte de la palette
Sur cette page

Sur cette page