From 628d0cfba4eca128456360ff64115d3094452331 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Fri, 26 Sep 2025 21:29:14 +0530 Subject: [PATCH 1/4] 982586: conversion of OpenAI to Azure OpenAI --- .../ai-integrations/openai-integration.md | 2 +- .../ai-integrations/openai-integration.md | 2 +- .../ai-integrations/openai-integration.md | 40 +++++++++-------- .../ai-integrations/openai-integration.md | 42 ++++++++++-------- ej2-asp-core-mvc/chat-ui/images/openai.png | Bin 29201 -> 20433 bytes .../Asp.net-MVC/gemini/gemini.cs | 2 +- .../ai-integrations/Asp.net-MVC/gemini/razor | 6 +-- .../Asp.net-MVC/openai/openai.cs | 33 +++++++++----- .../ai-integrations/Asp.net-MVC/openai/razor | 8 ++-- .../Asp.net-core/gemini/gemini.cs | 2 +- .../Asp.net-core/gemini/tagHelper | 4 +- .../Asp.net-core/openai/openai.cs | 34 +++++++++----- .../Asp.net-core/openai/tagHelper | 14 +++--- ej2-asp-core-toc.html | 2 +- ej2-asp-mvc-toc.html | 2 +- 15 files changed, 107 insertions(+), 86 deletions(-) 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 2d3b85a82c..3d7d786bac 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 @@ -10,7 +10,7 @@ documentation: ug # Integration of 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 Angular applications. +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 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 bd7dab59db..5514e7bd7b 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 @@ -10,7 +10,7 @@ documentation: ug # Integration of 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 Angular applications. +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 diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/ai-integrations/openai-integration.md index 629425146d..7b03076dde 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/ai-integrations/openai-integration.md @@ -1,25 +1,25 @@ --- layout: post -title: Open AI in ##Platform_Name## Chat UI Control | Syncfusion -description: Checkout and learn about Integration of Open AI in Syncfusion ##Platform_Name## Chat UI control of Syncfusion Essential JS 2 and more. +title: Azure Open AI in ##Platform_Name## Chat UI Control | Syncfusion +description: Checkout and learn about Integration of Azure Open AI in Syncfusion ##Platform_Name## Chat UI control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc -control: Open AI +control: Azure Open AI publishingplatform: ##Platform_Name## documentation: ug --- -# Integration of Open AI With Chat UI component +# Integration of Azure Open AI With Chat UI component -The Syncfusion Chat UI supports integration with (OpenAI)[https://platform.openai.com/docs/overview], enabling advanced conversational AI features in your Asp MVC applications. +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 Chat UI Component -Before integrating Open AI, ensure that the Syncfusion Chat UI control is correctly rendered in your MVC application: +Before integrating Azure Open AI, ensure that the Syncfusion Chat UI control is correctly rendered in your MVC application: [ MVC Getting Started Guide](../getting-started) ## Prerequisites -* OpenAI account to generate an API key for accessing the `OpenAI` API +* An Azure account with access to `Azure Open AI` services and a generated API key. * Syncfusion Chat UI for MVC `Syncfusion.EJ2.MVC5` Install ASP.NET MVC package in the application. @@ -33,36 +33,40 @@ NuGet\Install-Package Syncfusion.EJ2.MVC5 ``` -Install the Open AI package in the application using the Package Manager Console. +Install the Open AI and Azure Open AI package in the application using Package Manager Console. ```bash NuGet\Install-Package OpenAI +NuGet\Install-Package Azure.AI.OpenAI +NuGet\Install-Package Azure.Core ``` ## Generate API Key -1. Go to [Open AI](https://platform.openai.com/docs/overview) and sign in with your Google account. If you don’t have one, create a new account. +1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. -2. Once logged in, click on your profile icon in the top-right corner and select `API Keys` from the dropdown menu. +2. Under Resource Management, select Keys and Endpoint to retrieve your API key and endpoint URL. -3. Click the `+ Create new secret key` button. You’ll be prompted to name the key (optional). Confirm to generate the key. +3. Copy the API key, endpoint, and deployment name (e.g., gpt-4o-mini). Ensure the API version (e.g., 2024-07-01-preview) matches your resource configuration. -4. Your API key will be displayed once. Copy it and store it securely, as it won’t be shown again. +4. Store these values securely, as they will be used in your application. -> `Security Note`: Never commit the API key to version control. Use environment variables or a secret manager for production. +> `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 -## Integration Open AI with Chat UI +## Integration Azure Open AI with Chat UI You can add the below respective files in your application: -* Add your generated `API Key` at the line +* Update the following configuration values with your Azure Open AI details: ```bash -const openaiApiKey = 'Place your API key here'; +string endpoint = "Your_Azure_OpenAI_Endpoint"; +string apiKey = "Your_Azure_OpenAI_API_Key"; +string deploymentName = "Your_Deployment_Name"; ``` @@ -75,7 +79,7 @@ const openaiApiKey = 'Place your API key here'; {% endhighlight %} {% endtabs %} -![Open AI](../../images/openai.png) +![Azure Open AI](../../images/openai.png) ## Run and Test @@ -83,4 +87,4 @@ Run the application in the browser using the following command. Build and run the app (Ctrl + F5). -Open `https://localhost:44321` to interact with your Open AI for dynamic response. \ No newline at end of file +Open `https://localhost:44321` 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.NETCORE/ai-integrations/openai-integration.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md index 41935b22d0..11ec9b6d5f 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/ai-integrations/openai-integration.md @@ -1,25 +1,25 @@ --- layout: post -title: Open AI in ##Platform_Name## Chat UI Control | Syncfusion -description: Checkout and learn about Integration of Open AI in Syncfusion ##Platform_Name## Chat UI control of Syncfusion Essential JS 2 and more. +title: Azure Open AI in ##Platform_Name## Chat UI Control | Syncfusion +description: Checkout and learn about Integration of Azure Open AI in Syncfusion ##Platform_Name## Chat UI control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc -control: Open AI +control: Azure Open AI publishingplatform: ##Platform_Name## documentation: ug --- -# Integration of Open AI With Chat UI component +# Integration of Azure Open AI With Chat UI component -The Syncfusion Chat UI supports integration with (OpenAI)[https://platform.openai.com/docs/overview], enabling advanced conversational AI features in your Asp Core applications. +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 Chat UI Component -Before integrating Open AI, ensure that the Syncfusion Chat UI control is correctly rendered in your core application: +Before integrating Azure Open AI, ensure that the Syncfusion Chat UI control is correctly rendered in your core application: [ Asp Core Getting Started Guide](../getting-started) ## Prerequisites -* OpenAI account to generate an API key for accessing the `OpenAI` API +* An Azure account with access to `Azure Open AI` services and a generated API key. * Syncfusion Chat UI for Core `Syncfusion.EJ2.AspNet.Core` Install ASP.NET Core package in the application. @@ -32,36 +32,40 @@ Install the Syncfusion ASP.NET Core package in the application using the Package NuGet\Install-Package Syncfusion.EJ2.AspNet.Core ``` -Install the Open AI package in the application using the Package Manager Console. +Install the Open AI and Azure Open AI package in the application using Package Manager Console. ```bash NuGet\Install-Package OpenAI +NuGet\Install-Package Azure.AI.OpenAI +NuGet\Install-Package Azure.Core ``` -## Generate API Key +## Configure Azure Open AI -1. Go to [Open AI](https://platform.openai.com/docs/overview) and sign in with your Google account. If you don’t have one, create a new account. +1. Log in to the [Azure Portal](https://portal.azure.com/#home) and navigate to your Azure Open AI resource. -2. Once logged in, click on your profile icon in the top-right corner and select `API Keys` from the dropdown menu. +2. Under Resource Management, select Keys and Endpoint to retrieve your API key and endpoint URL. -3. Click the `+ Create new secret key` button. You’ll be prompted to name the key (optional). Confirm to generate the key. +3. Copy the API key, endpoint, and deployment name (e.g., gpt-4o-mini). Ensure the API version (e.g., 2024-07-01-preview) matches your resource configuration. -4. Your API key will be displayed once. Copy it and store it securely, as it won’t be shown again. +4. Store these values securely, as they will be used in your application. -> `Security Note`: Never commit the API key to version control. Use environment variables or a secret manager for production. +> `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. -## Integration Open AI with Chat UI +## Integration Azure Open AI with Chat UI You can add the below respective files in your application: -* Add your generated `API Key` at the line +* Update the following configuration values with your Azure Open AI details: ```bash -const openaiApiKey = 'Place your API key here'; +string endpoint = "Your_Azure_OpenAI_Endpoint"; +string apiKey = "Your_Azure_OpenAI_API_Key"; +string deploymentName = "Your_Deployment_Name"; ``` @@ -74,7 +78,7 @@ const openaiApiKey = 'Place your API key here'; {% endhighlight %} {% endtabs %} -![Open AI](../../images/openai.png) +![Azure Open AI](../../images/openai.png) ## Run and Test @@ -82,4 +86,4 @@ Run the application in the browser using the following command. Build and run the app (Ctrl + F5). -Open `https://localhost:44321` to interact with your Open AI for dynamic response. \ No newline at end of file +Open `https://localhost:44321` 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/images/openai.png b/ej2-asp-core-mvc/chat-ui/images/openai.png index 417700cfe81c67aafd8392a737994a2de1e29bfa..3f56e695a9b30e379b691ed8748c93493e6921e4 100644 GIT binary patch literal 20433 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 X6(ubSNlLx4eE_)o`Li$F!ZQ91q$40R literal 29201 zcmdqJcUV*1*ESdn@(3apigXc>-g^fT5Rl%xNDqV-dQ}iqs&whSLqJ;Ss7MQh9s-1- zlmrMxy7W2tyw`XAzL|O7Yi9nOKe$fLIlHdC*4}H~_d0yk(oiNLq9y`?KqM+Jp6h@> z*N1>V+kb8WPY|M>*MQ44sE+b85NwEc4Y;{!FRv~S0)2@iKC>bK?r*!jFouFace}3s zuJyW>+JHdr#VXI`^?WTh=X?V7^e--Ve5l#qX( z_F&gvhJNo&CKNZ+?(;P9DD!w0D(wM?(`6mJN;~rj6onh$kwyEz02D} zpz?dT(Hmj+?Llv%+S;U2we1B%1>ckp@SofPy&3;dw>LcW4^W6tDf1eLfL4B*_A}kp z{p0I`pjOj{AO>LAE!PYlHU+I9RIHE`HfNElY-T}%O z$+=yr1=qhdDDDAmf7VR)XnZ0pu3-9bjNE58)K4D-Q;pb6 zXI08RPvNw+SG{N$B)$$R&keGsVJmbjZEJ5|SzBY*)YSCz_3i8GQfQ$Lg$}f!JTDJ~ zz3hEI&D=UoZ{?m&OeorZJzl>L*Lx=9rq2XSI?@|;3zv~`YqkG_L`#MFr{;>69Wg57 zvheJ&#;!Fi4=DLckF@G5c*Ne{Ja+J?ekJYORdlX!l#^w@e{w>`Qe>Oa3eqzHX5OUt z-GsntmE-`$S=mBOps)M6vr127 M*v4V+?L(7VVPm}R;8CR*to)}`n>BZPu(E=F zwYT4pqf`i^W@4voxuUlHpgD+x1yIr?_+9B4hpj4-i6U5dU`lF9!AEv~T!t@lHYaUC z%Jca<8E{5HH?geAcxXpivM= z-?Z*t&^df7vZXqnTPQ~jeX@C*y7g5F%P*JVetKO`u+ z7B`x={>oCnx+i#d??~5(AkHk6H{60*)|K?!-a$}$vbnJtU+Y&1gzM zR`3SHU1*gM+mvpaBd&hAf^OH>z179^QFZfZ3Hf%L8^VzrbFbQJ+tsiD=i@LDF&;U5 zsAts52e}9cP3Ta%ML@CLk!~6cK@Ga-wl9_gI=jn;6)+2$ps?>8o=>>7@ z_dw7+^6@IaH!^;?WzAINI=Lqc6LROAqa{Wl5Jww+#$n~n40tuIWU8vw3wg$@n34MB z35&{6M~kT-DfY$N1{CL1n_Rb^RoI^74Ql-l@pg5<5IHrGdo>w0Z40_Rr_x?0Yvp8r zXx8wZK9h*|-y1xh83xf=ZSl${OS^zTWF@eUj_UaDL4|)dTTw1MDtp&cUOpnv8{hUc z?2$x+UltJ2D9)9CGL>wzuHrNqH%sW1Ku`XTHNB2K9DUZi|>^&uXj^BRrZi`pf>|gHahr7$~oCrKKJmnHH~no#DEQTxh*x1r(KVC zJv@b`{rV$Iz7ya+J!ZJlUnn$u?}Uzo{K2xdONVEAxWmq}DVZ>rUYN)w+W&&~{|en(w)mFn zg=mh_Z%;3IY6%O?#G9~#ojFM$%jP41!3naClV>=$(jnbCx{@E{-wvWKH7o#^dr`^i zl6jj956?QBvSdCg!l`$@3p?P(Du=6S_$4%$-T2p#H zt$wv;f_%0=YB^IHBCoqbsjW$eq&#&tGllYuS3dy#d~yIOw2)7Dpey8E(OkFQG~1tN zBq~bMv}|~jYojtaT~PiZ7BX%OHM~vVmY3q<;{Q?8;*Lu>!~5{ku+DQ_8*R7CLUru0 zQu$&1CitjjbJAf^bNvsBzq?qRg;$U5T)BR%@5}@yMK|YT)MbGwRjLLCh8C$ftdkV- zwlAjD{eCL!P}pq^%a*{i-*2!zm0?#_rptLCbpzF)e4%_BBu5~Wr~d}91_rSW36vSR zZeHkK;(f0{^;C;>-pI(*edWwU%jej(35=A7mhOQ^QY#i%09T*Vxo1cAHA=1@^jp#1 zj>XM43@zL^+r1U!#iZ(ZEzB2Wb6LW9B>gp@I9F8rD1o7FIZEVt6sCnsPbC~I_wdwI z!=Qy?`{nTV+K5QfOdzPV23+A}?y8a&dD;GRTUTGtil=$5)+#d?FqNc*ya~AatjHe}ypR8t>`(OC%W!(_=cvY(8U0!upets94WMP9_b=XyD zKUA#5($~W0{KGUz%d4Jra`uT;;aIo0Bt}Trxt0u0OTw0I{MtIuMXl%$|C~>KqmUTh zkj$OgX7FAo8I5zTuMKMIQyt&O6$t68A1s-2PYhTlj2(=QV}w=5&dQ{PYd@EWdgC?0 z@TSUMWV=P2(rT~9;m^$E;<907#}+?E%AwQ8-OAe&!o(VwU^kih-h`DMlh7V1&#dA` zQay#!-88DSnKogIf)qN=*EWx}tm(lOWt&;+m2=YY1V>ZnUZ_i)8}}AXrJHiIS`Pta z+Fh=zgKK?Cf+&E7@@nr<*Pzizy4{75~*q4VlbQL3CaZ%YcZ8{^6MLi-yZUb$QXXq zVnld=8M2mWwQtSWK?Wrx<*75Mqgok)%hXSY5R&yd*}-<7>FK0ZH=VGn6GNzz-S)K; ze8_Hr*++yc#yrMxS?|cWN6Vxk=Ut$yQ1zi{3kU0&U>|_}03;#mh$XE2Lo}WowknZU8>{E*P%$$li z%&6D?x}~gFQ-8DIbGoc9$4{Mj=Cu%5Hp3n3hl!aIL>Z?skN`UgyV*}<43LGM@Gt%s z_Nm=PQDQDz!um!RZ|t%cNsTj{?6J2?T=~Jr%{fJd8Z{P9n^l7StOuhr=hUqt#uW*~ zht&pnEo3L^_^#K%!3RFfZF+&;b%gBIR3L0bzreMw5Rc?$TrW&? zG^zFO?14!ab06Ca`E#@>loo&9Vw?saw2Cxd%HlH(U|-IC*0-R?y@HjB57DHGpf?=F zWgXd*`r1e2!v8>5^gsNZ1-6X_l0#up%gm;QebWeLx``h3tT$2m9>&%T|R= z>?V32@UA3%DvGzD)T7QD68ULo%C$WmjiViB{M^&QFV!Y{%I8k%&vM6W}@gQgb|qQkkns;eWO$=2{|+31o+#Gv9^Nb z=W07%hNGRBM%K$bW?Q>yxce!8l?S_K4d;qGv^pJ(>ulRg($<c02H*@tyG9epiN> z+7_@1Ldx4jo2oVjY_as&_Pcv+XknuLK|JPUN`M0p-!MibG=$wIYh3w~Kj&9wS($9k zr1q(1@Ik0h&!MckBfiv01&y%9#&5q=mtLPT)C`BS`O*_DI}Y#`A4}>kHi%y~ELJJS z#;*i69GDRIZY#%%Y`=6{R~tb*@8xwA_S(==fgx^#^i?BcvlExMt6{0XZ4PRBI?7qr zR@0zZ7}1i>xj1h!%|MykQ)@J(2}KrT_#7-7!eZ+@PC4*!H>^I*r#<6f`FF-j7OM&p z<+>~vj^^XFRrlKrtDBk#tICCFO%b0 z^~kgtl(*mDbZlZhVmd@~I_yhf%iF`+cQY;UcnGtsNHDySwvM3E#4F61X|BB5t#{RN z_jVP0pC(XxCN4kjry+gH=(r(PZnp0D0Zm>{FH!$^+APkZJwsSC4CW6@65u4> zDo$jk$g5`SI))3%#!$H@3OubxJ4sWQhD3qFMQbeS_Y&G)-^CGH9~&B0XD|~;hPt=p z2dBt*L`O_kxzMc8{Va7I(jM#>_@id9?9Pc0&+6wL{;g+}_`3MeO&~8@_gK@UB}L3f zVtIvJ`&ME>^x2rTW&o&DfYs;Drgq)Wo87rB>8^M2LxQz`Zh_^rS)KrMw!>a{+N!RP zd`GI_Rv4SYPegZ$NlhD&C~BIMT}y;tmOB!QtX0~7a0%I> zI;i07zqFGUx5}mVRqMTw)EqDFC_2XHlldT|1SWODl;Xxp6j>6!%A!}bPHI%Ze`A1ciUv~Q@aI9>Q1+*(oCFS zHiGheJ7zm4yj2la?fI0k=w%|K8JPTu7@Fj_fM_z?7RE81&#wi`ZIoxOTtp2yb)1;k zS*Kjo8yl%9d8$EIg~3e5`%Ln8!;CBa#xKh|gKO1>gtsmje-Tw1HtKwcntuNPBAr(% z)JqD45Nb3)0NT=5#8(8#4VtN;t+H&^H>aG^xM$||LZ`<5+e-dG#(2G_6$#B+1E1-% zTrgEn_QOc^#Gr}B_*+6XgtY=gVjkjL(?2~!3qv64UZU!miSZ$h>9X(ZYKI+BGf#S& z&MTTPpFRl@vd}Rp4l;OH67PC-%HDJh44*ZzG^bl(G+r}V5wn^IJe?CsU{nc4uCLRT z=mW87s7=iIN~VCm`uXX*iq7U%u9?PBN%XOb-`a`4x!;``GYLQ{gnyEP1)t4WRNp#A z-4{oQK~)`%v7QeRaE9TUq7=)bfC0H() zos3Rh56({Auzph^{UyD%*Dt+^4?<73j$KB`#ZZywiKEG*$9j}|@qRvDgS9~q`LQy4 z_&iw0MWXeP4ZF-vlXQK~WVtm#UFv>IyZUj*PBZ^XMEbGqqqL8`LSOk6^NtU#YDFYv zkp8#I(Lt$e0G4J%(aB{|p`l9Tk}FP{j81a*629!XMRXJ&+e159s^*>_BF^#jiN5ni z6`|uI-W7}x?D9M%At@}t?5||Ff_FMXzbr=w4eZZkL^a?`^>7iv{y)=^q@{+|R$?7|?zDc4n{iN$NRN~7pD!!xS_kq97Ji{MS#wiLmawVo+(JWy{?1)QGTAN@W@C8wZq_75tC!H zcN&^5i6J>rlm>1eAuH_uaeL0xcJCXQJ90C_)!c5#DSGN01t(WdIkRsRJCW-yD^^#Q zSBQs@p!;rRBcxI);~83{Njjdf2Ou~I*QOP-nhhVgqHb@N29s(|)PI3jyv4CAo(E(b zFeH2K6SiNvn$AJtU&e)2eqp?z4kY4~Ha0)D#=g<6{p<+SsG`Iz9_2BorMLbxj5#~b z+^rU5#OTj|rzT))(|+@vM%*05V^}2RUR8sGQ$~B7qROlIkHVdH6sm-Z8*&7eA~O=j zRq%0Q1YHy{`!hj#>kCu0N65JPgVH9E^LaMv>M+G|L)Vw5EP))q*0M|x7&-1)m znhe%`gQhIXn#GT@KG-X|SR&3~d%EHpCxFwOJMIz_O#m&||H*UX4rViho(Sn&QUq&Y zv~Pv2mq#s`GL}STldTjul;DcwA?@C`OQf!Y%nBFiLX@S*>D{Xm=7Iyj@_&&$C*k6c zaL=v!;@~FupH3h0=YD5?Ty=?S&Ddg{JyLwh$0ZlTtTyKJn%`>N7vP526=AJm_a$Mr zL31mmhoxoU%;nFwY^)WOwB*D!bWm+^3lR!p!1ZAIw>h(lK zwXkamR>I3X>2gc2x;mEqFmpW2#!PGf@O=GG$M~ubW14^Pw`<(uo_UX#aVu*tX9$jT z%bNEVgt{f9DZ>$bIvUgXOvn(e^ipu+$3^G4qIlVC&$-SGS{6#t8dD3MSjP}8YL-StN!H41JlqL4M-QrL)vHz0_@%W#=7YIays0;bf#BSlRd}zCZSK(e zmp$i2Zx&bx+PUe6xb*(kbNHuMD9Fpbpv&NoqeeyOg9oXAOuLJU7c|YERGKB<2e~zO zUpDEQcdBX!HlAa~;gLK{++14L5uOta!wqA(uQYA5#mjIDb7g6Y$;<|P^buB%uuAX$ z7l!R|w8?}-RW+mfAyJgAp5<8AhGZvS<><+bBe)Rn6BWc%gVDI`N1X^bJSmas@@^a$ z@%xa{{IqTDRm;{%{RR_S?xRb)deleZ-u0zP$M;uNt$Gg+MnH+7%^;gH8^5% z+&CrVn0T?*@r8tJOh|8jetvgdUC7#!RV3a~w|EP?4$#w%t(nZua3I0NE}5eV1iz-jE5k zQ(+w`lgLVNs}!xCm%gVJpeR0!zI+zI-NCD;a0S(AX2;U2j_zwV;?s#J(yL1EeLF_) zwt@V|-5PdNm#0;cS*&(47m4$i7|R26**175?lf7ux`5u-<+H>IT5GuTOh0S}t)(dI|as}rScrWlX_F1tn3`}sLy@MKX^X|u`M!g#H1yzMM}Hr zFjUP|U@W5a3gA9YV0O)oYBrANZu9A%LW~pM(Dt3ByDeN(@u@zRO3@D5T`cqNT+q9YG3a9A~Rx_zEo z*mg&e+fRL)ccD6Z9qF}qKJ0)1PNdg9PN|A1h0^TCk&?!I$rM1}Fd5)HR~z#g(q%Cd zm@j|mUq>Hg)snqM_k^WtvJJj~uC*LeWrX9`$~5tBKWL%8$ONQ&PB+p4RSk6jh(Rqx zO<2_Y**tju$o+sgSs<1{HzK`ap)VM0f%v-N<_D+KpAYdVKOC3sUs}ugtbGGOfJ?vM z#5E;S?n4GwXq&6@G9*Rd=kQJSb%XI)S0tR@G0E{tDA&lJ0s{kh5&=Z5 zZ9%P3*`3E8u2&ozESiWs6Hcdr4)Ja=b2}a@pH^R5$Sx~kau$?Loec5L9&PLzEC$#k zEpolmpIj={)taNn#IRIG*oPs@zHxkVkOn!>jFG{wP^gYcFE1`i6UJ(h zNZ?hIs(uqtF)Dv(b&0M7i6rmomDF(3p0MR&2b%p#Zpau`$1L3`V2nS^5frs_2QK4# zoQeO|Md(ifb>o8lj56*TWF~Hl(7i+#SkjA#0z_CYQR&Dxalzh^8&MBAe)R3Noa6St zF5a}oJ^~1#zjK!m8=%i-F!NZAoRkV_TdJow^Y{R8WFW0@{Xai9exD(1q+1vJY_rO@ z&cdaDpZ^G74Y*Y5oAKeaNXwwKn=wzqZcbKX@9V=WQmwR>ze_-jRwa`k-U|hA5Ql}STSSi39Imdee*XT5@o`;xdivepzdykuer{C$cl_L~$?>{9 zPXTGe_ro?$3m>`8(=+p`Zm+$w%|%?XfsqD90B=P$Oq;n^xN!&gDOYpFPZ)cwww*mdn(2RfzlynFTN(KTw2*5ga&uTL&S z+&mt?;rJ2kksBSFcmoP8%)Eo?RLZt_)R+O02YuBaknvso#pvg&YB4V%cAzBeK=y=} zxB4vc#tLoe6$QJF5(OyOqGjJ!L4c|C^8@HrT^AQvZCzb*Mn=Yh9l)#B4jtV9>A4Is z^~X*N&|aG!7*Mm<9cF8iS4gE2&fHc8*w7-eXJ5pnG8CZvt}y@={Dw(P@;z>1oK?TN zgIi4U2)FPapk_Jv<0K>r9i9n-^tiFV1F;jgQ6w%uz3YvyrW6kq^S(PW1n|TaIZ&~~ z-@p4vhlU_L16M4w@Q`c3)^(umDB$e}KfUAq{-m>?8?)J$g5Rj*^lk1AD;`_}!7Q+^ z0#9sIgAav|04e5{b7Hygfwa0aCERCie@sUc=YmSdGBxkG8xG$BHTkD4T&kVWeEsm3 z?Pfd`Sp5IQ-M;z%M*04?)#OI+@=lDzCN}iXZf*R2MzT32uOO=~a5M#(NQzacU#;02 zrkm(@4{$8NFCHF{Pj7#BoWq_rOBE|5P>{Hr*!4YYcJ}&+=bKvy&Umoa7EKeM$j#*{ z!GncBwZHS%WA=62PZtO4WqdGeVj|rxsZ0D(0hOwQY(4!+)&OM>Y&FilqpMTDlukDl ztqYnL`g_V6S0Vxv9JU1Rbn!iq^&43gJFq|1l%+{DPZ2&3Totr_@t!88pN95Ggm)X^ zH%C*_;$pwZN}Ap%J!1u zw@i1O@os*Br%sPMH%IJyKHVjyR-hMxv=U?di8d`+v~><`e*lc;XXl9|oI%C5Z2rN3 z>`9uWxuV9Tp!@j*Jf^veQRULSPB|!G;q~d-c(cj4UE6#x^N;zEsN&0loWr5)3iSk$ zbG-Q`-S3WKAD`KUhJ|E&OY8Z$mlt%M#Lp)B1l(XCuB6U{15eHe`)_YIt`yxP32|zh zsm#ofl`vV9Agi8g*C0+}Q;EV>8D!WmjQ%b@EZ(Zdw_gho!du2_FEVqd|ABqKxW8Gy zpvbxQXePzaqRynF+H&{k;E895`8LU?$x6XEJ4x5pib72s82Ki6-D#^y^(s5yO+R-! zy)DZRV2N>y!dq4RM4~?8&xcT4F=*YnWCl;n{w9m^aw2nhcty-2xhrWk#3VxeNOkVC zqFOgZCeVRn**j)# z>fQRqEM=X!sd|?N-M+e*$%ydgh!;@bIU0M_FYlMgx1Y|oz%Vg=`X)@ukJWVoGc&Yc zeBto;#igjy882hyZ;gX3tsf*_)%`Kr)c^ebWiJ~u*UK52im-%)#igQa=cu!BMvC=# zZrZM{ok&C315#)eny2Mfy943U;S27rmyG9(F;q1sP$Zsng)j~A;mYb%A>(R3V1t39 z2Ifw)uQ6T3!alaLG3+i>i7xG@Dx5jqL^M0Wn7N?Es*VSAboG7Y#bYS>)u#VO zN9DxxL-t3SYFD+=9CedU)c|DCeU`Ng|KLXrF-bDK?FStv=?JDsQ=hRCg^4v6Q)JCb zjpJ)Sx;aZUe7F&n?$|?Up25+N!3EUR4T${fabfQ)>U--wjOuZ>xa{UAG7rKh?T(n&^Zq2O~r@ii|BLDgIVOS(qoEVani8;V>o)kvMw3p#MIz-*cw_x-mL00vyZOgDM(g)hXz!I zyWaU4<|U0r!GH@ILfkg|BL)puyeZ?u+OmSafw|$Kf_LkM(A6m1XJw#|<`nxj+&teb z_e;*z`qv|hz0Zm+xb9UMrKLqIc=T7y$t!Q8QCmU7`@p#iVzX~#pPEIrdI!92n`xTh z!<2MDxdMFiD8x~}X4ajvN zO%ZDqAGg+Fal9D5I@vK+{t-%UNuZRWcqNmSt>6At9AN*3Vp7Nc-JQtc>Y^YM0i4GP+-SL@shVboL-oKd6(l)T*)mE?VNJ#&EaO?CzqP z#54M1vjrKNYWv-7rgoe_K3)E=oRAWCcTHUNQCic^$>H9U>uurIMt}I1gkAjZA0TY+ z?e;wi-_*}rJA@hhM?9y|euA|Fa+jV!{L8|yjh;k>E2}y%8aDQS&rHPdukiHN+TR4S zi0&dY(O1`){$@IbZw&lY)H~XoDc>wX1bD7oOhsqnDRuxYzfExQDhPXQc3NwPy z7Dp|Snp~0u6_@aoFtr!(Kt`E2{7uP9o(-o}P}ZsQl8`oR_FMU!r1mMpe$~?-7F%eC ze>SudFv}T!wcBWYw6(#ly)bF4g}rh^BKSR-xlO62{jjhKqN@q!CbWFAUY(lG^x*Do zGKyfNlgxnX$4LR+3xG+MJ;ZS;Ie7Ek!HAew{oCtETJ$WZNw#)UCGAqVwAH7-UED6R zHJJ5ZjBJD0{xyI_Mri3muy9& z7WMDzWxbyQB<~S5F-3pXs?>&KjLcK9><-50Dhca9QvCj}D^p5zH>9xB6I|38nBuVY zR`GB7rub4>EH?2uDa&VzL!3(O#$KH1;NaEPC`7n26cMJ1T5W`E>$ z@?E$~Bt=u;n!R1&BVwDD8u9STeC5b%FYBlzgkHyVoUEG1G`Th@y}Z=PX%p0Xt2$m@ zJ-Hrwe76tqOM$pS)#T+^{d?0UA%gjnPcBEv^^zL5d8FNx{(T99{FxXSEc^vOg_>szB|x@uCj-{`Xv@Y(7$nA?w`cuB>@&IuZpw` zj{1aJ-hWNv|2FyWKkcH_MoMasn_Sa&s%Px49Q6d|v&m(X4I&_1+<)iIvV=F^QE>c^ z0v9smvfuTA0#y~Rall|<9&bCccgw#P-LuH1C)#g6d5uNEm4O%fa-S@_W8BI8Fo?zV zSx&&9E6lhx1H}IQzCKnc1Y{m6|6{_5DuJxJvDfX8YrnrLqzn)`UuFK>8COD0cx*OWO9Ggs@ZH^J4*M}TZ?A12%9bP7LShtRoK8x; z-=J-?AYB9F3Jo{fCYp+e^`*x){^m+HsZQ)3>D0~05Z&E3$gM63Y?DGXL<2dByF0b& z!j!bDRdx+Qu$hO~=63i1FH}?laOutdja-0<8D{-Im+=3*mRBMMGGG5wz5ib)bN=Ug z{{Nu2|Fe3VEwcsNCltF5j-ZvHUQc@`O)9*FW7>*f#Yz*}Rfxl#&v!R@w17WOt+ z^n050)K8vzT^3ShEW2Zp!wsl+x3Iy0>LH2>H%zCWn0F`mm@ptQB~BMm4F(p9cXlcg z(34O**b9SA_+rCF+g=t&2e;`s1jsfy%pOm8iN2~_{^4if=vV_-yH<%#fLW9DV4JFP zxzmz!DaOh6rEA$|!W$FaraIsjm($;F^7pD%cVnG)Toe-EEkX%NsYP*(sjj=4fJ-LP zUOzg!@dR+=)+gLQP|%4SP0?AD=Fzb_B`)Fm`qwAEC|p2P3-ODME5s*JL4i20jBT8E zh6q^I9WMegWyNi#Fta$0-osryIsEp+J311>BZ_gI7qMrdQz-l0ao4z%dGEv>F*7ru3(9fkgde?oqw; z_@wv5D209Hpt^8}MO$yFFsdyiis)Yt&R2S zRpm(Gd2x>+qvK7P0;>y&rRZwS<)%uQ7!~FSL%&qOq*S|fSw~9Mk0r=r*eh)wZjaG* z6_W6-St!16-tyk9<8SVYQR)SvFk;fQQ)dy4_R&YXD*2o5NqAd$oGy<4hG?SHiK1d# z5Yv#0bM;JgyZd@nk5Wm;4^4WYAvYJn>VY$8{uj4(`-nXzNTz?m=#D(D@wxS{upx}0 zz@9e{_T3Tf%@f1gB4uf|Vy$oA4YIq#U)9x^MF9DjBjw;3_*>rk!@v&T^zZylVcl5) z5GX0^ua#4>cV^~klOQ+9UTrlxPH5?xPF=Ke9oCl#DhuN1Cffs`E4b}ElX)FG)fAPQf^${W|Y-r7i7^r z8WJz$_A6GLLyXm$8z&UXZ{ka>PS>fI+1ZcVu(SfarmFFY2ZM-Ue_jrgZ4y48mKngo zi)0wlgbdOhi-1uGAl%~oAz~uw3IrUdu@RyTK0a3g;8cO}Wo-=1ddusuk$Ea^4WV`!f4KYbA(HJ}HJFDRw<@;q7bR?VK(D6w=YM6atNT64ePbv6bv z$CU@h>RFW6Wow!fdg~|7lug->%jCkZ=ItIcOpfTMVl&HpR1f~r%Qv!;i+nT z21ZRYO~yVuGaR$^9~C3biiFooE_kkqJh$R5YIkomOyeFoLRTqnzHg6ytqLT2J`y*q zJ4|QTd)?$xq8<|C*H|@K3Ds5d@NGBP+$_0hM*?S@S@2C<)aw_q_sxc*q~Fc^LtYhx zQi-JP=Zwcuu^h(eT z^lNQ=Nx&y9!E?|QDqvmnb7_`-wew4|$FeFrk~$6ZW2IhHw7?d1<>H&dnCfB9Rt>J( zrp~fGKz#b0%#P>-qm|Xzyb)dfsp9DZ#7I3RE$dJda21Rytr3%92514kw>do-5)hdp8-*>#@y?UCvVeSEi$(neA_QcK(*PLX#IrHa_c)u5?ZcS9Sp9?+h ztndCsalr73=hsxJKIa@aG3aZuyjusGFu6W)W-#d_|)(cgpXPDkj2%{oYfoduPByjvOGd%}QHU(NZg z8n=&pyN|qigCvY;?cZ=ZX~Po;f|vDtTsSk_(r-#Pj;r6$VaD|}r#GNQo}~jo#8K-E{vY#L_6Y#WC=0Pn}pP&sY^Po*0>GB z1t)E_>TrzagTd6IGEPnM=%3lL<+o)q1|uwODcpRbq+@;Q3A+Nq2LUCvENjk@#V}6) z%2qvrIHxV1E{fj_&IQZ;jfup2uDW=qm%=J7x#AhaY1`)BJb9DBrZN@~+C2PrOX$O$z;H8W?~|(@(?i9Fu;qt zF0?19SrBv{UV+~eUk$_+EZ@Z(JGZhn_M{~c<3~B)?O~% zC8MC^mMgPP3|XF)bi^EE8;qMDs22T((QSlgJ;21;q5TV5RnHZ#=@1fU0c>dFeF%d$@5yWI3mu!HHfpLXGjeXIh?{G7#aq=is=Ud3UO~1DujmU45B&mpY z4>XVHNMuekVYwo%XL7U#Oj*Ay7dzCaK=<8=1DmE5E-B5~;Npku?C+SHj(eAB1F}3l;z9N2q0D7gy^p>4eK6q*%dV2{J2nwA9Qe#3N+u8e`0sD^-aj>3|p-s{IU}B2_N5&~z z6<82{l5zSgqH31W+jGZichL;t1-KE2!on*Yh@-=!^-ly%s>d7%^t1f?hrN}aD{x3I zT<^cIeNfFC;Nv_1nt1jv)(_lYVHyAPw{+yMC0b@@%~otIwKOzhflnKgQd3!(cr|0y z_W+{qJwWM8ORub~a9?qFr+SI0sj0w6azG!7>;PW$9vv(tJ-*)nC(`+Jmh=`8G`qRLcjxMcs6!l5j6 zeGTtMzxzOiTr;!A`#9kHLfcH)lFG`LP{ZckgM-A7135o`i^JiY$3&{?LS>~19`r{w{J8Lyv1N+D1eV{L2qxs|6`Dxk{SMWbpU?X-8gw18m&GU34oU;m2g z$VW*q5($Pp~WLlIW1&NFG80=xK6K+koK_B?Ae)$yq%nH$6c(Na)KQ0|>O zT^ASWy{DXSB7Y^^wD02covWbEA*MeIg+M~O6f?TDK>OEu5H!~ zAqe^@z#lE8@#v;oce0b)5MrI{+m3*L(p&9C32#^R7w(S4lttcz8(*K5w`GF9R_z z%$5OkOGo2nh=@u?utk+R<_JG!d>Yh#u3zG)e9+bkZxODt>QH7RG*m~Q%4R3P=!(%w zo=Kg4*NEHN+VtzZ>7dY$wY+*A_q{<)CV%wyghj8(H3QIVisKJ)QBn9r-toktrqBV( zr(vVlC~L5y;uDRF!D+?}XJKp-MW@QZ1;4tk>~yhiclKp`Vd<(a(QPN5%~+iYMeG!y z^ax>K)UQ<1lrrlC1XaC+JEF~_gwGS%Z1r4=Fbwp?!QARh1I8*RR^OzmVh28jyjK>s z^$j>;>USU5NBg<2ADfY~oGqypEl8^`wWdm`ZfYESrQSV&p0X*v1}HliE$~6D83&-? z0x@E^<)qj3;?@~5=Ul2(S4lKcniO}D3ClG37-h}T8=`+WnNEng=U0Nyzl>@l9H+GD zGQ4$88+FF2J6DtZ7^74hNR#_dZiDAq8lG1AfYpq015DtP(t8iHsITcs(+K5xIW=TA zeVe@oVpB>Bg*qaH?p_=bZVo4!%!$9Ci=z8^fJXW(!0y?y9d^8~AqU+Yg77UGxzg`#WkAi-aZ>UaiXY`=!mKhDGC}CQ=9Y5Ad@lRiHWcvjfZK#IbQ0b);`Yg<9lUBV=a zb-rL|bAxrJe!KYFLrTt;$}l(Mk0z%Pd$*;kP|X3pRb5*T>3 zSL@LF(eFFx#AppJ6jPOH#X%ycbI9i`NRWOOpe(pfUS?$z?S_%@TAx6=!t~-dv+WI?g1d8^KAKQ!+I0-NPvN%4S@*BCyJ!j~k ziBLD$&_Vh(S$@Npc?BHM)X9yOAk|vLFR(!d-|%&&0l0_XEKs*f!kt+o(>1xc17Bi% zwn~&KdR`I+^(VtGchSm?l>rIOq8 zWeZ7qZg(fy1qI`Ltk=ieDWp~0j6>$Eo*s}eE;BnUy=Aw(jBi5HAH&Zb}RUcB5C@WU8 ziZWQbc4hQ#hH#;l+6nQ=+d7_*g;D?GO%>`MsPh0Y6re>3+mGy z3fl&n($R73>I(l2uPVc6gR`I-iG@x%!pIYa0OLYO{6aw4-Y3KQ*C91e=ran_Ts6l& zY^f*JdcEyA+$z2e0P4l_RV{+g#!hnTQT51CdXXeGBn-#{hwpn zMqAgoeRJFWrCa5+*U;s|)`>#U8Hc$LA4%Iy>Bqf_vkztID+4Uda_2heJkg(1g`tc8 z9Nbo!n1SD_Sioa{y1+x;Zmr1}&|E)REptp1$~PpoJ@0s?yA`-NHYgWgBS*R*tw@|7 zM9$xL;lGZ0{t<8I;I?f@zUg^3HmRxA$yn{s{pIO8Ki0Ng3L8wa@wj_~ZOXm~GV*Rd z>;NIk4xSFEx5ySTIa-+3?g(gH{dyeg)eL=g@e0GQPe_vSr}n9|cc=e5X7B)vOeMh* z-|BgJ?@ChdBh%m;pdWKeZ*x<9-3 z57wm(h`kG^gL~~dD@T32leV+T{cT^^&k0_>apYdf^(UU&`Fh^cY5Gt_N6VMtv}3ON zgHmj`>W<{6kW`ZNSC{P?tuDDrF9VGe>DO~BSFF8`q87@3_ktX|)Y|v|m~tkK<;N+# z%q&aoy`!hR@QB;LF*W^{c1A6(;h4?&uPC^;Xv9>|paKCJj0} zXThHx?Ax@ns%H7<6v$V=rubu%{NSpdjGTLmE~helC+|fB(@oo?+h>k1+uIsiph5teXvaFX1jc^Q}JJu7Av;=;4sNzwBNzngkI@5@-9HhQ)d7tK@*k#e6n@SWOn^1p~| z7PpXuRUf}xdS+0*GslKTBg4%b(eiuOT**%8T0hlx`$FZe1ZTK}G$+{Xc8S9*z+bx@ zqTjZzsGUk`)r6p_G(+rz>9!iBbMlbU*x}&qG5FTp?H->~9rIL8W3ZH!zj^X{lf)eD zw!X_z0huW9e=IaoJ_QX3&91Mk{2%RoX*8Q#+^>#KY3nH3gW_~hRmEw|)L28!#E_a# zt6IcZVh(K;MO91C#ypP^^GptEZj_i45i^N-NRSBk(f8hW-F4S`hr8DOaM!!u4?aYm zJbORG-uwUm|Ay`Ab`Rtiiy!&N1cyFk)sRcy1V0I{5j|Gb-UfHA^Q{T;dqzd|e|DZK zVdjUa#9sFC<;}BFb2S;)$VH4_DH;51o9S+J@ zSv4DP72X=IpvaUuDDujPDy*TASHLT-MNL3dFWxQ4V&@o}HI4$7M+NO$^4~t?gB2*N z3nIdr%#)9dRUg}p-X8KAn4MxL-xPizo##Q)wg{U-X=lsd?e^BgQ&tQA)Mh^Nz;(06 zRa_S7kbJ%RdKT=Km~)>``58~&?j?}XgMB|N_> z4rL_He6O`^GGO76w}!3aYoI-+1&bmz(ekAO8(-haJ5GL|VF6`b4Kbz?-(!Ut8*l87 zhv^Q@Q}{!9mrQolr^IAmZpt4LHZV1P)M|zpnf-P`L{i98@o8pKXHgTCy6F%@8<+sEu$Bk0Qq3W}v)jAjX3ltiBjblf#i4?0< z)!p|s>inNAiJAO@`mr?>A!NevLW{y=@Hv|&v{SA&Eh-Xu27}|OgyCW@$R*pS-iOUK zsdMKxa%^FEd%?VJ^D3kM*OlIXuds;v*+=C)@{bLGZj?|TU;Wn7>7J#uS5s;8cP{a7 z%)Y#)(Bx|P+L`DopCDz$?M_ffomDsTHv-iCGhEUzlv!`!UH6&ZdnoLmsNV=OMUn6- zHKGEh!Rt8%jLW*iBQ4oB6<6?;&jPfmLh!U{eJysxnaLlA&C1q2K2@zJHtRcGi^Sb5 z)QuHeSDv;RGY%s*t`%cPbY+e(ePeN%_UN3>dB%1`l@VIjL8V^%1G5xacM5S!;j zkyoFiJ~xkBdV`o2{^*)uj~x=%(4Y70WwOm`9kZns%%VF7wf$v3@M5^mRB1as& zpqhByC|=dKAQf?Uc69n3&+@J)uFT9C+Zcgomwgp^p=PTlfTHsW!>q(#LY1KowTu54 z0Dm!-$2a9SJld_WZK>>zvesP@1&7=pn5M3cY|LChP$-5`I_{Zbga{|B?ip6T=sU5n zY>byyK{UAPYLj1VLybEs@P|-t_@@DxFJ6*2)uL#AQR^g}ZR$oE5W_VT=Rp^X`Q1y# zu8ChVjn3ghJSa-X)o$czP2F9*T?29)bI(BBH5M_K?bI|}rgIH~x>X2+xbopsYg6Dh z&S+aIcv>S!MKnHopYJXPQmulJZW`BLYn;mN$`>6l{K9OS?PYi=$R|(J`=L05QYYVo ziQ~+Kv;#njk^e~$?(d&aG2Ci}35*@vy(TcSCL;y@{K@H<>WZsYG#Bz}GTRFe=Aq7d z>mQ&K&+RC_Vq`57;tmyxvXf8AU6XRFvGLp-zT+At;d^xvDE^3}dLQf#=4h~LgSsLx z*;NL$4-`vc-piLGW%LX4L?o}8+esBAub*rNxHROY*y5=Lvyc>%%FO=ifnYt5Wh${l@|z8ASkWrFmVq%E1O1w5o-bOV>q z_obLZY8;YcOgxKnG-N#Bw&p$FtjDdA8ENjhU>MNvCl zbA6~(>UeZ{T_XjKD~r7YtI=)@wn2u(l5P;kxdIm6+9Ix4v^_BSEdNN-gt&^!#q{Mt z{3o0qv~D$&fyf6dBJ2S zhNxwAJUoj_`D*#pBobF<3F?k%7!^*~^Mj;QVKP|*-7o5Qobw@8x|YYVFO}gbAF3EL zpO&Y0muQ_z4Sirs-g+~kn`8HId%>5yKO&$!1&u+jQUebLtpte*!<7Z7rPMHKV-9Ty z7$qwG&uz_8v#cC`wn@|-G4b;I9qQLSQ^afEU&4L9T}bpGxEDELq9S`y4$!VW1V4{V zNPNqIE{CvdVT)8qjJWnG(c!s?5Xex)pmUa_D5IaCw!U991>IY5hxjLSwIW$!Ii8Hp){)l<_D$?qS ze8w5Knk{v2)k33h*55bYxbOHl-*jrfv)82vSvl|epxQOYTBI;+oyVm#Fm`a=wO?7` zsa)wfvf^eTbq$~6X&yYrl=1Ff#I%dkYOY$59)2AUsXI^8iS!b3w9WK~0n_@-MN#NZ zSEIUOIK=O>YjY(FEH^Fp%+4!ETm*tUJK)8d3ne{G0ZQ z?cmui?WgPGXsn^$YnwZ+j2D={Fnxg?vP$Xvdft5gdiacHzRu%ovFagRktp7>Eah`VpA6PB5|ea65_Daa!gt-En8jiPNTHISLF$x z%VE6cpG26f^?~wWb5qm3k#6K;DLbN$N!|@@mgUT(S8S$b&m~v-spP$RPK;%R8tc^8 z46TM*FdFSXGJ!S4$ofGCh%G5OK2d{B%<{!!?HrQ!M=YXgu67$g{y0aZyEh-d*|`e@ zHp&B*Nc^SI+2{)^xuzR$_b3~I@8A_~?;583Vml2|b36L3Id;bH73^T_t8X@k-hmy+ zK>t!qWhc;|Scp_TZywHWTqLUPmkp6zi7wyfP=CA*3HI_19f}NSCkKQlr2a zd?LEqr{}&t_wfhXrSb$WNs^47&25e2=3<(noNjc|4=h}WUWiwBnlFgcRTGQ;+$ecp z4U0knMAlfyXj}(EisDI${`#k)T-)vqVGTP)U`Yv7&br`!e;{gsRnq?OZvtb_k< z-I$i)F}6ZRO!IE{KDTAr7~Hj1}(zZ2~|| z`cUDeHTm7o@LY|b7f0a-z!|$gW{JOWyjVtsUsWO`LIYoYi3P- ztV(`FVh;b_C2(0q)$)v6zzgze(KO}99O2$WipA^LIt6{!lkw?e@x^2q357tD8#2e; zU6?X%ig-d0BU%6vECu9Yho(?ix*Le=*&8^INv1|!Rkt;Yoq$MI*3K0@zT6t+=a*rbqvh1mB_TNz z#%+21TV7%;W{~!i_2rY_KK+sT7Fkh6Z#;+CddH}qc>aE|#OwHwv(DUCaa5xtER#EO(|rUq>U+1Tl=X5Y!ruHHp*)5z~p3u7<8!>HJ-&+HAT4@*rQ1@2XIJ4sSy z$W{7Q)FN^MIjtZ>BCd==0>ouZ8e!XEcPMT*h>v-zrjcODl@(6tw`L2k^#=l7SI%A> zUa>O(rH2dSwihm9p2lUpOBDgK3->*eCED#%xZTO+*T5{AbjcEdl`Z~1FwAuZAw%SY z>=8jpeXEv~Oz@Ot$r=50?5p&TMvc#v;8t>_Odi#n|2v7%B5+4JL|Wg%;$ZCe;(;I- z!<0Z$ufX=U{Ns1Qh~xrP1O;q!u8O;kUSq3AwRdRLo$eaRw_Knna;PjAfvBQM?60)9 zQT%sLEIPfy<^TojG5IaP*9KSLN7~dqaUy3l2H2%}fTcXFPnn7W2#TVjBA3yH(@rWU zuv8-6?M%VN;A0huQEk<|N4a#JhJi~Zb9JW+p7$b6+h-2zD|>tIQxQ1uM^rkxi215l zE?e~75vF^gmk?6(R;iBgg7lVXbDaSdMj%6vQn!Ck^a zOGVncy0qS^R`(*$CjCXyz+YPbZg0VCJ&8Ym{7z04V9MQqausOQsCMAuvzFI8~aIpn&gp#9~#=J z2>zXkY5cs#R|C#}61*p--U5iDS+nNncg~~cQp9cL@@xbOb@GA2qnfl3Gcq(3ocfIE zABR@D*c*{GtdJguyMVyC(Skxm^-8aDMgxHPV4|O%gssPK$R}-{h77}NV`Kfl=yneE zMO!K`)#(8`<)7KL4ipOKmNi z(7Drf_jP((nm7`^0B9=g_WQ>dm==240a#GS@w}1hrkm;IlXlkTZi$P#x9FUG^AJ!- zmL)74>~E&AWT@ScO}b?$E^f6}T^svIvDvSknJL=E1moY+ht~qSBg_7~N|-tzegq(> z|8Mkn|CSozzd6DGhI#FO0;m6vLxM3RKlbJ= zndQlPuV0=3(@_^LUNqfXSM)xfX2#frovh;5Q<8$W1o#Z)N^d+4FEk)DEV==!!E}@y zbUR1sIH;V=JSP6&Q4(;ZbrCyv{o4}*fj2BC2l708@fA4x*G3)WkJbaA4Ir=pdiIc0dX;nIy-Rrik4cbFX4v{q><;l5cT&{fQ$5 z7q-wO-+O=H2Hi0H^y#8v&nF*>z$iD%?d|e73*Fupu*>&)+hl(7?yGz&zp~ps`4+Fn zsJzK5y?oDsU&GD+{yQTmsL2c+3=5NV%357zjl!c11E1T&5eR47CT!jFTm4~&4-I3R zYb{zsr-rS3C0b6TZQuB0e?K8kja50G7=-8M<=s1Y5?4`CVT!br8bJ|NfV-Ly5fO1v zn)E*5hb4&G44epPurA=-`SbTgM0Br-S%1DgQet7^+Kw-D=riA@QjMR_KI>RLvgwKy zFahq>!8+HKUu)=sSXn>@z)qqa?1-(6oH;X61mMYTLz+iNNAif25(0Vy`z7c0!o2C~ zH`#kZg`MsK#~PKvaW`%EjY8`C7x?3HZuJ3%kA3~~dw2u+)gp9|yyZ-JA7!Sik1O!L zRb1@pHa8<;W-R3I6{a2MoK;SZ;H|fbjO+QsdfG~-ST3&=DI9NqXc&_aU%hW8V#` zBox(jyCTGKhOK69W@!36g^vP1Uw!#A$iB+uCiipfZ0VSavDWit4HMl13kms(s80-mzb_LrPP+!8_xQe-^$ zyIHY0rpfW!)1DH5;=`gm8^myJHZvjNXgim^l5)->V;|idAr<2FGHHk6JCX-$P#w0l z%(ss>O!ihn6JU-JiI}eia)UJ)2ysPC0RwJS?3hqNzzSY!v;0N_^09rY@@A+~nygu0 zoXs^~Gm~0^PiT%T<8X)FD<593@#Q$)8)isY{0&2TK-=snM^wLv06ABg?5So;1`Vt^ zTS#bJSWy~)d+t<85vtOn6Ix8XUIrD7bJW24Yj*X!xm_7!oT49)x&4fj4)N-C`8aoc z9IJLAUdAA{!-F3Q6s`N>=?3F;y)NNr1YX3WIj@d1*OE97=FZ;!dwqWuthUGnND0k=oAapum%>n7kf(A-2s z1nH)E-Xi9jErx$a&%@JwzwXC zo~@{RcKxWc=CB0Q>2H!0{Snid9D7NIKlL!?*%WPumnh8-1Ca5>PF89nYiGE{$*F_e z{3N#PoSfQa`44KghTHSH9&N{LwE=z8Qr=HrY4fRp9sM&tJL#yLCXRlH@pGmcYR1jY zL?^rmQk?KPOruSQh|z1?!j>1tb0%AF8rVk)W|$~WY048}X<GVhHolp1XN2f-;`>8ygzMBwjHX*jMjtfG5Ju{{OJHGy>pxZz|7d$L3 z$5i8}$^z2L}g)z-&d)*;Wgd^+Bx}ThQvUk1VWNAR7<|=3a)e z==`}IR^*_&r(F)LK5?Lg+5KK6H}sX;g7>+LyZHUPy?HY=(AvETQAh7uJIz6HS$y~_ zEIfv;*ije=W7`aEPHGlaQoRt@=1#U$7j@CM39+%)_Kc#pPl5wl2>}JUbLB`D$5Nx6 z2hfsiW3TF63Cc)GE+P&dY+JK^d@Bl{B$n$wP{O`wPy5WDT%%J6Y8{gv^D)ck0g;Qq zlAi0YUG;r@tK5zD+)iO5%>p33E~4~>528;R6OiyT3f0d^L6~p!s5_r{i-kI2_wrw9 z#(BT6`&hx1vAMz$vKg22CJ{ML8_a{#f!$5-7+zp8UrJ_u_ib(~==3CWp!Rlogeip5-BEna+RwC69qP>0jJ8#}7tqJ|>Fy0< zkV-)tE1zz@l?2^u#y7OHg;H^zz*!=J4$5T{iW%VGupR8er)s&uhDnhY2-&L2cZM4S zQF}*4LPrm6hpw&}MR~n3AZE(_{5bF(OdPBb2sX0@$fu1|Lo(eXfMgnAOvp#d=NCTAj zfQHc85JUB{rz~Wz*Y16e^&ux6JLvYB&$IEu*Q`&^%r^C3dk~i{V7(SNRrkfU=DlU= z`q;Q}c2pgqG_haAv(Fav+Bv@Y;%!wTDkk1?vQ%OFRoGp>rq$gzO~EsqM*AFZc_-xU z^aw$orx;kLlFpdhg$cB)@`>kaTlrF)olaXiPk)u6pxBliXYCbDMWhVAcy&Q~?=5kN zo#71bsze;koNlJn8k0>oK3*BcjDB}2eqnXb>dP?#X$Rshrsv4f_S@xXT~$j`KEt-9=rnx!4Lu9cq*qi0S|PQd;*acDHUzW8%W%5^?%9ng<;B6M}! z_}p1jFn-gc+Hry$Wm|-|0IFhfr7OsFO3rxqB^}IUCKCNk=TGbFrbi2dHaX;^RIS^D zj7^U~6A#!39A2i7_oMR0xQ-5pi<|ovA1&P{<#U_+${GzCGPKB&$VrbjnTTYiO9xbg z{Ju698h_x?#(tTjzFEHQi=Msyc#=!AjC>CNa(5rIwqtZL9l^38r{mr%qcdZR{i1&? z()4rN*dv;sN5LMbq>7UU&b#U-=A_aDEkW_64YwvaZP_MtUZ31^&U%82Ue=`q#}XgFjr7UoQLRi?sNufaY3vVG7PG8V}pTx8Z*gR==tZ7Z!` zjEem$*(`0k#7IN^tS()e)U_caEL~gPKzx3*O}Jt9g%u4-aWaxw$Pa;ZoazzE%5RWO zizwqKPpN};g=ijuGfW9QjKY==(zRDxZ9#F(ln~3B1)JtFUUzcC>$z+(#l~JOVcHfkES=dw z$gv~q(z&;?ie|!#4nd)2L*Tglx&2&`1-O4E6L9UH=j}rT>EpfD2D!`cckaFhA`Pp* ziF&=Z9%3n7Z)Mja zV+JQGUjeDX8DM6WmvY7F0oI3$9U^B@PD6S65;F2Ha?+E~g?GkX4rGoE_YR4FdU=rq zHwLy{Bg_<=Y6EJK&(;%ek2t}L?a;BqR9IIIWPP|m!K$YT8mVxU9<1$>ztWz)JMu0D zmxL%a*}_+m`wlFtlvMqt8p&Hr8|F`g(~y~)(zY~Wcxn{BMrXx`Z*)t-LT8c^nkfD) zTLUs@D)IcYoAW$PcHLiCauaUux{rE(+#UBbJp$sbM%6tnLx{3`*)nu>f%ZSv+8Z-(P1M;q&>|EZ@WhKZw}Vi8=Dw9e};^?wj?W%0WgbsI5aC{xI#p4uZ$8;R229N8dSjc7}i7rFse?nkN zF(|XmK?==bZ-eGfkzP|sD>8ASSNktqqj?{JX;Q^8ZYzN9H;t$?I_|VXK{LAGLDISx z28ob^Eb-kHCuN)C?s)RhxE9ucvC@-N?YI=&k)LAxa@GL(^r+C>ML`h#L5pJgvvb?{ z@j>c=t<_$K(~4mu-0y}>q=Gpq`dqrmR^nThXhN~Q{!Q8s4&8w=YGvv$3PZ5gy| zMqS><*dj`KG(y*&GXTuC&~bD_uKA8`wViwx*HGHXM~&n7vGjn#7)D0!;cj?m^I>@~ zwaK^{k7F&7@OAFrzb5HUv9K9h(v&Jt7jQbo(-n&))U!BjM>)E-I#^fkinFxo86Gm-VpaCmC$M7%f@0y;T$x3Yan3fyK z2!+lsp{iUa*l41K2(>`vT#|&ANSn376-C zTA35QyQZ#xXD_fUwZT(?Mlhg_(r=F&?>mR0-9NXa|ZNgrEgkjkWS_T_JZ|y`R%FxoDX8dRdB5Bqm@N{4 z1%yY^1s?M5XyL`LM=GM#vmIR+AS%IA(4V(d9GHPDAiAW^+`;(%= zL{af$aTzA2go%3KHAzj)p6iMg5q@B-q%`7U(p&8msG;WNU#Q+HXQM1;Q)((@PHfSD zt5`eLU$Crk$>$s}g9VySUDFuxR2Nwc$tC`HbxB8upk&8do2QGR6(`yIaGXd~G&LI@ zJ<7?*__O*F8@PBBDe?pU+QE1xbmz;)s}} zIDwFMD++$Zp0T2(nDrq_Dv%}WGauTzGL1WPDevcK%E6A*tD~T1DTnuI$&D5yDV)=$ zUCHQuK;0A38S~hC4Z0>W|1T|7!n4NHW$seFMZ?%&`a|obZywxHR7EqI9&2r@jWFbv zIB-VgQltNr8&q#&Rix(C2@{{ChI4Y-E| zFNBy+1I3iwSO0R?TThg6OdbpDC)Pp#?!IyVUd;;NB%C>O21=gS{$)vHbR$LHAN2O^ z+r>o?064EtHAevTwFfhRa}g6)e_^~3{_n(mv{>RY7{;?^+;C5l2&G^YhX=@m$m#Y2! G?tcJ$tSk)x diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/gemini.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/gemini.cs index e91eb26216..08e0eb9fc7 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/gemini.cs +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/gemini.cs @@ -37,7 +37,7 @@ public async Task GetAIResponse([FromBody] PromptRequest request) } string apiKey = ""; // Replace with your key var googleAI = new GoogleAI(apiKey: apiKey); - var model = googleAI.GenerativeModel(model: Model.Gemini15Flash); + var model = googleAI.GenerativeModel(model: Model.Gemini15Flash); // Replace Your Model Name Here var responseText = await model.GenerateContent(request.Prompt); if (string.IsNullOrEmpty(responseText?.Text)) diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/razor b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/razor index 458d712bbf..08eaac9cd2 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/razor +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/gemini/razor @@ -2,7 +2,7 @@ @using Newtonsoft.Json @using Syncfusion.EJ2 @{ - ViewData["Title"] = "AI Chat with Gemini AI"; + ViewData["Title"] = "AI Chat with Gemini AI"; }
@@ -30,8 +30,7 @@ } } - function onMessageSend(args) { - setTimeout(async () => { + async function onMessageSend(args) { chatObj.typingUsers = [aiModel]; let responseText = ''; try { @@ -58,7 +57,6 @@ } finally { chatObj.typingUsers = []; } - }, 500); } diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs index 71c2f92ac1..24904e92ac 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs @@ -6,7 +6,8 @@ using OpenAI.Chat; using Syncfusion.EJ2.InteractiveChat; using Newtonsoft.Json; - +using Azure.AI.OpenAI; +using Azure; private readonly ILogger _logger; public List HeaderToolbar { get; set; } = new List(); public HomeController(ILogger logger) @@ -19,7 +20,7 @@ public IActionResult Index() HeaderToolbar.Add(new ToolbarItemModel { align = "Right", iconCss = "e-icons e-refresh", tooltip = "Refresh" }); ViewBag.HeaderToolbar = HeaderToolbar; var currentUser = new ChatUIUser { Id = "user1", User = "You" }; - var aiUser = new ChatUIUser { Id = "ai", User = "Open AI" }; + var aiUser = new ChatUIUser { Id = "ai", User = "Azure Open AI" }; ViewBag.CurrentUser = currentUser; ViewBag.AIUser = aiUser; @@ -37,22 +38,32 @@ public async Task GetAIResponse([FromBody] PromptRequest request) _logger.LogWarning("Prompt is null or empty."); return BadRequest("Prompt cannot be empty."); } - string apiKey = ""; // Replace with your OpenAI API key - var openAiClient = new OpenAIClient(apiKey); - var chatClient = openAiClient.GetChatClient("gpt-4o-mini"); // Use your preferred model, e.g., "gpt-4o-mini" or "gpt-4o" - OpenAI.Chat.ChatCompletion completion = await chatClient.CompleteChatAsync(request.Prompt); - string responseText = completion.Content[0].Text; + string endpoint = ""; // Replace with your Azure OpenAI endpoint + string apiKey = ""; // Replace with your Azure OpenAI API key + string deploymentName = ""; // 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("OpenAI API returned no text."); - return BadRequest("No response from OpenAI."); + _logger.LogError("Azure OpenAI API returned no text."); + return BadRequest("No response from Azure Open AI."); } - _logger.LogInformation("OpenAI response received: {Response}", responseText); + _logger.LogInformation("Azure OpenAI response received: {Response}", responseText); return Json(responseText); } catch (Exception ex) { - _logger.LogError("Exception in OpenAI call: {Message}", ex.Message); + _logger.LogError("Exception in Azure Open AI call: {Message}", ex.Message); return BadRequest($"Error generating response: {ex.Message}"); } } diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/razor b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/razor index 569033ddb1..ec39532a80 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/razor +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/razor @@ -2,11 +2,11 @@ @using Newtonsoft.Json @using Syncfusion.EJ2 @{ - ViewData["Title"] = "AI Chat with OpenAI"; + ViewData["Title"] = "AI Chat with Azure Open AI"; }
- @Html.EJS().ChatUI("chatUI").User(ViewBag.CurrentUser).HeaderText("Chat with OpenAI").HeaderToolbar(new ChatUIToolbarSettings() { Items = ViewBag.HeaderToolbar, ItemClicked = "itemClicked" }).HeaderIconCss("e-icons e-ai-chat").EmptyChatTemplate("#emptyChatTemplate").MessageSend("onMessageSend").Created("onCreated").Render() + @Html.EJS().ChatUI("chatUI").User(ViewBag.CurrentUser).HeaderText("Chat with Azure Open AI").HeaderToolbar(new ChatUIToolbarSettings() { Items = ViewBag.HeaderToolbar, ItemClicked = "itemClicked" }).HeaderIconCss("e-icons e-ai-chat").EmptyChatTemplate("#emptyChatTemplate").MessageSend("onMessageSend").Created("onCreated").Render()
diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/gemini.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/gemini.cs index e8165296a1..b0ef1d5362 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/gemini.cs +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/gemini.cs @@ -31,7 +31,7 @@ public async Task OnPostGetAIResponse([FromBody] PromptRequest re string apiKey = ""; // Replace with your key var googleAI = new GoogleAI(apiKey: apiKey); - var model = googleAI.GenerativeModel(model: Model.Gemini15Flash); + var model = googleAI.GenerativeModel(model: Model.Gemini15Flash); // Replace Your Model Name Here var response = await model.GenerateContent(request.Prompt); diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper index 9008ee3b9a..dbbf7ccd2d 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper @@ -63,8 +63,7 @@ }; // Handle message sending - chatUI.messageSend = function (args) { - setTimeout(async () => { + chatUI.messageSend = async function (args) { // Show typing indicator chatUI.typingUsers = [aiModel]; @@ -98,7 +97,6 @@ // Hide typing indicator chatUI.typingUsers = []; } - }, 500); }; } \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs index bef1e1c39d..2b131d758a 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs @@ -1,8 +1,10 @@ using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.RazorPages; using System.Threading.Tasks; using OpenAI.Chat; using OpenAI; +using Azure; +using Azure.AI.OpenAI; private readonly ILogger _logger; public List HeaderToolbar { get; set; } = new List(); @@ -29,25 +31,33 @@ public async Task OnPostGetAIResponse([FromBody] PromptRequest re return BadRequest("Prompt cannot be empty."); } - string apiKey = ""; // Replace with your OpenAI API key - var openAiClient = new OpenAIClient(apiKey); - var chatClient = openAiClient.GetChatClient("gpt-4o-mini"); // Use your preferred model, e.g., "gpt-4o-mini" or "gpt-4o" + string endpoint = ""; // Replace with your Azure OpenAI endpoint + string apiKey = ""; // Replace with your Azure OpenAI API key + string deploymentName = ""; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) - ChatCompletion completion = await chatClient.CompleteChatAsync(request.Prompt); - string response = completion.Content[0].Text; + var credential = new AzureKeyCredential(apiKey); + var client = new AzureOpenAIClient(new Uri(endpoint), credential); + var chatClient = client.GetChatClient(deploymentName); - if (string.IsNullOrEmpty(response)) + 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("Open AI API returned no text."); - return BadRequest("No response from Open AI."); + _logger.LogError("Azure Open AI API returned no text."); + return BadRequest("No response from Azure Open AI."); } - _logger.LogInformation("Open AI response received: {Response}", response); - return new JsonResult(response); + _logger.LogInformation("Azure Open AI response received: {Response}", responseText); + return new JsonResult(responseText); } catch (Exception ex) { - _logger.LogError("Exception in Open AI call: {Message}", ex.Message); + _logger.LogError("Exception in Azure Open AI call: {Message}", ex.Message); return BadRequest($"Error generating response: {ex.Message}"); } } diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper index 3c865740e2..336c48a000 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper @@ -1,7 +1,7 @@ @page @model IndexModel @{ - ViewData["Title"] = "Chat UI with Open AI"; + ViewData["Title"] = "Chat UI with Azure Open AI"; }
- + @@ -34,7 +34,7 @@ @section Scripts { @@ -49,7 +49,7 @@ }; var aiModel = { id: 'ai', - user: 'Open AI' + user: 'Azure Open AI' }; // Customize header, icon, and toolbar @@ -60,8 +60,7 @@ }; // Handle message sending - chatUI.messageSend = function (args) { - setTimeout(async () => { + chatUI.messageSend = async function (args) { // Show typing indicator chatUI.typingUsers = [aiModel]; @@ -86,7 +85,7 @@ author: aiModel }); } catch (error) { - console.error('Error fetching Open AI response:', error); + console.error('Error fetching Azure Open AI response:', error); chatUI.addMessage({ text: 'Error generating response. Please try again.', author: aiModel @@ -95,7 +94,6 @@ // Hide typing indicator chatUI.typingUsers = []; } - }, 500); }; } \ No newline at end of file diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 8e7a01f0aa..877f05b545 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -589,7 +589,7 @@ Integration with Google Gemini
  • - Integration with Open AI + Integration with Azure Open AI
  • diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index a47cd75c51..f5da926d7b 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -592,7 +592,7 @@ Integration with Google Gemini
  • - Integration with Open AI + Integration with Azure Open AI
  • From b01b323de5351997b680a8b61c7327f794cf2dc7 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Fri, 26 Sep 2025 21:55:23 +0530 Subject: [PATCH 2/4] 982586: updation of value on cs file --- .../ai-assistview/ai-integrations/open-ai/openaicore.cs | 6 +++--- .../ai-assistview/ai-integrations/open-ai/openaimvc.cs | 6 +++--- .../chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs | 6 +++--- .../chat-ui/ai-integrations/Asp.net-core/openai/openai.cs | 6 +++--- 4 files changed, 12 insertions(+), 12 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 bb855a230f..5bc65aba86 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 @@ -39,9 +39,9 @@ public async Task OnPostGetAIResponse([FromBody] PromptRequest re return BadRequest("Prompt cannot be empty."); } - string endpoint = ""; // Replace with your Azure OpenAI endpoint - string apiKey = ""; // Replace with your Azure OpenAI API key - string deploymentName = ""; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + 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); diff --git a/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaimvc.cs b/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaimvc.cs index 912076e1f3..fdb042b819 100644 --- a/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaimvc.cs +++ b/ej2-asp-core-mvc/code-snippet/ai-assistview/ai-integrations/open-ai/openaimvc.cs @@ -41,9 +41,9 @@ public async Task GetAIResponse([FromBody] PromptRequest request) } // Azure OpenAI configuration - string endpoint = ""; // Replace with your Azure OpenAI endpoint - string apiKey = ""; // Replace with your Azure OpenAI API key - string deploymentName = ""; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + 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); diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs index 24904e92ac..835a39f831 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-MVC/openai/openai.cs @@ -38,9 +38,9 @@ public async Task GetAIResponse([FromBody] PromptRequest request) _logger.LogWarning("Prompt is null or empty."); return BadRequest("Prompt cannot be empty."); } - string endpoint = ""; // Replace with your Azure OpenAI endpoint - string apiKey = ""; // Replace with your Azure OpenAI API key - string deploymentName = ""; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + 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); diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs index 2b131d758a..afb07f147b 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/openai.cs @@ -31,9 +31,9 @@ public async Task OnPostGetAIResponse([FromBody] PromptRequest re return BadRequest("Prompt cannot be empty."); } - string endpoint = ""; // Replace with your Azure OpenAI endpoint - string apiKey = ""; // Replace with your Azure OpenAI API key - string deploymentName = ""; // Replace with your Azure OpenAI deployment name (e.g., gpt-4o-mini) + 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); From d0a6a0a038c3673c49afeac9e85ef9e7996076c0 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Sat, 27 Sep 2025 12:10:47 +0530 Subject: [PATCH 3/4] Update tagHelper --- .../chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper index dbbf7ccd2d..fa35b8f30f 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/gemini/tagHelper @@ -88,7 +88,6 @@ author: aiModel }); } catch (error) { - console.error('Error fetching Gemini response:', error); chatUI.addMessage({ text: 'Error generating response. Please try again.', author: aiModel @@ -99,4 +98,4 @@ } }; -} \ No newline at end of file +} From 76be7baf5cd51687ecad15b53c891dff5f10b75b Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Sat, 27 Sep 2025 12:11:42 +0530 Subject: [PATCH 4/4] Update tagHelper --- .../chat-ui/ai-integrations/Asp.net-core/openai/tagHelper | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper index 336c48a000..ad95de3f5f 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/ai-integrations/Asp.net-core/openai/tagHelper @@ -85,7 +85,6 @@ author: aiModel }); } catch (error) { - console.error('Error fetching Azure Open AI response:', error); chatUI.addMessage({ text: 'Error generating response. Please try again.', author: aiModel @@ -96,4 +95,4 @@ } }; -} \ No newline at end of file +}