From bd30a54575d6ce392215634bba9fb7c3df02c1f3 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Wed, 7 Jan 2026 14:27:53 -0300 Subject: [PATCH 1/6] Add sample CLI using the Grok client Showcases running x/web/code execution tools simultaneously. --- src/Directory.targets | 2 +- src/Grok/Grok.csproj | 31 +++++++++++ src/Grok/Interactive.cs | 118 ++++++++++++++++++++++++++++++++++++++++ src/Grok/Program.cs | 36 ++++++++++++ xAI.slnx | 1 + 5 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 src/Grok/Grok.csproj create mode 100644 src/Grok/Interactive.cs create mode 100644 src/Grok/Program.cs diff --git a/src/Directory.targets b/src/Directory.targets index 3eae117..2fb8627 100644 --- a/src/Directory.targets +++ b/src/Directory.targets @@ -1,4 +1,4 @@ - + diff --git a/src/Grok/Grok.csproj b/src/Grok/Grok.csproj new file mode 100644 index 0000000..aebf1d0 --- /dev/null +++ b/src/Grok/Grok.csproj @@ -0,0 +1,31 @@ + + + + Exe + net10.0 + grok + Sample Grok CLI using xAI and xAI.Protocol packages + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Grok/Interactive.cs b/src/Grok/Interactive.cs new file mode 100644 index 0000000..fbf0ff4 --- /dev/null +++ b/src/Grok/Interactive.cs @@ -0,0 +1,118 @@ +using System.Diagnostics; +using System.Text; +using DotNetConfig; +using Microsoft.Extensions.AI; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Spectre.Console; +using xAI; +using xAI.Protocol; + +namespace Grok; + +partial class Interactive(IConfiguration configuration) : IHostedService +{ + readonly CancellationTokenSource cts = new(); + string? apiKey = configuration["grok:apikey"]; + GrokClient? client; + + public Task StartAsync(CancellationToken cancellationToken) + { + if (string.IsNullOrEmpty(apiKey)) + { + apiKey = AnsiConsole.Ask("Enter Grok API key:"); + Config.Build(ConfigLevel.Global).SetString("grok", "apikey", apiKey); + } + + client = new GrokClient(apiKey); + + _ = Task.Run(InputListener, cancellationToken); + + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + cts.Cancel(); + AnsiConsole.MarkupLine($":robot: Stopping"); + return Task.CompletedTask; + } + + async Task InputListener() + { + Debug.Assert(client != null); + + var models = await client.GetModelsClient().ListLanguageModelsAsync(); + var modelId = configuration["grok:modelid"]; + var choices = models.Select(x => x.Aliases.OrderBy(a => a.Length).FirstOrDefault() ?? x.Name).ToList(); + if (modelId != null && choices.IndexOf(modelId) is var index && index > 0) + { + choices.RemoveAt(index); + choices.Insert(0, modelId); + } + + modelId = AnsiConsole.Prompt(new SelectionPrompt().Title("Select model").AddChoices(choices)); + Config.Build(ConfigLevel.Global).SetString("grok", "modelid", modelId); + + var chat = client!.GetChatClient().AsIChatClient(modelId); + var options = new ChatOptions + { + Tools = [new GrokXSearchTool(), new HostedWebSearchTool(), new HostedCodeInterpreterTool()] + }; + var conversation = new List(); + + AnsiConsole.MarkupLine($":robot: Ready"); + AnsiConsole.Markup($":person_beard: "); + + while (!cts.IsCancellationRequested) + { + var input = Console.ReadLine()?.Trim(); + if (!string.IsNullOrWhiteSpace(input)) + { + try + { + if (input is "cls" or "clear") + { + Console.Clear(); + conversation.Clear(); + } + else + { + conversation.Add(new ChatMessage(ChatRole.User, input)); + var contents = await AnsiConsole.Status().StartAsync("Sending...", async ctx => + { + var contents = new List(); + await foreach (var update in chat.GetStreamingResponseAsync(conversation, options, cts.Token)) + { + foreach (var tool in update.Contents.Select(x => x.RawRepresentation as ToolCall).Where(x => x != null)) + ctx.Status($"Calling: {tool!.Function.Name.EscapeMarkup()}"); + foreach (var thinking in update.Contents.OfType()) + ctx.Status($"Thinking: {thinking.Text.EscapeMarkup()}"); + + contents.AddRange(update.Contents.OfType()); + } + return contents; + }); + + foreach (var content in contents) + Console.Write(content); + + Console.WriteLine(); + } + } + catch (Exception e) + { + AnsiConsole.WriteException(e); + } + finally + { + AnsiConsole.Markup($":person_beard: "); + } + } + else + { + AnsiConsole.Markup($":person_beard: "); + } + } + } +} diff --git a/src/Grok/Program.cs b/src/Grok/Program.cs new file mode 100644 index 0000000..85e632b --- /dev/null +++ b/src/Grok/Program.cs @@ -0,0 +1,36 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using Grok; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +// Some users reported not getting emoji on Windows from F5 in VS so we force UTF-8 encoding. +if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + Console.InputEncoding = Console.OutputEncoding = Encoding.UTF8; + +var host = Host.CreateApplicationBuilder(args); +host.Logging.ClearProviders(); + +host.Configuration.AddDotNetConfig(); +host.Configuration.AddUserSecrets(); + +host.Services.AddHttpClient(); +host.Services.ConfigureHttpClientDefaults(x => +{ + if (Debugger.IsAttached) + x.ConfigureHttpClient(h => h.Timeout = TimeSpan.MaxValue); + else + x.AddStandardResilienceHandler(); +}); + +var cts = new CancellationTokenSource(); +Console.CancelKeyPress += (s, e) => cts.Cancel(); +host.Services.AddSingleton(cts); +host.Services.AddSingleton(); + +var app = host.Build(); + +await app.RunAsync(cts.Token); diff --git a/xAI.slnx b/xAI.slnx index 5a3b5a0..4b07ded 100644 --- a/xAI.slnx +++ b/xAI.slnx @@ -1,4 +1,5 @@ + From 8d6e0b1be329a11dfb1864b1ff4d87254c0ae770 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Wed, 7 Jan 2026 19:37:29 -0300 Subject: [PATCH 2/6] Render different tools optimally - code execution as code blocks - page browsing with url - web queries with query text --- .netconfig | 5 + assets/img/cli.png | Bin 0 -> 124627 bytes readme.md | 11 ++ src/Grok/Extensions/.editorconfig | 4 + src/Grok/Extensions/AIContentExtensions.cs | 116 ++++++++++++++ src/Grok/Grok.csproj | 11 ++ src/Grok/Interactive.cs | 175 ++++++++++++++++++--- src/Grok/readme.md | 7 + src/xAI/readme.md | 2 +- 9 files changed, 304 insertions(+), 27 deletions(-) create mode 100644 assets/img/cli.png create mode 100644 src/Grok/Extensions/.editorconfig create mode 100644 src/Grok/Extensions/AIContentExtensions.cs create mode 100644 src/Grok/readme.md diff --git a/.netconfig b/.netconfig index 4974e00..7f95eff 100644 --- a/.netconfig +++ b/.netconfig @@ -195,3 +195,8 @@ sha = 3012d56be7554c483e5c5d277144c063969cada9 etag = 43c81c6c6dcdf5baee40a9e3edc5e871e473e6c954c901b82bb87a3a48888ea0 weak +[file "src/Grok/Extensions/AIContentExtensions.cs"] + url = https://github.com/dotnet/extensions/blob/main/src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/AIContentExtensions.cs + sha = c221abef4b4f1bf3fcf0bda27490e8b26bb479f4 + etag = 510868eaae58941d71cdcb5416f44ebf4436a22d342ca5838172127b04252fe0 + weak diff --git a/assets/img/cli.png b/assets/img/cli.png new file mode 100644 index 0000000000000000000000000000000000000000..56bec70b825c4f118de5b48fb30aadb4538cbdaf GIT binary patch literal 124627 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�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

