@robota-sdk/agent-provider 3.0.0-beta.65 → 3.0.0-beta.67
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/README.md +89 -0
- package/dist/browser/index.d.ts +5 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +3 -3
- package/dist/browser/index.js.map +1 -1
- package/dist/loggers/index.d.ts.map +1 -1
- package/dist/loggers/index.js.map +1 -1
- package/dist/node/anthropic/index.d.ts +1 -1
- package/dist/node/anthropic/index.d.ts.map +1 -1
- package/dist/node/anthropic--1vgLC-e.js.map +1 -1
- package/dist/node/bytedance/index.d.ts.map +1 -1
- package/dist/node/bytedance-C_0sF_pJ.js.map +1 -1
- package/dist/node/deepseek-_8Ixx7rA.js.map +1 -1
- package/dist/node/gemini/index.d.ts.map +1 -1
- package/dist/node/gemini-Bh2U87MY.js.map +1 -1
- package/dist/node/gemma/index.cjs +1 -1
- package/dist/node/gemma/index.d.ts +1 -1
- package/dist/node/gemma/index.js +1 -1
- package/dist/node/{gemma-G-Pf_PnX.cjs → gemma-079LPvrN.cjs} +1 -1
- package/dist/node/gemma-BMFWnmXE.js +2 -0
- package/dist/node/gemma-BMFWnmXE.js.map +1 -0
- package/dist/node/google/index.d.ts.map +1 -1
- package/dist/node/google/index.js.map +1 -1
- package/dist/node/index-B6PnlDMd.d.ts.map +1 -1
- package/dist/node/index-B7UvPJcI.d.ts.map +1 -1
- package/dist/node/{index-C3beaqKO.d.ts → index-B9a2gTwI.d.ts} +3 -3
- package/dist/node/{index-BqixM_XD.d.ts.map → index-B9a2gTwI.d.ts.map} +1 -1
- package/dist/node/index-BLPOTNb5.d.ts.map +1 -1
- package/dist/node/{index-BqixM_XD.d.ts → index-CjPeNJ1G.d.ts} +3 -3
- package/dist/node/{index-C3beaqKO.d.ts.map → index-CjPeNJ1G.d.ts.map} +1 -1
- package/dist/node/index-Cp2XRh9G.d.ts.map +1 -1
- package/dist/node/index-DSv5xruI.d.ts.map +1 -1
- package/dist/node/index-w0bV1uaP.d.ts.map +1 -1
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.ts +11 -5
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +2 -1
- package/dist/node/index.js.map +1 -0
- package/dist/node/openai/index.cjs +1 -1
- package/dist/node/openai/index.d.ts +1 -1
- package/dist/node/openai/index.js +1 -1
- package/dist/node/openai--CyyQ-E4.js +2 -0
- package/dist/node/openai--CyyQ-E4.js.map +1 -0
- package/dist/node/{openai-xWC6pY7r.cjs → openai-CmuDu5k-.cjs} +1 -1
- package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -1
- package/dist/node/qwen/index.cjs +1 -1
- package/dist/node/qwen/index.d.ts +1 -1
- package/dist/node/qwen/index.js +1 -1
- package/dist/node/qwen-D8gtsbsC.js +2 -0
- package/dist/node/qwen-D8gtsbsC.js.map +1 -0
- package/dist/node/qwen-DxNnm7Le.cjs +1 -0
- package/package.json +4 -2
- package/src/anthropic/index.ts +1 -1
- package/src/anthropic/message-converter.ts +3 -2
- package/src/anthropic/model-catalog-refresh.ts +5 -4
- package/src/anthropic/parsers/response-parser.ts +5 -2
- package/src/anthropic/provider-definition.ts +2 -1
- package/src/anthropic/provider.ts +6 -3
- package/src/anthropic/streaming-handler.ts +4 -2
- package/src/anthropic/types.ts +1 -1
- package/src/bytedance/http-client.ts +1 -1
- package/src/bytedance/provider.spec.ts +1 -0
- package/src/bytedance/provider.ts +10 -9
- package/src/bytedance/status-mapper.ts +1 -1
- package/src/deepseek/model-catalog-refresh.ts +6 -5
- package/src/deepseek/model-catalog.ts +2 -1
- package/src/deepseek/provider-definition.ts +3 -2
- package/src/deepseek/provider.ts +11 -9
- package/src/deepseek/types.ts +1 -1
- package/src/default-provider-definitions.ts +19 -0
- package/src/gemini/execution-helpers.ts +14 -12
- package/src/gemini/image-operations.ts +2 -2
- package/src/gemini/message-converter.ts +1 -0
- package/src/gemini/model-catalog-refresh.ts +2 -1
- package/src/gemini/provider-definition.ts +2 -1
- package/src/gemini/provider.spec.ts +2 -0
- package/src/gemini/provider.ts +6 -3
- package/src/gemini/tool-schema-converter.ts +1 -0
- package/src/gemma/message-factory.ts +2 -1
- package/src/gemma/provider-definition.ts +3 -2
- package/src/gemma/provider-projection.ts +4 -3
- package/src/gemma/provider.ts +19 -17
- package/src/gemma/pseudo-command-envelope.ts +1 -0
- package/src/gemma/pseudo-tool-call-projector.ts +2 -1
- package/src/gemma/streaming-projection.ts +6 -4
- package/src/gemma/tool-call-projector.ts +4 -3
- package/src/gemma/types.ts +1 -1
- package/src/google/provider.ts +1 -0
- package/src/index.ts +2 -0
- package/src/openai/adapter.ts +1 -1
- package/src/openai/chat-completions-chat.ts +8 -7
- package/src/openai/loggers/console-payload-logger.ts +4 -2
- package/src/openai/loggers/file-payload-logger.ts +5 -2
- package/src/openai/message-converter.ts +3 -2
- package/src/openai/openai-request-format.ts +1 -1
- package/src/openai/parsers/response-parser.ts +3 -2
- package/src/openai/provider-definition.ts +3 -2
- package/src/openai/provider.ts +11 -9
- package/src/openai/responses-chat.ts +7 -5
- package/src/openai/responses-converter.ts +6 -6
- package/src/openai/responses-parser.ts +4 -2
- package/src/openai/responses-types.ts +1 -1
- package/src/openai/streaming/stream-handler.ts +6 -4
- package/src/openai/types.ts +1 -2
- package/src/qwen/model-catalog-refresh.ts +6 -5
- package/src/qwen/provider-capabilities.ts +1 -1
- package/src/qwen/provider-definition.ts +6 -5
- package/src/qwen/provider-streaming-assembly.ts +3 -2
- package/src/qwen/provider.ts +19 -12
- package/src/qwen/responses-chat.ts +8 -6
- package/src/qwen/responses-converter.ts +1 -1
- package/src/qwen/responses-parser.ts +4 -2
- package/src/qwen/types.ts +1 -1
- package/src/shared/openai-compatible/message-converter.ts +1 -1
- package/src/shared/openai-compatible/response-parser.ts +4 -2
- package/src/shared/openai-compatible/stream-assembler.ts +3 -2
- package/src/shared/openai-compatible/types.ts +1 -1
- package/dist/node/gemma-Dp_AfCUR.js +0 -2
- package/dist/node/gemma-Dp_AfCUR.js.map +0 -1
- package/dist/node/openai-CRQjg4xF.js +0 -2
- package/dist/node/openai-CRQjg4xF.js.map +0 -1
- package/dist/node/qwen-ChUZobTL.js +0 -2
- package/dist/node/qwen-ChUZobTL.js.map +0 -1
- package/dist/node/qwen-CjT71vSM.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai--CyyQ-E4.js","names":["openaiError","assembleOpenAIStream","openaiError","exhaustive"],"sources":["../../src/openai/message-converter.ts","../../src/openai/openai-request-format.ts","../../src/openai/chat-completions-chat.ts","../../src/openai/parsers/response-parser.ts","../../src/openai/responses-converter.ts","../../src/openai/responses-stream-utils.ts","../../src/openai/responses-parser.ts","../../src/openai/responses-chat.ts","../../src/openai/provider.ts","../../src/openai/adapter.ts","../../src/openai/model-catalog-refresh.ts","../../src/openai/provider-definition.ts"],"sourcesContent":["import {\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n} from '../shared/openai-compatible/index.js';\n\nimport type { IToolSchema, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\n/**\n * Convert TUniversalMessage array to OpenAI chat completion message format.\n */\nexport function convertToOpenAIMessages(\n messages: TUniversalMessage[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return convertToOpenAICompatibleMessages(messages);\n}\n\n/**\n * Convert tool schemas to OpenAI function tool format.\n */\nexport function convertToOpenAITools(tools: IToolSchema[]): OpenAI.Chat.ChatCompletionTool[] {\n return convertToOpenAICompatibleTools(tools);\n}\n","import type {\n IOpenAIResponsesTextConfig,\n IOpenAIResponsesTextFormatJsonSchema,\n} from './responses-types';\nimport type { IOpenAIProviderOptions, TOpenAIProviderOptionValue } from './types';\n\nexport interface IOpenAIChatTextFormatText {\n type: 'text';\n}\n\nexport interface IOpenAIChatTextFormatJsonObject {\n type: 'json_object';\n}\n\nexport interface IOpenAIChatTextFormatJsonSchema {\n type: 'json_schema';\n json_schema: {\n name: string;\n schema: Record<string, TOpenAIProviderOptionValue>;\n description?: string;\n strict?: boolean;\n };\n}\n\nexport type TOpenAIChatResponseFormat =\n | IOpenAIChatTextFormatText\n | IOpenAIChatTextFormatJsonObject\n | IOpenAIChatTextFormatJsonSchema;\n\nexport function buildOpenAIChatResponseFormat(\n options: IOpenAIProviderOptions,\n): TOpenAIChatResponseFormat | undefined {\n if (options.responseFormat === undefined || options.responseFormat === 'text') {\n return undefined;\n }\n if (options.responseFormat === 'json_object') {\n return { type: 'json_object' };\n }\n\n const schema = requireJsonSchema(options);\n return {\n type: 'json_schema',\n json_schema: {\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n },\n };\n}\n\nexport function buildOpenAIResponsesTextConfig(\n options: IOpenAIProviderOptions,\n): IOpenAIResponsesTextConfig | undefined {\n if (options.responseFormat === undefined || options.responseFormat === 'text') {\n return undefined;\n }\n if (options.responseFormat === 'json_object') {\n return { format: { type: 'json_object' } };\n }\n\n const schema = requireJsonSchema(options);\n const format: IOpenAIResponsesTextFormatJsonSchema = {\n type: 'json_schema',\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n };\n return { format };\n}\n\nfunction requireJsonSchema(input: IOpenAIProviderOptions): {\n name: string;\n schema: Record<string, TOpenAIProviderOptionValue>;\n description?: string;\n strict?: boolean;\n} {\n const schema = input.jsonSchema;\n if (input.responseFormat !== 'json_schema') {\n throw new Error(`Unsupported OpenAI response format: ${input.responseFormat}`);\n }\n if (!schema?.schema) {\n throw new Error('OpenAI jsonSchema.schema is required when responseFormat is json_schema');\n }\n return {\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n };\n}\n","import { convertToOpenAIMessages, convertToOpenAITools } from './message-converter';\nimport { buildOpenAIChatResponseFormat } from './openai-request-format';\nimport { assembleOpenAIStream } from './streaming/stream-assembler';\nimport { observeProviderNativeRawPayloadStream } from '../shared/openai-compatible/index.js';\n\nimport type { IPayloadLogger } from './interfaces/payload-logger';\nimport type { OpenAIResponseParser } from './parsers/response-parser';\nimport type { IOpenAIProviderOptions } from './types';\nimport type { IOpenAIError, IOpenAILogData } from './types/api-types';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\nexport interface IOpenAIChatCompletionsOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n providerOptions: IOpenAIProviderOptions;\n payloadLogger?: IPayloadLogger;\n responseParser: OpenAIResponseParser;\n onTextDelta?: TTextDeltaCallback;\n}\n\nexport async function chatWithOpenAIChatCompletions(\n input: IOpenAIChatCompletionsOptions,\n): Promise<TUniversalMessage> {\n const client = requireClient(input.client);\n\n try {\n const requestParams = buildChatRequestParams(input);\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return await chatWithStreamingAssembly(client, input, {\n ...requestParams,\n stream: true,\n });\n }\n\n await logPayload(input, requestParams, 'chat');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(requestParams);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return input.responseParser.parseResponse(response);\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI API request failed';\n throw new Error(`OpenAI chat failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithOpenAIChatCompletions(\n input: IOpenAIChatCompletionsOptions,\n): AsyncIterable<TUniversalMessage> {\n const client = requireClient(input.client);\n\n try {\n const requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming = {\n ...buildChatRequestParams(input),\n stream: true,\n };\n\n await logPayload(input, requestParams, 'stream');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n\n for await (const chunk of observeProviderNativeRawPayloadStream(stream, {\n provider: 'openai',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n })) {\n const universalMessage = input.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI API request failed';\n throw new Error(`OpenAI stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildChatRequestParams(\n input: IOpenAIChatCompletionsOptions,\n): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n const openaiMessages = convertToOpenAIMessages(input.messages);\n const model = input.chatOptions?.model ?? input.providerOptions.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const responseFormat = buildOpenAIChatResponseFormat(input.providerOptions);\n return {\n model,\n messages: openaiMessages,\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && { max_tokens: input.chatOptions.maxTokens }),\n ...(input.chatOptions?.tools && {\n tools: convertToOpenAITools(input.chatOptions.tools),\n tool_choice: 'auto',\n }),\n ...(responseFormat !== undefined && { response_format: responseFormat }),\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n}\n\nasync function chatWithStreamingAssembly(\n client: OpenAI,\n input: IOpenAIChatCompletionsOptions,\n requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n): Promise<TUniversalMessage> {\n try {\n await logPayload(input, requestParams, 'stream');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n\n return assembleOpenAIStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'openai',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n }),\n onTextDelta: input.chatOptions?.onTextDelta ?? input.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI streaming request failed';\n throw new Error(`OpenAI stream failed: ${errorMessage}`);\n }\n}\n\nasync function logPayload(\n input: IOpenAIChatCompletionsOptions,\n requestParams:\n | OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n | OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n type: 'chat' | 'stream',\n): Promise<void> {\n if (!input.payloadLogger?.isEnabled()) {\n return;\n }\n\n const logData: IOpenAILogData = {\n model: requestParams.model,\n messagesCount: requestParams.messages.length,\n hasTools: !!requestParams.tools,\n temperature: requestParams.temperature ?? undefined,\n maxTokens: requestParams.max_tokens ?? undefined,\n timestamp: new Date().toISOString(),\n };\n await input.payloadLogger.logPayload(logData, type);\n}\n\nfunction requireClient(client: OpenAI | undefined): OpenAI {\n if (!client) {\n throw new Error(\n 'OpenAI client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n return client;\n}\n","import { OpenAICompatibleResponseParser } from '../../shared/openai-compatible/index.js';\n\nimport type { ILogger, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\n/**\n * OpenAI response parser compatibility wrapper.\n *\n * The implementation delegates to the shared OpenAI-compatible parser while\n * preserving the OpenAI-branded error messages that are part of this package's\n * current test contract.\n */\nexport class OpenAIResponseParser {\n private readonly parser: OpenAICompatibleResponseParser;\n\n constructor(logger?: ILogger) {\n this.parser = new OpenAICompatibleResponseParser({ logger });\n }\n\n parseResponse(response: OpenAI.Chat.ChatCompletion): TUniversalMessage {\n try {\n return this.parser.parseResponse(response);\n } catch (error) {\n const message = normalizeParserMessage(\n error instanceof Error ? error.message : 'OpenAI response parsing failed',\n );\n throw new Error(`OpenAI response parsing failed: ${message}`);\n }\n }\n\n parseStreamingChunk(chunk: OpenAI.Chat.ChatCompletionChunk): TUniversalMessage | null {\n try {\n return this.parser.parseStreamingChunk(chunk);\n } catch (error) {\n const message = normalizeParserMessage(\n error instanceof Error ? error.message : 'OpenAI chunk parsing failed',\n );\n throw new Error(`OpenAI chunk parsing failed: ${message}`);\n }\n }\n}\n\nfunction normalizeParserMessage(message: string): string {\n return message\n .replace(/^OpenAI-compatible response parsing failed: /, '')\n .replace(/^OpenAI-compatible chunk parsing failed: /, '')\n .replace('OpenAI-compatible response', 'OpenAI response');\n}\n","import type {\n IOpenAIResponsesFunctionTool,\n IOpenAIResponsesMessageInput,\n TOpenAIResponsesInputContent,\n TOpenAIResponsesInputItem,\n} from './responses-types';\nimport type {\n IAssistantMessage,\n IToolSchema,\n TUniversalMessage,\n TUniversalMessagePart,\n} from '@robota-sdk/agent-core';\n\nexport function convertToOpenAIResponsesInput(\n messages: TUniversalMessage[],\n): TOpenAIResponsesInputItem[] {\n return messages.flatMap((message) => convertMessage(message));\n}\n\nexport function convertToOpenAIResponsesTools(\n tools: IToolSchema[] | undefined,\n strictTools: boolean | undefined,\n): IOpenAIResponsesFunctionTool[] | undefined {\n const converted =\n tools?.map((tool) => ({\n type: 'function' as const,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n strict: strictTools ?? false,\n })) ?? [];\n return converted.length > 0 ? converted : undefined;\n}\n\nfunction convertMessage(message: TUniversalMessage): TOpenAIResponsesInputItem[] {\n if (message.role === 'user') {\n return [createMessageInput('user', getUserContent(message.content, message.parts))];\n }\n if (message.role === 'system') {\n return [createMessageInput('system', message.content)];\n }\n if (message.role === 'tool') {\n if (!message.toolCallId || message.toolCallId.trim().length === 0) {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(message)}`);\n }\n return [\n {\n type: 'function_call_output',\n call_id: message.toolCallId,\n output: message.content || '',\n },\n ];\n }\n return convertAssistantMessage(message);\n}\n\nfunction convertAssistantMessage(message: IAssistantMessage): TOpenAIResponsesInputItem[] {\n const items: TOpenAIResponsesInputItem[] = [];\n if (message.content && message.content.length > 0) {\n items.push(createMessageInput('assistant', message.content));\n }\n for (const toolCall of message.toolCalls ?? []) {\n items.push({\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n });\n }\n if (items.length === 0) {\n items.push(createMessageInput('assistant', ''));\n }\n return items;\n}\n\nfunction getUserContent(\n content: string,\n parts: TUniversalMessagePart[] | undefined,\n): string | TOpenAIResponsesInputContent[] {\n if (!parts || parts.length === 0) {\n return content;\n }\n\n const converted = parts.map((part) => convertPart(part));\n if (content.length > 0 && !parts.some((part) => part.type === 'text')) {\n return [{ type: 'input_text', text: content }, ...converted];\n }\n return converted;\n}\n\nfunction convertPart(part: TUniversalMessagePart): TOpenAIResponsesInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image_uri') {\n return { type: 'input_image', image_url: part.uri };\n }\n return {\n type: 'input_image',\n image_url: `data:${part.mimeType};base64,${part.data}`,\n };\n}\n\nfunction createMessageInput(\n role: IOpenAIResponsesMessageInput['role'],\n content: string | TOpenAIResponsesInputContent[],\n): IOpenAIResponsesMessageInput {\n return {\n role,\n content,\n };\n}\n","export async function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done || signal?.aborted) {\n break;\n }\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) {\n return iterator.next();\n }\n if (signal.aborted) {\n return { done: true, value: undefined as T };\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { streamWithAbort } from './responses-stream-utils';\n\nimport type {\n IOpenAIResponsesErrorEvent,\n IOpenAIResponsesFunctionCallOutputItem,\n IOpenAIResponsesMessageOutputItem,\n IOpenAIResponsesReasoningOutputItem,\n IOpenAIResponsesResponse,\n IOpenAIResponsesUsage,\n TOpenAIResponsesOutputContent,\n TOpenAIResponsesOutputItem,\n TOpenAIResponsesStreamEvent,\n} from './responses-types';\nimport type { IToolCall, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\n\ninterface IOpenAIResponsesStreamAssemblyOptions {\n stream: AsyncIterable<TOpenAIResponsesStreamEvent>;\n onTextDelta?: TTextDeltaCallback;\n signal?: AbortSignal;\n}\n\ninterface IOpenAIResponsesReasoningMetadata {\n reasoningSummaryCount: number;\n reasoningSummaries: string[];\n hasEncryptedReasoning: boolean;\n}\n\ninterface IOpenAIResponseUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\ninterface IOpenAIResponsesStreamState {\n textParts: string[];\n toolCalls: IToolCall[];\n completedResponse?: IOpenAIResponsesResponse;\n reasoning: IOpenAIResponsesReasoningMetadata;\n}\n\nexport function parseOpenAIResponsesResponse(\n response: IOpenAIResponsesResponse,\n): TUniversalMessage {\n assertUsableResponse(response);\n const output = response.output ?? [];\n const content = response.output_text ?? extractMessageText(output);\n return buildAssistantMessage({\n content,\n toolCalls: extractFunctionToolCalls(output),\n response,\n reasoning: collectReasoningMetadata(output),\n });\n}\n\nexport async function assembleOpenAIResponsesStream(\n options: IOpenAIResponsesStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IOpenAIResponsesStreamState = {\n textParts: [],\n toolCalls: [],\n reasoning: createEmptyReasoningMetadata(),\n };\n\n for await (const event of streamWithAbort(options.stream, options.signal)) {\n applyStreamEvent(state, event, options.onTextDelta);\n }\n\n if (state.completedResponse !== undefined) {\n return buildMessageFromCompletedResponse(state);\n }\n\n return buildAssistantMessage({\n content: state.textParts.join(''),\n toolCalls: state.toolCalls,\n reasoning: state.reasoning,\n });\n}\n\nfunction applyStreamEvent(\n state: IOpenAIResponsesStreamState,\n event: TOpenAIResponsesStreamEvent,\n onTextDelta: TTextDeltaCallback | undefined,\n): void {\n if (event.type === 'response.output_text.delta') {\n state.textParts.push(event.delta);\n onTextDelta?.(event.delta);\n return;\n }\n\n if (event.type === 'response.completed') {\n state.completedResponse = event.response;\n mergeReasoningMetadata(state.reasoning, collectReasoningMetadata(event.response.output ?? []));\n return;\n }\n\n if (event.type === 'response.output_item.done') {\n applyOutputItem(state, event.item);\n return;\n }\n\n if (\n event.type === 'response.error' ||\n event.type === 'response.failed' ||\n event.type === 'response.incomplete'\n ) {\n throw new Error(`OpenAI Responses API failed: ${extractErrorMessage(event)}`);\n }\n}\n\nfunction applyOutputItem(\n state: IOpenAIResponsesStreamState,\n item: TOpenAIResponsesOutputItem,\n): void {\n if (isFunctionCallOutputItem(item)) {\n state.toolCalls.push(convertFunctionCall(item));\n return;\n }\n if (isReasoningOutputItem(item)) {\n mergeReasoningMetadata(state.reasoning, collectReasoningMetadata([item]));\n }\n}\n\nfunction buildMessageFromCompletedResponse(state: IOpenAIResponsesStreamState): TUniversalMessage {\n const response = state.completedResponse;\n if (response === undefined) {\n throw new Error('OpenAI Responses stream completed without response metadata');\n }\n\n assertUsableResponse(response);\n const output = response.output ?? [];\n const responseToolCalls = extractFunctionToolCalls(output);\n const content =\n state.textParts.length > 0\n ? state.textParts.join('')\n : (response.output_text ?? extractMessageText(output));\n const reasoning = collectReasoningMetadata(output);\n mergeReasoningMetadata(reasoning, state.reasoning);\n\n return buildAssistantMessage({\n content,\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : state.toolCalls,\n response,\n reasoning,\n });\n}\n\nfunction buildAssistantMessage(input: {\n content: string;\n toolCalls: IToolCall[];\n response?: IOpenAIResponsesResponse;\n reasoning: IOpenAIResponsesReasoningMetadata;\n}): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: input.content,\n state: 'complete',\n timestamp: new Date(),\n ...(input.toolCalls.length > 0 && { toolCalls: input.toolCalls }),\n ...(input.response?.usage !== undefined && { usage: mapUsage(input.response.usage) }),\n metadata: buildMetadata(input.response, input.reasoning),\n };\n}\n\nfunction buildMetadata(\n response: IOpenAIResponsesResponse | undefined,\n reasoning: IOpenAIResponsesReasoningMetadata,\n): NonNullable<TUniversalMessage['metadata']> {\n return {\n providerApiSurface: 'responses',\n ...(response?.id !== undefined && { responseId: response.id }),\n ...(response?.model !== undefined && { model: response.model }),\n ...(response?.status !== undefined && { finishReason: response.status }),\n ...(reasoning.reasoningSummaryCount > 0 && {\n reasoningSummaryCount: reasoning.reasoningSummaryCount,\n reasoningSummaries: reasoning.reasoningSummaries,\n }),\n ...(reasoning.hasEncryptedReasoning && { hasEncryptedReasoning: true }),\n };\n}\n\nfunction mapUsage(usage: IOpenAIResponsesUsage): IOpenAIResponseUsage {\n return {\n promptTokens: usage.input_tokens ?? 0,\n completionTokens: usage.output_tokens ?? 0,\n totalTokens: usage.total_tokens ?? 0,\n };\n}\n\nfunction extractFunctionToolCalls(output: readonly TOpenAIResponsesOutputItem[]): IToolCall[] {\n return output.filter(isFunctionCallOutputItem).map((item) => convertFunctionCall(item));\n}\n\nfunction isFunctionCallOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesFunctionCallOutputItem {\n return (\n item.type === 'function_call' && 'call_id' in item && 'name' in item && 'arguments' in item\n );\n}\n\nfunction convertFunctionCall(item: IOpenAIResponsesFunctionCallOutputItem): IToolCall {\n return {\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: item.arguments,\n },\n };\n}\n\nfunction extractMessageText(output: readonly TOpenAIResponsesOutputItem[]): string {\n return output\n .filter(isMessageOutputItem)\n .flatMap((item) => item.content)\n .map(extractTextContent)\n .join('');\n}\n\nfunction extractTextContent(content: TOpenAIResponsesOutputContent): string {\n if (content.type === 'refusal') {\n return content.refusal;\n }\n return content.text;\n}\n\nfunction isMessageOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesMessageOutputItem {\n return item.type === 'message' && 'content' in item && Array.isArray(item.content);\n}\n\nfunction collectReasoningMetadata(\n output: readonly TOpenAIResponsesOutputItem[],\n): IOpenAIResponsesReasoningMetadata {\n const metadata = createEmptyReasoningMetadata();\n for (const item of output) {\n if (!isReasoningOutputItem(item)) {\n continue;\n }\n const summaries = item.summary?.map((summary) => summary.text).filter(isString) ?? [];\n metadata.reasoningSummaryCount += summaries.length;\n metadata.reasoningSummaries.push(...summaries);\n metadata.hasEncryptedReasoning = metadata.hasEncryptedReasoning || !!item.encrypted_content;\n }\n return metadata;\n}\n\nfunction isReasoningOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesReasoningOutputItem {\n return item.type === 'reasoning';\n}\n\nfunction createEmptyReasoningMetadata(): IOpenAIResponsesReasoningMetadata {\n return {\n reasoningSummaryCount: 0,\n reasoningSummaries: [],\n hasEncryptedReasoning: false,\n };\n}\n\nfunction mergeReasoningMetadata(\n target: IOpenAIResponsesReasoningMetadata,\n source: IOpenAIResponsesReasoningMetadata,\n): void {\n target.reasoningSummaryCount += source.reasoningSummaryCount;\n target.reasoningSummaries.push(...source.reasoningSummaries);\n target.hasEncryptedReasoning = target.hasEncryptedReasoning || source.hasEncryptedReasoning;\n}\n\nfunction isString(value: string | undefined): value is string {\n return value !== undefined;\n}\n\nfunction assertUsableResponse(response: IOpenAIResponsesResponse): void {\n if (response.status === 'failed' || response.status === 'incomplete') {\n throw new Error(`OpenAI Responses API failed: ${response.error?.message ?? response.status}`);\n }\n}\n\nfunction extractErrorMessage(event: IOpenAIResponsesErrorEvent): string {\n return event.message ?? event.error?.message ?? event.response?.error?.message ?? 'unknown error';\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { buildOpenAIResponsesTextConfig } from './openai-request-format';\nimport {\n convertToOpenAIResponsesInput,\n convertToOpenAIResponsesTools,\n} from './responses-converter';\nimport { assembleOpenAIResponsesStream, parseOpenAIResponsesResponse } from './responses-parser';\nimport { observeProviderNativeRawPayloadStream } from '../shared/openai-compatible/index.js';\n\nimport type {\n IOpenAIResponsesRequestNonStreaming,\n IOpenAIResponsesRequestStreaming,\n TOpenAIResponsesStreamEvent,\n} from './responses-types';\nimport type { IOpenAIProviderOptions } from './types';\nimport type { IOpenAIError } from './types/api-types';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\nexport interface IOpenAIResponsesChatOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n providerOptions: IOpenAIProviderOptions;\n onTextDelta?: TTextDeltaCallback;\n}\n\ninterface IResponsesStreamMessageQueue {\n deltas: TUniversalMessage[];\n finalMessage?: TUniversalMessage;\n error?: Error;\n wake?: () => void;\n}\n\nexport async function chatWithOpenAIResponsesApi(\n input: IOpenAIResponsesChatOptions,\n): Promise<TUniversalMessage> {\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return chatWithOpenAIResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: textDeltaCb,\n },\n });\n }\n\n if (!input.client) {\n throw new Error('OpenAI Responses client not available.');\n }\n\n try {\n const requestParams = buildResponsesRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsNonStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'response',\n payload: response,\n });\n return parseOpenAIResponsesResponse(response);\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI Responses API request failed';\n throw new Error(`OpenAI responses failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithOpenAIResponsesApi(\n input: IOpenAIResponsesChatOptions,\n): AsyncIterable<TUniversalMessage> {\n const queue: IResponsesStreamMessageQueue = { deltas: [] };\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n const assembly = chatWithOpenAIResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: (delta) => {\n textDeltaCb?.(delta);\n enqueueStreamDelta(queue, createStreamDeltaMessage(delta));\n },\n },\n })\n .then((result) => finishStreamQueue(queue, result))\n .catch((error) => failStreamQueue(queue, toError(error)));\n\n yield* drainResponsesStreamQueue(queue);\n await assembly;\n}\n\nasync function chatWithOpenAIResponsesStreamingAssembly(\n input: IOpenAIResponsesChatOptions,\n): Promise<TUniversalMessage> {\n if (!input.client) {\n throw new Error('OpenAI Responses client not available.');\n }\n\n try {\n const requestParams = buildResponsesStreamingRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n return assembleOpenAIResponsesStream({\n stream: observeProviderNativeRawPayloadStream(\n stream as AsyncIterable<TOpenAIResponsesStreamEvent>,\n {\n provider: 'openai',\n apiSurface: 'responses',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n },\n ),\n onTextDelta: input.chatOptions?.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI Responses streaming request failed';\n throw new Error(`OpenAI responses stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildResponsesRequestParams(\n input: IOpenAIResponsesChatOptions,\n): IOpenAIResponsesRequestNonStreaming {\n const model = input.chatOptions?.model ?? input.providerOptions.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const tools = convertToOpenAIResponsesTools(\n input.chatOptions?.tools,\n input.providerOptions.strictTools,\n );\n const textConfig = buildOpenAIResponsesTextConfig(input.providerOptions);\n return {\n model,\n input: convertToOpenAIResponsesInput(input.messages),\n ...(tools !== undefined && { tools, tool_choice: 'auto' }),\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && {\n max_output_tokens: input.chatOptions.maxTokens,\n }),\n ...(textConfig !== undefined && { text: textConfig }),\n ...(input.providerOptions.reasoning !== undefined && {\n reasoning: input.providerOptions.reasoning,\n }),\n ...(input.providerOptions.includeEncryptedReasoning === true && {\n include: ['reasoning.encrypted_content'],\n }),\n ...(input.providerOptions.store !== undefined && { store: input.providerOptions.store }),\n };\n}\n\nfunction buildResponsesStreamingRequestParams(\n input: IOpenAIResponsesChatOptions,\n): IOpenAIResponsesRequestStreaming {\n return {\n ...buildResponsesRequestParams(input),\n stream: true,\n };\n}\n\nfunction createStreamDeltaMessage(delta: string): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: delta,\n state: 'complete',\n timestamp: new Date(),\n metadata: {\n providerApiSurface: 'responses',\n isStreamChunk: true,\n isComplete: false,\n },\n };\n}\n\nasync function* drainResponsesStreamQueue(\n queue: IResponsesStreamMessageQueue,\n): AsyncIterable<TUniversalMessage> {\n while (true) {\n const next = queue.deltas.shift();\n if (next !== undefined) {\n yield next;\n continue;\n }\n if (queue.error !== undefined) {\n throw queue.error;\n }\n if (queue.finalMessage !== undefined) {\n yield createFinalStreamMessage(queue.finalMessage);\n return;\n }\n await waitForStreamQueue(queue);\n }\n}\n\nfunction enqueueStreamDelta(queue: IResponsesStreamMessageQueue, message: TUniversalMessage): void {\n queue.deltas.push(message);\n wakeStreamQueue(queue);\n}\n\nfunction finishStreamQueue(queue: IResponsesStreamMessageQueue, result: TUniversalMessage): void {\n queue.finalMessage = result;\n wakeStreamQueue(queue);\n}\n\nfunction failStreamQueue(queue: IResponsesStreamMessageQueue, error: Error): void {\n queue.error = error;\n wakeStreamQueue(queue);\n}\n\nfunction waitForStreamQueue(queue: IResponsesStreamMessageQueue): Promise<void> {\n return new Promise((resolve) => {\n queue.wake = resolve;\n });\n}\n\nfunction wakeStreamQueue(queue: IResponsesStreamMessageQueue): void {\n queue.wake?.();\n queue.wake = undefined;\n}\n\nfunction createFinalStreamMessage(result: TUniversalMessage): TUniversalMessage {\n return {\n ...result,\n content: '',\n metadata: {\n ...result.metadata,\n isStreamChunk: true,\n isComplete: true,\n },\n };\n}\n\nfunction toError(error: Error | string): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n","import { AbstractAIProvider } from '@robota-sdk/agent-core';\nimport { SilentLogger } from '@robota-sdk/agent-core';\nimport OpenAI from 'openai';\n\nimport {\n chatStreamWithOpenAIChatCompletions,\n chatWithOpenAIChatCompletions,\n} from './chat-completions-chat';\nimport { OpenAIResponseParser } from './parsers/response-parser';\nimport { chatStreamWithOpenAIResponsesApi, chatWithOpenAIResponsesApi } from './responses-chat';\n\nimport type { IPayloadLogger } from './interfaces/payload-logger';\nimport type { IOpenAIProviderOptions, TOpenAIApiSurface } from './types';\nimport type {\n TUniversalMessage,\n IChatOptions,\n IAssistantMessage,\n IProviderCapabilities,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\n\n/**\n * OpenAI provider implementation for Robota\n *\n * Provides integration with OpenAI models through the Robota provider contract.\n * Uses OpenAI SDK native types internally for optimal performance and feature support.\n *\n * @public\n */\nexport class OpenAIProvider extends AbstractAIProvider {\n override readonly name = 'openai';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly options: IOpenAIProviderOptions;\n private readonly apiSurface: TOpenAIApiSurface;\n private readonly payloadLogger: IPayloadLogger | undefined;\n private readonly responseParser: OpenAIResponseParser;\n\n /**\n * Optional callback for text deltas during streaming.\n * Set by the consumer (e.g., Session) to receive real-time text chunks.\n * When set, chat() uses streaming internally while still returning\n * the complete assembled message.\n */\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IOpenAIProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n this.apiSurface = resolveApiSurface(options);\n validateOpenAIProviderNativeWebTools(this.apiSurface, options.nativeWebTools);\n\n if (options.executor) {\n this.executor = options.executor;\n }\n\n if (!this.executor) {\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.organization && { organization: options.organization }),\n ...(options.timeout && { timeout: options.timeout }),\n ...(options.baseURL && { baseURL: options.baseURL }),\n });\n } else {\n throw new Error('Either OpenAI client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAIResponseParser(this.logger);\n this.payloadLogger = options.payloadLogger;\n }\n\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'OpenAI Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (this.apiSurface === 'responses') {\n return chatWithOpenAIResponsesApi({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n onTextDelta: this.onTextDelta,\n });\n }\n\n return chatWithOpenAIChatCompletions({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n payloadLogger: this.payloadLogger,\n responseParser: this.responseParser,\n onTextDelta: this.onTextDelta,\n });\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n this.logger.error(\n 'OpenAI Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (this.apiSurface === 'responses') {\n yield* chatStreamWithOpenAIResponsesApi({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n onTextDelta: this.onTextDelta,\n });\n return;\n }\n\n yield* chatStreamWithOpenAIChatCompletions({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n payloadLogger: this.payloadLogger,\n responseParser: this.responseParser,\n onTextDelta: this.onTextDelta,\n });\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n const source =\n this.apiSurface === 'chat-completions'\n ? 'openai-compatible-chat-completions'\n : 'openai-responses';\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: {\n supported: false,\n enabled: false,\n source,\n reason: getOpenAIUnsupportedNativeWebReason(this.apiSurface, 'search'),\n },\n webFetch: {\n supported: false,\n enabled: false,\n source,\n reason: getOpenAIUnsupportedNativeWebReason(this.apiSurface, 'fetch'),\n },\n },\n };\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options;\n }\n\n override async dispose(): Promise<void> {\n // OpenAI client doesn't need explicit cleanup\n }\n\n protected override validateMessages(messages: TUniversalMessage[]): void {\n super.validateMessages(messages);\n\n for (const message of messages) {\n if (message.role === 'assistant') {\n const assistantMsg = message as IAssistantMessage;\n if (\n assistantMsg.toolCalls &&\n assistantMsg.toolCalls.length > 0 &&\n assistantMsg.content === ''\n ) {\n continue;\n }\n }\n }\n }\n}\n\nfunction resolveApiSurface(options: IOpenAIProviderOptions): TOpenAIApiSurface {\n if (options.apiSurface !== undefined) {\n return options.apiSurface;\n }\n return options.baseURL ? 'chat-completions' : 'responses';\n}\n\nfunction getOpenAIUnsupportedNativeWebReason(\n apiSurface: TOpenAIApiSurface,\n toolKind: 'search' | 'fetch',\n): string {\n if (apiSurface === 'chat-completions') {\n return `OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${toolKind}.`;\n }\n return `OpenAI Responses native web ${toolKind} is not wired in this Robota provider version.`;\n}\n\nfunction validateOpenAIProviderNativeWebTools(\n apiSurface: TOpenAIApiSurface,\n nativeWebTools: IOpenAIProviderOptions['nativeWebTools'],\n): void {\n if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {\n return;\n }\n throw new Error(\n `Provider openai native web search/fetch is not supported for apiSurface ${apiSurface} in this Robota provider version.`,\n );\n}\n","import type { TUniversalMessage, IAssistantMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\n/**\n * OpenAI Conversation Adapter\n *\n * Converts between TUniversalMessage format and OpenAI native types.\n * Provides bidirectional conversion for seamless integration.\n *\n * @public\n */\nexport class OpenAIConversationAdapter {\n /**\n * Filter messages for OpenAI compatibility\n *\n * OpenAI has specific requirements:\n * - Tool messages must have valid toolCallId\n * - Messages must be in proper sequence\n * - Tool messages without toolCallId should be excluded\n */\n static filterMessagesForOpenAI(messages: TUniversalMessage[]): TUniversalMessage[] {\n return messages.filter((msg) => {\n // Always include user, assistant, and system messages\n if (msg.role === 'user' || msg.role === 'assistant' || msg.role === 'system') {\n return true;\n }\n\n // For tool messages, only include if they have a valid toolCallId\n if (msg.role === 'tool') {\n // Must have toolCallId and it must not be empty or 'unknown'\n return !!(msg.toolCallId && msg.toolCallId.trim() !== '' && msg.toolCallId !== 'unknown');\n }\n\n return false;\n });\n }\n\n /**\n * Convert TUniversalMessage array to OpenAI message format\n * Now properly handles tool messages for OpenAI's tool calling feature\n */\n static toOpenAIFormat(messages: TUniversalMessage[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n // First filter messages for OpenAI compatibility\n const filteredMessages = this.filterMessagesForOpenAI(messages);\n return filteredMessages.map((msg) => this.convertMessage(msg));\n }\n\n /**\n * Convert a single TUniversalMessage to OpenAI format\n * Handles all message types including tool messages\n */\n static convertMessage(msg: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam {\n const messageRole = msg.role;\n\n if (messageRole === 'user') {\n return {\n role: 'user',\n content: msg.content,\n };\n }\n\n if (messageRole === 'assistant') {\n const assistantMsg = msg as IAssistantMessage;\n\n // Handle tool_calls format\n if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n const result: OpenAI.Chat.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n // CRITICAL: OpenAI API requires content to be null (not empty string) when tool_calls are present\n // VERIFIED: 2024-12 - This prevents \"400 Bad Request\" errors from OpenAI API\n // DO NOT CHANGE without testing against actual OpenAI API\n content: assistantMsg.content === '' ? null : assistantMsg.content || null,\n tool_calls: assistantMsg.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })),\n };\n return result;\n }\n\n // Regular assistant message (without tool calls)\n // VERIFIED: OpenAI accepts both null and string content for regular messages\n // We preserve null when content is null or empty string for API consistency\n return {\n role: 'assistant',\n content:\n assistantMsg.content === null\n ? null\n : assistantMsg.content === ''\n ? null\n : assistantMsg.content || '',\n };\n }\n\n if (messageRole === 'system') {\n return {\n role: 'system',\n content: msg.content,\n };\n }\n\n // Handle tool messages for OpenAI tool calling\n if (messageRole === 'tool') {\n if (!msg.toolCallId || msg.toolCallId.trim() === '') {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(msg)}`);\n }\n\n const result: OpenAI.Chat.ChatCompletionToolMessageParam = {\n role: 'tool',\n content: msg.content,\n tool_call_id: msg.toolCallId,\n };\n return result;\n }\n\n const exhaustive: never = messageRole;\n throw new Error(`Unsupported message role: ${exhaustive}`);\n }\n\n /**\n * Add system prompt to message array if needed\n */\n static addSystemPromptIfNeeded(\n messages: OpenAI.Chat.ChatCompletionMessageParam[],\n systemPrompt?: string,\n ): OpenAI.Chat.ChatCompletionMessageParam[] {\n if (!systemPrompt) {\n return messages;\n }\n\n // Check if system message already exists\n const hasSystemMessage = messages.some((msg) => msg.role === 'system');\n\n if (hasSystemMessage) {\n return messages;\n }\n\n // Add system prompt at the beginning\n return [{ role: 'system', content: systemPrompt }, ...messages];\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\n\nconst OPENAI_MODELS_ENDPOINT = 'https://api.openai.com/v1/models';\nconst OPENAI_MODELS_SOURCE_URL = 'https://platform.openai.com/docs/api-reference/models/list';\n\nexport interface IOpenAIModelCatalogResponse {\n data?: readonly IOpenAIModelCatalogResource[];\n}\n\nexport interface IOpenAIModelCatalogResource {\n id?: string;\n}\n\nexport interface IOpenAIModelCatalogFetchInit {\n headers: Record<string, string>;\n}\n\nexport interface IOpenAIModelCatalogFetchResponse {\n ok: boolean;\n status: number;\n statusText?: string;\n json: () => Promise<IOpenAIModelCatalogResponse>;\n}\n\nexport type TOpenAIModelCatalogFetch = (\n url: string,\n init: IOpenAIModelCatalogFetchInit,\n) => Promise<IOpenAIModelCatalogFetchResponse>;\n\nexport interface IRefreshOpenAIModelCatalogOptions {\n fetcher?: TOpenAIModelCatalogFetch;\n now?: () => Date;\n}\n\nexport async function refreshOpenAIModelCatalog(\n profile: IProviderProfileConfig,\n options: IRefreshOpenAIModelCatalogOptions = {},\n): Promise<IProviderModelCatalog> {\n if (!profile.apiKey) {\n return createUnavailableCatalog('OpenAI model catalog refresh requires apiKey.');\n }\n\n const fetcher = options.fetcher ?? defaultOpenAIModelCatalogFetch;\n const now = options.now ?? (() => new Date());\n const url = resolveModelsEndpoint(profile.baseURL);\n\n try {\n const response = await fetcher(url, {\n headers: { Authorization: `Bearer ${profile.apiKey}` },\n });\n if (!response.ok) {\n return createUnavailableCatalog(formatHttpFailure(response));\n }\n\n const body = await response.json();\n const entries = toModelCatalogEntries(body);\n return {\n status: 'live',\n entries,\n lastVerifiedAt: now().toISOString(),\n sourceUrl: OPENAI_MODELS_SOURCE_URL,\n message: `${entries.length} OpenAI model(s) discovered.`,\n };\n } catch (error) {\n return createUnavailableCatalog(error instanceof Error ? error.message : String(error));\n }\n}\n\nfunction resolveModelsEndpoint(baseURL: string | undefined): string {\n if (!baseURL) return OPENAI_MODELS_ENDPOINT;\n return `${baseURL.replace(/\\/$/, '')}/models`;\n}\n\nfunction toModelCatalogEntries(\n body: IOpenAIModelCatalogResponse,\n): readonly IProviderModelCatalogEntry[] {\n return (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => id !== undefined && id.trim().length > 0)\n .map((id) => ({\n id,\n displayName: id,\n lifecycle: 'active',\n }));\n}\n\nfunction formatHttpFailure(response: IOpenAIModelCatalogFetchResponse): string {\n const statusText = response.statusText ? ` ${response.statusText}` : '';\n return `OpenAI model catalog refresh failed: HTTP ${response.status}${statusText}`;\n}\n\nfunction createUnavailableCatalog(message: string): IProviderModelCatalog {\n return {\n status: 'unavailable',\n sourceUrl: OPENAI_MODELS_SOURCE_URL,\n message,\n };\n}\n\nasync function defaultOpenAIModelCatalogFetch(\n url: string,\n init: IOpenAIModelCatalogFetchInit,\n): Promise<IOpenAIModelCatalogFetchResponse> {\n const response = await fetch(url, init);\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n json: () => response.json() as Promise<IOpenAIModelCatalogResponse>,\n };\n}\n","import { refreshOpenAIModelCatalog } from './model-catalog-refresh';\nimport { OpenAIProvider } from './provider';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\n\nimport type { IOpenAINativeWebToolsOptions, TOpenAIApiSurface } from './types';\nimport type { IProviderDefinition, TUniversalValue } from '@robota-sdk/agent-core';\n\nexport const DEFAULT_OPENAI_PROVIDER_MODEL: string | undefined = undefined;\nexport const DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE = '$ENV:OPENAI_API_KEY';\nconst OPENAI_API_KEY_URL = 'https://platform.openai.com/api-keys';\nconst OPENAI_SETUP_SOURCE_URL =\n 'https://developers.openai.com/api/reference/overview#authentication';\nconst OPENAI_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst OPENAI_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'OpenAI API keys',\n url: OPENAI_API_KEY_URL,\n sourceUrl: OPENAI_SETUP_SOURCE_URL,\n lastVerifiedAt: OPENAI_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createOpenAIProviderDefinition(): IProviderDefinition {\n return {\n type: 'openai',\n displayName: 'OpenAI',\n description: 'Official OpenAI Responses API provider',\n defaults: {\n apiKey: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,\n },\n modelCatalog: {\n status: 'unavailable',\n sourceUrl: 'https://platform.openai.com/docs/api-reference/models/list',\n message: 'OpenAI model availability should be discovered live from GET /v1/models.',\n },\n setupHelpLinks: OPENAI_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'model',\n title: 'OpenAI model',\n required: true,\n },\n {\n key: 'apiKey',\n title: 'OpenAI API key',\n defaultValue: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n refreshModelCatalog: ({ profile }) => refreshOpenAIModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n createProvider: (config) => {\n const apiSurface = readApiSurface(config.options);\n const nativeWebTools = readNativeWebTools(config.options);\n validateOpenAINativeWebTools(config.baseURL, apiSurface, nativeWebTools);\n return new OpenAIProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(apiSurface !== undefined && { apiSurface }),\n ...(nativeWebTools !== undefined && { nativeWebTools }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider openai requires apiKey');\n }\n return apiKey;\n}\n\nfunction readApiSurface(\n options: Record<string, TUniversalValue> | undefined,\n): TOpenAIApiSurface | undefined {\n const apiSurface = options?.['apiSurface'];\n if (apiSurface === 'responses' || apiSurface === 'chat-completions') {\n return apiSurface;\n }\n return undefined;\n}\n\nfunction readNativeWebTools(\n options: Record<string, TUniversalValue> | undefined,\n): IOpenAINativeWebToolsOptions | undefined {\n const nativeWebTools =\n readNativeWebToolsRecord(options?.['nativeWebTools']) ??\n readNativeWebToolsRecord(options?.['builtInWebTools']);\n if (nativeWebTools === undefined) {\n return undefined;\n }\n return nativeWebTools;\n}\n\nfunction readNativeWebToolsRecord(\n value: TUniversalValue | undefined,\n): IOpenAINativeWebToolsOptions | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n if (typeof value !== 'object') {\n return undefined;\n }\n const webSearch = value['webSearch'];\n const webFetch = value['webFetch'];\n return {\n ...(typeof webSearch === 'boolean' && { webSearch }),\n ...(typeof webFetch === 'boolean' && { webFetch }),\n };\n}\n\nfunction validateOpenAINativeWebTools(\n baseURL: string | undefined,\n apiSurface: TOpenAIApiSurface | undefined,\n nativeWebTools: IOpenAINativeWebToolsOptions | undefined,\n): void {\n if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {\n return;\n }\n if (baseURL !== undefined || apiSurface === 'chat-completions') {\n throw new Error(\n 'Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.',\n );\n }\n throw new Error(\n 'Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.',\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./openai-compatible-BYfyY5lb.cjs`);let n=require(`node:crypto`),r=require(`@robota-sdk/agent-core`),i=require(`openai`);i=e.t(i,1);var a=class{parser;constructor(e){this.parser=new t.i({logger:e})}parseResponse(e){try{return this.parser.parseResponse(e)}catch(e){let t=o(e instanceof Error?e.message:`OpenAI response parsing failed`);throw Error(`OpenAI response parsing failed: ${t}`)}}parseStreamingChunk(e){try{return this.parser.parseStreamingChunk(e)}catch(e){let t=o(e instanceof Error?e.message:`OpenAI chunk parsing failed`);throw Error(`OpenAI chunk parsing failed: ${t}`)}}};function o(e){return e.replace(/^OpenAI-compatible response parsing failed: /,``).replace(/^OpenAI-compatible chunk parsing failed: /,``).replace(`OpenAI-compatible response`,`OpenAI response`)}function s(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{type:`json_object`};let t=l(e);return{type:`json_schema`,json_schema:{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function c(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{format:{type:`json_object`}};let t=l(e);return{format:{type:`json_schema`,name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function l(e){let t=e.jsonSchema;if(e.responseFormat!==`json_schema`)throw Error(`Unsupported OpenAI response format: ${e.responseFormat}`);if(!t?.schema)throw Error(`OpenAI jsonSchema.schema is required when responseFormat is json_schema`);return{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}function u(e){return t.a(e)}function ee(e){return t.o(e)}async function te(e){let t=h(e.client);try{let n=f(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await p(t,e,{...n,stream:!0});await m(e,n,`chat`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let r=await t.chat.completions.create(n);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`response`,payload:r}),e.responseParser.parseResponse(r)}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI chat failed: ${t}`)}}async function*d(e){let n=h(e.client);try{let r={...f(e),stream:!0};await m(e,r,`stream`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await n.chat.completions.create(r,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);for await(let n of t.n(i,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let t=e.responseParser.parseStreamingChunk(n);t&&(yield t)}}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI stream failed: ${t}`)}}function f(e){let t=u(e.messages),n=e.chatOptions?.model??e.providerOptions.defaultModel;if(!n)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let r=s(e.providerOptions);return{model:n,messages:t,...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_tokens:e.chatOptions.maxTokens},...e.chatOptions?.tools&&{tools:ee(e.chatOptions.tools),tool_choice:`auto`},...r!==void 0&&{response_format:r}}}async function p(e,n,r){try{return await m(n,r,`stream`),n.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r}),t.r({stream:t.n(await e.chat.completions.create(r,n.chatOptions?.signal?{signal:n.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n.chatOptions?.onProviderNativeRawPayload}),onTextDelta:n.chatOptions?.onTextDelta??n.onTextDelta,signal:n.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI streaming request failed`;throw Error(`OpenAI stream failed: ${t}`)}}async function m(e,t,n){if(!e.payloadLogger?.isEnabled())return;let r={model:t.model,messagesCount:t.messages.length,hasTools:!!t.tools,temperature:t.temperature??void 0,maxTokens:t.max_tokens??void 0,timestamp:new Date().toISOString()};await e.payloadLogger.logPayload(r,n)}function h(e){if(!e)throw Error(`OpenAI client not available. Either provide a client/apiKey or use an executor.`);return e}function g(e){return e.flatMap(e=>v(e))}function _(e,t){let n=e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:t??!1}))??[];return n.length>0?n:void 0}function v(e){if(e.role===`user`)return[S(`user`,b(e.content,e.parts))];if(e.role===`system`)return[S(`system`,e.content)];if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]}return y(e)}function y(e){let t=[];e.content&&e.content.length>0&&t.push(S(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(S(`assistant`,``)),t}function b(e,t){if(!t||t.length===0)return e;let n=t.map(e=>x(e));return e.length>0&&!t.some(e=>e.type===`text`)?[{type:`input_text`,text:e},...n]:n}function x(e){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`image_uri`?{type:`input_image`,image_url:e.uri}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`}}function S(e,t){return{role:e,content:t}}async function*ne(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await re(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function re(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function ie(e){I(e);let t=e.output??[];return C({content:e.output_text??O(t),toolCalls:T(t),response:e,reasoning:j(t)})}async function ae(e){let t={textParts:[],toolCalls:[],reasoning:N()};for await(let n of ne(e.stream,e.signal))oe(t,n,e.onTextDelta);return t.completedResponse===void 0?C({content:t.textParts.join(``),toolCalls:t.toolCalls,reasoning:t.reasoning}):ce(t)}function oe(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,P(e.reasoning,j(t.response.output??[]));return}if(t.type===`response.output_item.done`){se(e,t.item);return}if(t.type===`response.error`||t.type===`response.failed`||t.type===`response.incomplete`)throw Error(`OpenAI Responses API failed: ${L(t)}`)}function se(e,t){if(E(t)){e.toolCalls.push(D(t));return}M(t)&&P(e.reasoning,j([t]))}function ce(e){let t=e.completedResponse;if(t===void 0)throw Error(`OpenAI Responses stream completed without response metadata`);I(t);let n=t.output??[],r=T(n),i=e.textParts.length>0?e.textParts.join(``):t.output_text??O(n),a=j(n);return P(a,e.reasoning),C({content:i,toolCalls:r.length>0?r:e.toolCalls,response:t,reasoning:a})}function C(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:w(e.response.usage)},metadata:le(e.response,e.reasoning)}}function le(e,t){return{providerApiSurface:`responses`,...e?.id!==void 0&&{responseId:e.id},...e?.model!==void 0&&{model:e.model},...e?.status!==void 0&&{finishReason:e.status},...t.reasoningSummaryCount>0&&{reasoningSummaryCount:t.reasoningSummaryCount,reasoningSummaries:t.reasoningSummaries},...t.hasEncryptedReasoning&&{hasEncryptedReasoning:!0}}}function w(e){return{promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function T(e){return e.filter(E).map(e=>D(e))}function E(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function D(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function O(e){return e.filter(A).flatMap(e=>e.content).map(k).join(``)}function k(e){return e.type===`refusal`?e.refusal:e.text}function A(e){return e.type===`message`&&`content`in e&&Array.isArray(e.content)}function j(e){let t=N();for(let n of e){if(!M(n))continue;let e=n.summary?.map(e=>e.text).filter(F)??[];t.reasoningSummaryCount+=e.length,t.reasoningSummaries.push(...e),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content}return t}function M(e){return e.type===`reasoning`}function N(){return{reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:!1}}function P(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning}function F(e){return e!==void 0}function I(e){if(e.status===`failed`||e.status===`incomplete`)throw Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function L(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function R(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return B({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=V(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`response`,payload:n}),ie(n)}catch(e){let t=e.message||`OpenAI Responses API request failed`;throw Error(`OpenAI responses failed: ${t}`)}}async function*z(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,r=B({...e,chatOptions:{...e.chatOptions,onTextDelta:e=>{n?.(e),ue(t,U(e))}}}).then(e=>de(t,e)).catch(e=>fe(t,he(e)));yield*W(t),await r}async function B(e){if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let n=H(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:n}),ae({stream:t.n(await e.client.responses.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI Responses streaming request failed`;throw Error(`OpenAI responses stream failed: ${t}`)}}function V(e){let t=e.chatOptions?.model??e.providerOptions.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=_(e.chatOptions?.tools,e.providerOptions.strictTools),r=c(e.providerOptions);return{model:t,input:g(e.messages),...n!==void 0&&{tools:n,tool_choice:`auto`},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...r!==void 0&&{text:r},...e.providerOptions.reasoning!==void 0&&{reasoning:e.providerOptions.reasoning},...e.providerOptions.includeEncryptedReasoning===!0&&{include:[`reasoning.encrypted_content`]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function H(e){return{...V(e),stream:!0}}function U(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{providerApiSurface:`responses`,isStreamChunk:!0,isComplete:!1}}}async function*W(e){for(;;){let t=e.deltas.shift();if(t!==void 0){yield t;continue}if(e.error!==void 0)throw e.error;if(e.finalMessage!==void 0){yield me(e.finalMessage);return}await pe(e)}}function ue(e,t){e.deltas.push(t),G(e)}function de(e,t){e.finalMessage=t,G(e)}function fe(e,t){e.error=t,G(e)}function pe(e){return new Promise(t=>{e.wake=t})}function G(e){e.wake?.(),e.wake=void 0}function me(e){return{...e,content:``,metadata:{...e.metadata,isStreamChunk:!0,isComplete:!0}}}function he(e){return e instanceof Error?e:Error(String(e))}var K=class extends r.AbstractAIProvider{name=`openai`;version=`1.0.0`;client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(e){if(super(e.logger||r.SilentLogger),this.options=e,this.apiSurface=ge(e),_e(this.apiSurface,e.nativeWebTools),e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new i.default({apiKey:e.apiKey,...e.organization&&{organization:e.organization},...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either OpenAI client, apiKey, or executor is required`);this.responseParser=new a(this.logger),this.payloadLogger=e.payloadLogger}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`OpenAI Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}return this.apiSurface===`responses`?R({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta}):te({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}async*chatStream(e,t){if(this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`OpenAI Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(this.apiSurface===`responses`){yield*z({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta});return}yield*d({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}supportsTools(){return!0}getCapabilities(){let e=this.apiSurface===`chat-completions`?`openai-compatible-chat-completions`:`openai-responses`;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:e,reason:q(this.apiSurface,`search`)},webFetch:{supported:!1,enabled:!1,source:e,reason:q(this.apiSurface,`fetch`)}}}}validateConfig(){return!!this.client&&!!this.options}async dispose(){}validateMessages(e){super.validateMessages(e);for(let t of e)if(t.role===`assistant`){let e=t;if(e.toolCalls&&e.toolCalls.length>0&&e.content===``)continue}}};function ge(e){return e.apiSurface===void 0?e.baseURL?`chat-completions`:`responses`:e.apiSurface}function q(e,t){return e===`chat-completions`?`OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${t}.`:`OpenAI Responses native web ${t} is not wired in this Robota provider version.`}function _e(e,t){if(!(t?.webSearch!==!0&&t?.webFetch!==!0))throw Error(`Provider openai native web search/fetch is not supported for apiSurface ${e} in this Robota provider version.`)}var ve=class{static filterMessagesForOpenAI(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`system`?!0:e.role===`tool`?!!(e.toolCallId&&e.toolCallId.trim()!==``&&e.toolCallId!==`unknown`):!1)}static toOpenAIFormat(e){return this.filterMessagesForOpenAI(e).map(e=>this.convertMessage(e))}static convertMessage(e){let t=e.role;if(t===`user`)return{role:`user`,content:e.content};if(t===`assistant`){let t=e;return t.toolCalls&&t.toolCalls.length>0?{role:`assistant`,content:t.content===``?null:t.content||null,tool_calls:t.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:t.content===null||t.content===``?null:t.content||``}}if(t===`system`)return{role:`system`,content:e.content};if(t===`tool`){if(!e.toolCallId||e.toolCallId.trim()===``)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${t}`)}static addSystemPromptIfNeeded(e,t){return!t||e.some(e=>e.role===`system`)?e:[{role:`system`,content:t},...e]}};const J=`https://platform.openai.com/docs/api-reference/models/list`;async function Y(e,t={}){if(!e.apiKey)return X(`OpenAI model catalog refresh requires apiKey.`);let n=t.fetcher??Se,r=t.now??(()=>new Date),i=ye(e.baseURL);try{let t=await n(i,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!t.ok)return X(xe(t));let a=be(await t.json());return{status:`live`,entries:a,lastVerifiedAt:r().toISOString(),sourceUrl:J,message:`${a.length} OpenAI model(s) discovered.`}}catch(e){return X(e instanceof Error?e.message:String(e))}}function ye(e){return e?`${e.replace(/\/$/,``)}/models`:`https://api.openai.com/v1/models`}function be(e){return(e.data??[]).map(e=>e.id).filter(e=>e!==void 0&&e.trim().length>0).map(e=>({id:e,displayName:e,lifecycle:`active`}))}function xe(e){let t=e.statusText?` ${e.statusText}`:``;return`OpenAI model catalog refresh failed: HTTP ${e.status}${t}`}function X(e){return{status:`unavailable`,sourceUrl:J,message:e}}async function Se(e,t){let n=await fetch(e,t);return{ok:n.ok,status:n.status,statusText:n.statusText,json:()=>n.json()}}const Z=`$ENV:OPENAI_API_KEY`,Ce=[{kind:`api-key`,label:`OpenAI API keys`,url:`https://platform.openai.com/api-keys`,sourceUrl:`https://developers.openai.com/api/reference/overview#authentication`,lastVerifiedAt:`2026-05-08`}];function we(){return{type:`openai`,displayName:`OpenAI`,description:`Official OpenAI Responses API provider`,defaults:{apiKey:Z},modelCatalog:{status:`unavailable`,sourceUrl:`https://platform.openai.com/docs/api-reference/models/list`,message:`OpenAI model availability should be discovered live from GET /v1/models.`},setupHelpLinks:Ce,setupSteps:[{key:`model`,title:`OpenAI model`,required:!0},{key:`apiKey`,title:`OpenAI API key`,defaultValue:Z,masked:!0}],requiresApiKey:!0,probeProfile:t.t,refreshModelCatalog:({profile:e})=>Y(e),modelCatalogCacheTtlSeconds:86400,createProvider:e=>{let t=Te(e.options),n=Ee(e.options);return De(e.baseURL,t,n),new K({apiKey:Q(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t!==void 0&&{apiSurface:t},...n!==void 0&&{nativeWebTools:n},defaultModel:e.model})}}}function Q(e){if(!e)throw Error(`Provider openai requires apiKey`);return e}function Te(e){let t=e?.apiSurface;if(t===`responses`||t===`chat-completions`)return t}function Ee(e){let t=$(e?.nativeWebTools)??$(e?.builtInWebTools);if(t!==void 0)return t}function $(e){if(e==null||e instanceof Date||Array.isArray(e)||typeof e!=`object`)return;let t=e.webSearch,n=e.webFetch;return{...typeof t==`boolean`&&{webSearch:t},...typeof n==`boolean`&&{webFetch:n}}}function De(e,t,n){if(!(n?.webSearch!==!0&&n?.webFetch!==!0))throw Error(e!==void 0||t===`chat-completions`?`Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`:`Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Z}});
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./openai-compatible-BYfyY5lb.cjs`);let n=require(`node:crypto`),r=require(`@robota-sdk/agent-core`),i=require(`openai`);i=e.t(i,1);function a(e){return t.a(e)}function o(e){return t.o(e)}function ee(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{type:`json_object`};let t=c(e);return{type:`json_schema`,json_schema:{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function s(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{format:{type:`json_object`}};let t=c(e);return{format:{type:`json_schema`,name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function c(e){let t=e.jsonSchema;if(e.responseFormat!==`json_schema`)throw Error(`Unsupported OpenAI response format: ${e.responseFormat}`);if(!t?.schema)throw Error(`OpenAI jsonSchema.schema is required when responseFormat is json_schema`);return{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}async function l(e){let t=p(e.client);try{let n=u(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await d(t,e,{...n,stream:!0});await f(e,n,`chat`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let r=await t.chat.completions.create(n);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`response`,payload:r}),e.responseParser.parseResponse(r)}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI chat failed: ${t}`)}}async function*te(e){let n=p(e.client);try{let r={...u(e),stream:!0};await f(e,r,`stream`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await n.chat.completions.create(r,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);for await(let n of t.n(i,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let t=e.responseParser.parseStreamingChunk(n);t&&(yield t)}}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI stream failed: ${t}`)}}function u(e){let t=a(e.messages),n=e.chatOptions?.model??e.providerOptions.defaultModel;if(!n)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let r=ee(e.providerOptions);return{model:n,messages:t,...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_tokens:e.chatOptions.maxTokens},...e.chatOptions?.tools&&{tools:o(e.chatOptions.tools),tool_choice:`auto`},...r!==void 0&&{response_format:r}}}async function d(e,n,r){try{return await f(n,r,`stream`),n.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r}),t.r({stream:t.n(await e.chat.completions.create(r,n.chatOptions?.signal?{signal:n.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n.chatOptions?.onProviderNativeRawPayload}),onTextDelta:n.chatOptions?.onTextDelta??n.onTextDelta,signal:n.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI streaming request failed`;throw Error(`OpenAI stream failed: ${t}`)}}async function f(e,t,n){if(!e.payloadLogger?.isEnabled())return;let r={model:t.model,messagesCount:t.messages.length,hasTools:!!t.tools,temperature:t.temperature??void 0,maxTokens:t.max_tokens??void 0,timestamp:new Date().toISOString()};await e.payloadLogger.logPayload(r,n)}function p(e){if(!e)throw Error(`OpenAI client not available. Either provide a client/apiKey or use an executor.`);return e}var m=class{parser;constructor(e){this.parser=new t.i({logger:e})}parseResponse(e){try{return this.parser.parseResponse(e)}catch(e){let t=h(e instanceof Error?e.message:`OpenAI response parsing failed`);throw Error(`OpenAI response parsing failed: ${t}`)}}parseStreamingChunk(e){try{return this.parser.parseStreamingChunk(e)}catch(e){let t=h(e instanceof Error?e.message:`OpenAI chunk parsing failed`);throw Error(`OpenAI chunk parsing failed: ${t}`)}}};function h(e){return e.replace(/^OpenAI-compatible response parsing failed: /,``).replace(/^OpenAI-compatible chunk parsing failed: /,``).replace(`OpenAI-compatible response`,`OpenAI response`)}function g(e){return e.flatMap(e=>v(e))}function _(e,t){let n=e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:t??!1}))??[];return n.length>0?n:void 0}function v(e){if(e.role===`user`)return[S(`user`,b(e.content,e.parts))];if(e.role===`system`)return[S(`system`,e.content)];if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]}return y(e)}function y(e){let t=[];e.content&&e.content.length>0&&t.push(S(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(S(`assistant`,``)),t}function b(e,t){if(!t||t.length===0)return e;let n=t.map(e=>x(e));return e.length>0&&!t.some(e=>e.type===`text`)?[{type:`input_text`,text:e},...n]:n}function x(e){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`image_uri`?{type:`input_image`,image_url:e.uri}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`}}function S(e,t){return{role:e,content:t}}async function*ne(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await re(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function re(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function ie(e){I(e);let t=e.output??[];return C({content:e.output_text??O(t),toolCalls:T(t),response:e,reasoning:j(t)})}async function ae(e){let t={textParts:[],toolCalls:[],reasoning:N()};for await(let n of ne(e.stream,e.signal))oe(t,n,e.onTextDelta);return t.completedResponse===void 0?C({content:t.textParts.join(``),toolCalls:t.toolCalls,reasoning:t.reasoning}):ce(t)}function oe(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,P(e.reasoning,j(t.response.output??[]));return}if(t.type===`response.output_item.done`){se(e,t.item);return}if(t.type===`response.error`||t.type===`response.failed`||t.type===`response.incomplete`)throw Error(`OpenAI Responses API failed: ${L(t)}`)}function se(e,t){if(E(t)){e.toolCalls.push(D(t));return}M(t)&&P(e.reasoning,j([t]))}function ce(e){let t=e.completedResponse;if(t===void 0)throw Error(`OpenAI Responses stream completed without response metadata`);I(t);let n=t.output??[],r=T(n),i=e.textParts.length>0?e.textParts.join(``):t.output_text??O(n),a=j(n);return P(a,e.reasoning),C({content:i,toolCalls:r.length>0?r:e.toolCalls,response:t,reasoning:a})}function C(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:w(e.response.usage)},metadata:le(e.response,e.reasoning)}}function le(e,t){return{providerApiSurface:`responses`,...e?.id!==void 0&&{responseId:e.id},...e?.model!==void 0&&{model:e.model},...e?.status!==void 0&&{finishReason:e.status},...t.reasoningSummaryCount>0&&{reasoningSummaryCount:t.reasoningSummaryCount,reasoningSummaries:t.reasoningSummaries},...t.hasEncryptedReasoning&&{hasEncryptedReasoning:!0}}}function w(e){return{promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function T(e){return e.filter(E).map(e=>D(e))}function E(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function D(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function O(e){return e.filter(A).flatMap(e=>e.content).map(k).join(``)}function k(e){return e.type===`refusal`?e.refusal:e.text}function A(e){return e.type===`message`&&`content`in e&&Array.isArray(e.content)}function j(e){let t=N();for(let n of e){if(!M(n))continue;let e=n.summary?.map(e=>e.text).filter(F)??[];t.reasoningSummaryCount+=e.length,t.reasoningSummaries.push(...e),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content}return t}function M(e){return e.type===`reasoning`}function N(){return{reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:!1}}function P(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning}function F(e){return e!==void 0}function I(e){if(e.status===`failed`||e.status===`incomplete`)throw Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function L(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function R(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return B({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=V(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`response`,payload:n}),ie(n)}catch(e){let t=e.message||`OpenAI Responses API request failed`;throw Error(`OpenAI responses failed: ${t}`)}}async function*z(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,r=B({...e,chatOptions:{...e.chatOptions,onTextDelta:e=>{n?.(e),ue(t,U(e))}}}).then(e=>de(t,e)).catch(e=>fe(t,he(e)));yield*W(t),await r}async function B(e){if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let n=H(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:n}),ae({stream:t.n(await e.client.responses.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI Responses streaming request failed`;throw Error(`OpenAI responses stream failed: ${t}`)}}function V(e){let t=e.chatOptions?.model??e.providerOptions.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=_(e.chatOptions?.tools,e.providerOptions.strictTools),r=s(e.providerOptions);return{model:t,input:g(e.messages),...n!==void 0&&{tools:n,tool_choice:`auto`},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...r!==void 0&&{text:r},...e.providerOptions.reasoning!==void 0&&{reasoning:e.providerOptions.reasoning},...e.providerOptions.includeEncryptedReasoning===!0&&{include:[`reasoning.encrypted_content`]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function H(e){return{...V(e),stream:!0}}function U(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{providerApiSurface:`responses`,isStreamChunk:!0,isComplete:!1}}}async function*W(e){for(;;){let t=e.deltas.shift();if(t!==void 0){yield t;continue}if(e.error!==void 0)throw e.error;if(e.finalMessage!==void 0){yield me(e.finalMessage);return}await pe(e)}}function ue(e,t){e.deltas.push(t),G(e)}function de(e,t){e.finalMessage=t,G(e)}function fe(e,t){e.error=t,G(e)}function pe(e){return new Promise(t=>{e.wake=t})}function G(e){e.wake?.(),e.wake=void 0}function me(e){return{...e,content:``,metadata:{...e.metadata,isStreamChunk:!0,isComplete:!0}}}function he(e){return e instanceof Error?e:Error(String(e))}var K=class extends r.AbstractAIProvider{name=`openai`;version=`1.0.0`;client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(e){if(super(e.logger||r.SilentLogger),this.options=e,this.apiSurface=ge(e),_e(this.apiSurface,e.nativeWebTools),e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new i.default({apiKey:e.apiKey,...e.organization&&{organization:e.organization},...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either OpenAI client, apiKey, or executor is required`);this.responseParser=new m(this.logger),this.payloadLogger=e.payloadLogger}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`OpenAI Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}return this.apiSurface===`responses`?R({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta}):l({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}async*chatStream(e,t){if(this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`OpenAI Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(this.apiSurface===`responses`){yield*z({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta});return}yield*te({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}supportsTools(){return!0}getCapabilities(){let e=this.apiSurface===`chat-completions`?`openai-compatible-chat-completions`:`openai-responses`;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:e,reason:q(this.apiSurface,`search`)},webFetch:{supported:!1,enabled:!1,source:e,reason:q(this.apiSurface,`fetch`)}}}}validateConfig(){return!!this.client&&!!this.options}async dispose(){}validateMessages(e){super.validateMessages(e);for(let t of e)if(t.role===`assistant`){let e=t;if(e.toolCalls&&e.toolCalls.length>0&&e.content===``)continue}}};function ge(e){return e.apiSurface===void 0?e.baseURL?`chat-completions`:`responses`:e.apiSurface}function q(e,t){return e===`chat-completions`?`OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${t}.`:`OpenAI Responses native web ${t} is not wired in this Robota provider version.`}function _e(e,t){if(!(t?.webSearch!==!0&&t?.webFetch!==!0))throw Error(`Provider openai native web search/fetch is not supported for apiSurface ${e} in this Robota provider version.`)}var ve=class{static filterMessagesForOpenAI(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`system`?!0:e.role===`tool`?!!(e.toolCallId&&e.toolCallId.trim()!==``&&e.toolCallId!==`unknown`):!1)}static toOpenAIFormat(e){return this.filterMessagesForOpenAI(e).map(e=>this.convertMessage(e))}static convertMessage(e){let t=e.role;if(t===`user`)return{role:`user`,content:e.content};if(t===`assistant`){let t=e;return t.toolCalls&&t.toolCalls.length>0?{role:`assistant`,content:t.content===``?null:t.content||null,tool_calls:t.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:t.content===null||t.content===``?null:t.content||``}}if(t===`system`)return{role:`system`,content:e.content};if(t===`tool`){if(!e.toolCallId||e.toolCallId.trim()===``)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${t}`)}static addSystemPromptIfNeeded(e,t){return!t||e.some(e=>e.role===`system`)?e:[{role:`system`,content:t},...e]}};const J=`https://platform.openai.com/docs/api-reference/models/list`;async function Y(e,t={}){if(!e.apiKey)return X(`OpenAI model catalog refresh requires apiKey.`);let n=t.fetcher??Se,r=t.now??(()=>new Date),i=ye(e.baseURL);try{let t=await n(i,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!t.ok)return X(xe(t));let a=be(await t.json());return{status:`live`,entries:a,lastVerifiedAt:r().toISOString(),sourceUrl:J,message:`${a.length} OpenAI model(s) discovered.`}}catch(e){return X(e instanceof Error?e.message:String(e))}}function ye(e){return e?`${e.replace(/\/$/,``)}/models`:`https://api.openai.com/v1/models`}function be(e){return(e.data??[]).map(e=>e.id).filter(e=>e!==void 0&&e.trim().length>0).map(e=>({id:e,displayName:e,lifecycle:`active`}))}function xe(e){let t=e.statusText?` ${e.statusText}`:``;return`OpenAI model catalog refresh failed: HTTP ${e.status}${t}`}function X(e){return{status:`unavailable`,sourceUrl:J,message:e}}async function Se(e,t){let n=await fetch(e,t);return{ok:n.ok,status:n.status,statusText:n.statusText,json:()=>n.json()}}const Z=`$ENV:OPENAI_API_KEY`,Ce=[{kind:`api-key`,label:`OpenAI API keys`,url:`https://platform.openai.com/api-keys`,sourceUrl:`https://developers.openai.com/api/reference/overview#authentication`,lastVerifiedAt:`2026-05-08`}];function we(){return{type:`openai`,displayName:`OpenAI`,description:`Official OpenAI Responses API provider`,defaults:{apiKey:Z},modelCatalog:{status:`unavailable`,sourceUrl:`https://platform.openai.com/docs/api-reference/models/list`,message:`OpenAI model availability should be discovered live from GET /v1/models.`},setupHelpLinks:Ce,setupSteps:[{key:`model`,title:`OpenAI model`,required:!0},{key:`apiKey`,title:`OpenAI API key`,defaultValue:Z,masked:!0}],requiresApiKey:!0,probeProfile:t.t,refreshModelCatalog:({profile:e})=>Y(e),modelCatalogCacheTtlSeconds:86400,createProvider:e=>{let t=Te(e.options),n=Ee(e.options);return De(e.baseURL,t,n),new K({apiKey:Q(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t!==void 0&&{apiSurface:t},...n!==void 0&&{nativeWebTools:n},defaultModel:e.model})}}}function Q(e){if(!e)throw Error(`Provider openai requires apiKey`);return e}function Te(e){let t=e?.apiSurface;if(t===`responses`||t===`chat-completions`)return t}function Ee(e){let t=$(e?.nativeWebTools)??$(e?.builtInWebTools);if(t!==void 0)return t}function $(e){if(e==null||e instanceof Date||Array.isArray(e)||typeof e!=`object`)return;let t=e.webSearch,n=e.webFetch;return{...typeof t==`boolean`&&{webSearch:t},...typeof n==`boolean`&&{webFetch:n}}}function De(e,t,n){if(!(n?.webSearch!==!0&&n?.webFetch!==!0))throw Error(e!==void 0||t===`chat-completions`?`Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`:`Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Z}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible-Dm4Sof9e.js","names":["exhaustive"],"sources":["../../src/shared/openai-compatible/message-converter.ts","../../src/shared/openai-compatible/response-parser.ts","../../src/shared/openai-compatible/stream-assembler.ts","../../src/shared/openai-compatible/native-payload-observer.ts","../../src/shared/openai-compatible/endpoint-probe.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type {\n IAssistantMessage,\n IToolCall,\n IToolSchema,\n TUniversalMessage,\n} from '@robota-sdk/agent-core';\n\nexport function convertToOpenAICompatibleMessages(\n messages: TUniversalMessage[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((message) => convertMessage(message));\n}\n\nexport function convertToOpenAICompatibleTools(\n tools: IToolSchema[],\n): OpenAI.Chat.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n}\n\nfunction convertMessage(message: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: message.content || '',\n };\n }\n\n if (message.role === 'assistant') {\n return convertAssistantMessage(message);\n }\n\n if (message.role === 'system') {\n return {\n role: 'system',\n content: message.content || '',\n };\n }\n\n if (message.role === 'tool') {\n if (!message.toolCallId || message.toolCallId.trim().length === 0) {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(message)}`);\n }\n return {\n role: 'tool',\n content: message.content || '',\n tool_call_id: message.toolCallId,\n };\n }\n\n const exhaustive: never = message;\n throw new Error(`Unsupported message role: ${JSON.stringify(exhaustive)}`);\n}\n\nfunction convertAssistantMessage(\n message: IAssistantMessage,\n): OpenAI.Chat.ChatCompletionAssistantMessageParam {\n if (message.toolCalls && message.toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: message.content === '' ? null : message.content || null,\n tool_calls: message.toolCalls.map((toolCall: IToolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })),\n };\n }\n\n return {\n role: 'assistant',\n content: message.content === null ? null : message.content || '',\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { ILogger, IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { SilentLogger } from '@robota-sdk/agent-core';\nimport type {\n IOpenAICompatibleToolCallTextProjector,\n IOpenAICompatibleToolCallTextProjection,\n TOpenAICompatibleTextProjector,\n} from './types';\n\nexport interface IOpenAICompatibleResponseParserOptions {\n logger?: ILogger;\n textProjector?: TOpenAICompatibleTextProjector;\n toolCallTextProjector?: IOpenAICompatibleToolCallTextProjector;\n}\n\nexport class OpenAICompatibleResponseParser {\n private readonly logger: ILogger;\n private readonly textProjector?: TOpenAICompatibleTextProjector;\n private readonly toolCallTextProjector?: IOpenAICompatibleToolCallTextProjector;\n\n constructor(options: IOpenAICompatibleResponseParserOptions = {}) {\n this.logger = options.logger ?? SilentLogger;\n this.textProjector = options.textProjector;\n this.toolCallTextProjector = options.toolCallTextProjector;\n }\n\n parseResponse(response: OpenAI.Chat.ChatCompletion): TUniversalMessage {\n try {\n const choice = response.choices?.[0];\n if (!choice) {\n throw new Error('No choices found in OpenAI-compatible response');\n }\n\n return this.parseChoice(choice, response.usage);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'OpenAI-compatible response parsing failed';\n this.logger.error('Response parsing failed', { error: message });\n throw new Error(`OpenAI-compatible response parsing failed: ${message}`);\n }\n }\n\n private parseChoice(\n choice: OpenAI.Chat.ChatCompletion.Choice,\n usage: OpenAI.CompletionUsage | undefined,\n ): TUniversalMessage {\n const message = choice.message;\n const toolTextProjection = this.projectToolCallText(message.content || '');\n const toolTextFlush = this.toolCallTextProjector?.flush();\n const nativeToolCalls = this.parseNativeToolCalls(message);\n const projectedToolCalls = [\n ...toolTextProjection.toolCalls,\n ...(toolTextFlush?.toolCalls ?? []),\n ];\n const toolCalls = [...nativeToolCalls, ...projectedToolCalls];\n\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: this.projectText(\n toolTextProjection.visibleText + (toolTextFlush?.visibleText ?? ''),\n ),\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n ...(usage && { usage: this.parseUsage(usage) }),\n metadata: {\n finishReason: choice.finish_reason || undefined,\n ...this.buildToolTextMetadata(toolTextProjection, toolTextFlush),\n },\n };\n }\n\n private parseNativeToolCalls(message: OpenAI.Chat.ChatCompletionMessage): IToolCall[] {\n return (\n message.tool_calls?.map((toolCall) => ({\n id: toolCall.id,\n type: 'function' as const,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })) || []\n );\n }\n\n private parseUsage(usage: OpenAI.CompletionUsage): {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n } {\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n parseStreamingChunk(chunk: OpenAI.Chat.ChatCompletionChunk): TUniversalMessage | null {\n try {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return null;\n }\n\n const finishReason = choice.finish_reason;\n const toolCalls = choice.delta.tool_calls?.map((toolCall) => ({\n id: toolCall.id || '',\n type: 'function' as const,\n function: {\n name: toolCall.function?.name || '',\n arguments: toolCall.function?.arguments || '',\n },\n }));\n\n if (toolCalls) {\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls,\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n }\n\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: this.projectText(choice.delta.content || ''),\n timestamp: new Date(),\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'OpenAI-compatible chunk parsing failed';\n this.logger.error('Chunk parsing failed', { error: message });\n throw new Error(`OpenAI-compatible chunk parsing failed: ${message}`);\n }\n }\n\n private projectText(text: string): string {\n return this.textProjector ? this.textProjector(text) : text;\n }\n\n private projectToolCallText(text: string): IOpenAICompatibleToolCallTextProjection {\n return (\n this.toolCallTextProjector?.project(text) ?? {\n visibleText: text,\n toolCalls: [],\n removedToolCallText: false,\n }\n );\n }\n\n private buildToolTextMetadata(\n projection: IOpenAICompatibleToolCallTextProjection,\n flush: IOpenAICompatibleToolCallTextProjection | undefined,\n ): Record<string, string | boolean | undefined> {\n const rawToolCallText = [projection.rawToolCallText, flush?.rawToolCallText]\n .filter((text): text is string => typeof text === 'string' && text.length > 0)\n .join('');\n const removedToolCallText =\n projection.removedToolCallText || (flush?.removedToolCallText ?? false);\n\n return {\n ...(removedToolCallText && { toolCallTextProjected: true }),\n ...(rawToolCallText.length > 0 && { rawToolCallText }),\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IOpenAICompatibleToolCallTextProjection,\n IOpenAICompatibleStreamAssemblyOptions,\n TOpenAICompatibleTextProjector,\n} from './types';\n\ninterface IToolCallPart {\n id: string;\n name: string;\n arguments: string;\n}\n\ninterface IAssemblyState {\n textParts: string[];\n toolCallParts: Map<number, IToolCallPart>;\n projectedToolCalls: IToolCall[];\n rawToolCallTextParts: string[];\n toolCallTextProjected: boolean;\n model: string;\n finishReason: string | null;\n}\n\nexport async function assembleOpenAICompatibleStream(\n options: IOpenAICompatibleStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IAssemblyState = {\n textParts: [],\n toolCallParts: new Map(),\n projectedToolCalls: [],\n rawToolCallTextParts: [],\n toolCallTextProjected: false,\n model: '',\n finishReason: null,\n };\n\n for await (const chunk of streamWithAbort(options.stream, options.signal)) {\n applyChunk(state, chunk, options);\n }\n applyProjectedTextFlush(state, options);\n\n return buildMessage(state, options.metadata);\n}\n\nfunction applyChunk(\n state: IAssemblyState,\n chunk: OpenAI.Chat.ChatCompletionChunk,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n state.finishReason = choice.finish_reason ?? state.finishReason;\n applyTextDelta(state, choice.delta.content, options);\n applyToolCallDeltas(state, choice.delta.tool_calls ?? []);\n}\n\nfunction applyTextDelta(\n state: IAssemblyState,\n content: string | null | undefined,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n if (!content) {\n return;\n }\n\n const toolProjection = projectToolCallText(content, options.toolCallTextProjector);\n applyToolCallTextProjection(state, toolProjection);\n const visibleContent = projectText(toolProjection.visibleText, options.textProjector);\n if (visibleContent.length === 0) {\n return;\n }\n\n state.textParts.push(visibleContent);\n options.onTextDelta?.(visibleContent);\n}\n\nfunction projectText(text: string, projector?: TOpenAICompatibleTextProjector): string {\n return projector ? projector(text) : text;\n}\n\nfunction applyProjectedTextFlush(\n state: IAssemblyState,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n const toolProjection = options.toolCallTextProjector?.flush();\n if (toolProjection) {\n applyToolCallTextProjection(state, toolProjection);\n const visibleToolText = projectText(toolProjection.visibleText, options.textProjector);\n if (visibleToolText.length > 0) {\n state.textParts.push(visibleToolText);\n options.onTextDelta?.(visibleToolText);\n }\n }\n\n const visibleContent = options.textProjectorFlush?.();\n if (!visibleContent) {\n return;\n }\n\n state.textParts.push(visibleContent);\n options.onTextDelta?.(visibleContent);\n}\n\nfunction projectToolCallText(\n text: string,\n projector: IOpenAICompatibleStreamAssemblyOptions['toolCallTextProjector'],\n): IOpenAICompatibleToolCallTextProjection {\n return (\n projector?.project(text) ?? {\n visibleText: text,\n toolCalls: [],\n removedToolCallText: false,\n }\n );\n}\n\nfunction applyToolCallTextProjection(\n state: IAssemblyState,\n projection: IOpenAICompatibleToolCallTextProjection,\n): void {\n if (projection.toolCalls.length > 0) {\n state.projectedToolCalls.push(...projection.toolCalls);\n }\n if (projection.removedToolCallText) {\n state.toolCallTextProjected = true;\n }\n if (projection.rawToolCallText && projection.rawToolCallText.length > 0) {\n state.rawToolCallTextParts.push(projection.rawToolCallText);\n }\n}\n\nfunction applyToolCallDeltas(\n state: IAssemblyState,\n deltas: OpenAI.Chat.ChatCompletionChunk.Choice.Delta.ToolCall[],\n): void {\n for (const delta of deltas) {\n const index = delta.index ?? 0;\n const current = state.toolCallParts.get(index) ?? { id: '', name: '', arguments: '' };\n const nextName = delta.function?.name ?? current.name;\n state.toolCallParts.set(index, {\n id: delta.id ?? current.id,\n name: nextName,\n arguments: current.arguments + (delta.function?.arguments ?? ''),\n });\n }\n}\n\nfunction buildMessage(\n state: IAssemblyState,\n metadata: Record<string, string | number | boolean> = {},\n): TUniversalMessage {\n const resultMetadata: NonNullable<TUniversalMessage['metadata']> = { ...metadata };\n if (state.model) {\n resultMetadata['model'] = state.model;\n }\n if (state.finishReason) {\n resultMetadata['finishReason'] = state.finishReason;\n }\n if (state.toolCallTextProjected) {\n resultMetadata['toolCallTextProjected'] = true;\n }\n if (state.rawToolCallTextParts.length > 0) {\n resultMetadata['rawToolCallText'] = state.rawToolCallTextParts.join('');\n }\n\n const toolCalls = buildAllToolCalls(state);\n\n return {\n id: randomUUID(),\n role: 'assistant',\n content: state.textParts.join(''),\n state: 'complete',\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n ...(Object.keys(resultMetadata).length > 0 && { metadata: resultMetadata }),\n };\n}\n\nfunction buildAllToolCalls(state: IAssemblyState): IToolCall[] {\n return [...buildToolCalls(state.toolCallParts), ...state.projectedToolCalls];\n}\n\nfunction buildToolCalls(toolCallParts: Map<number, IToolCallPart>): IToolCall[] {\n return Array.from(toolCallParts.entries())\n .sort(([left], [right]) => left - right)\n .map(([index, toolCall]) => ({\n id: toolCall.id || `call_${index}`,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: toolCall.arguments || '{}',\n },\n }));\n}\n\nasync function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done) break;\n await yieldToMacrotask(signal);\n if (signal?.aborted) break;\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) return iterator.next();\n if (signal.aborted) return { done: true, value: undefined as T };\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n\nasync function yieldToMacrotask(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return;\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n","import type { TProviderNativeRawPayloadCallback } from '@robota-sdk/agent-core';\n\nexport interface IObserveProviderNativeRawPayloadStreamOptions {\n provider: string;\n apiSurface?: string;\n onProviderNativeRawPayload?: TProviderNativeRawPayloadCallback;\n initialSequence?: number;\n}\n\nexport async function* observeProviderNativeRawPayloadStream<TPayload extends object>(\n stream: AsyncIterable<TPayload>,\n options: IObserveProviderNativeRawPayloadStreamOptions,\n): AsyncIterable<TPayload> {\n let sequence = options.initialSequence ?? 0;\n for await (const payload of stream) {\n options.onProviderNativeRawPayload?.({\n provider: options.provider,\n ...(options.apiSurface !== undefined && { apiSurface: options.apiSurface }),\n payloadKind: 'stream_event',\n sequence,\n payload,\n });\n sequence++;\n yield payload;\n }\n}\n","import type { IProviderProfileConfig, IProviderProbeResult } from '@robota-sdk/agent-core';\n\nexport interface IOpenAICompatibleModelsResponse {\n data?: Array<{ id?: string }>;\n}\n\nexport interface IOpenAICompatibleFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IOpenAICompatibleModelsResponse>;\n}\n\nexport type TOpenAICompatibleFetch = (url: string) => Promise<IOpenAICompatibleFetchResponse>;\n\nexport async function probeOpenAICompatibleProfile(\n profile: IProviderProfileConfig,\n fetcher: TOpenAICompatibleFetch = defaultOpenAICompatibleFetch,\n): Promise<IProviderProbeResult> {\n if (!profile.baseURL) {\n return { ok: true, message: 'Profile fields are valid; no endpoint probe configured.' };\n }\n\n try {\n const response = await fetcher(`${profile.baseURL.replace(/\\/$/, '')}/models`);\n if (!response.ok) {\n return { ok: false, message: `HTTP ${response.status}` };\n }\n const body = await response.json();\n const models = (body.data ?? []).map((item) => item.id).filter((id): id is string => !!id);\n return { ok: true, message: `${models.length} model(s) discovered`, models };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n}\n\nasync function defaultOpenAICompatibleFetch(url: string): Promise<IOpenAICompatibleFetchResponse> {\n const response = await fetch(url);\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IOpenAICompatibleModelsResponse>,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openai-compatible-Dm4Sof9e.js","names":["exhaustive"],"sources":["../../src/shared/openai-compatible/message-converter.ts","../../src/shared/openai-compatible/response-parser.ts","../../src/shared/openai-compatible/stream-assembler.ts","../../src/shared/openai-compatible/native-payload-observer.ts","../../src/shared/openai-compatible/endpoint-probe.ts"],"sourcesContent":["import type {\n IAssistantMessage,\n IToolCall,\n IToolSchema,\n TUniversalMessage,\n} from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\nexport function convertToOpenAICompatibleMessages(\n messages: TUniversalMessage[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((message) => convertMessage(message));\n}\n\nexport function convertToOpenAICompatibleTools(\n tools: IToolSchema[],\n): OpenAI.Chat.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n}\n\nfunction convertMessage(message: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: message.content || '',\n };\n }\n\n if (message.role === 'assistant') {\n return convertAssistantMessage(message);\n }\n\n if (message.role === 'system') {\n return {\n role: 'system',\n content: message.content || '',\n };\n }\n\n if (message.role === 'tool') {\n if (!message.toolCallId || message.toolCallId.trim().length === 0) {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(message)}`);\n }\n return {\n role: 'tool',\n content: message.content || '',\n tool_call_id: message.toolCallId,\n };\n }\n\n const exhaustive: never = message;\n throw new Error(`Unsupported message role: ${JSON.stringify(exhaustive)}`);\n}\n\nfunction convertAssistantMessage(\n message: IAssistantMessage,\n): OpenAI.Chat.ChatCompletionAssistantMessageParam {\n if (message.toolCalls && message.toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: message.content === '' ? null : message.content || null,\n tool_calls: message.toolCalls.map((toolCall: IToolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })),\n };\n }\n\n return {\n role: 'assistant',\n content: message.content === null ? null : message.content || '',\n };\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { SilentLogger } from '@robota-sdk/agent-core';\n\nimport type {\n IOpenAICompatibleToolCallTextProjector,\n IOpenAICompatibleToolCallTextProjection,\n TOpenAICompatibleTextProjector,\n} from './types';\nimport type { ILogger, IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\nexport interface IOpenAICompatibleResponseParserOptions {\n logger?: ILogger;\n textProjector?: TOpenAICompatibleTextProjector;\n toolCallTextProjector?: IOpenAICompatibleToolCallTextProjector;\n}\n\nexport class OpenAICompatibleResponseParser {\n private readonly logger: ILogger;\n private readonly textProjector?: TOpenAICompatibleTextProjector;\n private readonly toolCallTextProjector?: IOpenAICompatibleToolCallTextProjector;\n\n constructor(options: IOpenAICompatibleResponseParserOptions = {}) {\n this.logger = options.logger ?? SilentLogger;\n this.textProjector = options.textProjector;\n this.toolCallTextProjector = options.toolCallTextProjector;\n }\n\n parseResponse(response: OpenAI.Chat.ChatCompletion): TUniversalMessage {\n try {\n const choice = response.choices?.[0];\n if (!choice) {\n throw new Error('No choices found in OpenAI-compatible response');\n }\n\n return this.parseChoice(choice, response.usage);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'OpenAI-compatible response parsing failed';\n this.logger.error('Response parsing failed', { error: message });\n throw new Error(`OpenAI-compatible response parsing failed: ${message}`);\n }\n }\n\n private parseChoice(\n choice: OpenAI.Chat.ChatCompletion.Choice,\n usage: OpenAI.CompletionUsage | undefined,\n ): TUniversalMessage {\n const message = choice.message;\n const toolTextProjection = this.projectToolCallText(message.content || '');\n const toolTextFlush = this.toolCallTextProjector?.flush();\n const nativeToolCalls = this.parseNativeToolCalls(message);\n const projectedToolCalls = [\n ...toolTextProjection.toolCalls,\n ...(toolTextFlush?.toolCalls ?? []),\n ];\n const toolCalls = [...nativeToolCalls, ...projectedToolCalls];\n\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: this.projectText(\n toolTextProjection.visibleText + (toolTextFlush?.visibleText ?? ''),\n ),\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n ...(usage && { usage: this.parseUsage(usage) }),\n metadata: {\n finishReason: choice.finish_reason || undefined,\n ...this.buildToolTextMetadata(toolTextProjection, toolTextFlush),\n },\n };\n }\n\n private parseNativeToolCalls(message: OpenAI.Chat.ChatCompletionMessage): IToolCall[] {\n return (\n message.tool_calls?.map((toolCall) => ({\n id: toolCall.id,\n type: 'function' as const,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })) || []\n );\n }\n\n private parseUsage(usage: OpenAI.CompletionUsage): {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n } {\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n parseStreamingChunk(chunk: OpenAI.Chat.ChatCompletionChunk): TUniversalMessage | null {\n try {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return null;\n }\n\n const finishReason = choice.finish_reason;\n const toolCalls = choice.delta.tool_calls?.map((toolCall) => ({\n id: toolCall.id || '',\n type: 'function' as const,\n function: {\n name: toolCall.function?.name || '',\n arguments: toolCall.function?.arguments || '',\n },\n }));\n\n if (toolCalls) {\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n toolCalls,\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n }\n\n return {\n id: randomUUID(),\n state: 'complete',\n role: 'assistant',\n content: this.projectText(choice.delta.content || ''),\n timestamp: new Date(),\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'OpenAI-compatible chunk parsing failed';\n this.logger.error('Chunk parsing failed', { error: message });\n throw new Error(`OpenAI-compatible chunk parsing failed: ${message}`);\n }\n }\n\n private projectText(text: string): string {\n return this.textProjector ? this.textProjector(text) : text;\n }\n\n private projectToolCallText(text: string): IOpenAICompatibleToolCallTextProjection {\n return (\n this.toolCallTextProjector?.project(text) ?? {\n visibleText: text,\n toolCalls: [],\n removedToolCallText: false,\n }\n );\n }\n\n private buildToolTextMetadata(\n projection: IOpenAICompatibleToolCallTextProjection,\n flush: IOpenAICompatibleToolCallTextProjection | undefined,\n ): Record<string, string | boolean | undefined> {\n const rawToolCallText = [projection.rawToolCallText, flush?.rawToolCallText]\n .filter((text): text is string => typeof text === 'string' && text.length > 0)\n .join('');\n const removedToolCallText =\n projection.removedToolCallText || (flush?.removedToolCallText ?? false);\n\n return {\n ...(removedToolCallText && { toolCallTextProjected: true }),\n ...(rawToolCallText.length > 0 && { rawToolCallText }),\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type {\n IOpenAICompatibleToolCallTextProjection,\n IOpenAICompatibleStreamAssemblyOptions,\n TOpenAICompatibleTextProjector,\n} from './types';\nimport type { IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type OpenAI from 'openai';\n\ninterface IToolCallPart {\n id: string;\n name: string;\n arguments: string;\n}\n\ninterface IAssemblyState {\n textParts: string[];\n toolCallParts: Map<number, IToolCallPart>;\n projectedToolCalls: IToolCall[];\n rawToolCallTextParts: string[];\n toolCallTextProjected: boolean;\n model: string;\n finishReason: string | null;\n}\n\nexport async function assembleOpenAICompatibleStream(\n options: IOpenAICompatibleStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IAssemblyState = {\n textParts: [],\n toolCallParts: new Map(),\n projectedToolCalls: [],\n rawToolCallTextParts: [],\n toolCallTextProjected: false,\n model: '',\n finishReason: null,\n };\n\n for await (const chunk of streamWithAbort(options.stream, options.signal)) {\n applyChunk(state, chunk, options);\n }\n applyProjectedTextFlush(state, options);\n\n return buildMessage(state, options.metadata);\n}\n\nfunction applyChunk(\n state: IAssemblyState,\n chunk: OpenAI.Chat.ChatCompletionChunk,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n state.finishReason = choice.finish_reason ?? state.finishReason;\n applyTextDelta(state, choice.delta.content, options);\n applyToolCallDeltas(state, choice.delta.tool_calls ?? []);\n}\n\nfunction applyTextDelta(\n state: IAssemblyState,\n content: string | null | undefined,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n if (!content) {\n return;\n }\n\n const toolProjection = projectToolCallText(content, options.toolCallTextProjector);\n applyToolCallTextProjection(state, toolProjection);\n const visibleContent = projectText(toolProjection.visibleText, options.textProjector);\n if (visibleContent.length === 0) {\n return;\n }\n\n state.textParts.push(visibleContent);\n options.onTextDelta?.(visibleContent);\n}\n\nfunction projectText(text: string, projector?: TOpenAICompatibleTextProjector): string {\n return projector ? projector(text) : text;\n}\n\nfunction applyProjectedTextFlush(\n state: IAssemblyState,\n options: IOpenAICompatibleStreamAssemblyOptions,\n): void {\n const toolProjection = options.toolCallTextProjector?.flush();\n if (toolProjection) {\n applyToolCallTextProjection(state, toolProjection);\n const visibleToolText = projectText(toolProjection.visibleText, options.textProjector);\n if (visibleToolText.length > 0) {\n state.textParts.push(visibleToolText);\n options.onTextDelta?.(visibleToolText);\n }\n }\n\n const visibleContent = options.textProjectorFlush?.();\n if (!visibleContent) {\n return;\n }\n\n state.textParts.push(visibleContent);\n options.onTextDelta?.(visibleContent);\n}\n\nfunction projectToolCallText(\n text: string,\n projector: IOpenAICompatibleStreamAssemblyOptions['toolCallTextProjector'],\n): IOpenAICompatibleToolCallTextProjection {\n return (\n projector?.project(text) ?? {\n visibleText: text,\n toolCalls: [],\n removedToolCallText: false,\n }\n );\n}\n\nfunction applyToolCallTextProjection(\n state: IAssemblyState,\n projection: IOpenAICompatibleToolCallTextProjection,\n): void {\n if (projection.toolCalls.length > 0) {\n state.projectedToolCalls.push(...projection.toolCalls);\n }\n if (projection.removedToolCallText) {\n state.toolCallTextProjected = true;\n }\n if (projection.rawToolCallText && projection.rawToolCallText.length > 0) {\n state.rawToolCallTextParts.push(projection.rawToolCallText);\n }\n}\n\nfunction applyToolCallDeltas(\n state: IAssemblyState,\n deltas: OpenAI.Chat.ChatCompletionChunk.Choice.Delta.ToolCall[],\n): void {\n for (const delta of deltas) {\n const index = delta.index ?? 0;\n const current = state.toolCallParts.get(index) ?? { id: '', name: '', arguments: '' };\n const nextName = delta.function?.name ?? current.name;\n state.toolCallParts.set(index, {\n id: delta.id ?? current.id,\n name: nextName,\n arguments: current.arguments + (delta.function?.arguments ?? ''),\n });\n }\n}\n\nfunction buildMessage(\n state: IAssemblyState,\n metadata: Record<string, string | number | boolean> = {},\n): TUniversalMessage {\n const resultMetadata: NonNullable<TUniversalMessage['metadata']> = { ...metadata };\n if (state.model) {\n resultMetadata['model'] = state.model;\n }\n if (state.finishReason) {\n resultMetadata['finishReason'] = state.finishReason;\n }\n if (state.toolCallTextProjected) {\n resultMetadata['toolCallTextProjected'] = true;\n }\n if (state.rawToolCallTextParts.length > 0) {\n resultMetadata['rawToolCallText'] = state.rawToolCallTextParts.join('');\n }\n\n const toolCalls = buildAllToolCalls(state);\n\n return {\n id: randomUUID(),\n role: 'assistant',\n content: state.textParts.join(''),\n state: 'complete',\n timestamp: new Date(),\n ...(toolCalls.length > 0 && { toolCalls }),\n ...(Object.keys(resultMetadata).length > 0 && { metadata: resultMetadata }),\n };\n}\n\nfunction buildAllToolCalls(state: IAssemblyState): IToolCall[] {\n return [...buildToolCalls(state.toolCallParts), ...state.projectedToolCalls];\n}\n\nfunction buildToolCalls(toolCallParts: Map<number, IToolCallPart>): IToolCall[] {\n return Array.from(toolCallParts.entries())\n .sort(([left], [right]) => left - right)\n .map(([index, toolCall]) => ({\n id: toolCall.id || `call_${index}`,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: toolCall.arguments || '{}',\n },\n }));\n}\n\nasync function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done) break;\n await yieldToMacrotask(signal);\n if (signal?.aborted) break;\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) return iterator.next();\n if (signal.aborted) return { done: true, value: undefined as T };\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) signal.removeEventListener('abort', abortListener);\n }\n}\n\nasync function yieldToMacrotask(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return;\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n","import type { TProviderNativeRawPayloadCallback } from '@robota-sdk/agent-core';\n\nexport interface IObserveProviderNativeRawPayloadStreamOptions {\n provider: string;\n apiSurface?: string;\n onProviderNativeRawPayload?: TProviderNativeRawPayloadCallback;\n initialSequence?: number;\n}\n\nexport async function* observeProviderNativeRawPayloadStream<TPayload extends object>(\n stream: AsyncIterable<TPayload>,\n options: IObserveProviderNativeRawPayloadStreamOptions,\n): AsyncIterable<TPayload> {\n let sequence = options.initialSequence ?? 0;\n for await (const payload of stream) {\n options.onProviderNativeRawPayload?.({\n provider: options.provider,\n ...(options.apiSurface !== undefined && { apiSurface: options.apiSurface }),\n payloadKind: 'stream_event',\n sequence,\n payload,\n });\n sequence++;\n yield payload;\n }\n}\n","import type { IProviderProfileConfig, IProviderProbeResult } from '@robota-sdk/agent-core';\n\nexport interface IOpenAICompatibleModelsResponse {\n data?: Array<{ id?: string }>;\n}\n\nexport interface IOpenAICompatibleFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IOpenAICompatibleModelsResponse>;\n}\n\nexport type TOpenAICompatibleFetch = (url: string) => Promise<IOpenAICompatibleFetchResponse>;\n\nexport async function probeOpenAICompatibleProfile(\n profile: IProviderProfileConfig,\n fetcher: TOpenAICompatibleFetch = defaultOpenAICompatibleFetch,\n): Promise<IProviderProbeResult> {\n if (!profile.baseURL) {\n return { ok: true, message: 'Profile fields are valid; no endpoint probe configured.' };\n }\n\n try {\n const response = await fetcher(`${profile.baseURL.replace(/\\/$/, '')}/models`);\n if (!response.ok) {\n return { ok: false, message: `HTTP ${response.status}` };\n }\n const body = await response.json();\n const models = (body.data ?? []).map((item) => item.id).filter((id): id is string => !!id);\n return { ok: true, message: `${models.length} model(s) discovered`, models };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n}\n\nasync function defaultOpenAICompatibleFetch(url: string): Promise<IOpenAICompatibleFetchResponse> {\n const response = await fetch(url);\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IOpenAICompatibleModelsResponse>,\n };\n}\n"],"mappings":"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"}
|
package/dist/node/qwen/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../qwen-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../qwen-DxNnm7Le.cjs`);exports.DEFAULT_QWEN_PROVIDER_API_KEY_ENV=e.i,exports.DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE=e.a,exports.DEFAULT_QWEN_PROVIDER_BASE_URL=e.o,exports.DEFAULT_QWEN_PROVIDER_MODEL=e.s,exports.DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL=e.c,exports.QWEN_MODEL_LAST_VERIFIED_AT=e.l,exports.QWEN_MODEL_SOURCE_URL=e.u,exports.QWEN_PROVIDER_BASE_URLS=e.d,exports.QWEN_PROVIDER_RESPONSES_BASE_URLS=e.f,exports.QwenProvider=e.r,exports.createQwenProviderDefinition=e.t,exports.refreshQwenModelCatalog=e.n;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as IQwenResponsesWebExtractorTool, B as TQwenResponsesStreamEvent, C as IQwenResponsesRequestStreaming, D as IQwenResponsesToolUsageCount, E as IQwenResponsesTextDeltaEvent, F as TQwenBuiltInWebToolName, G as DEFAULT_QWEN_PROVIDER_MODEL, H as DEFAULT_QWEN_PROVIDER_API_KEY_ENV, I as TQwenMessagesToResponsesInput, J as QWEN_MODEL_SOURCE_URL, K as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, L as TQwenProviderOptionValue, M as IQwenResponsesWebSearchEvent, N as IQwenResponsesWebSearchOutputItem, O as IQwenResponsesUsage, P as IQwenResponsesWebSearchTool, Q as TQwenProviderResponsesRegion, R as TQwenResponsesInputItem, S as IQwenResponsesRequestNonStreaming, T as IQwenResponsesTextContent, U as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, V as TQwenResponsesTool, W as DEFAULT_QWEN_PROVIDER_BASE_URL, X as QWEN_PROVIDER_RESPONSES_BASE_URLS, Y as QWEN_PROVIDER_BASE_URLS, Z as TQwenProviderRegion, _ as IQwenResponsesGenericOutputItem, a as refreshQwenModelCatalog, b as IQwenResponsesOutputItemDoneEvent, c as IQwenBuiltInWebToolsOptions, d as IQwenResponsesErrorEvent, f as IQwenResponsesFunctionCallInput, g as IQwenResponsesGenericEvent, h as IQwenResponsesFunctionTool, i as TQwenFetch, j as IQwenResponsesWebSearchAction, k as IQwenResponsesWebExtractorOutputItem, l as IQwenProviderOptions, m as IQwenResponsesFunctionCallOutputItem, n as IQwenFetchResponse, o as createQwenProviderDefinition, p as IQwenResponsesFunctionCallOutputInput, q as QWEN_MODEL_LAST_VERIFIED_AT, r as IQwenModelsResponse, s as QwenProvider, t as IQwenFetchInit, u as IQwenResponsesCompletedEvent, v as IQwenResponsesMessageInput, w as IQwenResponsesResponse, x as IQwenResponsesRequestBase, y as IQwenResponsesMessageOutputItem, z as TQwenResponsesOutputItem } from "../index-
|
|
1
|
+
import { A as IQwenResponsesWebExtractorTool, B as TQwenResponsesStreamEvent, C as IQwenResponsesRequestStreaming, D as IQwenResponsesToolUsageCount, E as IQwenResponsesTextDeltaEvent, F as TQwenBuiltInWebToolName, G as DEFAULT_QWEN_PROVIDER_MODEL, H as DEFAULT_QWEN_PROVIDER_API_KEY_ENV, I as TQwenMessagesToResponsesInput, J as QWEN_MODEL_SOURCE_URL, K as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, L as TQwenProviderOptionValue, M as IQwenResponsesWebSearchEvent, N as IQwenResponsesWebSearchOutputItem, O as IQwenResponsesUsage, P as IQwenResponsesWebSearchTool, Q as TQwenProviderResponsesRegion, R as TQwenResponsesInputItem, S as IQwenResponsesRequestNonStreaming, T as IQwenResponsesTextContent, U as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, V as TQwenResponsesTool, W as DEFAULT_QWEN_PROVIDER_BASE_URL, X as QWEN_PROVIDER_RESPONSES_BASE_URLS, Y as QWEN_PROVIDER_BASE_URLS, Z as TQwenProviderRegion, _ as IQwenResponsesGenericOutputItem, a as refreshQwenModelCatalog, b as IQwenResponsesOutputItemDoneEvent, c as IQwenBuiltInWebToolsOptions, d as IQwenResponsesErrorEvent, f as IQwenResponsesFunctionCallInput, g as IQwenResponsesGenericEvent, h as IQwenResponsesFunctionTool, i as TQwenFetch, j as IQwenResponsesWebSearchAction, k as IQwenResponsesWebExtractorOutputItem, l as IQwenProviderOptions, m as IQwenResponsesFunctionCallOutputItem, n as IQwenFetchResponse, o as createQwenProviderDefinition, p as IQwenResponsesFunctionCallOutputInput, q as QWEN_MODEL_LAST_VERIFIED_AT, r as IQwenModelsResponse, s as QwenProvider, t as IQwenFetchInit, u as IQwenResponsesCompletedEvent, v as IQwenResponsesMessageInput, w as IQwenResponsesResponse, x as IQwenResponsesRequestBase, y as IQwenResponsesMessageOutputItem, z as TQwenResponsesOutputItem } from "../index-CjPeNJ1G.js";
|
|
2
2
|
export { DEFAULT_QWEN_PROVIDER_API_KEY_ENV, DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, DEFAULT_QWEN_PROVIDER_BASE_URL, DEFAULT_QWEN_PROVIDER_MODEL, DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, IQwenBuiltInWebToolsOptions, IQwenFetchInit, IQwenFetchResponse, IQwenModelsResponse, IQwenProviderOptions, IQwenResponsesCompletedEvent, IQwenResponsesErrorEvent, IQwenResponsesFunctionCallInput, IQwenResponsesFunctionCallOutputInput, IQwenResponsesFunctionCallOutputItem, IQwenResponsesFunctionTool, IQwenResponsesGenericEvent, IQwenResponsesGenericOutputItem, IQwenResponsesMessageInput, IQwenResponsesMessageOutputItem, IQwenResponsesOutputItemDoneEvent, IQwenResponsesRequestBase, IQwenResponsesRequestNonStreaming, IQwenResponsesRequestStreaming, IQwenResponsesResponse, IQwenResponsesTextContent, IQwenResponsesTextDeltaEvent, IQwenResponsesToolUsageCount, IQwenResponsesUsage, IQwenResponsesWebExtractorOutputItem, IQwenResponsesWebExtractorTool, IQwenResponsesWebSearchAction, IQwenResponsesWebSearchEvent, IQwenResponsesWebSearchOutputItem, IQwenResponsesWebSearchTool, QWEN_MODEL_LAST_VERIFIED_AT, QWEN_MODEL_SOURCE_URL, QWEN_PROVIDER_BASE_URLS, QWEN_PROVIDER_RESPONSES_BASE_URLS, QwenProvider, TQwenBuiltInWebToolName, TQwenFetch, TQwenMessagesToResponsesInput, TQwenProviderOptionValue, TQwenProviderRegion, TQwenProviderResponsesRegion, TQwenResponsesInputItem, TQwenResponsesOutputItem, TQwenResponsesStreamEvent, TQwenResponsesTool, createQwenProviderDefinition, refreshQwenModelCatalog };
|
package/dist/node/qwen/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"../qwen-
|
|
1
|
+
import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,r as c,s as l,t as u,u as d}from"../qwen-D8gtsbsC.js";export{i as DEFAULT_QWEN_PROVIDER_API_KEY_ENV,e as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,s as DEFAULT_QWEN_PROVIDER_BASE_URL,l as DEFAULT_QWEN_PROVIDER_MODEL,t as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,a as QWEN_MODEL_LAST_VERIFIED_AT,d as QWEN_MODEL_SOURCE_URL,n as QWEN_PROVIDER_BASE_URLS,r as QWEN_PROVIDER_RESPONSES_BASE_URLS,c as QwenProvider,u as createQwenProviderDefinition,o as refreshQwenModelCatalog};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./openai-compatible-Dm4Sof9e.js";import{randomUUID as o}from"node:crypto";import{AbstractAIProvider as s,SilentLogger as c}from"@robota-sdk/agent-core";import l from"openai";const u={singapore:`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/compatible-mode/v1`,hongKong:`https://cn-hongkong.dashscope.aliyuncs.com/compatible-mode/v1`},d={singapore:`https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`},f=`qwen-plus`,p=`DASHSCOPE_API_KEY`,m=`$ENV:${p}`,h=u.singapore,g=d.singapore,_=`https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope`,v=`2026-05-04`,y=`qwen-responses`;function b(e){let t=e.builtInWebTools,n=t?.webSearch===!0||t?.webFetch===!0,r=t?.webFetch===!0;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:n?{supported:!0,enabled:!0,source:y}:{supported:!0,enabled:!1,source:y,reason:`Enable builtInWebTools.webSearch or builtInWebTools.webFetch.`},webFetch:r?{supported:!0,enabled:!0,source:y}:{supported:!0,enabled:!1,source:y,reason:`Enable builtInWebTools.webFetch.`}}}}async function x(e,t,r){try{return r.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:t}),i({stream:n(await e.chat.completions.create(t,r.signal?{signal:r.signal}:void 0),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:r.onProviderNativeRawPayload}),onTextDelta:r.onTextDelta,signal:r.signal})}catch(e){let t=e.message||`Qwen streaming request failed`;throw Error(`Qwen stream failed: ${t}`)}}function S(e){let t=[];return(e?.webSearch===!0||e?.webFetch===!0)&&t.push(`web_search`),e?.webFetch===!0&&t.push(`web_extractor`),t}function C(e){return S(e).length>0}function w(e){return e.flatMap(e=>D(e))}function T(e,t){let n=[...e.map(e=>({type:e})),...E(t)];return n.length>0?n:void 0}function E(e){return e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))??[]}function D(e){return e.role===`user`?[k(`user`,e.content)]:e.role===`system`?[k(`system`,e.content)]:e.role===`tool`?[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]:O(e)}function O(e){let t=[];e.content&&e.content.length>0&&t.push(k(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(k(`assistant`,``)),t}function k(e,t){return{role:e,content:t??``}}async function*ee(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await te(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function te(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function ne(e,t){let n=e.output??[],r=I(n,e.usage),i=V(n);return N({content:e.output_text??W(n),toolCalls:i,response:e,usage:r,enabledBuiltInTools:t.enabledBuiltInTools})}async function re(e){let t={textParts:[],toolCalls:[],usage:z()};for await(let n of ee(e.stream,e.signal))A(t,n,e.onTextDelta);return t.completedResponse===void 0?N({content:t.textParts.join(``),toolCalls:t.toolCalls,usage:t.usage,enabledBuiltInTools:e.enabledBuiltInTools}):j(t,e.enabledBuiltInTools)}function A(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,R(e.usage,I(t.response.output??[],t.response.usage));return}if(t.type===`response.output_item.done`){M(e,t.item);return}if(t.type===`response.web_search_call.completed`){e.usage.webSearchCalls+=1;return}if(t.type===`response.error`||t.type===`response.failed`)throw Error(`Qwen Responses API failed: ${G(t)}`)}function j(e,t){let n=e.completedResponse;if(n===void 0)throw Error(`Qwen Responses stream completed without response metadata`);let r=n.output??[],i=V(r),a=e.textParts.length>0?e.textParts.join(``):n.output_text??W(r),o=I(r,n.usage);return R(o,e.usage),N({content:a,toolCalls:i.length>0?i:e.toolCalls,response:n,usage:o,enabledBuiltInTools:t})}function M(e,t){if(t.type===`function_call`){H(t)&&e.toolCalls.push(U(t));return}R(e.usage,I([t],void 0))}function N(e){return{id:o(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:{promptTokens:e.response.usage.input_tokens??0,completionTokens:e.response.usage.output_tokens??0,totalTokens:e.response.usage.total_tokens??0}},metadata:P(e.enabledBuiltInTools,e.usage,e.response)}}function P(e,t,n){let r=F(t);return{providerToolMode:`qwen_responses`,providerBuiltInToolsEnabled:[...e],...r.length>0&&{providerBuiltInToolsUsed:r},qwenWebSearchCalls:t.webSearchCalls,qwenWebExtractorCalls:t.webExtractorCalls,...t.unsupportedToolTypes.size>0&&{qwenUnsupportedProviderToolTypes:[...t.unsupportedToolTypes].sort()},...n?.id!==void 0&&{responseId:n.id},...n?.model!==void 0&&{model:n.model},...n?.status!==void 0&&{finishReason:n.status}}}function F(e){let t=[];return e.webSearchCalls>0&&t.push(`web_search`),e.webExtractorCalls>0&&t.push(`web_extractor`),t}function I(e,t){let n=z();for(let t of e)t.type===`web_search_call`?n.webSearchCalls+=1:t.type===`web_extractor_call`?n.webExtractorCalls+=1:B(t.type)&&n.unsupportedToolTypes.add(t.type);return L(n,t),n}function L(e,t){let n=t?.x_tools;if(n!==void 0){e.webSearchCalls=Math.max(e.webSearchCalls,n.web_search?.count??0),e.webExtractorCalls=Math.max(e.webExtractorCalls,n.web_extractor?.count??0);for(let t of Object.keys(n))t!==`web_search`&&t!==`web_extractor`&&e.unsupportedToolTypes.add(t)}}function R(e,t){e.webSearchCalls=Math.max(e.webSearchCalls,t.webSearchCalls),e.webExtractorCalls=Math.max(e.webExtractorCalls,t.webExtractorCalls);for(let n of t.unsupportedToolTypes)e.unsupportedToolTypes.add(n)}function z(){return{webSearchCalls:0,webExtractorCalls:0,unsupportedToolTypes:new Set}}function B(e){return e.endsWith(`_call`)&&e!==`function_call`}function V(e){return e.filter(H).map(e=>U(e))}function H(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function U(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function W(e){return e.filter(e=>e.type===`message`).flatMap(e=>e.content).map(e=>e.text).join(``)}function G(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function ie(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return q({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=J(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`response`,payload:n}),ne(n,{enabledBuiltInTools:S(e.builtInWebTools)})}catch(e){let t=e.message||`Qwen Responses API request failed`;throw Error(`Qwen responses failed: ${t}`)}}async function*K(e){let t=[],n=await q({...e,chatOptions:{...e.chatOptions,onTextDelta:n=>{e.chatOptions?.onTextDelta?.(n),t.push(ae(n))}}});for(let e of t)yield e;yield{...n,content:``,metadata:{...n.metadata,isStreamChunk:!0,isComplete:!0}}}async function q(e){if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=Y(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t}),re({stream:n(await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`qwen`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),enabledBuiltInTools:S(e.builtInWebTools),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`Qwen Responses streaming request failed`;throw Error(`Qwen responses stream failed: ${t}`)}}function J(e){let t=e.chatOptions?.model??e.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=T(S(e.builtInWebTools),e.chatOptions?.tools);return{model:t,input:w(e.messages),...n!==void 0&&{tools:n},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...e.builtInWebTools?.enableThinking!==void 0&&{enable_thinking:e.builtInWebTools.enableThinking}}}function Y(e){return{...J(e),stream:!0}}function ae(e){return{id:o(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:!1}}}var X=class extends s{name=`qwen`;version=`1.0.0`;client;responsesClient;options;responseParser;onTextDelta;constructor(e){if(super(e.logger||c),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client,this.responsesClient=e.client;else if(e.apiKey)this.client=new l({apiKey:e.apiKey,baseURL:e.baseURL??h,...e.timeout!==void 0&&{timeout:e.timeout}}),this.responsesClient=new l({apiKey:e.apiKey,baseURL:e.responsesBaseURL??g,...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Qwen client, apiKey, or executor is required`);this.responseParser=new t({logger:this.logger})}async chat(e,t){return this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor?this.chatViaExecutor(e,t):this.shouldUseResponsesApi()?this.chatViaResponsesApi(e,t,this.getResponsesClient()):this.chatViaChatCompletions(e,t,this.getClient())}async chatViaExecutor(e,t){try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Qwen Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}}async chatViaResponsesApi(e,t,n){return this.validateTools(t?.tools),ie({client:n,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta})}async chatViaChatCompletions(e,t,n){try{let r=this.buildRequestParams(e,t),i=t?.onTextDelta??this.onTextDelta;if(i)return x(n,{...r,stream:!0},{...t,onTextDelta:i});t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let a=await n.chat.completions.create(r);return t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`response`,payload:a}),this.responseParser.parseResponse(a)}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen chat failed: ${t}`)}}async*chatStream(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`Qwen Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);if(this.shouldUseResponsesApi()){this.validateTools(t?.tools),yield*K({client:this.responsesClient,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta});return}try{let r=this.buildStreamingRequestParams(e,t);t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=n(await this.client.chat.completions.create(r),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(i,t?.signal)){let t=this.responseParser.parseStreamingChunk(e);t&&(yield t)}}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen stream failed: ${t}`)}}supportsTools(){return!0}getCapabilities(){return b(this.options)}validateConfig(){return!!this.client&&!!this.options&&(!this.shouldUseResponsesApi()||!!this.responsesClient)}async dispose(){}buildRequestParams(t,n){this.validateTools(n?.tools);let i=n?.model??this.options.defaultModel;if(!i)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return{model:i,messages:e(t),...n?.temperature!==void 0&&{temperature:n.temperature},...n?.maxTokens!==void 0&&{max_tokens:n.maxTokens},...n?.tools&&{tools:r(n.tools),tool_choice:`auto`}}}buildStreamingRequestParams(e,t){return{...this.buildRequestParams(e,t),stream:!0}}shouldUseResponsesApi(){return C(this.options.builtInWebTools)}getClient(){if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);return this.client}getResponsesClient(){if(!this.responsesClient)throw Error(`Qwen Responses client not available for built-in web tools.`);return this.responsesClient}};async function Z(e,t=le){let n=await t(`${ce(e.baseURL??h)}/models`,oe(e.apiKey));if(!n.ok)return{status:`unavailable`,sourceUrl:_,message:`Qwen model refresh failed: HTTP ${n.status}`};let r=((await n.json()).data??[]).map(e=>e.id).filter(e=>typeof e==`string`&&e.length>0).map(se);return{status:`live`,sourceUrl:_,lastVerifiedAt:v,entries:r,message:`Loaded ${r.length} models from Qwen API`}}function oe(e){if(e)return{headers:{Authorization:`Bearer ${e}`}}}function se(e){return{id:e,displayName:e,lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v}}function ce(e){return e.replace(/\/$/,``)}async function le(e,t){let n=await fetch(e,{...t?.headers!==void 0&&{headers:t.headers}});return{ok:n.ok,status:n.status,json:()=>n.json()}}const ue=[{kind:`api-key`,label:`Alibaba Cloud Model Studio API keys`,url:`https://modelstudio.console.alibabacloud.com/?tab=api#/api-key`,sourceUrl:`https://www.alibabacloud.com/help/en/model-studio/get-api-key`,lastVerifiedAt:`2026-05-08`}],Q={status:`fallback`,sourceUrl:_,lastVerifiedAt:v,entries:[{id:f,displayName:`Qwen Plus`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v},{id:`qwen-max`,displayName:`Qwen Max`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v},{id:`qwen-flash`,displayName:`Qwen Flash`,capabilities:[`tools`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v}]};function de(){return{type:`qwen`,displayName:`Qwen`,description:`Alibaba Cloud Model Studio OpenAI-compatible endpoint`,defaults:{model:f,apiKey:m,baseURL:h},modelCatalog:Q,refreshModelCatalog:({profile:e})=>Z(e),modelCatalogCacheTtlSeconds:86400,setupHelpLinks:ue,setupSteps:[{key:`baseURL`,title:`Qwen OpenAI-compatible base URL`,defaultValue:h},{key:`model`,title:`Qwen model`,defaultValue:f},{key:`apiKey`,title:`Qwen Model Studio API key`,defaultValue:m,masked:!0}],requiresApiKey:!0,probeProfile:a,createProvider:e=>{let t=pe(e.options);return new X({apiKey:fe(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...t.responsesBaseURL!==void 0&&{responsesBaseURL:t.responsesBaseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t.builtInWebTools!==void 0&&{builtInWebTools:t.builtInWebTools},defaultModel:e.model})}}}function fe(e){if(!e)throw Error(`Provider qwen requires apiKey`);return e}function pe(e){let t=me(he(e?.builtInWebTools)),n=ge(e?.responsesBaseURL);return{...n!==void 0&&{responsesBaseURL:n},...t!==void 0&&{builtInWebTools:t}}}function me(e){if(e!==void 0)return{...$(e.webSearch)!==void 0&&{webSearch:$(e.webSearch)},...$(e.webFetch)!==void 0&&{webFetch:$(e.webFetch)},...$(e.enableThinking)!==void 0&&{enableThinking:$(e.enableThinking)}}}function he(e){if(!(e==null||e instanceof Date||Array.isArray(e)))return typeof e==`object`?e:void 0}function $(e){return typeof e==`boolean`?e:void 0}function ge(e){return typeof e==`string`&&e.length>0?e:void 0}export{m as a,g as c,u as d,d as f,p as i,v as l,Z as n,h as o,X as r,f as s,de as t,_ as u};
|
|
2
|
+
//# sourceMappingURL=qwen-D8gtsbsC.js.map
|