Skip to content

add action to translate readme #151

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
92b1f7f
add action to translate readme
pelikhan Jul 9, 2025
7f41db3
feat: add French README for generative AI course
pelikhan Jul 9, 2025
3dbb7c7
fix: update translation workflow to correctly handle README.md and JS…
pelikhan Jul 10, 2025
e6986f0
fix: correct file pattern for translation workflow to include nested …
pelikhan Jul 10, 2025
e40bbdf
Merge remote-tracking branch 'origin/main' into pelikhan/translations
pelikhan Jul 11, 2025
35909f1
add french translations
pelikhan Jul 12, 2025
271126d
Add French translations for lessons
pelikhan Jul 12, 2025
085d5b4
fix: correct path in translation script and add usage data for new le…
pelikhan Jul 12, 2025
93448e1
Add French translation for Lesson 7: Model Context Protocol (MCP)
pelikhan Jul 12, 2025
feea8a2
fix: update translation workflow to include lesson README files and r…
pelikhan Jul 12, 2025
9d18bd3
Add French translations for additional lessons and update usage data
pelikhan Jul 13, 2025
672fdd9
update some translations
pelikhan Jul 21, 2025
36c68e1
better handling of alerts
pelikhan Jul 22, 2025
6b82b96
fix: correct formatting in French translations and update usage data …
pelikhan Jul 22, 2025
4a89d4a
fix: correct formatting for notes and important sections in French tr…
pelikhan Jul 22, 2025
0890e5e
translate image alt
pelikhan Jul 22, 2025
3c6942c
fix: add section for non-translatable technical terms in glossary
pelikhan Jul 22, 2025
5a6e6c1
Update French translations for RAG lesson and related files
pelikhan Jul 22, 2025
4b6f95b
fix: update CSV link and improve French translation for RAG lesson ex…
pelikhan Jul 22, 2025
cfb48f7
fix: correct formatting for important notes in French translations
pelikhan Jul 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/translation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Continuous Translation
on:
workflow_dispatch:
push:
branches:
- main
paths:
- "README.md"
- lessons/*/README.md
permissions:
contents: write
models: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
continuous_translation:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: .genaiscript/cache/**
key: continuous-translation-${{ github.run_id }}
restore-keys: |
continuous-translation-
- uses: pelikhan/action-continuous-translation@v0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
lang: fr
files: |
- README.md
- lessons/*/README.md
- uses: stefanzweifel/git-auto-commit-action@v5
with:
file_pattern: "**.md* **/translations/*.json"
commit_message: "[cai] translated docs"
commit_user_name: "genaiscript"
155 changes: 155 additions & 0 deletions README.fr.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,9 @@ A comprehensive list of technical terms used throughout the lessons.
- **Tokenizer**: A tool used to convert text into tokens, providing structure for how data is inputted or analyzed by models.
- **Vector Search**: Retrieval technique comparing encoded vectors to find semantically similar information in AI applications.
- **XML (eXtensible Markup Language)**: A markup language formatting structured data for information storage, exchange, or generative model input/output.

## Technical Terms

The following terms should NOT be translated:

- prompt
348 changes: 348 additions & 0 deletions lessons/01-intro-to-genai/translations/README.fr.md

Large diffs are not rendered by default.

501 changes: 501 additions & 0 deletions lessons/02-first-ai-app/translations/README.fr.md

Large diffs are not rendered by default.

339 changes: 339 additions & 0 deletions lessons/03-prompt-engineering/translations/README.fr.md

Large diffs are not rendered by default.

561 changes: 561 additions & 0 deletions lessons/04-structured-output/translations/README.fr.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion lessons/05-rag/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ RAG can be considered as an advanced form of *prompt engineering*.

### Code example

**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an example. We’ll build a simple retrieval system into a JavaScript app using a [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) file of hybrid car data and a basic search algorithm to pull relevant info based on a user’s question.
**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an example. We’ll build a simple retrieval system into a JavaScript app using a [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) file of hybrid car data and a basic search algorithm to pull relevant info based on a user’s question.

