Skip to content

Microsoft.Extensions.AI Integration

Overview

LlmTornado.Microsoft.Extensions.AI provides integration with Microsoft's AI abstractions, enabling seamless use of LlmTornado in applications using Microsoft.Extensions.AI patterns.

Quick Start

csharp
// Install package:
// dotnet add package LlmTornado.Microsoft.Extensions.AI

using Microsoft.Extensions.AI;
using LlmTornado;

// Create LlmTornado API
TornadoApi tornadoApi = new TornadoApi("your-api-key");

// Use with Microsoft.Extensions.AI patterns
IChatClient chatClient = tornadoApi.AsChatClient(ChatModel.OpenAi.Gpt4.O);

// Generate chat completion
ChatCompletion completion = await chatClient.CompleteAsync(
    "Tell me about C#",
    cancellationToken: CancellationToken.None
);

Console.WriteLine(completion.Message.Text);

Integration Patterns

Chat Client

csharp
using Microsoft.Extensions.AI;
using LlmTornado;

TornadoApi api = new TornadoApi("your-api-key");

// Convert to IChatClient
IChatClient chatClient = api.AsChatClient(ChatModel.OpenAi.Gpt41.V41);

// Use standard Microsoft.Extensions.AI patterns
ChatCompletion result = await chatClient.CompleteAsync(
    new ChatMessage(ChatRole.User, "What is async/await?")
);

Dependency Injection

csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.AI;
using LlmTornado;

// Configure services
IServiceCollection services = new ServiceCollection();

services.AddSingleton<TornadoApi>(sp => 
    new TornadoApi(Configuration["OpenAI:ApiKey"])
);

services.AddSingleton<IChatClient>(sp =>
{
    TornadoApi api = sp.GetRequiredService<TornadoApi>();
    return api.AsChatClient(ChatModel.OpenAi.Gpt4.O);
});

// Use in application
IServiceProvider provider = services.BuildServiceProvider();
IChatClient chatClient = provider.GetRequiredService<IChatClient>();

ChatCompletion result = await chatClient.CompleteAsync("Hello!");

Streaming Support

csharp
IChatClient chatClient = api.AsChatClient(ChatModel.OpenAi.Gpt4.O);

await foreach (StreamingChatCompletionUpdate update in 
    chatClient.CompleteStreamingAsync("Tell me a story"))
{
    Console.Write(update.Text);
}

Benefits

Standardization

  • Use consistent patterns across different AI providers
  • Switch providers with minimal code changes
  • Leverage Microsoft.Extensions.AI ecosystem

Dependency Injection

  • Integrate cleanly with ASP.NET Core
  • Use standard DI patterns
  • Testability through interfaces

Middleware Support

  • Add logging, caching, retry logic
  • Use built-in middleware patterns
  • Compose behaviors cleanly

Use Cases

ASP.NET Core Integration

csharp
// Startup.cs / Program.cs
builder.Services.AddSingleton<TornadoApi>(sp =>
    new TornadoApi(builder.Configuration["OpenAI:ApiKey"])
);

builder.Services.AddSingleton<IChatClient>(sp =>
{
    TornadoApi api = sp.GetRequiredService<TornadoApi>();
    return api.AsChatClient(ChatModel.OpenAi.Gpt4.O);
});

// Controller
public class ChatController : ControllerBase
{
    readonly IChatClient chatClient;
    
    public ChatController(IChatClient chatClient)
    {
        this.chatClient = chatClient;
    }
    
    [HttpPost]
    public async Task<IActionResult> Chat([FromBody] string message)
    {
        ChatCompletion result = await chatClient.CompleteAsync(message);
        return Ok(result.Message.Text);
    }
}

Testing

csharp
public class ChatServiceTests
{
    [Fact]
    public async Task TestChatCompletion()
    {
        // Mock IChatClient for testing
        Mock<IChatClient> mockClient = new Mock<IChatClient>();
        mockClient
            .Setup(c => c.CompleteAsync(It.IsAny<string>(), default))
            .ReturnsAsync(new ChatCompletion(new ChatMessage(ChatRole.Assistant, "Test response")));
        
        ChatService service = new ChatService(mockClient.Object);
        string result = await service.ProcessQuery("Test");
        
        Assert.Equal("Test response", result);
    }
}

Best Practices

  • Use dependency injection for better testability
  • Implement proper cancellation token support
  • Handle exceptions appropriately
  • Log AI interactions for monitoring
  • Use middleware for cross-cutting concerns