Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Extensions.AI.sln
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AI.Tests", "src\AI.Tests\AI
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnet-meai", "src\dotnet-meai\dotnet-meai.csproj", "{58FC11CF-7D61-48B9-B95F-0EAA889D6DED}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Weaving", "src\Weaving\Weaving.csproj", "{0DA390D2-2953-4CB6-8939-02E142B11733}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "src\Samples\Samples.csproj", "{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -55,8 +59,35 @@ Global
{58FC11CF-7D61-48B9-B95F-0EAA889D6DED}.Release|x64.Build.0 = Release|Any CPU
{58FC11CF-7D61-48B9-B95F-0EAA889D6DED}.Release|x86.ActiveCfg = Release|Any CPU
{58FC11CF-7D61-48B9-B95F-0EAA889D6DED}.Release|x86.Build.0 = Release|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Debug|x64.ActiveCfg = Debug|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Debug|x64.Build.0 = Debug|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Debug|x86.ActiveCfg = Debug|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Debug|x86.Build.0 = Debug|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Release|Any CPU.Build.0 = Release|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Release|x64.ActiveCfg = Release|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Release|x64.Build.0 = Release|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Release|x86.ActiveCfg = Release|Any CPU
{0DA390D2-2953-4CB6-8939-02E142B11733}.Release|x86.Build.0 = Release|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Debug|x64.ActiveCfg = Debug|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Debug|x64.Build.0 = Debug|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Debug|x86.ActiveCfg = Debug|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Debug|x86.Build.0 = Debug|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Release|Any CPU.Build.0 = Release|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Release|x64.ActiveCfg = Release|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Release|x64.Build.0 = Release|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Release|x86.ActiveCfg = Release|Any CPU
{4B78F0E3-E03B-4283-AB0B-B1D76CAEF1BC}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CCA59B79-037D-4847-871D-385CD5E8BB6F}
EndGlobalSection
EndGlobal
20 changes: 20 additions & 0 deletions src/Samples/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Sample X.AI client usage with .NET
var messages = new Chat()
{
{ "system", "You are a highly intelligent AI assistant." },
{ "user", "What is 101*3?" },
};

var grok = new GrokClient(Env.Get("XAI_API_KEY")!);

var options = new GrokChatOptions
{
ModelId = "grok-3-mini", // or "grok-3-mini-fast"
Temperature = 0.7f,
ReasoningEffort = ReasoningEffort.High, // or GrokReasoningEffort.Low
Search = GrokSearch.Auto, // or GrokSearch.On or GrokSearch.Off
};

var response = await grok.GetResponseAsync(messages, options);

AnsiConsole.MarkupLine($":robot: {response.Text}");
10 changes: 10 additions & 0 deletions src/Samples/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"profiles": {
"Samples": {
"commandName": "Project",
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Development"
}
}
}
}
24 changes: 24 additions & 0 deletions src/Samples/Samples.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>Preview</LangVersion>
<ImplicitUsings>true</ImplicitUsings>
</PropertyGroup>

<Import Project="..\Weaving\Weaving.props" />

<ItemGroup>
<PackageReference Include="Azure.Core" Version="1.44.1" />
<PackageReference Include="DotNetConfig.Configuration" Version="1.2.0" />
<PackageReference Include="System.ClientModel" Version="1.4.2" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Weaving\Weaving.csproj" />
</ItemGroup>

<Import Project="..\Weaving\Weaving.targets" />

</Project>
13 changes: 13 additions & 0 deletions src/Samples/appsettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"System": "Warning",
"Azure": "Debug",
"Azure.Core": "Debug",
"Azure.AI.OpenAI": "Debug",
"Devlooped.Extensions.AI": "Debug"
}
}
}
17 changes: 17 additions & 0 deletions src/Weaving/ConsoleInitializer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;

namespace Weaving;

class ConsoleInitializer
{
#pragma warning disable CA2255 // The 'ModuleInitializer' attribute should not be used in libraries
[ModuleInitializer]
#pragma warning restore CA2255 // The 'ModuleInitializer' attribute should not be used in libraries
public static void Init()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
Console.InputEncoding = Console.OutputEncoding = Encoding.UTF8;
}
}
30 changes: 30 additions & 0 deletions src/Weaving/Env.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

namespace Weaving;