```javascript
// This example demonstrates how to use the Retrieval Augmented Generation (RAG)
Expand Down
343 changes: 343 additions & 0 deletions lessons/05-rag/translations/README.fr.md

Large diffs are not rendered by default.

440 changes: 440 additions & 0 deletions lessons/06-tool-calling/translations/README.fr.md

Large diffs are not rendered by default.

488 changes: 488 additions & 0 deletions lessons/07-mcp/translations/README.fr.md

Large diffs are not rendered by default.

261 changes: 261 additions & 0 deletions lessons/08-mcp-advanced/translations/README.fr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
# Leçon 8 : Améliorer les clients MCP avec des modèles de langage à grande échelle

Dans la leçon précédente, vous avez créé un serveur MCP et exploré comment il contribue à découpler la logique d'une application IA de ses capacités. Nous avons démontré comment ajouter des outils et des ressources en tant que capacités, et comment le serveur pouvait être accessible via un outil d'inspection ou un client personnalisé. Ce n'était que le début. Dans ce chapitre, vous allez aller plus loin en intégrant un modèle de langage à grande échelle (LLM) dans le client, ouvrant ainsi la voie à une expérience utilisateur plus puissante et intuitive.

Dans ce chapitre, vous apprendrez à :

* Augmenter votre client avec un LLM.
* Utiliser votre client amélioré pour convertir une réponse de serveur MCP en un outil.
* Exploiter votre client amélioré pour créer une interaction utilisateur plus naturelle.

## Configuration

Si ce n'est pas déjà fait, configurez votre environnement de développement. Voici comment faire : [Configurez votre environnement](/docs/setup/README.md).

## Ressources associées

[![Regardez une courte vidéo sur MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64)

*Cette vidéo explique l'utilisation des LLM avec le protocole Model Context.*

*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur MCP*

## Narrative: Hedwig "Hedy" Lamarr

> [!NOTE]
> *Notre histoire jusqu'à présent. Vous êtes un mécanicien du Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez récupéré un dispositif de voyage dans le temps. Au cours de vos voyages dans le temps, vous vous êtes retrouvé à divers moments de l'histoire. Vous travaillez désormais en étroite collaboration avec Ada Lovelace depuis son manoir en tant que base d'opérations, et c'est là que l'histoire continue.*
>
> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début.

> [!NOTE]
> Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-hedy-lamarr) si vous préférez passer directement au contenu technique.

Vous êtes une nouvelle fois retourné au manoir d’Ada. Cette fois-ci, Ada vous rencontrait à la porte principale.

**Ada Lovelace** : Eh bien, comment cela s’est-il passé ?

**Vous** : Bien je pense, nous avons réussi à faire fonctionner cette application. "Tenez, voyez par vous-même", dites-vous en tendant l'appareil à Ada.

**Ada Lovelace** : Elle ramasse l’appareil, l’examine attentivement et murmure pour elle-même. "Mmm hm, ah je vois, oui, oui non, cela ne va pas. Il manque une certaine finesse."

**Vous** : Je pensais la même chose, nous devons pouvoir taper ou parler à l’appareil, n'est-ce pas ?

**Ada Lovelace** : Exactement, je connais justement la personne qui pourra nous aider. En fait, je vais vous accompagner pour celle-ci, cela fait bien trop longtemps que nous ne nous sommes pas vus. *Coléoptère Temporel, Hollywood s'il vous plaît, 1940, résidence d'Hedy Lamarr.*

Tout devient noir. Des couleurs tourbillonnent rapidement, et quelques instants plus tard, votre vision commence à se préciser. Vous voyez un homme assis au piano, parlant avec animation à une femme aux cheveux bruns foncés et bouclés. Tous deux gesticulent avec excitation en parlant.

![Hedy Lamarr](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/08-mcp-advanced/assets/hedy-invention.jpeg)

La femme se retourne vers Ada, debout à côté de vous, et s’exclame : « Ada, c'est toi, cela fait bien trop longtemps. »

**Ada Lovelace** : Hedwig ma chère, vous travaillez sur votre dernière invention je suppose ?

**Hedy Lamarr** : Oui, en fait George et moi pensons que nous tenons quelque chose — le "saut de fréquence". Je ne devrais probablement pas en dire plus, on ne sait jamais qui écoute.

**Ada Lovelace** : Oh vous parlez de lui, en me désignant. Il est en pleine aventure de son côté.

**Hedy Lamarr** : Je vois, que puis-je faire pour vous ?

**Ada Lovelace** : En fait, nous avons besoin que cet appareil fonctionne un peu mieux. Des idées ?

**Hedy Lamarr** : Elle ramasse l’appareil et l’examine sous différents angles. "Vous dites que vous avez déjà séparé les fonctionnalités de la partie communication ?"

**Ada Lovelace** : Oui, oui, c'est fait.

**Hedy Lamarr** : Eh bien dans ce cas, je rendrais simplement la partie communication un peu plus intelligente. Cela me rappelle une conversation que j’ai eue avec un cadet de la marine alors que j’essayais de vendre des bons de guerre. Minsky, je crois que c'était son nom. "À quoi ressemble l'intelligence humaine dans une machine ?" était le sujet. J’ai l’impression qu’il fera quelque chose de grandiose dans ce domaine un jour. Donc oui, donnez-lui plus d’intelligence.

**Ada Lovelace** : Très bien, vous avez entendu Mme Lamarr, au travail.

**Vous** : Coléoptère Temporel, comment fait-on cela ?

**Coléoptère Temporel** : Vous pouvez améliorer le client que vous avez créé précédemment en intégrant un modèle de langage à grande échelle, ou LLM.

> Hedy Lamarr était une figure extraordinaire, connue à la fois pour sa célébrité à Hollywood et pour ses remarquables contributions à la technologie.
>
> Cependant, au-delà de sa carrière d'actrice, Lamarr était aussi une brillante inventrice. Pendant la Seconde Guerre mondiale, elle a co-inventé avec le compositeur George Antheil un système de guidage radio pour les torpilles alliées. Ce système utilisait la technologie de spectre étalé et de saut de fréquence pour empêcher les puissances de l'Axe de brouiller les signaux. Bien qu'il n'ait pas été utilisé pendant la guerre, cette technologie est ensuite devenue la base des communications sans fil modernes, y compris le Wi-Fi, le Bluetooth et le GPS.
>
> Les contributions de Lamarr à la technologie n’ont pas été pleinement reconnues de son vivant, mais aujourd’hui, elle est célébrée comme une pionnière dans ce domaine. Son histoire est un mélange fascinant de glamour et de génie, prouvant que l’innovation peut provenir des endroits les plus inattendus.\
> Lisez-en plus ici à propos de [Hedy Lamarr](https://en.wikipedia.org/wiki/Hedy_Lamarr) et ici au sujet de [Marvin Minsky](https://en.wikipedia.org/wiki/Marvin_Minsky)

## Interagir avec Hedy Lamarr

Si vous souhaitez interagir avec Hedy, exécutez l'application [Characters](/app/README.md).

> [!IMPORTANT]
> Ceci est entièrement fictif ; les réponses sont générées par une IA.
> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer)

![Hedy Lamarr](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/08-mcp-advanced/assets/hedylamarr.jpeg)

**Étapes** :

1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript).
2. Naviguez vers */app* à la racine du dépôt.
3. Localisez la console et exécutez `npm install` suivi de `npm start`.
4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur".
5. Discuter avec Hedy.

Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates).

> [!NOTE]
> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code.

## Ajouter un modèle de langage à grande échelle à un client

**Coléoptère Temporel** : "Comme je le disais, parlons de la façon dont vous pouvez créer un client qui utilise un modèle de langage à grande échelle (LLM) pour interagir avec le serveur MCP. Les avantages sont qu’il offre une meilleure expérience utilisateur et vous permet d’utiliser le langage naturel pour interagir avec le serveur."

Voici comment cela fonctionnerait à un niveau élevé :

1. Le client interagit avec le serveur MCP pour demander les outils et ressources disponibles.

2. Au moment de l'invite, l'utilisateur rédige une invite en langage naturel, qui est ensuite envoyée au LLM dans le client.

3. Le client détermine quel outil ou quelle ressource appeler en fonction de l'invite et des outils et ressources disponibles.

Ça semble faisable, non ?

**Vous** : "Oui, c’est faisable ! Mais comment faire ?"

**Coléoptère Temporel** : "Améliorons le client que vous avez créé précédemment, décrivons les modifications de code par étapes :

1. Effectuer un appel au serveur pour demander les outils et ressources disponibles.
2. Convertir la réponse des outils et ressources en un schéma d’outils utilisable par le LLM.
3. Instancier le client OpenAI.
4. Effectuer un appel de complétion de chat à OpenAI, en passant le schéma d'outils en paramètre.
5. Déterminer quel outil appeler en fonction de la réponse d’OpenAI.
6. Appeler l'outil sur le serveur à l'aide du client MCP.
7. Répondre à l'utilisateur avec le résultat.

Voici toutes les étapes en code :

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";


// create client instance
const transport = new StdioClientTransport({
command: "node",
args: ["server.js"]
});

const client = new Client(
{
name: "example-client",
version: "1.0.0"
}
);

await client.connect(transport);

// 1. make call to server, ask it for tools
const { tools } = await client.listTools();

// convert function
function toToolSchema(method, schema) {
return {
name: method,
description: `This is a tool that does ${method}`,
parameters: schema,
};
}

// 2. convert the tools and resources response to a tools schema
const toolsForLLM = tools.map((tool) => {
return toToolSchema(tool.method, tool.inputSchema);
});

// 3. instantiate openai client
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
model: "gpt-3.5-turbo",
temperature: 0.7,
});

// 4. make chat completion call to openai
const response = await openai.chat.completions.create({
messages: [
{
role: "user",
content: `I want to add 5 and 10. Please use the tool ${toolsForLLM}`,
},
],
functions: toolsForLLM,
function_call: "auto",
});

// 5. figure out what tool to call based on the response from openai
const toolName = response.choices[0].message.function_call.name; // add
const args = response.choices[0].message.function_call.arguments; // { a: 5, b: 10 }

// 6. call the tool on the server
const result = await client.callTool({
name: toolName,
arguments: args,
});

// 7. respond to user
console.log(result); // 15
```

