Codezerg.OpenRouter
1.0.0
dotnet add package Codezerg.OpenRouter --version 1.0.0
NuGet\Install-Package Codezerg.OpenRouter -Version 1.0.0
<PackageReference Include="Codezerg.OpenRouter" Version="1.0.0" />
<PackageVersion Include="Codezerg.OpenRouter" Version="1.0.0" />
<PackageReference Include="Codezerg.OpenRouter" />
paket add Codezerg.OpenRouter --version 1.0.0
#r "nuget: Codezerg.OpenRouter, 1.0.0"
#:package Codezerg.OpenRouter@1.0.0
#addin nuget:?package=Codezerg.OpenRouter&version=1.0.0
#tool nuget:?package=Codezerg.OpenRouter&version=1.0.0
Codezerg.OpenRouter
A strongly‑typed .NET Standard 2.0 client library for OpenRouter’s unified LLM API.
Access multiple AI models (OpenAI, Anthropic, Google, Meta, Mistral, DeepSeek, etc.) through a single consistent interface.
✨ Features
- Unified API: Chat completions across all supported LLM providers.
- Streaming Support: Real‑time token streaming via
IAsyncEnumerable. - Multimodal: Build conversations with text, image, and audio inputs.
- Tool Calling & Structured Outputs: Define and resolve tool calls, enforce JSON/object schemas.
- Typed Models: Strongly‑typed request/response models with IntelliSense.
- Account & Discovery APIs: Usage, credits, models, providers, generation info.
- Frontend Client (Experimental): Undocumented OpenRouter frontend/private APIs.
- Cross‑Platform: Runs on
.NET Framework 4.6.2+,.NET Core,.NET 5+.
📦 Installation
dotnet add package Codezerg.OpenRouter
🚀 Quick Start
using Codezerg.OpenRouter;
using Codezerg.OpenRouter.Models;
var config = new OpenRouterClientOptions
{
ApiKey = Environment.GetEnvironmentVariable("OPENROUTER_API_KEY"),
DefaultModel = "deepseek/deepseek-chat-v3.1:free",
UserAgent = "myapp/1.0", // required by OpenRouter
Referer = "https://github.com/myuser/app" // required by OpenRouter
};
using var client = new OpenRouterClient(config);
var req = new ChatRequest {
Messages = new() {
ChatMessage.System("You are a helpful assistant."),
ChatMessage.User("What is the capital of France?")
}
};
var resp = await client.SendChatCompletionAsync(req);
Console.WriteLine(resp.Choices[0].Message?.FirstTextContent);
// => "The capital of France is Paris."
📡 Streaming Responses
var req = new ChatRequest {
Messages = new() {
ChatMessage.User("Write a short poem about a sunrise.")
}
};
await foreach (var chunk in client.StreamChatCompletionAsync(req))
{
var token = chunk.Choices?[0].Delta?.Content;
if (!string.IsNullOrEmpty(token))
Console.Write(token);
}
⚠️ In streaming mode, generated text arrives in
ChatChoice.Delta.Content.
In non‑streaming mode, useChatChoice.Message.FirstTextContent.
🖼 Multimodal Example
var message = new ChatMessage(ChatRole.User)
.AddText("Describe this picture")
.AddImage("https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg");
var resp = await client.SendChatCompletionAsync(new ChatRequest {
Messages = new() { message }
});
Console.WriteLine(resp.Choices[0].Message?.FirstTextContent);
🔧 Tool Calling Example
var req = new ChatRequest {
Messages = new() { ChatMessage.User("What's the weather in Paris?") },
Tools = new() {
new ToolDefinition {
Function = new FunctionDescription {
Name = "get_weather",
Description = "Gets weather",
Parameters = JObject.Parse("{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}}}")
}
}
}
};
var resp = await client.SendChatCompletionAsync(req);
if (resp.Choices[0].Message?.ToolCalls?.Count > 0) {
var call = resp.Choices[0].Message.ToolCalls[0];
Console.WriteLine($"{call.Function.Name}({call.Function.Arguments})");
}
📊 Account & Discovery APIs
var credits = await client.GetCreditsAsync();
Console.WriteLine($"Credits: {credits.TotalCredits}, Used: {credits.TotalUsage}");
var activity = await client.GetActivityAsync();
foreach (var day in activity)
Console.WriteLine($"{day.Date}: {day.Model} - {day.Requests} requests");
var models = await client.GetModelsAsync();
foreach (var m in models)
Console.WriteLine($"{m.Name} ({m.Id})");
⚙️ Configuration
var config = new OpenRouterClientOptions()
.WithApiKey("your-api-key")
.WithDefaultModel("meta-llama/llama-3.2-3b-instruct:free")
.WithUserAgent("myapp/1.0")
.WithReferer("https://yourapp.com")
.WithTimeout(TimeSpan.FromSeconds(60));
🧪 Examples
Try runnable demos under /examples:
- Simple Chat
- Streaming Chat
- Multimodal (Text + Images)
- Image Analysis
- Tool Calling
- Structured JSON Output
Run an example:
export OPENROUTER_API_KEY="your-api-key"
dotnet run --project examples/Codezerg.OpenRouter.Examples.csproj
📝 Requirements
- Library: .NET Standard 2.0+
- Examples: .NET 8+
- API Key: Get from OpenRouter
⚖️ License
MIT License © Codezerg
📌 Tip: Prefer streaming mode for interactive apps and incrementally process responses from Delta.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Bcl.AsyncInterfaces (>= 8.0.0)
- Newtonsoft.Json (>= 13.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 473 | 9/16/2025 |