* Executes a request using the chat completions API. * Used when the endpoint URL indicates chat completions.
( request: ProviderRequest, azureEndpoint: string, azureApiVersion: string, deploymentName: string, pinnedFetch?: typeof fetch )
| 53 | * Used when the endpoint URL indicates chat completions. |
| 54 | */ |
| 55 | async function executeChatCompletionsRequest( |
| 56 | request: ProviderRequest, |
| 57 | azureEndpoint: string, |
| 58 | azureApiVersion: string, |
| 59 | deploymentName: string, |
| 60 | pinnedFetch?: typeof fetch |
| 61 | ): Promise<ProviderResponse | StreamingExecution> { |
| 62 | logger.info('Using Azure OpenAI Chat Completions API', { |
| 63 | model: request.model, |
| 64 | endpoint: azureEndpoint, |
| 65 | deploymentName, |
| 66 | apiVersion: azureApiVersion, |
| 67 | hasSystemPrompt: !!request.systemPrompt, |
| 68 | hasMessages: !!request.messages?.length, |
| 69 | hasTools: !!request.tools?.length, |
| 70 | toolCount: request.tools?.length || 0, |
| 71 | hasResponseFormat: !!request.responseFormat, |
| 72 | stream: !!request.stream, |
| 73 | }) |
| 74 | |
| 75 | const azureOpenAI = new AzureOpenAI({ |
| 76 | apiKey: request.apiKey!, |
| 77 | apiVersion: azureApiVersion, |
| 78 | endpoint: azureEndpoint, |
| 79 | ...(pinnedFetch ? { fetch: pinnedFetch } : {}), |
| 80 | }) |
| 81 | |
| 82 | const allMessages: ChatCompletionMessageParam[] = [] |
| 83 | |
| 84 | if (request.systemPrompt) { |
| 85 | allMessages.push({ |
| 86 | role: 'system', |
| 87 | content: request.systemPrompt, |
| 88 | }) |
| 89 | } |
| 90 | |
| 91 | if (request.context) { |
| 92 | allMessages.push({ |
| 93 | role: 'user', |
| 94 | content: request.context, |
| 95 | }) |
| 96 | } |
| 97 | |
| 98 | if (request.messages) { |
| 99 | for (const message of request.messages) { |
| 100 | if (!message.files?.length || message.role !== 'user') { |
| 101 | allMessages.push(message as ChatCompletionMessageParam) |
| 102 | continue |
| 103 | } |
| 104 | |
| 105 | const attachments = prepareProviderAttachments(message.files, 'azure-openai') |
| 106 | const nonImage = attachments.find((a) => a.contentType !== 'image') |
| 107 | if (nonImage) { |
| 108 | throw new Error( |
| 109 | `File "${nonImage.filename}" (${nonImage.mimeType}) requires the Azure OpenAI Responses API endpoint; chat-completions deployments support images only` |
| 110 | ) |
| 111 | } |
| 112 |
no test coverage detected