@anvia/openai 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Indra Zulfi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -54,6 +54,41 @@ const model = client.completionModel("openai/gpt-5.2");
54
54
 
55
55
  You can also force a specific completion API with `completionApi: "responses"` or `completionApi: "chat"`.
56
56
 
57
+ ### Reasoning tool-call providers
58
+
59
+ Some OpenAI-compatible chat-completions providers return reasoning in provider-specific
60
+ fields while using normal tool calls. For example, Moonshot Kimi K2.6 returns
61
+ `reasoning_content` when thinking is enabled.
62
+
63
+ The chat-completions adapter preserves this reasoning in assistant history and sends it
64
+ back as `reasoning_content` on later turns. This matters after tool calls: providers
65
+ such as Moonshot can reject the next request if an assistant `tool_calls` message is
66
+ missing its prior `reasoning_content`.
67
+
68
+ For Moonshot Kimi K2.6 thinking mode:
69
+
70
+ ```ts
71
+ const client = new OpenAIClient({
72
+ apiKey: process.env.OPENAI_API_KEY,
73
+ baseUrl: "https://api.moonshot.ai/v1",
74
+ });
75
+
76
+ const model = client.completionModel("kimi-k2.6");
77
+
78
+ const response = await model.completion({
79
+ chatHistory,
80
+ documents: [],
81
+ tools,
82
+ maxTokens: 16_000,
83
+ additionalParams: {
84
+ thinking: { type: "enabled", keep: "all" },
85
+ },
86
+ });
87
+ ```
88
+
89
+ Provider caveat: Moonshot rejects forced/specified `tool_choice` while thinking is
90
+ enabled. Let the model choose tools naturally when using Kimi thinking mode.
91
+
57
92
  ## Other Models
58
93
 
