You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:28:16