C# / .NET SDK
.NET 项目接 Sakrylle 推荐两个包:
- OpenAI 兼容:
OpenAI(官方,与 Microsoft 合作维护) - Anthropic 原生:
Anthropic.SDK(社区维护,作者tghamm)
Anthropic 同时也在做 官方 C# SDK(
anthropics/anthropic-sdk-csharp),目前仍是 beta 阶段;如果你愿意尝鲜,可参考它的 README。生产环境暂时建议用社区Anthropic.SDK。 例子基于 Context7 拉取的官方 / 社区 README,最新 API 以包文档为准。
准备
bash
export SAKRYLLE_API_KEY="sk-xxxxxxxxxxxxxxxx"需要 .NET 6+。
OpenAI 兼容
安装
bash
dotnet add package OpenAI最小可用调用
通过 OpenAIClientOptions.Endpoint 把请求重定向到 Sakrylle:
csharp
using System;
using System.ClientModel;
using OpenAI;
using OpenAI.Chat;
var apiKey = Environment.GetEnvironmentVariable("SAKRYLLE_API_KEY")
?? throw new InvalidOperationException("missing SAKRYLLE_API_KEY");
var options = new OpenAIClientOptions
{
Endpoint = new Uri("https://api.sakrylle.com/v1"),
};
ChatClient client = new(
model: "gpt-5.6-sol",
credential: new ApiKeyCredential(apiKey),
options: options);
ChatCompletion completion = client.CompleteChat(
new SystemChatMessage("你是一名简洁的助手。"),
new UserChatMessage("用一句话解释什么是向量数据库。"));
Console.WriteLine(completion.Content[0].Text);流式响应
csharp
using System;
using System.ClientModel;
using OpenAI;
using OpenAI.Chat;
var apiKey = Environment.GetEnvironmentVariable("SAKRYLLE_API_KEY")!;
var options = new OpenAIClientOptions
{
Endpoint = new Uri("https://api.sakrylle.com/v1"),
};
ChatClient client = new("gpt-5.6-sol", new ApiKeyCredential(apiKey), options);
foreach (var update in client.CompleteChatStreaming("数到 5。"))
{
foreach (var part in update.ContentUpdate)
{
Console.Write(part.Text);
}
}
Console.WriteLine();工具调用
csharp
using System.Text.Json;
using OpenAI.Chat;
ChatTool getWeather = ChatTool.CreateFunctionTool(
functionName: "get_weather",
functionDescription: "查询给定城市的当前天气",
functionParameters: BinaryData.FromString(
"""
{
"type": "object",
"properties": {
"city": { "type": "string" }
},
"required": ["city"]
}
"""));
ChatCompletionOptions chatOptions = new()
{
Tools = { getWeather },
};
ChatCompletion result = client.CompleteChat(
new[] { new UserChatMessage("北京今天天气怎么样?") },
chatOptions);
if (result.FinishReason == ChatFinishReason.ToolCalls)
{
foreach (var call in result.ToolCalls)
{
Console.WriteLine($"调用:{call.FunctionName} 参数:{call.FunctionArguments}");
}
}Anthropic 原生
安装
bash
dotnet add package Anthropic.SDK这是社区维护的包(作者 tghamm),不是 Anthropic 官方。
最小可用调用
csharp
using Anthropic.SDK;
using Anthropic.SDK.Constants;
using Anthropic.SDK.Messaging;
var apiKey = Environment.GetEnvironmentVariable("SAKRYLLE_API_KEY")!;
// 通过自定义 HttpClient 把 BaseAddress 指到 Sakrylle
var http = new HttpClient
{
BaseAddress = new Uri("https://api.sakrylle.com/"),
};
var client = new AnthropicClient(
apiKeys: new APIAuthentication(apiKey),
client: http);
var parameters = new MessageParameters
{
Model = "claude-haiku-4-5-20251001",
MaxTokens = 1024,
Messages = new List<Message>
{
new(RoleType.User, "用一句话介绍 Claude。"),
},
};
var response = await client.Messages.GetClaudeMessageAsync(parameters);
Console.WriteLine(response.Message);SDK 通过
HttpClient.BaseAddress控制网关地址。请保留末尾斜杠,否则 SDK 拼路径时会丢前缀。 具体 API 与构造函数签名以 Anthropic.SDK README 为准。
流式响应
csharp
var streamParams = new MessageParameters
{
Model = "claude-haiku-4-5-20251001",
MaxTokens = 1024,
Stream = true,
Messages = new List<Message>
{
new(RoleType.User, "写一首四行小诗。"),
},
};
await foreach (var chunk in client.Messages.StreamClaudeMessageAsync(streamParams))
{
if (chunk.Delta != null)
{
Console.Write(chunk.Delta.Text);
}
}错误处理
csharp
using System.ClientModel;
try
{
var completion = client.CompleteChat("hi");
}
catch (ClientResultException ex)
{
// 401 / 429 / 500 等都会落进这里
Console.Error.WriteLine($"status={ex.Status} message={ex.Message}");
}完整错误码表见 错误码。
