feat: Banque des Coquillages v1.0 avec Docker et configuration NPM

This commit is contained in:
2026-11-11 21:18:25 +01:00
commit 4d7e5a01d0
26 changed files with 8779 additions and 0 deletions

View File

@@ -0,0 +1,388 @@
{
"interactionModel": {
"languageModel": {
"invocationName": "les coquillages",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
},
{
"name": "OpenBankIntent",
"slots": [],
"samples": [
"la banque",
"ouvre la banque",
"la banque des coquillages",
"ouvre la banque des coquillages",
"la boîte",
"ouvre la boîte",
"la boîte à coquillages",
"la boîte des coquillages",
"ouvre la boîte à coquillages",
"ouvre la boîte des coquillages",
"tableau de bord",
"retour à la banque",
"retour à l'accueil"
]
},
{
"name": "IdentifySpeakerIntent",
"slots": [
{
"name": "ChildName",
"type": "CHILD_NAME"
}
],
"samples": [
"je suis {ChildName}",
"c'est {ChildName}",
"moi c'est {ChildName}",
"associe ma voix à {ChildName}",
"enregistre ma voix pour {ChildName}"
]
},
{
"name": "GetBalanceIntent",
"slots": [
{
"name": "ChildName",
"type": "CHILD_NAME"
}
],
"samples": [
"combien j'ai de coquillages",
"bonjour combien j'ai de coquillages",
"combien ai-je de coquillages",
"j'ai combien de coquillages",
"combien j'ai",
"quel est mon solde",
"où en est mon compte",
"combien j'ai dans ma tirelire",
"combien de coquillages a {ChildName}",
"quel est le solde de {ChildName}",
"combien a {ChildName}",
"combien {ChildName} a de coquillages",
"où en est {ChildName}",
"quel est notre bilan",
"combien on a de coquillages en banque",
"quel est le solde de la famille",
"combien d'argent a {ChildName}"
]
},
{
"name": "ListActivitiesIntent",
"slots": [
{
"name": "ShellCount",
"type": "AMAZON.NUMBER"
}
],
"samples": [
"quelles sont les activités",
"quelles sont les activités du mois",
"quelles sont les activités disponibles",
"qu'est-ce qu'on peut faire comme activité",
"que peut-on faire avec {ShellCount} coquillages",
"quelles activités on peut payer avec {ShellCount} coquillages",
"qu'est-ce qu'on peut acheter avec {ShellCount} coquillages",
"liste les activités"
]
},
{
"name": "DepositShellsIntent",
"slots": [
{
"name": "ChildName",
"type": "CHILD_NAME"
},
{
"name": "ShellCount",
"type": "AMAZON.NUMBER"
},
{
"name": "AccountType",
"type": "ACCOUNT_TYPE"
}
],
"samples": [
"je veux bloquer {ShellCount} coquillages",
"je bloque {ShellCount} coquillages",
"je veux placer {ShellCount} coquillages",
"je dépose {ShellCount} coquillages",
"je place {ShellCount} coquillages sur mon compte {AccountType}",
"{ChildName} veut bloquer {ShellCount} coquillages",
"{ChildName} bloque {ShellCount} coquillages",
"{ChildName} veut placer {ShellCount} coquillages",
"{ChildName} place {ShellCount} coquillages sur son compte {AccountType}",
"{ChildName} veut déposer {ShellCount} coquillages sur son compte {AccountType}",
"{ChildName} dépose {ShellCount} coquillages",
"bloquer {ShellCount} coquillages pour {ChildName}",
"placer {ShellCount} coquillages pour {ChildName}"
]
},
{
"name": "ContributeActivityIntent",
"slots": [
{
"name": "ChildName",
"type": "CHILD_NAME"
},
{
"name": "ShellCount",
"type": "AMAZON.NUMBER"
},
{
"name": "ActivityName",
"type": "ACTIVITY_NAME"
}
],
"samples": [
"je veux ajouter des coquillages sur {ActivityName}",
"je veux mettre des coquillages pour {ActivityName}",
"j'ajoute des coquillages pour {ActivityName}",
"je participe à {ActivityName}",
"{ChildName} veut ajouter des coquillages sur {ActivityName}",
"{ChildName} veut mettre des coquillages pour {ActivityName}",
"{ChildName} ajoute des coquillages sur {ActivityName}",
"{ChildName} participe à {ActivityName}",
"je mets {ShellCount} coquillages pour {ActivityName}",
"je donne {ShellCount} coquillages pour {ActivityName}",
"je veux mettre {ShellCount} coquillages sur {ActivityName}",
"je cotise {ShellCount} coquillages pour {ActivityName}",
"{ChildName} met {ShellCount} coquillages pour {ActivityName}",
"{ChildName} donne {ShellCount} coquillages pour {ActivityName}",
"{ChildName} veut mettre {ShellCount} coquillages sur {ActivityName}",
"mettre {ShellCount} coquillages de {ChildName} pour {ActivityName}",
"{ChildName} cotise {ShellCount} coquillages pour {ActivityName}"
]
},
{
"name": "ConvertEurosIntent",
"slots": [
{
"name": "ChildName",
"type": "CHILD_NAME"
},
{
"name": "ShellCount",
"type": "AMAZON.NUMBER"
}
],
"samples": [
"je veux convertir {ShellCount} coquillages en euros",
"je veux échanger {ShellCount} coquillages contre des euros",
"j'échange {ShellCount} coquillages en euros",
"je mets {ShellCount} coquillages dans ma tirelire en euros",
"{ChildName} veut convertir {ShellCount} coquillages en euros",
"{ChildName} veut échanger {ShellCount} coquillages contre des euros",
"{ChildName} échange {ShellCount} coquillages en euros",
"convertir {ShellCount} coquillages en euros pour {ChildName}",
"{ChildName} met {ShellCount} coquillages dans sa tirelire en euros"
]
},
{
"name": "SimulateInterestIntent",
"slots": [
{
"name": "ShellCount",
"type": "AMAZON.NUMBER"
}
],
"samples": [
"combien rapportent {ShellCount} coquillages bloqués",
"quel est l'intérêt pour {ShellCount} coquillages",
"si je bloque {ShellCount} coquillages je gagne combien",
"calcule les intérêts pour {ShellCount} coquillages"
]
},
{
"name": "GetActivityDetailIntent",
"slots": [
{
"name": "ActivityName",
"type": "ACTIVITY_NAME"
}
],
"samples": [
"affiche les détails de {ActivityName}",
"montre les détails de {ActivityName}",
"donne moi les détails de {ActivityName}",
"affiche l'activité {ActivityName}",
"montre moi l'activité {ActivityName}",
"où en est {ActivityName}",
"où en est l'activité {ActivityName}",
"combien il manque pour {ActivityName}",
"détails de {ActivityName}"
]
},
{
"name": "ProposeActivityIntent",
"slots": [
{
"name": "ChildName",
"type": "CHILD_NAME"
},
{
"name": "ActivityTitle",
"type": "AMAZON.SearchQuery"
}
],
"samples": [
"je propose l'activité {ActivityTitle}",
"je propose l'activité de {ActivityTitle}",
"je propose comme activité {ActivityTitle}",
"je propose {ActivityTitle}",
"je veux proposer l'activité {ActivityTitle}",
"je voudrais proposer l'activité {ActivityTitle}",
"je veux proposer comme activité {ActivityTitle}",
"je voudrais proposer {ActivityTitle}",
"je veux proposer {ActivityTitle}",
"propose l'activité {ActivityTitle}",
"propose comme activité {ActivityTitle}",
"proposer l'activité {ActivityTitle}",
"nouvelle activité {ActivityTitle}",
"ajoute l'activité {ActivityTitle}",
"je veux faire l'activité {ActivityTitle}",
"on pourrait faire l'activité {ActivityTitle}",
"on pourrait faire {ActivityTitle}",
"{ChildName} propose l'activité {ActivityTitle}",
"{ChildName} propose comme activité {ActivityTitle}",
"{ChildName} propose {ActivityTitle}",
"{ChildName} veut proposer l'activité {ActivityTitle}",
"{ChildName} veut proposer {ActivityTitle}"
]
}
],
"types": [
{
"name": "CHILD_NAME",
"values": [
{
"id": "hailey",
"name": {
"value": "Hailey",
"synonyms": [
"Hailey",
"Haley",
"Ailey",
"Élie",
"Hély"
]
}
},
{
"id": "violette",
"name": {
"value": "Violette",
"synonyms": [
"Violette",
"Violet"
]
}
},
{
"id": "andreas",
"name": {
"value": "Andreas",
"synonyms": [
"Andreas",
"Andréas",
"Andrea",
"Andréa"
]
}
}
]
},
{
"name": "ACCOUNT_TYPE",
"values": [
{
"id": "bloque",
"name": {
"value": "bloqué",
"synonyms": [
"bloqué",
"épargne",
"livret",
"intérêts"
]
}
},
{
"id": "disponible",
"name": {
"value": "disponible",
"synonyms": [
"disponible",
"courant",
"normal",
"virtuel"
]
}
}
]
},
{
"name": "ACTIVITY_NAME",
"values": [
{
"name": {
"value": "Soirée Pizza et Cinéma",
"synonyms": [
"pizza",
"cinéma",
"soirée pizza",
"film"
]
}
},
{
"name": {
"value": "Bowling en famille",
"synonyms": [
"bowling",
"le bowling"
]
}
},
{
"name": {
"value": "Parc Aquatique",
"synonyms": [
"parc aquatique",
"piscine",
"toboggans"
]
}
},
{
"name": {
"value": "Sortie Accrobranche",
"synonyms": [
"accrobranche",
"l'accrobranche",
"tyrolienne"
]
}
}
]
}
]
}
}
}

