mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
feat: gemini 支持
This commit is contained in:
@@ -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'];
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证必需参数
|
// 验证必需参数
|
||||||
|
|||||||
Reference in New Issue
Block a user