Aller au contenu principal
Nicolas Cousin Tech SolutionsNicolas Cousin Tech Solutions
Intermédiaire3 h 30

Durée indicative — parcours en autoformation, à votre rythme.

C# vers F# : construire un agent IA sans passer par Python

Suite directe de « C# vers F# : les fondamentaux du langage », ce palier suppose que dotnet fsi, let, le pipe, le pattern matching et les records vous sont familiers ; au besoin, relisez-y les modules « Pipe et composition », « Pattern matching » et « Records ». Vous apprenez les unions discriminées, Option et Result en construisant un agent IA : un assistant e-commerce qui répond à « où en est ma commande ? ». Aucune clé d'API payante, aucune ligne de Python. Prérequis : le SDK .NET 10 ; pour les modules 2, 5 et 7, Ollama et le modèle qwen3.5:4b (environ 3,4 Go, jusqu'à 4 Go sur Mac), dont l'installation est guidée au module 2. Six modules (1, 3, 4, 6, 9, 10) se font sans Ollama ; le module 8 demande seulement qu'Ollama soit démarré pour un de ses scénarios ; les modules 2, 5 et 7 ont besoin du modèle. La durée est indicative : elle reflète surtout les réponses d'Ollama sur processeur seul et varie d'une machine à l'autre (téléchargement du modèle non compris).

Modules

  1. 1Pourquoi Python ?Entraîner un modèle n'est pas construire un agent : ce qui fait réellement le travail d'un agent IA, et pourquoi c'est un travail de développeur .NET.
  2. 2Premier appel à un LLM depuis un script .fsxInstaller un modèle local avec Ollama, puis l'interroger depuis un script F# via l'abstraction IChatClient de Microsoft.Extensions.AI — sans projet, sans clé d'API.
  3. 3Unions discriminées : modéliser le statut d'une commandeDécrire une valeur qui a plusieurs formes, chacune avec ses propres données, et laisser le compilateur vérifier que chaque forme est traitée.
  4. 4Option : une commande qui n'existe pasReprésenter une absence possible dans le type, sans null, et écrire getOrder, la fonction que le modèle appellera.
  5. 5Donner un outil au modèleDéclarer getOrder comme outil, lire la demande d'appel du modèle avec les types de Microsoft.Extensions.AI, exécuter l'outil et renvoyer son résultat — un aller-retour fait à la main.
  6. 6Result : une frontière contre les réponses du modèleTransformer une demande d'outil non fiable en valeur typée ou en erreur nommée, en enchaînant des étapes avec Result.bind et Result.map.
  7. 7La boucle d'agentAssembler modèle, outil et frontière dans une boucle bornée dont chaque tour est une union discriminée que votre code traite cas par cas.
  8. 8Garde-fous : quand le modèle (ou le réseau) dérailleFaire de chaque panne un cas typé et reproductible — outil interdit, argument invalide, boucle sans fin, serveur arrêté, délai dépassé — puis nommer ce que les types ne protègent pas.
  9. 9Exposer l'outil via un serveur MCPRendre getOrder utilisable par n'importe quel client MCP avec le SDK C# officiel, depuis un script F#, et comprendre ce que le protocole standardise.
  10. 10Synthèse : choisir le bon type, changer de modèleRécapituler où l'union discriminée, Option et Result ont servi, savoir les choisir sur des situations nouvelles, et vérifier que changer de modèle ne touche qu'un fichier.