1197
skill/lambda/index.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
import { handler } from './index.js';
function buildIntentEvent(intentName, slots = {}) {
const formattedSlots = {};
for (const [k, v] of Object.entries(slots)) {
formattedSlots[k] = { name: k, value: String(v) };
}
return {
version: '1.0',
session: { new: false, sessionId: 'SessionId.test', application: { applicationId: 'amzn1.ask.skill.test' } },
context: { System: { application: { applicationId: 'amzn1.ask.skill.test' } } },
request: {
type: 'IntentRequest',
requestId: 'EdwRequestId.test',
timestamp: new Date().toISOString(),
locale: 'fr-FR',
intent: {
name: intentName,
confirmationStatus: 'NONE',
slots: formattedSlots
}
}
};
}
async function runTests() {
console.log('🎙️ Test local du Skill Alexa "La Banque des Coquillages"...\n');
const tests = [
{ label: 'Solde de Violette', event: buildIntentEvent('GetBalanceIntent', { ChildName: 'Violette' }) },
{ label: 'Activités du mois', event: buildIntentEvent('ListActivitiesIntent', {}) },
{ label: 'Simulation intérêts (10 coquillages)', event: buildIntentEvent('SimulateInterestIntent', { ShellCount: 10 }) }
];
for (const t of tests) {
try {
const res = await new Promise((resolve, reject) => {
handler(t.event, {}, (err, response) => (err ? reject(err) : resolve(response)));
});
console.log(`✅ [${t.label}] ->`, res.response.outputSpeech.ssml);
} catch (e) {
console.error(`❌ [${t.label}] -> Erreur (assurez-vous que 'back' tourne sur le port 4000):`, e.message);
}
}
}
runTests();

