Le langage de programmation du maillage

AmiScript

Un modèle cohérent pour travailler sur les données, la logique, les workflows et la présentation, au sein d'un même runtime.

Rôle dans le maillage

Un seul langage pour les données, la logique et la présentation

AmiScript est le langage de programmation natif du maillage applicatif. Plutôt que d'utiliser un langage pour interroger les données, un autre pour implémenter les règles métier et un troisième pour formater le résultat destiné à une application, les développeurs expriment tout cela au sein d'un même runtime.

Le langage associe des concepts familiers issus de Java, de Python, de SQL et des modèles de chaînes, et y ajoute des fonctions et des types de données conçus pour les systèmes financiers. Il permet d'interroger des données gouvernées, de traiter des événements en temps réel, d'effectuer des calculs métier, de produire des sorties formatées et de piloter le comportement des applications.

Comme le langage opère dans tout le maillage, la logique n'a pas à être réécrite en passant d'une couche à l'autre. Un calcul peut naître dans le modèle de données, être réutilisé dans un workflow et apparaître directement dans une interface utilisateur ou un rapport. La même logique peut aussi être appelée par une application externe ou un agent d'IA via une interface autorisée.

Capacités

Le langage à l'œuvre

Définir des données structurées avec une syntaxe de type Python

AmiScript adopte une syntaxe inspirée de Python pour définir des maps, des listes et des structures imbriquées. Instantanés de données de marché, échelles de prix, tranches de risque et objets de configuration se représentent directement dans le script, sans définitions de classes verbeuses ni schémas externes.

Ces structures étant des éléments de premier rang du langage, elles se transmettent directement aux calculs, aux composants visuels ou aux couches de persistance, sans transformation. La même structure peut alimenter une logique de pricing, remplir un tableau ou piloter un graphique.

Map pricingSummary = {
  "ZXZZT": {
    "Open":   489.10,
    "prices": [492.10, 492.10]
  }
};

Encapsuler la logique métier réutilisable dans des fonctions

Les fonctions sont fortement typées, peuvent être surchargées, et sont définies une fois puis réutilisées dans les scripts, les requêtes, les modèles et les visuels. Des notions comme la valeur notionnelle, l'exposition, la marge ou le PnL doivent être calculées à l'identique dans les workflows de risque, de trading, de reporting et de conformité : les centraliser dans des fonctions nommées évite une logique dupliquée ou légèrement divergente d'une équipe à l'autre.

Le langage s'exécutant dans le runtime gouverné de la plateforme, ces fonctions sont aussi observables, auditables et soumises aux mêmes contrôles que le reste du système.

double NOTIONAL_VALUE(
  Number quantity,
  Number price,
  Number fx
) {
  quantity * price * fx
};

Accéder aux données avec une exécution de type SQL

AmiScript s'intègre étroitement à AMI SQL pour un accès direct et gouverné aux sources de données temps réel et historiques. Les requêtes paramétrées s'exécutent sur des sources de données nommées avec des constructions SQL familières, tout en restant entièrement dans le cadre des droits d'accès, de l'audit et du lignage de la plateforme.

Ici, une table est créée dynamiquement à partir du contexte de l'utilisateur courant : la variable est résolue à l'exécution, si bien que le même script s'adapte à différents utilisateurs ou sessions sans identifiants codés en dur.

create table mycopy AS use DS="ACCOUNT_DATA" execute
  Select * from Accounts
  where Account=="${USERACCOUNT}";

Calculer et formater les résultats pour la présentation

Une fonction métier définie précédemment est réutilisée dans une requête d'agrégation, et le résultat calculé est injecté dans un message formaté grâce aux modèles intégrés. Les valeurs calculées s'intègrent directement dans les tableaux, graphiques, infobulles, tableaux de bord et rapports.

La logique de formatage vit aux côtés du calcul : ce que voient les utilisateurs découle d'une logique gouvernée et traçable, et non d'un post-traitement dans une couche d'interface distincte.

double totalNotional =
  select sum(NOTIONAL_VALUE(
    qty, px, fxrate))
  from mycopy;

Session.alert(
  "Total value for account ${USERACCOUNT}
   is ${totalNotional}"
);

Plus de 1 500 fonctions organisées en bibliothèques

La bibliothèque intégrée est organisée en modules spécialisés couvrant l'accès aux données, l'agrégation, l'analyse de séries temporelles, les calculs financiers, le formatage, les droits d'accès, le contrôle de session et l'interaction système, pour que les primitives courantes n'aient pas à être réimplémentées. Chaque entrée renvoie à sa documentation de référence.