/// <summary>
/// Allows retrieving configuration settings for the app environment using the
/// default configuration system provided by <see cref="Host.CreateApplicationBuilder()"/>
/// </summary>
public static class Env
{
static readonly IConfigurationManager configuration =
Host.CreateApplicationBuilder(Environment.GetCommandLineArgs()).Configuration;

/// <summary>
/// Gets a (possibly null) configuration value for the given key.
/// </summary>
/// <param name="key">The key to retrieve, following .NET configuration system conventions.</param>
public static string? Get(string key) => configuration[key];

/// <summary>
/// Gets a configuration value for the given key, returning a default value if the key is not found.
/// </summary>
/// <param name="key">The key to retrieve, following .NET configuration system conventions.</param>
/// <param name="defaultValue">Default value to return if the key is not found.</param>
/// <returns>Never returns null if <paramref name="defaultValue"/> is not <see langword="null"/>.</returns>
[return: NotNullIfNotNull(nameof(defaultValue))]
public static string? Get(string key, string defaultValue) => configuration[key] ?? defaultValue;
}
46 changes: 46 additions & 0 deletions src/Weaving/HostExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using Microsoft.Extensions.AI;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Weaving;

/// <summary>
/// Extensions for configuring the host application builder and accessing services.
/// </summary>
public static class HostExtensions
{
extension<TBuilder>(TBuilder builder) where TBuilder : IHostApplicationBuilder
{
/// <summary>
/// Configures the host configuration.
/// </summary>
public TBuilder Configure(Action<IConfigurationManager> configure)
{
configure?.Invoke(builder.Configuration);
return builder;
}

/// <summary>
/// Configures services in the host.
/// </summary>
public TBuilder ConfigureServices(Action<IServiceCollection> configure)
{
configure?.Invoke(builder.Services);
return builder;
}
}

extension(IHost app)
{
/// <summary>
/// Gest the host app configuration;
/// </summary>
public IConfiguration Configuration => app.Services.GetRequiredService<IConfiguration>();

/// <summary>
/// Gets the default AI client for the app.
/// </summary>
public IChatClient ChatClient => app.Services.GetRequiredService<IChatClient>();
}
}
4 changes: 4 additions & 0 deletions src/Weaving/Visibility.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
namespace System
{
public partial class Throw { }
}
24 changes: 24 additions & 0 deletions src/Weaving/Weaving.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>Preview</LangVersion>
<PackageId>Weaving</PackageId>
<RootNamespace>Weaving</RootNamespace>
<Description>Run AI-powered C# files with the power of Microsoft.Extensions.AI and Devlooped.Extensions.AI</Description>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.6" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\AI\AI.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="Weaving.props" PackFolder="build" />
</ItemGroup>

</Project>
35 changes: 35 additions & 0 deletions src/Weaving/Weaving.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<Project>
<PropertyGroup>
<ImplicitUsings>true</ImplicitUsings>
<Nullable>enable</Nullable>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>

<ItemGroup>
<Using Include="System.Collections.Generic"/>
<Using Include="System.Linq"/>
<Using Include="System.Net"/>
<Using Include="System.Net.Http"/>
<Using Include="System.Reflection"/>
<Using Include="System.Text.Json"/>
<Using Include="System.Threading"/>
<Using Include="System.Threading.Tasks"/>

<Using Include="Microsoft.Extensions.Configuration"/>
<Using Include="Microsoft.Extensions.Configuration.UserSecrets"/>
<Using Include="Microsoft.Extensions.DependencyInjection"/>
<Using Include="Microsoft.Extensions.Hosting"/>
<Using Include="Microsoft.Extensions.AI"/>

<Using Include="Devlooped.Extensions.AI"/>
<Using Include="Weaving"/>

<Using Include="Spectre.Console"/>
<Using Include="Spectre.Console.Json"/>
</ItemGroup>

<ItemGroup>
<AssemblyMetadata Include="MSBuildProjectName" Value="$(MSBuildProjectName)" />
</ItemGroup>

</Project>
3 changes: 3 additions & 0 deletions src/Weaving/Weaving.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Project>

</Project>
1 change: 1 addition & 0 deletions src/Weaving/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Run AI-powered C# files with the power of Microsoft.Extensions.AI and Devlooped.Extensions.AI
Loading