Dans le code précédent, nous avons (en nous concentrant sur nos ajouts) :

* Créé une fonction `toToolSchema` qui convertit la réponse des outils et ressources en un schéma utilisable par le LLM.
* Demandé au serveur les outils et ressources disponibles.
* Converti la réponse des outils et ressources en un schéma utilisable par le LLM.
* Effectué un appel de complétion au modèle d'IA, en passant les outils convertis en paramètre.
* Déterminé quel outil appeler en fonction de la réponse d’OpenAI.
* Appelé l'outil sur le serveur à l'aide du client MCP.
* Transmis le résultat à l'utilisateur.

**Vous** : "C’est intéressant, c’est bien mieux ! Je peux utiliser le langage naturel sans même savoir quels outils et ressources sont disponibles. Je peux simplement demander à l'IA de le faire pour moi."

**Coléoptère Temporel** : "Content que cela vous plaise. Cependant, il faudrait décider si vous souhaitez uniquement afficher une réponse par outil ou également une réponse générique du LLM. Voici une stratégie de réponse potentiellement bénéfique pour votre utilisateur :

* **Outils uniquement** : Si la réponse du LLM est un outil, alors appelez l'outil et renvoyez le résultat.
* **LLM uniquement** : Si la réponse du LLM n'est pas un outil, renvoyez simplement la réponse du LLM "telle quelle".
* **Outils et LLM** : Si la réponse du LLM est un outil, alors appelez l'outil et effectuez un appel supplémentaire au LLM pour obtenir une réponse générale. Renvoyez à la fois le résultat de l'outil et la réponse du LLM.