BibliothèqueExempleUsage en finance
Trigonométrieacos(value)Modélisation de la saisonnalité et analyse des formes d'onde dans les séries de prix
BinairebitShiftLeft(n, shiftAmount)Encodage et décodage des indicateurs de droits d'accès en masque de bits, par utilisateur ou par desk
ColorimétrieclrGetAlpha(color)Génération d'échelles de couleurs pour les cartes de chaleur de risque, selon l'ampleur du PnL ou le niveau d'exposition
Date et heuredatePart(unixEpochMillis, part, timezone)Calcul des dates de règlement et filtrage des heures de marché selon les fuseaux horaires
EncodagedecodeDouble64(value)Décodage des champs de prix binaires des flux de ticks à faible latence et des flux FIX
Mathématiquesexp(x)Capitalisation continue, facteurs d'actualisation et construction de courbes de taux
Analyse syntaxiquejsonExtract(json, xpath)Extraction de champs des réponses d'API de prix et des données de référence
OpérationnellogWarn(message)Journalisation dans la piste d'audit des étapes de workflow sensibles pour la conformité et des dépassements de seuils
Analyse de donnéesparseXlsx(data, firstLineIsHeader)Ingestion de blotters de transactions, de rapports de VL de fonds et de fichiers de données statiques depuis Excel
VariationpercentChange(old, nuw)Calcul des rendements quotidiens, des variations de prix intrajournalières et des écarts à l'indice de référence
Formatagequote(text)Formatage des identifiants d'instruments, des devises et des requêtes SQL dynamiques
AléatoirerandGaussian()Génération de scénarios Monte-Carlo pour la VaR et les tests de résistance
ArrondiroundNearest(value, bucketSize)Alignement des prix sur le pas de cotation minimal et des quantités sur la taille de lot
CryptographiesignDataMac(data, key, algorithm)Signature des messages d'ordres sortants et authentification des requêtes vers les API des bourses
Manipulation de chaînesstrAfter(text, toFind, origIfNotFound)Analyse des codes d'instruments, extraction de l'ISIN ou du ticker à partir d'identifiants composites
HorodatagetimestampNano()Mesure de latence à la nanoseconde pour l'analyse de la qualité d'exécution
Gestion d'adressesurlDecode(url)Construction et décodage des appels REST vers les API de données de marché et de référence
MoyennesavgGauss(value, variance)Prix moyen pondéré, VWAP et agrégation lissée des positions
Grecquesbeta(value1, value2)Bêta du portefeuille par rapport à l'indice de référence, sensibilité aux facteurs et calcul du ratio de couverture
ConcaténationcatUniqueLimit(value, delim, limit)Agrégation des listes uniques de contreparties ou de plateformes d'exécution par transaction ou groupe d'ordres
StatistiquespercentileDisc(value, percent)Value at Risk à des niveaux de confiance définis sur un ensemble de positions
PartitionnementkmeansCluster(nClusters, seed, values)Segmentation des portefeuilles par profil de risque, exposition sectorielle ou comportement client
Rééchantillonnageresample(x, y, xq, linearOrSpline)Normalisation des données de ticks en barres OHLC uniformes pour les graphiques et le backtesting

L'IA dans le langage

Appeler l'IA depuis AmiScript

Un appel de modèle est un appel de fonction. session.promptAi transmet une instruction et un extrait de données en direct au fournisseur configuré par l'institution, depuis le callback, le timer ou le déclencheur qui a produit ces données, et renvoie la réponse sous forme de chaîne. Classez des lignes, résumez un jeu de résultats filtré ou extrayez des champs structurés sans quitter la logique qui les a produits.

Il s'agit d'une complétion unique et bloquante, pas d'une conversation : une instruction, une réponse, sans outils ni boucle agentique. Les identifiants n'apparaissent jamais dans le script. Le fournisseur et sa clé sont résolus côté serveur à partir de la configuration propre au déploiement, et chaque appel est consigné dans le journal d'audit aux côtés de l'activité du chatbot : l'IA appelée par script est soumise aux mêmes contrôles et visible au même endroit.

Lorsque l'IA est désactivée ou qu'un fournisseur est injoignable, l'appel renvoie null au lieu de faire échouer le script : une application continue de fonctionner, que l'IA soit disponible ou non.

// 'alerts' is a table or result available in this scope
Map options = {"system": "You are a trading-risk analyst. Be concise.", "max_tokens": 500};
List data = [alerts];
String summary = session.promptAi("anthropic", "claude-opus-4-8", options, data,
    "Summarize the top risks in the attached alert rows in three bullet points.");

if (summary != null) {
  session.log(summary);
}

Là où cela compte

Développer dans vos IDE existants

Les développeurs écrivent en AmiScript là où ils travaillent déjà, aux côtés du code source, des dépôts, des outils de test et des processus de revue de leurs équipes, plutôt que dans un environnement séparé.

  • Dans l'éditeur : l'extension VS Code apporte complétion, diagnostics et débogage pas à pas, adossés au parseur de la plateforme elle-même
  • Dans l'outil de codage IA : le 3forge Plugin donne à Claude Code, Codex et GitHub Copilot les skills et les agents pour écrire, relire et déboguer de l'AmiScript
  • Ancré dans le déploiement réel : via le serveur MCP, l'un comme l'autre voient les schémas, procédures et objets d'exécution réellement déployés
  • Une seule interface gouvernée : les mêmes outils et permissions s'appliquent, qu'une modification soit écrite à la main ou suggérée par un assistant, et chaque appel est authentifié et audité

Découvrir le 3forge Plugin

AmiScript ouvert dans Visual Studio Code, avec la coloration syntaxique du script et l'extension 3forge dans la barre latérale
AmiScript dans Visual Studio Code.

Poursuivre la lecture

AmiScript s'exécute dans le maillage. Python y accède depuis l'extérieur.

Une interface programmatique pour la recherche, l'automatisation et les services de production.