Le modèle d'action proposé ici permet de communiquer avec ChatGPT. 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). Cette action basique permet de converser avec ChatGPT. La question est inscrite dans le champ de la partie supérieure de l'écran et envoyée à ChatGPT via le bouton "Interroger". La question posée ainsi que la réponse donnée se place dans le contenu HTML. Le fil de la conversation est entièrement sauvegardé, dès lors il est toujours possible de poursuivre cette conversation. ChatGPT se positionnera toujours dans le contexte de cette conversation.
Dans le code, il convient d'adapter le paramètre systemMessage qui indique à ChatGPT, lors de l'envoi de la première question, le contexte ainsi que le mode de réponse souhaité.
Cette action basique peut être enrichie avec des questions posées incluant des données provenant de la base de données de Mercator par exemple.
Elle requiert 3 colonnes de type varchar(MAX) dans la table ACTIONS :
- NOTE : pour la question
- HTML : pour la conversation sous forme HTML
- RESULTAT : pour la conversation sous forme JSON (à ne jamais éditer manuellement)
Pour installer cette action :
- Dézipper le fichier ZIP ci-inclus
- Dézipper le fichier ZIP ci-inclus
Le fichier zip contient deux fichiers au format "Mercator Action" : - un fichier MACTX utilisé pour la version Aruba
- un fichier MACT utilisé pour les versions Legacy
- Plus d'information pour une installation rapide
Note importante : ce modèle d'action, tel que présenté ici, présente peu d'intérêt, puisqu'elle correspond à un simple chat. Son intérêt se trouvera si des informations envoyées à ChatGPT sont extraites de Mercator. Par exemple, si on souhaite obtenir une recommandation de clients à visiter, on peut extraire ces données provenant de Mercator :
- Données d’identification
- ID client
- Nom de l’entreprise
- Localisation (ville, région, pays)
- Données business
- Chiffre d’affaires réalisé (CA, volume d’achat)
- Évolution du CA (croissance ou baisse sur les derniers mois)
- Marge générée
- Potentiel estimé (taille du marché, opportunités)
- Données relationnelles
- Dernière visite / dernier contact
- Fréquence des visites souhaitée
- Niveau de satisfaction (si dispo)
- Ouverture à de nouvelles offres
- Contrainte logistique (si applicable)
- Distance / temps de trajet
- Zone géographique (utile pour optimiser les tournées)
Ces données peuvent être conditionnées sous la forme d'une chaîne de caractères JSON ou CSV. Cette dernière sera concaténée à systemMessage et servira de contexte pour la génération de la réponse par ChatGPT.
Le code du bouton communiquant avec ChatGPT est le suivant :
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorController;
using System.Windows.Forms;
using MercatorExtensions;
using MercatorDatabase;
// <CompileWithRoslyn />
namespace MercatorUi.MovableControls.ButtonsCodes
{
public static class Script
{
public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
{
// enter your customized code here
Forms.Action.ActionForm actionForm = (Forms.Action.ActionForm)clickedButton.Form;
Engine.Crm.ActionEngine actionEngine = actionForm.ActionEngine;
if (string.IsNullOrWhiteSpace(actionEngine.ActionsRecord.NOTE))
{
MovableTextBox textBoxNote = actionForm.MovableControls.Values.OfType<MovableTextBox>().First(p => p.Source == "NOTE");
_Divers.FocusError(textBoxNote);
return;
}
MercatorAI.FactoryOpenAI factory = new MercatorAI.FactoryOpenAI();
MercatorAI.Interfaces.IOpenAiChat openAiChat = factory.CreateOpenAiChat("gpt-5-mini", actionEngine.ActionsRecord.RESULTAT, out string error); // actionEngine.ActionsRecord.RESULTAT contient la conversation sous forme json
if (!string.IsNullOrEmpty(error))
{
Dialogs.Stop("Impossible d'initialiser le chat d'OpenAI : " + error);
return;
}
Wait.WaitStatic.WaitWindowBaseThread(Api.Iif_langue(Globals.Langue, IifLangueEnum.AIisThinking));
string ret = "Pas de réponse";
_BaseClasses.ExclusiveBackgroundWorkerAsync exclusiveBackgroundWorkerAsync = new _BaseClasses.ExclusiveBackgroundWorkerAsync(async () => ret = await openAiChat.AskAsync(actionEngine.ActionsRecord.NOTE.Trim(),
responseFormat: MercatorAI.Tools.ChatResponseFormat.HtmlContent,
systemMessage: actionEngine.ActionsRecord.RESULTAT == "" ? "Tu es un assistant qui répond à des questions dans le cadre de mon entreprise qui s'appelle Widget sa." : ""), formWhereToCenterLoadingCircle: actionForm);
Wait.WaitStatic.WaitClearBaseThread();
if (exclusiveBackgroundWorkerAsync.ExceptionDuringDoWork != null)
{
Dialogs.Stop(exclusiveBackgroundWorkerAsync.ExceptionDuringDoWork.Message);
return;
}
actionEngine.ActionsRecord.HTML =
"<div style=\"margin-top: 25px; margin-bottom: 25px; padding: 25px 15px; border-radius: 10px; background-color: rgb(249, 246, 241);\">"
+ actionEngine.ActionsRecord.NOTE.Trim().Replace("\r\n", "<br>")
+ "</div>"
+ "<div style=\"padding: 0px 15px 0px 15px;\">"
+ ret
+ "</div>"
+ (actionEngine.ActionsRecord.HTML != "" ? "<hr style=\"margin-top: 25px; margin-bottom: 25px\">" + actionEngine.ActionsRecord.HTML : "");
actionEngine.ActionsRecord.RESULTAT = openAiChat.ConversationJson;
actionEngine.ActionsRecord.NOTE = "";
}
}
}
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.
Les réponses donné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, ces réponses peuvent être incomplètes, inexactes, partiellement ou totalement.
L’utilisateur reste seul responsable de l'évaluation et de l’utilisation de ces réponses. En aucun cas Mercator ou le fournisseur du service IA ne saurait être tenu responsable des conséquences qui découleraient de l'utilisation de ces réponses.
L'usage de ce service doit être rendu compatible avec les normes relatives au RGPD qui sont en place dans l'entreprise.
A télécharger :
0000003304.zip (21 Kb - 24/09/2025)