Skip to content

Commit c6e3b3a

Browse files
Got the "Hello World" sample to work (#3)
* got "hello world" off the ground * added real readme
1 parent 85a8ac6 commit c6e3b3a

File tree

8 files changed

+163
-2
lines changed

8 files changed

+163
-2
lines changed

AI.Playground.slnx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@
99
<File Path="global.json" />
1010
<File Path="nuget.config" />
1111
</Folder>
12+
<Folder Name="/shared/">
13+
<Project Path="src\shared\Telemetry\Telemetry.csproj" Type="Classic C#" />
14+
</Folder>
1215
</Solution>

Directory.Packages.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,8 @@
77
<PackageVersion Include="CommunityToolkit.Aspire.Hosting.Ollama" Version="9.3.1-beta.259" />
88
<PackageVersion Include="CommunityToolkit.Aspire.OllamaSharp" Version="9.3.1-beta.259" />
99
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.4" />
10+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.11.2" />
11+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.11.2" />
12+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.11.1" />
1013
</ItemGroup>
1114
</Project>

src/0-hello-world/AI.HelloWorld.Console/AI.HelloWorld.Console.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@
1111
<PackageReference Include="Microsoft.Extensions.Hosting" />
1212
</ItemGroup>
1313

14+
<ItemGroup>
15+
<ProjectReference Include="..\..\shared\Telemetry\Telemetry.csproj" />
16+
</ItemGroup>
17+
1418
</Project>
Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,29 @@
1-
using Microsoft.Extensions.Hosting;
1+
using AI.Telemetry;
2+
using Microsoft.Extensions.Hosting;
3+
using Microsoft.Extensions.AI;
4+
using Microsoft.Extensions.DependencyInjection;
25

3-
var hostBuilder = new HostBuilder();
6+
var builder = new HostApplicationBuilder();
7+
8+
builder.Logging.ConfigureAiLogging();
9+
10+
builder.AddOllamaApiClient("chat")
11+
.AddChatClient()
12+
.UseFunctionInvocation()
13+
.UseOpenTelemetry()
14+
.UseLogging();
15+
16+
builder.Services.ConfigureAiTelemetry();
17+
18+
19+
var app = builder.Build();
20+
21+
await app.StartAsync();
22+
23+
var chatClient = app.Services.GetRequiredService<IChatClient>();
24+
25+
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
26+
var resp = await chatClient.GetResponseAsync("How many feet are in a meter?", cancellationToken:cts.Token);
27+
28+
Console.WriteLine(resp);
29+
await app.WaitForShutdownAsync();

src/0-hello-world/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# AI Hello World Project
2+
3+
This project demonstrates a simple "Hello, World!" application using [.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/get-started/aspire-overview).
4+
5+
## Running the Project
6+
7+
To run this project, navigate to the `src/0-hello-world` directory in your terminal and execute the following command:
8+
9+
```bash
10+
dotnet run --project AI.HelloWorld.AppHost/AI.HelloWorld.AppHost.csproj
11+
```
12+
13+
### Model
14+
15+
By default this project will download and run the [`llama3.2:3b`](https://ollama.com/library/llama3.2:3b) model, which can run just fine even on a machine without any GPU support. You can configure this inside the `AI.HelloWorld.AppHost.Program.cs` file:
16+
17+
```csharp
18+
var ollama =
19+
builder.AddOllama("ollama")
20+
.WithDataVolume()
21+
.WithOpenWebUI();
22+
23+
/*
24+
* The set of available models from Ollama: https://ollama.com/library
25+
*/
26+
var chat = ollama
27+
.AddModel("chat", "llama3.2:3b"); // 3b parameter model
28+
```
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Reflection;
2+
using OpenTelemetry.Resources;
3+
4+
namespace AI.Telemetry;
5+
6+
public sealed class AssemblyVersionDetector : IResourceDetector
7+
{
8+
public Resource Detect()
9+
{
10+
var version = Assembly.GetExecutingAssembly().GetName().Version?.ToString();
11+
12+
IEnumerable<KeyValuePair<string, object>> attributes = Array.Empty<KeyValuePair<string, object>>();
13+
14+
if (version != null)
15+
{
16+
attributes =
17+
[
18+
new KeyValuePair<string, object>("service.version", version)
19+
];
20+
}
21+
22+
return new Resource(attributes);
23+
}
24+
}
25+
26+
public static class ServiceVersionDetectorExtensions
27+
{
28+
public static ResourceBuilder AddServiceVersionDetector(this ResourceBuilder builder)
29+
{
30+
return builder.AddDetector(new AssemblyVersionDetector());
31+
}
32+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<ImplicitUsings>enable</ImplicitUsings>
5+
<Nullable>enable</Nullable>
6+
<RootNamespace>AI.Telemetry</RootNamespace>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
11+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
12+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
13+
</ItemGroup>
14+
15+
</Project>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Logging;
3+
using OpenTelemetry;
4+
using OpenTelemetry.Metrics;
5+
using OpenTelemetry.Resources;
6+
using OpenTelemetry.Trace;
7+
8+
namespace AI.Telemetry;
9+
10+
public static class TelemetryExtensions
11+
{
12+
public static ILoggingBuilder ConfigureAiLogging(this ILoggingBuilder builder)
13+
{
14+
var resourceBuilder = ResourceBuilder.CreateDefault();
15+
resourceBuilder
16+
.AddEnvironmentVariableDetector()
17+
.AddTelemetrySdk()
18+
.AddServiceVersionDetector();
19+
20+
builder.AddOpenTelemetry(options => { options.SetResourceBuilder(resourceBuilder); });
21+
22+
23+
return builder;
24+
}
25+
26+
public static IServiceCollection ConfigureAiTelemetry(this IServiceCollection services,
27+
Action<MeterProviderBuilder>? additionalMeters = null,
28+
Action<TracerProviderBuilder>? additionalTracers = null)
29+
{
30+
services
31+
.AddOpenTelemetry()
32+
.ConfigureResource(builder =>
33+
{
34+
builder
35+
.AddEnvironmentVariableDetector()
36+
.AddTelemetrySdk()
37+
.AddServiceVersionDetector();
38+
})
39+
.UseOtlpExporter()
40+
.WithMetrics(c =>
41+
{
42+
c.AddRuntimeInstrumentation();
43+
44+
additionalMeters?.Invoke(c);
45+
})
46+
.WithTracing(c => { additionalTracers?.Invoke(c); });
47+
48+
return services;
49+
}
50+
}

0 commit comments

Comments
 (0)