From c5abe02f77ef411a3ef9be642a8ad73a0492a22b Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Thu, 25 Oct 2018 17:17:51 -0500 Subject: [PATCH] add multiple language config --- BotSharp.Core/BotSharp.Core.csproj | 2 +- BotSharp.Core/Engines/BotPredictor.cs | 4 +- BotSharp.Core/Engines/BotTrainer.cs | 4 +- BotSharp.Core/Modules/ModulesStartup.cs | 7 +++ BotSharp.Core/PlatformBuilderBase.cs | 53 ++++++++++++++++-- BotSharp.Platform.Models/AgentBase.cs | 33 ++++++++++- BotSharp.Platform.Models/Intents/Intent.cs | 7 ++- .../Intents/IntentResponse.cs | 7 +++ .../App_Data/AgentArchive/BotSharp_zh-cn.zip | Bin 0 -> 5969 bytes BotSharp.WebHost/BotSharp.WebHost.csproj | 6 +- .../{BotSharpNLU.json => BotSharpNLU_en.json} | 4 +- .../Settings/BotSharpNLU_zh-cn.json | 27 +++++++++ BotSharp.sln | 26 +++++++++ 13 files changed, 164 insertions(+), 16 deletions(-) create mode 100644 BotSharp.WebHost/App_Data/AgentArchive/BotSharp_zh-cn.zip rename BotSharp.WebHost/Settings/{BotSharpNLU.json => BotSharpNLU_en.json} (93%) create mode 100644 BotSharp.WebHost/Settings/BotSharpNLU_zh-cn.json diff --git a/BotSharp.Core/BotSharp.Core.csproj b/BotSharp.Core/BotSharp.Core.csproj index 127c3644..1b75e69e 100644 --- a/BotSharp.Core/BotSharp.Core.csproj +++ b/BotSharp.Core/BotSharp.Core.csproj @@ -75,7 +75,7 @@ If you feel that this project is helpful to you, please Star on the project, we - + diff --git a/BotSharp.Core/Engines/BotPredictor.cs b/BotSharp.Core/Engines/BotPredictor.cs index 5c27007c..356852ff 100644 --- a/BotSharp.Core/Engines/BotPredictor.cs +++ b/BotSharp.Core/Engines/BotPredictor.cs @@ -58,7 +58,7 @@ namespace BotSharp.Core.Engines // pipe process - var pipelines = config.GetValue($"{meta.BotEngine}:pipe") + var pipelines = config.GetValue($"{meta.BotEngine}_{agent.Language}:pipe") .Split(',') .Select(x => x.Trim()) .ToList(); @@ -66,7 +66,7 @@ namespace BotSharp.Core.Engines for(int pipeIdx = 0; pipeIdx < pipelines.Count; pipeIdx++) { var pipe = TypeHelper.GetInstance(pipelines[pipeIdx], assemblies) as INlpPredict; - pipe.Configuration = config.GetSection(meta.BotEngine).GetSection(pipelines[pipeIdx]); + pipe.Configuration = config.GetSection($"{meta.BotEngine}_{agent.Language}").GetSection(pipelines[pipeIdx]); pipe.Settings = settings; var pipeModel = meta.Pipeline.FirstOrDefault(x => x.Name == pipelines[pipeIdx]); await pipe.Predict(agent, data, pipeModel); diff --git a/BotSharp.Core/Engines/BotTrainer.cs b/BotSharp.Core/Engines/BotTrainer.cs index 3833ff20..abc0b5de 100644 --- a/BotSharp.Core/Engines/BotTrainer.cs +++ b/BotSharp.Core/Engines/BotTrainer.cs @@ -45,9 +45,9 @@ namespace BotSharp.Core.Engines var assemblies = (string[])AppDomain.CurrentDomain.GetData("Assemblies"); var platform = config.GetSection($"platformModuleName").Value; var engine = this.settings.BotEngine; - string providerName = config.GetSection($"{engine}:Provider").Value; + string providerName = config.GetSection($"{engine}_{agent.Language}:Provider").Value; var provider = TypeHelper.GetInstance(providerName, assemblies) as INlpProvider; - provider.Configuration = config.GetSection(engine); + provider.Configuration = config.GetSection($"{engine}_{agent.Language}"); var pipeModel = new PipeModel { diff --git a/BotSharp.Core/Modules/ModulesStartup.cs b/BotSharp.Core/Modules/ModulesStartup.cs index 16ccc2e6..c6d462ee 100644 --- a/BotSharp.Core/Modules/ModulesStartup.cs +++ b/BotSharp.Core/Modules/ModulesStartup.cs @@ -34,7 +34,14 @@ namespace BotSharp.Core.Modules if (options.Modules.Count == 0) { + options.Modules.Add(new ModuleOptions + { + Name = "DialogflowAi", + Type = "BotSharp.Platform.Dialogflow" + }); + Console.WriteLine($"Platform emulator not found.", Color.Red); + Console.WriteLine($"Using default emulator: DialogflowAi, BotSharp.Platform.Dialogflow."); } this._modules = options.Modules diff --git a/BotSharp.Core/PlatformBuilderBase.cs b/BotSharp.Core/PlatformBuilderBase.cs index fbd30c42..789ef29a 100644 --- a/BotSharp.Core/PlatformBuilderBase.cs +++ b/BotSharp.Core/PlatformBuilderBase.cs @@ -4,13 +4,16 @@ using BotSharp.Platform.Models; using BotSharp.Platform.Models.AiRequest; using BotSharp.Platform.Models.AiResponse; using BotSharp.Platform.Models.Entities; +using BotSharp.Platform.Models.Intents; using BotSharp.Platform.Models.MachineLearning; using DotNetToolkit; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -151,13 +154,53 @@ namespace BotSharp.Core var preditor = new BotPredictor(); var doc = await preditor.Predict(Agent, request); - if (doc.Sentences[0].Entities == null) - { - doc.Sentences[0].Entities = new List(); - } - var predictedIntent = doc.Sentences[0].Intent; + if (predictedIntent.Confidence < Agent.MlConfig.MinConfidence) + { + var data = new + { + token = "openbot", + info = request.Text + }; + + using (var client = new HttpClient()) + { + var response = await client.PostAsync( + "https://api.ownthink.com/bot", + new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")); + var content = await response.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject(content); + + predictedIntent = new TextClassificationResult + { + Confidence = Agent.MlConfig.MinConfidence, + Classifier = "ownthink", + Label = "fallback" + }; + + Agent.Intents.Add(new Intent + { + Name = predictedIntent.Label, + Responses = new List + { + new IntentResponse + { + IntentName = predictedIntent.Label, + Messages = new List + { + new IntentResponseMessage + { + Speech = "[\"" + result["text"] + "\"]", + Type = AIResponseMessageType.Text + } + } + } + } + }); + } + } + var aiResponse = new AiResponse { ResolvedQuery = request.Text, diff --git a/BotSharp.Platform.Models/AgentBase.cs b/BotSharp.Platform.Models/AgentBase.cs index 7da90b26..9aa424c9 100644 --- a/BotSharp.Platform.Models/AgentBase.cs +++ b/BotSharp.Platform.Models/AgentBase.cs @@ -1,4 +1,6 @@ -using System; +using BotSharp.Platform.Models.Intents; +using BotSharp.Platform.Models.MachineLearning; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; @@ -10,6 +12,7 @@ namespace BotSharp.Platform.Models public AgentBase() { CreatedDate = DateTime.UtcNow; + Intents = new List(); } /// @@ -42,5 +45,33 @@ namespace BotSharp.Platform.Models public DateTime CreatedDate { get; set; } public TrainingCorpus Corpus { get; set; } + + public AgentMlConfig MlConfig { get; set; } + + public List Integrations { get; set; } + + public Boolean Published { get; set; } + + /// + /// Only access text/ audio rquest + /// + [StringLength(32)] + public String ClientAccessToken { get; set; } + + /// + /// Developer can access more APIs + /// + [StringLength(32)] + public String DeveloperAccessToken { get; set; } + + public List Intents { get; set; } + + public String Birthday + { + get + { + return CreatedDate.ToShortDateString(); + } + } } } diff --git a/BotSharp.Platform.Models/Intents/Intent.cs b/BotSharp.Platform.Models/Intents/Intent.cs index c033a902..ea5ae3f3 100644 --- a/BotSharp.Platform.Models/Intents/Intent.cs +++ b/BotSharp.Platform.Models/Intents/Intent.cs @@ -1,4 +1,5 @@ -using System; +using BotSharp.Platform.Models.MachineLearning; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -39,5 +40,9 @@ namespace BotSharp.Platform.Models.Intents [ForeignKey("IntentId")] public List Responses { get; set; } + + public AgentMlConfig MlConfig { get; set; } + + public List Integrations { get; set; } } } diff --git a/BotSharp.Platform.Models/Intents/IntentResponse.cs b/BotSharp.Platform.Models/Intents/IntentResponse.cs index 717ddf3b..95f4630f 100644 --- a/BotSharp.Platform.Models/Intents/IntentResponse.cs +++ b/BotSharp.Platform.Models/Intents/IntentResponse.cs @@ -8,6 +8,13 @@ namespace BotSharp.Platform.Models.Intents { public class IntentResponse { + public IntentResponse() + { + Parameters = new List(); + Contexts = new List(); + Messages = new List(); + } + /// /// Guid /// diff --git a/BotSharp.WebHost/App_Data/AgentArchive/BotSharp_zh-cn.zip b/BotSharp.WebHost/App_Data/AgentArchive/BotSharp_zh-cn.zip new file mode 100644 index 0000000000000000000000000000000000000000..972a28efc10fa42947187218564398934a9f0079 GIT binary patch literal 5969 zcma)A1yq#V+NSG}(jkp>cQ-O1IDnvpfiQG8NJ+_nz)*uA0un=a3`0og3?K+1QVJ;D z0!rS&yS#e*z30F0to^M$^R4}?clO&4P!}7A3WI=v0E4I4R1f19Ax7`rEUg?ZZ9zf~ zo~|yXpACUPK3ze+Vbq9GjUiBMT>P~-aG?Yj1E`BnkSAT?$ACUThhD({ib;fii^g;D z`i|&qgmht0C2u+5f1QQx&RjSHePU(p#-ttyW*YOs&yNI1djqp4=0ffyoHj~g>w4#DvqMY>jip-L{ zLg{rn477}JQWU1}p44YygWG3@O_Gh; zg$mIa?BT*^A`d?E&otc#Sz#e#*v=^LnD)G=+Xm&V=N_a0J}^uj$d`A-)&ns`i2+Gm zGnR`?H3E0;1*qUw<*W>m4d4kmm9?!>J-&2g-$hgQDu>!vT{%_Yy8qw)eA@AJ|ih+1?oYC^%bNnkT zmuD>8?;U5Y^U5{Gq_}!$7`4J$M>1;+K~F4M&V$vichI>&TwiJXWatvPPun(JyjFaA zgg3^)e61pPjjL*~m-H=>R(+9i1HUH8M+ZO`=&CtL7w%S^`x$qe9lsl_*v`Xw!yZet z7<=#)vK>SbuBIj1bxOW8mp{|;5OZ=^IDbL?gMl;#ue++j@g9q5yTbtCQ*G8RZQ67c ztb(WArxoJto%h87>jCjK?9zsGqbBA(|1;uKlG(?sD&@CiSCcq90kT$dYZ=sj7&eatv&L<2CbwmOWI#@=esz{&u%)A@aPvG4l0Iv?A4n`-^lka%;hqSi z^6-7FHfi{jD!aCIKyVy_%BR|lY{7W!Du2cSK%vemj1KmSqiKSrtZ1p%K!AcfqhWb^ z9B!KMC_pvPa5HQaR_93*n##Oy=nA|@0luvwtOlh~hE+yCM(Lk^9;31F;94{m%yzB~ z2FlBol>#CW9mGyhh{eRfAi(}7+lu|aw!QD|3G(o?^!L0UU?*th^4-)!>3Rt% znpBZTr!fO%h=KBLzR7bO-w4g1869nMFfka+hH21wotzLWk5nrU=Lt_y6^3=DvbZAl zMd$t@G2`vGy>M~G^wr?z(vzjPibt{&-0|h*K{507^#?}IXRY-I<8>ctBtesmQ{5Rc zIx#wB@!{ens|~@YJJf=%)-9jA_vV_tp|_=$lH=^_TVJrykom@EwY7MhX9k|W`eI~j z9nhS0GdnpimKGXvles)-Z3chu+Ix@wj@6(&809dFT-Ad(!b*JdY z8T6U;L}02uZ>}xb9mrW%zg{V$2{kS9!gn9=U5wcqdg|OzPrVbqAYttf%c43}$p@C` z80_oRS~E7+s^`+&WNz_4e=w(JKVlsFl8Ie{KK8=U>X}C6wZh`+1qe*q+#G*oYp4Y5 zT|7{)W-K6;Jy2xSsZGQugJQc{GNGP9dVcP)yE9dm;k4DN*nq5ig0yxV1mniB|-Cg{fdmlOJU0B9_0pd2@bIsuX6|%xghnye+vl z-cC%!c}pD$T;1*Ow@_2Q+fw)Lm6$NTXj&QY1?*Y^IW?~>@ys)|DyOhLm#XZF^Xj9u ziI!J=>Cb7O!N=p>9XBO%uJ}90mC~HH2cwX#ijigEuFBc8v4(rponwG?C4p!~e{rW`g=^0kGoXAWo$kAA=JL1t^xwUnl22gu4j1%szu76gne~ zGIC=nq2el1#X4rV&ogV2kqKcNM1ES3vbZ9ZG2KwxMzw-t4FS;{MAM?g0==#&|ATFs zuaoSJ4c{Qu^hU65!r*9_l@!Sh839LJo~mY=06k~HIZY@Jc zmP*tnLV~o^`{2+4^$F)ovJGyv2DxrhLy9wIFkLxLZALO91su^#Bs=dT(&Cz)OJe!Z z@A_z$e5UBja38BNkoGtc%4(z`bWz-X64qs!p24sGvAdKG>GfJRjQ)8uzsOVhW|v)c z9@4-n#_Q4dv`?k*cxO4QIe?9bW-N}|gPOMPQv8di8{HStBKGYMQtErM zhV9gEjXDIPDCJaZLE(+ctm|(V&yXXe=f`;A4j1oVw9+OVxdy@;&jRjE?x+yqwg5Xg z4%g`(ZxsM1>TUST5s8!|1teQJPLG6zgo5YpDFh+Du8p?5L4GUC?SXk=NoerBWG7#B z5FF#8uDl+7G^ocjeR0qSKgvc8F$|f2)VHa0z29_b<#Dbky}*HP>k(Tnwd{Nxo{j)p$YN3? zCN_%{IXn2K7u#tMljkqm=H-~>zmZ+0 z_a)=m;}Bd7j0o0$O7EAgFLPo3$paG19^N;;z5QT4$~^+t;_ro{ndPiT&X;T zp&h_}wz`4hC6VTgxX4MfYI*%Nx(gN7v?N`!fr8dAZ}VQZCDWbKnr`+&Q&l3!OONJS zUclw|TUiN8#T1A;6>xjg``Mvx6rgNBX6oVx6v)Jo;fK)Zd;;aVV}@(*OhW1LZxcwU zZ4y39s=-<1Z3?My=wz`LI6RwSW6;ZU2q&#kAxF(l8fk}DsD(-l_g1swcyxN~ydSG3 zv74rRxfST!`l7cGrD5iVLy;P(oqMC(zT2=lES%WSAcj*YXwdmCAx>d!FPD;-`2Hx? zyEG@#B|%R@kF}yRxCJPlU;TN$xy^3P+L+#Jy2f_jn#674t#7(T!tcu~uTxZ>m_Nr$ zOb7@j4LJ?j|FT>ebo*k9ISszve7{w$bZ6%H{G&a>;_RG$t7>^$gU6u#*4Sj)x^kk5 z+A4t2{?)sZriPZ=>x;{<(bO^OA%V2M&BfRJ)*J=Bws^?d$5S8F3)%phT{?qLhU3F2a*%N+d*R9m0Pm5goq~|#BF}8u`$N0{IuV|$ z;F0-^PI5eDZ>5)b)}FjI|E6oDXK^A%VRQQC^NAs5(!TH__8{HR>FjuRX~2OOQ-PKk zpA1C=QMnvog6zHlH7-Re4j&E{8GhX)PUe+4SwmUpjkQ-o(&m}>P+221@SE$^xt+Pd z)VCkXiAP1*Bx9x_*-7Gj0`;iDp_t**bLU|Hv-5yjW;{k%YjO-`R13yYQrMMVEC&v2 zfR5^&dQ-d*uCHwhTVIsFk7n(v^CoI&vtXek@V}2{)W4a<#nSoTbDwk4i0+~aRp0hG zHQO@Y*!%Z2*Ks?Zm-$^G6HW&($_+)N7q{tj++V5aFTwAKDHYfVt9deK^7No`%4TCI zq+=jo*--S!&Yu7LQBb;nrKA-dECD4PWy(usdlx@dV5B(ISRf}17gXrvpJl{zdn1q; zQ_K^r6pE+M7dlCD)saX~m72N?d;r(QehkOC?c{uyGRj{YJ6_VTUBvA81+41Mvs->D zjSZuwI|>^_Pid6Q)|?1#oJF*6V7opTewncf-7KPhD1U?W;c^W`1*oSFH>#a!&(zr^ zw}MN3Dny+6uvIqg-zpmqjjW+0A-%Vd{A6-JZ{}k5j5p!d)$FsY#q$A$_Wpsi2YD>+ zuD7+8&v;^3F7ma)Ta&*Yg|~nghFcf*CKFrEq_?~u(J5cAoP5#+n=Mp5DjbXdl>LQe z;xn=Te(Qw?@6CiypyhI3TN|(S#YV-a*Jxv_@b%bVk@g{OsQ9HwCdInc_mvEQ3hse# zHsQ1F^X~UF45n@@je1eaOX{qbGUaVxJ^jiK;*W^Y%qG82W|zy_-s2Fh!r6sNi}4v4 zrnO!6(l3t2b_oJF>$AcJccR!=hf#I&n3s`xk}!qQj&=dUe~e7dKe)i3!g467Ri_(B z9(jTuo&xYaF2vs|h0WIV%qSC-t=9llAh?@O8jPc3y*e7^6!X_8Sh_fE7@OCFuo>ny|v@Zs80P(1c$R@HflNhm8L#?DaOS}*$ITt>lo+}}pMep8&s zSf>2gWvEa6(b;%QwzO+np5yCvu`)7s0q9GzxH_IL9+#*`O4q198OYodEFzk=&HJFg z2FixSdAF`b(PxNqiKkY(?C4M32-!zi7^QTES}EZJB0}*byX~UIhck`qDCd{Ykdx~@ z!R?84=|uf1jFzey7U3jnkH_ZxxFg1heed3TbkfM;b|rnE-H1GO{R5M%ii={7X0aEu z$I_mwa&0TZA$$8g(nIXxdm2nA8!Tc(Uv}94eAzz+RV_;=r-x|D?jJcob|{i(19Z+_dVBp8*|!K@a670~35d`=qja?$ED5&=#>CrV zY$3{eVq@ep2IUMFlv`Msy1~#LjUp1BM`k4YLAXXRMFuOsa58(jK9Vk9**pH`B5rX) zUw8AXsD<<4)=~B$^hCb!tZTMUYd@9FHMVIolcKCHcS~~{HhMA2ptcZTX?4=-Fn*?( zIW!dULhJS1mAth0@cPshOX-cWeZtnZwya_4&eG3r;++Gl^vjXl_#LA`ujl+6bm749fYxL$tQz_n{ARIH%G@XCuPhUsI2 zb@(=NQWv}I-i0C{O-3v8^ZE!&5;cW>H$H?&-(wkmj)RcPNR(|-dV@qehvalnu7Tj*w#+a+3~kiy3WGP0KwTUlRGX(Lc$qHdjghylf$!2?fAas zy=x~YVp4X3j}GEh(q9`HhDHz9E?y(`;oVL`sy2npM44Vu^A1tQ#D)=wfTBMPJfYVT zXTBSZPCl4eR2V-A#$Rc|OM>z5@+;l=`^jJFpGz9?r`$qsf0By7pZk?s;P`n6y=y>| zNk96{9})Nms_1vXUz^!WM&hR=p_!?F2K-Yt{T=_;F6y!+{weP0|NR61_XhcQlwXVf zWykeX?x64e4=DeOYQL6|%YNafY?J&Q^grFh?|S{3953t5PuU~;zYzb6Qolyj-x2Rq u{6zd=;6J6 + @@ -91,6 +92,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -100,7 +104,7 @@ PreserveNewest - + PreserveNewest diff --git a/BotSharp.WebHost/Settings/BotSharpNLU.json b/BotSharp.WebHost/Settings/BotSharpNLU_en.json similarity index 93% rename from BotSharp.WebHost/Settings/BotSharpNLU.json rename to BotSharp.WebHost/Settings/BotSharpNLU_en.json index 24d0c694..fbdb107d 100644 --- a/BotSharp.WebHost/Settings/BotSharpNLU.json +++ b/BotSharp.WebHost/Settings/BotSharpNLU_en.json @@ -1,7 +1,5 @@ { - "botSharpNLU": { - "lang": "en", - + "botSharpNLU_en": { "provider": "BotSharpProvider", "botSharpProvider": { diff --git a/BotSharp.WebHost/Settings/BotSharpNLU_zh-cn.json b/BotSharp.WebHost/Settings/BotSharpNLU_zh-cn.json new file mode 100644 index 00000000..537f0c5b --- /dev/null +++ b/BotSharp.WebHost/Settings/BotSharpNLU_zh-cn.json @@ -0,0 +1,27 @@ +{ + "botSharpNLU_zh-cn": { + "provider": "BotSharpProvider", + + "botSharpProvider": { + }, + + "pipe": "BotSharpTokenizer, BotSharpTagger, BotSharpNER, BotSharpIntentClassifier", + + "botSharpTokenizer": { + "tokenizer": "JiebaTokenizer" + }, + + "botSharpIntentClassifier": { + "classifer": "NaiveBayesClassifier", + "wordvecModel": "|App_Data|wordvec_enu.bin" + }, + + "botSharpTagger": { + "tagger": "JiebaTagger" + }, + + "botSharpNER": { + "template": "|App_Data|CRFLite/template.en" + } + } +} diff --git a/BotSharp.sln b/BotSharp.sln index 0dd12b6c..67bd1734 100644 --- a/BotSharp.sln +++ b/BotSharp.sln @@ -22,6 +22,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Abstracti EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Models", "BotSharp.Platform.Models\BotSharp.Platform.Models.csproj", "{C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Platform.Dialogflow", "..\botsharp-dialogflow\BotSharp.Platform.Dialogflow\BotSharp.Platform.Dialogflow.csproj", "{6A7E5DC1-3AE3-42C1-8F67-3131783646EB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution ARTICULATE|Any CPU = ARTICULATE|Any CPU @@ -206,6 +208,30 @@ Global {C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}.Test|Any CPU.Build.0 = Release|Any CPU {C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}.Test|x64.ActiveCfg = Release|Any CPU {C4F2EAE5-F2C7-4F52-9DB2-7E76D7080C72}.Test|x64.Build.0 = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.ARTICULATE|Any CPU.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.ARTICULATE|Any CPU.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.ARTICULATE|x64.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.ARTICULATE|x64.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Debug|x64.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Debug|x64.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.DIALOGFLOW|Any CPU.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.DIALOGFLOW|Any CPU.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.DIALOGFLOW|x64.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.DIALOGFLOW|x64.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.RASA|Any CPU.ActiveCfg = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.RASA|Any CPU.Build.0 = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.RASA|x64.ActiveCfg = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.RASA|x64.Build.0 = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Release|Any CPU.Build.0 = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Release|x64.ActiveCfg = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Release|x64.Build.0 = Release|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|Any CPU.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|Any CPU.Build.0 = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|x64.ActiveCfg = Debug|Any CPU + {6A7E5DC1-3AE3-42C1-8F67-3131783646EB}.Test|x64.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE