feat: gemini 支持

This commit is contained in:
mouyong
2025-08-05 01:19:23 +08:00
parent c214d72bef
commit 9fca0b0c20
2 changed files with 42 additions and 31 deletions

View File

@@ -11,6 +11,7 @@ const authenticateApiKey = async (req, res, next) => {
try { try {
// 安全提取API Key支持多种格式 // 安全提取API Key支持多种格式
const apiKey = req.headers['x-api-key'] || const apiKey = req.headers['x-api-key'] ||
req.headers['x-goog-api-key'] ||
req.headers['authorization']?.replace(/^Bearer\s+/i, '') || req.headers['authorization']?.replace(/^Bearer\s+/i, '') ||
req.headers['api-key']; req.headers['api-key'];

View File

@@ -415,9 +415,10 @@ async function handleGenerateContent(req, res) {
const { model, project, user_prompt_id, request: requestData } = req.body; const { model, project, user_prompt_id, request: requestData } = req.body;
const sessionHash = sessionHelper.generateSessionHash(req.body); const sessionHash = sessionHelper.generateSessionHash(req.body);
// 处理 OpenAI 格式请求(没有 request 字段的情况) // 处理不同格式请求
let actualRequestData = requestData; let actualRequestData = requestData;
if (!requestData && req.body.messages) { if (!requestData) {
if (req.body.messages) {
// 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象 // 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象
actualRequestData = { actualRequestData = {
contents: req.body.messages.map(msg => ({ contents: req.body.messages.map(msg => ({
@@ -431,8 +432,11 @@ async function handleGenerateContent(req, res) {
topK: req.body.top_k !== undefined ? req.body.top_k : 40 topK: req.body.top_k !== undefined ? req.body.top_k : 40
} }
}; };
} else if (req.body.contents) {
// 直接的 Gemini 格式请求(没有 request 包装)
actualRequestData = req.body;
}
} }
console.log(321, actualRequestData);
// 验证必需参数 // 验证必需参数
if (!actualRequestData || !actualRequestData.contents) { if (!actualRequestData || !actualRequestData.contents) {
@@ -468,6 +472,7 @@ async function handleGenerateContent(req, res) {
res.json(response); res.json(response);
} catch (error) { } catch (error) {
console.log(321, error.response);
const version = req.path.includes('v1beta') ? 'v1beta' : 'v1internal'; const version = req.path.includes('v1beta') ? 'v1beta' : 'v1internal';
logger.error(`Error in generateContent endpoint (${version})`, { error: error.message }); logger.error(`Error in generateContent endpoint (${version})`, { error: error.message });
res.status(500).json({ res.status(500).json({
@@ -487,9 +492,10 @@ async function handleStreamGenerateContent(req, res) {
const { model, project, user_prompt_id, request: requestData } = req.body; const { model, project, user_prompt_id, request: requestData } = req.body;
const sessionHash = sessionHelper.generateSessionHash(req.body); const sessionHash = sessionHelper.generateSessionHash(req.body);
// 处理 OpenAI 格式请求(没有 request 字段的情况) // 处理不同格式请求
let actualRequestData = requestData; let actualRequestData = requestData;
if (!requestData && req.body.messages) { if (!requestData) {
if (req.body.messages) {
// 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象 // 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象
actualRequestData = { actualRequestData = {
contents: req.body.messages.map(msg => ({ contents: req.body.messages.map(msg => ({
@@ -503,6 +509,10 @@ async function handleStreamGenerateContent(req, res) {
topK: req.body.top_k !== undefined ? req.body.top_k : 40 topK: req.body.top_k !== undefined ? req.body.top_k : 40
} }
}; };
} else if (req.body.contents) {
// 直接的 Gemini 格式请求(没有 request 包装)
actualRequestData = req.body;
}
} }
// 验证必需参数 // 验证必需参数