L'assistant pouvait conclure « prenez plutot un conteneur complet » avec l'autorite de la marque, et repondre sur du transport interieur. Il ne pouvait pas non plus combler un trou de documentation qu'il venait de rencontrer. Perimetre (openai-trade.adapter) - SCOPE_RULES : LCL uniquement. Le FCL reste explicable — c'est du vocabulaire metier — mais jamais recommande, chiffre, ni presente comme la meilleure option. Un cas hors LCL part vers support@xpeditis.com. - SCOPE_RULES : transport international uniquement. Le transport interieur, le demenagement et le transport de personnes sont refuses, pas traites « un peu ». - La page wiki « LCL vs FCL » ne conseille plus le FCL : elle le decrit, et liste les cas hors perimetre a signaler au support. Corpus reconstruit. - L'amorce « LCL ou FCL ? » devient une question sur le calcul du fret LCL. Documentation interne d'abord (KNOWLEDGE_RULES) - Les extraits du wiki sont dits source de reference, avant les connaissances generales du modele. Entretien du wiki global - Nouvelle capacite `contribute_wiki_page` (scope write) : quand le wiki ne couvre pas un sujet d'information generale sur le transport international, l'assistant ecrit la page. Un titre deja pris est mis a jour, pas duplique. - `wiki-contribution-policy` (domaine) decide ce qui entre : refus du contenu qui conseille le FCL, du cas client (dossier, tarif, coordonnees) et du hors perimetre. Le prompt oriente, cette fonction empeche. - Un sujet deja couvert par le wiki publie (score >= 0,62) est refuse. - `WikiRetriever` indexe les contributions a cote du corpus fige, avec un index en memoire invalide par la revision du jeu ; une panne de ce cote ne coute pas la reponse. - Page `/dashboard/wiki/complements`, etiquetee comme ecrite par l'assistant, et carte sur l'index du wiki. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
99 lines
4.8 KiB
TypeScript
99 lines
4.8 KiB
TypeScript
import {
|
|
WIKI_TOPICS,
|
|
WikiContributionDraft,
|
|
refuseWikiContribution,
|
|
} from './wiki-contribution-policy';
|
|
|
|
/**
|
|
* Le corps d'une page valide : assez long, franchement international, sans
|
|
* conseil FCL ni donnee de compte. Chaque cas ne modifie que ce qu'il teste.
|
|
*/
|
|
const BODY = `Le connaissement maritime, ou bill of lading, est le document qui matérialise le contrat de transport international. Il vaut titre de propriété de la marchandise et preuve de la prise en charge par le transitaire. Il est émis en trois originaux négociables, dont la remise conditionne la livraison au destinataire au port de destination. Un connaissement propre ne porte aucune réserve sur l'état du cargo au chargement.`;
|
|
|
|
const draft = (overrides: Partial<WikiContributionDraft> = {}): WikiContributionDraft => ({
|
|
topic: 'documents-transport',
|
|
title: 'Le connaissement maritime',
|
|
section: 'Rôle et originaux',
|
|
body: BODY,
|
|
...overrides,
|
|
});
|
|
|
|
describe('refuseWikiContribution', () => {
|
|
it('accepts a page of general international-transport knowledge', () => {
|
|
expect(refuseWikiContribution(draft())).toBeNull();
|
|
});
|
|
|
|
it('accepts every published topic', () => {
|
|
for (const topic of WIKI_TOPICS) {
|
|
expect(refuseWikiContribution(draft({ topic }))).toBeNull();
|
|
}
|
|
});
|
|
|
|
it('refuses a topic outside the wiki', () => {
|
|
expect(refuseWikiContribution(draft({ topic: 'divers' }))).toBe('unknown-topic');
|
|
});
|
|
|
|
it('refuses a remark passed off as a page', () => {
|
|
expect(refuseWikiContribution(draft({ body: 'Le connaissement fait foi.' }))).toBe('too-thin');
|
|
});
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
/* Le FCL */
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
it.each([
|
|
'Nous recommandons le FCL au-delà de 15 m³.',
|
|
'Il est préférable de choisir un conteneur complet pour ce type de cargo.',
|
|
'Au-delà de ce volume, le FCL est plus économique sur la liaison maritime.',
|
|
'For larger cargo you should use FCL instead of consolidation.',
|
|
'Un conteneur dédié reste la meilleure option pour un export fragile.',
|
|
])('refuses FCL advocacy: %s', sentence => {
|
|
expect(refuseWikiContribution(draft({ body: `${BODY} ${sentence}` }))).toBe('fcl-advocacy');
|
|
});
|
|
|
|
it('allows FCL to be explained without being advised', () => {
|
|
const body = `${BODY} Le FCL désigne un conteneur complet chargé pour un seul expéditeur. Xpeditis opère en groupage LCL : les marchandises de plusieurs clients partagent le conteneur.`;
|
|
expect(refuseWikiContribution(draft({ body }))).toBeNull();
|
|
});
|
|
|
|
it('does not refuse an LCL recommendation that merely names FCL elsewhere', () => {
|
|
const body = `${BODY}\nLe FCL est un conteneur complet. Le groupage LCL est recommandé pour les envois de moins de 15 m³.`;
|
|
expect(refuseWikiContribution(draft({ body }))).toBeNull();
|
|
});
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
/* Le particulier */
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
it.each([
|
|
['a booking number', 'La réservation WCM-2026-004512 illustre ce cas.'],
|
|
['an e-mail address', 'Écrivez à jean.martin@acme-import.fr pour les originaux.'],
|
|
['a customer file', 'Pour votre dossier, le connaissement a été émis le 3 mars.'],
|
|
['a rate', 'Le fret maritime revient à 48 EUR par CBM sur cette liaison.'],
|
|
['a price in symbols', 'Comptez $3,400 de THC au départ.'],
|
|
])('refuses account-specific content — %s', (_label, sentence) => {
|
|
expect(refuseWikiContribution(draft({ body: `${BODY} ${sentence}` }))).toBe('account-specific');
|
|
});
|
|
|
|
/* ---------------------------------------------------------------------- */
|
|
/* Le perimetre */
|
|
/* ---------------------------------------------------------------------- */
|
|
|
|
it('refuses content that is not about international transport', () => {
|
|
const body =
|
|
"La tenue d'une comptabilité analytique suppose de distinguer les charges directes des charges indirectes, puis de les répartir par centre d'analyse selon des clés stables d'un exercice à l'autre. Cette méthode éclaire la marge dégagée par chaque activité de l'entreprise, sans rien changer aux comptes publiés.";
|
|
expect(refuseWikiContribution(draft({ body, title: 'Comptabilité analytique' }))).toBe(
|
|
'not-international'
|
|
);
|
|
});
|
|
|
|
it('checks the title and the section, not only the body', () => {
|
|
expect(refuseWikiContribution(draft({ title: 'Pourquoi préférer le FCL' }))).toBe(
|
|
'fcl-advocacy'
|
|
);
|
|
expect(refuseWikiContribution(draft({ section: 'Votre dossier en cours' }))).toBe(
|
|
'account-specific'
|
|
);
|
|
});
|
|
});
|