@robota-sdk/agent-provider 3.0.0-beta.65 → 3.0.0-beta.66
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.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/index.d.ts +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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qwen-ChUZobTL.js","names":["qwenError","qwenError","qwenError"],"sources":["../../src/qwen/defaults.ts","../../src/qwen/responses-converter.ts","../../src/qwen/responses-stream-utils.ts","../../src/qwen/responses-parser.ts","../../src/qwen/responses-chat.ts","../../src/qwen/provider-capabilities.ts","../../src/qwen/provider-streaming-assembly.ts","../../src/qwen/provider.ts","../../src/qwen/model-catalog-refresh.ts","../../src/qwen/provider-definition.ts"],"sourcesContent":["export const QWEN_PROVIDER_BASE_URLS = {\n singapore: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',\n usVirginia: 'https://dashscope-us.aliyuncs.com/compatible-mode/v1',\n beijing: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n hongKong: 'https://cn-hongkong.dashscope.aliyuncs.com/compatible-mode/v1',\n} as const;\n\nexport type TQwenProviderRegion = keyof typeof QWEN_PROVIDER_BASE_URLS;\n\nexport const QWEN_PROVIDER_RESPONSES_BASE_URLS = {\n singapore: 'https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1',\n usVirginia: 'https://dashscope-us.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1',\n beijing: 'https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1',\n} as const;\n\nexport type TQwenProviderResponsesRegion = keyof typeof QWEN_PROVIDER_RESPONSES_BASE_URLS;\n\nexport const DEFAULT_QWEN_PROVIDER_MODEL = 'qwen-plus';\nexport const DEFAULT_QWEN_PROVIDER_API_KEY_ENV = 'DASHSCOPE_API_KEY';\nexport const DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE = `$ENV:${DEFAULT_QWEN_PROVIDER_API_KEY_ENV}`;\nexport const DEFAULT_QWEN_PROVIDER_BASE_URL = QWEN_PROVIDER_BASE_URLS.singapore;\nexport const DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL = QWEN_PROVIDER_RESPONSES_BASE_URLS.singapore;\n\nexport const QWEN_MODEL_SOURCE_URL =\n 'https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope';\nexport const QWEN_MODEL_LAST_VERIFIED_AT = '2026-05-04';\n","import type { IAssistantMessage, IToolSchema, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IQwenBuiltInWebToolsOptions,\n IQwenResponsesFunctionTool,\n IQwenResponsesMessageInput,\n TQwenBuiltInWebToolName,\n TQwenResponsesInputItem,\n TQwenResponsesTool,\n} from './types';\n\nexport function getQwenBuiltInWebToolNames(\n options: IQwenBuiltInWebToolsOptions | undefined,\n): TQwenBuiltInWebToolName[] {\n const tools: TQwenBuiltInWebToolName[] = [];\n if (options?.webSearch === true || options?.webFetch === true) {\n tools.push('web_search');\n }\n if (options?.webFetch === true) {\n tools.push('web_extractor');\n }\n return tools;\n}\n\nexport function hasQwenBuiltInWebTools(options: IQwenBuiltInWebToolsOptions | undefined): boolean {\n return getQwenBuiltInWebToolNames(options).length > 0;\n}\n\nexport function convertToQwenResponsesInput(\n messages: TUniversalMessage[],\n): TQwenResponsesInputItem[] {\n return messages.flatMap((message) => convertMessage(message));\n}\n\nexport function buildQwenResponsesTools(\n builtInWebTools: readonly TQwenBuiltInWebToolName[],\n localTools: IToolSchema[] | undefined,\n): TQwenResponsesTool[] | undefined {\n const tools: TQwenResponsesTool[] = [\n ...builtInWebTools.map((type) => ({ type })),\n ...convertToQwenResponsesFunctionTools(localTools),\n ];\n return tools.length > 0 ? tools : undefined;\n}\n\nfunction convertToQwenResponsesFunctionTools(\n tools: IToolSchema[] | undefined,\n): IQwenResponsesFunctionTool[] {\n return (\n tools?.map((tool) => ({\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n })) ?? []\n );\n}\n\nfunction convertMessage(message: TUniversalMessage): TQwenResponsesInputItem[] {\n if (message.role === 'user') {\n return [createMessageInput('user', message.content)];\n }\n if (message.role === 'system') {\n return [createMessageInput('system', message.content)];\n }\n if (message.role === 'tool') {\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): TQwenResponsesInputItem[] {\n const items: TQwenResponsesInputItem[] = [];\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 createMessageInput(\n role: IQwenResponsesMessageInput['role'],\n content: string | null,\n): IQwenResponsesMessageInput {\n return {\n role,\n content: 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) break;\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","import { randomUUID } from 'node:crypto';\nimport type { IToolCall, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IQwenResponsesFunctionCallOutputItem,\n IQwenResponsesErrorEvent,\n IQwenResponsesResponse,\n IQwenResponsesUsage,\n TQwenBuiltInWebToolName,\n TQwenResponsesOutputItem,\n TQwenResponsesStreamEvent,\n} from './types';\nimport { streamWithAbort } from './responses-stream-utils';\n\ninterface IQwenResponsesParseOptions {\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[];\n}\n\ninterface IQwenResponsesStreamAssemblyOptions extends IQwenResponsesParseOptions {\n stream: AsyncIterable<TQwenResponsesStreamEvent>;\n onTextDelta?: TTextDeltaCallback;\n signal?: AbortSignal;\n}\n\ninterface IQwenProviderToolUsage {\n webSearchCalls: number;\n webExtractorCalls: number;\n unsupportedToolTypes: Set<string>;\n}\n\ninterface IQwenResponsesStreamState {\n textParts: string[];\n toolCalls: IToolCall[];\n completedResponse?: IQwenResponsesResponse;\n usage: IQwenProviderToolUsage;\n}\n\nexport function parseQwenResponsesResponse(\n response: IQwenResponsesResponse,\n options: IQwenResponsesParseOptions,\n): TUniversalMessage {\n const output = response.output ?? [];\n const usage = collectProviderToolUsage(output, response.usage);\n const toolCalls = extractFunctionToolCalls(output);\n const content = response.output_text ?? extractMessageText(output);\n\n return buildAssistantMessage({\n content,\n toolCalls,\n response,\n usage,\n enabledBuiltInTools: options.enabledBuiltInTools,\n });\n}\n\nexport async function assembleQwenResponsesStream(\n options: IQwenResponsesStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IQwenResponsesStreamState = {\n textParts: [],\n toolCalls: [],\n usage: createEmptyToolUsage(),\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, options.enabledBuiltInTools);\n }\n\n return buildAssistantMessage({\n content: state.textParts.join(''),\n toolCalls: state.toolCalls,\n usage: state.usage,\n enabledBuiltInTools: options.enabledBuiltInTools,\n });\n}\n\nfunction applyStreamEvent(\n state: IQwenResponsesStreamState,\n event: TQwenResponsesStreamEvent,\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 mergeToolUsage(\n state.usage,\n collectProviderToolUsage(event.response.output ?? [], event.response.usage),\n );\n return;\n }\n\n if (event.type === 'response.output_item.done') {\n applyOutputItem(state, event.item);\n return;\n }\n\n if (event.type === 'response.web_search_call.completed') {\n state.usage.webSearchCalls += 1;\n return;\n }\n\n if (event.type === 'response.error' || event.type === 'response.failed') {\n throw new Error(`Qwen Responses API failed: ${extractErrorMessage(event)}`);\n }\n}\n\nfunction buildMessageFromCompletedResponse(\n state: IQwenResponsesStreamState,\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[],\n): TUniversalMessage {\n const response = state.completedResponse;\n if (response === undefined) {\n throw new Error('Qwen Responses stream completed without response metadata');\n }\n\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 usage = collectProviderToolUsage(output, response.usage);\n mergeToolUsage(usage, state.usage);\n\n return buildAssistantMessage({\n content,\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : state.toolCalls,\n response,\n usage,\n enabledBuiltInTools,\n });\n}\n\nfunction applyOutputItem(state: IQwenResponsesStreamState, item: TQwenResponsesOutputItem): void {\n if (item.type === 'function_call') {\n if (isFunctionCallOutputItem(item)) {\n state.toolCalls.push(convertFunctionCall(item));\n }\n return;\n }\n mergeToolUsage(state.usage, collectProviderToolUsage([item], undefined));\n}\n\nfunction buildAssistantMessage(input: {\n content: string;\n toolCalls: IToolCall[];\n response?: IQwenResponsesResponse;\n usage: IQwenProviderToolUsage;\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[];\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 && {\n usage: {\n promptTokens: input.response.usage.input_tokens ?? 0,\n completionTokens: input.response.usage.output_tokens ?? 0,\n totalTokens: input.response.usage.total_tokens ?? 0,\n },\n }),\n metadata: buildProviderToolMetadata(input.enabledBuiltInTools, input.usage, input.response),\n };\n}\n\nfunction buildProviderToolMetadata(\n enabledBuiltInTools: readonly TQwenBuiltInWebToolName[],\n usage: IQwenProviderToolUsage,\n response: IQwenResponsesResponse | undefined,\n): NonNullable<TUniversalMessage['metadata']> {\n const usedTools = collectUsedToolNames(usage);\n return {\n providerToolMode: 'qwen_responses',\n providerBuiltInToolsEnabled: [...enabledBuiltInTools],\n ...(usedTools.length > 0 && { providerBuiltInToolsUsed: usedTools }),\n qwenWebSearchCalls: usage.webSearchCalls,\n qwenWebExtractorCalls: usage.webExtractorCalls,\n ...(usage.unsupportedToolTypes.size > 0 && {\n qwenUnsupportedProviderToolTypes: [...usage.unsupportedToolTypes].sort(),\n }),\n ...(response?.id !== undefined && { responseId: response.id }),\n ...(response?.model !== undefined && { model: response.model }),\n ...(response?.status !== undefined && { finishReason: response.status }),\n };\n}\n\nfunction collectUsedToolNames(usage: IQwenProviderToolUsage): TQwenBuiltInWebToolName[] {\n const used: TQwenBuiltInWebToolName[] = [];\n if (usage.webSearchCalls > 0) {\n used.push('web_search');\n }\n if (usage.webExtractorCalls > 0) {\n used.push('web_extractor');\n }\n return used;\n}\n\nfunction collectProviderToolUsage(\n output: readonly TQwenResponsesOutputItem[],\n responseUsage: IQwenResponsesUsage | undefined,\n): IQwenProviderToolUsage {\n const usage = createEmptyToolUsage();\n for (const item of output) {\n if (item.type === 'web_search_call') {\n usage.webSearchCalls += 1;\n } else if (item.type === 'web_extractor_call') {\n usage.webExtractorCalls += 1;\n } else if (isProviderToolOutput(item.type)) {\n usage.unsupportedToolTypes.add(item.type);\n }\n }\n applyUsageCounts(usage, responseUsage);\n return usage;\n}\n\nfunction applyUsageCounts(\n usage: IQwenProviderToolUsage,\n responseUsage: IQwenResponsesUsage | undefined,\n): void {\n const xTools = responseUsage?.x_tools;\n if (xTools === undefined) {\n return;\n }\n usage.webSearchCalls = Math.max(usage.webSearchCalls, xTools['web_search']?.count ?? 0);\n usage.webExtractorCalls = Math.max(usage.webExtractorCalls, xTools['web_extractor']?.count ?? 0);\n for (const toolName of Object.keys(xTools)) {\n if (toolName !== 'web_search' && toolName !== 'web_extractor') {\n usage.unsupportedToolTypes.add(toolName);\n }\n }\n}\n\nfunction mergeToolUsage(target: IQwenProviderToolUsage, source: IQwenProviderToolUsage): void {\n target.webSearchCalls = Math.max(target.webSearchCalls, source.webSearchCalls);\n target.webExtractorCalls = Math.max(target.webExtractorCalls, source.webExtractorCalls);\n for (const toolType of source.unsupportedToolTypes) {\n target.unsupportedToolTypes.add(toolType);\n }\n}\n\nfunction createEmptyToolUsage(): IQwenProviderToolUsage {\n return {\n webSearchCalls: 0,\n webExtractorCalls: 0,\n unsupportedToolTypes: new Set(),\n };\n}\n\nfunction isProviderToolOutput(type: string): boolean {\n return type.endsWith('_call') && type !== 'function_call';\n}\n\nfunction extractFunctionToolCalls(output: readonly TQwenResponsesOutputItem[]): IToolCall[] {\n return output.filter(isFunctionCallOutputItem).map((item) => convertFunctionCall(item));\n}\n\nfunction isFunctionCallOutputItem(\n item: TQwenResponsesOutputItem,\n): item is IQwenResponsesFunctionCallOutputItem {\n return (\n item.type === 'function_call' && 'call_id' in item && 'name' in item && 'arguments' in item\n );\n}\n\nfunction convertFunctionCall(item: IQwenResponsesFunctionCallOutputItem): 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 TQwenResponsesOutputItem[]): string {\n return output\n .filter((item): item is Extract<TQwenResponsesOutputItem, { type: 'message' }> => {\n return item.type === 'message';\n })\n .flatMap((item) => item.content)\n .map((part) => part.text)\n .join('');\n}\n\nfunction extractErrorMessage(event: IQwenResponsesErrorEvent): string {\n return event.message ?? event.error?.message ?? event.response?.error?.message ?? 'unknown error';\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n observeProviderNativeRawPayloadStream,\n type IOpenAICompatibleError,\n} from '../shared/openai-compatible/index.js';\nimport {\n buildQwenResponsesTools,\n convertToQwenResponsesInput,\n getQwenBuiltInWebToolNames,\n} from './responses-converter';\nimport { assembleQwenResponsesStream, parseQwenResponsesResponse } from './responses-parser';\nimport type {\n IQwenBuiltInWebToolsOptions,\n IQwenResponsesRequestNonStreaming,\n IQwenResponsesRequestStreaming,\n TQwenResponsesStreamEvent,\n} from './types';\n\nexport interface IQwenResponsesChatOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n defaultModel?: string;\n builtInWebTools?: IQwenBuiltInWebToolsOptions;\n onTextDelta?: TTextDeltaCallback;\n}\n\nexport async function chatWithQwenResponsesApi(\n input: IQwenResponsesChatOptions,\n): Promise<TUniversalMessage> {\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return chatWithQwenResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: textDeltaCb,\n },\n });\n }\n\n if (!input.client) {\n throw new Error('Qwen Responses client not available for built-in web tools.');\n }\n\n try {\n const requestParams = buildResponsesRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'qwen',\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: 'qwen',\n apiSurface: 'responses',\n payloadKind: 'response',\n payload: response,\n });\n return parseQwenResponsesResponse(response, {\n enabledBuiltInTools: getQwenBuiltInWebToolNames(input.builtInWebTools),\n });\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen Responses API request failed';\n throw new Error(`Qwen responses failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithQwenResponsesApi(\n input: IQwenResponsesChatOptions,\n): AsyncIterable<TUniversalMessage> {\n const deltas: TUniversalMessage[] = [];\n const result = await chatWithQwenResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: (delta) => {\n input.chatOptions?.onTextDelta?.(delta);\n deltas.push(createStreamDeltaMessage(delta));\n },\n },\n });\n\n for (const delta of deltas) {\n yield delta;\n }\n yield {\n ...result,\n content: '',\n metadata: {\n ...result.metadata,\n isStreamChunk: true,\n isComplete: true,\n },\n };\n}\n\nasync function chatWithQwenResponsesStreamingAssembly(\n input: IQwenResponsesChatOptions,\n): Promise<TUniversalMessage> {\n if (!input.client) {\n throw new Error('Qwen Responses client not available for built-in web tools.');\n }\n\n try {\n const requestParams = buildResponsesStreamingRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'qwen',\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 assembleQwenResponsesStream({\n stream: observeProviderNativeRawPayloadStream(\n stream as AsyncIterable<TQwenResponsesStreamEvent>,\n {\n provider: 'qwen',\n apiSurface: 'responses',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n },\n ),\n enabledBuiltInTools: getQwenBuiltInWebToolNames(input.builtInWebTools),\n onTextDelta: input.chatOptions?.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen Responses streaming request failed';\n throw new Error(`Qwen responses stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildResponsesRequestParams(\n input: IQwenResponsesChatOptions,\n): IQwenResponsesRequestNonStreaming {\n const model = input.chatOptions?.model ?? input.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 enabledBuiltInTools = getQwenBuiltInWebToolNames(input.builtInWebTools);\n const tools = buildQwenResponsesTools(enabledBuiltInTools, input.chatOptions?.tools);\n\n return {\n model,\n input: convertToQwenResponsesInput(input.messages),\n ...(tools !== undefined && { tools }),\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 ...(input.builtInWebTools?.enableThinking !== undefined && {\n enable_thinking: input.builtInWebTools.enableThinking,\n }),\n };\n}\n\nfunction buildResponsesStreamingRequestParams(\n input: IQwenResponsesChatOptions,\n): IQwenResponsesRequestStreaming {\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 isStreamChunk: true,\n isComplete: false,\n },\n };\n}\n","import type { IProviderCapabilities } from '@robota-sdk/agent-core';\nimport type { IQwenProviderOptions } from './types';\n\nconst QWEN_RESPONSES_SOURCE = 'qwen-responses';\nconst ENABLE_WEB_SEARCH_REASON = 'Enable builtInWebTools.webSearch or builtInWebTools.webFetch.';\nconst ENABLE_WEB_FETCH_REASON = 'Enable builtInWebTools.webFetch.';\n\nexport function getQwenProviderCapabilities(options: IQwenProviderOptions): IProviderCapabilities {\n const webTools = options.builtInWebTools;\n const webSearchEnabled = webTools?.webSearch === true || webTools?.webFetch === true;\n const webFetchEnabled = webTools?.webFetch === true;\n\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: webSearchEnabled\n ? { supported: true, enabled: true, source: QWEN_RESPONSES_SOURCE }\n : {\n supported: true,\n enabled: false,\n source: QWEN_RESPONSES_SOURCE,\n reason: ENABLE_WEB_SEARCH_REASON,\n },\n webFetch: webFetchEnabled\n ? { supported: true, enabled: true, source: QWEN_RESPONSES_SOURCE }\n : {\n supported: true,\n enabled: false,\n source: QWEN_RESPONSES_SOURCE,\n reason: ENABLE_WEB_FETCH_REASON,\n },\n },\n };\n}\n","import OpenAI from 'openai';\nimport type { IChatOptions, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n assembleOpenAICompatibleStream,\n observeProviderNativeRawPayloadStream,\n} from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\n\nexport async function qwenChatWithStreamingAssembly(\n client: OpenAI,\n requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n options: IChatOptions,\n): Promise<TUniversalMessage> {\n try {\n options.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n options.signal ? { signal: options.signal } : undefined,\n );\n\n return assembleOpenAICompatibleStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'qwen',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options.onProviderNativeRawPayload,\n }),\n onTextDelta: options.onTextDelta,\n signal: options.signal,\n });\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen streaming request failed';\n throw new Error(`Qwen stream failed: ${errorMessage}`);\n }\n}\n","import OpenAI from 'openai';\nimport { AbstractAIProvider, SilentLogger } from '@robota-sdk/agent-core';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n assembleOpenAICompatibleStream,\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n observeProviderNativeRawPayloadStream,\n OpenAICompatibleResponseParser,\n} from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\nimport {\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,\n} from './defaults';\nimport { hasQwenBuiltInWebTools } from './responses-converter';\nimport { chatStreamWithQwenResponsesApi, chatWithQwenResponsesApi } from './responses-chat';\nimport { getQwenProviderCapabilities } from './provider-capabilities';\nimport { qwenChatWithStreamingAssembly } from './provider-streaming-assembly';\nimport type { IQwenProviderOptions } from './types';\n\nexport class QwenProvider extends AbstractAIProvider {\n override readonly name = 'qwen';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly responsesClient?: OpenAI;\n private readonly options: IQwenProviderOptions;\n private readonly responseParser: OpenAICompatibleResponseParser;\n\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IQwenProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\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 this.responsesClient = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.baseURL ?? DEFAULT_QWEN_PROVIDER_BASE_URL,\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n this.responsesClient = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.responsesBaseURL ?? DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n } else {\n throw new Error('Either Qwen client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAICompatibleResponseParser({ logger: this.logger });\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 return this.chatViaExecutor(messages, options);\n }\n\n if (this.shouldUseResponsesApi()) {\n return this.chatViaResponsesApi(messages, options, this.getResponsesClient());\n }\n\n return this.chatViaChatCompletions(messages, options, this.getClient());\n }\n\n private async chatViaExecutor(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): Promise<TUniversalMessage> {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'Qwen Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n private async chatViaResponsesApi(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n client: OpenAI,\n ): Promise<TUniversalMessage> {\n this.validateTools(options?.tools);\n return chatWithQwenResponsesApi({\n client,\n messages,\n chatOptions: options,\n defaultModel: this.options.defaultModel,\n builtInWebTools: this.options.builtInWebTools,\n onTextDelta: this.onTextDelta,\n });\n }\n\n private async chatViaChatCompletions(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n client: OpenAI,\n ): Promise<TUniversalMessage> {\n try {\n const requestParams = this.buildRequestParams(messages, options);\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta;\n if (textDeltaCb) {\n return qwenChatWithStreamingAssembly(\n client,\n { ...requestParams, stream: true },\n { ...options, onTextDelta: textDeltaCb },\n );\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(requestParams);\n options?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return this.responseParser.parseResponse(response);\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen API request failed';\n throw new Error(`Qwen chat failed: ${errorMessage}`);\n }\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\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 'Qwen Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (!this.client) {\n throw new Error(\n 'Qwen client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n if (this.shouldUseResponsesApi()) {\n this.validateTools(options?.tools);\n yield* chatStreamWithQwenResponsesApi({\n client: this.responsesClient,\n messages,\n chatOptions: options,\n defaultModel: this.options.defaultModel,\n builtInWebTools: this.options.builtInWebTools,\n onTextDelta: this.onTextDelta,\n });\n return;\n }\n\n try {\n const requestParams = this.buildStreamingRequestParams(messages, options);\n options?.onProviderNativeRawPayload?.({\n provider: 'qwen',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.chat.completions.create(requestParams);\n\n const observedStream = observeProviderNativeRawPayloadStream(stream, {\n provider: 'qwen',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options?.onProviderNativeRawPayload,\n });\n\n for await (const chunk of this.streamWithAbort(observedStream, options?.signal)) {\n const universalMessage = this.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const qwenError = error as IOpenAICompatibleError;\n const errorMessage = qwenError.message || 'Qwen API request failed';\n throw new Error(`Qwen stream failed: ${errorMessage}`);\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities() {\n return getQwenProviderCapabilities(this.options);\n }\n\n override validateConfig(): boolean {\n return (\n !!this.client && !!this.options && (!this.shouldUseResponsesApi() || !!this.responsesClient)\n );\n }\n\n override async dispose(): Promise<void> {\n // OpenAI-compatible Qwen clients do not need explicit cleanup.\n }\n\n private buildRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n this.validateTools(options?.tools);\n const model = options?.model ?? this.options.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 requestParams = {\n model,\n messages: convertToOpenAICompatibleMessages(messages),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n ...(options?.tools && {\n tools: convertToOpenAICompatibleTools(options.tools),\n tool_choice: 'auto' as const,\n }),\n };\n\n return requestParams as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n }\n\n private buildStreamingRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): OpenAI.Chat.ChatCompletionCreateParamsStreaming {\n return {\n ...this.buildRequestParams(messages, options),\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming;\n }\n\n private shouldUseResponsesApi(): boolean {\n return hasQwenBuiltInWebTools(this.options.builtInWebTools);\n }\n\n private getClient(): OpenAI {\n if (!this.client) {\n throw new Error(\n 'Qwen client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n return this.client;\n }\n\n private getResponsesClient(): OpenAI {\n if (!this.responsesClient) {\n throw new Error('Qwen Responses client not available for built-in web tools.');\n }\n\n return this.responsesClient;\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\nimport {\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n QWEN_MODEL_LAST_VERIFIED_AT,\n QWEN_MODEL_SOURCE_URL,\n} from './defaults';\n\nexport interface IQwenModelsResponse {\n data?: Array<{\n id?: string;\n object?: string;\n owned_by?: string;\n }>;\n}\n\nexport interface IQwenFetchInit {\n headers?: Record<string, string>;\n}\n\nexport interface IQwenFetchResponse {\n ok: boolean;\n status: number;\n json: () => Promise<IQwenModelsResponse>;\n}\n\nexport type TQwenFetch = (url: string, init?: IQwenFetchInit) => Promise<IQwenFetchResponse>;\n\nexport async function refreshQwenModelCatalog(\n profile: IProviderProfileConfig,\n fetcher: TQwenFetch = defaultQwenFetch,\n): Promise<IProviderModelCatalog> {\n const baseURL = trimTrailingSlash(profile.baseURL ?? DEFAULT_QWEN_PROVIDER_BASE_URL);\n const url = `${baseURL}/models`;\n const response = await fetcher(url, buildFetchInit(profile.apiKey));\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n message: `Qwen model refresh failed: HTTP ${response.status}`,\n };\n }\n\n const body = await response.json();\n const entries = (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n .map(toModelCatalogEntry);\n\n return {\n status: 'live',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n entries,\n message: `Loaded ${entries.length} models from Qwen API`,\n };\n}\n\nfunction buildFetchInit(apiKey: string | undefined): IQwenFetchInit | undefined {\n if (!apiKey) {\n return undefined;\n }\n return {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\nfunction toModelCatalogEntry(id: string): IProviderModelCatalogEntry {\n return {\n id,\n displayName: id,\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n };\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/$/, '');\n}\n\nasync function defaultQwenFetch(url: string, init?: IQwenFetchInit): Promise<IQwenFetchResponse> {\n const response = await fetch(url, {\n ...(init?.headers !== undefined && { headers: init.headers }),\n });\n return {\n ok: response.ok,\n status: response.status,\n json: () => response.json() as Promise<IQwenModelsResponse>,\n };\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\nimport { QwenProvider } from './provider';\nimport {\n DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n DEFAULT_QWEN_PROVIDER_MODEL,\n QWEN_MODEL_LAST_VERIFIED_AT,\n QWEN_MODEL_SOURCE_URL,\n} from './defaults';\nimport type { IQwenBuiltInWebToolsOptions } from './types';\nimport { refreshQwenModelCatalog } from './model-catalog-refresh';\n\nconst QWEN_API_KEY_URL = 'https://modelstudio.console.alibabacloud.com/?tab=api#/api-key';\nconst QWEN_SETUP_SOURCE_URL = 'https://www.alibabacloud.com/help/en/model-studio/get-api-key';\nconst QWEN_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst QWEN_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'Alibaba Cloud Model Studio API keys',\n url: QWEN_API_KEY_URL,\n sourceUrl: QWEN_SETUP_SOURCE_URL,\n lastVerifiedAt: QWEN_SETUP_LAST_VERIFIED_AT,\n },\n];\nconst QWEN_MODEL_CATALOG: NonNullable<IProviderDefinition['modelCatalog']> = {\n status: 'fallback',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n entries: [\n {\n id: DEFAULT_QWEN_PROVIDER_MODEL,\n displayName: 'Qwen Plus',\n capabilities: ['tools', 'reasoning', 'native_web', 'streaming'],\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'qwen-max',\n displayName: 'Qwen Max',\n capabilities: ['tools', 'reasoning', 'native_web', 'streaming'],\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n },\n {\n id: 'qwen-flash',\n displayName: 'Qwen Flash',\n capabilities: ['tools', 'native_web', 'streaming'],\n lifecycle: 'active',\n sourceUrl: QWEN_MODEL_SOURCE_URL,\n lastVerifiedAt: QWEN_MODEL_LAST_VERIFIED_AT,\n },\n ],\n};\n\nexport {\n DEFAULT_QWEN_PROVIDER_API_KEY_ENV,\n DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n DEFAULT_QWEN_PROVIDER_BASE_URL,\n DEFAULT_QWEN_PROVIDER_MODEL,\n DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,\n QWEN_PROVIDER_BASE_URLS,\n QWEN_PROVIDER_RESPONSES_BASE_URLS,\n} from './defaults';\nexport type { TQwenProviderRegion, TQwenProviderResponsesRegion } from './defaults';\n\nexport function createQwenProviderDefinition(): IProviderDefinition {\n return {\n type: 'qwen',\n displayName: 'Qwen',\n description: 'Alibaba Cloud Model Studio OpenAI-compatible endpoint',\n defaults: {\n model: DEFAULT_QWEN_PROVIDER_MODEL,\n apiKey: DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n baseURL: DEFAULT_QWEN_PROVIDER_BASE_URL,\n },\n modelCatalog: QWEN_MODEL_CATALOG,\n refreshModelCatalog: ({ profile }) => refreshQwenModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n setupHelpLinks: QWEN_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'baseURL',\n title: 'Qwen OpenAI-compatible base URL',\n defaultValue: DEFAULT_QWEN_PROVIDER_BASE_URL,\n },\n {\n key: 'model',\n title: 'Qwen model',\n defaultValue: DEFAULT_QWEN_PROVIDER_MODEL,\n },\n {\n key: 'apiKey',\n title: 'Qwen Model Studio API key',\n defaultValue: DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n createProvider: (config) => {\n const qwenOptions = parseQwenProviderOptions(config.options);\n return new QwenProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(qwenOptions.responsesBaseURL !== undefined && {\n responsesBaseURL: qwenOptions.responsesBaseURL,\n }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(qwenOptions.builtInWebTools !== undefined && {\n builtInWebTools: qwenOptions.builtInWebTools,\n }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider qwen requires apiKey');\n }\n return apiKey;\n}\n\nfunction parseQwenProviderOptions(options: Record<string, TUniversalValue> | undefined): {\n responsesBaseURL?: string;\n builtInWebTools?: IQwenBuiltInWebToolsOptions;\n} {\n const builtInWebTools = parseBuiltInWebTools(asRecord(options?.['builtInWebTools']));\n const responsesBaseURL = asString(options?.['responsesBaseURL']);\n return {\n ...(responsesBaseURL !== undefined && { responsesBaseURL }),\n ...(builtInWebTools !== undefined && { builtInWebTools }),\n };\n}\n\nfunction parseBuiltInWebTools(\n options: Record<string, TUniversalValue> | undefined,\n): IQwenBuiltInWebToolsOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...(asBoolean(options['webSearch']) !== undefined && {\n webSearch: asBoolean(options['webSearch']),\n }),\n ...(asBoolean(options['webFetch']) !== undefined && {\n webFetch: asBoolean(options['webFetch']),\n }),\n ...(asBoolean(options['enableThinking']) !== undefined && {\n enableThinking: asBoolean(options['enableThinking']),\n }),\n };\n}\n\nfunction asRecord(value: TUniversalValue | undefined): Record<string, TUniversalValue> | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n return typeof value === 'object' ? value : undefined;\n}\n\nfunction asBoolean(value: TUniversalValue | undefined): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction asString(value: TUniversalValue | undefined): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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);const a={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`},o={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`},s=`qwen-plus`,c=`DASHSCOPE_API_KEY`,l=`$ENV:${c}`,u=a.singapore,d=o.singapore,f=`https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope`,p=`2026-05-04`;function m(e){let t=[];return(e?.webSearch===!0||e?.webFetch===!0)&&t.push(`web_search`),e?.webFetch===!0&&t.push(`web_extractor`),t}function h(e){return m(e).length>0}function g(e){return e.flatMap(e=>ee(e))}function _(e,t){let n=[...e.map(e=>({type:e})),...v(t)];return n.length>0?n:void 0}function v(e){return e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))??[]}function ee(e){return e.role===`user`?[y(`user`,e.content)]:e.role===`system`?[y(`system`,e.content)]:e.role===`tool`?[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]:te(e)}function te(e){let t=[];e.content&&e.content.length>0&&t.push(y(`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(y(`assistant`,``)),t}function y(e,t){return{role:e,content:t??``}}async function*b(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await x(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function x(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 S(e,t){let n=e.output??[],r=A(n,e.usage),i=F(n);return D({content:e.output_text??R(n),toolCalls:i,response:e,usage:r,enabledBuiltInTools:t.enabledBuiltInTools})}async function C(e){let t={textParts:[],toolCalls:[],usage:N()};for await(let n of b(e.stream,e.signal))w(t,n,e.onTextDelta);return t.completedResponse===void 0?D({content:t.textParts.join(``),toolCalls:t.toolCalls,usage:t.usage,enabledBuiltInTools:e.enabledBuiltInTools}):T(t,e.enabledBuiltInTools)}function w(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,M(e.usage,A(t.response.output??[],t.response.usage));return}if(t.type===`response.output_item.done`){E(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: ${z(t)}`)}function T(e,t){let n=e.completedResponse;if(n===void 0)throw Error(`Qwen Responses stream completed without response metadata`);let r=n.output??[],i=F(r),a=e.textParts.length>0?e.textParts.join(``):n.output_text??R(r),o=A(r,n.usage);return M(o,e.usage),D({content:a,toolCalls:i.length>0?i:e.toolCalls,response:n,usage:o,enabledBuiltInTools:t})}function E(e,t){if(t.type===`function_call`){I(t)&&e.toolCalls.push(L(t));return}M(e.usage,A([t],void 0))}function D(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:{promptTokens:e.response.usage.input_tokens??0,completionTokens:e.response.usage.output_tokens??0,totalTokens:e.response.usage.total_tokens??0}},metadata:O(e.enabledBuiltInTools,e.usage,e.response)}}function O(e,t,n){let r=k(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 k(e){let t=[];return e.webSearchCalls>0&&t.push(`web_search`),e.webExtractorCalls>0&&t.push(`web_extractor`),t}function A(e,t){let n=N();for(let t of e)t.type===`web_search_call`?n.webSearchCalls+=1:t.type===`web_extractor_call`?n.webExtractorCalls+=1:P(t.type)&&n.unsupportedToolTypes.add(t.type);return j(n,t),n}function j(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 M(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 N(){return{webSearchCalls:0,webExtractorCalls:0,unsupportedToolTypes:new Set}}function P(e){return e.endsWith(`_call`)&&e!==`function_call`}function F(e){return e.filter(I).map(e=>L(e))}function I(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function L(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function R(e){return e.filter(e=>e.type===`message`).flatMap(e=>e.content).map(e=>e.text).join(``)}function z(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function B(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return H({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=U(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}),S(n,{enabledBuiltInTools:m(e.builtInWebTools)})}catch(e){let t=e.message||`Qwen Responses API request failed`;throw Error(`Qwen responses failed: ${t}`)}}async function*V(e){let t=[],n=await H({...e,chatOptions:{...e.chatOptions,onTextDelta:n=>{e.chatOptions?.onTextDelta?.(n),t.push(ne(n))}}});for(let e of t)yield e;yield{...n,content:``,metadata:{...n.metadata,isStreamChunk:!0,isComplete:!0}}}async function H(e){if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let n=W(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:n}),C({stream:t.n(await e.client.responses.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`qwen`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),enabledBuiltInTools:m(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 U(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=_(m(e.builtInWebTools),e.chatOptions?.tools);return{model:t,input:g(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 W(e){return{...U(e),stream:!0}}function ne(e){return{id:(0,n.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:!1}}}const G=`qwen-responses`;function K(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:G}:{supported:!0,enabled:!1,source:G,reason:`Enable builtInWebTools.webSearch or builtInWebTools.webFetch.`},webFetch:r?{supported:!0,enabled:!0,source:G}:{supported:!0,enabled:!1,source:G,reason:`Enable builtInWebTools.webFetch.`}}}}async function q(e,n,r){try{return r.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n}),t.r({stream:t.n(await e.chat.completions.create(n,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}`)}}var J=class extends r.AbstractAIProvider{name=`qwen`;version=`1.0.0`;client;responsesClient;options;responseParser;onTextDelta;constructor(e){if(super(e.logger||r.SilentLogger),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 i.default({apiKey:e.apiKey,baseURL:e.baseURL??u,...e.timeout!==void 0&&{timeout:e.timeout}}),this.responsesClient=new i.default({apiKey:e.apiKey,baseURL:e.responsesBaseURL??d,...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Qwen client, apiKey, or executor is required`);this.responseParser=new t.i({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),B({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 q(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,n){if(this.validateMessages(e),this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,n);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(n?.tools),yield*V({client:this.responsesClient,messages:e,chatOptions:n,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta});return}try{let r=this.buildStreamingRequestParams(e,n);n?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=t.n(await this.client.chat.completions.create(r),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(i,n?.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 K(this.options)}validateConfig(){return!!this.client&&!!this.options&&(!this.shouldUseResponsesApi()||!!this.responsesClient)}async dispose(){}buildRequestParams(e,n){this.validateTools(n?.tools);let r=n?.model??this.options.defaultModel;if(!r)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return{model:r,messages:t.a(e),...n?.temperature!==void 0&&{temperature:n.temperature},...n?.maxTokens!==void 0&&{max_tokens:n.maxTokens},...n?.tools&&{tools:t.o(n.tools),tool_choice:`auto`}}}buildStreamingRequestParams(e,t){return{...this.buildRequestParams(e,t),stream:!0}}shouldUseResponsesApi(){return h(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 Y(e,t=re){let n=await t(`${Q(e.baseURL??u)}/models`,X(e.apiKey));if(!n.ok)return{status:`unavailable`,sourceUrl:f,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(Z);return{status:`live`,sourceUrl:f,lastVerifiedAt:p,entries:r,message:`Loaded ${r.length} models from Qwen API`}}function X(e){if(e)return{headers:{Authorization:`Bearer ${e}`}}}function Z(e){return{id:e,displayName:e,lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p}}function Q(e){return e.replace(/\/$/,``)}async function re(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 ie=[{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`}],ae={status:`fallback`,sourceUrl:f,lastVerifiedAt:p,entries:[{id:s,displayName:`Qwen Plus`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p},{id:`qwen-max`,displayName:`Qwen Max`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p},{id:`qwen-flash`,displayName:`Qwen Flash`,capabilities:[`tools`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:f,lastVerifiedAt:p}]};function oe(){return{type:`qwen`,displayName:`Qwen`,description:`Alibaba Cloud Model Studio OpenAI-compatible endpoint`,defaults:{model:s,apiKey:l,baseURL:u},modelCatalog:ae,refreshModelCatalog:({profile:e})=>Y(e),modelCatalogCacheTtlSeconds:86400,setupHelpLinks:ie,setupSteps:[{key:`baseURL`,title:`Qwen OpenAI-compatible base URL`,defaultValue:u},{key:`model`,title:`Qwen model`,defaultValue:s},{key:`apiKey`,title:`Qwen Model Studio API key`,defaultValue:l,masked:!0}],requiresApiKey:!0,probeProfile:t.t,createProvider:e=>{let t=ce(e.options);return new J({apiKey:se(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 se(e){if(!e)throw Error(`Provider qwen requires apiKey`);return e}function ce(e){let t=le(ue(e?.builtInWebTools)),n=de(e?.responsesBaseURL);return{...n!==void 0&&{responsesBaseURL:n},...t!==void 0&&{builtInWebTools:t}}}function le(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 ue(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 de(e){return typeof e==`string`&&e.length>0?e:void 0}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return f}});
|