diff --git a/src/routes/azureOpenaiRoutes.js b/src/routes/azureOpenaiRoutes.js index ca0aa8fe..ba653ba9 100644 --- a/src/routes/azureOpenaiRoutes.js +++ b/src/routes/azureOpenaiRoutes.js @@ -250,6 +250,28 @@ router.post('/responses', authenticateApiKey, async (req, res) => { messages: req.body.messages?.length || 0 }) + // Detailed logging for debugging + logger.debug(`๐Ÿ“‹ Azure OpenAI Responses Request Details ${requestId}`, { + headers: { + 'content-type': req.headers['content-type'], + 'user-agent': req.headers['user-agent'], + 'x-forwarded-for': req.headers['x-forwarded-for'], + 'authorization': req.headers.authorization ? '[REDACTED]' : 'not present' + }, + requestBody: { + model: req.body.model, + messages: req.body.messages, + stream: req.body.stream, + temperature: req.body.temperature, + max_tokens: req.body.max_tokens, + top_p: req.body.top_p, + frequency_penalty: req.body.frequency_penalty, + presence_penalty: req.body.presence_penalty, + stop: req.body.stop, + logit_bias: req.body.logit_bias + } + }) + try { // ่Žทๅ–็ป‘ๅฎš็š„ Azure OpenAI ่ดฆๆˆท let account = null @@ -265,6 +287,20 @@ router.post('/responses', authenticateApiKey, async (req, res) => { account = await azureOpenaiAccountService.selectAvailableAccount(sessionId) } + // Log Azure OpenAI request details + logger.debug(`๐Ÿ”— Sending to Azure OpenAI ${requestId}`, { + account: { + id: account.id, + name: account.name, + azureEndpoint: account.azureEndpoint, + deploymentName: account.deploymentName, + apiVersion: account.apiVersion + }, + targetUrl: `${account.azureEndpoint}/openai/deployments/${account.deploymentName}/responses?api-version=${account.apiVersion || '2024-10-01-preview'}`, + endpoint: 'responses', + isStream: req.body.stream || false + }) + // ๅ‘้€่ฏทๆฑ‚ๅˆฐ Azure OpenAI const response = await azureOpenaiRelayService.handleAzureOpenAIRequest({ account, diff --git a/src/services/azureOpenaiRelayService.js b/src/services/azureOpenaiRelayService.js index 9590884b..b576c3c6 100644 --- a/src/services/azureOpenaiRelayService.js +++ b/src/services/azureOpenaiRelayService.js @@ -52,6 +52,25 @@ async function handleAzureOpenAIRequest({ // ๅค„็†่ฏทๆฑ‚ไฝ“ const processedBody = { ...requestBody } + // Detailed logging for responses endpoint + if (endpoint === 'responses') { + logger.debug(`๐Ÿ” Azure OpenAI Responses Endpoint Details`, { + targetUrl: requestUrl, + headers: { + 'Content-Type': requestHeaders['Content-Type'], + 'api-key': '[REDACTED]', + 'User-Agent': requestHeaders['User-Agent'] || 'not set' + }, + processedRequestBody: processedBody, + account: { + name: account.name, + azureEndpoint: account.azureEndpoint, + deploymentName: account.deploymentName, + apiVersion: apiVersion + } + }) + } + // ๆ ‡ๅ‡†ๅŒ–ๆจกๅž‹ๅ็งฐ if (processedBody.model) { processedBody.model = normalizeModelName(processedBody.model) @@ -142,6 +161,25 @@ async function handleAzureOpenAIRequest({ contentType: response.headers?.['content-type'] || 'unknown' }) + // Enhanced logging for responses endpoint + if (endpoint === 'responses') { + logger.debug(`๐Ÿ” Azure OpenAI Responses Endpoint Response`, { + status: response.status, + statusText: response.statusText, + headers: { + 'content-type': response.headers['content-type'], + 'x-request-id': response.headers['x-request-id'] || response.headers['x-ms-request-id'], + 'x-ratelimit-remaining': response.headers['x-ratelimit-remaining-requests'], + 'x-ratelimit-reset': response.headers['x-ratelimit-reset-requests'] + }, + responseBodyPreview: isStream ? '[STREAM]' : ( + response.data ? JSON.stringify(response.data).substring(0, 500) + (JSON.stringify(response.data).length > 500 ? '...' : '') : 'no data' + ), + endpoint: 'responses', + duration: `${requestDuration}ms` + }) + } + return response } catch (error) { const errorDetails = { @@ -207,6 +245,17 @@ async function handleAzureOpenAIRequest({ logger.error('Azure OpenAI Request Failed', errorDetails) } + // Enhanced error logging for responses endpoint + if (endpoint === 'responses') { + logger.error(`โŒ Azure OpenAI Responses Endpoint Error`, { + ...errorDetails, + endpoint: 'responses', + targetUrl: requestUrl, + errorType: error.response ? 'HTTP_ERROR' : 'NETWORK_ERROR', + responseBody: error.response?.data ? JSON.stringify(error.response.data) : 'no response body' + }) + } + throw error } }