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.
acos(value)Modélisation de la saisonnalité et analyse des formes d'onde dans les séries de prixbitShiftLeft(n, shiftAmount)Encodage et décodage des indicateurs de droits d'accès en masque de bits, par utilisateur ou par deskclrGetAlpha(color)Génération d'échelles de couleurs pour les cartes de chaleur de risque, selon l'ampleur du PnL ou le niveau d'expositiondatePart(unixEpochMillis, part, timezone)Calcul des dates de règlement et filtrage des heures de marché selon les fuseaux horairesdecodeDouble64(value)Décodage des champs de prix binaires des flux de ticks à faible latence et des flux FIXexp(x)Capitalisation continue, facteurs d'actualisation et construction de courbes de tauxjsonExtract(json, xpath)Extraction de champs des réponses d'API de prix et des données de référencelogWarn(message)Journalisation dans la piste d'audit des étapes de workflow sensibles pour la conformité et des dépassements de seuilsparseXlsx(data, firstLineIsHeader)Ingestion de blotters de transactions, de rapports de VL de fonds et de fichiers de données statiques depuis ExcelpercentChange(old, nuw)Calcul des rendements quotidiens, des variations de prix intrajournalières et des écarts à l'indice de référencequote(text)Formatage des identifiants d'instruments, des devises et des requêtes SQL dynamiquesroundNearest(value, bucketSize)Alignement des prix sur le pas de cotation minimal et des quantités sur la taille de lotsignDataMac(data, key, algorithm)Signature des messages d'ordres sortants et authentification des requêtes vers les API des boursesstrAfter(text, toFind, origIfNotFound)Analyse des codes d'instruments, extraction de l'ISIN ou du ticker à partir d'identifiants compositestimestampNano()Mesure de latence à la nanoseconde pour l'analyse de la qualité d'exécutionurlDecode(url)Construction et décodage des appels REST vers les API de données de marché et de référencebeta(value1, value2)Bêta du portefeuille par rapport à l'indice de référence, sensibilité aux facteurs et calcul du ratio de couverturecatUniqueLimit(value, delim, limit)Agrégation des listes uniques de contreparties ou de plateformes d'exécution par transaction ou groupe d'ordrespercentileDisc(value, percent)Value at Risk à des niveaux de confiance définis sur un ensemble de positionskmeansCluster(nClusters, seed, values)Segmentation des portefeuilles par profil de risque, exposition sectorielle ou comportement clientresample(x, y, xq, linearOrSpline)Normalisation des données de ticks en barres OHLC uniformes pour les graphiques et le backtestingL'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é
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.