fix: 修复gemini转发

This commit is contained in:
shaw
2025-09-04 10:45:07 +08:00
parent 86f92a774e
commit 5a29502fcd
2 changed files with 84 additions and 34 deletions

View File

@@ -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 // 传递代理配置

View File

@@ -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,