15
skill/lambda/package.json Normal file
View File

@@ -0,0 +1,15 @@
{
"name": "banque-coquillages-skill-lambda",
"version": "1.0.0",
"description": "AWS Lambda / Alexa Skill Handler pour La Banque des Coquillages (Hailey, Violette et Andreas)",
"type": "module",
"main": "index.js",
"scripts": {
"test": "node local-test.js"
},
"dependencies": {
"ask-sdk-core": "^2.14.0",
"ask-sdk-model": "^1.40.0"
}
}

43
skill/skill.json Normal file
View File

@@ -0,0 +1,43 @@
{
"manifest": {
"publishingInformation": {
"locales": {
"fr-FR": {
"summary": "La Banque des Coquillages pour Hailey, Violette et Andreas",
"examplePhrases": [
"Alexa, ouvre la banque des coquillages",
"Alexa, demande à la banque des coquillages combien de coquillages a Hailey",
"Alexa, demande à la banque des coquillages quelles sont les activités du mois"
],
"keywords": [
"coquillages",
"enfants",
"récompenses",
"épargne",
"famille"
],
"name": "La Banque des Coquillages",
"description": "Skill familial permettant à Hailey, Violette et Andreas de consulter leurs coquillages, de financer des activités communes et de placer leurs coquillages sur un livret bloqué à intérêts."
}
},
"isAvailableWorldwide": false,
"testingInstructions": "Utiliser avec le backend API familial.",
"category": "EDUCATION_AND_REFERENCE",
"distributionCountries": [
"FR",
"BE",
"CH",
"CA"
]
},
"apis": {
"custom": {
"endpoint": {
"uri": "arn:aws:lambda:eu-west-1:000000000000:function:banque-coquillages-skill"
}
}
},
"manifestVersion": "1.0"
}
}