SDK quickstart: .NET

OpenAI's official OpenAI NuGet (.NET 8+) works pointed at our endpoint. Same SDK as you'd use against OpenAI itself.

Install

dotnet add package OpenAI

Hello world

using OpenAI.Chat;
using System.ClientModel;

var client = new ChatClient(
    model: "auto",
    credential: new ApiKeyCredential(Environment.GetEnvironmentVariable("JC_API_KEY")!),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.greenjoules.cloud/v1"),
    });

ChatCompletion response = client.CompleteChat("hi");
Console.WriteLine(response.Content[0].Text);

Streaming

await foreach (var update in client.CompleteChatStreamingAsync("tell a story"))
{
    foreach (var part in update.ContentUpdate)
        Console.Write(part.Text);
}

Embeddings

using OpenAI.Embeddings;

var embed = new EmbeddingClient(
    model: "text-embedding-3-small",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions { Endpoint = new Uri("https://api.greenjoules.cloud/v1") });

OpenAIEmbeddingCollection r = embed.GenerateEmbeddings(new[] { "one", "two" });
foreach (var e in r) Console.WriteLine($"dim={e.ToFloats().Length}");

Joule headers (raw response)

ClientResult<ChatCompletion> result = await client.CompleteChatAsync("hi");
PipelineResponse raw = result.GetRawResponse();
raw.Headers.TryGetValue("x-energy-joules", out var joules);
Console.WriteLine($"joules: {joules}");

ASP.NET Core DI

// Program.cs
builder.Services.AddSingleton(_ => new ChatClient(
    model: "auto",
    credential: new ApiKeyCredential(builder.Configuration["JC_API_KEY"]!),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.greenjoules.cloud/v1"),
    }));

// in a Minimal API
app.MapPost("/ask", async (string q, ChatClient ai) =>
{
    var r = await ai.CompleteChatAsync(q);
    return new { answer = r.Value.Content[0].Text };
});

Errors

try {
  await client.CompleteChatAsync("hi");
} catch (ClientResultException ex) when (ex.Status == 402) {
  // top up
} catch (ClientResultException ex) when (ex.Status == 429) {
  // energy budget hit
}