59
94
  ```ts
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { AudioGenerationModel, AudioGenerationRequest, AudioGenerationResponse } from '@anvia/core/audio-generation';
2
2
  import OpenAI$1, { OpenAI } from 'openai';
3
- import { StreamingCompletionModel, CompletionModelCapabilities, CompletionRequest, CompletionResponse, CompletionStreamEvent } from '@anvia/core/completion';
3
+ import { StreamingCompletionModel, CompletionModelCapabilities, CompletionRequest, JsonObject, CompletionResponse, CompletionStreamEvent } from '@anvia/core/completion';
4
4
  import { ModelListingClient, ModelList } from '@anvia/core';
5
5
  import { EmbeddingModel, Embedding } from '@anvia/core/embeddings';
6
6
  import { ImageGenerationModel, ImageGenerationRequest, ImageGenerationResponse } from '@anvia/core/image-generation';
@@ -22,6 +22,9 @@ declare class OpenAIChatCompletionModel implements StreamingCompletionModel {
22
22
  readonly provider = "openai-chat";
23
23
  readonly capabilities: CompletionModelCapabilities;
24
24
  constructor(client: OpenAI, defaultModel?: string);
25
+ traceRequest(request: CompletionRequest, options?: {
26
+ stream?: boolean | undefined;
27
+ }): JsonObject;
25
28
  completion(request: CompletionRequest): Promise<CompletionResponse>;
26
29
  streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent>;
27
30
  }
@@ -88,6 +91,9 @@ declare class OpenAIResponsesCompletionModel implements StreamingCompletionModel
88
91
  readonly provider = "openai";
89
92
  readonly capabilities: CompletionModelCapabilities;
90
93
  constructor(client: OpenAI, defaultModel?: string);
94
+ traceRequest(request: CompletionRequest, options?: {
95
+ stream?: boolean | undefined;
96
+ }): JsonObject;
91
97
  completion(request: CompletionRequest): Promise<CompletionResponse>;
92
98
  streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent>;
93
99
  }
package/dist/index.js CHANGED
@@ -126,6 +126,15 @@ var OpenAIChatCompletionModel = class {
126
126
  outputSchema: true,
127
127
  reasoning: true
128
128
  };
129
+ traceRequest(request, options = {}) {
130
+ const params = toOpenAIChatCompletionParams(this.defaultModel, request);
131
+ if (options.stream === true) {
132
+ params.stream = true;
133
+ const streamOptions = isPlainObject(params.stream_options) ? params.stream_options : {};
134
+ params.stream_options = { ...streamOptions, include_usage: true };
135
+ }
136
+ return providerRequestSummary(params, request, options);
137
+ }
129
138
  async completion(request) {
130
139
  assertCompletionRequestSupported(this, request);
131
140
  const params = toOpenAIChatCompletionParams(this.defaultModel, request);
@@ -180,6 +189,51 @@ function toOpenAIChatCompletionParams(defaultModel, request) {
180
189
  }
181
190
  return params;
182
191
  }
192
+ function providerRequestSummary(params, request, options) {
193
+ return compactJsonObject({
194
+ provider: "openai-chat",
195
+ api: "chat.completions",
196
+ stream: options.stream === true,
197
+ model: stringFrom(params.model),
198
+ parameterKeys: Object.keys(params).sort(),
199
+ messageCount: Array.isArray(params.messages) ? params.messages.length : void 0,
200
+ toolCount: request.tools.length,
201
+ toolNames: request.tools.map((tool) => tool.name),
202
+ hasOutputSchema: request.outputSchema !== void 0,
203
+ temperature: request.temperature,
204
+ maxTokens: request.maxTokens,
205
+ toolChoice: toolChoiceSummary(request.toolChoice),
206
+ additionalParamKeys: isPlainObject(request.additionalParams) ? Object.keys(request.additionalParams).sort() : void 0
207
+ });
208
+ }
209
+ function toolChoiceSummary(toolChoice) {
210
+ if (toolChoice === void 0 || typeof toolChoice === "string") {
211
+ return toolChoice;
212
+ }
213
+ return { type: toolChoice.type, name: toolChoice.name };
214
+ }
215
+ function compactJsonObject(values) {
216
+ return Object.fromEntries(
217
+ Object.entries(values).flatMap(([key, value]) => {
218
+ if (value === void 0) {
219
+ return [];
220
+ }
221
+ return [[key, toJsonValue(value)]];
222
+ })
223
+ );
224
+ }
225
+ function toJsonValue(value) {
226
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
227
+ return value;
228
+ }
229
+ if (Array.isArray(value)) {
230
+ return value.map((item) => toJsonValue(item));
231
+ }
232
+ if (isPlainObject(value)) {
233
+ return compactJsonObject(value);
234
+ }
235
+ return String(value);
236
+ }
183
237
  function requestMessages(request) {
184
238
  return orderedRequestMessages(request, { includeInstructionsAsSystem: true });
185
239
  }
@@ -192,6 +246,10 @@ function fromOpenAIChatCompletionResponse(response) {
192
246
  if (typeof message.content === "string" && message.content.length > 0) {
193
247
  choice.push(AssistantContent.text(message.content));
194
248
  }
249
+ const reasoning = stringFrom(message.reasoning) ?? stringFrom(message.reasoning_content);
250
+ if (reasoning !== void 0 && reasoning.length > 0) {
251
+ choice.push(AssistantContent.reasoning(reasoning));
252
+ }
195
253
  const toolCalls = Array.isArray(message.tool_calls) ? message.tool_calls : [];
196
254
  for (const toolCall of toolCalls) {
197
255
  if (!isPlainObject(toolCall)) {
@@ -295,11 +353,12 @@ function messageToChatMessages(message) {
295
353
  return message.content.map(toolContentToChatMessage);
296
354
  }
297
355
  const text = message.content.flatMap((content) => content.type === "text" ? [content.text] : []).join("\n");
356
+ const reasoning = message.content.flatMap((content) => content.type === "reasoning" ? [content.text] : []).filter((text2) => text2.length > 0).join("\n");
298
357
  if (message.content.some((content) => content.type === "image")) {
299
358
  throw new Error("OpenAI chat completions does not support image content in assistant history");
300
359
  }
301
360
  const toolCalls = message.content.filter((content) => content.type === "tool_call").map((content) => ({
302
- id: content.id,
361
+ id: content.callId ?? content.id,
303
362
  type: "function",
304
363
  function: {
305
364
  name: content.function.name,
@@ -312,6 +371,9 @@ function messageToChatMessages(message) {
312
371
  if (text.length > 0) {
313
372
  chatMessage.content = text;
314
373
  }
374
+ if (reasoning.length > 0) {
375
+ chatMessage.reasoning_content = reasoning;
376
+ }
315
377
  if (toolCalls.length > 0) {
316
378
  chatMessage.tool_calls = toolCalls;
317
379
  }
@@ -520,6 +582,13 @@ var OpenAIResponsesCompletionModel = class {
520
582
  outputSchema: true,
521
583
  reasoning: true
522
584
  };
585
+ traceRequest(request, options = {}) {
586
+ const params = toOpenAIResponsesParams(this.defaultModel, request);
587
+ if (options.stream === true) {
588
+ params.stream = true;
589
+ }
590
+ return providerRequestSummary2(params, request, options);
591
+ }
523
592
  async completion(request) {
524
593
  assertCompletionRequestSupported2(this, request);
525
594
  const params = toOpenAIResponsesParams(this.defaultModel, request);
@@ -573,6 +642,52 @@ function toOpenAIResponsesParams(defaultModel, request) {
573
642
  }
574
643
  return params;
575
644
  }
645
+ function providerRequestSummary2(params, request, options) {
646
+ return compactJsonObject2({
647
+ provider: "openai",
648
+ api: "responses",
649
+ stream: options.stream === true,
650
+ model: stringFrom(params.model),
651
+ parameterKeys: Object.keys(params).sort(),
652
+ inputCount: Array.isArray(params.input) ? params.input.length : void 0,
653
+ toolCount: request.tools.length,
654
+ toolNames: request.tools.map((tool) => tool.name),
655
+ hasInstructions: typeof params.instructions === "string" && params.instructions.length > 0,
656
+ hasOutputSchema: request.outputSchema !== void 0,
657
+ temperature: request.temperature,
658
+ maxTokens: request.maxTokens,
659
+ toolChoice: toolChoiceSummary2(request.toolChoice),
660
+ additionalParamKeys: isPlainObject(request.additionalParams) ? Object.keys(request.additionalParams).sort() : void 0
661
+ });
662
+ }
663
+ function toolChoiceSummary2(toolChoice) {
664
+ if (toolChoice === void 0 || typeof toolChoice === "string") {
665
+ return toolChoice;
666
+ }
667
+ return { type: toolChoice.type, name: toolChoice.name };
668
+ }
669
+ function compactJsonObject2(values) {
670
+ return Object.fromEntries(
671
+ Object.entries(values).flatMap(([key, value]) => {
672
+ if (value === void 0) {
673
+ return [];
674
+ }
675
+ return [[key, toJsonValue2(value)]];
676
+ })
677
+ );
678
+ }
679
+ function toJsonValue2(value) {
680
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
681
+ return value;
682
+ }
683
+ if (Array.isArray(value)) {
684
+ return value.map((item) => toJsonValue2(item));
685
+ }
686
+ if (isPlainObject(value)) {
687
+ return compactJsonObject2(value);
688
+ }
689
+ return String(value);
690
+ }
576
691
  function requestMessages2(request) {
577
692
  return orderedRequestMessages(request);
578
693
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/openai/index.ts","../src/utils.ts","../src/openai/audio-generation.ts","../src/openai/chat-completion.ts","../src/request-messages.ts","../src/openai/client.ts","../src/openai/embedding.ts","../src/openai/image-generation.ts","../src/openai/responses.ts","../src/openai/transcription.ts"],"sourcesContent":["export { OpenAIAudioGenerationModel, TTS_1, TTS_1_HD } from \"./audio-generation\";\nexport { OpenAIChatCompletionModel } from \"./chat-completion\";\nexport { OpenAIClient, type OpenAIClientOptions } from \"./client\";\nexport { OpenAIEmbeddingModel, type ProviderEmbeddingModelOptions } from \"./embedding\";\nexport {\n DALL_E_2,\n DALL_E_3,\n GPT_IMAGE_1,\n GPT_IMAGE_2,\n OpenAIImageGenerationModel,\n} from \"./image-generation\";\nexport { OpenAIResponsesCompletionModel } from \"./responses\";\nexport { OpenAITranscriptionModel, WHISPER_1 } from \"./transcription\";\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function numberFrom(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nexport function stringFrom(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function parseJsonValue(text: string): JsonValue {\n try {\n return JSON.parse(text) as JsonValue;\n } catch {\n return text;\n }\n}\n\nexport function schemaName(schema: JsonObject): string {\n return typeof schema.title === \"string\" ? schema.title : \"response_schema\";\n}\n","import type {\n AudioGenerationModel,\n AudioGenerationRequest,\n AudioGenerationResponse,\n} from \"@anvia/core/audio-generation\";\nimport type { OpenAI } from \"openai\";\nimport { isPlainObject } from \"../utils\";\n\nexport const TTS_1 = \"tts-1\";\nexport const TTS_1_HD = \"tts-1-hd\";\n\nexport class OpenAIAudioGenerationModel implements AudioGenerationModel {\n readonly provider = \"openai\";\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = TTS_1,\n ) {}\n\n async audioGeneration(\n request: AudioGenerationRequest,\n ): Promise<AudioGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n input: request.text,\n voice: request.voice,\n speed: request.speed,\n };\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n const response = await this.client.audio.speech.create(params as never);\n return {\n audio: new Uint8Array(await response.arrayBuffer()),\n mediaType: mediaTypeFromFormat(params.response_format),\n rawResponse: response,\n };\n }\n}\n\nfunction mediaTypeFromFormat(format: unknown): string {\n if (format === \"wav\") return \"audio/wav\";\n if (format === \"flac\") return \"audio/flac\";\n if (format === \"opus\") return \"audio/opus\";\n if (format === \"aac\") return \"audio/aac\";\n if (format === \"pcm\") return \"audio/pcm\";\n return \"audio/mpeg\";\n}\n","import {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type DocumentContent,\n type ImageContent,\n type Message as MessageType,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { OpenAI } from \"openai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport { isPlainObject, numberFrom, parseJsonValue, schemaName, stringFrom } from \"../utils\";\n\ntype ChatCompletionParams = Record<string, unknown>;\ntype ChatMessage = Record<string, unknown>;\n\nexport class OpenAIChatCompletionModel implements StreamingCompletionModel {\n readonly provider = \"openai-chat\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: false,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = \"openai/gpt-5.2\",\n ) {}\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toOpenAIChatCompletionParams(this.defaultModel, request);\n const response = await this.client.chat.completions.create(params as never);\n return fromOpenAIChatCompletionResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params: ChatCompletionParams = {\n ...toOpenAIChatCompletionParams(this.defaultModel, request),\n stream: true,\n };\n const streamOptions = isPlainObject(params.stream_options) ? params.stream_options : {};\n params.stream_options = { ...streamOptions, include_usage: true };\n const stream = await this.client.chat.completions.create(params as never);\n for await (const chunk of stream as unknown as AsyncIterable<unknown>) {\n for (const event of fromOpenAIChatCompletionStreamChunk(chunk)) {\n yield event;\n }\n }\n }\n}\n\nexport function toOpenAIChatCompletionParams(\n defaultModel: string,\n request: CompletionRequest,\n): ChatCompletionParams {\n const params: ChatCompletionParams = {\n model: request.model ?? defaultModel,\n messages: requestMessages(request).flatMap(messageToChatMessages),\n };\n\n if (request.tools.length > 0) {\n params.tools = request.tools.map(toolDefinitionToOpenAIChatCompletion);\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.maxTokens !== undefined) {\n params.max_tokens = request.maxTokens;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = toolChoiceToOpenAIChatCompletion(request.toolChoice);\n }\n\n if (request.outputSchema !== undefined) {\n params.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schemaName(request.outputSchema),\n strict: true,\n schema: request.outputSchema,\n },\n };\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n return params;\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request, { includeInstructionsAsSystem: true });\n}\n\nexport function fromOpenAIChatCompletionResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const choices = Array.isArray(raw.choices) ? raw.choices : [];\n const firstChoice = choices.find(isPlainObject);\n const message = isPlainObject(firstChoice?.message) ? firstChoice.message : {};\n const choice: AssistantContentType[] = [];\n\n if (typeof message.content === \"string\" && message.content.length > 0) {\n choice.push(AssistantContent.text(message.content));\n }\n\n const toolCalls = Array.isArray(message.tool_calls) ? message.tool_calls : [];\n for (const toolCall of toolCalls) {\n if (!isPlainObject(toolCall)) {\n continue;\n }\n\n const fn = isPlainObject(toolCall.function) ? toolCall.function : {};\n const id = typeof toolCall.id === \"string\" ? toolCall.id : crypto.randomUUID();\n const name = typeof fn.name === \"string\" ? fn.name : \"\";\n const argsText = typeof fn.arguments === \"string\" ? fn.arguments : \"{}\";\n choice.push(AssistantContent.toolCall(id, name, parseJsonValue(argsText)));\n }\n\n const result: CompletionResponse = {\n choice,\n usage: usageFromOpenAIChatCompletion(raw.usage),\n rawResponse: response,\n };\n\n if (typeof raw.id === \"string\") {\n result.messageId = raw.id;\n }\n\n return result;\n}\n\nexport function fromOpenAIChatCompletionStreamChunk(chunk: unknown): CompletionStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionStreamEvent[] = [];\n const choices = Array.isArray(chunk.choices) ? chunk.choices : [];\n for (const choice of choices) {\n if (!isPlainObject(choice) || !isPlainObject(choice.delta)) {\n continue;\n }\n\n const delta = choice.delta;\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n events.push({ type: \"text_delta\", delta: delta.content });\n }\n\n const reasoning = stringFrom(delta.reasoning) ?? stringFrom(delta.reasoning_content);\n if (reasoning !== undefined && reasoning.length > 0) {\n events.push({ type: \"reasoning_delta\", delta: reasoning });\n }\n\n const toolCalls = Array.isArray(delta.tool_calls) ? delta.tool_calls : [];\n for (const toolCall of toolCalls) {\n if (!isPlainObject(toolCall)) {\n continue;\n }\n const fn = isPlainObject(toolCall.function) ? toolCall.function : {};\n const index = numberFrom(toolCall.index);\n const id = `tool_${index}`;\n events.push(\n toolCallDelta(id, {\n callId: stringFrom(toolCall.id),\n name: stringFrom(fn.name),\n argumentsDelta: stringFrom(fn.arguments),\n }),\n );\n }\n }\n\n if (typeof chunk.id === \"string\") {\n events.push({ type: \"message_id\", id: chunk.id });\n }\n\n if (isPlainObject(chunk.usage)) {\n const response: CompletionResponse = {\n choice: [],\n usage: usageFromOpenAIChatCompletion(chunk.usage),\n rawResponse: chunk,\n };\n if (typeof chunk.id === \"string\") {\n response.messageId = chunk.id;\n }\n events.push({ type: \"final\", response });\n }\n\n return events;\n}\n\nfunction usageFromOpenAIChatCompletion(usage: unknown): Usage {\n const usageSource = isPlainObject(usage) ? usage : {};\n const promptDetails = isPlainObject(usageSource.prompt_tokens_details)\n ? usageSource.prompt_tokens_details\n : {};\n\n return {\n ...Usage.empty(),\n inputTokens: numberFrom(usageSource.prompt_tokens),\n outputTokens: numberFrom(usageSource.completion_tokens),\n totalTokens: numberFrom(usageSource.total_tokens),\n cachedInputTokens: numberFrom(promptDetails.cached_tokens),\n };\n}\n\nfunction messageToChatMessages(message: MessageType): ChatMessage[] {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: message.content }];\n }\n\n if (message.role === \"user\") {\n const contentParts: ChatMessage[] = [];\n\n for (const content of message.content) {\n contentParts.push(...userContentToChatParts(content));\n }\n\n if (contentParts.length === 1 && contentParts[0]?.type === \"text\") {\n return [{ role: \"user\", content: contentParts[0].text }];\n } else if (contentParts.length > 0) {\n return [{ role: \"user\", content: contentParts }];\n }\n\n return [];\n }\n\n if (message.role === \"tool\") {\n return message.content.map(toolContentToChatMessage);\n }\n\n const text = message.content\n .flatMap((content) => (content.type === \"text\" ? [content.text] : []))\n .join(\"\\n\");\n if (message.content.some((content) => content.type === \"image\")) {\n throw new Error(\"OpenAI chat completions does not support image content in assistant history\");\n }\n const toolCalls = message.content\n .filter((content) => content.type === \"tool_call\")\n .map((content) => ({\n id: content.id,\n type: \"function\",\n function: {\n name: content.function.name,\n arguments: JSON.stringify(content.function.arguments ?? {}),\n },\n }));\n\n const chatMessage: ChatMessage = {\n role: \"assistant\",\n };\n if (text.length > 0) {\n chatMessage.content = text;\n }\n if (toolCalls.length > 0) {\n chatMessage.tool_calls = toolCalls;\n }\n\n return [chatMessage];\n}\n\nfunction toolContentToChatMessage(content: ToolContent): ChatMessage {\n return {\n role: \"tool\",\n tool_call_id: content.callId ?? content.id,\n content: content.content\n .map((item) => (item.type === \"text\" ? item.text : item.data))\n .join(\"\\n\"),\n };\n}\n\nfunction userContentToChatParts(content: UserContent): ChatMessage[] {\n if (content.type === \"text\") {\n return [{ type: \"text\", text: content.text }];\n }\n\n if (content.type === \"image\") {\n const image_url: ChatMessage = { url: imageUrl(content) };\n if (content.detail !== undefined) {\n image_url.detail = content.detail;\n }\n return [{ type: \"image_url\", image_url }];\n }\n\n if (content.type === \"document\") {\n return documentToChatParts(content);\n }\n\n return [];\n}\n\nfunction imageUrl(image: ImageContent): string {\n if (image.source.type === \"url\") {\n return image.source.url;\n }\n\n return `data:${image.source.mediaType};base64,${image.source.data}`;\n}\n\nfunction documentToChatParts(document: DocumentContent): ChatMessage[] {\n if (document.source.type === \"text\") {\n return [{ type: \"text\", text: document.source.text }];\n }\n\n throw new Error(\"OpenAI chat completions does not support file document attachments\");\n}\n\nfunction toolDefinitionToOpenAIChatCompletion(tool: ToolDefinition): ChatMessage {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n}\n\nfunction toolChoiceToOpenAIChatCompletion(toolChoice: ToolChoice): unknown {\n if (toolChoice === \"auto\" || toolChoice === \"required\" || toolChoice === \"none\") {\n return toolChoice;\n }\n\n return {\n type: \"function\",\n function: {\n name: toolChoice.name,\n },\n };\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n return event;\n}\n\nexport const openAIChatCompletionMessageHelpers = {\n messageToChatMessages,\n toolDefinitionToOpenAIChatCompletion,\n};\n","import {\n type CompletionRequest,\n Message,\n type Message as MessageType,\n normalizeDocuments,\n} from \"@anvia/core/completion\";\n\nexport type OrderedRequestMessagesOptions = {\n includeInstructionsAsSystem?: boolean;\n};\n\nexport function orderedRequestMessages(\n request: CompletionRequest,\n options: OrderedRequestMessagesOptions = {},\n): MessageType[] {\n const messages: MessageType[] = [];\n if (options.includeInstructionsAsSystem === true && request.instructions !== undefined) {\n messages.push(Message.system(request.instructions));\n }\n messages.push(...request.chatHistory.filter((message) => message.role === \"system\"));\n const documents = normalizeDocuments(request.documents);\n if (documents !== undefined) {\n messages.push(documents);\n }\n messages.push(...request.chatHistory.filter((message) => message.role !== \"system\"));\n return messages;\n}\n","import { type ModelList, type ModelListingClient, ModelListingError } from \"@anvia/core\";\nimport type { StreamingCompletionModel } from \"@anvia/core/completion\";\nimport OpenAI from \"openai\";\nimport { OpenAIAudioGenerationModel, TTS_1 } from \"./audio-generation\";\nimport { OpenAIChatCompletionModel } from \"./chat-completion\";\nimport { OpenAIEmbeddingModel, type ProviderEmbeddingModelOptions } from \"./embedding\";\nimport { GPT_IMAGE_1, OpenAIImageGenerationModel } from \"./image-generation\";\nimport { OpenAIResponsesCompletionModel } from \"./responses\";\nimport { OpenAITranscriptionModel, WHISPER_1 } from \"./transcription\";\n\nexport type OpenAIClientOptions = {\n apiKey?: string | undefined;\n baseUrl?: string | undefined;\n headers?: Record<string, string> | undefined;\n completionApi?: \"responses\" | \"chat\" | undefined;\n client?: OpenAI | undefined;\n};\n\nexport class OpenAIClient implements ModelListingClient {\n readonly client: OpenAI;\n private readonly completionApi: \"responses\" | \"chat\";\n\n constructor(options: OpenAIClientOptions = {}) {\n this.completionApi =\n options.completionApi ?? (options.baseUrl === undefined ? \"responses\" : \"chat\");\n this.client =\n options.client ??\n new OpenAI({\n apiKey: requireApiKey(options.apiKey),\n baseURL: options.baseUrl,\n defaultHeaders: options.headers,\n });\n }\n\n completionModel(model = \"gpt-5\"): StreamingCompletionModel {\n return this.completionApi === \"chat\"\n ? new OpenAIChatCompletionModel(this.client, model)\n : new OpenAIResponsesCompletionModel(this.client, model);\n }\n\n embeddingModel(\n model = \"text-embedding-3-small\",\n options: ProviderEmbeddingModelOptions = {},\n ): OpenAIEmbeddingModel {\n return new OpenAIEmbeddingModel(this.client, model, options);\n }\n\n imageGenerationModel(model = GPT_IMAGE_1): OpenAIImageGenerationModel {\n return new OpenAIImageGenerationModel(this.client, model);\n }\n\n audioGenerationModel(model = TTS_1): OpenAIAudioGenerationModel {\n return new OpenAIAudioGenerationModel(this.client, model);\n }\n\n transcriptionModel(model = WHISPER_1): OpenAITranscriptionModel {\n return new OpenAITranscriptionModel(this.client, model);\n }\n\n async listModels(): Promise<ModelList> {\n try {\n const response = await this.client.models.list();\n const data = (await collectModelsFromResponse(response))\n .map(toListedModel)\n .filter(isListedModel);\n return { data };\n } catch (error) {\n throw toModelListingError(\"OpenAI\", error);\n }\n }\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (apiKey === undefined || apiKey.length === 0) {\n throw new Error(\"Missing OpenAI credentials. Pass apiKey when constructing OpenAIClient.\");\n }\n\n return apiKey;\n}\n\nasync function collectModelsFromResponse(response: unknown): Promise<unknown[]> {\n if (isAsyncIterable(response)) {\n const models: unknown[] = [];\n for await (const model of response) {\n models.push(model);\n }\n return models;\n }\n\n if (Array.isArray(response)) {\n return response;\n }\n\n if (isObject(response) && Array.isArray(response.data)) {\n return response.data;\n }\n\n return [];\n}\n\nfunction toListedModel(model: unknown): ModelList[\"data\"][number] | undefined {\n if (!isObject(model) || typeof model.id !== \"string\") {\n return undefined;\n }\n\n return {\n id: model.id,\n ...(typeof model.name === \"string\" ? { name: model.name } : {}),\n ...(typeof model.description === \"string\" ? { description: model.description } : {}),\n ...(typeof model.type === \"string\"\n ? { type: model.type }\n : typeof model.object === \"string\"\n ? { type: model.object }\n : {}),\n ...(typeof model.created === \"number\" ? { createdAt: model.created } : {}),\n ...(typeof model.created_at === \"number\" ? { createdAt: model.created_at } : {}),\n ...(typeof model.owned_by === \"string\" ? { ownedBy: model.owned_by } : {}),\n ...(typeof model.context_length === \"number\" ? { contextLength: model.context_length } : {}),\n ...(typeof model.contextLength === \"number\" ? { contextLength: model.contextLength } : {}),\n };\n}\n\nfunction isListedModel(\n model: ModelList[\"data\"][number] | undefined,\n): model is ModelList[\"data\"][number] {\n return model !== undefined;\n}\n\nfunction toModelListingError(provider: string, error: unknown): ModelListingError {\n if (error instanceof ModelListingError) {\n return error;\n }\n\n const statusCode = getStatusCode(error);\n return new ModelListingError(`${provider} model listing failed: ${getErrorMessage(error)}`, {\n provider,\n ...(statusCode === undefined ? {} : { statusCode }),\n cause: error,\n });\n}\n\nfunction getStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.status === \"number\") {\n return error.status;\n }\n\n if (typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isObject(value) && Symbol.asyncIterator in value;\n}\n","import type { Embedding, EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type OpenAI from \"openai\";\n\nexport type ProviderEmbeddingModelOptions = {\n dimensions?: number | undefined;\n user?: string | undefined;\n maxBatchSize?: number | undefined;\n};\n\nexport class OpenAIEmbeddingModel implements EmbeddingModel {\n readonly dimensions: number | undefined;\n readonly maxBatchSize: number;\n private readonly user: string | undefined;\n\n constructor(\n private readonly client: OpenAI,\n private readonly model: string,\n options: ProviderEmbeddingModelOptions = {},\n ) {\n this.dimensions = options.dimensions;\n this.maxBatchSize = options.maxBatchSize ?? 1024;\n this.user = options.user;\n }\n\n async embedTexts(texts: string[]): Promise<Embedding[]> {\n const embeddings: Embedding[] = [];\n for (let index = 0; index < texts.length; index += this.maxBatchSize) {\n const batch = texts.slice(index, index + this.maxBatchSize);\n embeddings.push(...(await this.embedBatch(batch)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const params: Record<string, unknown> = {\n model: this.model,\n input: texts,\n };\n if (this.dimensions !== undefined) {\n params.dimensions = this.dimensions;\n }\n if (this.user !== undefined) {\n params.user = this.user;\n }\n\n const response = await this.client.embeddings.create(params as never);\n const data = Array.isArray(response.data) ? response.data : [];\n if (data.length !== texts.length) {\n throw new Error(\n `Embedding response length ${data.length} did not match input length ${texts.length}`,\n );\n }\n\n return data\n .slice()\n .sort((left, right) => left.index - right.index)\n .map((item, index) => ({\n document: texts[index] as string,\n vector: item.embedding,\n }));\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n GeneratedImage,\n ImageGenerationModel,\n ImageGenerationRequest,\n ImageGenerationResponse,\n} from \"@anvia/core/image-generation\";\nimport type { OpenAI } from \"openai\";\nimport { isPlainObject } from \"../utils\";\n\nexport const DALL_E_2 = \"dall-e-2\";\nexport const DALL_E_3 = \"dall-e-3\";\nexport const GPT_IMAGE_1 = \"gpt-image-1\";\nexport const GPT_IMAGE_2 = \"gpt-image-2\";\n\nexport class OpenAIImageGenerationModel implements ImageGenerationModel {\n readonly provider = \"openai\";\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = GPT_IMAGE_1,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n ): Promise<ImageGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n prompt: request.prompt,\n size: `${request.width}x${request.height}`,\n };\n\n if (this.defaultModel === DALL_E_2 || this.defaultModel === DALL_E_3) {\n params.response_format = \"b64_json\";\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n const response = await this.client.images.generate(params as never);\n return imageResponseFromOpenAI(response);\n }\n}\n\nexport function imageResponseFromOpenAI(response: unknown): ImageGenerationResponse<unknown> {\n const raw = response as Record<string, unknown>;\n const mediaType = mediaTypeFromFormat(\n typeof raw.output_format === \"string\" ? raw.output_format : \"png\",\n );\n const images = (Array.isArray(raw.data) ? raw.data : []).flatMap((item): GeneratedImage[] => {\n if (!isPlainObject(item) || typeof item.b64_json !== \"string\") {\n return [];\n }\n return [{ data: new Uint8Array(Buffer.from(item.b64_json, \"base64\")), mediaType }];\n });\n\n const image = images[0]?.data;\n if (image === undefined) {\n throw new Error(\"OpenAI image generation response contained no base64 images.\");\n }\n\n return {\n image,\n images,\n mediaType,\n rawResponse: response,\n };\n}\n\nfunction mediaTypeFromFormat(format: string): string {\n if (format === \"jpeg\" || format === \"jpg\") {\n return \"image/jpeg\";\n }\n if (format === \"webp\") {\n return \"image/webp\";\n }\n return \"image/png\";\n}\n","import {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type DocumentContent,\n type ImageContent,\n type Message as MessageType,\n type Reasoning,\n type ReasoningContent,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { OpenAI } from \"openai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport { isPlainObject, numberFrom, parseJsonValue, schemaName, stringFrom } from \"../utils\";\n\ntype ResponsesCreateParams = Record<string, unknown>;\ntype ResponsesInputItem = Record<string, unknown>;\n\nexport class OpenAIResponsesCompletionModel implements StreamingCompletionModel {\n readonly provider = \"openai\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: true,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = \"gpt-5\",\n ) {}\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toOpenAIResponsesParams(this.defaultModel, request);\n const response = await this.client.responses.create(params as never);\n return fromOpenAIResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = { ...toOpenAIResponsesParams(this.defaultModel, request), stream: true };\n const stream = await this.client.responses.create(params as never);\n for await (const event of stream as unknown as AsyncIterable<unknown>) {\n const mapped = fromOpenAIStreamEvent(event);\n if (mapped !== undefined) {\n yield mapped;\n }\n }\n }\n}\n\nexport function toOpenAIResponsesParams(\n defaultModel: string,\n request: CompletionRequest,\n): ResponsesCreateParams {\n const params: ResponsesCreateParams = {\n model: request.model ?? defaultModel,\n input: requestMessages(request).flatMap(messageToResponsesInput),\n };\n\n if (request.instructions !== undefined) {\n params.instructions = request.instructions;\n }\n\n if (request.tools.length > 0) {\n params.tools = request.tools.map(toolDefinitionToOpenAI);\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.maxTokens !== undefined) {\n params.max_output_tokens = request.maxTokens;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = toolChoiceToOpenAI(request.toolChoice);\n }\n\n if (request.outputSchema !== undefined) {\n params.text = {\n format: {\n type: \"json_schema\",\n name: schemaName(request.outputSchema),\n strict: true,\n schema: request.outputSchema,\n },\n };\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n return params;\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request);\n}\n\nexport function fromOpenAIResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const output = Array.isArray(raw.output) ? raw.output : [];\n const choice: AssistantContentType[] = [];\n\n for (const item of output) {\n if (!isPlainObject(item)) {\n continue;\n }\n\n if (item.type === \"message\") {\n choice.push(...messageOutputToAssistantContent(item));\n }\n\n if (item.type === \"function_call\") {\n const id = typeof item.id === \"string\" ? item.id : crypto.randomUUID();\n const callId = typeof item.call_id === \"string\" ? item.call_id : undefined;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const argsText = typeof item.arguments === \"string\" ? item.arguments : \"{}\";\n choice.push(AssistantContent.toolCall(id, name, parseJsonValue(argsText), callId));\n }\n\n if (item.type === \"reasoning\") {\n choice.push(reasoningItemToAssistantContent(item));\n }\n }\n\n const usageSource = isPlainObject(raw.usage) ? raw.usage : {};\n const inputTokens = numberFrom(usageSource.input_tokens);\n const outputTokens = numberFrom(usageSource.output_tokens);\n const totalTokens = numberFrom(usageSource.total_tokens) || inputTokens + outputTokens;\n const details = isPlainObject(usageSource.input_tokens_details)\n ? usageSource.input_tokens_details\n : {};\n\n const result: CompletionResponse = {\n choice,\n usage: {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens: numberFrom(details.cached_tokens),\n },\n rawResponse: response,\n };\n\n if (typeof raw.id === \"string\") {\n result.messageId = raw.id;\n }\n\n return result;\n}\n\nexport function fromOpenAIStreamEvent(event: unknown): CompletionStreamEvent | undefined {\n if (!isPlainObject(event) || typeof event.type !== \"string\") {\n return undefined;\n }\n\n if (event.type === \"response.output_text.delta\" || event.type === \"response.refusal.delta\") {\n return typeof event.delta === \"string\" ? { type: \"text_delta\", delta: event.delta } : undefined;\n }\n\n if (\n event.type === \"response.reasoning_text.delta\" ||\n event.type === \"response.reasoning_summary_text.delta\"\n ) {\n if (typeof event.delta !== \"string\") {\n return undefined;\n }\n const mapped: CompletionStreamEvent = { type: \"reasoning_delta\", delta: event.delta };\n const id = stringFrom(event.item_id);\n if (id !== undefined) {\n mapped.id = id;\n }\n if (event.type === \"response.reasoning_summary_text.delta\") {\n mapped.contentType = \"summary\";\n } else {\n mapped.contentType = \"text\";\n }\n return mapped;\n }\n\n if (event.type === \"response.output_item.added\" && isPlainObject(event.item)) {\n const item = event.item;\n if (item.type === \"function_call\") {\n return toolCallDelta(\n stringFrom(item.id) ?? stringFrom(event.item_id) ?? crypto.randomUUID(),\n {\n callId: stringFrom(item.call_id),\n name: stringFrom(item.name),\n argumentsDelta: typeof item.arguments === \"string\" ? item.arguments : undefined,\n },\n );\n }\n if (typeof item.id === \"string\") {\n return { type: \"message_id\", id: item.id };\n }\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.function_call_arguments.done\"\n ) {\n return toolCallDelta(\n stringFrom(event.item_id) ?? stringFrom(event.output_item_id) ?? crypto.randomUUID(),\n {\n argumentsDelta:\n typeof event.delta === \"string\"\n ? event.delta\n : typeof event.arguments === \"string\"\n ? event.arguments\n : undefined,\n },\n );\n }\n\n if (event.type === \"response.output_item.done\" && isPlainObject(event.item)) {\n const item = event.item;\n if (item.type === \"function_call\") {\n return {\n type: \"tool_call\",\n toolCall: AssistantContent.toolCall(\n stringFrom(item.id) ?? crypto.randomUUID(),\n stringFrom(item.name) ?? \"\",\n parseJsonValue(typeof item.arguments === \"string\" ? item.arguments : \"{}\"),\n stringFrom(item.call_id),\n ),\n };\n }\n }\n\n if (event.type === \"response.completed\" && isPlainObject(event.response)) {\n return {\n type: \"final\",\n response: fromOpenAIResponse(event.response),\n };\n }\n\n if (event.type === \"response.error\") {\n return { type: \"error\", error: event.error ?? event };\n }\n\n return undefined;\n}\n\nfunction messageToResponsesInput(message: MessageType): ResponsesInputItem[] {\n if (message.role === \"system\") {\n return [\n {\n role: \"system\",\n content: message.content,\n },\n ];\n }\n\n if (message.role === \"user\") {\n const inputContent: ResponsesInputItem[] = [];\n\n for (const content of message.content) {\n inputContent.push(...userContentToOpenAIResponsesParts(content));\n }\n\n if (inputContent.length === 1 && inputContent[0]?.type === \"input_text\") {\n return [{ role: \"user\", content: inputContent[0].text }];\n } else if (inputContent.length > 0) {\n return [{ role: \"user\", content: inputContent }];\n }\n\n return [];\n }\n\n if (message.role === \"tool\") {\n return message.content.map(toolContentToOpenAIResponsesItem);\n }\n\n const items: ResponsesInputItem[] = [];\n const text = message.content\n .flatMap((content) => (content.type === \"text\" ? [content.text] : []))\n .join(\"\\n\");\n if (text.length > 0) {\n items.push({ role: \"assistant\", content: text });\n }\n\n for (const content of message.content) {\n if (content.type === \"reasoning\" && content.id !== undefined) {\n items.push(reasoningToOpenAIInput(content));\n }\n if (content.type === \"tool_call\") {\n items.push({\n type: \"function_call\",\n id: content.id,\n call_id: content.callId ?? content.id,\n name: content.function.name,\n arguments: JSON.stringify(content.function.arguments ?? {}),\n });\n }\n if (content.type === \"image\") {\n throw new Error(\"OpenAI Responses does not support image content in assistant history\");\n }\n }\n\n return items;\n}\n\nfunction toolContentToOpenAIResponsesItem(content: ToolContent): ResponsesInputItem {\n return {\n type: \"function_call_output\",\n call_id: content.callId ?? content.id,\n output: content.content\n .map((item) => (item.type === \"text\" ? item.text : item.data))\n .join(\"\\n\"),\n };\n}\n\nfunction reasoningItemToAssistantContent(item: Record<string, unknown>): Reasoning {\n const content = reasoningContentFromOpenAIItem(item);\n const id = stringFrom(item.id);\n if (content.length === 0) {\n return AssistantContent.reasoning(\"\", id);\n }\n return AssistantContent.reasoningFromContent(content, id);\n}\n\nfunction reasoningContentFromOpenAIItem(item: Record<string, unknown>): ReasoningContent[] {\n const content: ReasoningContent[] = [];\n if (Array.isArray(item.content)) {\n for (const part of item.content) {\n if (!isPlainObject(part)) {\n continue;\n }\n if (part.type === \"reasoning_text\" && typeof part.text === \"string\") {\n content.push({ type: \"text\", text: part.text });\n }\n }\n }\n if (Array.isArray(item.summary)) {\n for (const summary of item.summary) {\n if (!isPlainObject(summary)) {\n continue;\n }\n if (typeof summary.text === \"string\") {\n content.push({ type: \"summary\", text: summary.text });\n }\n }\n }\n if (typeof item.encrypted_content === \"string\") {\n content.push({ type: \"encrypted\", data: item.encrypted_content });\n }\n return content;\n}\n\nfunction reasoningToOpenAIInput(reasoning: Reasoning): ResponsesInputItem {\n const item: ResponsesInputItem = {\n type: \"reasoning\",\n id: reasoning.id,\n summary:\n reasoning.content\n ?.filter((content): content is Extract<ReasoningContent, { type: \"summary\" }> => {\n return content.type === \"summary\";\n })\n .map((content) => ({ type: \"summary_text\", text: content.text })) ?? [],\n };\n const textContent = reasoning.content?.flatMap((content) =>\n content.type === \"text\" ? [{ type: \"reasoning_text\", text: content.text }] : [],\n );\n if (textContent !== undefined && textContent.length > 0) {\n item.content = textContent;\n }\n const encrypted = reasoning.content?.find((content) => content.type === \"encrypted\");\n if (encrypted?.type === \"encrypted\") {\n item.encrypted_content = encrypted.data;\n }\n return item;\n}\n\nfunction userContentToOpenAIResponsesParts(content: UserContent): ResponsesInputItem[] {\n if (content.type === \"text\") {\n return [{ type: \"input_text\", text: content.text }];\n }\n\n if (content.type === \"image\") {\n const part: ResponsesInputItem = { type: \"input_image\", image_url: imageUrl(content) };\n if (content.detail !== undefined) {\n part.detail = content.detail;\n }\n return [part];\n }\n\n if (content.type === \"document\") {\n return [documentToOpenAIResponsesPart(content)];\n }\n\n return [];\n}\n\nfunction imageUrl(image: ImageContent): string {\n if (image.source.type === \"url\") {\n return image.source.url;\n }\n\n return `data:${image.source.mediaType};base64,${image.source.data}`;\n}\n\nfunction documentToOpenAIResponsesPart(document: DocumentContent): ResponsesInputItem {\n if (document.source.type === \"text\") {\n return { type: \"input_text\", text: document.source.text };\n }\n\n if (document.source.mediaType !== \"application/pdf\") {\n throw new Error(`OpenAI Responses only supports PDF document attachments`);\n }\n\n if (document.source.type === \"url\") {\n return { type: \"input_file\", file_url: document.source.url };\n }\n\n return {\n type: \"input_file\",\n file_data: `data:${document.source.mediaType};base64,${document.source.data}`,\n filename: document.source.filename ?? \"document.pdf\",\n };\n}\n\nfunction toolDefinitionToOpenAI(tool: ToolDefinition): ResponsesInputItem {\n return {\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n };\n}\n\nfunction toolChoiceToOpenAI(toolChoice: ToolChoice): unknown {\n if (toolChoice === \"auto\" || toolChoice === \"required\" || toolChoice === \"none\") {\n return toolChoice;\n }\n\n return {\n type: \"function\",\n name: toolChoice.name,\n };\n}\n\nfunction messageOutputToAssistantContent(item: Record<string, unknown>): AssistantContentType[] {\n const content = Array.isArray(item.content) ? item.content : [];\n return content.flatMap((part): AssistantContentType[] => {\n if (!isPlainObject(part)) {\n return [];\n }\n\n if (part.type === \"output_text\" && typeof part.text === \"string\") {\n return [AssistantContent.text(part.text)];\n }\n\n if (part.type === \"text\" && typeof part.text === \"string\") {\n return [AssistantContent.text(part.text)];\n }\n\n return [];\n });\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n return event;\n}\n\nexport const openaiMessageHelpers = {\n messageToResponsesInput,\n toolDefinitionToOpenAI,\n};\n","import type {\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResponse,\n} from \"@anvia/core/transcription\";\nimport type { OpenAI } from \"openai\";\nimport { toFile } from \"openai\";\nimport { isPlainObject } from \"../utils\";\n\nexport const WHISPER_1 = \"whisper-1\";\n\nexport class OpenAITranscriptionModel implements TranscriptionModel {\n readonly provider = \"openai\";\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = WHISPER_1,\n ) {}\n\n async transcription(request: TranscriptionRequest): Promise<TranscriptionResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n file: await toFile(request.data, request.filename),\n };\n\n if (request.language !== undefined) params.language = request.language;\n if (request.prompt !== undefined) params.prompt = request.prompt;\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n const response = await this.client.audio.transcriptions.create(params as never);\n return {\n text: transcriptionText(response),\n rawResponse: response,\n };\n }\n}\n\nexport function transcriptionText(response: unknown): string {\n if (typeof response === \"string\") {\n return response;\n }\n if (isPlainObject(response) && typeof response.text === \"string\") {\n return response.text;\n }\n throw new Error(\"OpenAI transcription response contained no text.\");\n}\n"],"mappings":"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","names":["Buffer","mediaTypeFromFormat","Buffer","AssistantContent","assertCompletionRequestSupported","Usage","assertCompletionRequestSupported","requestMessages","AssistantContent","Usage","toolCallDelta","imageUrl"]}
1
+ {"version":3,"sources":["../src/openai/index.ts","../src/utils.ts","../src/openai/audio-generation.ts","../src/openai/chat-completion.ts","../src/request-messages.ts","../src/openai/client.ts","../src/openai/embedding.ts","../src/openai/image-generation.ts","../src/openai/responses.ts","../src/openai/transcription.ts"],"sourcesContent":["export { OpenAIAudioGenerationModel, TTS_1, TTS_1_HD } from \"./audio-generation\";\nexport { OpenAIChatCompletionModel } from \"./chat-completion\";\nexport { OpenAIClient, type OpenAIClientOptions } from \"./client\";\nexport { OpenAIEmbeddingModel, type ProviderEmbeddingModelOptions } from \"./embedding\";\nexport {\n DALL_E_2,\n DALL_E_3,\n GPT_IMAGE_1,\n GPT_IMAGE_2,\n OpenAIImageGenerationModel,\n} from \"./image-generation\";\nexport { OpenAIResponsesCompletionModel } from \"./responses\";\nexport { OpenAITranscriptionModel, WHISPER_1 } from \"./transcription\";\n","import type { JsonObject, JsonValue } from \"@anvia/core/completion\";\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function numberFrom(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nexport function stringFrom(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function parseJsonValue(text: string): JsonValue {\n try {\n return JSON.parse(text) as JsonValue;\n } catch {\n return text;\n }\n}\n\nexport function schemaName(schema: JsonObject): string {\n return typeof schema.title === \"string\" ? schema.title : \"response_schema\";\n}\n","import type {\n AudioGenerationModel,\n AudioGenerationRequest,\n AudioGenerationResponse,\n} from \"@anvia/core/audio-generation\";\nimport type { OpenAI } from \"openai\";\nimport { isPlainObject } from \"../utils\";\n\nexport const TTS_1 = \"tts-1\";\nexport const TTS_1_HD = \"tts-1-hd\";\n\nexport class OpenAIAudioGenerationModel implements AudioGenerationModel {\n readonly provider = \"openai\";\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = TTS_1,\n ) {}\n\n async audioGeneration(\n request: AudioGenerationRequest,\n ): Promise<AudioGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n input: request.text,\n voice: request.voice,\n speed: request.speed,\n };\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n const response = await this.client.audio.speech.create(params as never);\n return {\n audio: new Uint8Array(await response.arrayBuffer()),\n mediaType: mediaTypeFromFormat(params.response_format),\n rawResponse: response,\n };\n }\n}\n\nfunction mediaTypeFromFormat(format: unknown): string {\n if (format === \"wav\") return \"audio/wav\";\n if (format === \"flac\") return \"audio/flac\";\n if (format === \"opus\") return \"audio/opus\";\n if (format === \"aac\") return \"audio/aac\";\n if (format === \"pcm\") return \"audio/pcm\";\n return \"audio/mpeg\";\n}\n","import {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type DocumentContent,\n type ImageContent,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { OpenAI } from \"openai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport { isPlainObject, numberFrom, parseJsonValue, schemaName, stringFrom } from \"../utils\";\n\ntype ChatCompletionParams = Record<string, unknown>;\ntype ChatMessage = Record<string, unknown>;\n\nexport class OpenAIChatCompletionModel implements StreamingCompletionModel {\n readonly provider = \"openai-chat\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: false,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = \"openai/gpt-5.2\",\n ) {}\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params: ChatCompletionParams = toOpenAIChatCompletionParams(this.defaultModel, request);\n if (options.stream === true) {\n params.stream = true;\n const streamOptions = isPlainObject(params.stream_options) ? params.stream_options : {};\n params.stream_options = { ...streamOptions, include_usage: true };\n }\n return providerRequestSummary(params, request, options);\n }\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toOpenAIChatCompletionParams(this.defaultModel, request);\n const response = await this.client.chat.completions.create(params as never);\n return fromOpenAIChatCompletionResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params: ChatCompletionParams = {\n ...toOpenAIChatCompletionParams(this.defaultModel, request),\n stream: true,\n };\n const streamOptions = isPlainObject(params.stream_options) ? params.stream_options : {};\n params.stream_options = { ...streamOptions, include_usage: true };\n const stream = await this.client.chat.completions.create(params as never);\n for await (const chunk of stream as unknown as AsyncIterable<unknown>) {\n for (const event of fromOpenAIChatCompletionStreamChunk(chunk)) {\n yield event;\n }\n }\n }\n}\n\nexport function toOpenAIChatCompletionParams(\n defaultModel: string,\n request: CompletionRequest,\n): ChatCompletionParams {\n const params: ChatCompletionParams = {\n model: request.model ?? defaultModel,\n messages: requestMessages(request).flatMap(messageToChatMessages),\n };\n\n if (request.tools.length > 0) {\n params.tools = request.tools.map(toolDefinitionToOpenAIChatCompletion);\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.maxTokens !== undefined) {\n params.max_tokens = request.maxTokens;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = toolChoiceToOpenAIChatCompletion(request.toolChoice);\n }\n\n if (request.outputSchema !== undefined) {\n params.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: schemaName(request.outputSchema),\n strict: true,\n schema: request.outputSchema,\n },\n };\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n return params;\n}\n\nfunction providerRequestSummary(\n params: ChatCompletionParams,\n request: CompletionRequest,\n options: { stream?: boolean | undefined },\n): JsonObject {\n return compactJsonObject({\n provider: \"openai-chat\",\n api: \"chat.completions\",\n stream: options.stream === true,\n model: stringFrom(params.model),\n parameterKeys: Object.keys(params).sort(),\n messageCount: Array.isArray(params.messages) ? params.messages.length : undefined,\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n hasOutputSchema: request.outputSchema !== undefined,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: toolChoiceSummary(request.toolChoice),\n additionalParamKeys: isPlainObject(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n });\n}\n\nfunction toolChoiceSummary(toolChoice: ToolChoice | undefined): JsonValue | undefined {\n if (toolChoice === undefined || typeof toolChoice === \"string\") {\n return toolChoice;\n }\n return { type: toolChoice.type, name: toolChoice.name };\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(values).flatMap(([key, value]) => {\n if (value === undefined) {\n return [];\n }\n return [[key, toJsonValue(value)]];\n }),\n ) as JsonObject;\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (isPlainObject(value)) {\n return compactJsonObject(value);\n }\n return String(value);\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request, { includeInstructionsAsSystem: true });\n}\n\nexport function fromOpenAIChatCompletionResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const choices = Array.isArray(raw.choices) ? raw.choices : [];\n const firstChoice = choices.find(isPlainObject);\n const message = isPlainObject(firstChoice?.message) ? firstChoice.message : {};\n const choice: AssistantContentType[] = [];\n\n if (typeof message.content === \"string\" && message.content.length > 0) {\n choice.push(AssistantContent.text(message.content));\n }\n\n const reasoning = stringFrom(message.reasoning) ?? stringFrom(message.reasoning_content);\n if (reasoning !== undefined && reasoning.length > 0) {\n choice.push(AssistantContent.reasoning(reasoning));\n }\n\n const toolCalls = Array.isArray(message.tool_calls) ? message.tool_calls : [];\n for (const toolCall of toolCalls) {\n if (!isPlainObject(toolCall)) {\n continue;\n }\n\n const fn = isPlainObject(toolCall.function) ? toolCall.function : {};\n const id = typeof toolCall.id === \"string\" ? toolCall.id : crypto.randomUUID();\n const name = typeof fn.name === \"string\" ? fn.name : \"\";\n const argsText = typeof fn.arguments === \"string\" ? fn.arguments : \"{}\";\n choice.push(AssistantContent.toolCall(id, name, parseJsonValue(argsText)));\n }\n\n const result: CompletionResponse = {\n choice,\n usage: usageFromOpenAIChatCompletion(raw.usage),\n rawResponse: response,\n };\n\n if (typeof raw.id === \"string\") {\n result.messageId = raw.id;\n }\n\n return result;\n}\n\nexport function fromOpenAIChatCompletionStreamChunk(chunk: unknown): CompletionStreamEvent[] {\n if (!isPlainObject(chunk)) {\n return [];\n }\n\n const events: CompletionStreamEvent[] = [];\n const choices = Array.isArray(chunk.choices) ? chunk.choices : [];\n for (const choice of choices) {\n if (!isPlainObject(choice) || !isPlainObject(choice.delta)) {\n continue;\n }\n\n const delta = choice.delta;\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n events.push({ type: \"text_delta\", delta: delta.content });\n }\n\n const reasoning = stringFrom(delta.reasoning) ?? stringFrom(delta.reasoning_content);\n if (reasoning !== undefined && reasoning.length > 0) {\n events.push({ type: \"reasoning_delta\", delta: reasoning });\n }\n\n const toolCalls = Array.isArray(delta.tool_calls) ? delta.tool_calls : [];\n for (const toolCall of toolCalls) {\n if (!isPlainObject(toolCall)) {\n continue;\n }\n const fn = isPlainObject(toolCall.function) ? toolCall.function : {};\n const index = numberFrom(toolCall.index);\n const id = `tool_${index}`;\n events.push(\n toolCallDelta(id, {\n callId: stringFrom(toolCall.id),\n name: stringFrom(fn.name),\n argumentsDelta: stringFrom(fn.arguments),\n }),\n );\n }\n }\n\n if (typeof chunk.id === \"string\") {\n events.push({ type: \"message_id\", id: chunk.id });\n }\n\n if (isPlainObject(chunk.usage)) {\n const response: CompletionResponse = {\n choice: [],\n usage: usageFromOpenAIChatCompletion(chunk.usage),\n rawResponse: chunk,\n };\n if (typeof chunk.id === \"string\") {\n response.messageId = chunk.id;\n }\n events.push({ type: \"final\", response });\n }\n\n return events;\n}\n\nfunction usageFromOpenAIChatCompletion(usage: unknown): Usage {\n const usageSource = isPlainObject(usage) ? usage : {};\n const promptDetails = isPlainObject(usageSource.prompt_tokens_details)\n ? usageSource.prompt_tokens_details\n : {};\n\n return {\n ...Usage.empty(),\n inputTokens: numberFrom(usageSource.prompt_tokens),\n outputTokens: numberFrom(usageSource.completion_tokens),\n totalTokens: numberFrom(usageSource.total_tokens),\n cachedInputTokens: numberFrom(promptDetails.cached_tokens),\n };\n}\n\nfunction messageToChatMessages(message: MessageType): ChatMessage[] {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: message.content }];\n }\n\n if (message.role === \"user\") {\n const contentParts: ChatMessage[] = [];\n\n for (const content of message.content) {\n contentParts.push(...userContentToChatParts(content));\n }\n\n if (contentParts.length === 1 && contentParts[0]?.type === \"text\") {\n return [{ role: \"user\", content: contentParts[0].text }];\n } else if (contentParts.length > 0) {\n return [{ role: \"user\", content: contentParts }];\n }\n\n return [];\n }\n\n if (message.role === \"tool\") {\n return message.content.map(toolContentToChatMessage);\n }\n\n const text = message.content\n .flatMap((content) => (content.type === \"text\" ? [content.text] : []))\n .join(\"\\n\");\n const reasoning = message.content\n .flatMap((content) => (content.type === \"reasoning\" ? [content.text] : []))\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n if (message.content.some((content) => content.type === \"image\")) {\n throw new Error(\"OpenAI chat completions does not support image content in assistant history\");\n }\n const toolCalls = message.content\n .filter((content) => content.type === \"tool_call\")\n .map((content) => ({\n id: content.callId ?? content.id,\n type: \"function\",\n function: {\n name: content.function.name,\n arguments: JSON.stringify(content.function.arguments ?? {}),\n },\n }));\n\n const chatMessage: ChatMessage = {\n role: \"assistant\",\n };\n if (text.length > 0) {\n chatMessage.content = text;\n }\n if (reasoning.length > 0) {\n chatMessage.reasoning_content = reasoning;\n }\n if (toolCalls.length > 0) {\n chatMessage.tool_calls = toolCalls;\n }\n\n return [chatMessage];\n}\n\nfunction toolContentToChatMessage(content: ToolContent): ChatMessage {\n return {\n role: \"tool\",\n tool_call_id: content.callId ?? content.id,\n content: content.content\n .map((item) => (item.type === \"text\" ? item.text : item.data))\n .join(\"\\n\"),\n };\n}\n\nfunction userContentToChatParts(content: UserContent): ChatMessage[] {\n if (content.type === \"text\") {\n return [{ type: \"text\", text: content.text }];\n }\n\n if (content.type === \"image\") {\n const image_url: ChatMessage = { url: imageUrl(content) };\n if (content.detail !== undefined) {\n image_url.detail = content.detail;\n }\n return [{ type: \"image_url\", image_url }];\n }\n\n if (content.type === \"document\") {\n return documentToChatParts(content);\n }\n\n return [];\n}\n\nfunction imageUrl(image: ImageContent): string {\n if (image.source.type === \"url\") {\n return image.source.url;\n }\n\n return `data:${image.source.mediaType};base64,${image.source.data}`;\n}\n\nfunction documentToChatParts(document: DocumentContent): ChatMessage[] {\n if (document.source.type === \"text\") {\n return [{ type: \"text\", text: document.source.text }];\n }\n\n throw new Error(\"OpenAI chat completions does not support file document attachments\");\n}\n\nfunction toolDefinitionToOpenAIChatCompletion(tool: ToolDefinition): ChatMessage {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n}\n\nfunction toolChoiceToOpenAIChatCompletion(toolChoice: ToolChoice): unknown {\n if (toolChoice === \"auto\" || toolChoice === \"required\" || toolChoice === \"none\") {\n return toolChoice;\n }\n\n return {\n type: \"function\",\n function: {\n name: toolChoice.name,\n },\n };\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n return event;\n}\n\nexport const openAIChatCompletionMessageHelpers = {\n messageToChatMessages,\n toolDefinitionToOpenAIChatCompletion,\n};\n","import {\n type CompletionRequest,\n Message,\n type Message as MessageType,\n normalizeDocuments,\n} from \"@anvia/core/completion\";\n\nexport type OrderedRequestMessagesOptions = {\n includeInstructionsAsSystem?: boolean;\n};\n\nexport function orderedRequestMessages(\n request: CompletionRequest,\n options: OrderedRequestMessagesOptions = {},\n): MessageType[] {\n const messages: MessageType[] = [];\n if (options.includeInstructionsAsSystem === true && request.instructions !== undefined) {\n messages.push(Message.system(request.instructions));\n }\n messages.push(...request.chatHistory.filter((message) => message.role === \"system\"));\n const documents = normalizeDocuments(request.documents);\n if (documents !== undefined) {\n messages.push(documents);\n }\n messages.push(...request.chatHistory.filter((message) => message.role !== \"system\"));\n return messages;\n}\n","import { type ModelList, type ModelListingClient, ModelListingError } from \"@anvia/core\";\nimport type { StreamingCompletionModel } from \"@anvia/core/completion\";\nimport OpenAI from \"openai\";\nimport { OpenAIAudioGenerationModel, TTS_1 } from \"./audio-generation\";\nimport { OpenAIChatCompletionModel } from \"./chat-completion\";\nimport { OpenAIEmbeddingModel, type ProviderEmbeddingModelOptions } from \"./embedding\";\nimport { GPT_IMAGE_1, OpenAIImageGenerationModel } from \"./image-generation\";\nimport { OpenAIResponsesCompletionModel } from \"./responses\";\nimport { OpenAITranscriptionModel, WHISPER_1 } from \"./transcription\";\n\nexport type OpenAIClientOptions = {\n apiKey?: string | undefined;\n baseUrl?: string | undefined;\n headers?: Record<string, string> | undefined;\n completionApi?: \"responses\" | \"chat\" | undefined;\n client?: OpenAI | undefined;\n};\n\nexport class OpenAIClient implements ModelListingClient {\n readonly client: OpenAI;\n private readonly completionApi: \"responses\" | \"chat\";\n\n constructor(options: OpenAIClientOptions = {}) {\n this.completionApi =\n options.completionApi ?? (options.baseUrl === undefined ? \"responses\" : \"chat\");\n this.client =\n options.client ??\n new OpenAI({\n apiKey: requireApiKey(options.apiKey),\n baseURL: options.baseUrl,\n defaultHeaders: options.headers,\n });\n }\n\n completionModel(model = \"gpt-5\"): StreamingCompletionModel {\n return this.completionApi === \"chat\"\n ? new OpenAIChatCompletionModel(this.client, model)\n : new OpenAIResponsesCompletionModel(this.client, model);\n }\n\n embeddingModel(\n model = \"text-embedding-3-small\",\n options: ProviderEmbeddingModelOptions = {},\n ): OpenAIEmbeddingModel {\n return new OpenAIEmbeddingModel(this.client, model, options);\n }\n\n imageGenerationModel(model = GPT_IMAGE_1): OpenAIImageGenerationModel {\n return new OpenAIImageGenerationModel(this.client, model);\n }\n\n audioGenerationModel(model = TTS_1): OpenAIAudioGenerationModel {\n return new OpenAIAudioGenerationModel(this.client, model);\n }\n\n transcriptionModel(model = WHISPER_1): OpenAITranscriptionModel {\n return new OpenAITranscriptionModel(this.client, model);\n }\n\n async listModels(): Promise<ModelList> {\n try {\n const response = await this.client.models.list();\n const data = (await collectModelsFromResponse(response))\n .map(toListedModel)\n .filter(isListedModel);\n return { data };\n } catch (error) {\n throw toModelListingError(\"OpenAI\", error);\n }\n }\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (apiKey === undefined || apiKey.length === 0) {\n throw new Error(\"Missing OpenAI credentials. Pass apiKey when constructing OpenAIClient.\");\n }\n\n return apiKey;\n}\n\nasync function collectModelsFromResponse(response: unknown): Promise<unknown[]> {\n if (isAsyncIterable(response)) {\n const models: unknown[] = [];\n for await (const model of response) {\n models.push(model);\n }\n return models;\n }\n\n if (Array.isArray(response)) {\n return response;\n }\n\n if (isObject(response) && Array.isArray(response.data)) {\n return response.data;\n }\n\n return [];\n}\n\nfunction toListedModel(model: unknown): ModelList[\"data\"][number] | undefined {\n if (!isObject(model) || typeof model.id !== \"string\") {\n return undefined;\n }\n\n return {\n id: model.id,\n ...(typeof model.name === \"string\" ? { name: model.name } : {}),\n ...(typeof model.description === \"string\" ? { description: model.description } : {}),\n ...(typeof model.type === \"string\"\n ? { type: model.type }\n : typeof model.object === \"string\"\n ? { type: model.object }\n : {}),\n ...(typeof model.created === \"number\" ? { createdAt: model.created } : {}),\n ...(typeof model.created_at === \"number\" ? { createdAt: model.created_at } : {}),\n ...(typeof model.owned_by === \"string\" ? { ownedBy: model.owned_by } : {}),\n ...(typeof model.context_length === \"number\" ? { contextLength: model.context_length } : {}),\n ...(typeof model.contextLength === \"number\" ? { contextLength: model.contextLength } : {}),\n };\n}\n\nfunction isListedModel(\n model: ModelList[\"data\"][number] | undefined,\n): model is ModelList[\"data\"][number] {\n return model !== undefined;\n}\n\nfunction toModelListingError(provider: string, error: unknown): ModelListingError {\n if (error instanceof ModelListingError) {\n return error;\n }\n\n const statusCode = getStatusCode(error);\n return new ModelListingError(`${provider} model listing failed: ${getErrorMessage(error)}`, {\n provider,\n ...(statusCode === undefined ? {} : { statusCode }),\n cause: error,\n });\n}\n\nfunction getStatusCode(error: unknown): number | undefined {\n if (!isObject(error)) {\n return undefined;\n }\n\n if (typeof error.status === \"number\") {\n return error.status;\n }\n\n if (typeof error.statusCode === \"number\") {\n return error.statusCode;\n }\n\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return isObject(value) && Symbol.asyncIterator in value;\n}\n","import type { Embedding, EmbeddingModel } from \"@anvia/core/embeddings\";\nimport type OpenAI from \"openai\";\n\nexport type ProviderEmbeddingModelOptions = {\n dimensions?: number | undefined;\n user?: string | undefined;\n maxBatchSize?: number | undefined;\n};\n\nexport class OpenAIEmbeddingModel implements EmbeddingModel {\n readonly dimensions: number | undefined;\n readonly maxBatchSize: number;\n private readonly user: string | undefined;\n\n constructor(\n private readonly client: OpenAI,\n private readonly model: string,\n options: ProviderEmbeddingModelOptions = {},\n ) {\n this.dimensions = options.dimensions;\n this.maxBatchSize = options.maxBatchSize ?? 1024;\n this.user = options.user;\n }\n\n async embedTexts(texts: string[]): Promise<Embedding[]> {\n const embeddings: Embedding[] = [];\n for (let index = 0; index < texts.length; index += this.maxBatchSize) {\n const batch = texts.slice(index, index + this.maxBatchSize);\n embeddings.push(...(await this.embedBatch(batch)));\n }\n return embeddings;\n }\n\n private async embedBatch(texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const params: Record<string, unknown> = {\n model: this.model,\n input: texts,\n };\n if (this.dimensions !== undefined) {\n params.dimensions = this.dimensions;\n }\n if (this.user !== undefined) {\n params.user = this.user;\n }\n\n const response = await this.client.embeddings.create(params as never);\n const data = Array.isArray(response.data) ? response.data : [];\n if (data.length !== texts.length) {\n throw new Error(\n `Embedding response length ${data.length} did not match input length ${texts.length}`,\n );\n }\n\n return data\n .slice()\n .sort((left, right) => left.index - right.index)\n .map((item, index) => ({\n document: texts[index] as string,\n vector: item.embedding,\n }));\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport type {\n GeneratedImage,\n ImageGenerationModel,\n ImageGenerationRequest,\n ImageGenerationResponse,\n} from \"@anvia/core/image-generation\";\nimport type { OpenAI } from \"openai\";\nimport { isPlainObject } from \"../utils\";\n\nexport const DALL_E_2 = \"dall-e-2\";\nexport const DALL_E_3 = \"dall-e-3\";\nexport const GPT_IMAGE_1 = \"gpt-image-1\";\nexport const GPT_IMAGE_2 = \"gpt-image-2\";\n\nexport class OpenAIImageGenerationModel implements ImageGenerationModel {\n readonly provider = \"openai\";\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = GPT_IMAGE_1,\n ) {}\n\n async imageGeneration(\n request: ImageGenerationRequest,\n ): Promise<ImageGenerationResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n prompt: request.prompt,\n size: `${request.width}x${request.height}`,\n };\n\n if (this.defaultModel === DALL_E_2 || this.defaultModel === DALL_E_3) {\n params.response_format = \"b64_json\";\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n const response = await this.client.images.generate(params as never);\n return imageResponseFromOpenAI(response);\n }\n}\n\nexport function imageResponseFromOpenAI(response: unknown): ImageGenerationResponse<unknown> {\n const raw = response as Record<string, unknown>;\n const mediaType = mediaTypeFromFormat(\n typeof raw.output_format === \"string\" ? raw.output_format : \"png\",\n );\n const images = (Array.isArray(raw.data) ? raw.data : []).flatMap((item): GeneratedImage[] => {\n if (!isPlainObject(item) || typeof item.b64_json !== \"string\") {\n return [];\n }\n return [{ data: new Uint8Array(Buffer.from(item.b64_json, \"base64\")), mediaType }];\n });\n\n const image = images[0]?.data;\n if (image === undefined) {\n throw new Error(\"OpenAI image generation response contained no base64 images.\");\n }\n\n return {\n image,\n images,\n mediaType,\n rawResponse: response,\n };\n}\n\nfunction mediaTypeFromFormat(format: string): string {\n if (format === \"jpeg\" || format === \"jpg\") {\n return \"image/jpeg\";\n }\n if (format === \"webp\") {\n return \"image/webp\";\n }\n return \"image/png\";\n}\n","import {\n AssistantContent,\n type AssistantContent as AssistantContentType,\n assertCompletionRequestSupported,\n type CompletionModelCapabilities,\n type CompletionRequest,\n type CompletionResponse,\n type CompletionStreamEvent,\n type DocumentContent,\n type ImageContent,\n type JsonObject,\n type JsonValue,\n type Message as MessageType,\n type Reasoning,\n type ReasoningContent,\n type StreamingCompletionModel,\n type ToolChoice,\n type ToolContent,\n type ToolDefinition,\n Usage,\n type UserContent,\n} from \"@anvia/core/completion\";\nimport type { OpenAI } from \"openai\";\nimport { orderedRequestMessages } from \"../request-messages\";\nimport { isPlainObject, numberFrom, parseJsonValue, schemaName, stringFrom } from \"../utils\";\n\ntype ResponsesCreateParams = Record<string, unknown>;\ntype ResponsesInputItem = Record<string, unknown>;\n\nexport class OpenAIResponsesCompletionModel implements StreamingCompletionModel {\n readonly provider = \"openai\";\n readonly capabilities: CompletionModelCapabilities = {\n streaming: true,\n tools: true,\n toolChoice: true,\n imageInput: true,\n documentInput: true,\n outputSchema: true,\n reasoning: true,\n };\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = \"gpt-5\",\n ) {}\n\n traceRequest(\n request: CompletionRequest,\n options: { stream?: boolean | undefined } = {},\n ): JsonObject {\n const params = toOpenAIResponsesParams(this.defaultModel, request);\n if (options.stream === true) {\n params.stream = true;\n }\n return providerRequestSummary(params, request, options);\n }\n\n async completion(request: CompletionRequest): Promise<CompletionResponse> {\n assertCompletionRequestSupported(this, request);\n const params = toOpenAIResponsesParams(this.defaultModel, request);\n const response = await this.client.responses.create(params as never);\n return fromOpenAIResponse(response);\n }\n\n async *streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent> {\n assertCompletionRequestSupported(this, request, { streaming: true });\n const params = { ...toOpenAIResponsesParams(this.defaultModel, request), stream: true };\n const stream = await this.client.responses.create(params as never);\n for await (const event of stream as unknown as AsyncIterable<unknown>) {\n const mapped = fromOpenAIStreamEvent(event);\n if (mapped !== undefined) {\n yield mapped;\n }\n }\n }\n}\n\nexport function toOpenAIResponsesParams(\n defaultModel: string,\n request: CompletionRequest,\n): ResponsesCreateParams {\n const params: ResponsesCreateParams = {\n model: request.model ?? defaultModel,\n input: requestMessages(request).flatMap(messageToResponsesInput),\n };\n\n if (request.instructions !== undefined) {\n params.instructions = request.instructions;\n }\n\n if (request.tools.length > 0) {\n params.tools = request.tools.map(toolDefinitionToOpenAI);\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.maxTokens !== undefined) {\n params.max_output_tokens = request.maxTokens;\n }\n\n if (request.toolChoice !== undefined) {\n params.tool_choice = toolChoiceToOpenAI(request.toolChoice);\n }\n\n if (request.outputSchema !== undefined) {\n params.text = {\n format: {\n type: \"json_schema\",\n name: schemaName(request.outputSchema),\n strict: true,\n schema: request.outputSchema,\n },\n };\n }\n\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n return params;\n}\n\nfunction providerRequestSummary(\n params: ResponsesCreateParams,\n request: CompletionRequest,\n options: { stream?: boolean | undefined },\n): JsonObject {\n return compactJsonObject({\n provider: \"openai\",\n api: \"responses\",\n stream: options.stream === true,\n model: stringFrom(params.model),\n parameterKeys: Object.keys(params).sort(),\n inputCount: Array.isArray(params.input) ? params.input.length : undefined,\n toolCount: request.tools.length,\n toolNames: request.tools.map((tool) => tool.name),\n hasInstructions: typeof params.instructions === \"string\" && params.instructions.length > 0,\n hasOutputSchema: request.outputSchema !== undefined,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n toolChoice: toolChoiceSummary(request.toolChoice),\n additionalParamKeys: isPlainObject(request.additionalParams)\n ? Object.keys(request.additionalParams).sort()\n : undefined,\n });\n}\n\nfunction toolChoiceSummary(toolChoice: ToolChoice | undefined): JsonValue | undefined {\n if (toolChoice === undefined || typeof toolChoice === \"string\") {\n return toolChoice;\n }\n return { type: toolChoice.type, name: toolChoice.name };\n}\n\nfunction compactJsonObject(values: Record<string, unknown>): JsonObject {\n return Object.fromEntries(\n Object.entries(values).flatMap(([key, value]) => {\n if (value === undefined) {\n return [];\n }\n return [[key, toJsonValue(value)]];\n }),\n ) as JsonObject;\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toJsonValue(item));\n }\n if (isPlainObject(value)) {\n return compactJsonObject(value);\n }\n return String(value);\n}\n\nfunction requestMessages(request: CompletionRequest): MessageType[] {\n return orderedRequestMessages(request);\n}\n\nexport function fromOpenAIResponse(response: unknown): CompletionResponse {\n const raw = response as Record<string, unknown>;\n const output = Array.isArray(raw.output) ? raw.output : [];\n const choice: AssistantContentType[] = [];\n\n for (const item of output) {\n if (!isPlainObject(item)) {\n continue;\n }\n\n if (item.type === \"message\") {\n choice.push(...messageOutputToAssistantContent(item));\n }\n\n if (item.type === \"function_call\") {\n const id = typeof item.id === \"string\" ? item.id : crypto.randomUUID();\n const callId = typeof item.call_id === \"string\" ? item.call_id : undefined;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const argsText = typeof item.arguments === \"string\" ? item.arguments : \"{}\";\n choice.push(AssistantContent.toolCall(id, name, parseJsonValue(argsText), callId));\n }\n\n if (item.type === \"reasoning\") {\n choice.push(reasoningItemToAssistantContent(item));\n }\n }\n\n const usageSource = isPlainObject(raw.usage) ? raw.usage : {};\n const inputTokens = numberFrom(usageSource.input_tokens);\n const outputTokens = numberFrom(usageSource.output_tokens);\n const totalTokens = numberFrom(usageSource.total_tokens) || inputTokens + outputTokens;\n const details = isPlainObject(usageSource.input_tokens_details)\n ? usageSource.input_tokens_details\n : {};\n\n const result: CompletionResponse = {\n choice,\n usage: {\n ...Usage.empty(),\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens: numberFrom(details.cached_tokens),\n },\n rawResponse: response,\n };\n\n if (typeof raw.id === \"string\") {\n result.messageId = raw.id;\n }\n\n return result;\n}\n\nexport function fromOpenAIStreamEvent(event: unknown): CompletionStreamEvent | undefined {\n if (!isPlainObject(event) || typeof event.type !== \"string\") {\n return undefined;\n }\n\n if (event.type === \"response.output_text.delta\" || event.type === \"response.refusal.delta\") {\n return typeof event.delta === \"string\" ? { type: \"text_delta\", delta: event.delta } : undefined;\n }\n\n if (\n event.type === \"response.reasoning_text.delta\" ||\n event.type === \"response.reasoning_summary_text.delta\"\n ) {\n if (typeof event.delta !== \"string\") {\n return undefined;\n }\n const mapped: CompletionStreamEvent = { type: \"reasoning_delta\", delta: event.delta };\n const id = stringFrom(event.item_id);\n if (id !== undefined) {\n mapped.id = id;\n }\n if (event.type === \"response.reasoning_summary_text.delta\") {\n mapped.contentType = \"summary\";\n } else {\n mapped.contentType = \"text\";\n }\n return mapped;\n }\n\n if (event.type === \"response.output_item.added\" && isPlainObject(event.item)) {\n const item = event.item;\n if (item.type === \"function_call\") {\n return toolCallDelta(\n stringFrom(item.id) ?? stringFrom(event.item_id) ?? crypto.randomUUID(),\n {\n callId: stringFrom(item.call_id),\n name: stringFrom(item.name),\n argumentsDelta: typeof item.arguments === \"string\" ? item.arguments : undefined,\n },\n );\n }\n if (typeof item.id === \"string\") {\n return { type: \"message_id\", id: item.id };\n }\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.function_call_arguments.done\"\n ) {\n return toolCallDelta(\n stringFrom(event.item_id) ?? stringFrom(event.output_item_id) ?? crypto.randomUUID(),\n {\n argumentsDelta:\n typeof event.delta === \"string\"\n ? event.delta\n : typeof event.arguments === \"string\"\n ? event.arguments\n : undefined,\n },\n );\n }\n\n if (event.type === \"response.output_item.done\" && isPlainObject(event.item)) {\n const item = event.item;\n if (item.type === \"function_call\") {\n return {\n type: \"tool_call\",\n toolCall: AssistantContent.toolCall(\n stringFrom(item.id) ?? crypto.randomUUID(),\n stringFrom(item.name) ?? \"\",\n parseJsonValue(typeof item.arguments === \"string\" ? item.arguments : \"{}\"),\n stringFrom(item.call_id),\n ),\n };\n }\n }\n\n if (event.type === \"response.completed\" && isPlainObject(event.response)) {\n return {\n type: \"final\",\n response: fromOpenAIResponse(event.response),\n };\n }\n\n if (event.type === \"response.error\") {\n return { type: \"error\", error: event.error ?? event };\n }\n\n return undefined;\n}\n\nfunction messageToResponsesInput(message: MessageType): ResponsesInputItem[] {\n if (message.role === \"system\") {\n return [\n {\n role: \"system\",\n content: message.content,\n },\n ];\n }\n\n if (message.role === \"user\") {\n const inputContent: ResponsesInputItem[] = [];\n\n for (const content of message.content) {\n inputContent.push(...userContentToOpenAIResponsesParts(content));\n }\n\n if (inputContent.length === 1 && inputContent[0]?.type === \"input_text\") {\n return [{ role: \"user\", content: inputContent[0].text }];\n } else if (inputContent.length > 0) {\n return [{ role: \"user\", content: inputContent }];\n }\n\n return [];\n }\n\n if (message.role === \"tool\") {\n return message.content.map(toolContentToOpenAIResponsesItem);\n }\n\n const items: ResponsesInputItem[] = [];\n const text = message.content\n .flatMap((content) => (content.type === \"text\" ? [content.text] : []))\n .join(\"\\n\");\n if (text.length > 0) {\n items.push({ role: \"assistant\", content: text });\n }\n\n for (const content of message.content) {\n if (content.type === \"reasoning\" && content.id !== undefined) {\n items.push(reasoningToOpenAIInput(content));\n }\n if (content.type === \"tool_call\") {\n items.push({\n type: \"function_call\",\n id: content.id,\n call_id: content.callId ?? content.id,\n name: content.function.name,\n arguments: JSON.stringify(content.function.arguments ?? {}),\n });\n }\n if (content.type === \"image\") {\n throw new Error(\"OpenAI Responses does not support image content in assistant history\");\n }\n }\n\n return items;\n}\n\nfunction toolContentToOpenAIResponsesItem(content: ToolContent): ResponsesInputItem {\n return {\n type: \"function_call_output\",\n call_id: content.callId ?? content.id,\n output: content.content\n .map((item) => (item.type === \"text\" ? item.text : item.data))\n .join(\"\\n\"),\n };\n}\n\nfunction reasoningItemToAssistantContent(item: Record<string, unknown>): Reasoning {\n const content = reasoningContentFromOpenAIItem(item);\n const id = stringFrom(item.id);\n if (content.length === 0) {\n return AssistantContent.reasoning(\"\", id);\n }\n return AssistantContent.reasoningFromContent(content, id);\n}\n\nfunction reasoningContentFromOpenAIItem(item: Record<string, unknown>): ReasoningContent[] {\n const content: ReasoningContent[] = [];\n if (Array.isArray(item.content)) {\n for (const part of item.content) {\n if (!isPlainObject(part)) {\n continue;\n }\n if (part.type === \"reasoning_text\" && typeof part.text === \"string\") {\n content.push({ type: \"text\", text: part.text });\n }\n }\n }\n if (Array.isArray(item.summary)) {\n for (const summary of item.summary) {\n if (!isPlainObject(summary)) {\n continue;\n }\n if (typeof summary.text === \"string\") {\n content.push({ type: \"summary\", text: summary.text });\n }\n }\n }\n if (typeof item.encrypted_content === \"string\") {\n content.push({ type: \"encrypted\", data: item.encrypted_content });\n }\n return content;\n}\n\nfunction reasoningToOpenAIInput(reasoning: Reasoning): ResponsesInputItem {\n const item: ResponsesInputItem = {\n type: \"reasoning\",\n id: reasoning.id,\n summary:\n reasoning.content\n ?.filter((content): content is Extract<ReasoningContent, { type: \"summary\" }> => {\n return content.type === \"summary\";\n })\n .map((content) => ({ type: \"summary_text\", text: content.text })) ?? [],\n };\n const textContent = reasoning.content?.flatMap((content) =>\n content.type === \"text\" ? [{ type: \"reasoning_text\", text: content.text }] : [],\n );\n if (textContent !== undefined && textContent.length > 0) {\n item.content = textContent;\n }\n const encrypted = reasoning.content?.find((content) => content.type === \"encrypted\");\n if (encrypted?.type === \"encrypted\") {\n item.encrypted_content = encrypted.data;\n }\n return item;\n}\n\nfunction userContentToOpenAIResponsesParts(content: UserContent): ResponsesInputItem[] {\n if (content.type === \"text\") {\n return [{ type: \"input_text\", text: content.text }];\n }\n\n if (content.type === \"image\") {\n const part: ResponsesInputItem = { type: \"input_image\", image_url: imageUrl(content) };\n if (content.detail !== undefined) {\n part.detail = content.detail;\n }\n return [part];\n }\n\n if (content.type === \"document\") {\n return [documentToOpenAIResponsesPart(content)];\n }\n\n return [];\n}\n\nfunction imageUrl(image: ImageContent): string {\n if (image.source.type === \"url\") {\n return image.source.url;\n }\n\n return `data:${image.source.mediaType};base64,${image.source.data}`;\n}\n\nfunction documentToOpenAIResponsesPart(document: DocumentContent): ResponsesInputItem {\n if (document.source.type === \"text\") {\n return { type: \"input_text\", text: document.source.text };\n }\n\n if (document.source.mediaType !== \"application/pdf\") {\n throw new Error(`OpenAI Responses only supports PDF document attachments`);\n }\n\n if (document.source.type === \"url\") {\n return { type: \"input_file\", file_url: document.source.url };\n }\n\n return {\n type: \"input_file\",\n file_data: `data:${document.source.mediaType};base64,${document.source.data}`,\n filename: document.source.filename ?? \"document.pdf\",\n };\n}\n\nfunction toolDefinitionToOpenAI(tool: ToolDefinition): ResponsesInputItem {\n return {\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n };\n}\n\nfunction toolChoiceToOpenAI(toolChoice: ToolChoice): unknown {\n if (toolChoice === \"auto\" || toolChoice === \"required\" || toolChoice === \"none\") {\n return toolChoice;\n }\n\n return {\n type: \"function\",\n name: toolChoice.name,\n };\n}\n\nfunction messageOutputToAssistantContent(item: Record<string, unknown>): AssistantContentType[] {\n const content = Array.isArray(item.content) ? item.content : [];\n return content.flatMap((part): AssistantContentType[] => {\n if (!isPlainObject(part)) {\n return [];\n }\n\n if (part.type === \"output_text\" && typeof part.text === \"string\") {\n return [AssistantContent.text(part.text)];\n }\n\n if (part.type === \"text\" && typeof part.text === \"string\") {\n return [AssistantContent.text(part.text)];\n }\n\n return [];\n });\n}\n\nfunction toolCallDelta(\n id: string,\n values: {\n callId?: string | undefined;\n name?: string | undefined;\n argumentsDelta?: string | undefined;\n },\n): CompletionStreamEvent {\n const event: CompletionStreamEvent = { type: \"tool_call_delta\", id };\n if (values.callId !== undefined) event.callId = values.callId;\n if (values.name !== undefined) event.name = values.name;\n if (values.argumentsDelta !== undefined) event.argumentsDelta = values.argumentsDelta;\n return event;\n}\n\nexport const openaiMessageHelpers = {\n messageToResponsesInput,\n toolDefinitionToOpenAI,\n};\n","import type {\n TranscriptionModel,\n TranscriptionRequest,\n TranscriptionResponse,\n} from \"@anvia/core/transcription\";\nimport type { OpenAI } from \"openai\";\nimport { toFile } from \"openai\";\nimport { isPlainObject } from \"../utils\";\n\nexport const WHISPER_1 = \"whisper-1\";\n\nexport class OpenAITranscriptionModel implements TranscriptionModel {\n readonly provider = \"openai\";\n\n constructor(\n private readonly client: OpenAI,\n readonly defaultModel = WHISPER_1,\n ) {}\n\n async transcription(request: TranscriptionRequest): Promise<TranscriptionResponse<unknown>> {\n const params: Record<string, unknown> = {\n model: this.defaultModel,\n file: await toFile(request.data, request.filename),\n };\n\n if (request.language !== undefined) params.language = request.language;\n if (request.prompt !== undefined) params.prompt = request.prompt;\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.additionalParams !== undefined && isPlainObject(request.additionalParams)) {\n Object.assign(params, request.additionalParams);\n }\n\n const response = await this.client.audio.transcriptions.create(params as never);\n return {\n text: transcriptionText(response),\n rawResponse: response,\n };\n }\n}\n\nexport function transcriptionText(response: unknown): string {\n if (typeof response === \"string\") {\n return response;\n }\n if (isPlainObject(response) && typeof response.text === \"string\") {\n return response.text;\n }\n throw new Error(\"OpenAI transcription response contained no text.\");\n}\n"],"mappings":"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","names":["text","Buffer","mediaTypeFromFormat","Buffer","AssistantContent","assertCompletionRequestSupported","Usage","providerRequestSummary","assertCompletionRequestSupported","requestMessages","compactJsonObject","toolChoiceSummary","toJsonValue","AssistantContent","Usage","toolCallDelta","imageUrl"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/openai",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "OpenAI provider adapter for Anvia.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -17,19 +17,19 @@
17
17
  "import": "./dist/index.js"
18
18
  }
19
19
  },
20
- "scripts": {
21
- "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
22
- "test": "vitest run",
23
- "typecheck": "tsc --noEmit"
24
- },
25
20
  "dependencies": {
26
- "@anvia/core": "workspace:*",
27
- "openai": "^6.37.0"
21
+ "openai": "^6.37.0",
22
+ "@anvia/core": "0.2.1"
28
23
  },
29
24
  "devDependencies": {
30
25
  "@types/node": "^24.9.1",
31
26
  "tsup": "^8.5.0",
32
27
  "typescript": "^5.9.3",
33
28
  "vitest": "^4.0.8"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
32
+ "test": "vitest run",
33
+ "typecheck": "tsc --noEmit"
34
34
  }
35
- }
35
+ }