DH%wDd<1Q=e+l+aU}3C>kMK< zT+J#TOxe7%FaohjjVz2qI#0%rKn!!CsQx54Mu-V#KiBqd(NU38p>vJB+= zBU0G;{nZR^srNll_I9mJHLasTtI)r`Pdwpv^H&5eq&~TZN!R_+XC4uw)hI79VP3TR zuD{i%e6#tEqY{yVEjio6Tlg!E@7r0NXar0((>{!Ckf$yqJ4j+g0K=bk@ZT_8+KbYE zxw>4S7xCoXuVKk?G0-!4m2MHvC)NDIb$m8POzHLxgOC1DZvD+^i0=6j6X1$EW8R1& zDAc9A6QyiCwujwbohz?$cpO~w6`9Q%Kr}1WtEa1>!A@&hpPanQnI*h?2oaPR%M zQ;aP#ca+^oRRmhxGa@~{@LzMSi~G}chGQ>JDI zKmTXNEbirqb08*(NZH4=Vq!PzFvt<#@L-E(Z0Yd8zO(4hfGT`U1TQ(;e)Dk2(flDZ zB7TYzaqo^&lij`TV)=t$XScs!XWp_AIXV%j>|A`P&FQcfJzSkg#5v~1`F`0$%#p8i z`N|=dfPZz9T#t8+y9GNNXth}wV>LCH|HRSx*UTL9uUWTbONx&;RjTYt9}jKh2~5ie z^(dH*I&mJs;q}>cLhjTvqzgRc&ro~`&-=N(A!2GWN=;=Del=BiC>A2 zA<|fGEWaTlMWwcraB+WiX_Ut?s6tZpZi;G-!xZEBX}jgl)udM$$())+ZNqkR8>@6e z0X-Uni5qu+GDdjVcVr1D%?TuwZLQ0T;@x0V-d8Jg>-E`fmk1XKEL-A5b2(c!bF3(45_wU#-Q4ipa!@7RrT?6+3n-Bs9XCp z`rVJSsK&ZNB30XC$Tck++VDH~I~1S2$YCewQ@oIWab+6qFuZYT-XCo-Gb$qBAmg3) zEvs3l0GkJ6TvILBlc?q5)N=aNd$08QdcqVUoU!n;yWXfRrr)cAf1~#+F3aZ2wFu;L z*zWuMdV6tBm1M^Lj8WWzH5tya!vjV~cV$Yo<@cl;`t<9i@WB<{ZuPJ8_!v8j&=Hu42d zqP_;%gUHD9*{g#>s0VJ@3!BxJ7gpouUpjS$(r+TYY%MpPZ>UUM{LD6;()SvFWzZP?`pJ8kLlox#wj%^1{Bls(wp@IqZR!44H_9v zhkc4p4xzdBH-|g)D5r=ChYx#;j>K<~OQ+#jTu4VU=^? zeO_MPcL)Gp8XHTgUO(XD-kmGI6~NBH5u9hJt$oYW+nZ!^a&p}~E-vomidD&28O6nm zr!W}IZuy%xZ%*xPF5K>|71z?$y^XvQYPuU(cP5Z%vK*YNFxpyLH?N*MVP6XMx$h8w zAQ_|!y<(nUN`G71)33q7EU_`Esi{{PkvFHOr@z*3(3=&@#LcbnC{}v6DDhcRhT(A8 z7n9FxHfCmBIpVaRZ|>|lxL$mKzHqQVopyh-yY6JUjb)P2X6lFUzN}c6@U))q=|f?3 z`?G_IU-VV%7Ikexnb*y715$Je_>@y!%6B&fUrtOsxYmCluK6P;oKltH#~#_9a3HlM z@)jPg_NmL`PaH4XOwnJPYuGDdHd7u=FXM|m3>!y&QSCw^uJxkTs?zL!2MxA%E35q{_|94p9&ndR6wbaT+cf0C9tgD&$C z!F9kSnjw*&-{;JGAEtK9%T<2^&=3kay`I1WZ zg#T)!l2YLWA;)U-W4@>Qrs@I`YpHdUhT{2^_3RIw?+<=PFBx0$>Ezo9E#DrVWxmsi*%<<{Q2T^BiY;4+w zhtnB-7k*~qii?ZymOEEoQczU<{N%d$T;lBXv>@$gK~q!Kca@QpUSbTluwyw5D|$bd z=e8vAj^Mn%e_1F-ig)v;hI<_*&ODWko&BYj)(=0@sHey6?d{_>Xg?o6P0i~*IjJc_ zt{v>!(G`#X^J5)G%iv%`!!0;2DmArv)oOor{KMdO>7D_4Y2EPWGEOzW>8ZtH z%j}Y*+r>5-R_nUuK0E^ESNLrP-Nv=-mYqo(J^c22TvgHW$kPowwa3pl29+|yv+2A1 zKI!v?l8$UgYkF0Pum@oQj7kSe^S;~VhmAC2Es}#;!51vxz;swD>tBHnjoXk4eZ2{a z&*FZUR~(N+h(QU7YOg8mB?DyCyYFVw&?4!3XOLGj!@=-muF@?Bo8Lqve#pVEvKB>z zC3)H;b8q0Kn|j}~ytAQQxba{UB#NpaQrZ7NDf>CZMp@TjwJ))sGs4laNyZU-4mC1C zquI*HSSBC$Me-rP_aSeuuFiSnQ}KO?f_qrAioLpddOeq-Sb7%f6PHHc6sjJn34Ezo z$ZY1IDXY0C5;q~SiE$0to&1K~Ha~b+gHnp*=qhULmE9&Hlafyy#2w)~y)uz%t)hN_qSMQ5}<>oB`{wPqeU&CSjJ&77EB6BUmF*hHtTeMMtM zJ0?W9G8~H?NGq-4rz#E>;(AS2Elik(j(x@mov~z)Q{jJAs8U!gJZ6AKcDJi(3e#G9 z&qfwTz`E1F5&8m zpIC@p{$qB1i3XAVFuVuc$VSGs*CSNVg0Y~}HZAfBHME#}+j(izSnY5VHke9@QVzTu zmhG~6#=+<$WQ%lBz0e=}96l%@>GhS4m8qH+7ozpbL$x|PZ{*9y_q!Jt-e#of@X3u& zmTkRw*M97DZb?bh^RkK6<{5{Q;})|aqI)Z|`x-a6QhEFvBBet+^CG_(%H7*1ETr}r zd8pE#h@W(?X@I!S7B1ks*K5r=#bZ3$Yjo*@c*$kmUpcJpH3mOpJfp(bDkSX$Yi&9&)JIo)&5NH-2T->9|&vtm`Q>T3>=b{{jjJ>+<0P$QN{2RqM7l^=fTXj}j$HaZ z>$uTYhXXnY+jrX4Z&0jG8BH(_S01h{Dw_D|@7Ph_Y|$*93|?a;47Z*n@6_YL*xYOx z?_?wF)g$>JbfmGdQPBAM*zz({R_|J!dT6YcpJ*%-A0H4!ptS}EHDEKB+R@kYq1Oeb zeJDC+Is)xKuAel3VLll5X6EDbQZBZbnKK-;Ie6GVp*I9Rpcsq|#lvv28g*uSi_y_4 zH~KaG*RLNk^1Pt)?>IbIU1f=jYbnRAH>mt?aH}VYkJ9rCYl`DzS#y5UM7BTq-MAIuH?G%G^_5DhTH^XVuK!qW5j@|WmgX)9BWm22oKI@&FFnx=S+I8-M zTn(jGXJk)WIoxJ@n!;1N&S%3F%eVxA<*o^8JFwjLKtl(KLB+Ar4GtwEIc2^20uJGh zp*>-~Gv(cHoEz$PN3e&)sO1=%@)y$l27T`a?PNwDs_>-ZOZ*B64O{qqkdO@t0Fem4 z+*@KA9Dn3bmKB}-N{qPA@?_%wh_R9}(^2=7UC}rDIZ%?7&&r&E~hmegF&1W@6 zYEzgLQV!Y7*|~VusPD#P8!^G&H7{meBZksRehb#XHY<)SU6DYwz#(cs`F-9bn}zQ}X6b zAomhJ>m|G~L3_BiV^?2*vq;Y(KoRCW_7U++?ukXB<< zGFu1UE%9M5VAX%L5FLp}qI)FgBSTWbk!9z&^RX+R$$M4fRQyO^>^>XE2pXShN;1W+ z_oR+RB(GV(QN6W=Y4&wOU68a}*D3ey~`p5Z^Oa zhxBaMdNgS)*`O?IiXRC_yj$;FdJ18dW2miaUkCZWEUF8&={HoZ^+~A@eIzlpKB~?l z<(qqHH1U>-MDuxfyY1HI^5YtQuPttRn)20Dm0N@q2a|^30v{%ZZSgt7cF(5mPw=e% zFZSNUtEseWAC97;(rgGK62$_dh$2#?#DX#+RjQPrqSB;Gl?0JNDMCa9q=P8Ei1Zdj zItWOY8d{{60HFjzzI~i|=9%|h-}hU;Kj53?nuReW=bZb#ce$=>?=2J}9_@1EaC1q3 zj*2^aZDrb0qY-8-58VlOZ82BswCUG)Gd$tgf!)E|F5IT{71}SHdS0c3$z)?= z15bD?v;qDpE;pA`R#x_XSXlYbpSs~DQtLAKkoA+|{m$w53pq<0c(=KU%y)G4 z!OB;erCT)^X3QbcBm#1`s}iy?<=4yH1^DPabNa;itEXb#r|k8-r(ytS6QVQyee!n; zO1Z`CTxIYH!o0+T7)BN2hw9Vnt2y=u*MDyhwOR>*N~LCh^tynZ=3T3)T(st5&n^mI zsC(Pup^f3j3$m~Xn|?vVbW!rg1{dQxRx>!rGKI>#aHD71=BX2fW)3ulSAyG!p8>MqDv_p$*EQx)*1apRCoJM*)7Lxty@(O`1 zD9VgeU5ldTlt;g~fMlZt25)hV68=qCpetUbp$1y=>jW^fiIh$A^krZ2D0Uz7+vzrM zXRzVE$sxB=TJ}w0bN!HuR#1dW=3o;S*L+j4_0Sx4%|fat&}l#lGw3|=DU=^#{EM4k zy3dL!S1@B%uU?_;^nKI#m>OoQegElG&4Eg;;gF@rO_&=j@K37bZk4`V<#zSP0Wf!l&uBgC*H1|B1|aKz1lkv6c`)l!2J5U?L{ z8MkM*@_16z_m*{Bw!|>j*7gsOL#?kIo!^4%96=7Ofjt#d{c`xbXa2yZyHc-@!|0Oc zZLli2rxvb!*Zxv5=bHYZ(}iC6Q-JChWe49rlQO``nJrNtI7R(9dzML&IAzWmm@tugY>2Xm5gi^aFxvQ{?Y!w7DsoQ8-hz@M~s9HV`IZGEY*GUV&7BO?JEqb`;A2o z_vbP6VX^2ihQul^YQP=C^iwhr zmn8YA=&dTFZPBxknIoo>>sif()f!S|T#FbI@oYR}+{PM)Q7CN18g#~#Q8eQ+4N1Km zIm;gY%13}dIYXF2N!fc(r1f#4n_U%}MFKV%k`m5WJfN>viEJ{<(bSb0Up`Z2^A#Z- zqxiiygj6q?tdo}Rtd)tOwY2J7*3_^(T(+Rc+WE0;@lIV;GlCc5!noZQgOX|xFfk_Z z6!+rj8W;9rRr&nRX;}zr=;bj56C2;1*IFJH^bz)BJMzspE;9;}rH5PMn{mqYfe#@Wf>sn+;h^cj`TT%=p7zpYWVNN1?VIgyPNX6$H0y|uD*pMgeuI2TzX z)h*Q|kD0B3jeG0YX1pyA#*Lh5JE5OBgcyRtwM5E%{^mtF35Hm>`zq501SLa-Wl`l9 z-AC|WfBaE$TTN!idZ)hi(A(SiD5AuG^K}LsHy2!KbTr@6%F1!xO{&jPUiOGh!&@iz zmDkqp6jQz~7gIwSsUd6e`c*wRxz6#b!uw`Ct*rENbZUlZnZOepn;%Qo`K=Q<(EyZ* zFD);J52OnYBo}DQlsOZ#OA+*Ra6S{$y$Po?SUSS)GJ50bt(vm6&MD=&#V?lwefHM? z`1hWsDy`&XCC9b?ksK8{^O2=(i!J- zT*bN@@tR4U62*V*8c+8P<;XMmNCcoyT#2c66556A8>@w)PU;|pX76P;6(EkiNNxr$ zp|bKP7uB7SuQYKyELSCB_k}?QK;l+K;y(eiUu`lvwRHKRTS@=w&oGLNtIg_FgS+IH z2C~0AkZ5KMT}G3am{IU5c)8Km@+xa1pRvX1p!G5yTvP+G=5+7~CDnbgnEv%DPGd;t zNcuw^>+d-tlmniM#5FAr&Bex)@8Z3y=@WlOSorE`2%|9z=^1q~8hN{Q%*wBs^m=@& zFyhW-jUkR~!SxU3qDA_6iK#!_ddtotKkO-49y#gWY>D8WXV0BO5YpX#etxtCXBn$P zgFhksy(Sba1plJ9qT-MZvs>X=gNZvlA zGpEAIK26G~d1Qo3vq6&fk-!!G(;4wI8Z^>5uC%;5B2Bl>m7jZ2>5}G|m~3n11H?$v zGu=(fJun9GkBC}{tPMaB8pu|yzn(@YJ~BM5a&jQiXl0(|I87S z!UDw^1fdP-P1<4n?7%UAdqcV`Q{q}F@1{6-4$vez)XrJ*>vkMUoT=fS?vwxs^J-i` z%C=&&ps7GbqEtFyO^Anikts_~*l*y|$Q_1zo#b94K@fgvM1mrqK=cGwLNlNf zN1QndVWL|dY4z@GXoB=3j?Gl-@wxA7;|}O=35PSQ2u3a}?n`r<-Izjt$#r!HzKE77=0f?jrX0nW$Px)Z0Y?9<|S9tk8c4I*g#UMRV3p}T{ocsiWo6K zInnc{^Ak?K_94R@QFV^D=nLds^6^Zl+@X zmK>OuTv)gM_RuDvt5(bSR$c4*ZH`lFi<}h#I^yeIM9_bd^N8K#nzb6gqD2N>^%qC9 z(h>L0CF^*-{Owx5edhbin`c`|F3Bg#kgNlVr8ip2)-SSdQY4gZ@t>4CECWSG#$y`8 zXw67oxa^D?WQmGTaN4AwUAYYb<&$n?&)P(Y3yh&Lv`W~m&71aXn^(M?reB& z#3J{DL#mtl4O8M;!2yW|?kM!S1g3`&7(`3>MgYHCD_zK!JQ`s{y>gN?D*ES8QBe=L z-jafZq)WjI$qvMhVv;FPHnl8|BwlSwS_$X146Vp02`R&Qdw25aUu08d zEN!qH_m{kfbTq}U&gbgfBQX+>2;zf7nPA+QMMbB(<7VoB_C*J8@1)J{a5ESjx*4Qg zK>hV>&*~uAd9jSK6SG=ueT*@%mdTB@cXyen=)!uqA1vJk`SvRaSAu8_{qAG4u$To}A_OBm}7Ph?&1ex?!FIgC|4FB}oXc!|weV z_5O>S0*on6j|TrsNF;WMh;%l>;!kZx8Oh5}aWW%4c#|@`uT~&XR>{f$;~VLF%r|!# z8mkGY20D_BN~97Pj6(aeZ-={MM#eA<^n1GB4SEH$ynN2G&A+C?DLujM{AaAL_c>nP ze@$fH&;GAzy}N#Y=U*&;?Vp}69gZIKI~G)TG^nmt{U7}RG1V_q!0GAJ*sQF*T}JM* z*W%s~WqACIB=Lm6dft!&L}od2j%1 zNUqAOd~gAXyRX$3{%)ebcW;ND;dim=iHWNg7O68^E~C8V`6Zp_kA_D??A^Hyg#t4L z__URiRCbM(OOp)U>Rg5nho9J?Pu)>km>duB9gpP`{4Hy_{4 z%TXcmXK(QD#c2<>x4$DAUXH2;tBOJaMRY03(z#i71!($q4b`yWPN>BDXWVpN7nMOXsKY#xgGl&$)eofqyBQ$~xq%@&R+*688< zPG|&p1D?9zfp0&4yy4?w-C@h1uS9fac8UHyZ)5`%nWeV@IAk zI1IsfJZ4l0jG-Byoc#9f+g8-zWNM~(x>4q%|8y9ar^XM*-hcK?dU?9rQ&Y(6iMWNY zzOL?9@QOXXy$Cw~^s+yI1WGC@lT6yz#3MQ|PakYN_txp@>47W%(2`{47$j+DCGP|@d&c>Z2kIduGEB$zRq zo?kioTnFp2egFRbwPZWmg2B00ut!Q3>d(-Q=YFfK{FAICCE{J|QsE65i-RM(BU0n{wR#xnSP46M6ODG5kV5eWuGwyk)-K)Ky{S|e~tyGai z&yMl<^Yi#W00o09euYYPxg4L#*YNH?GO9_1j;j@9@+0Wvls?+;01xSmiwK|ZTwxG; ze>8kC2;^lVE=XW7nH-L?tAn1j?*+g=zv6SQMvGq zbZcD0fw5e;PPms?$*+aRHS8{&kN)>F?bJJau#GelTKDirPftqCq0olxtqM19zG)r< zs3Xgrfqy7^2rToqty@MH*L*Jyg5@w_^(BP=JVtzIFr^T*eZ;t;#Wd#x$A50b+x&h9 zGn-apbF(pth||^6Yb7y4o5!*~e}3Ly?4%R9CA5M3`SWKK3M3bHIiJ8TWB4~hx9jLwx7DFnvN)yx3{Uf}t+y5fvBRj>e>Q{s(;>a=i~ns)pCtZw--+LEIQ4(+ z(*F6phu{7+X;pOSU-Os3{)g}U|G(y6_9~wR$v?E7FU;-=+j5T-WCVYIz#bp@`SEzd z15ln90A&OKEV8e-jNH_*!L_Y%*I(I?a4SRT%^~zW*yj2cdHJHo2#Jvoe&?=%!Aek$ zuz?cK5zrn>+W&f8A_NhgA?n=EnxKlI^Wf!d7DjK$^Y4`^N`a&G+aw)VFg$4E6n82X)ZHUHD1$ zvj?whXzb4@7~cJ{%}gphrQppJyHq|8J*f+_qb$o_aX^cYM>JjoLV=a_N}HIA)}tpn z=A#zs!BZ`{R_Ps4a2+6l9)h-Eu0=2(Z?xl_sYSX{9Y&?M*;SG`G`nY}vNQI+g2Jnb zZJg|{$XcC|;2XGr)7Z0f(1V%pO?=mDXPE#9wo0F zF10JCYJ~E3e-%7BaG;}F4vy|9aY+6o=yS*}y^*_D08OROiik9%zEi7{ zXt$M3GQqcd!qshV;wwjNrRqZEh09 zTOnP{FWDU^&=);6sU^dw0Ad(;I*@x3`%#j-FwvqC-H~Mw*_RQ%F$3 z8@JFtw&FY6qzVRp!c55=v;C-}G0jX>-69tKt*vi28O?I*X{W8y|2P#iK0Pfjc%U_O z`&LAlGcs82IX*sqK3&xud@G-}w)Uv0{$wGsL%#=Le29Y}R=BNl0OBw(osUG$_AhIB zT#22O8!X39dsjVh?Zt0UYRKdJtQOcDbU8Y=VkWP`6@#M3w&sXat-6-a<#!Eab5ZGF zZ9+fMw>>FuhT2K^WhW)GPWovn_ReFn_DutHZUtOR@;>MKMg5NH6q+0x(dk2vA2TV$4gT<266>59n6 z$S5j}O&OzUTbuP3J7vo0hSWV=+J6JWm4gQlqEH}=YtB@*Xhu)h3=YJT&!O<0OUuWwWB7#)dBBCwm`Hd>}nb2F25Admw|t5 zgIyfa_~7Z&12#4k&AE`!&SWkKyZm!z07fYazPqZa&LB*_A3XBT!fB9@X zaufA6StC&`cgP1D2Be$dL|4l;WrQS$A`DMWbeJ2rm^o zIpZMfLiCM)LxsOVL}qs0^PjE`+#C(lh4-dFsl3Ox5Mh1APA#@!UHQV=tChb2!6q}c zI?o-i9_jhr3uX>(ErCz@VjH~qxG?q(iN|+MTuv@ytQQ*i0u`2XimJd)ZcXU<75P#T zC!ag`F*8MzL#RrspAd1h6@eo62{3oK*=ul&0tTk=i9>xtL2EglC$imBaXr5t^hO;o zHdc6emycQX*~Q#=ZzHUYP$db6owMbZCdjVAE2qb&;e1uW^5c!jH!AMtxu(cwrHEkg7UlEHhZN) z_&m*ZCXt0$JvHSB^F7qsCaS4tMNzz-9GTX#qvDc(hg`~bk=6trOEN*3Wx_2wNvz@^znJ5D6>X zN=O=M@Uw7%Wui(C!A*s;yuto6B14!0 zV&eAi+?FDzT6Vu;2c5y>fw~sA=R=Di-?QlpqygCz3qWgShQ{-1)GRRKK^x+ zz7Ck-F75%1iK_S=Rvlj&4RO>C)N}Oa{3|<6Efrdd9pqi}gPt5)s}$VQowLva(|yAB zLDqP+iR+p)^#t6duSbnm?P`dk?)ho~s4 z7I()_b0keP6E_w- zaLvdl#!NPNfpVFY(x|O7^l>(6i5WX~RZ7Tg(ND2|Z{$1GLVS*P&D;q~Ay~AIk7nVU z}1t0F*bON zknvnd=Lofo>zrv9E*`rl*p48w1{l2w*LJQ2!4DU_i#g%6(!PLB?!du@KFcR&W-SU= z$bp@TwhvBpNa_jSyqlhPAs{E=&S~5Umxd5wT5X9IZS?5o&BDO(C~2q3DQ<;Ir`bL; zp0LpTi!TvCUxrV@9}DF5zSkH1My0n_mpDGtxps*oGQ>>yMTeoUV*FCa<9qMcBOE_>A{BF*VGPCh(fq zKe?K7YA!0X56}HfX0|gZT#oN~#qAk|Z}+4BWK)^)P$bq-G&D3$+G>}Zp+EHGMa?QK zML}Jb*NzG)rSI4FI>ntik{IP0yH9f}z&n-fqVg&8PP(-Up(eAa?Z=N;Mrn8V-G*_E8YQ?L^L5)?{mtll&kHzFdq8=LW3l0)-ROA?vp3w zo2pw?Z{7~D=XvcSP~&sxS+!hYc|0uY3;5VfqGCI#uuuw@7tx2VU3Y3dC?C11@7R+Z zI#V<2s?t=RLTxl7O(mey9g-y5)Jiy1`ySn(NKp*VF)Ozz-V7ca8>5ajkwZ_qFK5SW zN2R5uy`Oc1O?u@FQM!5+`x4SDU~%bHsSCtEA@P5Dne9N^sR7DJRlnK=W4rtJuexWl zp%9YS*0$yIV+31&A03UjuO;Ka#hYFQOc`c80lZQ#AfAFxy$6XWgiSOesG)?-ZkuQ> ze6oPj&a2jWj)98Jd3)Ft$MD+0yhfjx7Tk<4e6bz)5^nx_(K!%)~fM^8Gki2){h_1|5r(Vnau#k%R@vIH+FV13XkW*X~wtn(to3Dmd&0jJy z>@LkDT}Qrtjgvf?9j|td$^^n?fIWq9d0+tBcB9m`{!7Z!%a%NnPb@7vRCy3B?KijC zKB@mMhdhzIxb}9xXBN|bBT;?f+$Z)gC=VaKQZzd0eVWAo{rmTOBh~&8Se_*8Dd;Bb zPjQ(RBW=XCzS^lmQLgNNNZ{XH7eGVX_RuY{DL38_nYTSG%CSgqM&S)3 zfouKF#50|EbZ+W!?2vGN-&Pb7h@T2-xt_DCl-r@x9*w7¤^upsYi^nvNQHEv2j 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 Y)V)U|l~^ekk)L++nxahl6$AJG1HGbv_W%F@ literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index e128fb7..8d9bfac 100644 --- a/readme.md +++ b/readme.md @@ -345,6 +345,17 @@ See for example the [introduction of tool output and citations](https://github.c +# CLI +[![Version](https://img.shields.io/nuget/vpre/grok.svg?color=royalblue)](https://www.nuget.org/packages/grok) +[![Downloads](https://img.shields.io/nuget/dt/grok.svg?color=green)](https://www.nuget.org/packages/grok) + + +Sample Grok CLI client based on the xAI + +![](https://raw.githubusercontent.com/devlooped/xAI/main/assets/img/cli.png) + +Uses your own API Key. + # Sponsors diff --git a/src/Grok/Extensions/.editorconfig b/src/Grok/Extensions/.editorconfig new file mode 100644 index 0000000..e23a913 --- /dev/null +++ b/src/Grok/Extensions/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*.cs] +generated_code = true \ No newline at end of file diff --git a/src/Grok/Extensions/AIContentExtensions.cs b/src/Grok/Extensions/AIContentExtensions.cs new file mode 100644 index 0000000..550a48a --- /dev/null +++ b/src/Grok/Extensions/AIContentExtensions.cs @@ -0,0 +1,116 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +#if NET +using System.Runtime.CompilerServices; +#else +using System.Text; +#endif + +namespace Microsoft.Extensions.AI; + +///

