Files
claude-relay-service/src/routes/standardGeminiRoutes.js
2025-11-25 10:30:39 +08:00

265 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 标准 Gemini API 路由模块
*
* 该模块处理标准 Gemini API 格式的请求:
* - v1beta/models/:modelName:generateContent
* - v1beta/models/:modelName:streamGenerateContent
* - v1beta/models/:modelName:countTokens
* - v1beta/models/:modelName:loadCodeAssist
* - v1beta/models/:modelName:onboardUser
* - v1/models/:modelName:* (同上)
* - v1internal:* (内部格式)
* - v1beta/models, v1/models (模型列表)
* - v1beta/models/:modelName, v1/models/:modelName (模型详情)
*
* 所有处理函数都从 geminiHandlers.js 导入,以避免代码重复。
*/
const express = require('express')
const router = express.Router()
const { authenticateApiKey } = require('../middleware/auth')
const logger = require('../utils/logger')
// 从 handlers/geminiHandlers.js 导入所有处理函数
const {
ensureGeminiPermissionMiddleware,
handleLoadCodeAssist,
handleOnboardUser,
handleCountTokens,
handleGenerateContent,
handleStreamGenerateContent,
handleStandardGenerateContent,
handleStandardStreamGenerateContent,
handleModels,
handleModelDetails
} = require('../handlers/geminiHandlers')
// ============================================================================
// v1beta 版本的标准路由 - 支持动态模型名称
// ============================================================================
/**
* POST /v1beta/models/:modelName:loadCodeAssist
*/
router.post(
'/v1beta/models/:modelName\\:loadCodeAssist',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request: ${req.method} ${req.originalUrl}`)
handleLoadCodeAssist(req, res, next)
}
)
/**
* POST /v1beta/models/:modelName:onboardUser
*/
router.post(
'/v1beta/models/:modelName\\:onboardUser',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request: ${req.method} ${req.originalUrl}`)
handleOnboardUser(req, res, next)
}
)
/**
* POST /v1beta/models/:modelName:countTokens
*/
router.post(
'/v1beta/models/:modelName\\:countTokens',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request: ${req.method} ${req.originalUrl}`)
handleCountTokens(req, res, next)
}
)
/**
* POST /v1beta/models/:modelName:generateContent
* 使用专门的标准 API 处理函数(支持 OAuth 和 API 账户)
*/
router.post(
'/v1beta/models/:modelName\\:generateContent',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
handleStandardGenerateContent
)
/**
* POST /v1beta/models/:modelName:streamGenerateContent
* 使用专门的标准 API 流式处理函数(支持 OAuth 和 API 账户)
*/
router.post(
'/v1beta/models/:modelName\\:streamGenerateContent',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
handleStandardStreamGenerateContent
)
// ============================================================================
// v1 版本的标准路由(为了完整性,虽然 Gemini 主要使用 v1beta
// ============================================================================
/**
* POST /v1/models/:modelName:generateContent
*/
router.post(
'/v1/models/:modelName\\:generateContent',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
handleStandardGenerateContent
)
/**
* POST /v1/models/:modelName:streamGenerateContent
*/
router.post(
'/v1/models/:modelName\\:streamGenerateContent',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
handleStandardStreamGenerateContent
)
/**
* POST /v1/models/:modelName:countTokens
*/
router.post(
'/v1/models/:modelName\\:countTokens',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request (v1): ${req.method} ${req.originalUrl}`)
handleCountTokens(req, res, next)
}
)
// ============================================================================
// v1internal 版本的标准路由(这些使用内部格式的处理函数)
// ============================================================================
/**
* POST /v1internal:loadCodeAssist
*/
router.post(
'/v1internal\\:loadCodeAssist',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request (v1internal): ${req.method} ${req.originalUrl}`)
handleLoadCodeAssist(req, res, next)
}
)
/**
* POST /v1internal:onboardUser
*/
router.post(
'/v1internal\\:onboardUser',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request (v1internal): ${req.method} ${req.originalUrl}`)
handleOnboardUser(req, res, next)
}
)
/**
* POST /v1internal:countTokens
*/
router.post(
'/v1internal\\:countTokens',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request (v1internal): ${req.method} ${req.originalUrl}`)
handleCountTokens(req, res, next)
}
)
/**
* POST /v1internal:generateContent
* v1internal 格式使用内部格式的处理函数
*/
router.post(
'/v1internal\\:generateContent',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request (v1internal): ${req.method} ${req.originalUrl}`)
handleGenerateContent(req, res, next)
}
)
/**
* POST /v1internal:streamGenerateContent
* v1internal 格式使用内部格式的处理函数
*/
router.post(
'/v1internal\\:streamGenerateContent',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
(req, res, next) => {
logger.info(`Standard Gemini API request (v1internal): ${req.method} ${req.originalUrl}`)
handleStreamGenerateContent(req, res, next)
}
)
// ============================================================================
// 模型列表端点
// ============================================================================
/**
* GET /v1beta/models
* 获取模型列表v1beta 版本)
*/
router.get('/v1beta/models', authenticateApiKey, ensureGeminiPermissionMiddleware, (req, res) => {
logger.info('Standard Gemini API models request (v1beta)')
handleModels(req, res)
})
/**
* GET /v1/models
* 获取模型列表v1 版本)
*/
router.get('/v1/models', authenticateApiKey, ensureGeminiPermissionMiddleware, (req, res) => {
logger.info('Standard Gemini API models request (v1)')
handleModels(req, res)
})
// ============================================================================
// 模型详情端点
// ============================================================================
/**
* GET /v1beta/models/:modelName
* 获取模型详情v1beta 版本)
*/
router.get(
'/v1beta/models/:modelName',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
handleModelDetails
)
/**
* GET /v1/models/:modelName
* 获取模型详情v1 版本)
*/
router.get(
'/v1/models/:modelName',
authenticateApiKey,
ensureGeminiPermissionMiddleware,
handleModelDetails
)
// ============================================================================
// 初始化日志
// ============================================================================
logger.info('Standard Gemini API routes initialized')
module.exports = router