Enhancing Customer Experience: ChatGPT and SAP FSM Integration.
Le rapport d'intervention, ce goulot d'étranglement
Un technicien termine son intervention et saisit ses observations sur son téléphone, souvent debout, parfois sous la pluie. Le texte part tel quel : abréviations, jargon, phrases tronquées. Quelqu'un — dispatcher ou chef de projet — le relit et le réécrit avant qu'il n'atteigne le client final. Ce maillon de relecture coûte du temps à deux personnes et retarde la clôture.
Le principe : une extension, pas une modification
L'idée tient en une phrase : laisser le technicien écrire comme il écrit, et faire reformuler le texte par un modèle de langage au moment où le dispatcher le consulte. Rien de tout cela ne touche au cœur de SAP FSM. On construit une extension, on la déclare sur le tableau de dispatching, et elle vit à côté du standard — donc elle survit aux montées de version.
Étape 1 · Créer et déployer l'extension
SAP publie sur GitHub des extensions d'exemple qui servent de point de départ : elles portent déjà le contexte transmis par FSM (tenant, société, jeton, objet sélectionné). Partez de l'une d'elles, créez votre dépôt, activez GitHub Pages — vous obtenez une URL publique servie en HTTPS, ce qui suffit à héberger une extension FSM le temps d'un prototype.

Étape 2 · La déclarer dans SAP FSM
Dans l'administration FSM, ajoutez l'extension à un écran en pointant l'URL GitHub Pages. Nous l'avons placée sur le panneau droit du tableau de dispatching : le dispatcher y voit le contenu se mettre à jour dès qu'il sélectionne une activité, sans changer d'écran ni de contexte.


Étape 3 · Récupérer le commentaire du technicien
Le commentaire est stocké dans le champ remark de l'activité, alimenté par une business rule. Pour l'exploiter, deux appels enchaînés à la Data API : l'activité d'abord, puis le service call auquel elle se rattache — ce dernier porte l'objet de l'intervention, utile pour donner du contexte au modèle.
// Récupère l'objet Activity
fetch(`https://${cloudHost}/api/data/v4/Activity/${activityId}` +
`?dtos=Activity.37&account=${account}&company=${company}`, { headers })
.then((response) => response.json())
.then((json) => {
const activity = json.data[0].activity
// Récupère le ServiceCall rattaché à cette activité
fetch(`https://${cloudHost}/api/data/v4/ServiceCall/${activity.object.objectId}` +
`?dtos=ServiceCall.21&account=${account}&company=${company}`, { headers })
.then((response) => response.json())
.then((json) => resolve(json.data[0].serviceCall))
})Étape 4 · Appeler le modèle
Le texte en main, il ne reste qu'à demander la reformulation. L'instruction compte plus que le modèle : « reformule ceci comme un ingénieur mécanicien » produit un tout autre résultat que « résume ». C'est le paramètre sur lequel itérer avec les équipes métier, jusqu'à obtenir le registre attendu par vos clients.
function callOpenAI(inputText) {
fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
model: 'gpt-3.5-turbo',
max_tokens: 60,
messages: [
{ role: 'user', content: `Rephrase this as a mechanical engineer: ${inputText}` },
],
}),
})
.then((response) => response.json())
.then((data) => updateUI(data.choices[0].message.content))
.catch((error) => console.error('Error:', error))
}Le résultat côté dispatcher
À la sélection d'une activité, l'extension affiche le commentaire brut du technicien. Un bouton « Format GPT » déclenche l'appel et remplace le texte par une version propre, présentable au client final. Le dispatcher garde la main : il lit, corrige si besoin, valide. On enlève la corvée de réécriture, pas le contrôle humain.


Ce que nous ferions différemment aujourd'hui
Cette maquette date de 2023 et a vieilli sur deux points qu'il faut connaître avant de la reprendre. D'abord la sécurité : une clé d'API appelée depuis le navigateur est lisible par n'importe quel utilisateur de l'extension — en production, l'appel passe par un service intermédiaire qui détient seul la clé. Ensuite le modèle : gpt-3.5-turbo n'est plus le choix par défaut, et les générations suivantes suivent mieux les consignes de registre.
- Ne jamais embarquer la clé d'API dans le front : un proxy côté serveur la détient et applique les quotas.
- Journaliser les reformulations : un texte envoyé au client doit rester traçable et rejouable.
- Prévenir les équipes que le texte est assisté : la transparence évite les mauvaises surprises côté client comme côté représentants du personnel.
Et après
La reformulation de rapport n'est qu'une porte d'entrée. Le même schéma — extension, appel API, restitution dans l'écran où l'utilisateur travaille déjà — sert à résumer un historique d'équipement, suggérer les pièces d'une intervention ou traduire un rapport pour un client étranger. Si l'un de ces cas vous parle, parlons-en.
Une première version de cet article a paru sur le SAP Community Blog