const express = require('express'); const morgan = require('morgan'); const { createProxyMiddleware } = require('http-proxy-middleware'); const axios = require('axios'); const fs = require('fs'); const url = require('url'); // 用于解析代理 URL const app = express(); app.use(morgan('dev')); // 从环境变量获取代理池 const proxyPool = process.env.PROXY ? process.env.PROXY.split(',').map(p => p.trim()) : []; if (proxyPool.length > 0) { console.log('Proxy pool initialized with:', proxyPool); } else { console.log('No proxies configured in PROXY environment variable'); } // 从代理池中随机选择一个代理 function getRandomProxy() { if (proxyPool.length === 0) return null; const randomIndex = Math.floor(Math.random() * proxyPool.length); const proxyUrl = proxyPool[randomIndex]; const parsedUrl = url.parse(proxyUrl); return { host: parsedUrl.hostname, port: parsedUrl.port || 80, auth: parsedUrl.auth ? { username: parsedUrl.auth.split(':')[0], password: parsedUrl.auth.split(':')[1] } : undefined }; } // 配置 axios 的代理 function configureAxiosProxy() { const proxy = getRandomProxy(); if (proxy) { axios.defaults.proxy = proxy; console.log(`Axios using proxy: ${proxy.host}:${proxy.port}`); } else { delete axios.defaults.proxy; // 如果没有代理,移除默认代理 } } // 模型列表 API app.get('/hf/v1/models', (req, res) => { const models = { "object": "list", "data": [ { "id": "claude-3.5-sonnet", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gpt-4", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gpt-4o", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "claude-3-opus", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gpt-3.5-turbo", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gpt-4-turbo-2024-04-09", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gpt-4o-128k", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gemini-1.5-flash-500k", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "claude-3-haiku-200k", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "claude-3-5-sonnet-200k", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "claude-3-5-sonnet-20241022", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gpt-4o-mini", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "o1-mini", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "o1-preview", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "o1", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "claude-3.5-haiku", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gemini-exp-1206", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gemini-2.0-flash-thinking-exp", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "gemini-2.0-flash-exp", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "deepseek-v3", "object": "model", "created": 1706745938, "owned_by": "cursor" }, { "id": "deepseek-r1", "object": "model", "created": 1706745938, "owned_by": "cursor" } ] }; res.json(models); }); // 代理转发,使用代理池 app.use('/hf/v1/chat/completions', (req, res, next) => { const proxy = getRandomProxy(); const middleware = createProxyMiddleware({ target: 'http://localhost:3010/v1/chat/completions', changeOrigin: true, proxy: proxy ? proxy : undefined, // 如果有代理则使用 onProxyReq: (proxyReq, req, res) => { if (req.body) { const bodyData = JSON.stringify(req.body); proxyReq.setHeader('Content-Type', 'application/json'); proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); proxyReq.write(bodyData); proxyReq.end(); } }, onError: (err, req, res) => { console.error('Proxy error:', err); res.status(500).send('Proxy error occurred'); } }); if (proxy) { console.log(`Request proxied via ${proxy.host}:${proxy.port}`); } middleware(req, res, next); }); // 首页 app.get('/', (req, res) => { const htmlContent = `
高性能 AI 模型代理服务