{"id":1035,"date":"2025-04-06T21:14:40","date_gmt":"2025-04-06T21:14:40","guid":{"rendered":"https:\/\/oussamasaidi.com\/?p=1035"},"modified":"2025-12-20T11:14:43","modified_gmt":"2025-12-20T11:14:43","slug":"creer-un-chatbot-avec-deepseek-et-net-9-tutoriel-complet","status":"publish","type":"post","link":"https:\/\/oussamasaidi.com\/en\/creer-un-chatbot-avec-deepseek-et-net-9-tutoriel-complet\/","title":{"rendered":"Cr\u00e9er un Chatbot avec DeepSeek et .NET 9 : Tutoriel Complet"},"content":{"rendered":"<p><\/p>\n\n\n\n<p>Ce tutoriel vous guidera pas \u00e0 pas pour construire un chatbot utilisant l&rsquo;API de DeepSeek avec .NET 9. Nous allons cr\u00e9er une application web de chatbot avec ASP.NET Core.<\/p>\n\n\n<ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-prerequis\">Pr\u00e9requis<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-1-creer-une-nouvelle-application-web-asp-net-core\">\u00c9tape 1 : Cr\u00e9er une nouvelle application Web ASP.NET Core<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-2-ajouter-les-packages-necessaires\">\u00c9tape 2 : Ajouter les packages n\u00e9cessaires<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-3-creer-les-modeles-pour-lapi-deepseek\">\u00c9tape 3 : Cr\u00e9er les mod\u00e8les pour l&#039;API DeepSeek<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-4-creer-un-service-pour-lapi-deepseek\">\u00c9tape 4 : Cr\u00e9er un service pour l&#039;API DeepSeek<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-5-configurer-le-service-dans-program-cs\">\u00c9tape 5 : Configurer le service dans Program.cs<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-6-creer-une-page-de-chat\">\u00c9tape 6 : Cr\u00e9er une Page de Chat<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-7-ajouter-la-navigation-vers-la-page-de-chat\">\u00c9tape 7 : Ajouter la Navigation vers la Page de Chat<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-etape-8-lancer-lapplication\">\u00c9tape 8 : Lancer l&#039;Application<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-fonctionnalites-avancees-optionnelles\">Fonctionnalit\u00e9s Avanc\u00e9es (Optionnelles)<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-1-reponses-en-streaming\">1. R\u00e9ponses en Streaming<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-2-ajouter-signalr-pour-des-mises-a-jour-en-temps-reel\">2. Ajouter SignalR pour des Mises \u00e0 Jour en Temps R\u00e9el<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-3-ajouter-une-memoire-historique-de-chat\">3. Ajouter une M\u00e9moire\/Historique de Chat<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-deploiement\">D\u00e9ploiement<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-considerations-de-securite\">Consid\u00e9rations de S\u00e9curit\u00e9<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-conclusion\">Conclusion<\/a><\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-prerequis\">Pr\u00e9requis<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/9.0\" target=\"_blank\" rel=\"noreferrer noopener\">SDK .NET 9<\/a><\/li>\n\n\n\n<li>Visual Studio 2022 (ou VS Code)<\/li>\n\n\n\n<li>Cl\u00e9 API DeepSeek (inscrivez-vous sur le <a href=\"https:\/\/deepseek.com\" target=\"_blank\" rel=\"noreferrer noopener\">site de DeepSeek<\/a>)<\/li>\n\n\n\n<li>Connaissances de base en C# et ASP.NET Core<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-1-creer-une-nouvelle-application-web-asp-net-core\">\u00c9tape 1 : Cr\u00e9er une nouvelle application Web ASP.NET Core<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dotnet new webapp -n DeepSeekChatBot -f net9.0\ncd DeepSeekChatBot<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-2-ajouter-les-packages-necessaires\">\u00c9tape 2 : Ajouter les packages n\u00e9cessaires<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dotnet add package Microsoft.AspNetCore.Components.WebAssembly.Server\ndotnet add package System.Net.Http.Json\ndotnet add package Newtonsoft.Json<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-3-creer-les-modeles-pour-lapi-deepseek\">\u00c9tape 3 : Cr\u00e9er les mod\u00e8les pour l&rsquo;API DeepSeek<\/h2>\n\n\n\n<p>Cr\u00e9ez un dossier <code>Models<\/code> et ajoutez ces classes :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/Models\/ChatMessage.cs<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"454\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1024x454.png\" alt=\"AI Chatbot with .net core\" class=\"wp-image-1036\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1024x454.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-300x133.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-768x340.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-18x8.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-256x113.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-950x421.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image.png 1153w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Models\/ChatRequest.cs<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"766\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-1024x766.png\" alt=\"\" class=\"wp-image-1037\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-1024x766.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-300x224.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-768x575.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-16x12.png 16w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-256x192.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1-950x711.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-1.png 1148w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-4-creer-un-service-pour-lapi-deepseek\">\u00c9tape 4 : Cr\u00e9er un service pour l&rsquo;API DeepSeek<\/h2>\n\n\n\n<p>Cr\u00e9ez un dossier <code>Services<\/code> et ajoutez :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/Services\/DeepSeekService.cs<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"721\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-1024x721.png\" alt=\"\" class=\"wp-image-1040\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-1024x721.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-300x211.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-768x541.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-18x12.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-256x180.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2-950x669.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-2.png 1158w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted\"><br><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-5-configurer-le-service-dans-program-cs\">\u00c9tape 5 : Configurer le service dans Program.cs<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddHttpClient&amp;lt;DeepSeekService&amp;gt;();\nbuilder.Services.AddScoped&amp;lt;DeepSeekService&amp;gt;();\n\n\/\/ Ajoutez votre cl\u00e9 API dans appsettings.json\n\/\/ {\n\/\/   \"DeepSeek\": {\n\/\/     \"ApiKey\": \"votre-cl\u00e9-api-ici\"\n\/\/   }\n\/\/ }<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-6-creer-une-page-de-chat\">\u00c9tape 6 : Cr\u00e9er une Page de Chat<\/h2>\n\n\n\n<p>Cr\u00e9ez une nouvelle Razor Page dans le dossier <code>Pages<\/code> nomm\u00e9e <code>Chat.cshtml<\/code> et <code>Chat.cshtml.cs<\/code> :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/Pages\/Chat.cshtml.cs<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"844\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-1024x844.png\" alt=\"\" class=\"wp-image-1041\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-1024x844.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-300x247.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-768x633.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-15x12.png 15w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-256x211.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3-950x783.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-3.png 1361w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@page\n@model ChatModel\n\n&amp;lt;div class=\"container mt-5\"&amp;gt;\n    &amp;lt;div class=\"row\"&amp;gt;\n        &amp;lt;div class=\"col-md-8 offset-md-2\"&amp;gt;\n            &amp;lt;div class=\"card\"&amp;gt;\n                &amp;lt;div class=\"card-header bg-primary text-white\"&amp;gt;\n                    &amp;lt;h3&amp;gt;ChatBot DeepSeek&amp;lt;\/h3&amp;gt;\n                &amp;lt;\/div&amp;gt;\n                &amp;lt;div class=\"card-body chat-container\" style=\"height: 400px; overflow-y: auto;\"&amp;gt;\n                    @foreach (var message in Model.Messages)\n                    {\n                        &amp;lt;div class=\"@(message.Role == \"user\" ? \"text-end\" : \"text-start\") mb-3\"&amp;gt;\n                            &amp;lt;div class=\"@(message.Role == \"user\" ? \"bg-primary text-white\" : \"bg-light\") p-3 rounded\"&amp;gt;\n                                &amp;lt;strong&amp;gt;@(message.Role == \"user\" ? \"Vous\" : \"IA\"):&amp;lt;\/strong&amp;gt;\n                                &amp;lt;p class=\"mb-0\"&amp;gt;@message.Content&amp;lt;\/p&amp;gt;\n                            &amp;lt;\/div&amp;gt;\n                        &amp;lt;\/div&amp;gt;\n                    }\n                &amp;lt;\/div&amp;gt;\n                &amp;lt;div class=\"card-footer\"&amp;gt;\n                    &amp;lt;form method=\"post\"&amp;gt;\n                        &amp;lt;div class=\"input-group\"&amp;gt;\n                            &amp;lt;input type=\"text\" class=\"form-control\" asp-for=\"UserMessage\" placeholder=\"Tapez votre message...\"&amp;gt;\n                            &amp;lt;button type=\"submit\" class=\"btn btn-primary\"&amp;gt;Envoyer&amp;lt;\/button&amp;gt;\n                        &amp;lt;\/div&amp;gt;\n                    &amp;lt;\/form&amp;gt;\n                &amp;lt;\/div&amp;gt;\n            &amp;lt;\/div&amp;gt;\n        &amp;lt;\/div&amp;gt;\n    &amp;lt;\/div&amp;gt;\n&amp;lt;\/div&amp;gt;\n\n@section Scripts {\n    &amp;lt;script&amp;gt;\n        \/\/ D\u00e9filement automatique vers le bas du chat\n        document.addEventListener(\"DOMContentLoaded\", function() {\n            var chatContainer = document.querySelector('.chat-container');\n            chatContainer.scrollTop = chatContainer.scrollHeight;\n        });\n    &amp;lt;\/script&amp;gt;\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-7-ajouter-la-navigation-vers-la-page-de-chat\">\u00c9tape 7 : Ajouter la Navigation vers la Page de Chat<\/h2>\n\n\n\n<p>Ajoutez dans <code>Pages\/Shared\/_Layout.cshtml<\/code> dans la barre de navigation :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&amp;lt;li class=\"nav-item\"&amp;gt;\n    &amp;lt;a class=\"nav-link text-dark\" asp-page=\"\/Chat\"&amp;gt;Chat avec l'IA&amp;lt;\/a&amp;gt;\n&amp;lt;\/li&amp;gt;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-etape-8-lancer-lapplication\">\u00c9tape 8 : Lancer l&rsquo;Application<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bat\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dotnet run<\/pre>\n\n\n\n<p>Visitez <code>https:\/\/localhost:5001\/Chat<\/code> dans votre navigateur pour interagir avec le chatbot.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"jetpack-video-wrapper\"><iframe title=\"Build an AI Chatbot with DeepSeek &amp; .NET 9 (Complete Tutorial)\" width=\"900\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/F0ORjUb7pVA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-fonctionnalites-avancees-optionnelles\">Fonctionnalit\u00e9s Avanc\u00e9es (Optionnelles)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-1-reponses-en-streaming\">1. R\u00e9ponses en Streaming<\/h3>\n\n\n\n<p>Modifiez le <code>DeepSeekService<\/code> pour g\u00e9rer le streaming :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"671\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-1024x671.png\" alt=\"\" class=\"wp-image-1042\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-1024x671.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-300x197.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-768x503.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-18x12.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-256x168.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4-950x623.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/image-4.png 1384w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-2-ajouter-signalr-pour-des-mises-a-jour-en-temps-reel\">2. Ajouter SignalR pour des Mises \u00e0 Jour en Temps R\u00e9el<\/h3>\n\n\n\n<p>Ajoutez le package SignalR :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dotnet add package Microsoft.AspNetCore.SignalR.Client<\/pre>\n\n\n\n<p>Cr\u00e9ez un Hub :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Hubs\/ChatHub.cs\nusing Microsoft.AspNetCore.SignalR;\n\npublic class ChatHub : Hub\n{\n    public async Task SendMessage(string user, string message)\n    {\n        await Clients.All.SendAsync(\"ReceiveMessage\", user, message);\n    }\n}<\/pre>\n\n\n\n<p>Enregistrez dans Program.cs :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddSignalR();\n\napp.MapHub&amp;lt;ChatHub&amp;gt;(\"\/chatHub\");<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-3-ajouter-une-memoire-historique-de-chat\">3. Ajouter une M\u00e9moire\/Historique de Chat<\/h3>\n\n\n\n<p>Cr\u00e9ez un service pour g\u00e9rer l&rsquo;historique des conversations :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Services\/ChatHistoryService.cs\npublic class ChatHistoryService\n{\n    private readonly List&amp;lt;ChatMessage&amp;gt; _conversationHistory = new();\n    \n    public void AddMessage(ChatMessage message)\n    {\n        _conversationHistory.Add(message);\n    }\n    \n    public List&amp;lt;ChatMessage&amp;gt; GetConversationHistory()\n    {\n        return _conversationHistory;\n    }\n    \n    public void ClearHistory()\n    {\n        _conversationHistory.Clear();\n    }\n}<\/pre>\n\n\n\n<p>Enregistrez dans Program.cs :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddSingleton&amp;lt;ChatHistoryService&amp;gt;();<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-deploiement\">D\u00e9ploiement<\/h2>\n\n\n\n<p>Pour d\u00e9ployer votre chatbot :<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Publiez l&rsquo;application :<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dotnet publish -c Release -o .\/publish<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>D\u00e9ployez sur votre h\u00e9bergeur pr\u00e9f\u00e9r\u00e9 (Azure, AWS, etc.)<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-considerations-de-securite\">Consid\u00e9rations de S\u00e9curit\u00e9<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Ne jamais exposer votre cl\u00e9 API dans le code client<\/li>\n\n\n\n<li>Pensez \u00e0 ajouter une limitation de d\u00e9bit<\/li>\n\n\n\n<li>Impl\u00e9mentez une gestion d&rsquo;erreurs appropri\u00e9e<\/li>\n\n\n\n<li>Ajoutez une authentification utilisateur si n\u00e9cessaire<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\">Conclusion<\/h2>\n\n\n\n<p>Vous avez maintenant cr\u00e9\u00e9 un chatbot enti\u00e8rement fonctionnel utilisant l&rsquo;API de DeepSeek avec .NET 9. Cette impl\u00e9mentation comprend :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Des fonctionnalit\u00e9s de chat de base<\/li>\n\n\n\n<li>Une int\u00e9gration API appropri\u00e9e<\/li>\n\n\n\n<li>Un historique de conversation<\/li>\n\n\n\n<li>Une interface utilisateur simple<\/li>\n<\/ul>\n\n\n\n<p>Vous pouvez l&rsquo;\u00e9tendre en ajoutant :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une authentification utilisateur<\/li>\n\n\n\n<li>Une persistance des conversations<\/li>\n\n\n\n<li>Des fonctionnalit\u00e9s d&rsquo;interface plus avanc\u00e9es<\/li>\n\n\n\n<li>Une int\u00e9gration avec d&rsquo;autres services<\/li>\n<\/ul>\n\n\n\n<p><em>Vous avez des questions ou des suggestions ? Laissez un commentaire ci-dessous !<\/em> ????<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Code complet disponible sur <a href=\"https:\/\/github.com\/oussama-saidi\/OS.Tuto.DeepSeekChatBot\" target=\"_blank\" rel=\"noopener\" title=\"\">GitHub<\/a><\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>Ce tutoriel vous guidera pas \u00e0 pas pour construire un chatbot utilisant l&rsquo;API de DeepSeek avec .NET 9. Nous allons&#8230; <\/p>\n<div class=\"art-el-more\"><a href=\"https:\/\/oussamasaidi.com\/en\/creer-un-chatbot-avec-deepseek-et-net-9-tutoriel-complet\/\" class=\"art-link art-color-link art-w-chevron\">Read more<\/a><\/div>","protected":false},"author":1,"featured_media":1044,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[40,250,68,45,41,56,252],"tags":[47,48,49,54,53],"ppma_author":[286],"class_list":["post-1035","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-netcore","category-ai","category-api","category-asp-net","category-c","category-c-2","category-deepseek","tag-net-core","tag-asp-net","tag-c-sharp","tag-c","tag-dot-net-core"],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w4yx4rdp1ohuvcb96ypg.webp","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1714,"url":"https:\/\/oussamasaidi.com\/en\/https-oussamasaidi-com-restful-api-mastery-best-practices-with-asp-net-core-part-2\/","url_meta":{"origin":1035,"position":0},"title":"RESTful API best practices\u00a0with ASP.NET Core Part 2","author":"Saidi Oussama","date":"December 20, 2025","format":false,"excerpt":"Testing, Performance, Security, Microservices & Deployment Introduction: From Solid Foundations to Production Excellence In Part 1 of RESTful API Mastery, we established the architectural and technical foundations required to build reliable, evolvable RESTful APIs with ASP.NET Core. However, a well-designed API only becomes truly valuable when it is tested, observable,\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1325,"url":"https:\/\/oussamasaidi.com\/en\/building-professional-modern-api-documentation-in-net-core-with-scalar\/","url_meta":{"origin":1035,"position":1},"title":"Building Professional, Modern API Documentation in .NET Core with Scalar","author":"Saidi Oussama","date":"November 19, 2025","format":false,"excerpt":"Introduction In today\u2019s software ecosystem, APIs are everywhere. Whether you are building a mobile application, a microservices architecture, or an internal company platform, your API is often the backbone of the system. But even the best API becomes useless if developers cannot understand how to consume it. This is why\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"Building Professional, Modern API Documentation in .NET Core with Scalar","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/11\/Building-Professional-Modern-API-Documentation-in-.NET-Core-with-Scalar.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":927,"url":"https:\/\/oussamasaidi.com\/en\/announcing-dotnet-9-whats-new-key-features-you-need-to-know-part-2\/","url_meta":{"origin":1035,"position":2},"title":"Les Nouveaut\u00e9s de .NET 9 : Un Aper\u00e7u Complet [Partie 2]","author":"Saidi Oussama","date":"January 6, 2025","format":false,"excerpt":"Si les nouveaut\u00e9s pr\u00e9c\u00e9demment \u00e9voqu\u00e9es sont d\u00e9j\u00e0 impressionnantes, .NET 9 propose \u00e9galement d'autres fonctionnalit\u00e9s tout aussi importantes. Voici un aper\u00e7u des fonctionnalit\u00e9s suppl\u00e9mentaires : 1. Am\u00e9liorations dans les Minimal APIs2. Am\u00e9liorations de l'Interop\u00e9rabilit\u00e93. SignalR Optimis\u00e94. Prise en Charge du Framework MAUI5. Nouveaux Sc\u00e9narios pour les Tests Unitaires6. Gestion Optimis\u00e9e de\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/buildanything-dot-net9.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/buildanything-dot-net9.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/buildanything-dot-net9.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/buildanything-dot-net9.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/buildanything-dot-net9.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/buildanything-dot-net9.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1639,"url":"https:\/\/oussamasaidi.com\/en\/restful-api-mastery-best-practices-with-asp-net-core\/","url_meta":{"origin":1035,"position":3},"title":"RESTful API Best Practices with ASP.NET Core","author":"Saidi Oussama","date":"December 16, 2025","format":false,"excerpt":"Professional Best Practices, Versioning Strategies & Advanced Serialization (Part 1) In this blog Introduction: Building Enterprise-Grade RESTful APIs with ASP.NET Core1. RESTful APIs in the Modern ASP.NET Core EcosystemWhy REST Still Dominates2. REST Architectural Constraints Every ASP.NET Core API Must EnforceClient\u2013Server SeparationStatelessnessUniform Interface3. Establishing a Clean and Scalable ASP.NET Core\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":931,"url":"https:\/\/oussamasaidi.com\/en\/net-9-entity-framework-core-what-is-new\/","url_meta":{"origin":1035,"position":4},"title":"Les Nouveaut\u00e9s d&rsquo;Entity Framework Core avec .NET 9 : Ce Qu&rsquo;il Faut Savoir","author":"Saidi Oussama","date":"January 6, 2025","format":false,"excerpt":"La sortie de .NET 9 s\u2019accompagne de mises \u00e0 jour significatives dans Entity Framework Core (EF Core), le c\u00e9l\u00e8bre ORM de Microsoft. Ces nouveaut\u00e9s visent \u00e0 simplifier les sc\u00e9narios complexes et \u00e0 am\u00e9liorer les performances, la compatibilit\u00e9 cloud et l\u2019int\u00e9gration IA. Voici les cinq principales nouveaut\u00e9s qui transformeront vos projets.\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":838,"url":"https:\/\/oussamasaidi.com\/en\/comment-implementer-authentification-cle-api-aspnet-core\/","url_meta":{"origin":1035,"position":5},"title":".NET Core : impl\u00e9menter l\u2019authentification par cl\u00e9 API en C#","author":"Saidi Oussama","date":"August 22, 2024","format":false,"excerpt":"ContexteCr\u00e9ation de l'attribut de cl\u00e9 APIImpl\u00e9menter du filtre d'autorisation ApiKeyimpl\u00e9mentation de l'ApiKeyValidatorTester l'APIUtilisez le middlewareConclusionDerniers Articles Vous pouvez trouver le code source complet sur github Contexte Alors, qu\u2019est-ce que l\u2019authentification par cl\u00e9 API dans ASP.NET Core ? Prenons un exemple concret. Imaginez que vous ayez d\u00e9velopp\u00e9 un tableau de bord\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"authors":[{"term_id":286,"user_id":1,"is_guest":0,"slug":"oussama_sa","display_name":"Saidi Oussama","avatar_url":{"url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg","url2x":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg"},"author_category":"1","first_name":"Oussama","last_name":"SAIDI","user_url":"https:\/\/oussamasaidi.com","job_title":"Senior Fullstack .NET Developer","description":"I\u2019m a Senior Fullstack .NET Developer specializing in building scalable, high-performance web applications with .NET, C#, and modern frontend frameworks like React.js. I\u2019m passionate about clean architecture, automated testing, and sharing knowledge through blogs and tutorials."}],"_links":{"self":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/1035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/comments?post=1035"}],"version-history":[{"count":9,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/1035\/revisions"}],"predecessor-version":[{"id":1515,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/1035\/revisions\/1515"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media\/1044"}],"wp:attachment":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media?parent=1035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/categories?post=1035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/tags?post=1035"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/ppma_author?post=1035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}