mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
fix: 修复 OpenAI 路由中的 req.apiKeyData undefined 错误
- 将所有路由中的 req.apiKeyData 改为 req.apiKey(与中间件一致) - 在 authenticateApiKey 中间件中添加缺失的字段(permissions, geminiAccountId, usage) - 修复 openaiClaudeRoutes.js、openaiGeminiRoutes.js 和 geminiRoutes.js 中的引用错误 - 确保 API 权限检查正常工作 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -198,11 +198,14 @@ const authenticateApiKey = async (req, res, next) => {
|
|||||||
name: validation.keyData.name,
|
name: validation.keyData.name,
|
||||||
tokenLimit: validation.keyData.tokenLimit,
|
tokenLimit: validation.keyData.tokenLimit,
|
||||||
claudeAccountId: validation.keyData.claudeAccountId,
|
claudeAccountId: validation.keyData.claudeAccountId,
|
||||||
|
geminiAccountId: validation.keyData.geminiAccountId,
|
||||||
|
permissions: validation.keyData.permissions,
|
||||||
concurrencyLimit: validation.keyData.concurrencyLimit,
|
concurrencyLimit: validation.keyData.concurrencyLimit,
|
||||||
rateLimitWindow: validation.keyData.rateLimitWindow,
|
rateLimitWindow: validation.keyData.rateLimitWindow,
|
||||||
rateLimitRequests: validation.keyData.rateLimitRequests,
|
rateLimitRequests: validation.keyData.rateLimitRequests,
|
||||||
enableModelRestriction: validation.keyData.enableModelRestriction,
|
enableModelRestriction: validation.keyData.enableModelRestriction,
|
||||||
restrictedModels: validation.keyData.restrictedModels
|
restrictedModels: validation.keyData.restrictedModels,
|
||||||
|
usage: validation.keyData.usage
|
||||||
};
|
};
|
||||||
req.usage = validation.keyData.usage;
|
req.usage = validation.keyData.usage;
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ router.post('/messages', authenticateApiKey, async (req, res) => {
|
|||||||
let abortController = null;
|
let abortController = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
if (!checkPermissions(apiKeyData, 'gemini')) {
|
if (!checkPermissions(apiKeyData, 'gemini')) {
|
||||||
@@ -137,7 +137,7 @@ router.post('/messages', authenticateApiKey, async (req, res) => {
|
|||||||
|
|
||||||
// 处理速率限制
|
// 处理速率限制
|
||||||
if (error.status === 429) {
|
if (error.status === 429) {
|
||||||
if (req.apiKeyData && req.account) {
|
if (apiKeyData && req.account) {
|
||||||
await geminiAccountService.setAccountRateLimited(req.account.id, true);
|
await geminiAccountService.setAccountRateLimited(req.account.id, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ router.post('/messages', authenticateApiKey, async (req, res) => {
|
|||||||
// 获取可用模型列表
|
// 获取可用模型列表
|
||||||
router.get('/models', authenticateApiKey, async (req, res) => {
|
router.get('/models', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
if (!checkPermissions(apiKeyData, 'gemini')) {
|
if (!checkPermissions(apiKeyData, 'gemini')) {
|
||||||
@@ -215,7 +215,7 @@ router.get('/models', authenticateApiKey, async (req, res) => {
|
|||||||
// 使用情况统计(与 Claude 共用)
|
// 使用情况统计(与 Claude 共用)
|
||||||
router.get('/usage', authenticateApiKey, async (req, res) => {
|
router.get('/usage', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const usage = req.apiKeyData.usage;
|
const usage = req.apiKey.usage;
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
object: 'usage',
|
object: 'usage',
|
||||||
@@ -240,7 +240,7 @@ router.get('/usage', authenticateApiKey, async (req, res) => {
|
|||||||
// API Key 信息(与 Claude 共用)
|
// API Key 信息(与 Claude 共用)
|
||||||
router.get('/key-info', authenticateApiKey, async (req, res) => {
|
router.get('/key-info', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const keyData = req.apiKeyData;
|
const keyData = req.apiKey;
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
id: keyData.id,
|
id: keyData.id,
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ function checkPermissions(apiKeyData, requiredPermission = 'claude') {
|
|||||||
// 📋 OpenAI 兼容的模型列表端点
|
// 📋 OpenAI 兼容的模型列表端点
|
||||||
router.get('/v1/models', authenticateApiKey, async (req, res) => {
|
router.get('/v1/models', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
if (!checkPermissions(apiKeyData, 'claude')) {
|
if (!checkPermissions(apiKeyData, 'claude')) {
|
||||||
@@ -87,7 +87,7 @@ router.get('/v1/models', authenticateApiKey, async (req, res) => {
|
|||||||
// 📄 OpenAI 兼容的模型详情端点
|
// 📄 OpenAI 兼容的模型详情端点
|
||||||
router.get('/v1/models/:model', authenticateApiKey, async (req, res) => {
|
router.get('/v1/models/:model', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
const modelId = req.params.model;
|
const modelId = req.params.model;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
@@ -339,13 +339,13 @@ async function handleChatCompletion(req, res, apiKeyData) {
|
|||||||
|
|
||||||
// 🚀 OpenAI 兼容的聊天完成端点
|
// 🚀 OpenAI 兼容的聊天完成端点
|
||||||
router.post('/v1/chat/completions', authenticateApiKey, async (req, res) => {
|
router.post('/v1/chat/completions', authenticateApiKey, async (req, res) => {
|
||||||
await handleChatCompletion(req, res, req.apiKeyData);
|
await handleChatCompletion(req, res, req.apiKey);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 🔧 OpenAI 兼容的 completions 端点(传统格式,转换为 chat 格式)
|
// 🔧 OpenAI 兼容的 completions 端点(传统格式,转换为 chat 格式)
|
||||||
router.post('/v1/completions', authenticateApiKey, async (req, res) => {
|
router.post('/v1/completions', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
|
|
||||||
// 验证必需参数
|
// 验证必需参数
|
||||||
if (!req.body.prompt) {
|
if (!req.body.prompt) {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ router.post('/v1/chat/completions', authenticateApiKey, async (req, res) => {
|
|||||||
let abortController = null;
|
let abortController = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
if (!checkPermissions(apiKeyData, 'gemini')) {
|
if (!checkPermissions(apiKeyData, 'gemini')) {
|
||||||
@@ -159,7 +159,7 @@ router.post('/v1/chat/completions', authenticateApiKey, async (req, res) => {
|
|||||||
|
|
||||||
// 处理速率限制
|
// 处理速率限制
|
||||||
if (error.status === 429) {
|
if (error.status === 429) {
|
||||||
if (req.apiKeyData && req.account) {
|
if (apiKeyData && req.account) {
|
||||||
await geminiAccountService.setAccountRateLimited(req.account.id, true);
|
await geminiAccountService.setAccountRateLimited(req.account.id, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,7 +186,7 @@ router.post('/v1/chat/completions', authenticateApiKey, async (req, res) => {
|
|||||||
// OpenAI 兼容的模型列表端点
|
// OpenAI 兼容的模型列表端点
|
||||||
router.get('/v1/models', authenticateApiKey, async (req, res) => {
|
router.get('/v1/models', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
if (!checkPermissions(apiKeyData, 'gemini')) {
|
if (!checkPermissions(apiKeyData, 'gemini')) {
|
||||||
@@ -244,7 +244,7 @@ router.get('/v1/models', authenticateApiKey, async (req, res) => {
|
|||||||
// OpenAI 兼容的模型详情端点
|
// OpenAI 兼容的模型详情端点
|
||||||
router.get('/v1/models/:model', authenticateApiKey, async (req, res) => {
|
router.get('/v1/models/:model', authenticateApiKey, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const apiKeyData = req.apiKeyData;
|
const apiKeyData = req.apiKey;
|
||||||
const modelId = req.params.model;
|
const modelId = req.params.model;
|
||||||
|
|
||||||
// 检查权限
|
// 检查权限
|
||||||
|
|||||||
Reference in New Issue
Block a user