mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
fix: 修复gemini转发
This commit is contained in:
@@ -343,20 +343,22 @@ async function handleLoadCodeAssist(req, res) {
|
|||||||
|
|
||||||
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
||||||
|
|
||||||
// 根据账户配置决定项目ID:
|
// 智能处理项目ID:
|
||||||
// 1. 如果账户有项目ID -> 使用账户的项目ID(强制覆盖)
|
// 1. 如果账户配置了项目ID -> 使用账户的项目ID(覆盖请求中的)
|
||||||
// 2. 如果账户没有项目ID -> 传递 null(移除项目ID)
|
// 2. 如果账户没有项目ID -> 使用请求中的cloudaicompanionProject
|
||||||
let effectiveProjectId = null
|
// 3. 都没有 -> 传null
|
||||||
|
const effectiveProjectId = projectId || cloudaicompanionProject || null
|
||||||
|
|
||||||
if (projectId) {
|
logger.info('📋 loadCodeAssist项目ID处理逻辑', {
|
||||||
// 账户配置了项目ID,强制使用它
|
accountProjectId: projectId,
|
||||||
effectiveProjectId = projectId
|
requestProjectId: cloudaicompanionProject,
|
||||||
logger.info('Using account project ID for loadCodeAssist:', effectiveProjectId)
|
effectiveProjectId,
|
||||||
} else {
|
decision: projectId
|
||||||
// 账户没有配置项目ID,确保不传递项目ID
|
? '使用账户配置'
|
||||||
effectiveProjectId = null
|
: cloudaicompanionProject
|
||||||
logger.info('No project ID in account for loadCodeAssist, removing project parameter')
|
? '使用请求参数'
|
||||||
}
|
: '不使用项目ID'
|
||||||
|
})
|
||||||
|
|
||||||
const response = await geminiAccountService.loadCodeAssist(
|
const response = await geminiAccountService.loadCodeAssist(
|
||||||
client,
|
client,
|
||||||
@@ -413,20 +415,22 @@ async function handleOnboardUser(req, res) {
|
|||||||
|
|
||||||
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
||||||
|
|
||||||
// 根据账户配置决定项目ID:
|
// 智能处理项目ID:
|
||||||
// 1. 如果账户有项目ID -> 使用账户的项目ID(强制覆盖)
|
// 1. 如果账户配置了项目ID -> 使用账户的项目ID(覆盖请求中的)
|
||||||
// 2. 如果账户没有项目ID -> 传递 null(移除项目ID)
|
// 2. 如果账户没有项目ID -> 使用请求中的cloudaicompanionProject
|
||||||
let effectiveProjectId = null
|
// 3. 都没有 -> 传null
|
||||||
|
const effectiveProjectId = projectId || cloudaicompanionProject || null
|
||||||
|
|
||||||
if (projectId) {
|
logger.info('📋 onboardUser项目ID处理逻辑', {
|
||||||
// 账户配置了项目ID,强制使用它
|
accountProjectId: projectId,
|
||||||
effectiveProjectId = projectId
|
requestProjectId: cloudaicompanionProject,
|
||||||
logger.info('Using account project ID:', effectiveProjectId)
|
effectiveProjectId,
|
||||||
} else {
|
decision: projectId
|
||||||
// 账户没有配置项目ID,确保不传递项目ID(即使客户端传了也要移除)
|
? '使用账户配置'
|
||||||
effectiveProjectId = null
|
: cloudaicompanionProject
|
||||||
logger.info('No project ID in account, removing project parameter')
|
? '使用请求参数'
|
||||||
}
|
: '不使用项目ID'
|
||||||
|
})
|
||||||
|
|
||||||
// 如果提供了 tierId,直接调用 onboardUser
|
// 如果提供了 tierId,直接调用 onboardUser
|
||||||
if (tierId) {
|
if (tierId) {
|
||||||
@@ -593,11 +597,24 @@ async function handleGenerateContent(req, res) {
|
|||||||
|
|
||||||
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
||||||
|
|
||||||
|
// 智能处理项目ID:
|
||||||
|
// 1. 如果账户配置了项目ID -> 使用账户的项目ID(覆盖请求中的)
|
||||||
|
// 2. 如果账户没有项目ID -> 使用请求中的项目ID(如果有的话)
|
||||||
|
// 3. 都没有 -> 传null
|
||||||
|
const effectiveProjectId = account.projectId || project || null
|
||||||
|
|
||||||
|
logger.info('📋 项目ID处理逻辑', {
|
||||||
|
accountProjectId: account.projectId,
|
||||||
|
requestProjectId: project,
|
||||||
|
effectiveProjectId,
|
||||||
|
decision: account.projectId ? '使用账户配置' : project ? '使用请求参数' : '不使用项目ID'
|
||||||
|
})
|
||||||
|
|
||||||
const response = await geminiAccountService.generateContent(
|
const response = await geminiAccountService.generateContent(
|
||||||
client,
|
client,
|
||||||
{ model, request: actualRequestData },
|
{ model, request: actualRequestData },
|
||||||
user_prompt_id,
|
user_prompt_id,
|
||||||
account.projectId, // 始终使用账户配置的项目ID,忽略请求中的project
|
effectiveProjectId, // 使用智能决策的项目ID
|
||||||
req.apiKey?.id, // 使用 API Key ID 作为 session ID
|
req.apiKey?.id, // 使用 API Key ID 作为 session ID
|
||||||
proxyConfig // 传递代理配置
|
proxyConfig // 传递代理配置
|
||||||
)
|
)
|
||||||
@@ -729,11 +746,24 @@ async function handleStreamGenerateContent(req, res) {
|
|||||||
|
|
||||||
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
const client = await geminiAccountService.getOauthClient(accessToken, refreshToken, proxyConfig)
|
||||||
|
|
||||||
|
// 智能处理项目ID:
|
||||||
|
// 1. 如果账户配置了项目ID -> 使用账户的项目ID(覆盖请求中的)
|
||||||
|
// 2. 如果账户没有项目ID -> 使用请求中的项目ID(如果有的话)
|
||||||
|
// 3. 都没有 -> 传null
|
||||||
|
const effectiveProjectId = account.projectId || project || null
|
||||||
|
|
||||||
|
logger.info('📋 流式请求项目ID处理逻辑', {
|
||||||
|
accountProjectId: account.projectId,
|
||||||
|
requestProjectId: project,
|
||||||
|
effectiveProjectId,
|
||||||
|
decision: account.projectId ? '使用账户配置' : project ? '使用请求参数' : '不使用项目ID'
|
||||||
|
})
|
||||||
|
|
||||||
const streamResponse = await geminiAccountService.generateContentStream(
|
const streamResponse = await geminiAccountService.generateContentStream(
|
||||||
client,
|
client,
|
||||||
{ model, request: actualRequestData },
|
{ model, request: actualRequestData },
|
||||||
user_prompt_id,
|
user_prompt_id,
|
||||||
account.projectId, // 始终使用账户配置的项目ID,忽略请求中的project
|
effectiveProjectId, // 使用智能决策的项目ID
|
||||||
req.apiKey?.id, // 使用 API Key ID 作为 session ID
|
req.apiKey?.id, // 使用 API Key ID 作为 session ID
|
||||||
abortController.signal, // 传递中止信号
|
abortController.signal, // 传递中止信号
|
||||||
proxyConfig // 传递代理配置
|
proxyConfig // 传递代理配置
|
||||||
|
|||||||
@@ -1022,15 +1022,23 @@ async function loadCodeAssist(client, projectId = null, proxyConfig = null) {
|
|||||||
const clientMetadata = {
|
const clientMetadata = {
|
||||||
ideType: 'IDE_UNSPECIFIED',
|
ideType: 'IDE_UNSPECIFIED',
|
||||||
platform: 'PLATFORM_UNSPECIFIED',
|
platform: 'PLATFORM_UNSPECIFIED',
|
||||||
pluginType: 'GEMINI',
|
pluginType: 'GEMINI'
|
||||||
duetProject: projectId
|
}
|
||||||
|
|
||||||
|
// 只有当projectId存在时才添加duetProject
|
||||||
|
if (projectId) {
|
||||||
|
clientMetadata.duetProject = projectId
|
||||||
}
|
}
|
||||||
|
|
||||||
const request = {
|
const request = {
|
||||||
cloudaicompanionProject: projectId,
|
|
||||||
metadata: clientMetadata
|
metadata: clientMetadata
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 只有当projectId存在时才添加cloudaicompanionProject
|
||||||
|
if (projectId) {
|
||||||
|
request.cloudaicompanionProject = projectId
|
||||||
|
}
|
||||||
|
|
||||||
const axiosConfig = {
|
const axiosConfig = {
|
||||||
url: `${CODE_ASSIST_ENDPOINT}/${CODE_ASSIST_API_VERSION}:loadCodeAssist`,
|
url: `${CODE_ASSIST_ENDPOINT}/${CODE_ASSIST_API_VERSION}:loadCodeAssist`,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -1096,10 +1104,14 @@ async function onboardUser(client, tierId, projectId, clientMetadata, proxyConfi
|
|||||||
|
|
||||||
const onboardReq = {
|
const onboardReq = {
|
||||||
tierId,
|
tierId,
|
||||||
cloudaicompanionProject: projectId,
|
|
||||||
metadata: clientMetadata
|
metadata: clientMetadata
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 只有当projectId存在时才添加cloudaicompanionProject
|
||||||
|
if (projectId) {
|
||||||
|
onboardReq.cloudaicompanionProject = projectId
|
||||||
|
}
|
||||||
|
|
||||||
// 创建基础axios配置
|
// 创建基础axios配置
|
||||||
const baseAxiosConfig = {
|
const baseAxiosConfig = {
|
||||||
url: `${CODE_ASSIST_ENDPOINT}/${CODE_ASSIST_API_VERSION}:onboardUser`,
|
url: `${CODE_ASSIST_ENDPOINT}/${CODE_ASSIST_API_VERSION}:onboardUser`,
|
||||||
@@ -1278,7 +1290,6 @@ async function generateContent(
|
|||||||
// 按照 gemini-cli 的转换格式构造请求
|
// 按照 gemini-cli 的转换格式构造请求
|
||||||
const request = {
|
const request = {
|
||||||
model: requestData.model,
|
model: requestData.model,
|
||||||
project: projectId,
|
|
||||||
user_prompt_id: userPromptId,
|
user_prompt_id: userPromptId,
|
||||||
request: {
|
request: {
|
||||||
...requestData.request,
|
...requestData.request,
|
||||||
@@ -1286,6 +1297,11 @@ async function generateContent(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 只有当projectId存在时才添加project字段
|
||||||
|
if (projectId) {
|
||||||
|
request.project = projectId
|
||||||
|
}
|
||||||
|
|
||||||
logger.info('🤖 generateContent API调用开始', {
|
logger.info('🤖 generateContent API调用开始', {
|
||||||
model: requestData.model,
|
model: requestData.model,
|
||||||
userPromptId,
|
userPromptId,
|
||||||
@@ -1340,7 +1356,6 @@ async function generateContentStream(
|
|||||||
// 按照 gemini-cli 的转换格式构造请求
|
// 按照 gemini-cli 的转换格式构造请求
|
||||||
const request = {
|
const request = {
|
||||||
model: requestData.model,
|
model: requestData.model,
|
||||||
project: projectId,
|
|
||||||
user_prompt_id: userPromptId,
|
user_prompt_id: userPromptId,
|
||||||
request: {
|
request: {
|
||||||
...requestData.request,
|
...requestData.request,
|
||||||
@@ -1348,6 +1363,11 @@ async function generateContentStream(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 只有当projectId存在时才添加project字段
|
||||||
|
if (projectId) {
|
||||||
|
request.project = projectId
|
||||||
|
}
|
||||||
|
|
||||||
logger.info('🌊 streamGenerateContent API调用开始', {
|
logger.info('🌊 streamGenerateContent API调用开始', {
|
||||||
model: requestData.model,
|
model: requestData.model,
|
||||||
userPromptId,
|
userPromptId,
|
||||||
|
|||||||
Reference in New Issue
Block a user