using System.Net.Http.Headers; using System.Text.Json;
var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpClient(“deepseek”, client => {
client.Timeout = TimeSpan.FromMinutes(10);
});
var app = builder.Build();
// ── API Key 读取 ────────────────────────────────────────────────────────────── var deepSeekKey = Environment.GetEnvironmentVariable(“DEEPSEEK_API_KEY”); var keyConfigPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, “key.config”); if (string.IsNullOrWhiteSpace(deepSeekKey) && File.Exists(keyConfigPath)) {
deepSeekKey = File.ReadAllText(keyConfigPath).Trim(); Console.WriteLine($"[INFO] 已从 key.config 读取 API Key");
} if (string.IsNullOrWhiteSpace(deepSeekKey))
Console.WriteLine("[WARN] 未设置 DEEPSEEK_API_KEY");
const string DeepSeekAnthropicBase = “https://api.deepseek.com/anthropic”;
app.MapMethods(“/”, [“HEAD”], () => Results.Ok()); app.MapGet(“/”, () => Results.Ok(new { status = “running” }));
// count_tokens — DeepSeek 不支持,返回假数据 app.MapPost(“/v1/messages/count_tokens”, () =>
Results.Json(new { input_tokens = 1000 }));
app.Use(async (ctx, next) => { ctx.Request.EnableBuffering(); await next(); });
app.Map(“/{path}”, async (HttpContext context, IHttpClientFactory factory) => {path}“);
// 读取 Body,限制 max_tokens 不超过 8192 string requestBody = ""; if (context.Request.ContentLength > 0 || context.Request.Headers.ContainsKey("Transfer-Encoding")) writer.WriteEndObject(); writer.Flush(); requestBody = System.Text.Encoding.UTF8.GetString(ms.ToArray()); } } catch { } } using var proxyReq = new HttpRequestMessage(new HttpMethod(context.Request.Method), targetUrl); proxyReq.Headers.TryAddWithoutValidation("x-api-key", deepSeekKey); proxyReq.Headers.TryAddWithoutValidation("anthropic-version", "2023-06-01"); var skipHeaders = new HashSet
(StringComparer.OrdinalIgnoreCase) { "Host", "x-api-key", "Authorization", "Content-Length", "Transfer-Encoding" }; foreach (var (key, value) in context.Request.Headers) if (!string.IsNullOrEmpty(requestBody)) ct) proxyReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(ct); } var http = factory.CreateClient("deepseek"); using var proxyResp = await http.SendAsync( proxyReq, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted); Console.WriteLine($"[<-] {(int)proxyResp.StatusCode} {path}"); context.Response.StatusCode = (int)proxyResp.StatusCode; var skipRespHeaders = new HashSet
(StringComparer.OrdinalIgnoreCase) { "Transfer-Encoding", "Content-Length", "Content-Encoding" }; foreach (var (key, value) in proxyResp.Headers) foreach (var (key, value) in proxyResp.Content.Headers) context.Response.Headers["X-Accel-Buffering"] = "no"; context.Features.Get
() ?.DisableBuffering(); await using var respStream = await proxyResp.Content.ReadAsStreamAsync(context.RequestAborted); using var lineReader = new StreamReader(respStream, System.Text.Encoding.UTF8); while (!lineReader.EndOfStream && !context.RequestAborted.IsCancellationRequested)
});
app.Run(”http://localhost:8082”);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/265148.html