From 11dbfd9f52a474de3c1fee6266a4b34862728acc Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:37:44 +0530 Subject: [PATCH 01/74] 984607: Added UG content for AI AssistView integration with STT and TTS in Core and MVC. --- .../EJ2_ASP.MVC/speech/speech-to-text.md | 42 +++++++++++++++++++ .../EJ2_ASP.MVC/speech/text-to-speech.md | 42 +++++++++++++++++++ .../EJ2_ASP.NETCORE/speech/speech-to-text.md | 42 +++++++++++++++++++ .../EJ2_ASP.NETCORE/speech/text-to-speech.md | 42 +++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md create mode 100644 ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md create mode 100644 ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md create mode 100644 ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md new file mode 100644 index 0000000000..7aaee82cd9 --- /dev/null +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md @@ -0,0 +1,42 @@ +--- +layout: post +title: Speech-to-Text With ##Platform_Name## AI AssistView Control | Syncfusion +description: Checkout and learn about configuration of Speech-to-Text with Azure OpenAI in ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Azure Open AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Speech-to-Text in ASP.NET MVC AI AssistView + +The Syncfusion ASP.NET MVC AI AssistView control supports `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API), enabling conversion of spoken words into text using the device's microphone. + +## Prerequisites + +Before integrating `Speech-to-Text`, ensure the following: + +1. The Syncfusion AI AssistView control is properly set up in your ASP.NET MVC application. + - [ASP.NET MVC Getting Started Guide](../getting-started) + +2. The AI AssistView control is integrated with [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai). + - [Integration of Azure OpenAI With ASP.NET MVC AI AssistView control](../ai-integrations/openai-integration) + +## Configure Speech-to-Text + +To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorporate the Web Speech API. The [SpeechToText](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/getting-started) control listens for microphone input, transcribes spoken words, and updates the AI AssistView's editable footer with the transcribed text. The transcribed text is then sent as a prompt to the Azure OpenAI service via the AI AssistView control. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/ai-assistview/speech/stt/razor %} +{% endhighlight %} +{% highlight c# tabtitle="SpeechToText.cs" %} +{% include code-snippet/ai-assistview/speech/stt/speechtotextmvc.cs %} +{% endhighlight %} +{% endtabs %} + +![Integrating Speech-to-Text with AI AssistView](../images/assist-stt.png) + +## See Also + +* [Text-to-Speech](./text-to-speech) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md new file mode 100644 index 0000000000..a39af05f3d --- /dev/null +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md @@ -0,0 +1,42 @@ +--- +layout: post +title: Text-to-Speech With ##Platform_Name## AI AssistView Control | Syncfusion +description: Checkout and learn about configuration of Text-to-Speech with Azure OpenAI in ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Azure Open AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Text-to-Speech in ASP.NET MVC AI AssistView + +The Syncfusion TypeScript AI AssistView component supports `Text-to-Speech` (TTS) functionality using the browser's Web Speech API specifically using the [SpeechSynthesisUtterance](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance) interface to convert AI-generated response into spoken audio. + +## Prerequisites + +Before integrating `Text-to-Speech`, ensure the following: + +1. The Syncfusion AI AssistView control is properly set up in your ASP.NET MVC application. + - [ASP.NET MVC Getting Started Guide](../getting-started) + +2. The AI AssistView control is integrated with [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai). + - [Integration of Azure OpenAI With ASP.NET MVC AI AssistView control](../ai-integrations/openai-integration) + +## Configure Text-to-Speech + +To enable Text-to-Speech functionality, modify the `Index.cshtml` file to incorporate the Web Speech API. A custom `Read Aloud` button is added to the response toolbar using the [ResponseToolbarSettings](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.InteractiveChat.AIAssistViewResponseToolbarSettings.html) property. When clicked, the [ItemClicked](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.InteractiveChat.AIAssistViewResponseToolbarSettings.html#Syncfusion_EJ2_InteractiveChat_AIAssistViewResponseToolbarSettings_ItemClicked) event extracts plain text from the generated AI response and use the browser SpeechSynthesis API to read it aloud. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/ai-assistview/speech/tts/razor %} +{% endhighlight %} +{% highlight c# tabtitle="SpeechToText.cs" %} +{% include code-snippet/ai-assistview/speech/tts/texttospeechmvc.cs %} +{% endhighlight %} +{% endtabs %} + +![Integrating Text-to-Speech with AI AssistView](../images/assist-tts.png) + +## See Also + +* [Speech-to-Text](./speech-to-text) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md new file mode 100644 index 0000000000..7095814607 --- /dev/null +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md @@ -0,0 +1,42 @@ +--- +layout: post +title: Speech-to-Text With ##Platform_Name## AI AssistView Control | Syncfusion +description: Checkout and learn about configuration of Speech-to-Text with Azure OpenAI in ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Azure Open AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Speech-to-Text in ASP.NET Core AI AssistView + +The Syncfusion ASP.NET Core AI AssistView control supports `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API), enabling conversion of spoken words into text using the device's microphone. + +## Prerequisites + +Before integrating `Speech-to-Text`, ensure the following: + +1. The Syncfusion AI AssistView control is properly set up in your ASP.NET Core application. + - [ASP.NET Core Getting Started Guide](../getting-started) + +2. The AI AssistView control is integrated with [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai). + - [Integration of Azure OpenAI With ASP.NET Core AI AssistView control](../ai-integrations/openai-integration) + +## Configure Speech-to-Text + +To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorporate the Web Speech API. The [SpeechToText](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/getting-started) control listens for microphone input, transcribes spoken words, and updates the AI AssistView's editable footer with the transcribed text. The transcribed text is then sent as a prompt to the Azure OpenAI service via the AI AssistView control. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/ai-assistview/speech/stt/tagHelper %} +{% endhighlight %} +{% highlight c# tabtitle="Gemini.cs" %} +{% include code-snippet/ai-assistview/speech/stt/speechtotextcore.cs %} +{% endhighlight %} +{% endtabs %} + +![Integrating Speech-to-Text with AI AssistView](../images/assist-stt.png) + +## See Also + +* [Text-to-Speech](./text-to-speech) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md new file mode 100644 index 0000000000..18e447ee1a --- /dev/null +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md @@ -0,0 +1,42 @@ +--- +layout: post +title: Text-to-Speech With ##Platform_Name## AI AssistView Control | Syncfusion +description: Checkout and learn about configuration of Text-to-Speech with Azure OpenAI in ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Azure Open AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Text-to-Speech in ASP.NET Core AI AssistView + +The Syncfusion TypeScript AI AssistView component supports `Text-to-Speech` (TTS) functionality using the browser's Web Speech API specifically using the [SpeechSynthesisUtterance](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance) interface to convert AI-generated response into spoken audio. + +## Prerequisites + +Before integrating `Text-to-Speech`, ensure the following: + +1. The Syncfusion AI AssistView control is properly set up in your ASP.NET Core application. + - [ASP.NET Core Getting Started Guide](../getting-started) + +2. The AI AssistView control is integrated with [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai). + - [Integration of Azure OpenAI With ASP.NET Core AI AssistView control](../ai-integrations/openai-integration) + +## Configure Text-to-Speech + +To enable Text-to-Speech functionality, modify the `Index.cshtml` file to incorporate the Web Speech API. A custom `Read Aloud` button is added to the response toolbar using the `e-aiassistview-responsetoolbarsettings` tag helper. When clicked, the [itemClicked](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.InteractiveChat.AIAssistViewResponseToolbarSettings.html#Syncfusion_EJ2_InteractiveChat_AIAssistViewResponseToolbarSettings_ItemClicked) event extracts plain text from the generated AI response and use the browser SpeechSynthesis API to read it aloud. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/ai-assistview/speech/tts/tagHelper %} +{% endhighlight %} +{% highlight c# tabtitle="Gemini.cs" %} +{% include code-snippet/ai-assistview/speech/tts/texttospeechcore.cs %} +{% endhighlight %} +{% endtabs %} + +![Integrating Text-to-Speech with AI AssistView](../images/assist-tts.png) + +## See Also + +* [Speech-to-Text](./speech-to-text) From c4c56be26eabfe2c189065ea45d6eb2d58d1c0cf Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Thu, 9 Oct 2025 17:19:47 +0530 Subject: [PATCH 02/74] 986172: removed word integration with from toc file --- ej2-asp-core-toc.html | 4 ++-- ej2-asp-mvc-toc.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 87906aa233..65f1e7cc33 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -576,10 +576,10 @@
  • Chat Bot Integrations
  • diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index 631debb537..baeab7e66e 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -579,10 +579,10 @@
  • Chat Bot Integrations
  • From 79c57409d1a22e8b8e991f3c1e154a9d42856af1 Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:14:57 +0530 Subject: [PATCH 03/74] 984607: Added UG content and code snippet for AI AssistView integration with STT and TTS. --- .../EJ2_ASP.MVC/speech/speech-to-text.md | 2 +- .../EJ2_ASP.MVC/speech/text-to-speech.md | 2 +- .../EJ2_ASP.NETCORE/speech/speech-to-text.md | 2 +- .../EJ2_ASP.NETCORE/speech/text-to-speech.md | 2 +- .../ai-assistview/images/aiassist-stt.png | Bin 0 -> 15195 bytes .../ai-assistview/images/aiassist-tts.png | Bin 0 -> 24454 bytes .../ai-assistview/speech/stt/razor | 252 ++++++++++++++++++ .../speech/stt/speechtotextcore.cs | 84 ++++++ .../speech/stt/speechtotextmvc.cs | 69 +++++ .../ai-assistview/speech/stt/tagHelper | 249 +++++++++++++++++ .../ai-assistview/speech/tts/razor | 154 +++++++++++ .../ai-assistview/speech/tts/tagHelper | 150 +++++++++++ .../speech/tts/texttospeechcore.cs | 89 +++++++ .../speech/tts/texttospeechmvc.cs | 79 ++++++ 14 files changed, 1130 insertions(+), 4 deletions(-) create mode 100644 ej2-asp-core-mvc/ai-assistview/images/aiassist-stt.png create mode 100644 ej2-asp-core-mvc/ai-assistview/images/aiassist-tts.png create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/razor create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextcore.cs create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextmvc.cs create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/tagHelper create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechcore.cs create mode 100644 ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechmvc.cs diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md index 7aaee82cd9..4de77f98ca 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md @@ -35,7 +35,7 @@ To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorp {% endhighlight %} {% endtabs %} -![Integrating Speech-to-Text with AI AssistView](../images/assist-stt.png) +![Integrating Speech-to-Text with AI AssistView](images/aiassist-stt.png) ## See Also diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md index a39af05f3d..394cb71033 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md @@ -35,7 +35,7 @@ To enable Text-to-Speech functionality, modify the `Index.cshtml` file to incorp {% endhighlight %} {% endtabs %} -![Integrating Text-to-Speech with AI AssistView](../images/assist-tts.png) +![Integrating Text-to-Speech with AI AssistView](images/aiassist-tts.png) ## See Also diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md index 7095814607..0cc91748f4 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md @@ -35,7 +35,7 @@ To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorp {% endhighlight %} {% endtabs %} -![Integrating Speech-to-Text with AI AssistView](../images/assist-stt.png) +![Integrating Speech-to-Text with AI AssistView](images/aiassist-stt.png) ## See Also diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md index 18e447ee1a..a5d6cd4c8a 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md @@ -35,7 +35,7 @@ To enable Text-to-Speech functionality, modify the `Index.cshtml` file to incorp {% endhighlight %} {% endtabs %} -![Integrating Text-to-Speech with AI AssistView](../images/assist-tts.png) +![Integrating Text-to-Speech with AI AssistView](images/aiassist-tts.png) ## See Also diff --git a/ej2-asp-core-mvc/ai-assistview/images/aiassist-stt.png b/ej2-asp-core-mvc/ai-assistview/images/aiassist-stt.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc4fef3119ff5a0bd20d13028f0304375c7abc4 GIT binary patch literal 15195 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 O$o!(!1>$*+n129kx0cNS literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/razor b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/razor new file mode 100644 index 0000000000..55d99d58ea --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/razor @@ -0,0 +1,252 @@ +@using Syncfusion.EJ2.InteractiveChat + +
    + @Html.EJS().AIAssistView("aiAssistView").BannerTemplate("#bannerContent").FooterTemplate("#footerContent").StopRespondingClick("stopRespondingClick").PromptRequest("onPromptRequest").Created("onCreated").ToolbarSettings(new AIAssistViewToolbarSettings() + { + Items = ViewBag.Items, + ItemClicked = "toolbarItemClicked" + }).PromptToolbarSettings(new AIAssistViewPromptToolbarSettings() + { + ItemClicked = "promptToolbarItemClicked" + }).Render() +
    + + +@Html.AntiForgeryToken() + + + + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextcore.cs b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextcore.cs new file mode 100644 index 0000000000..59d9422bbd --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextcore.cs @@ -0,0 +1,84 @@ +using Azure; +using Azure.AI.OpenAI; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using OpenAI.Chat; + +namespace WebApplication.Pages +{ + public class IndexModel : PageModel + { + + public IndexViewModel ViewModel { get; set; } = new IndexViewModel(); + public void OnGet() + { + // Initialize toolbar items + ViewModel.Items = new List + { + new ToolbarItemModel + { + iconCss = "e-icons e-refresh", + align = "Right", + } + }; + } + + public async Task OnPostGetAIResponse([FromBody] PromptRequest request) + { + try + { + _logger.LogInformation("Received request with prompt: {Prompt}", request?.Prompt); + + if (string.IsNullOrEmpty(request?.Prompt)) + { + _logger.LogWarning("Prompt is null or empty."); + return BadRequest("Prompt cannot be empty."); + } + + string endpoint = "Your_Azure_OpenAI_Endpoint"; // Replace with your Azure OpenAI endpoint + string apiKey = "YOUR_AZURE_OPENAI_API_KEY"; // Replace with your Azure OpenAI API key + string deploymentName = "YOUR_DEPLOYMENT_NAME"; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + + var credential = new AzureKeyCredential(apiKey); + var client = new AzureOpenAIClient(new Uri(endpoint), credential); + var chatClient = client.GetChatClient(deploymentName); + + var chatCompletionOptions = new ChatCompletionOptions(); + var completion = await chatClient.CompleteChatAsync( + new[] { new UserChatMessage(request.Prompt) }, + chatCompletionOptions + ); + string responseText = completion.Value.Content[0].Text; + if (string.IsNullOrEmpty(responseText)) + { + _logger.LogError("Azure OpenAI API returned no text."); + return BadRequest("No response from Azure OpenAI."); + } + + _logger.LogInformation("Azure OpenAI response received: {Response}", responseText); + return new JsonResult(responseText); + } + catch (Exception ex) + { + _logger.LogError("Exception in Azure OpenAI call: {Message}", ex.Message); + return BadRequest($"Error generating response: {ex.Message}"); + } + } + } + + public class IndexViewModel + { + public List Items { get; set; } = new List(); + } + + public class PromptRequest + { + public string Prompt { get; set; } + } + + public class ToolbarItemModel + { + public string align { get; set; } + public string iconCss { get; set; } + } +} diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextmvc.cs b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextmvc.cs new file mode 100644 index 0000000000..d7372ee5ad --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/speechtotextmvc.cs @@ -0,0 +1,69 @@ +using OpenAI; +using OpenAI.Chat; +using Azure; +using Azure.AI.OpenAI; + +namespace AssistViewDemo.Controllers +{ + public class HomeController : Controller + { + + public List Items { get; set; } = new List(); + + public IActionResult Index() + { + Items.Add(new ToolbarItemModel { iconCss = "e-icons e-refresh", align = "Right" }); + ViewBag.Items = Items; + return View(); + } + public class ToolbarItemModel + { + public string iconCss { get; set; } + public string align { get; set; } + } + [HttpPost] + public async Task GetAIResponse([FromBody] PromptRequest request) + { + try + { + _logger.LogInformation("Received request with prompt: {Prompt}", request?.Prompt); + + if (string.IsNullOrEmpty(request?.Prompt)) + { + _logger.LogWarning("Prompt is null or empty."); + return BadRequest("Prompt cannot be empty."); + } + + // Azure OpenAI configuration + string endpoint = "Your_Azure_OpenAI_Endpoint"; // Replace with your Azure OpenAI endpoint + string apiKey = "YOUR_AZURE_OPENAI_API_KEY"; // Replace with your Azure OpenAI API key + string deploymentName = "YOUR_DEPLOYMENT_NAME"; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + + var credential = new AzureKeyCredential(apiKey); + var client = new AzureOpenAIClient(new Uri(endpoint), credential); + var chatClient = client.GetChatClient(deploymentName); + + var chatCompletionOptions = new ChatCompletionOptions(); + var completion = await chatClient.CompleteChatAsync( + new[] { new UserChatMessage(request.Prompt) }, + chatCompletionOptions + ); + + string responseText = completion.Value.Content[0].Text; + if (string.IsNullOrEmpty(responseText)) + { + _logger.LogError("Azure OpenAI API returned no text."); + return BadRequest("No response from Azure OpenAI."); + } + + _logger.LogInformation("Azure OpenAI response received: {Response}", responseText); + return Json(responseText); + } + catch (Exception ex) + { + _logger.LogError("Exception in Azure OpenAI call: {Message}", ex.Message); + return BadRequest($"Error generating response: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/tagHelper b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/tagHelper new file mode 100644 index 0000000000..4640eb84bf --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/stt/tagHelper @@ -0,0 +1,249 @@ +@model IndexModel +@using Syncfusion.EJ2.InteractiveChat + +
    + + + + +
    + + + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor new file mode 100644 index 0000000000..dd184a6dc8 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor @@ -0,0 +1,154 @@ +@using Syncfusion.EJ2.InteractiveChat + +
    + @Html.EJS().AIAssistView("aiAssistView").BannerTemplate("#bannerContent").StopRespondingClick("stopRespondingClick").PromptRequest("onPromptRequest").Created("onCreated").ToolbarSettings(new AIAssistViewToolbarSettings() + { + Items = ViewBag.Items, + ItemClicked = "toolbarItemClicked" + }).ResponseToolbarSettings(new AIAssistViewResponseToolbarSettings() + { + Items = ViewBag.ResponseItems, + ItemClicked = "onResponseToolbarItemClicked" + }).Render() +
    + + +@Html.AntiForgeryToken() + + + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper new file mode 100644 index 0000000000..fdfd26e68e --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper @@ -0,0 +1,150 @@ +@model IndexModel +@using Syncfusion.EJ2.InteractiveChat + +
    + + + + +
    + + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechcore.cs b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechcore.cs new file mode 100644 index 0000000000..2c1d75f7d9 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechcore.cs @@ -0,0 +1,89 @@ +using Azure; +using Azure.AI.OpenAI; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using OpenAI.Chat; + +namespace WebApplication.Pages +{ + public class IndexModel : PageModel + { + + public IndexViewModel ViewModel { get; set; } = new IndexViewModel(); + public void OnGet() + { + ViewModel.Items = new List + { + new ToolbarItemModel { iconCss = "e-icons e-refresh", align = "Right" } + }; + + ViewModel.ResponseItems = new List + { + new ToolbarItemModel { iconCss = "e-icons e-assist-copy", tooltip = "Copy" }, + new ToolbarItemModel { iconCss = "e-icons e-audio", tooltip = "Read Aloud" }, + new ToolbarItemModel { iconCss = "e-icons e-assist-like", tooltip = "Like" }, + new ToolbarItemModel { iconCss = "e-icons e-assist-dislike", tooltip = "Need Improvement" } + }; + } + + public async Task OnPostGetAIResponse([FromBody] PromptRequest request) + { + try + { + _logger.LogInformation("Received request with prompt: {Prompt}", request?.Prompt); + + if (string.IsNullOrEmpty(request?.Prompt)) + { + _logger.LogWarning("Prompt is null or empty."); + return BadRequest("Prompt cannot be empty."); + } + + string endpoint = "Your_Azure_OpenAI_Endpoint"; // Replace with your Azure OpenAI endpoint + string apiKey = "YOUR_AZURE_OPENAI_API_KEY"; // Replace with your Azure OpenAI API key + string deploymentName = "YOUR_DEPLOYMENT_NAME"; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + + var credential = new AzureKeyCredential(apiKey); + var client = new AzureOpenAIClient(new Uri(endpoint), credential); + var chatClient = client.GetChatClient(deploymentName); + + var chatCompletionOptions = new ChatCompletionOptions(); + var completion = await chatClient.CompleteChatAsync( + new[] { new UserChatMessage(request.Prompt) }, + chatCompletionOptions + ); + string responseText = completion.Value.Content[0].Text; + if (string.IsNullOrEmpty(responseText)) + { + _logger.LogError("Azure OpenAI API returned no text."); + return BadRequest("No response from Azure OpenAI."); + } + + _logger.LogInformation("Azure OpenAI response received: {Response}", responseText); + return new JsonResult(responseText); + } + catch (Exception ex) + { + _logger.LogError("Exception in Azure OpenAI call: {Message}", ex.Message); + return BadRequest($"Error generating response: {ex.Message}"); + } + } + } + + public class IndexViewModel + { + public List Items { get; set; } = new List(); + public List ResponseItems { get; set; } = new List(); + } + + public class PromptRequest + { + public string Prompt { get; set; } + } + + public class ToolbarItemModel + { + public string align { get; set; } + public string iconCss { get; set; } + public string tooltip { get; set; } + } +} diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechmvc.cs b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechmvc.cs new file mode 100644 index 0000000000..fda7540088 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/texttospeechmvc.cs @@ -0,0 +1,79 @@ +using OpenAI; +using OpenAI.Chat; +using Azure; +using Azure.AI.OpenAI; + +namespace AssistViewDemo.Controllers +{ + public class HomeController : Controller + { + + public List Items { get; set; } = new List(); + public List ResponseItems { get; set; } = new List(); + + public IActionResult Index() + { + Items.Add(new ToolbarItemModel { iconCss = "e-icons e-refresh", align = "Right" }); + ResponseItems = new List + { + new ToolbarItemModel { iconCss = "e-icons e-assist-copy", tooltip = "Copy" }, + new ToolbarItemModel { iconCss = "e-icons e-audio", tooltip = "Read Aloud" }, + new ToolbarItemModel { iconCss = "e-icons e-assist-like", tooltip = "Like" }, + new ToolbarItemModel { iconCss = "e-icons e-assist-dislike", tooltip = "Need Improvement" } + }; + ViewBag.Items = Items; + ViewBag.ResponseItems = ResponseItems; + return View(); + } + public class ToolbarItemModel + { + public string iconCss { get; set; } + public string align { get; set; } + public string tooltip { get; set; } + } + [HttpPost] + public async Task GetAIResponse([FromBody] PromptRequest request) + { + try + { + _logger.LogInformation("Received request with prompt: {Prompt}", request?.Prompt); + + if (string.IsNullOrEmpty(request?.Prompt)) + { + _logger.LogWarning("Prompt is null or empty."); + return BadRequest("Prompt cannot be empty."); + } + + // Azure OpenAI configuration + string endpoint = "Your_Azure_OpenAI_Endpoint"; // Replace with your Azure OpenAI endpoint + string apiKey = "YOUR_AZURE_OPENAI_API_KEY"; // Replace with your Azure OpenAI API key + string deploymentName = "YOUR_DEPLOYMENT_NAME"; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + + var credential = new AzureKeyCredential(apiKey); + var client = new AzureOpenAIClient(new Uri(endpoint), credential); + var chatClient = client.GetChatClient(deploymentName); + + var chatCompletionOptions = new ChatCompletionOptions(); + var completion = await chatClient.CompleteChatAsync( + new[] { new UserChatMessage(request.Prompt) }, + chatCompletionOptions + ); + + string responseText = completion.Value.Content[0].Text; + if (string.IsNullOrEmpty(responseText)) + { + _logger.LogError("Azure OpenAI API returned no text."); + return BadRequest("No response from Azure OpenAI."); + } + + _logger.LogInformation("Azure OpenAI response received: {Response}", responseText); + return Json(responseText); + } + catch (Exception ex) + { + _logger.LogError("Exception in Azure OpenAI call: {Message}", ex.Message); + return BadRequest($"Error generating response: {ex.Message}"); + } + } + } +} \ No newline at end of file From 9b6234f922b2d7787f9db29aa75bf2d2a70d9b8a Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Mon, 13 Oct 2025 08:56:19 +0530 Subject: [PATCH 04/74] 984607: Added UG content and code snippet for AI AssistView integration with STT and TTS. --- .../ai-integrations/open-ai/openaicore.cs | 34 ++++++++++--------- .../ai-integrations/open-ai/tagHelper | 1 + ej2-asp-core-toc.html | 10 ++++++ ej2-asp-mvc-toc.html | 10 ++++++ 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaicore.cs b/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaicore.cs index 5bc65aba86..843b0dd7b6 100644 --- a/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaicore.cs +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaicore.cs @@ -1,6 +1,8 @@ -using OpenAI; using Azure; using Azure.AI.OpenAI; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using OpenAI.Chat; namespace WebApplication4.Pages { public class IndexModel : PageModel @@ -68,22 +70,22 @@ public async Task OnPostGetAIResponse([FromBody] PromptRequest re return BadRequest($"Error generating response: {ex.Message}"); } } - } + } - public class IndexViewModel - { - public List Items { get; set; } = new List(); - public string[] PromptSuggestionData { get; set; } - } + public class IndexViewModel + { + public List Items { get; set; } = new List(); + public string[] PromptSuggestionData { get; set; } + } - public class PromptRequest - { - public string Prompt { get; set; } - } + public class PromptRequest + { + public string Prompt { get; set; } + } - public class ToolbarItemModel - { - public string align { get; set; } - public string iconCss { get; set; } - } + public class ToolbarItemModel + { + public string align { get; set; } + public string iconCss { get; set; } } +} diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/tagHelper b/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/tagHelper index 103c1b2da7..a7872fe9c6 100644 --- a/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/tagHelper +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/tagHelper @@ -1,3 +1,4 @@ +@model IndexModel @using Syncfusion.EJ2.InteractiveChat @{ ViewData["Title"] = "AI Assistance with Gemini"; diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 87906aa233..ffbadf2e44 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -217,6 +217,16 @@
  • Custom views
  • File attachments
  • Templates
  • +
  • Speech + +
  • Appearance
  • Accessibility
  • Methods
  • diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index 631debb537..a5a150daec 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -171,6 +171,16 @@
  • Custom views
  • File attachments
  • Templates
  • +
  • Speech + +
  • Appearance
  • Accessibility
  • Methods
  • From 78edfd52740fe4d53dfd62e47b21f3587b87b088 Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:17:55 +0530 Subject: [PATCH 05/74] 986172: Updated review concerns for AI integrations in core and mvc. --- .../ai-integrations/gemini-integration.md | 85 +++++++++---------- .../ai-integrations/ollama-llm-integration.md | 44 ++++------ .../ai-integrations/openai-integration.md | 75 ++++++++-------- .../ai-integrations/gemini-integration.md | 82 ++++++++---------- .../ai-integrations/ollama-llm-integration.md | 42 ++++----- .../ai-integrations/openai-integration.md | 81 +++++++++--------- .../integration-with-bot-framework.md | 31 +++---- .../integration-with-dialogflow.md | 36 ++++---- .../integration-with-bot-framework.md | 33 ++++--- .../integration-with-dialogflow.md | 50 ++++++----- 10 files changed, 255 insertions(+), 304 deletions(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md index 1893daa705..d378cc4e36 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md @@ -8,61 +8,60 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Gemini AI With AI AssistView control - -The Syncfusion AI AssistView supports integration with [Gemini](https://ai.google.dev/gemini-api/docs), enabling advanced conversational AI features in your MVC applications. - -## Getting Started With the AI AssistView control - -Before integrating Gemini AI, ensure that the Syncfusion AI AssistView control is correctly rendered in your MVC application: - -[ MVC Getting Started Guide](../getting-started) +# Integrate Gemini AI with ASP.NET MVC AI AssistView control + +The AI AssistView control integrates with Google’s [Gemini](https://ai.google.dev/gemini-api/docs) API to deliver intelligent conversational interfaces. It leverages advanced natural language understanding to interpret user input, maintain context throughout interactions, and provide accurate, relevant responses. By configuring secure authentication and data handling, developers can unlock powerful AI-driven communication features that elevate user engagement and streamline support experiences. ## Prerequisites + +* **Google Account**: For generating a Gemini API key. + +* **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. + +* [Markdig](https://www.nuget.org/packages/Markdig) package: For parsing Markdown responses. + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + +## Install Dependencies -* Google account to generate API key on accessing [Gemini](https://ai.google.dev/gemini-api/docs). -* [System requirements for ASP.NET MVC controls](https://ej2.syncfusion.com/aspnetmvc/documentation/system-requirements) to create MVC application - -## Install Packages - -Install the Syncfusion ASP.NET MVC package in the application using Package Manager Console. +1. Install the `Gemini AI` nuget package in the application. ```bash -NuGet\Install-Package Syncfusion.EJ2.MVC5 +NuGet\Install-Package Mscc.GenerativeAI ``` - -Install the Gemini AI package in the application using Package Manager Console. - + +2. Install the `Markdig` nuget packages in the application. + ```bash - -NuGet\Install-Package Mscc.GenerativeAI - + +Nuget\Install-Package Markdig + ``` ## Generate API Key + +1. **Access Google AI Studio**: Instructs users to sign into [Google AI Studio](https://aistudio.google.com/app/apikey) with a Google account or create a new account if needed. + +2. **Navigate to API Key Creation**: Go to the `Get API Key` option in the left-hand menu or top-right corner of the dashboard. Click the `Create API Key` button. + +3. **Project Selection**: Choose an existing Google Cloud project or create a new one. + +4. **API Key Generation**: After project selection, the API key is generated. Users are instructed to copy and store the key securely, as it is shown only once. + +> Security note: Advises against committing the API key to version control and recommends using environment variables or a secret manager in production. -1. Go to [Google AI Studio](https://aistudio.google.com/app/apikey) and sign in with your google account. If you don’t have one, create a new account. - -2. Once logged in, click on `Get API Key` from the left-hand menu or the top-right corner of the dashboard. - -3. Click the `Create API Key` button. You’ll be prompted to either select an existing Google Cloud project or create a new one. Choose the appropriate option and proceed. - -4. After selecting or creating a project, your API key will be generated and displayed. Copy the key and store it securely, as it will only be shown once. - -> `Security Note`: Never commit the API key to version control. Use environment variables or a secret manager for production. - -## Configure Gemini AI with AI AssistView - -You can add the below respective files in your application: - -* Add your generated `API Key` at the line +## Gemini AI with AI AssistView +* Add your Gemini API key securely in the configuration: + ```bash - + string apiKey = 'Place your API key here'; - + ``` {% tabs %} @@ -75,11 +74,3 @@ string apiKey = 'Place your API key here'; {% endtabs %} ![Gemini AI](../images/gemini-ai.png) - -## Run and Test - -Run the application in the browser using the following command. - -Build and run the app (Ctrl + F5). - -Open the hosted link to interact with the Gemini AI for dynamic response diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md index 3b13389e0c..33c5617bad 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md @@ -8,29 +8,25 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# LLM via Ollama With AI AssistView component +# Integrate LLM via Ollama with ASP.NET MVC AI AssistView control -The Syncfusion AI AssistView supports integration with [LLM via Ollama](https://ollama.com), enabling advanced conversational AI features in your applications. The component acts as a UI for a support bot, where user prompts are sent to the selected AI service via API calls. - -## Getting Started With the AI AssistView control - -Before integrating LLM Model, ensure that the Syncfusion AI AssistView control is correctly rendered in your MVC application: - -[ MVC Getting Started Guide](../getting-started) +The AI AssistView control integrates with [LLM via Ollama](https://ollama.com),to enable advanced conversational AI features in your ASP.NET MVC application. The control acts as a user interface where user prompts are sent to the selected LLM model via API calls, providing natural language understanding and context-aware responses. ## Prerequisites -* [System requirements for ASP.NET MVC controls](https://ej2.syncfusion.com/aspnetmvc/documentation/system-requirements) to create MVC application - -## Install Packages - -Install the Syncfusion ASP.NET MVC package in the application using Package Manager Console. - -```bash - -NuGet\Install-Package Syncfusion.EJ2.MVC5 - -``` +Before starting, ensure you have the following: + +* [Ollama](https://ollama.com) Installed to run and manage LLM models locally. + +* **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. + +* [Markdig](https://www.nuget.org/packages/Markdig) package: For parsing Markdown responses. + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + +## Configuring Ollama Install the LLM Model package in the application using Package Manager Console. @@ -42,7 +38,7 @@ NuGet\Install-Package Microsoft.Extensions.AI.Ollama ``` -## Configure LLM Model with AI AssistView +## Configure AI AssistView with Ollama in ASP.NET MVC Add services in `Program.cs` file @@ -72,11 +68,3 @@ builder.Services.AddChatClient(new OllamaChatClient(new Uri("http://localhost:11 {% endtabs %} ![LLM Model](../images/llm-model.png) - -## Run and Test - -Run the application in the browser using the following command. - -Build and run the app (Ctrl + F5). - -Open the hosted link to interact with your LLM Model for dynamic response. diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md index 00c70d5cab..658ff09e00 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md @@ -8,55 +8,66 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Azure Open AI With AI AssistView control +# Integrate Azure OpenAI with ASP.NET MVC AI AssistView control -The Syncfusion AI AssistView supports integration with [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai), enabling advanced conversational AI features in your MVC applications. - -## Getting Started With the AI AssistView control - -Before integrating Azure Open AI, ensure that the Syncfusion AI AssistView control is correctly rendered in your MVC application: - -[ MVC Getting Started Guide](../getting-started) +The AI AssistView control integrates with [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) to enable advanced conversational AI features in your applications. The control acts as a user interface, where user prompts are sent to the Azure Open AI service via API calls, providing natural language understanding and context-aware responses. ## Prerequisites - -* An Azure account with access to [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. -* [System requirements for ASP.NET MVC controls](https://ej2.syncfusion.com/aspnetmvc/documentation/system-requirements) to create MVC application - -## Install Packages - -Install the Syncfusion ASP.NET MVC package in the application using Package Manager Console. - -```bash - -NuGet\Install-Package Syncfusion.EJ2.MVC5 -``` - -Install the Open AI and Azure Open AI package in the application using Package Manager Console. +Before starting, ensure you have the following: + +* **An Azure account**: with access to [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. + +* **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. + +* [Markdig](https://www.nuget.org/packages/Markdig) package available in the project for Markdown-to-HTML conversion (required by the sample code). + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. +## Install Dependencies + +Install the required packages: + +1. Install the `Open AI` and `Azure` nuget packages in the application. + ```bash - + NuGet\Install-Package OpenAI NuGet\Install-Package Azure.AI.OpenAI NuGet\Install-Package Azure.Core ``` + +2. Install the `Markdig` nuget packages in the application. + +```bash + +Nuget\Install-Package Markdig + +``` + +Note: The sample below uses HttpClient directly and does not require the Azure/OpenAI SDKs. ## Configure Azure Open AI 1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. -2. Under Resource Management, select Keys and Endpoint to retrieve your API key and endpoint URL. +2. Under resource Management, select keys and endpoint to retrieve your API key and endpoint URL. -3. Copy the API key, endpoint, and deployment name (e.g., gpt-4o-mini). Ensure the API version matches your resource configuration. +3. Note the following values: + - API key + - Endpoint (for example, https://.openai.azure.com/) + - API version (must be supported by your resource) + - Deployment name (for example, gpt-4o-mini) 4. Store these values securely, as they will be used in your application. > `Security Note`: expose your API key in client-side code for production applications. Use a server-side proxy or environment variables to manage sensitive information securely. - -## Configure Azure Open AI with AI AssistView - + +## Azure OpenAI with AI AssistView + You can add the below respective files in your application: * Update the following configuration values with your Azure Open AI details: @@ -79,11 +90,3 @@ string deploymentName = "Your_Deployment_Name"; {% endtabs %} ![Azure Open AI](../images/open-ai.png) - -## Run and Test - -Run the application in the browser using the following command. - -Build and run the app (Ctrl + F5). - -Open the Hosted link to interact with your Azure Open AI for dynamic response. diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md index d100b357bd..82ea4f859b 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md @@ -8,61 +8,60 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Gemini AI With AI AssistView control +# Integrate Gemini AI with ASP.NET Core AI AssistView control -The Syncfusion AI AssistView supports integration with [Gemini](https://ai.google.dev/gemini-api/docs), enabling advanced conversational AI features in your Core applications. - -## Getting Started With the AI AssistView control - -Before integrating Gemini AI, ensure that the Syncfusion AI AssistView control is correctly rendered in your Core application: - -[ ASP.NET CORE Getting Started Guide](../getting-started) +The AI AssistView control integrates with Google’s [Gemini](https://ai.google.dev/gemini-api/docs) API to deliver intelligent conversational interfaces. It leverages advanced natural language understanding to interpret user input, maintain context throughout interactions, and provide accurate, relevant responses. By configuring secure authentication and data handling, developers can unlock powerful AI-driven communication features that elevate user engagement and streamline support experiences. ## Prerequisites -* Google account to generate API key on accessing [Gemini](https://ai.google.dev/gemini-api/docs). -* [System requirements for ASP.NET Core controls](https://ej2.syncfusion.com/aspnetmvc/documentation/system-requirements) to create Core application - -## Install Packages +* **Google Account**: For generating a Gemini API key. + +* **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. + +* [Markdig](https://www.nuget.org/packages/Markdig) package: For parsing Markdown responses. + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + +## Install Dependencies -Install the Syncfusion ASP.NET Core package in the application using Package Manager Console. +1. Install the `Gemini AI` nuget package in the application. ```bash -NuGet\Install-Package Syncfusion.EJ2.AspNet.Core +NuGet\Install-Package Mscc.GenerativeAI ``` - -Install the Gemini AI package in the application using Package Manager Console. - + +2. Install the `Markdig` nuget packages in the application. + ```bash - -NuGet\Install-Package Mscc.GenerativeAI - + +Nuget\Install-Package Markdig + ``` ## Generate API Key + +1. **Access Google AI Studio**: Instructs users to sign into [Google AI Studio](https://aistudio.google.com/app/apikey) with a Google account or create a new account if needed. + +2. **Navigate to API Key Creation**: Go to the `Get API Key` option in the left-hand menu or top-right corner of the dashboard. Click the `Create API Key` button. + +3. **Project Selection**: Choose an existing Google Cloud project or create a new one. + +4. **API Key Generation**: After project selection, the API key is generated. Users are instructed to copy and store the key securely, as it is shown only once. + +> Security note: Advises against committing the API key to version control and recommends using environment variables or a secret manager in production. -1. Go to [Google AI Studio](https://aistudio.google.com/app/apikey) and sign in with your google account. If you don’t have one, create a new account. - -2. Once logged in, click on `Get API Key` from the left-hand menu or the top-right corner of the dashboard. - -3. Click the `Create API Key` button. You’ll be prompted to either select an existing Google Cloud project or create a new one. Choose the appropriate option and proceed. - -4. After selecting or creating a project, your API key will be generated and displayed. Copy the key and store it securely, as it will only be shown once. - -> `Security Note`: Never commit the API key to version control. Use environment variables or a secret manager for production. - -## Configure Gemini AI with AI AssistView - -You can add the below respective files in your application: - -* Add your generated `API Key` at the line +## Gemini AI with AI AssistView +* Add your Gemini API key securely in the configuration: + ```bash - + string apiKey = 'Place your API key here'; - + ``` {% tabs %} @@ -75,11 +74,4 @@ string apiKey = 'Place your API key here'; {% endtabs %} ![Gemini AI](../images/gemini-ai.png) - -## Run and Test - -Run the application in the browser using the following command. - -Build and run the app (Ctrl + F5). - -Open the hosted link to interact with the Gemini AI for dynamic response \ No newline at end of file + \ No newline at end of file diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md index 68b782efaf..8b7c3022f2 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md @@ -8,29 +8,25 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# LLM via Ollama With AI AssistView component +# Integrate LLM via Ollama with ASP.NET Core AI AssistView control -The Syncfusion AI AssistView supports integration with [LLM via Ollama](https://ollama.com), enabling advanced conversational AI features in your applications. The component acts as a UI for a support bot, where user prompts are sent to the selected AI service via API calls. +The AI AssistView control integrates with [LLM via Ollama](https://ollama.com),to enable advanced conversational AI features in your ASP.NET Core application. The control acts as a user interface where user prompts are sent to the selected LLM model via API calls, providing natural language understanding and context-aware responses. -## Getting Started With the AI AssistView control - -Before integrating LLM Model, ensure that the Syncfusion AI AssistView control is correctly rendered in your Core application: - -[ CORE Getting Started Guide](../getting-started) - ## Prerequisites -* [System requirements for ASP.NET MVC controls](https://ej2.syncfusion.com/aspnetmvc/documentation/system-requirements) to create Core application - -## Install Packages - -Install the Syncfusion ASP.NET Core package in the application using Package Manager Console. - -```bash - -NuGet\Install-Package Syncfusion.EJ2.AspNet.Core +Before starting, ensure you have the following: + +* [Ollama](https://ollama.com) Installed to run and manage LLM models locally. + +* **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. + +* [Markdig](https://www.nuget.org/packages/Markdig) package: For parsing Markdown responses. + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. -``` +## Configuring Ollama Install the LLM Model package in the application using Package Manager Console. @@ -42,7 +38,7 @@ NuGet\Install-Package Microsoft.Extensions.AI.Ollama ``` -## Configure LLM Model with AI AssistView +## Configure AI AssistView with Ollama in ASP.NET Core Add services in `Program.cs` file @@ -72,11 +68,3 @@ builder.Services.AddChatClient(new OllamaChatClient(new Uri("http://localhost:11 {% endtabs %} ![LLM Model](../images/llm-model.png) - -## Run and Test - -Run the application in the browser using the following command. - -Build and run the app (Ctrl + F5). - -Open the hosted link to interact with your AI model where you can enter prompts and receive responses from the Ollama model. \ No newline at end of file diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md index 542a1d9551..3060329041 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md @@ -8,54 +8,65 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Azure Open AI With AI AssistView control - -The Syncfusion AI AssistView supports integration with [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai), enabling advanced conversational AI features in your Core applications. - -## Getting Started With the AI AssistView control - -Before integrating Azure Open AI, ensure that the Syncfusion AI AssistView control is correctly rendered in your Core app: - -[ CORE Getting Started Guide](../getting-started) +# Integrate Azure OpenAI with ASP.NET Core AI AssistView control +The AI AssistView control integrates with [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) to enable advanced conversational AI features in your applications. The control acts as a user interface, where user prompts are sent to the Azure Open AI service via API calls, providing natural language understanding and context-aware responses. + ## Prerequisites - -* An Azure account with access to [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. -* [System requirements for ASP.NET MVC controls](https://ej2.syncfusion.com/aspnetmvc/documentation/system-requirements) to create Core application - -## Install Packages - -Install the Syncfusion ASP.NET Core package in the application using Package Manager Console. - -```bash - -NuGet\Install-Package Syncfusion.EJ2.AspNet.Core -``` - -Install the Open AI and Azure Open AI package in the application using Package Manager Console. - +Before starting, ensure you have the following: + +* **An Azure account**: with access to [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. + +* **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. + +* [Markdig](https://www.nuget.org/packages/Markdig) package available in the project for Markdown-to-HTML conversion (required by the sample code). + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + +## Install Dependencies + +Install the required packages: + +1. Install the `Open AI` and `Azure` nuget packages in the application. + ```bash - + NuGet\Install-Package OpenAI NuGet\Install-Package Azure.AI.OpenAI NuGet\Install-Package Azure.Core ``` + +2. Install the `Markdig` nuget packages in the application. + +```bash + +Nuget\Install-Package Markdig + +``` + +Note: The sample below uses HttpClient directly and does not require the Azure/OpenAI SDKs. ## Configure Azure Open AI -1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. +1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. -2. Under Resource Management, select Keys and Endpoint to retrieve your API key and endpoint URL. +2. Under resource Management, select keys and endpoint to retrieve your API key and endpoint URL. -3. Copy the API key, endpoint, and deployment name (e.g., gpt-4o-mini). Ensure the API version matches your resource configuration. +3. Note the following values: + - API key + - Endpoint (for example, https://.openai.azure.com/) + - API version (must be supported by your resource) + - Deployment name (for example, gpt-4o-mini) 4. Store these values securely, as they will be used in your application. -> `Security Note`: Never expose your API key in client-side code for production applications. Use a server-side proxy or environment variables to manage sensitive information securely. - -## Configure Azure Open AI with AI AssistView +> `Security Note`: expose your API key in client-side code for production applications. Use a server-side proxy or environment variables to manage sensitive information securely. + +## Azure OpenAI with AI AssistView You can add the below respective files in your application: @@ -79,11 +90,3 @@ string deploymentName = "Your_Deployment_Name"; {% endtabs %} ![Azure Open AI](../images/open-ai.png) - -## Run and Test - -Run the application in the browser using the following command. - -Build and run the app (Ctrl + F5). - -Open the hosted link to interact with your Azure Open AI for dynamic response. \ No newline at end of file diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md index b173d641b7..418b963536 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md @@ -8,22 +8,25 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Microsoft Bot Framework With ASP.NET MVC Chat UI component +# Integrate Microsoft Bot Framework with ASP.NET MVC Chat UI control -The Syncfusion ASP.NET MVC Chat UI supports integration with a [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0) bot hosted on Azure, enabling a custom chat interface for seamless user interaction. The process involves setting up a secure backend token server, configuring the bot in Azure, and integrating the Syncfusion Chat UI in an ASP.NET MVC application. +The Chat UI control integrates seamlessly with a [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0) bot hosted on Azure, enabling a custom chat interface for seamless user interaction. The process involves setting up a secure backend token server, configuring Direct Line in Azure, and integrating the Chat UI in the application. -## Getting Started With the Chat UI Component +## Prerequisites -Before integrating Microsoft Bot Framework, ensure that the Syncfusion Chat UI component is correctly rendered in your ASP.NET MVC app: +Before starting, ensure you have the following: -[ASP.NET MVC Getting Started Guide](../getting-started) +* **Node.js**: Version 16 or higher with npm. -## Prerequisites +* [Microsoft Azure Account](https://portal.azure.com/#home) : Required to create and host the bot. + +* **Syncfusion Chat UI**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. -* [Microsoft Azure Account](https://portal.azure.com/#home): Required to create and host the bot. -* `Visual Studio`: With ASP.NET MVC development tools. -* `Syncfusion EJ2 ASP.NET MVC`: Install Syncfusion.EJ2.MVC5 in your project. -* `Deployed Azure Bot`: A bot should be created and published using the Bot Framework, accessible via an Azure App Service. Refer to [Microsoft's Bot Creation Guide](https://learn.microsoft.com/en-us/azure/bot-service/). +* **Deployed Azure Bot**: A bot should be created and published using the [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0), which is accessible via an Azure App Service. Refer to Microsoft's Bot Creation Guide. + +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. ## Install Dependencies @@ -36,14 +39,6 @@ Install-Package Newtonsoft.Json ``` -* Install the Syncfusion EJ2 ASP.NET MVC package: - -```bash - -Install-Package Syncfusion.EJ2.MVC5 - -``` - ## Configure the Azure Bot 1. In the [Azure Portal](https://portal.azure.com/#home), navigate to your bot resource. diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md index 17620f1f8f..6a7c9ed67f 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md @@ -8,23 +8,26 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Google Dialogflow With ASP.NET MVC Chat UI component +# Integrate Google Dialogflow with ASP.NET MVC Chat UI control -The Syncfusion Chat UI supports integration with [Google Dialogflow](https://cloud.google.com/dialogflow/docs), enabling advanced conversational AI features in your ASP.NET MVC applications. +The Chat UI control integrates with [Google Dialogflow](https://cloud.google.com/dialogflow/docs) to enable advanced conversational AI features in your ASP.NET MVC applications. The control acts as a user interface for a support bot, where user prompts are sent to the Dialogflow service via API calls, providing natural language understanding and context-aware responses. -## Getting Started With the ChatUI Component +## Prerequisites -Before integrating Dialogflow, ensure that the Syncfusion Chat UI component is correctly rendered in your ASP.NET MVC app: +Before starting, ensure you have the following: -[ASP.NET MVC Getting Started Guide](../getting-started) +* **Node.js**: Version 16 or higher with npm. -## Prerequisites +* **Google Account**: To access [Google Dialogflow](https://cloud.google.com/dialogflow/docs) and [Google Cloud Console](https://console.cloud.google.com/). + +* **Syncfusion Chat UI**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. -* Google account to access [Google Dialogflow](https://cloud.google.com/dialogflow/docs) and [Google Cloud Console](https://console.cloud.google.com/). -* Visual Studio with ASP.NET MVC development tools. -* Syncfusion EJ2 ASP.NET MVC installed in your project. * Dialogflow Service Account with the `Dialogflow API Client` role and its JSON key file. +## Set Up the AI AssistView control + +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + ## Install Dependencies * Install backend dependencies for Dialogflow and server setup using NuGet: @@ -34,13 +37,6 @@ Before integrating Dialogflow, ensure that the Syncfusion Chat UI component is c Install-Package Google.Cloud.Dialogflow.V2 Install-Package Newtonsoft.Json -``` -* Install the Syncfusion EJ2 ASP.NET MVC package in your project: - -```bash - -Install-Package Syncfusion.EJ2.MVC5 - ``` ## Set Up the Dialogflow Agent @@ -49,13 +45,13 @@ Install-Package Syncfusion.EJ2.MVC5 2. Add intents with training phrases and responses (e.g., greetings, FAQs). Test using the dialogflow simulator. -3. In the Google Cloud Console, go to `APIs & Services` > `Credentials`, create a Service Account with the dialogflow API client role, and download the JSON key file. +3. In the Google Cloud Console, go to `APIs & Services` > `Credentials`, create a service account with the dialogflow API client role, and download the JSON key file. > `Security Note`: Never commit the JSON key file to version control. Use environment variables or a secret manager (e.g., Google Cloud Secret Manager) for production. -## Configure ASP.NET MVC Backend +## Configure Node.js Backend -Create `service-acct.json` with your Dialogflow service account credentials in your project root: +Create `backend/service-acct.json` with your Dialogflow service account credentials: {% tabs %} {% highlight js tabtitle="service-acct.json" %} @@ -136,7 +132,7 @@ namespace YourNamespace.Controllers ## Configure message send -Use the Chat UI `messageSend` event to exchange messages. This event is triggered before a message is sent, allowing you to forward it to the backend. +Use the Chat UI `messageSend` event to exchanges message. Each time a user sends a message, this event will be invoked with details of the sent message. ### Forward Message to backend: diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md index c1ab5e4e15..a5a29b7f24 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md @@ -8,37 +8,34 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Microsoft Bot Framework With ASP.NET Core Chat UI component +# Integrate Microsoft Bot Framework with ASP.NET Core Chat UI control -The Syncfusion ASP.NET MVC Chat UI supports integration with a [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0) bot hosted on Azure, enabling a custom chat interface for seamless user interaction. The process involves setting up a secure backend token server, configuring the bot in Azure, and integrating the Syncfusion Chat UI in an ASP.NET Core application. +The Chat UI control integrates seamlessly with a [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0) bot hosted on Azure, enabling a custom chat interface for seamless user interaction. The process involves setting up a secure backend token server, configuring Direct Line in Azure, and integrating the Chat UI in the application. -## Getting Started With the ChatUI Component +## Prerequisites -Before integrating Microsoft Bot Framework, ensure that the Syncfusion Chat UI component is correctly rendered in your ASP.NET Core app: -[ASP.NET Core Getting Started Guide](../getting-started) +Before starting, ensure you have the following: -## Prerequisites +* **Node.js**: Version 16 or higher with npm. -* [Microsoft Azure Account](https://portal.azure.com/#home): Required to create and host the bot. -* `.NET SDK`: Version 6.0 or higher for ASP.NET Core. -* `Syncfusion EJ2 ASP.NET Core`: Install Syncfusion.EJ2.AspNet.Core in your project. -* `Deployed Azure Bot`: A bot should be created and published using the Bot Framework, accessible via an Azure App Service. Refer to [Microsoft's Bot Creation Guide](https://learn.microsoft.com/en-us/azure/bot-service/). +* [Microsoft Azure Account](https://portal.azure.com/#home) : Required to create and host the bot. -## Install Dependencies -* Install backend dependencies for bot communication using NuGet: +* **Syncfusion Chat UI**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. -```bash +* **Deployed Azure Bot**: A bot should be created and published using the [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0), which is accessible via an Azure App Service. Refer to Microsoft's Bot Creation Guide. -dotnet add package Microsoft.Bot.Connector.DirectLine -dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson +## Set Up the AI AssistView control -``` +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + +## Install Dependencies -* Install the Syncfusion EJ2 ASP.NET Core package: +* Install backend dependencies for bot communication using NuGet: ```bash -dotnet add package Syncfusion.EJ2.AspNet.Core +dotnet add package Microsoft.Bot.Connector.DirectLine +dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson ``` diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md index fdc51ba056..afe7e44cda 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md @@ -8,23 +8,28 @@ publishingplatform: ##Platform_Name## documentation: ug --- -# Google Dialogflow With ASP.NET Core Chat UI component +# Integrate Google Dialogflow with ASP.NET Core Chat UI control -The Syncfusion Chat UI supports integration with [Google Dialogflow](https://cloud.google.com/dialogflow/docs), enabling advanced conversational AI features in your ASP.NET Core applications. +The Chat UI control integrates with [Google Dialogflow](https://cloud.google.com/dialogflow/docs) to enable advanced conversational AI features in your ASP.NET Core applications. The control acts as a user interface for a support bot, where user prompts are sent to the Dialogflow service via API calls, providing natural language understanding and context-aware responses. -## Getting Started With the ChatUI Component +## Prerequisites -Before integrating Dialogflow, ensure that the Syncfusion Chat UI component is correctly rendered in your ASP.NET Core app: -[ASP.NET Core Getting Started Guide](../getting-started) +Before starting, ensure you have the following: -## Prerequisites +* **Node.js**: Version 16 or higher with npm. + +* **Google Account**: To access [Google Dialogflow](https://cloud.google.com/dialogflow/docs) and [Google Cloud Console](https://console.cloud.google.com/). + +* **Syncfusion Chat UI**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. + +* Dialogflow Service Account with the `Dialogflow API Client` role and its JSON key file. + +## Set Up the AI AssistView control -* Google account to access [Google Dialogflow](https://cloud.google.com/dialogflow/docs) and [Google Cloud Console](https://console.cloud.google.com/). -* .NET SDK (version 6.0 or higher) for ASP.NET Core. -* Syncfusion EJ2 ASP.NET Core installed in your project. -* Dialogflow Service Account with the Dialogflow API Client role and its JSON key file. +Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. ## Install Dependencies + * Install backend dependencies for Dialogflow and server setup using NuGet: ```bash @@ -33,37 +38,30 @@ dotnet add package Google.Cloud.Dialogflow.V2 dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson ``` -* Install the Syncfusion EJ2 ASP.NET Core package in your project: - -```bash -dotnet add package Syncfusion.EJ2.AspNet.Core - -``` ## Set Up the Dialogflow Agent 1. In the dialogflow console, create an [agent](https://cloud.google.com/agent-assist/docs), set a name (e.g., `MyChatBot`), and configure the default language (e.g., English - `en`). 2. Add intents with training phrases and responses (e.g., greetings, FAQs). Test using the dialogflow simulator. -3. In the Google Cloud Console, go to `APIs & Services` > `Credentials`, create a Service Account with the dialogflow API client role, and download the JSON key file. +3. In the Google Cloud Console, go to `APIs & Services` > `Credentials`, create a service account with the dialogflow API client role, and download the JSON key file. > `Security Note`: Never commit the JSON key file to version control. Use environment variables or a secret manager (e.g., Google Cloud Secret Manager) for production. ## Configure Node.js Backend -Create `service-acct.json` with your Dialogflow service account credentials in your project root (or use User Secrets for development): +Create `backend/service-acct.json` with your Dialogflow service account credentials: {% tabs %} {% highlight js tabtitle="service-acct.json" %} - { -"type": "service_account", -"project_id": "your-dialogflow-project-id", -"private_key_id": "abc123xyz...", -"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEv...", -"client_email": "dialogflow-agent@your-dialogflow-project-id.iam.gserviceaccount.com", -... + "type": "service_account", + "project_id": "your-dialogflow-project-id", + "private_key_id": "abc123xyz...", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEv...", + "client_email": "dialogflow-agent@your-dialogflow-project-id.iam.gserviceaccount.com", + ... } {% endhighlight %} {% endtabs %} @@ -131,7 +129,7 @@ namespace YourNamespace.Controllers ## Configure message send -Use the Chat UI `messageSend` event to exchange messages. This event is triggered before a message is sent, allowing you to forward it to the backend. +Use the Chat UI `messageSend` event to exchanges message. Each time a user sends a message, this event will be invoked with details of the sent message. ### Forward Message to backend: From bf63d70daa9debbbc1a333d5579a0e25052b7319 Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:49:52 +0530 Subject: [PATCH 06/74] 986172: Updated review concerns for AI integrations in core and mvc. --- .../ai-integrations/gemini-integration.md | 2 ++ .../ai-integrations/ollama-llm-integration.md | 2 ++ .../ai-integrations/openai-integration.md | 22 +++++++++---------- .../ai-integrations/gemini-integration.md | 2 ++ .../ai-integrations/ollama-llm-integration.md | 2 ++ .../ai-integrations/openai-integration.md | 22 +++++++++---------- .../integration-with-bot-framework.md | 2 +- .../integration-with-dialogflow.md | 2 +- ej2-asp-core-toc.html | 2 +- ej2-asp-mvc-toc.html | 2 +- 10 files changed, 34 insertions(+), 26 deletions(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md index d378cc4e36..7fb68f5cdb 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md @@ -55,6 +55,8 @@ Nuget\Install-Package Markdig > Security note: Advises against committing the API key to version control and recommends using environment variables or a secret manager in production. ## Gemini AI with AI AssistView + +Modify the `index.cshtml` file to integrate the Gemini AI with the AI AssistView control. * Add your Gemini API key securely in the configuration: diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md index 33c5617bad..ee559f7d26 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md @@ -40,6 +40,8 @@ NuGet\Install-Package Microsoft.Extensions.AI.Ollama ## Configure AI AssistView with Ollama in ASP.NET MVC +Modify the `index.cshtml` file to integrate the Ollama with the AI AssistView control. + Add services in `Program.cs` file ```bash diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md index 658ff09e00..bf6bb87746 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md @@ -1,22 +1,22 @@ --- layout: post -title: Azure Open AI in ##Platform_Name## AI AssistView Control | Syncfusion -description: Checkout and learn about Integration of Azure Open AI in Syncfusion ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. +title: Azure OpenAI in ##Platform_Name## AI AssistView Control | Syncfusion +description: Checkout and learn about Integration of Azure OpenAI in Syncfusion ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc -control: Azure Open AI +control: Azure OpenAI publishingplatform: ##Platform_Name## documentation: ug --- # Integrate Azure OpenAI with ASP.NET MVC AI AssistView control -The AI AssistView control integrates with [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) to enable advanced conversational AI features in your applications. The control acts as a user interface, where user prompts are sent to the Azure Open AI service via API calls, providing natural language understanding and context-aware responses. +The AI AssistView control integrates with [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) to enable advanced conversational AI features in your applications. The control acts as a user interface, where user prompts are sent to the Azure OpenAI service via API calls, providing natural language understanding and context-aware responses. ## Prerequisites Before starting, ensure you have the following: -* **An Azure account**: with access to [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. +* **An Azure account**: with access to [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. * **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. @@ -30,7 +30,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide Install the required packages: -1. Install the `Open AI` and `Azure` nuget packages in the application. +1. Install the `OpenAI` and `Azure` nuget packages in the application. ```bash @@ -50,9 +50,9 @@ Nuget\Install-Package Markdig Note: The sample below uses HttpClient directly and does not require the Azure/OpenAI SDKs. -## Configure Azure Open AI +## Configure Azure OpenAI -1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. +1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure OpenAI resource. 2. Under resource Management, select keys and endpoint to retrieve your API key and endpoint URL. @@ -68,9 +68,9 @@ Note: The sample below uses HttpClient directly and does not require the Azure/O ## Azure OpenAI with AI AssistView -You can add the below respective files in your application: +Modify the `index.cshtml` file to integrate the Azure OpenAI with the AI AssistView control. -* Update the following configuration values with your Azure Open AI details: +* Update the following configuration values with your Azure OpenAI details: ```bash @@ -89,4 +89,4 @@ string deploymentName = "Your_Deployment_Name"; {% endhighlight %} {% endtabs %} -![Azure Open AI](../images/open-ai.png) +![Azure OpenAI](../images/open-ai.png) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md index 82ea4f859b..b2927f46d9 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md @@ -55,6 +55,8 @@ Nuget\Install-Package Markdig > Security note: Advises against committing the API key to version control and recommends using environment variables or a secret manager in production. ## Gemini AI with AI AssistView + +Modify the `index.cshtml` file to integrate the Gemini AI with the AI AssistView control. * Add your Gemini API key securely in the configuration: diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md index 8b7c3022f2..e833e81fd6 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md @@ -40,6 +40,8 @@ NuGet\Install-Package Microsoft.Extensions.AI.Ollama ## Configure AI AssistView with Ollama in ASP.NET Core +Modify the `index.cshtml` file to integrate the Ollama with the AI AssistView control. + Add services in `Program.cs` file ```bash diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md index 3060329041..4d98aea12a 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md @@ -1,22 +1,22 @@ --- layout: post -title: Azure Open AI in ##Platform_Name## AI AssistView Control | Syncfusion -description: Checkout and learn about Integration of Azure Open AI in Syncfusion ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. +title: Azure OpenAI in ##Platform_Name## AI AssistView Control | Syncfusion +description: Checkout and learn about Integration of Azure OpenAI in Syncfusion ##Platform_Name## AI AssistView control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc -control: Azure Open AI +control: Azure OpenAI publishingplatform: ##Platform_Name## documentation: ug --- # Integrate Azure OpenAI with ASP.NET Core AI AssistView control -The AI AssistView control integrates with [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) to enable advanced conversational AI features in your applications. The control acts as a user interface, where user prompts are sent to the Azure Open AI service via API calls, providing natural language understanding and context-aware responses. +The AI AssistView control integrates with [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) to enable advanced conversational AI features in your applications. The control acts as a user interface, where user prompts are sent to the Azure OpenAI service via API calls, providing natural language understanding and context-aware responses. ## Prerequisites Before starting, ensure you have the following: -* **An Azure account**: with access to [Azure Open AI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. +* **An Azure account**: with access to [Azure OpenAI](https://microsoft.github.io/PartnerResources/skilling/ai-ml-academy/resources/openai) services and a generated API key. * **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. @@ -30,7 +30,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide Install the required packages: -1. Install the `Open AI` and `Azure` nuget packages in the application. +1. Install the `OpenAI` and `Azure` nuget packages in the application. ```bash @@ -50,9 +50,9 @@ Nuget\Install-Package Markdig Note: The sample below uses HttpClient directly and does not require the Azure/OpenAI SDKs. -## Configure Azure Open AI +## Configure Azure OpenAI -1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. +1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure OpenAI resource. 2. Under resource Management, select keys and endpoint to retrieve your API key and endpoint URL. @@ -68,9 +68,9 @@ Note: The sample below uses HttpClient directly and does not require the Azure/O ## Azure OpenAI with AI AssistView -You can add the below respective files in your application: +Modify the `index.cshtml` file to integrate the Azure OpenAI with the AI AssistView control. -* Update the following configuration values with your Azure Open AI details: +* Update the following configuration values with your Azure OpenAI details: ```bash @@ -89,4 +89,4 @@ string deploymentName = "Your_Deployment_Name"; {% endhighlight %} {% endtabs %} -![Azure Open AI](../images/open-ai.png) +![Azure OpenAI](../images/open-ai.png) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md index 418b963536..9bccca5958 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md @@ -118,7 +118,7 @@ Add the Direct Line secret to `Web.config`: Use the Chat UI `messageSend` event to handle message exchanges. This event is triggered before a message is sent, allowing you to forward it to the bot via the direct line API. Use the `addMessage` method to programmatically add the bot's reply to the Chat UI. -Create `Views/Home/Index.cshtml` to integrate the Syncfusion Chat UI with the direct line API: +Modify the `Views/Home/Index.cshtml` file to integrate the Syncfusion Chat UI with the direct line API: {% tabs %} {% highlight Html tabtitle="Index.cshtml" %} diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md index 6a7c9ed67f..27cd2df364 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md @@ -142,7 +142,7 @@ In the `messageSend` event handler, send a POST request to your backend API endp Use the `addMessage` method to programmatically add the bot's reply to the Chat UI. -Create `Views/Home/Index.cshtml` to integrate the Syncfusion Chat UI with the dialogflow backend: +Modify the `Views/Home/Index.cshtml` file to integrate the Syncfusion Chat UI with the dialogflow backend: {% tabs %} {% highlight Html tabtitle="Index.cshtml" %} diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 65f1e7cc33..cca01b4b5f 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -206,7 +206,7 @@ Google Gemini
  • - Azure Open AI + Azure OpenAI
  • Ollama LLM diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index baeab7e66e..55b8acf763 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -160,7 +160,7 @@ Google Gemini
  • - Azure Open AI + Azure OpenAI
  • Ollama LLM From 15cdd800ee3dd7eca30d040229a05cf2b65e48fd Mon Sep 17 00:00:00 2001 From: praveensf4999 Date: Tue, 14 Oct 2025 11:17:52 +0530 Subject: [PATCH 07/74] 898334: Added style and appearance topic in filemanager component --- ...d-appearance-for-file-manager-component.md | 206 ++++++++++++++++++ .../file-manager/images/customize_dialog.png | Bin 0 -> 42531 bytes .../file-manager/images/customize_layout.png | Bin 0 -> 47268 bytes .../images/customize_navigation_pane.png | Bin 0 -> 48557 bytes .../images/customize_selected_file.png | Bin 0 -> 37233 bytes .../images/customize_thumbnail.png | Bin 0 -> 19278 bytes .../file-manager/images/customize_toolbar.png | Bin 0 -> 37776 bytes ej2-asp-core-toc.html | 1 + ej2-asp-mvc-toc.html | 1 + 9 files changed, 208 insertions(+) create mode 100644 ej2-asp-core-mvc/file-manager/add-style-and-appearance-for-file-manager-component.md create mode 100644 ej2-asp-core-mvc/file-manager/images/customize_dialog.png create mode 100644 ej2-asp-core-mvc/file-manager/images/customize_layout.png create mode 100644 ej2-asp-core-mvc/file-manager/images/customize_navigation_pane.png create mode 100644 ej2-asp-core-mvc/file-manager/images/customize_selected_file.png create mode 100644 ej2-asp-core-mvc/file-manager/images/customize_thumbnail.png create mode 100644 ej2-asp-core-mvc/file-manager/images/customize_toolbar.png diff --git a/ej2-asp-core-mvc/file-manager/add-style-and-appearance-for-file-manager-component.md b/ej2-asp-core-mvc/file-manager/add-style-and-appearance-for-file-manager-component.md new file mode 100644 index 0000000000..0b63632729 --- /dev/null +++ b/ej2-asp-core-mvc/file-manager/add-style-and-appearance-for-file-manager-component.md @@ -0,0 +1,206 @@ +--- +layout: post +title: Style Customize in ##Platform_Name## File Manager control | Syncfusion +description: Learn here all about How to add style and appearance in ##Platform_Name## File Manager control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: File Manager +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# How to customize style and appearance in File Manager + +The following content provides the exact CSS structure that can be used to modify the control's appearance based on the user preference. + +## Customizing the File Manager navigation pane + +To customize the File Manager navigation pane, use the `.e-navigation` selector and apply styles. + +The following example shows customize the navigation pane for these sections. + +```css +.sample-container { + margin: 10px 10px 10px 10px; +} + +/* + Set background color for the File Manager navigation pane */ +.e-filemanager .e-navigation { + background: #3a0647; +} + +/* Highlight the active item in the TreeView inside the navigation pane */ +.e-filemanager .e-treeview .e-list-item.e-active > .e-fullrow { + background: #c3d3f9a1; +} + +/* Set text color for TreeView items in the navigation pane */ +.e-filemanager .e-treeview .e-list-text { + color: #fff; +} +``` + +![File Manager Customization Navigation Pane](./images/customize_navigation_pane.png) + +## Customizing the File Manager layout + +To customize the File Manager layout, use the `.e-layout-content` selector and apply styles. + +```css + +.sample-container { + margin: 10px 10px 10px 10px; +} + +/* Style for breadcrumb (address bar) */ +.e-filemanager .e-layout-content .e-address { + background: #dee2e6; +} + +/* Customize the background for the Large Icons view */ +.e-filemanager .e-layout-content .e-large-icons { + background: #f8f9fa; +} + +/* Customize the background for the Details view table and content area */ +.e-filemanager .e-layout-content .e-grid .e-table, +.e-filemanager .e-grid .e-gridcontent .e-content { + background: #f8f9fa; +} + +``` + +![File Manager Customization Layout](./images/customize_layout.png) + +## Customizing the File Manager thumbnail + +To customize the thumbnails in the File Manager, you can apply background-image styles to specific CSS selectors that represent different file types, as listed in the table below. + +|File Type|CSS Selector| +|----|----| +|Image|.e-fe-image| +|Music|.e-fe-music| +|Excel|.e-fe-xlsx| +|Video|.e-fe-video| +|PowerPoint|.e-fe-pptx| +|RAR|.e-fe-rar| +|ZIP|.e-fe-zip| +|Text|.e-fe-txt| +|JavaScript|.e-fe-js| +|CSS|.e-fe-css| +|HTML|.e-fe-html| +|Unknown|.e-fe-unknown| +|Executable|.e-fe-exe| +|MSI|.e-fe-msi| +|PHP|.e-fe-php| +|Word|.e-fe-doc| +|Word(docx)|.e-fe-docx| +|XML|.e-fe-xml| +|Folder|.e-fe-folder| + +The following example demonstrates how to customize the File Manager's thumbnail icon for folders: + +```css + +/* Applies to both Large Icons view and Details view in the File Manager */ + +.e-filemanager .e-large-icons .e-fe-folder, .e-filemanager .e-grid .e-fe-folder { + background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGw6I0ZGOTI5Mjt9LnN0MXtmaWxsOiNFODdFN0U7fS5zdDJ7ZmlsbDojRkZDM0MzO30uc3Qze2ZpbGw6IzkxRDRGRTt9LnN0NHtmaWxsOiM2M0E3RDM7fS5zdDV7ZmlsbDojQzFFN0ZGO30uc3Q2e2ZpbGw6I0ZGRkZGRjt9LnN0N3tmaWxsOiM4M0Q2Qjk7fS5zdDh7ZmlsbDojNDZDNjhDO30uc3Q5e2ZpbGw6I0JCRThEODt9LnN0MTB7ZmlsbDojRkVCMTdEO30uc3QxMXtmaWxsOiNERDk2NjY7fS5zdDEye2ZpbGw6I0ZFRDRCNzt9LnN0MTN7ZmlsbDojRjJBMkEyO30uc3QxNHtmaWxsOiNGMUM1QzU7fS5zdDE1e2ZpbGw6I0RCQjY2Mzt9LnN0MTZ7ZmlsbDojQ0VBMTUxO30uc3QxN3tmaWxsOiNFQkQ3QTk7fS5zdDE4e2ZpbGw6I0NFQ0VDRTt9LnN0MTl7ZmlsbDojQjdCN0I3O30uc3QyMHtmaWxsOiNFNEU0RTQ7fS5zdDIxe2ZpbGw6IzY1QUFEMTt9LnN0MjJ7ZmlsbDojRTU3QTdBO30uc3QyM3tmaWxsOiNFNkE2RTg7fS5zdDI0e2ZpbGw6I0Q2OEFENjt9LnN0MjV7ZmlsbDojRkZDQ0ZFO30uc3QyNntmaWxsOiM5OENFNUY7fS5zdDI3e2ZpbGw6IzhDQUYyQzt9LnN0Mjh7ZmlsbDojQzZFM0E3O30uc3QyOXtmaWxsOiNGRkI1Nzg7fS5zdDMwe2ZpbGw6I0VEOUY2NDt9LnN0MzF7ZmlsbDojRkZENkI1O30uc3QzMntmaWxsOiNGNEExRUY7fS5zdDMze2ZpbGw6I0REODdERDt9LnN0MzR7ZmlsbDojRjlDQkY2O30uc3QzNXtmaWxsOiNBOEEyRjQ7fS5zdDM2e2ZpbGw6Izg4ODVFODt9LnN0Mzd7ZmlsbDojQ0ZDQ0Y4O30uc3QzOHtmaWxsOiNCQ0JDQkM7fS5zdDM5e2ZpbGw6I0E4QThBODt9LnN0NDB7ZmlsbDojREFEQURBO30uc3Q0MXtmaWxsOiM3N0NDREI7fS5zdDQye2ZpbGw6IzREQkNDMTt9LnN0NDN7ZmlsbDojQjRFM0VCO30uc3Q0NHtmaWxsOiNGRkI3QTQ7fS5zdDQ1e2ZpbGw6I0Y2OUE3Qjt9LnN0NDZ7ZmlsbDojRkZEN0NEO30uc3Q0N3tmaWxsOiM3MUM4RjQ7fS5zdDQ4e2ZpbGw6IzhEQzk3Nzt9LnN0NDl7ZmlsbDojN0NBODUxO30uc3Q1MHtvcGFjaXR5OjAuNDU7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0yOS41LDI3LjVoLTI3Yy0xLjEsMC0yLTAuOS0yLTJ2LTE5YzAtMS4xLDAuOS0yLDItMmgxMC40bDMuNSwzLjFoMTMuMmMxLjEsMCwyLDAuOSwyLDJ2MTUuOUMzMS41LDI2LjYsMzAuNiwyNy41LDI5LjUsMjcuNXoiLz48cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjkuNSwyOGgtMjdDMS4xLDI4LDAsMjYuOSwwLDI1LjV2LTE5QzAsNS4xLDEuMSw0LDIuNSw0aDEwLjZsMy41LDMuMWgxM2MxLjQsMCwyLjUsMS4xLDIuNSwyLjV2MTUuOUMzMiwyNi45LDMwLjksMjgsMjkuNSwyOHogTTIuNSw1QzEuNyw1LDEsNS43LDEsNi41djE5QzEsMjYuMywxLjcsMjcsMi41LDI3aDI3YzAuOCwwLDEuNS0wLjcsMS41LTEuNVY5LjZjMC0wLjgtMC43LTEuNS0xLjUtMS41SDE2LjJMMTIuNyw1SDIuNXoiLz48L2c+PC9zdmc+"); +} + +``` + +![File Manager Customization Thumbnail](./images/customize_thumbnail.png) + +## Customizing the File Manager Toolbar + +To customize the File Manager toolbar items, use the `.e-toolbar` selector and apply styles. + +```css + +.sample-container { + margin: 10px 10px 10px 10px; +} + +/* Style for individual toolbar buttons */ +.e-filemanager .e-toolbar .e-tbar-btn { + background: #0d9cf6; + border: 1px solid #000000; +} + +/* Style for toolbar icons */ +.e-filemanager .e-toolbar .e-tbar-btn .e-icons { + color: #ffffff; +} + +/* Style for toolbar button text */ +.e-filemanager .e-toolbar .e-toolbar-item .e-tbar-btn .e-tbar-btn-text { + color: #ffffff; +} + +``` + +![File Manager Customization Toolbar](./images/customize_toolbar.png) + +## Customizing the File Manager selected files/folders + +To customize the File Manager selected files/folders, use the below selectors and apply styles. + +```css + +.sample-container { + margin: 10px 10px 10px 10px; +} + +/* Highlight for active and hover item in Large Icons view */ +.e-filemanager li.e-list-item.e-large-icon.e-active, +.e-filemanager li.e-list-item.e-large-icon.e-active:hover { + background: #dee2e6; + border: 2px solid #000000; + border-radius: 10%; +} + +/* Color for text */ +.e-filemanager .e-large-icons .e-active { + color: #212529; +} + +/* Highlight for active row in Details view */ +.e-filemanager .e-grid td.e-active { + background: #dee2e6; +} + +``` + +![File Manager Customization Selected File](./images/customize_selected_file.png) + +## Customizing the File Manager Dialog + +To customize the dialog popup in the File Manager, you can apply styles to specific CSS selectors, as listed below. + +|Element|CSS Selector| +|---------|------------| +|Header|`.e-dlg-header-content`| +|Content|`.e-dlg-content`| +|Overlay|`.e-dlg-overlay`| +|Footer|`.e-footer-content`| + +```css + +.sample-container { + margin: 10px 10px 10px 10px; +} + +/* For File Manager Dialog header */ +.e-filemanager .e-dialog .e-dlg-header-content { + background-color: #0d6efd; +} +/* For File Manager Dialog header close icon and text*/ +.e-filemanager .e-dialog .e-icon-dlg-close, +.e-filemanager .e-dialog .e-dlg-header { + color: #fff; +} + + +``` +![File Manager Customization dialog](./images/customize_dialog.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/file-manager/images/customize_dialog.png b/ej2-asp-core-mvc/file-manager/images/customize_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..fe94635f266331b4b647e925baa4655624f9f7c5 GIT binary patch literal 42531 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

    ~FNS&U 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 Gp$P!jKx$Y3 literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/file-manager/images/customize_selected_file.png b/ej2-asp-core-mvc/file-manager/images/customize_selected_file.png new file mode 100644 index 0000000000000000000000000000000000000000..2e575f90e66278f61607f298cc81c49965e2262a GIT binary patch literal 37233 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�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 literal 0 HcmV?d00001 diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 9c467effec..8602782d6e 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -1095,6 +1095,7 @@

  • Virtualization
  • Access Control
  • Upload
  • +
  • Style and Appearance
  • Localization
  • Accessibility
  • How To diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index 38f043e65b..07e6654939 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -1043,6 +1043,7 @@
  • Virtualization
  • Access Control
  • Upload
  • +
  • Style and Appearance
  • Localization
  • Accessibility
  • How To From ad249d30ff70889b3c09a4b412e3fbec79f9f407 Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Tue, 14 Oct 2025 18:41:50 +0530 Subject: [PATCH 08/74] 986172: Updated review concerns. --- .../EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md index ee559f7d26..e9afa18074 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md @@ -10,7 +10,7 @@ documentation: ug # Integrate LLM via Ollama with ASP.NET MVC AI AssistView control -The AI AssistView control integrates with [LLM via Ollama](https://ollama.com),to enable advanced conversational AI features in your ASP.NET MVC application. The control acts as a user interface where user prompts are sent to the selected LLM model via API calls, providing natural language understanding and context-aware responses. +The AI AssistView control integrates with [LLM via Ollama](https://ollama.com) to enable advanced conversational AI features in your ASP.NET MVC application. The control acts as a user interface where user prompts are sent to the selected LLM model via API calls, providing natural language understanding and context-aware responses. ## Prerequisites @@ -26,6 +26,10 @@ Before starting, ensure you have the following: Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. +## Install Dependency + +To install the marked library, run `npm install marked --save` in your project directory to add it as a dependency in your package.json file. + ## Configuring Ollama Install the LLM Model package in the application using Package Manager Console. From 08c6fec4e51876b9af17b847e698a5a50f82ab3c Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Tue, 14 Oct 2025 20:28:21 +0530 Subject: [PATCH 09/74] Update ollama-llm-integration.md --- .../EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md index e9afa18074..d4a0f9bf3b 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md @@ -16,7 +16,7 @@ The AI AssistView control integrates with [LLM via Ollama](https://ollama.com) t Before starting, ensure you have the following: -* [Ollama](https://ollama.com) Installed to run and manage LLM models locally. +* [Ollama](https://ollama.com) installed to run and manage LLM models locally. * **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) installed. From 36d39a955671f75624ee99f455d09f78980e8949 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Tue, 14 Oct 2025 20:46:24 +0530 Subject: [PATCH 10/74] Update ollama-llm-integration.md --- .../EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md index d4a0f9bf3b..079305de41 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/ollama-llm-integration.md @@ -28,7 +28,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide ## Install Dependency -To install the marked library, run `npm install marked --save` in your project directory to add it as a dependency in your package.json file. +To install the Markdig package by run `NuGet\Install-Package Markdig` in Package Manager Console. ## Configuring Ollama From 7a2d0349a45558ed5067eae3a73750c599de53c4 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Tue, 14 Oct 2025 20:48:01 +0530 Subject: [PATCH 11/74] Update ollama-llm-integration.md --- .../ai-integrations/ollama-llm-integration.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md index e833e81fd6..3a7403ca0e 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/ollama-llm-integration.md @@ -10,13 +10,13 @@ documentation: ug # Integrate LLM via Ollama with ASP.NET Core AI AssistView control -The AI AssistView control integrates with [LLM via Ollama](https://ollama.com),to enable advanced conversational AI features in your ASP.NET Core application. The control acts as a user interface where user prompts are sent to the selected LLM model via API calls, providing natural language understanding and context-aware responses. +The AI AssistView control integrates with [LLM via Ollama](https://ollama.com) to enable advanced conversational AI features in your ASP.NET Core application. The control acts as a user interface where user prompts are sent to the selected LLM model via API calls, providing natural language understanding and context-aware responses. ## Prerequisites Before starting, ensure you have the following: -* [Ollama](https://ollama.com) Installed to run and manage LLM models locally. +* [Ollama](https://ollama.com) installed to run and manage LLM models locally. * **Syncfusion AI AssistView**: Package [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) installed. @@ -25,6 +25,10 @@ Before starting, ensure you have the following: ## Set Up the AI AssistView control Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. + +## Install Dependency + +To install the Markdig package by run `NuGet\Install-Package Markdig` in Package Manager Console. ## Configuring Ollama From 04a23a2747b546386cc3556fb53c3b30da6230b3 Mon Sep 17 00:00:00 2001 From: Deepak Raj Sundar Date: Tue, 14 Oct 2025 22:06:05 +0530 Subject: [PATCH 12/74] Added the release notes MD file and corresponding node entry in the TOC.html file --- ej2-asp-core-mvc/Release-notes/31.2.2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ej2-asp-core-mvc/Release-notes/31.2.2.md b/ej2-asp-core-mvc/Release-notes/31.2.2.md index 45e681115e..86e38e8eb2 100644 --- a/ej2-asp-core-mvc/Release-notes/31.2.2.md +++ b/ej2-asp-core-mvc/Release-notes/31.2.2.md @@ -7,7 +7,7 @@ documentation: ug # Essential Studio for ##Platform_Name## - v31.2.2 Release Notes -{% include release-info.html date="October 14, 2025" version="v31.2.2" passed="63079" failed="0" %} +{% include release-info.html date="October 15, 2025" version="v31.2.2" passed="63079" failed="0" %} {% directory path: _includes/release-notes/v31.2.2 %} From 7757d9f1295d05d30d35943b7c565de781ab041d Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Wed, 15 Oct 2025 12:31:52 +0530 Subject: [PATCH 13/74] 986172: update the naming --- .../bot-integrations/integration-with-bot-framework.md | 4 ++-- .../bot-integrations/integration-with-dialogflow.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md index 9bccca5958..ee6a137f1f 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-bot-framework.md @@ -24,9 +24,9 @@ Before starting, ensure you have the following: * **Deployed Azure Bot**: A bot should be created and published using the [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0), which is accessible via an Azure App Service. Refer to Microsoft's Bot Creation Guide. -## Set Up the AI AssistView control +## Set Up the Chat UI control -Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. +Follow the Syncfusion Chat UI [Getting Started](../getting-started) guide to configure and render the Chat UI control in the application and that prerequisites are met. ## Install Dependencies diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md index 27cd2df364..46f3a99844 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/bot-integrations/integration-with-dialogflow.md @@ -24,9 +24,9 @@ Before starting, ensure you have the following: * Dialogflow Service Account with the `Dialogflow API Client` role and its JSON key file. -## Set Up the AI AssistView control +## Set Up the Chat UI control -Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. +Follow the Syncfusion Chat UI [Getting Started](../getting-started) guide to configure and render the Chat UI control in the application and that prerequisites are met. ## Install Dependencies From 0c8b14a193b9833ce641eb058e02fa6c3395aae0 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Wed, 15 Oct 2025 12:38:30 +0530 Subject: [PATCH 14/74] 986172: update naming --- .../bot-integrations/integration-with-bot-framework.md | 4 ++-- .../bot-integrations/integration-with-dialogflow.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md index a5a29b7f24..16bea1608c 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-bot-framework.md @@ -24,9 +24,9 @@ Before starting, ensure you have the following: * **Deployed Azure Bot**: A bot should be created and published using the [Microsoft Bot Framework](https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0), which is accessible via an Azure App Service. Refer to Microsoft's Bot Creation Guide. -## Set Up the AI AssistView control +## Set Up the Chat UI control -Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. +Follow the Syncfusion Chat UI [Getting Started](../getting-started) guide to configure and render the Chat UI control in the application and that prerequisites are met. ## Install Dependencies diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md index afe7e44cda..43eed110cc 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/bot-integrations/integration-with-dialogflow.md @@ -24,9 +24,9 @@ Before starting, ensure you have the following: * Dialogflow Service Account with the `Dialogflow API Client` role and its JSON key file. -## Set Up the AI AssistView control +## Set Up the Chat UI control -Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide to configure and render the AI AssistView control in the application and that prerequisites are met. +Follow the Syncfusion Chat UI [Getting Started](../getting-started) guide to configure and render the Chat UI control in the application and that prerequisites are met. ## Install Dependencies From 956a9e4e072b47a991fc4cea8bdd26c72eb0d391 Mon Sep 17 00:00:00 2001 From: KaviBharathi-SF5060 Date: Wed, 15 Oct 2025 16:40:06 +0530 Subject: [PATCH 15/74] 986985: updated the speech samples description --- .../ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md | 2 +- .../ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md | 2 +- .../ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md | 2 +- .../ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md | 2 +- .../code-snippet/ai-assistview/speech/tts/razor | 6 ++++++ .../code-snippet/ai-assistview/speech/tts/tagHelper | 7 ++++++- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md index 4de77f98ca..9f40bd899c 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md @@ -10,7 +10,7 @@ documentation: ug # Speech-to-Text in ASP.NET MVC AI AssistView -The Syncfusion ASP.NET MVC AI AssistView control supports `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API), enabling conversion of spoken words into text using the device's microphone. +The Syncfusion ASP.NET MVC AI AssistView control integrates `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API). This enables the conversion of spoken words into text using the device's microphone, allowing users to interact with the AI AssistView through voice input. ## Prerequisites diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md index 394cb71033..5d895ee35c 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/text-to-speech.md @@ -10,7 +10,7 @@ documentation: ug # Text-to-Speech in ASP.NET MVC AI AssistView -The Syncfusion TypeScript AI AssistView component supports `Text-to-Speech` (TTS) functionality using the browser's Web Speech API specifically using the [SpeechSynthesisUtterance](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance) interface to convert AI-generated response into spoken audio. +The Syncfusion TypeScript AI AssistView control integrates `Text-to-Speech` (TTS) functionality using the browser's Web Speech API, specifically the [SpeechSynthesisUtterance](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance) interface. This allows AI-generated responses to be converted into spoken audio, enhancing accessibility and user interaction. ## Prerequisites diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md index 0cc91748f4..5401f41fc3 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md @@ -10,7 +10,7 @@ documentation: ug # Speech-to-Text in ASP.NET Core AI AssistView -The Syncfusion ASP.NET Core AI AssistView control supports `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API), enabling conversion of spoken words into text using the device's microphone. +The Syncfusion ASP.NET Core AI AssistView control integrates `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API). This enables the conversion of spoken words into text using the device's microphone, allowing users to interact with the AI AssistView through voice input. ## Prerequisites diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md index a5d6cd4c8a..5a1cff60c5 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/text-to-speech.md @@ -10,7 +10,7 @@ documentation: ug # Text-to-Speech in ASP.NET Core AI AssistView -The Syncfusion TypeScript AI AssistView component supports `Text-to-Speech` (TTS) functionality using the browser's Web Speech API specifically using the [SpeechSynthesisUtterance](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance) interface to convert AI-generated response into spoken audio. +The Syncfusion TypeScript AI AssistView control integrates `Text-to-Speech` (TTS) functionality using the browser's Web Speech API, specifically the [SpeechSynthesisUtterance](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance) interface. This allows AI-generated responses to be converted into spoken audio, enhancing accessibility and user interaction. ## Prerequisites diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor index dd184a6dc8..e802edd179 100644 --- a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/razor @@ -29,10 +29,12 @@ var stopStreaming = false; var currentUtterance; + // Initializes the AIAssistView component reference when created function onCreated() { assistObj = ej.base.getComponent(document.getElementById("aiAssistView"), "aiassistview"); } + // Handles toolbar item clicks, such as clearing the conversation on refresh function toolbarItemClicked(args) { if (args.item.iconCss === 'e-icons e-refresh') { assistObj.prompts = []; @@ -40,6 +42,7 @@ } } + // Handles clicks on response toolbar items, such as copying, reading aloud, liking, or disliking the response function onResponseToolbarItemClicked(args) { const responseHtml = assistObj.prompts[args.dataIndex].response; if (responseHtml) { @@ -68,6 +71,7 @@ } } + // Streams the AI response character by character to create a typing effect async function streamResponse(response) { let lastResponse = ''; const responseUpdateRate = 10; @@ -85,6 +89,7 @@ } } + // Handles prompt requests by sending them to the server API endpoint and streaming the response function onPromptRequest(args) { // Get antiforgery token var tokenElement = document.querySelector('input[name="__RequestVerificationToken"]'); @@ -121,6 +126,7 @@ }); } + // Stops the ongoing streaming response function stopRespondingClick() { stopStreaming = true; } diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper index fdfd26e68e..dd8f2ad3f9 100644 --- a/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/speech/tts/tagHelper @@ -24,10 +24,12 @@ var stopStreaming = false; var currentUtterance; + // Initializes the AIAssistView component reference when created function onCreated() { assistObj = ej.base.getComponent(document.getElementById("aiAssistView"), "aiassistview"); } + // Handles toolbar item clicks, such as clearing the conversation on refresh function toolbarItemClicked(args) { if (args.item.iconCss === 'e-icons e-refresh') { assistObj.prompts = []; @@ -35,6 +37,7 @@ } } + // Handles clicks on response toolbar items, such as copying, reading aloud, liking, or disliking the response function onResponseToolbarItemClicked(args) { const responseHtml = assistObj.prompts[args.dataIndex].response; if (responseHtml) { @@ -63,7 +66,7 @@ } } - + // Streams the AI response character by character to create a typing effect async function streamResponse(response) { let lastResponse = ''; const responseUpdateRate = 10; @@ -81,6 +84,7 @@ } } + // Handles prompt requests by sending them to the server API endpoint and streaming the response function onPromptRequest(args) { // Get antiforgery token var tokenElement = document.querySelector('input[name="__RequestVerificationToken"]'); @@ -117,6 +121,7 @@ }); } + // Stops the ongoing streaming response function stopRespondingClick() { stopStreaming = true; } From 57419646ae494eaaeea55b6c5804a1362400cebf Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Wed, 22 Oct 2025 08:27:02 +0530 Subject: [PATCH 16/74] 988231: Added UG content and code snippet for Chat UI integration with STT. --- .../chat-ui/EJ2_ASP.MVC/speech-to-text.md | 55 +++++++ .../chat-ui/EJ2_ASP.NETCORE/speech-to-text.md | 55 +++++++ .../chat-ui/images/chatui-stt.png | Bin 0 -> 23108 bytes .../code-snippet/chat-ui/stt/razor | 144 +++++++++++++++++ .../code-snippet/chat-ui/stt/speechtotext.cs | 30 ++++ .../code-snippet/chat-ui/stt/tagHelper | 152 ++++++++++++++++++ ej2-asp-core-toc.html | 1 + ej2-asp-mvc-toc.html | 1 + 8 files changed, 438 insertions(+) create mode 100644 ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md create mode 100644 ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md create mode 100644 ej2-asp-core-mvc/chat-ui/images/chatui-stt.png create mode 100644 ej2-asp-core-mvc/code-snippet/chat-ui/stt/razor create mode 100644 ej2-asp-core-mvc/code-snippet/chat-ui/stt/speechtotext.cs create mode 100644 ej2-asp-core-mvc/code-snippet/chat-ui/stt/tagHelper diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md new file mode 100644 index 0000000000..0b67c568f0 --- /dev/null +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md @@ -0,0 +1,55 @@ +--- +layout: post +title: Speech-to-Text With ##Platform_Name## Chat UI Control | Syncfusion +description: Checkout and learn about configuration of Speech-to-Text with Azure OpenAI in ##Platform_Name## Chat UI control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Azure Open AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Speech-to-Text in ASP.NET MVC Chat UI + +The Syncfusion ASP.NET MVC Chat UI control integrates `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API). This enables the conversion of spoken words into text using the device's microphone, allowing users to interact with the Chat UI through voice input. + +## Prerequisites + +Before integrating `Speech-to-Text`, install the [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) NuGet package to use ASP.NET MVC controls in the application. + +## Set Up the Chat UI control + +Follow the Syncfusion Chat UI [Getting Started](./getting-started) guide to configure and render the Chat UI control in the application. + +## Configure Speech-to-Text + +To enable Speech-to-Text functionality in the Angular Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. + +The [SpeechToText](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/getting-started) control listens to audio input from the device’s microphone, transcribes spoken words into text, and updates the Chat UI’s editable footer with the recognized text. Once the transcription appears in the footer, users can send it as a message to others. + +### Configuration Options + +* **[`Lang`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_Lang)**: Specifies the language for speech recognition. For example: + + * `en-US` for American English + * `fr-FR` for French + +* **[`AllowInterimResults`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_AllowInterimResults)**: Set to `true` to receive real-time (interim) recognition results, or `false` to receive only final results. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/chatui/stt/razor %} +{% endhighlight %} +{% highlight c# tabtitle="SpeechToText.cs" %} +{% include code-snippet/chatui/stt/speechtotext.cs %} +{% endhighlight %} +{% endtabs %} + +![Integrating Speech-to-Text with Chat UI](images/chatui-stt.png) + +## Error Handling + +The `SpeechToText` control provides events to handle errors that may occur during speech recognition. For more information, refer to the [Error Handling](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#error-handling ) section in the documentation. + +## Browser Compatibility + +The `SpeechToText` control relies on the [Speech Recognition API](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#browser-support), which has limited browser support. Refer to the [Browser Compatibility](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#browser-support) section for detailed information. diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md new file mode 100644 index 0000000000..2f87d04232 --- /dev/null +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md @@ -0,0 +1,55 @@ +--- +layout: post +title: Speech-to-Text With ##Platform_Name## Chat UI Control | Syncfusion +description: Checkout and learn about configuration of Speech-to-Text with Azure OpenAI in ##Platform_Name## Chat UI control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Azure Open AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Speech-to-Text in ASP.NET Core Chat UI + +The Syncfusion ASP.NET Core Chat UI control integrates `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API). This enables the conversion of spoken words into text using the device's microphone, allowing users to interact with the Chat UI through voice input. + +## Prerequisites + +Before integrating `Speech-to-Text`, install the [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) NuGet package to use ASP.NET Core controls in the application. + +## Set Up the Chat UI control + +Follow the Syncfusion Chat UI [Getting Started](./getting-started) guide to configure and render the Chat UI control in the application. + +## Configure Speech-to-Text + +To enable Speech-to-Text functionality in the Angular Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. + +The [SpeechToText](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/getting-started) control listens to audio input from the device’s microphone, transcribes spoken words into text, and updates the Chat UI’s editable footer with the recognized text. Once the transcription appears in the footer, users can send it as a message to others. + +### Configuration Options + +* **[`lang`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_Lang)**: Specifies the language for speech recognition. For example: + + * `en-US` for American English + * `fr-FR` for French + +* **[`allowInterimResults`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_AllowInterimResults)**: Set to `true` to receive real-time (interim) recognition results, or `false` to receive only final results. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/chatui/stt/tagHelper %} +{% endhighlight %} +{% highlight c# tabtitle="Gemini.cs" %} +{% include code-snippet/chatui/stt/speechtotext.cs %} +{% endhighlight %} +{% endtabs %} + +![Integrating Speech-to-Text with Chat UI](images/chatui-stt.png) + +## Error Handling + +The `SpeechToText` control provides events to handle errors that may occur during speech recognition. For more information, refer to the [Error Handling](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/speech-recognition#error-handling) section in the documentation. + +## Browser Compatibility + +The `SpeechToText` control relies on the [Speech Recognition API](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition), which has limited browser support. Refer to the [Browser Compatibility](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/speech-recognition#browser-support) section for detailed information. diff --git a/ej2-asp-core-mvc/chat-ui/images/chatui-stt.png b/ej2-asp-core-mvc/chat-ui/images/chatui-stt.png new file mode 100644 index 0000000000000000000000000000000000000000..215da92a787b0ea25886d5bf2ddd1f795d2dad90 GIT binary patch literal 23108 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 + @Html.EJS().ChatUI("chatui").Created("onCreate").FooterTemplate("#footerContent").Messages(ViewBag.ChatMessagesData).User(ViewBag.CurrentUser).Render() + + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/stt/speechtotext.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/stt/speechtotext.cs new file mode 100644 index 0000000000..3ff60f18f6 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/stt/speechtotext.cs @@ -0,0 +1,30 @@ +using Syncfusion.EJ2.InteractiveChat; + +public ChatUIUser CurrentUser { get; set; } +public List ChatMessagesData { get; set; } = new List(); +public ChatUIUser CurrentUserModel { get; set; } = new ChatUIUser() { Id = "user1", User = "Albert" }; +public ChatUIUser MichaleUserModel { get; set; } = new ChatUIUser() { Id = "user2", User = "Michale Suyama" }; + +public ActionResult SpeechToText() +{ + CurrentUser = CurrentUserModel; + ChatMessagesData.Add(new ChatUIMessage() + { + Text = "Hi Michale, are we on track for the deadline?", + Author = CurrentUserModel + }); + ChatMessagesData.Add(new ChatUIMessage() + { + Text = "Yes, the design phase is complete.", + Author = MichaleUserModel + }); + ChatMessagesData.Add(new ChatUIMessage() + { + Text = "I’ll review it and send feedback by today.", + Author = CurrentUserModel + }); + ViewBag.ChatMessagesData = ChatMessagesData; + ViewBag.CurrentUser = CurrentUser; + ViewBag.MichaleUser = MichaleUserModel; + return View(); +} diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/stt/tagHelper b/ej2-asp-core-mvc/code-snippet/chat-ui/stt/tagHelper new file mode 100644 index 0000000000..1b7024e9b9 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/stt/tagHelper @@ -0,0 +1,152 @@ +@using Syncfusion.EJ2.InteractiveChat +@using Newtonsoft.Json; + +
    + + + + @foreach (var message in ViewBag.ChatMessagesData) + { + + } + + +
    + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 08708f5284..2479b95cf5 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -600,6 +600,7 @@
  • Header
  • Footer
  • Templates
  • +
  • Speech to Text
  • Appearance
  • Globalization
  • Accessibility
  • diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index 03ee566818..82df6d53ef 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -603,6 +603,7 @@
  • Header
  • Footer
  • Templates
  • +
  • Speech to Text
  • Appearance
  • Globalization
  • Accessibility
  • From 76e0aa742785b2ca6839cb06430e98a074585bed Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Wed, 22 Oct 2025 08:53:29 +0530 Subject: [PATCH 17/74] 988231: Added UG content and code snippet for Chat UI integration with STT. --- ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md | 4 ++-- ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md index 0b67c568f0..0db5d83798 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md @@ -37,10 +37,10 @@ The [SpeechToText](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to- {% tabs %} {% highlight razor tabtitle="CSHTML" %} -{% include code-snippet/chatui/stt/razor %} +{% include code-snippet/chat-ui/stt/razor %} {% endhighlight %} {% highlight c# tabtitle="SpeechToText.cs" %} -{% include code-snippet/chatui/stt/speechtotext.cs %} +{% include code-snippet/chat-ui/stt/speechtotext.cs %} {% endhighlight %} {% endtabs %} diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md index 2f87d04232..6b3f9c072a 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md @@ -37,10 +37,10 @@ The [SpeechToText](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to {% tabs %} {% highlight razor tabtitle="CSHTML" %} -{% include code-snippet/chatui/stt/tagHelper %} +{% include code-snippet/chat-ui/stt/tagHelper %} {% endhighlight %} {% highlight c# tabtitle="Gemini.cs" %} -{% include code-snippet/chatui/stt/speechtotext.cs %} +{% include code-snippet/chat-ui/stt/speechtotext.cs %} {% endhighlight %} {% endtabs %} From 6ef28833b19331b24d4aa90202a98357ca2f3a13 Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:23:01 +0530 Subject: [PATCH 18/74] 988231: Updated review concerns. --- .../EJ2_ASP.MVC/speech/speech-to-text.md | 21 ++++++++++++++++++- .../EJ2_ASP.NETCORE/speech/speech-to-text.md | 21 ++++++++++++++++++- .../chat-ui/EJ2_ASP.MVC/speech-to-text.md | 6 +++++- .../chat-ui/EJ2_ASP.NETCORE/speech-to-text.md | 6 +++++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md index 9f40bd899c..5f7768a727 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/speech/speech-to-text.md @@ -24,7 +24,18 @@ Before integrating `Speech-to-Text`, ensure the following: ## Configure Speech-to-Text -To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorporate the Web Speech API. The [SpeechToText](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/getting-started) control listens for microphone input, transcribes spoken words, and updates the AI AssistView's editable footer with the transcribed text. The transcribed text is then sent as a prompt to the Azure OpenAI service via the AI AssistView control. +To enable Speech-to-Text functionality in the ASP.NET MVC AssistView control, update the `index.cshtml` file to incorporate the Web Speech API. + +The [SpeechToText](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/getting-started) control listens to audio input from the device’s microphone, transcribes spoken words into text, and updates the AssistView’s editable footer with the recognized text. Once the transcription appears in the footer, users can send it as a message to others. + +### Configuration Options + +* **[`Lang`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_Lang)**: Specifies the language for speech recognition. For example: + + * `en-US` for American English + * `fr-FR` for French + +* **[`AllowInterimResults`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_AllowInterimResults)**: Set to `true` to receive real-time (interim) recognition results, or `false` to receive only final results. {% tabs %} {% highlight razor tabtitle="CSHTML" %} @@ -37,6 +48,14 @@ To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorp ![Integrating Speech-to-Text with AI AssistView](images/aiassist-stt.png) +## Error Handling + +The `SpeechToText` control provides events to handle errors that may occur during speech recognition. For more information, refer to the [Error Handling](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#error-handling ) section in the documentation. + +## Browser Compatibility + +The `SpeechToText` control relies on the [Speech Recognition API](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#browser-support), which has limited browser support. Refer to the [Browser Compatibility](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#browser-support) section for detailed information. + ## See Also * [Text-to-Speech](./text-to-speech) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md index 5401f41fc3..cb37c706de 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/speech/speech-to-text.md @@ -24,7 +24,18 @@ Before integrating `Speech-to-Text`, ensure the following: ## Configure Speech-to-Text -To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorporate the Web Speech API. The [SpeechToText](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/getting-started) control listens for microphone input, transcribes spoken words, and updates the AI AssistView's editable footer with the transcribed text. The transcribed text is then sent as a prompt to the Azure OpenAI service via the AI AssistView control. +To enable Speech-to-Text functionality in the ASP.NET Core AssistView control, update the `index.cshtml` file to incorporate the Web Speech API. + +The [SpeechToText](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/getting-started) control listens to audio input from the device’s microphone, transcribes spoken words into text, and updates the AssistView’s editable footer with the recognized text. Once the transcription appears in the footer, users can send it as a message to others. + +### Configuration Options + +* **[`lang`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_Lang)**: Specifies the language for speech recognition. For example: + + * `en-US` for American English + * `fr-FR` for French + +* **[`allowInterimResults`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.Inputs.SpeechToText.html#Syncfusion_EJ2_Inputs_SpeechToText_AllowInterimResults)**: Set to `true` to receive real-time (interim) recognition results, or `false` to receive only final results. {% tabs %} {% highlight razor tabtitle="CSHTML" %} @@ -37,6 +48,14 @@ To enable Speech-to-Text functionality, modify the `Index.cshtml` file to incorp ![Integrating Speech-to-Text with AI AssistView](images/aiassist-stt.png) +## Error Handling + +The `SpeechToText` control provides events to handle errors that may occur during speech recognition. For more information, refer to the [Error Handling](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/speech-recognition#error-handling) section in the documentation. + +## Browser Compatibility + +The `SpeechToText` control relies on the [Speech Recognition API](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition), which has limited browser support. Refer to the [Browser Compatibility](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/speech-recognition#browser-support) section for detailed information. + ## See Also * [Text-to-Speech](./text-to-speech) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md index 0db5d83798..d28d23f7b3 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md @@ -22,7 +22,7 @@ Follow the Syncfusion Chat UI [Getting Started](./getting-started) guide to conf ## Configure Speech-to-Text -To enable Speech-to-Text functionality in the Angular Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. +To enable Speech-to-Text functionality in the ASP.NET MVC Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. The [SpeechToText](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/getting-started) control listens to audio input from the device’s microphone, transcribes spoken words into text, and updates the Chat UI’s editable footer with the recognized text. Once the transcription appears in the footer, users can send it as a message to others. @@ -53,3 +53,7 @@ The `SpeechToText` control provides events to handle errors that may occur durin ## Browser Compatibility The `SpeechToText` control relies on the [Speech Recognition API](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#browser-support), which has limited browser support. Refer to the [Browser Compatibility](https://ej2.syncfusion.com/aspnetmvc/documentation/speech-to-text/speech-recognition#browser-support) section for detailed information. + +## See Also + +* [Messages](./messages) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md index 6b3f9c072a..16bf032294 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md @@ -22,7 +22,7 @@ Follow the Syncfusion Chat UI [Getting Started](./getting-started) guide to conf ## Configure Speech-to-Text -To enable Speech-to-Text functionality in the Angular Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. +To enable Speech-to-Text functionality in the ASP.NET Core Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. The [SpeechToText](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/getting-started) control listens to audio input from the device’s microphone, transcribes spoken words into text, and updates the Chat UI’s editable footer with the recognized text. Once the transcription appears in the footer, users can send it as a message to others. @@ -53,3 +53,7 @@ The `SpeechToText` control provides events to handle errors that may occur durin ## Browser Compatibility The `SpeechToText` control relies on the [Speech Recognition API](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition), which has limited browser support. Refer to the [Browser Compatibility](https://ej2.syncfusion.com/aspnetcore/documentation/speech-to-text/speech-recognition#browser-support) section for detailed information. + +## See Also + +* [Messages](./messages) From 116ed2ddc5abe4d9e59b1508ec7c328488bbb9a6 Mon Sep 17 00:00:00 2001 From: VigneshwaranGovindharajan <111413464+VigneshwaranGovindharajan@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:25:36 +0530 Subject: [PATCH 19/74] 988231: Updated review concerns. --- ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md | 8 -------- .../chat-ui/EJ2_ASP.NETCORE/speech-to-text.md | 8 -------- 2 files changed, 16 deletions(-) diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md index d28d23f7b3..450e742ddf 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/speech-to-text.md @@ -12,14 +12,6 @@ documentation: ug The Syncfusion ASP.NET MVC Chat UI control integrates `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API). This enables the conversion of spoken words into text using the device's microphone, allowing users to interact with the Chat UI through voice input. -## Prerequisites - -Before integrating `Speech-to-Text`, install the [Syncfusion.EJ2.MVC5](https://www.nuget.org/packages/Syncfusion.EJ2.MVC5) NuGet package to use ASP.NET MVC controls in the application. - -## Set Up the Chat UI control - -Follow the Syncfusion Chat UI [Getting Started](./getting-started) guide to configure and render the Chat UI control in the application. - ## Configure Speech-to-Text To enable Speech-to-Text functionality in the ASP.NET MVC Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md index 16bf032294..c9b4c8f572 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/speech-to-text.md @@ -12,14 +12,6 @@ documentation: ug The Syncfusion ASP.NET Core Chat UI control integrates `Speech-to-Text` functionality through the browser's [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API). This enables the conversion of spoken words into text using the device's microphone, allowing users to interact with the Chat UI through voice input. -## Prerequisites - -Before integrating `Speech-to-Text`, install the [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core) NuGet package to use ASP.NET Core controls in the application. - -## Set Up the Chat UI control - -Follow the Syncfusion Chat UI [Getting Started](./getting-started) guide to configure and render the Chat UI control in the application. - ## Configure Speech-to-Text To enable Speech-to-Text functionality in the ASP.NET Core Chat UI control, update the `index.cshtml` file to incorporate the Web Speech API. From 2e2652c8d39238ea9a62ba3e31ae3af15fef203f Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Wed, 22 Oct 2025 15:18:51 +0530 Subject: [PATCH 20/74] 986172: added bullet instead for numbers in list --- .../EJ2_ASP.MVC/ai-integrations/gemini-integration.md | 4 ++-- .../EJ2_ASP.MVC/ai-integrations/openai-integration.md | 4 ++-- .../EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md | 4 ++-- .../EJ2_ASP.NETCORE/ai-integrations/openai-integration.md | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md index 7fb68f5cdb..0da00004de 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/gemini-integration.md @@ -26,7 +26,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide ## Install Dependencies -1. Install the `Gemini AI` nuget package in the application. +* Install the `Gemini AI` nuget package in the application. ```bash @@ -34,7 +34,7 @@ NuGet\Install-Package Mscc.GenerativeAI ``` -2. Install the `Markdig` nuget packages in the application. +* Install the `Markdig` nuget packages in the application. ```bash diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md index bf6bb87746..f6d10b371d 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.MVC/ai-integrations/openai-integration.md @@ -30,7 +30,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide Install the required packages: -1. Install the `OpenAI` and `Azure` nuget packages in the application. +* Install the `OpenAI` and `Azure` nuget packages in the application. ```bash @@ -40,7 +40,7 @@ NuGet\Install-Package Azure.Core ``` -2. Install the `Markdig` nuget packages in the application. +* Install the `Markdig` nuget packages in the application. ```bash diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md index b2927f46d9..fd44a4e381 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/gemini-integration.md @@ -26,7 +26,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide ## Install Dependencies -1. Install the `Gemini AI` nuget package in the application. +* Install the `Gemini AI` nuget package in the application. ```bash @@ -34,7 +34,7 @@ NuGet\Install-Package Mscc.GenerativeAI ``` -2. Install the `Markdig` nuget packages in the application. +* Install the `Markdig` nuget packages in the application. ```bash diff --git a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md index 4d98aea12a..a2ea863006 100644 --- a/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/ai-assistview/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md @@ -30,7 +30,7 @@ Follow the Syncfusion AI AssistView [Getting Started](../getting-started) guide Install the required packages: -1. Install the `OpenAI` and `Azure` nuget packages in the application. +* Install the `OpenAI` and `Azure` nuget packages in the application. ```bash @@ -40,7 +40,7 @@ NuGet\Install-Package Azure.Core ``` -2. Install the `Markdig` nuget packages in the application. +* Install the `Markdig` nuget packages in the application. ```bash From 5d2baa00c071a80e92339a7665b5f40e216cba71 Mon Sep 17 00:00:00 2001 From: Arun Kumar Ragu Date: Thu, 23 Oct 2025 13:46:14 +0530 Subject: [PATCH 21/74] 988638: Updated the docs for usage of MCP Server --- .../ai-coding-assistants/mcp-server.md | 240 ++++++++++++++++++ .../ai-coding-assistants/overview.md | 70 +++++ .../EJ2_ASP.NETCORE/introduction.md | 2 + ej2-asp-core-toc.html | 6 + 4 files changed, 318 insertions(+) create mode 100644 ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/mcp-server.md create mode 100644 ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/overview.md diff --git a/ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/mcp-server.md b/ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/mcp-server.md new file mode 100644 index 0000000000..660d0b40d4 --- /dev/null +++ b/ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/mcp-server.md @@ -0,0 +1,240 @@ +--- +layout: post +title: SyncfusionAspNetCoreAssistant MCP Server | Syncfusion +description: Learn how to configure and use SyncfusionAspNetCoreAssistant MCP server for intelligent code generation, documentation, and troubleshooting in ASP.NET Core apps. +control: Getting started with SyncfusionAspNetCoreAssistant MCP Server +platform: ej2-asp-core-mvc +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# SyncfusionAspNetCoreAssistant MCP Server + +## Overview + +The [SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant) is a specialized [Model Context Protocol (MCP)](https://modelcontextprotocol.io/docs/getting-started/intro) server that provides intelligent assistance for developers using Syncfusion's ASP.NET Core controls. This tool seamlessly integrates with compatible [MCP clients](https://modelcontextprotocol.io/clients) to enhance your development workflow when building ASP.NET Core applications with Syncfusion® controls. + +### Key Benefits + +* Intelligent code generation for Syncfusion® ASP.NET Core controls. +* Detailed documentation and usage examples. +* Troubleshooting assistance for common integration challenges. + +## Prerequisites + +Before using [SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant), ensure you have: + +* Required [node](https://nodejs.org/en/) version >= 18 +* A [compatible MCP client](https://modelcontextprotocol.io/clients) (Visual Studio Code with GitHub Copilot, [Syncfusion® CodeStudio](https://www.syncfusion.com/code-studio/), etc.) +* An active Syncfusion® license (any of the following): + - [Commercial License](https://www.syncfusion.com/sales/unlimitedlicense) + - [Free Community License](https://www.syncfusion.com/products/communitylicense) + - [Free Trial](https://www.syncfusion.com/account/manage-trials/start-trials) +* An active [API KEY](https://syncfusion.com/account/api-key) + +## Unlimited Access + +Syncfusion® offers unlimited access to this MCP server. There are no restrictions on: + +* Number of requests +* Components usage +* Query types +* Usage duration + +This ensures users can fully leverage Syncfusion® controls to enhance their development experience without limitations. + +## Installation and setup + +Before you can invoke the `SyncfusionAspNetCoreAssistant` MCP server, you need to configure your MCP client with these core settings. The **Generic MCP Server Settings** shown below are identical across all clients: + +### Generic MCP Server Settings + +- **npm package name**: `@syncfusion/aspnetcore-assistant` +- **Type**: stdio (standard input/output transport) +- **Command**: npx +- **Arguments**: -y +- **Server name**: SyncfusionAspNetCoreAssistant + +You need to add your [Syncfusion API key](https://syncfusion.com/account/api-key) as an env parameter in the configuration file: + +```json +"env": { + "Syncfusion_API_Key": "YOUR_API_KEY" +} +``` + +[SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant) can be configured in various MCP clients. Below are setup instructions for popular environment: + +### Syncfusion® Code Studio + +* In [Code Studio](https://www.syncfusion.com/code-studio/), open MCP Marketplace, find `SyncfusionAspNetCoreAssistant`, and click Install. +* When prompted, enter your [Syncfusion API key](https://syncfusion.com/account/api-key) and click Submit to register. +* It installs locally on your machine and appears in the Installed list. +* The server is ready for use in Code Studio. + +For additional details, see the Code Studio [documentation](https://help.syncfusion.com/code-studio/reference/configure-properties/mcp/marketplace). + +### Visual Studio Code (GitHub Copilot MCP) + +1. To configure an MCP server for a specific workspace, you can create a `.vscode/mcp.json` file in your workspace folder. + +```json +{ + "servers": { + "syncfusion-aspnetcore-assistant": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@syncfusion/aspnetcore-assistant@latest" + ], + "env": { + "Syncfusion_API_Key": "YOUR_API_KEY" + } + } + } +} +``` + +2. After updating the configuration in settings.json, you'll notice a "Start" option at the top of the config. This allows you to easily start the [SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant) server directly from the settings interface without additional commands. + +3. Confirm that [SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant) is being used (this does not happen automatically). Look for a statement in the output, which is similar to: + * `SyncfusionAspNetCoreAssistant is running...` (in Visual Studio Code) + +### Visual Studio (GitHub Copilot MCP) + +* To configure an MCP server for a specific workspace, you can create a `.vs/mcp.json` file in your workspace folder. + +```json +{ + "servers": { + "syncfusion-aspnetcore-assistant": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@syncfusion/aspnetcore-assistant@latest" + ], + "env": { + "Syncfusion_API_Key": "YOUR_API_KEY" + } + } + } +} +``` + +* After updating the mcp.json configuration, open the GitHub Copilot Chat window. Click the Ask arrow, then select Agent. +* Select the [SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant) from the tools section. +* For more details, refer to the official [Visual Studio documentation](https://learn.microsoft.com/en-us/visualstudio/ide/mcp-servers?view=vs-2022). + + +### Cursor + +To configure an MCP server for a specific workspace, you can create a .cursor/mcp.json file in your workspace folder. + +```json +{ + "mcpServers": { + "syncfusion-aspnetcore-assistant": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@syncfusion/aspnetcore-assistant@latest" + ], + "env": { + "Syncfusion_API_Key": "YOUR_API_KEY" + } + } + } +} +``` + +### JetBrains IDEs + +1. Go to Settings -> Tools -> AI Assistant -> Model Context Protocol (MCP). +2. Click + Add to add a new MCP server configuration. +3. In the New MCP Server dialog, switch the dropdown as `As JSON` and add the following config: + +```json +{ + "mcpServers": { + "syncfusion-aspnetcore-assistant": { + "command": "npx", + "args": [ + "-y", + "@syncfusion/aspnetcore-assistant@latest" + ], + "env": { + "Syncfusion_API_Key": "YOUR_API_KEY" + } + } + } +} +``` + +4. Click OK and Apply. + +> For more detailed information about configuring MCP servers in various clients, refer to the official documentations. + * [Visual Studio Code](https://code.visualstudio.com/docs/copilot/chat/mcp-servers#_add-an-mcp-server) + * [Cursor](https://cursor.com/docs/context/mcp#using-mcp-json) + * [JetBrains](https://www.jetbrains.com/help/ai-assistant/mcp.html#connect-to-an-mcp-server) + * [Windsurf](https://docs.windsurf.com/windsurf/cascade/mcp#mcp-config-json) + +## Usage + +To activate the SyncfusionAspNetCoreAssistant MCP server: + +1. Start your prompt with one of the following: + * 'SyncfusionAspNetCoreAssistant' + * '/syncfusion-aspnetcore-assistant' + * '/syncfusion-aspnetcore' + * '@syncfusion-aspnetcore' + * '@ask_syncfusion_aspnetcore' + * 'ej2-aspnetcore' + + In Visual Studio Code, you can also use #SyncfusionAspNetCoreAssistant to explicitly invoke the MCP server. + +2. Grant the SyncfusionAspNetCoreAssistant MCP server a permission to run for this session, workspace, or always. +3. For best results, start a new chat for each new topic to maintain clean context. + +### Mode availability + +Syncfusion® MCP Servers provide full access to all AI interaction modes — Ask/Chat, Edit, and Agent — across supported MCP clients. + +### Best Practices for Effective Usage + +1. `Be specific`: Mention both platform and control (e.g., "How do I create a Syncfusion ASP.NET Core Grid with paging and filtering?"). +2. `Provide context`: Include details about your use case for more targeted solutions. +3. `Use descriptive queries`: Avoid vague questions that lack necessary context. +4. `Start fresh for new topics`: Begin a new chat session when switching components or topics. + +### Example Queries + +Here are some effective ways to use [SyncfusionAspNetCoreAssistant](https://www.npmjs.com/package/@syncfusion/aspnetcore-assistant): + + * "Create a Syncfusion ASP.NET Core Grid control with paging, sorting and filtering" + * "How do I implement data binding with Syncfusion ASP.NET Core scheduler?" + * "Show me how to create a dashboard with multiple Syncfusion controls" + +## Troubleshooting + +If you encounter issues: + + * Verify your API key is correctly configured. + * Ensure the MCP server is enabled in your client's tools selection. + * Check that you're using a compatible MCP client version. + * Try restarting your development environment. + +## Support + +Product support is available through the following mediums. + +* [Support ticket](https://support.syncfusion.com/support/tickets/create) - Guaranteed Response in 24 hours \| Unlimited tickets \| Holiday support +* [Community forum](https://www.syncfusion.com/forums/aspnetcore-js2) +* [Request feature or report bug](https://www.syncfusion.com/feedback/aspnet-core) +* Live chat + +## See also + +* [Syncfusion ASP.NET Core Documentation](https://ej2.syncfusion.com/aspnetcore/documentation/getting-started/razor-pages) \ No newline at end of file diff --git a/ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/overview.md b/ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/overview.md new file mode 100644 index 0000000000..e722cf0f88 --- /dev/null +++ b/ej2-asp-core-mvc/EJ2_ASP.NETCORE/ai-coding-assistants/overview.md @@ -0,0 +1,70 @@ +--- +layout: post +title: Syncfusion AI Coding Assistants Overview | Syncfusion +description: Learn how Syncfusion AI Coding Assistants boost ASP.NET Core productivity by generating accurate code snippets, configuration examples, and contextual guidance. +control: Syncfusion AI Coding Assistants Overview +platform: ej2-asp-core-mvc +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Syncfusion® AI Coding Assistants Overview + +The **Syncfusion® AI Coding Assistants** are designed to streamline your development workflow when building ASP.NET Core applications with Syncfusion® controls. It uses contextual knowledge of the Syncfusion® UI library to generate accurate code snippets, configuration examples, and guided explanations—minimizing documentation searches and maximizing productivity. + +AI Coding Assistants: + +* **The SyncfusionAspNetCoreAssistant MCP Server** + Processes advanced prompts and returns tailored code suggestions via [MCP-compatible clients](https://modelcontextprotocol.io/clients). + +## Getting Started + +To use the AI Coding Assistants, you need: + +* A [Syncfusion® user account](https://www.syncfusion.com/account) +* An active Syncfusion® license (any of the following): + - [Commercial License](https://www.syncfusion.com/sales/unlimitedlicense) + - [Free Community License](https://www.syncfusion.com/products/communitylicense) + - [Free Trial](https://www.syncfusion.com/account/manage-trials/start-trials) +* An active [API KEY](https://syncfusion.com/account/api-key) +* A [ASP.NET Core application that includes SyncfusionAspNetCore](https://ej2.syncfusion.com/aspnetcore/documentation/getting-started/razor-pages) + +## Unlimited Access + +Syncfusion® offers unlimited access to the AI Coding Assistants, with no limitations on: + +* Number of requests +* Components usage +* Query types +* Usage duration + +This ensures users can fully leverage Syncfusion® components to enhance their development experience without limitations. + +## Best Practices + +* Initial Setup: Use the tools to quickly add and configure Syncfusion® controls in your ASP.NET Core application. +* Feature Tuning: Enable or disable component features through prompt-based configuration for tailored functionality. +* Data Binding: Generate sample data for testing and prototyping. Avoid using sensitive or production data to ensure security. +* Step-by-step explanations: Use annotated code to understand component behavior. Note that the level of detail may vary depending on the tool, mode, and AI model used. Refer to the [Syncfusion® ASP.NET Core Documentation](https://ej2.syncfusion.com/aspnetcore/documentation/getting-started/razor-pages) for in-depth information. +* Troubleshooting: Resolve common issues with AI-generated suggestions. For complex problems, refer to [documentation](https://ej2.syncfusion.com/aspnetcore/documentation/getting-started/razor-pages) or [support](https://support.syncfusion.com/support/tickets/create). + +> Always check AI-generated content and code for accuracy before using it. + +## Recommendations + +* Session Management: Start new sessions when switching tasks to ensure prompt relevance and maintain content focus. +* Model Compatibility: For optimal performance, use the tools with advanced AI models such as GPT-5 or Claude Sonnet 4. + +## Privacy & Data Handling + +The Syncfusion® AI Coding Assistants is designed with privacy in mind: + +* The tools do not access your project files or workspace directly. +* User prompts are not stored by any of the tools or used for any other purpose. +* Prompts are not used to train Syncfusion® models. +* The assistant generates context, while the final output is handled by your selected AI model. + +## See also + +* Add the [SyncfusionAspNetCore MCP Server](./mcp-server.md) to an MCP-enabled client +* [Syncfusion® ASP.NET Core Documentation](https://ej2.syncfusion.com/aspnetcore/documentation/getting-started/razor-pages) \ No newline at end of file diff --git a/ej2-asp-core-mvc/EJ2_ASP.NETCORE/introduction.md b/ej2-asp-core-mvc/EJ2_ASP.NETCORE/introduction.md index ede23c88a0..71613044b5 100644 --- a/ej2-asp-core-mvc/EJ2_ASP.NETCORE/introduction.md +++ b/ej2-asp-core-mvc/EJ2_ASP.NETCORE/introduction.md @@ -12,6 +12,8 @@ documentation: ug Essential® JS 2 for ASP.NET Core is a modern enterprise UI toolkit that has been built from the ground up to be lightweight, responsive, modular and touch friendly. It is also available in other frameworks such as JavaScript and Angular, React. +> **Ready to streamline your Syncfusion® ASP.NET Core development?** Discover the full potential of Syncfusion® ASP.NET Core controls with Syncfusion® AI Developer Tools. Effortlessly integrate, configure, and enhance your projects with intelligent, context-aware code suggestions, streamlined setups, and real-time insights—all seamlessly integrated into your preferred AI-powered IDEs like Visual Studio, Visual Studio Code, Cursor, Syncfusion® CodeStudio and more. [Explore Syncfusion® AI Developer Tools](https://ej2.syncfusion.com/aspnetcore/documentation/ai-coding-assistants/overview) + ## How to best read this user guide * The best way to get started would be to read the "Getting Started" section of the documentation for the control that you would like to start using first. The "Getting Started" guide gives just enough information that you need to know before starting to write code. This is the only section that is recommended to read end-to-end before starting to write code, all other information can be referred as needed. diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index bd3e9fc710..7f10e3ca32 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -16,6 +16,12 @@
  • Model Binding in Razor Pages
  • +
  • AI Coding Assistants + +
  • Installation