Internal extensions for working with . +internal static class AIContentExtensions +{ + /// Concatenates the text of all instances in the list. + public static string ConcatText(this IEnumerable contents) + { + if (contents is IList list) + { + int count = list.Count; + switch (count) + { + case 0: + return string.Empty; + + case 1: + return (list[0] as TextContent)?.Text ?? string.Empty; + + default: +#if NET + DefaultInterpolatedStringHandler builder = new(count, 0, null, stackalloc char[512]); + for (int i = 0; i < count; i++) + { + if (list[i] is TextContent text) + { + builder.AppendLiteral(text.Text); + } + } + + return builder.ToStringAndClear(); +#else + StringBuilder builder = new(); + for (int i = 0; i < count; i++) + { + if (list[i] is TextContent text) + { + builder.Append(text.Text); + } + } + + return builder.ToString(); +#endif + } + } + + return string.Concat(contents.OfType()); + } + + /// Concatenates the of all instances in the list. + /// A newline separator is added between each non-empty piece of text. + public static string ConcatText(this IList messages) + { + int count = messages.Count; + switch (count) + { + case 0: + return string.Empty; + + case 1: + return messages[0].Text; + + default: +#if NET + DefaultInterpolatedStringHandler builder = new(count, 0, null, stackalloc char[512]); + bool needsSeparator = false; + for (int i = 0; i < count; i++) + { + string text = messages[i].Text; + if (text.Length > 0) + { + if (needsSeparator) + { + builder.AppendLiteral(Environment.NewLine); + } + + builder.AppendLiteral(text); + + needsSeparator = true; + } + } + + return builder.ToStringAndClear(); +#else + StringBuilder builder = new(); + for (int i = 0; i < count; i++) + { + string text = messages[i].Text; + if (text.Length > 0) + { + if (builder.Length > 0) + { + builder.AppendLine(); + } + + builder.Append(text); + } + } + + return builder.ToString(); +#endif + } + } +} diff --git a/src/Grok/Grok.csproj b/src/Grok/Grok.csproj index aebf1d0..002a562 100644 --- a/src/Grok/Grok.csproj +++ b/src/Grok/Grok.csproj @@ -5,6 +5,7 @@ net10.0 grok Sample Grok CLI using xAI and xAI.Protocol packages + MEAI001;xAI001;$(NoWarn) @@ -12,6 +13,7 @@ + @@ -22,10 +24,19 @@ + + + + + + + + +
diff --git a/src/Grok/Interactive.cs b/src/Grok/Interactive.cs index fbf0ff4..28c756f 100644 --- a/src/Grok/Interactive.cs +++ b/src/Grok/Interactive.cs @@ -1,12 +1,14 @@ using System.Diagnostics; -using System.Text; +using System.Text.Json; using DotNetConfig; using Microsoft.Extensions.AI; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Spectre.Console; +using Spectre.Console.Json; using xAI; using xAI.Protocol; +using static Spectre.Console.AnsiConsole; namespace Grok; @@ -20,7 +22,7 @@ public Task StartAsync(CancellationToken cancellationToken) { if (string.IsNullOrEmpty(apiKey)) { - apiKey = AnsiConsole.Ask("Enter Grok API key:"); + apiKey = Ask("Enter Grok API key:"); Config.Build(ConfigLevel.Global).SetString("grok", "apikey", apiKey); } @@ -34,7 +36,7 @@ public Task StartAsync(CancellationToken cancellationToken) public Task StopAsync(CancellationToken cancellationToken) { cts.Cancel(); - AnsiConsole.MarkupLine($":robot: Stopping"); + MarkupLine($":robot: Stopping"); return Task.CompletedTask; } @@ -51,68 +53,189 @@ async Task InputListener() choices.Insert(0, modelId); } - modelId = AnsiConsole.Prompt(new SelectionPrompt().Title("Select model").AddChoices(choices)); + modelId = Prompt(new SelectionPrompt().Title("Select model").AddChoices(choices)); Config.Build(ConfigLevel.Global).SetString("grok", "modelid", modelId); var chat = client!.GetChatClient().AsIChatClient(modelId); - var options = new ChatOptions + var options = new GrokChatOptions { + Instructions = "Reply in the language, style and tone used by the user.", + Include = + [ + IncludeOption.CodeExecutionCallOutput, + IncludeOption.XSearchCallOutput, + IncludeOption.WebSearchCallOutput, + ], Tools = [new GrokXSearchTool(), new HostedWebSearchTool(), new HostedCodeInterpreterTool()] }; var conversation = new List(); - AnsiConsole.MarkupLine($":robot: Ready"); - AnsiConsole.Markup($":person_beard: "); + MarkupLine($":robot: Ready"); + Markup($":person_beard: "); + var green = new Style(Color.Lime); + var red = new Style(Color.Red); + var yellow = new Style(Color.Yellow); while (!cts.IsCancellationRequested) { - var input = Console.ReadLine()?.Trim(); + var input = ReadInput(cts.Token); if (!string.IsNullOrWhiteSpace(input)) { try { if (input is "cls" or "clear") { - Console.Clear(); + System.Console.Clear(); conversation.Clear(); } else { conversation.Add(new ChatMessage(ChatRole.User, input)); - var contents = await AnsiConsole.Status().StartAsync("Sending...", async ctx => + var response = new ChatMessage(ChatRole.Assistant, default(string?)); + await foreach (var update in chat.GetStreamingResponseAsync(conversation, options, cts.Token)) { - var contents = new List(); - await foreach (var update in chat.GetStreamingResponseAsync(conversation, options, cts.Token)) + foreach (var content in update.Contents) { - foreach (var tool in update.Contents.Select(x => x.RawRepresentation as ToolCall).Where(x => x != null)) - ctx.Status($"Calling: {tool!.Function.Name.EscapeMarkup()}"); - foreach (var thinking in update.Contents.OfType()) - ctx.Status($"Thinking: {thinking.Text.EscapeMarkup()}"); - - contents.AddRange(update.Contents.OfType()); + var grid = new Grid() + .AddColumn(new GridColumn().Width(2).Padding(0, 0)) + .AddColumn(new GridColumn().Padding(1, 0)) + .AddColumn(new GridColumn().Padding(1, 0)); + + if (content.RawRepresentation is not ToolCall tool) + continue; + + if (content is CodeInterpreterToolResultContent codeResult) + { + grid.AddRow(new Markup(":desktop_computer:"), new Markup($" {tool.Function.Name} :check_mark:")); + if (codeResult.Outputs?.ConcatText() is { } output) + { + if (output.StartsWith('{') && output.EndsWith('}') && + JsonElement.Parse(output) is var json && + json.TryGetProperty("stdout", out var stdOut) && + json.TryGetProperty("stderr", out var stdErr)) + { + if (stdOut.GetString()?.Trim() is { Length: > 0 } outText) + grid.AddRow(new Text(" "), new Panel(new Paragraph(outText, green)) + .Border(BoxBorder.Square)); + if (stdErr.GetString()?.Trim() is { Length: > 0 } errText) + grid.AddRow(new Text(" "), new Panel(new Paragraph(errText, red)) + .Border(BoxBorder.Square)); + } + else + { + grid.AddRow(new Text(" "), new Panel(new Paragraph(output, green)) + .Border(BoxBorder.Square)); + } + } + Write(grid); + continue; + } + + if (tool.Function.Arguments.StartsWith('{') && tool.Function.Arguments.EndsWith('}')) + { + var json = JsonElement.Parse(tool.Function.Arguments); + if (tool.Type == ToolCallType.WebSearchTool && + json.TryGetProperty("query", out var query)) + { + if (tool.Status != ToolCallStatus.Completed) + { + grid.AddRow(new Markup(":magnifying_glass_tilted_right:"), new Text(tool.Function.Name), + new Text(query.GetString() ?? " ", yellow)); + } + } + else if (content is CodeInterpreterToolCallContent && + json.TryGetProperty("code", out var code)) + { + // We don't want this tool content case to fall back below unless it's pending. + if (tool.Status != ToolCallStatus.Completed) + { + grid.AddRow(new Markup(":desktop_computer:"), new Markup($" {tool.Function.Name} :hourglass_not_done:")); + grid.AddRow(new Text(" "), new Panel(new Paragraph(code.GetString()?.Trim() ?? "", green)) + .Border(BoxBorder.Square)); + } + } + else if (tool.Function.Name == "browse_page" && + json.TryGetProperty("url", out var url)) + { + if (tool.Status != ToolCallStatus.Completed) + { + var link = url.GetString() ?? ""; + grid.AddRow(new Markup(":globe_with_meridians:"), new Text(tool.Function.Name), + new Text(link, new Style(Color.Blue, link: link))); + } + } + else + { + grid.AddRow(new Markup(":hammer_and_pick:"), new Text(tool.Function.Name)); + grid.AddRow(new Text(""), new JsonText(tool.Function.Arguments)); + } + } + + Write(grid); } - return contents; - }); - foreach (var content in contents) - Console.Write(content); + foreach (var thinking in update.Contents.OfType()) + MarkupLineInterpolated($":brain: {thinking.Text}"); + foreach (var content in update.Contents.OfType()) + System.Console.Write(content.Text); - Console.WriteLine(); + foreach (var content in update.Contents) + response.Contents.Add(content); + } + WriteLine(); + conversation.Add(response); } } catch (Exception e) { - AnsiConsole.WriteException(e); + WriteException(e); } finally { - AnsiConsole.Markup($":person_beard: "); + Markup($":person_beard: "); } } else { - AnsiConsole.Markup($":person_beard: "); + Markup($":person_beard: "); } } } + + static string ReadInput(CancellationToken cancellation) + { + var sb = new System.Text.StringBuilder(); + while (!cancellation.IsCancellationRequested) + { + var key = System.Console.ReadKey(intercept: true); + if (key.Key == ConsoleKey.Enter) + { + if (key.Modifiers.HasFlag(ConsoleModifiers.Shift)) + { + sb.Append(Environment.NewLine); + System.Console.WriteLine(); + } + else + { + System.Console.WriteLine(); + break; + } + } + else if (key.Key == ConsoleKey.Backspace) + { + if (sb.Length > 0) + { + sb.Length--; + System.Console.Write("\b \b"); + } + } + else if (!char.IsControl(key.KeyChar)) + { + sb.Append(key.KeyChar); + System.Console.Write(key.KeyChar); + } + } + + return sb.ToString().Trim(); + } } diff --git a/src/Grok/readme.md b/src/Grok/readme.md new file mode 100644 index 0000000..d1b6ad1 --- /dev/null +++ b/src/Grok/readme.md @@ -0,0 +1,7 @@ +[![EULA](https://img.shields.io/badge/EULA-OSMF-blue?labelColor=black&color=C9FF30)](osmfeula.txt) +[![OSS](https://img.shields.io/github/license/devlooped/oss.svg?color=blue)](license.txt) +[![GitHub](https://img.shields.io/badge/-source-181717.svg?logo=GitHub)](https://github.com/devlooped/xAI) + + + + \ No newline at end of file diff --git a/src/xAI/readme.md b/src/xAI/readme.md index 14c1dec..cb81a41 100644 --- a/src/xAI/readme.md +++ b/src/xAI/readme.md @@ -1,6 +1,6 @@ [![EULA](https://img.shields.io/badge/EULA-OSMF-blue?labelColor=black&color=C9FF30)](osmfeula.txt) [![OSS](https://img.shields.io/github/license/devlooped/oss.svg?color=blue)](license.txt) -[![GitHub](https://img.shields.io/badge/-source-181717.svg?logo=GitHub)](https://github.com/devlooped/AI) +[![GitHub](https://img.shields.io/badge/-source-181717.svg?logo=GitHub)](https://github.com/devlooped/xAI) From 6f1effd5abda7c1be0888cbd30e6d226348ae731 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Wed, 7 Jan 2026 19:39:21 -0300 Subject: [PATCH 3/6] Do not duplicate text content from MCP/Code output These two converted outputs, when included in output, should not end up as plain text which is intended for the end-user. --- src/xAI/GrokChatClient.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/xAI/GrokChatClient.cs b/src/xAI/GrokChatClient.cs index 04694e1..0e07db4 100644 --- a/src/xAI/GrokChatClient.cs +++ b/src/xAI/GrokChatClient.cs @@ -71,8 +71,9 @@ async IAsyncEnumerable CompleteChatStreamingCore(IEnumerable var text = output.Delta.Content is { Length: > 0 } delta ? delta : null; // Use positional arguments for ChatResponseUpdate - var update = new ChatResponseUpdate(MapRole(output.Delta.Role), text) + var update = new ChatResponseUpdate { + Role = MapRole(output.Delta.Role), ResponseId = chunk.Id, ModelId = chunk.Model, CreatedAt = chunk.Created?.ToDateTimeOffset(), @@ -94,6 +95,12 @@ async IAsyncEnumerable CompleteChatStreamingCore(IEnumerable ((List)update.Contents).AddRange(output.Delta.ToolCalls.AsContents(text, citations)); + // Only append text content if it's not already part of other tools' content + if (!update.Contents.OfType().Any() && + !update.Contents.OfType().Any() && + text is not null) + update.Contents.Add(new TextContent(text)); + if (MapToUsage(chunk.Usage) is { } usage) update.Contents.Add(new UsageContent(usage) { RawRepresentation = chunk.Usage }); @@ -279,8 +286,6 @@ codeResult.RawRepresentation is ToolCall codeToolCall && { InputTokenCount = usage.PromptTokens, OutputTokenCount = usage.CompletionTokens, - CachedInputTokenCount = usage.CachedPromptTextTokens, - ReasoningTokenCount = usage.ReasoningTokens, TotalTokenCount = usage.TotalTokens }; From 8ba45e9cc0f7650ac39d6eda72568e98b6b4c3c8 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Wed, 7 Jan 2026 19:39:37 -0300 Subject: [PATCH 4/6] Fix repo url for xAI.Protocol --- src/xAI.Protocol/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xAI.Protocol/readme.md b/src/xAI.Protocol/readme.md index 7dd9088..f725eaf 100644 --- a/src/xAI.Protocol/readme.md +++ b/src/xAI.Protocol/readme.md @@ -1,6 +1,6 @@ [![EULA](https://img.shields.io/badge/EULA-OSMF-blue?labelColor=black&color=C9FF30)](osmfeula.txt) [![OSS](https://img.shields.io/github/license/devlooped/oss.svg?color=blue)](license.txt) -[![GitHub](https://img.shields.io/badge/-source-181717.svg?logo=GitHub)](https://github.com/devlooped/GrokClient) +[![GitHub](https://img.shields.io/badge/-source-181717.svg?logo=GitHub)](https://github.com/devlooped/xAI) Grok client based on the official gRPC API reference from xAI From 5e3a861c6db5b4dd3b9dee65f5c9ba05d8fe55f1 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Wed, 7 Jan 2026 19:44:44 -0300 Subject: [PATCH 5/6] Fix packaging props --- src/Grok/Grok.csproj | 5 +++++ src/xAI/GrokChatClient.cs | 2 +- src/xAI/xAI.csproj | 5 +++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Grok/Grok.csproj b/src/Grok/Grok.csproj index 002a562..6fda30b 100644 --- a/src/Grok/Grok.csproj +++ b/src/Grok/Grok.csproj @@ -5,6 +5,11 @@ net10.0 grok Sample Grok CLI using xAI and xAI.Protocol packages + false + grok + dotnet-tool xai ai grok llm + true + true MEAI001;xAI001;$(NoWarn) diff --git a/src/xAI/GrokChatClient.cs b/src/xAI/GrokChatClient.cs index 0e07db4..171c5d1 100644 --- a/src/xAI/GrokChatClient.cs +++ b/src/xAI/GrokChatClient.cs @@ -95,7 +95,7 @@ async IAsyncEnumerable CompleteChatStreamingCore(IEnumerable ((List)update.Contents).AddRange(output.Delta.ToolCalls.AsContents(text, citations)); - // Only append text content if it's not already part of other tools' content + // Only append text content if it's not already part of other tools' content if (!update.Contents.OfType().Any() && !update.Contents.OfType().Any() && text is not null) diff --git a/src/xAI/xAI.csproj b/src/xAI/xAI.csproj index 2832cad..04a97c3 100644 --- a/src/xAI/xAI.csproj +++ b/src/xAI/xAI.csproj @@ -4,7 +4,8 @@ net8.0;net10.0 xAI xAI - xAI Grok integration for Microsoft.Extensions.AI + xAI / Grok integration for Microsoft.Extensions.AI + xai ai grok llm OSMFEULA.txt true @@ -29,4 +30,4 @@ -
\ No newline at end of file +
From ec9c7f5b00aac52b6abc08a1b484923340247ec3 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Fri, 9 Jan 2026 14:37:34 -0300 Subject: [PATCH 6/6] Add X news search too to sanity check --- src/xAI.Tests/ChatClientTests.cs | 6 ++++++ src/xAI.Tests/SanityChecks.cs | 31 ++++++++++++++++++------------- src/xAI/GrokProtocolExtensions.cs | 8 +------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/xAI.Tests/ChatClientTests.cs b/src/xAI.Tests/ChatClientTests.cs index cf3b3ab..3e537cf 100644 --- a/src/xAI.Tests/ChatClientTests.cs +++ b/src/xAI.Tests/ChatClientTests.cs @@ -514,5 +514,11 @@ public async Task GrokCustomFactoryInvokedFromOptions() Assert.Equal("Hey Cazzulino!", response.Text); } + [Fact] + public async Task AskFiles() + { + + } + record Response(DateOnly Today, string Release, decimal Price); } diff --git a/src/xAI.Tests/SanityChecks.cs b/src/xAI.Tests/SanityChecks.cs index aaf3ad0..f5bda92 100644 --- a/src/xAI.Tests/SanityChecks.cs +++ b/src/xAI.Tests/SanityChecks.cs @@ -185,18 +185,19 @@ public async Task IntegrationTestStreaming() { "system", "You are a helpful assistant that uses all available tools to answer questions accurately." }, { "user", $$""" - Current timestamp is {{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}}. - Please answer the following questions using the appropriate tools: 1. What is today's date? (use get_date tool) - 2. What is the current price of Tesla (TSLA) stock? (use Yahoo news web search) - 3. Calculate the earnings that would be produced by compound interest to $5k at 4% annually for 5 years (use code interpreter) - 4. What is the latest release version of the {{ThisAssembly.Git.Url}} repository? (use GitHub MCP tool) + 2. What is the current price of Tesla (TSLA) stock? (use Yahoo news web search, always include citations) + 3. What is the top news from Tesla on X? + 4. Calculate the earnings that would be produced by compound interest to $5k savings at 4% annually for 5 years (use code interpreter). + Return just the earnings, not the grand total of savings plus earnings). + 5. What is the latest release version of the {{ThisAssembly.Git.Url}} repository? (use GitHub MCP tool) Respond with a JSON object in this exact format: { "today": "[date from get_date in YYYY-MM-DD format]", "tesla_price": [numeric price from web search], + "tesla_news": "[top news from X]", "compound_interest": [numeric result from code interpreter], "latest_release": "[version string from GitHub]" } @@ -215,33 +216,32 @@ 2. What is the current price of Tesla (TSLA) stock? (use Yahoo news web search) var options = new GrokChatOptions { + ResponseFormat = ChatResponseFormat.Json, Include = [ IncludeOption.InlineCitations, IncludeOption.WebSearchCallOutput, IncludeOption.CodeExecutionCallOutput, - IncludeOption.McpCallOutput + IncludeOption.McpCallOutput, + IncludeOption.XSearchCallOutput, ], Tools = [ - // Client-side tool AIFunctionFactory.Create(() => { getDateCalls++; return DateTime.Now.ToString("yyyy-MM-dd"); }, "get_date", "Gets the current date in YYYY-MM-DD format"), - - // Hosted web search tool new HostedWebSearchTool(), - - // Hosted code interpreter tool new HostedCodeInterpreterTool(), - - // Hosted MCP server tool (GitHub) new HostedMcpServerTool("GitHub", "https://api.githubcopilot.com/mcp/") { AuthorizationToken = Environment.GetEnvironmentVariable("GITHUB_TOKEN")!, AllowedTools = ["list_releases", "get_release_by_tag"], + }, + new GrokXSearchTool + { + AllowedHandles = ["tesla"] } ] }; @@ -339,6 +339,10 @@ void AssertIntegrationTest(ChatResponse response, Func getDateCalls) output.WriteLine($"Parsed response: Today={result.Today}, TeslaPrice={result.TeslaPrice}, CompoundInterest={result.CompoundInterest}, LatestRelease={result.LatestRelease}"); } + else + { + Assert.Fail("Response did not contain expected JSON output"); + } output.WriteLine($"Code interpreter calls: {codeInterpreterCalls.Count}"); output.WriteLine($"MCP calls: {mcpCalls.Count}"); @@ -347,6 +351,7 @@ void AssertIntegrationTest(ChatResponse response, Func getDateCalls) record IntegrationTestResponse( string Today, decimal TeslaPrice, + string TeslaNews, decimal CompoundInterest, string LatestRelease); } diff --git a/src/xAI/GrokProtocolExtensions.cs b/src/xAI/GrokProtocolExtensions.cs index 2aaabd8..e6dd3b3 100644 --- a/src/xAI/GrokProtocolExtensions.cs +++ b/src/xAI/GrokProtocolExtensions.cs @@ -1,15 +1,9 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; +using System.ComponentModel; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; -using System.Threading.Tasks; -using Google.Protobuf; using Microsoft.Extensions.AI; using xAI.Protocol; -using static Google.Protobuf.Reflection.GeneratedCodeInfo.Types; namespace xAI;