mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
265 lines
7.2 KiB
JavaScript
265 lines
7.2 KiB
JavaScript
/**
|
||
* 标准 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
|