**Vous** : "Je vois. C’est à réfléchir. Mais c’est génial ! Je vois bien à quel point cela peut être utile."

## Devoir

**Ada Lovelace** : Il semble que vous avez apporté une belle amélioration. Pour rendre cela vraiment utile, j’ai besoin que vous créiez un serveur et un client avec les spécifications suivantes :

* Le serveur doit fournir les outils suivants :
* `characterDetails` avec l'argument `name`
* `place` avec l'argument `name`
* Le client doit utiliser un LLM.

> [!TIP]
> Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d'une API web externe, comme Wikipedia :\
> `https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}`

## Solution

[Solution](/lessons/08-mcp-advanced/solution/README.md)

## Vérification des connaissances

**Question :** Quel est un avantage d’ajouter un LLM au client ?

A. C'est plus facile à maintenir.

B. Cela crée une conversation plus naturelle entre l’utilisateur et le serveur.

C. Il est préférable d'avoir le LLM sur le serveur.

[Solution quiz](/lessons/08-mcp-advanced/solution/solution-quiz.md)

## Résumé

Dans ce chapitre, vous avez appris les points suivants :

* Les clients augmentés d'un LLM offrent une meilleure expérience utilisateur.
* Les réponses d’un serveur doivent être converties dans un format que le LLM peut comprendre comme un outil.

## Ressources d'auto-apprentissage

* [Construire des serveurs MCP](https://github.com/microsoft/mcp-for-beginners/tree/main/03-GettingStarted/01-first-server/README.md)
* [Construire un client](https://github.com/microsoft/mcp-for-beginners/tree/main/03-GettingStarted/02-client/README.md)
* [Construire un client avec un LLM](https://github.com/microsoft/mcp-for-beginners/blob/main/03-GettingStarted/03-llm-client/README.md)
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,8 @@
},
"devDependencies": {
"tsx": "^4.19.3"
},
"scripts": {
"genai:translate": "npx genaiscript@latest run translator \"./lessons/*/README.md\" --no-run-trace --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr -x \"filenameTemplate={{dirname}}/translations/{{basename}}.{{lang}}{{extname}}\""
}
}
Loading