Nous montrons ici comment interagir avec ChatGPT pour obtenir une analyse financière sur base des comptes annuels au format BNB - Légal. Ceci requiert l'installation du plugin MercatorAI.OpenAI et ne fonctionne qu'avec une version Core de Mercator. (Le code est toutefois compilable dans une version classique).
Le code installe cet élément dans le menu contextuel :

Il permet de déclencher la demande d'analyse. Une fenêtre de chat s'ouvre. Il est possible de poursuivre la conversation en plaçant un message dans la partie inférieure de l'écran et en cliquant sur "Interroger".
Le code s'établit comme suit :
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Windows.Forms;
// <CompileWithRoslyn />
namespace Main
{
public class Customizer : MercatorUi.ICustomizers.IExec
{
public void Main(MercatorUi.ICustomizers.ExecAction action)
{
if (action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
{
Globals.Main.BaseFormCreating += Main_BaseFormCreating;
}
else if (action == MercatorUi.ICustomizers.ExecAction.DossierClose)
{
Globals.Main.BaseFormCreating -= Main_BaseFormCreating;
}
}
void Main_BaseFormCreating(object sender, MercatorUi.Main.BaseFormCreatingEventArgs e)
{
if (e.Form is MercatorUi.Forms.Accounting.AccountingBilanForm accountingBilanForm)
{
ToolStripMenuItem mi_analysis = new ToolStripMenuItem(_Divers.Iif_langue(Globals.Langue, "Financiële Analyse", "Financial Analysis", "Financiële Analyse", "Analyse Financière"), GraphicKit.CurrentGraphicKit.Images.AI16,
(s, e2) =>
{
string title = ((ToolStripMenuItem)s).Text + " " + accountingBilanForm.Tree.Columns[2].Text + (accountingBilanForm.WithYear2 ? "-" + accountingBilanForm.Tree.Columns[3].Text : "");
string legislat;
if (Globals.Params["LEGISLAT"] == "LU")
legislat = _Divers.Iif_langue(accountingBilanForm.Langue, "luxemburgischem", "Luxembourg", "Luxemburgse", "luxembourgeoise");
else
legislat = _Divers.Iif_langue(accountingBilanForm.Langue, "belgischem", "Belgian", "Belgische", "belge");
string systemMessage = _Divers.Iif_langue(accountingBilanForm.Langue,
$"Du bist ein Experte für Finanzanalyse und analysierst die Bilanz gemäß {legislat} Recht, wie unten dargestellt.\n",
$"You are an expert in financial analysis and you are analyzing the balance sheet under {legislat} legislation as shown below.\n",
$"Je bent een expert in financiële analyse en je analyseert de balans volgens de {legislat} wetgeving zoals hieronder weergegeven.\n",
$"Tu es un expert en analyse financière et tu analyses le bilan en législation {legislat} repris ci-dessous.\n")
+ accountingBilanForm.Text + "\n";
if (accountingBilanForm.WithYear2)
systemMessage += _Divers.Iif_langue(accountingBilanForm.Langue,
"Tot1 enthält den Saldo des Bilanzjahres. Tot2 enthält den Saldo des Vorjahres.\n",
"Tot1 contains the balance for the year of the balance sheet. Tot2 contains the balance for the previous year.\n",
"Tot1 bevat het saldo van het boekjaar van de balans. Tot2 bevat het saldo van het voorgaande jaar.\n",
"Tot1 contient le solde de l'année du bilan. Tot2 contient le solde de l'année précédente.\n");
else
systemMessage += _Divers.Iif_langue(accountingBilanForm.Langue,
"Tot1 enthält den Saldo des Bilanzjahres.\n",
"Tot1 contains the balance for the year of the balance sheet.\n",
"Tot1 bevat het saldo van het boekjaar van de balans.\n",
"Tot1 contient le solde de l'année du bilan.\n");
systemMessage += _Divers.Iif_langue(accountingBilanForm.Langue,
"Sie antworten AUSSCHLIESSLICH in Markdown.",
"You answer EXCLUSIVELY in Markdown.",
"Je antwoordt UITSLUITEND in Markdown.",
"Tu réponds EXCLUSIVEMENT en Markdown.");
systemMessage += "\n\n" + accountingBilanForm.JsonData;
string question = _Divers.Iif_langue(accountingBilanForm.Langue,
"Kannst du die Analyse dieser Bilanz mit den üblichen Kennzahlen durchführen und mich über eventuelle Auffälligkeiten informieren, die du feststellen würdest?",
"Can you perform the analysis of this balance sheet using the usual ratios and inform me of any anomalies you might detect?",
"Kan je de analyse van deze balans uitvoeren met de gebruikelijke ratio’s en me informeren over eventuele anomalieën die je zou detecteren?",
"Peux-tu effectuer l'analyse de ce bilan avec les ratios habituels et m'informer des anomalies que tu détecterais.");
MercatorAI.FactoryOpenAI.ChatOptions chatOptions = new MercatorAI.FactoryOpenAI.ChatOptions
{
Temperature = 0.2f, // autoriser une légère variation
TopP = 1.0f
};
MercatorUi.Forms.Other.ChatForm.SimpleOpenAiChat("gpt-4o", title, systemMessage, question, autoAskFirstQuestion: false, chatOptions: chatOptions, userControl: null, responseUpdater: null, standardStreamingAction: MercatorUi.Forms.Other.ChatForm.StandardStreamingActionEnum.RawStreamShow);
});
EventHandler fullInitializedHandler = null;
fullInitializedHandler = (s, e2) =>
{
accountingBilanForm.FullInitialized -= fullInitializedHandler;
if (accountingBilanForm.Type == MercatorUi.Forms.Accounting.AccountingBilanForm.BilanType.Legal)
accountingBilanForm.Tree.ContextMenuStrip.Items.AddRange(new ToolStripItem[] { new ToolStripSeparator(), mi_analysis });
};
accountingBilanForm.FullInitialized += fullInitializedHandler;
}
}
}
}
Les informations sont envoyées à un tiers (OpenAI). Il ne faut donc en aucun cas transmettre des données revêtant un caractère confidentiel.
L'analyse et/ou suggestions proposées par ce code sont générées automatiquement à l’aide d’un modèle d’intelligence artificielle (IA). Bien que conçu pour fournir des réponses utiles et pertinentes, celles-ci peuvent être incomplètes, inexactes, partiellement ou totalement.