Semantic Kernel对接OpenRouter API遇404/405错误求助
问题分析
- 初始404错误:核心原因是缺少OpenRouter强制要求的请求头(
HTTP-Referer或X-Title),即使API密钥正确,无这些头会导致请求被拒绝,返回404/403。 - 自定义Handler后的405错误:直接替换整个
RequestUri为https://openrouter.ai/api/v1,但该端点不接受POST请求(正确的聊天补全端点是/api/v1/chat/completions),导致方法不允许。
解决方案
方法1:直接配置端点与必填请求头
通过自定义HttpClient添加OpenRouter要求的头,同时保留正确的端点设置:
var httpClient = new HttpClient { Timeout = TimeSpan.FromMinutes(10) }; // 添加OpenRouter必填请求头,二选一即可 httpClient.DefaultRequestHeaders.Add("HTTP-Referer", "https://your-app-domain.com"); // 替换为你的应用域名 // 或 httpClient.DefaultRequestHeaders.Add("X-Title", "Your App Name"); builder.AddOpenAIChatCompletion( modelId: "deepseek/deepseek-r1", apiKey: "your-openrouter-api-key", endpoint: new Uri("https://openrouter.ai/api/v1"), httpClient: httpClient);
方法2:修正自定义HttpClientHandler
不要替换整个请求Uri,仅替换主机部分,保留原路径(确保请求指向正确的补全端点):
public class OpenRouterHttpMessageHandler : HttpClientHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.RequestUri != null && request.RequestUri.Host.Equals("api.openai.com", StringComparison.OrdinalIgnoreCase)) { // 仅替换主机,保留原路径和参数 var newUriBuilder = new UriBuilder(request.RequestUri) { Scheme = "https", Host = "openrouter.ai", Port = 443 }; request.RequestUri = newUriBuilder.Uri; } // 添加必填请求头 request.Headers.Add("HTTP-Referer", "https://your-app-domain.com"); // 或 request.Headers.Add("X-Title", "Your App Name"); return base.SendAsync(request, cancellationToken); } } // 使用自定义Handler创建HttpClient var httpClient = new HttpClient(new OpenRouterHttpMessageHandler()) { Timeout = TimeSpan.FromMinutes(10) }; builder.AddOpenAIChatCompletion( modelId: "deepseek/deepseek-r1", apiKey: "your-openrouter-api-key", endpoint: new Uri("https://api.openai.com/v1"), // 用默认OpenAI端点,Handler自动替换 httpClient: httpClient);
关键注意事项
- OpenRouter强制要求所有请求携带
HTTP-Referer或X-Title头,无此头会直接拒绝请求。 - 模型ID格式需符合OpenRouter规范:
provider/model-name(如deepseek/deepseek-r1)。 - API密钥使用方式与OpenAI一致,无需额外格式转换。
内容的提问来源于stack exchange,提问作者rHerrman
相关产品推荐
相关产品推荐

