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
}