feat: Banque des Coquillages v1.0 avec Docker et configuration NPM
This commit is contained in:
388
skill/interactionModels/custom/fr-FR.json
Normal file
388
skill/interactionModels/custom/fr-FR.json
Normal 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
1197
skill/lambda/index.js
Normal file
File diff suppressed because it is too large
Load Diff
47
skill/lambda/local-test.js
Normal file
47
skill/lambda/local-test.js
Normal 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
15
skill/lambda/package.json
Normal 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
43
skill/skill.json
Normal 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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user