( systemPrompt: string, messages: Anthropic.Messages.MessageParam[], metadata?: ApiHandlerCreateMessageMetadata, )
| 85 | } |
| 86 | |
| 87 | override async *createMessage( |
| 88 | systemPrompt: string, |
| 89 | messages: Anthropic.Messages.MessageParam[], |
| 90 | metadata?: ApiHandlerCreateMessageMetadata, |
| 91 | ): ApiStream { |
| 92 | const model = this.getModel() |
| 93 | |
| 94 | // Convert directly from Anthropic format to Responses API input format |
| 95 | const input = convertToResponsesApiInput(messages) |
| 96 | const responseTools = this.mapResponseTools(metadata?.tools) |
| 97 | |
| 98 | // Build request options |
| 99 | const requestBody: Record<string, any> = { |
| 100 | model: model.id, |
| 101 | instructions: systemPrompt, |
| 102 | input: input, |
| 103 | stream: true, |
| 104 | store: false, // Don't store responses server-side for privacy |
| 105 | include: ["reasoning.encrypted_content"], |
| 106 | } |
| 107 | |
| 108 | if (model.maxTokens) { |
| 109 | requestBody.max_output_tokens = model.maxTokens |
| 110 | } |
| 111 | |
| 112 | if (model.temperature !== undefined) { |
| 113 | requestBody.temperature = model.temperature |
| 114 | } |
| 115 | |
| 116 | if (responseTools) { |
| 117 | requestBody.tools = responseTools |
| 118 | // Cast tool_choice since metadata uses Chat Completions types but Responses API has its own type |
| 119 | requestBody.tool_choice = (metadata?.tool_choice ?? "auto") as any |
| 120 | requestBody.parallel_tool_calls = metadata?.parallelToolCalls ?? true |
| 121 | } |
| 122 | |
| 123 | // Pass reasoning effort for models that support it (e.g., mini models) |
| 124 | if (model.reasoning) { |
| 125 | requestBody.reasoning = model.reasoning |
| 126 | } |
| 127 | |
| 128 | let stream: AsyncIterable<any> |
| 129 | try { |
| 130 | stream = (await this.client.responses.create({ |
| 131 | ...requestBody, |
| 132 | stream: true, |
| 133 | } as any)) as unknown as AsyncIterable<any> |
| 134 | } catch (error) { |
| 135 | const errorMessage = error instanceof Error ? error.message : String(error) |
| 136 | const apiError = new ApiProviderError(errorMessage, this.providerName, model.id, "createMessage") |
| 137 | TelemetryService.instance.captureException(apiError) |
| 138 | throw handleOpenAIError(error, this.providerName) |
| 139 | } |
| 140 | |
| 141 | const normalizeUsage = createUsageNormalizer() |
| 142 | yield* processResponsesApiStream(stream, normalizeUsage) |
| 143 | } |
| 144 |
nothing calls this directly
no test coverage detected