欢迎注册论坛,享受更多奶昔会员权益!
您需要 登录 才可以下载或查看,没有账号?注册
×
全部通过AI生成,运行在deno平台,功能有点简陋,有能力的大佬可以完善一下
- import { serve } from "https://deno.land/std@0.224.0/http/server.ts";
- // ===== 配置 =====
- const TARGET_API = Deno.env.get("TARGET_API");
- const TARGET_MODEL = Deno.env.get("TARGET_MODEL");
- const MODEL_ALIAS = Deno.env.get("MODEL_ALIAS");
- const API_KEY = Deno.env.get("API_KEY");
- if (!API_KEY) {
- console.error("❌ 缺少 API_KEY 环境变量");
- Deno.exit(1);
- }
- //密钥列表)
- const authorizedKeys: Record<string, string> = {
- "用户认证密钥": "备注",
- // 你可以添加更多用户密钥
- };
- // ===== 工具函数 =====
- function checkAuth(req: Request): string | null {
- const authHeader = req.headers.get("Authorization");
- if (!authHeader || !authHeader.startsWith("Bearer ")) {
- return null;
- }
- const token = authHeader.slice(7).trim();
- if (token in authorizedKeys) {
- return token; // 返回通过验证的密钥(也可以返回用户名等)
- }
- return null;
- }
- function jsonError(message: string, status = 401) {
- return new Response(
- JSON.stringify({
- error: {
- message,
- type: "authentication_error",
- status,
- },
- }),
- {
- status,
- headers: { "Content-Type": "application/json; charset=utf-8" },
- }
- );
- }
- // ===== 主服务 =====
- serve(async (req) => {
- const url = new URL(req.url);
- const pathname = url.pathname;
- // 需要验证的路径
- const protectedPaths = ["/v1/models", "/v1/chat/completions"];
- if (protectedPaths.includes(pathname)) {
- const userKey = checkAuth(req);
- if (!userKey) {
- return jsonError("Invalid or missing access token", 401);
- }
- // 这里可以用 userKey 做日志、限流、配额等后续处理
- console.log(`用户密钥验证通过: ${userKey}`);
- }
- if (pathname === "/v1/models") {
- return new Response(
- JSON.stringify({
- object: "list",
- data: [
- {
- id: MODEL_ALIAS,
- object: "model",
- created: Date.now(),
- owned_by: "gmi-cloud",
- },
- ],
- }),
- { headers: { "Content-Type": "application/json; charset=utf-8" } },
- );
- }
- if (pathname === "/v1/chat/completions") {
- if (req.method !== "POST") {
- return new Response("Method Not Allowed", { status: 405 });
- }
- const body = await req.json();
- const isStream = body.stream === true;
- if (body.model === MODEL_ALIAS) {
- body.model = TARGET_MODEL;
- } else if (body.model !== TARGET_MODEL) {
- return new Response(
- JSON.stringify({
- error: {
- message: `Only model "${MODEL_ALIAS}" is supported.`,
- type: "invalid_request_error",
- },
- }),
- {
- status: 400,
- headers: { "Content-Type": "application/json; charset=utf-8" },
- },
- );
- }
- const res = await fetch(TARGET_API, {
- method: "POST",
- headers: {
- "Authorization": `Bearer ${API_KEY}`,
- "Content-Type": "application/json",
- "Accept": "application/json",
- },
- body: JSON.stringify(body),
- });
- if (!isStream) {
- const text = await res.text();
- return new Response(text, {
- status: res.status,
- headers: { "Content-Type": "application/json; charset=utf-8" },
- });
- }
- const readableStream = new ReadableStream({
- async start(controller) {
- const reader = res.body?.getReader();
- const decoder = new TextDecoder();
- const encoder = new TextEncoder();
- if (!reader) {
- controller.enqueue(encoder.encode("data: [DONE]\n\n"));
- controller.close();
- return;
- }
- try {
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- controller.enqueue(encoder.encode(decoder.decode(value, { stream: true })));
- }
- } finally {
- controller.close();
- }
- },
- });
- return new Response(readableStream, {
- status: 200,
- headers: {
- "Content-Type": "text/event-stream; charset=utf-8",
- "Cache-Control": "no-cache",
- "Connection": "keep-alive",
- "Access-Control-Allow-Origin": "*",
- },
- });
- }
- if (pathname === "/v1/test") {
- const testBody = {
- model: TARGET_MODEL,
- messages: [{ role: "user", content: "你好,请返回你好。" }],
- temperature: 0.3,
- stream: false,
- };
- try {
- const [res, ipRes] = await Promise.all([
- fetch(TARGET_API, {
- method: "POST",
- headers: {
- "Authorization": `Bearer ${API_KEY}`,
- "Content-Type": "application/json",
- "Accept": "application/json",
- },
- body: JSON.stringify(testBody),
- }),
- fetch("https://api.ipify.org?format=json"),
- ]);
- const [json, ipJson] = await Promise.all([res.json(), ipRes.json()]);
- const now = new Intl.DateTimeFormat("zh-CN", {
- timeZone: "Asia/Shanghai",
- dateStyle: "full",
- timeStyle: "long",
- }).format(new Date());
- if (res.ok) {
- return new Response(
- JSON.stringify({
- success: true,
- message: "API 可用",
- ip: ipJson.ip,
- now,
- }),
- { headers: { "Content-Type": "application/json; charset=utf-8" } },
- );
- } else {
- return new Response(
- JSON.stringify({
- success: false,
- message: "API 响应异常",
- ip: ipJson.ip,
- now,
- error: json,
- }),
- {
- status: res.status,
- headers: { "Content-Type": "application/json; charset=utf-8" },
- },
- );
- }
- } catch (err) {
- return new Response(
- JSON.stringify({
- success: false,
- message: "请求失败",
- error: err.message,
- }),
- { status: 500, headers: { "Content-Type": "application/json; charset=utf-8" } },
- );
- }
- }
- return new Response("Not Found", { status: 404 });
- });
复制代码 |