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,24 +415,28 @@ 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) {
// 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象 if (req.body.messages) {
actualRequestData = { // 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象
contents: req.body.messages.map(msg => ({ actualRequestData = {
role: msg.role === 'assistant' ? 'model' : msg.role, contents: req.body.messages.map(msg => ({
parts: [{ text: msg.content }] role: msg.role === 'assistant' ? 'model' : msg.role,
})), parts: [{ text: msg.content }]
generationConfig: { })),
temperature: req.body.temperature !== undefined ? req.body.temperature : 0.7, generationConfig: {
maxOutputTokens: req.body.max_tokens !== undefined ? req.body.max_tokens : 4096, temperature: req.body.temperature !== undefined ? req.body.temperature : 0.7,
topP: req.body.top_p !== undefined ? req.body.top_p : 0.95, maxOutputTokens: req.body.max_tokens !== undefined ? req.body.max_tokens : 4096,
topK: req.body.top_k !== undefined ? req.body.top_k : 40 topP: req.body.top_p !== undefined ? req.body.top_p : 0.95,
} 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,22 +492,27 @@ 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) {
// 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象 if (req.body.messages) {
actualRequestData = { // 这是 OpenAI 格式的请求,构建 Gemini 格式的 request 对象
contents: req.body.messages.map(msg => ({ actualRequestData = {
role: msg.role === 'assistant' ? 'model' : msg.role, contents: req.body.messages.map(msg => ({
parts: [{ text: msg.content }] role: msg.role === 'assistant' ? 'model' : msg.role,
})), parts: [{ text: msg.content }]
generationConfig: { })),
temperature: req.body.temperature !== undefined ? req.body.temperature : 0.7, generationConfig: {
maxOutputTokens: req.body.max_tokens !== undefined ? req.body.max_tokens : 4096, temperature: req.body.temperature !== undefined ? req.body.temperature : 0.7,
topP: req.body.top_p !== undefined ? req.body.top_p : 0.95, maxOutputTokens: req.body.max_tokens !== undefined ? req.body.max_tokens : 4096,
topK: req.body.top_k !== undefined ? req.body.top_k : 40 topP: req.body.top_p !== undefined ? req.body.top_p : 0.95,
} topK: req.body.top_k !== undefined ? req.body.top_k : 40
}; }
};
} else if (req.body.contents) {
// 直接的 Gemini 格式请求(没有 request 包装)
actualRequestData = req.body;
}
} }
// 验证必需参数 // 验证必需参数