qwen-ai-provider
Version:
Vercel AI Provider for running Qwen AI models
1 lines • 92.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/qwen-provider.ts","../src/qwen-chat-language-model.ts","../src/convert-to-qwen-chat-messages.ts","../src/get-response-metadata.ts","../src/map-qwen-finish-reason.ts","../src/qwen-error.ts","../src/qwen-prepare-tools.ts","../src/qwen-completion-language-model.ts","../src/convert-to-qwen-completion-prompt.ts","../src/qwen-embedding-model.ts"],"sourcesContent":["import type {\n EmbeddingModelV1,\n LanguageModelV1,\n ProviderV1,\n} from \"@ai-sdk/provider\"\nimport type { FetchFunction } from \"@ai-sdk/provider-utils\"\nimport type { QwenChatModelId, QwenChatSettings } from \"./qwen-chat-settings\"\nimport type {\n QwenCompletionModelId,\n QwenCompletionSettings,\n} from \"./qwen-completion-settings\"\nimport type {\n QwenEmbeddingModelId,\n QwenEmbeddingSettings,\n} from \"./qwen-embedding-settings\"\nimport { loadApiKey, withoutTrailingSlash } from \"@ai-sdk/provider-utils\"\nimport { QwenChatLanguageModel } from \"./qwen-chat-language-model\"\nimport { QwenCompletionLanguageModel } from \"./qwen-completion-language-model\"\nimport { QwenEmbeddingModel } from \"./qwen-embedding-model\"\n\n/**\n * QwenProvider function type and its properties.\n * Creates various language or embedding models based on the provided settings.\n */\nexport interface QwenProvider extends ProviderV1 {\n (modelId: QwenChatModelId, settings?: QwenChatSettings): LanguageModelV1\n\n /**\n * Create a new chat model for text generation.\n * @param modelId The model ID.\n * @param settings The settings for the model.\n * @returns The chat model.\n */\n chatModel: (\n modelId: QwenChatModelId,\n settings?: QwenChatSettings,\n ) => LanguageModelV1\n\n /**\n Creates a text embedding model for text generation.\n @param modelId The model ID.\n @param settings The settings for the model.\n @returns The text embedding model.\n */\n textEmbeddingModel: (\n modelId: QwenEmbeddingModelId,\n settings?: QwenEmbeddingSettings,\n ) => EmbeddingModelV1<string>\n\n languageModel: (\n modelId: QwenChatModelId,\n settings?: QwenChatSettings,\n ) => LanguageModelV1\n\n completion: (\n modelId: QwenCompletionModelId,\n settings?: QwenCompletionSettings,\n ) => LanguageModelV1\n}\n\n/**\n * QwenProviderSettings interface holds configuration options for Qwen.\n */\nexport interface QwenProviderSettings {\n /**\n Use a different URL prefix for API calls, e.g. to use proxy servers.\n The default prefix is `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`.\n */\n baseURL?: string\n\n /**\n API key that is being send using the `Authorization` header.\n It defaults to the `DASHSCOPE_API_KEY` environment variable.\n */\n apiKey?: string\n\n /**\n Custom headers to include in the requests.\n */\n headers?: Record<string, string>\n\n /**\n Optional custom url query parameters to include in request urls.\n */\n queryParams?: Record<string, string>\n /**\n /**\n Custom fetch implementation. You can use it as a middleware to intercept requests,\n or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction\n\n // generateId?: () => string\n}\n\n/**\n * Creates a Qwen provider instance with the specified options.\n * @param options Provider configuration options.\n * @returns A QwenProvider instance.\n */\nexport function createQwen(options: QwenProviderSettings = {}): QwenProvider {\n // Remove trailing slash from the base URL.\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n )\n\n // Build headers including the API key.\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: \"DASHSCOPE_API_KEY\",\n description: \"Qwen API key\",\n })}`,\n ...options.headers,\n })\n\n interface CommonModelConfig {\n provider: string\n url: ({ path }: { path: string }) => string\n headers: () => Record<string, string>\n fetch?: FetchFunction\n }\n\n /**\n * Helper to get common model configuration.\n * @param modelType The type of model (chat, completion, embedding).\n */\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n provider: `qwen.${modelType}`,\n url: ({ path }) => {\n const url = new URL(`${baseURL}${path}`)\n if (options.queryParams) {\n // Append custom query parameters if provided.\n url.search = new URLSearchParams(options.queryParams).toString()\n }\n return url.toString()\n },\n headers: getHeaders,\n fetch: options.fetch,\n })\n\n // Create a chat language model instance.\n const createChatModel = (\n modelId: QwenChatModelId,\n settings: QwenChatSettings = {},\n ) =>\n new QwenChatLanguageModel(modelId, settings, {\n ...getCommonModelConfig(\"chat\"),\n defaultObjectGenerationMode: \"tool\",\n })\n\n // Create a completion model instance.\n const createCompletionModel = (\n modelId: QwenCompletionModelId,\n settings: QwenCompletionSettings = {},\n ) =>\n new QwenCompletionLanguageModel(\n modelId,\n settings,\n getCommonModelConfig(\"completion\"),\n )\n\n // Create a text embedding model instance.\n const createTextEmbeddingModel = (\n modelId: QwenEmbeddingModelId,\n settings: QwenEmbeddingSettings = {},\n ) =>\n new QwenEmbeddingModel(\n modelId,\n settings,\n getCommonModelConfig(\"embedding\"),\n )\n\n // Default provider returns a chat model.\n const provider = (modelId: QwenChatModelId, settings?: QwenChatSettings) =>\n createChatModel(modelId, settings)\n\n provider.chatModel = createChatModel\n provider.completion = createCompletionModel\n provider.textEmbeddingModel = createTextEmbeddingModel\n provider.languageModel = createChatModel\n return provider as QwenProvider\n}\n\nexport const qwen = createQwen()\n","import type {\n APICallError,\n LanguageModelV1,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1ObjectGenerationMode,\n LanguageModelV1StreamPart,\n} from \"@ai-sdk/provider\"\nimport type {\n FetchFunction,\n ParseResult,\n ResponseHandler,\n} from \"@ai-sdk/provider-utils\"\nimport type {\n QwenChatModelId,\n QwenChatSettings,\n} from \"./qwen-chat-settings\"\nimport type {\n QwenErrorStructure,\n} from \"./qwen-error\"\nimport type { MetadataExtractor } from \"./qwen-metadata-extractor\"\nimport {\n InvalidResponseDataError,\n} from \"@ai-sdk/provider\"\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n isParsableJson,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\"\nimport { z } from \"zod\"\nimport { convertToQwenChatMessages } from \"./convert-to-qwen-chat-messages\"\nimport { getResponseMetadata } from \"./get-response-metadata\"\nimport { mapQwenFinishReason } from \"./map-qwen-finish-reason\"\nimport {\n defaultQwenErrorStructure,\n} from \"./qwen-error\"\nimport { prepareTools } from \"./qwen-prepare-tools\"\n\n/**\n * Configuration for the Qwen Chat Language Model.\n * @interface QwenChatConfig\n */\nexport interface QwenChatConfig {\n provider: string\n headers: () => Record<string, string | undefined>\n url: (options: { modelId: string, path: string }) => string\n fetch?: FetchFunction\n errorStructure?: QwenErrorStructure<any>\n metadataExtractor?: MetadataExtractor\n\n /**\n Default object generation mode that should be used with this model when\n no mode is specified. Should be the mode with the best results for this\n model. `undefined` can be specified if object generation is not supported.\n */\n defaultObjectGenerationMode?: LanguageModelV1ObjectGenerationMode\n\n /**\n * Whether the model supports structured outputs.\n */\n supportsStructuredOutputs?: boolean\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst QwenChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal(\"assistant\").nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n })\n .nullish(),\n})\n\n/**\n * Class representing the Qwen Chat language model.\n * Implements LanguageModelV1 providing text generation and streaming.\n */\n/**\n * A language model implementation for Qwen Chat API that follows the LanguageModelV1 interface.\n * Handles both regular text generation and structured outputs through various modes.\n *\n * @param options.mode - The generation mode configuration that determines how the model generates responses:\n * 'regular' for standard chat completion,\n * 'object-json' for JSON-structured outputs,\n * 'object-tool' for function-calling outputs\n * @param options.prompt - The input prompt messages to send to the model\n * @param options.maxTokens - Maximum number of tokens to generate in the response\n * @param options.temperature - Controls randomness in the model's output (0-2)\n * @param options.topP - Nucleus sampling parameter that controls diversity (0-1)\n * @param options.topK - Not supported by Qwen - will generate a warning if used\n * @param options.frequencyPenalty - Penalizes frequent tokens (-2 to 2)\n * @param options.presencePenalty - Penalizes repeated tokens (-2 to 2)\n * @param options.providerMetadata - Additional provider-specific metadata to include in the request\n * @param options.stopSequences - Array of sequences where the model should stop generating\n * @param options.responseFormat - Specifies the desired format of the response (e.g. JSON)\n * @param options.seed - Random seed for deterministic generation\n */\nexport class QwenChatLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = \"v1\"\n\n readonly supportsStructuredOutputs: boolean\n\n readonly modelId: QwenChatModelId\n readonly settings: QwenChatSettings\n\n private readonly config: QwenChatConfig\n private readonly failedResponseHandler: ResponseHandler<APICallError>\n private readonly chunkSchema // type inferred via constructor\n\n /**\n * Constructs a new QwenChatLanguageModel.\n * @param modelId - The model identifier.\n * @param settings - Settings for the chat.\n * @param config - Model configuration.\n */\n constructor(\n modelId: QwenChatModelId,\n settings: QwenChatSettings,\n config: QwenChatConfig,\n ) {\n this.modelId = modelId\n this.settings = settings\n this.config = config\n\n // Initialize error handling using provided or default error structure.\n const errorStructure\n = config.errorStructure ?? defaultQwenErrorStructure\n this.chunkSchema = createQwenChatChunkSchema(\n errorStructure.errorSchema,\n )\n this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure)\n\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? false\n }\n\n /**\n * Getter for the default object generation mode.\n */\n get defaultObjectGenerationMode(): \"json\" | \"tool\" | undefined {\n return this.config.defaultObjectGenerationMode\n }\n\n /**\n * Getter for the provider name.\n */\n get provider(): string {\n return this.config.provider\n }\n\n /**\n * Internal getter that extracts the provider options name.\n * @private\n */\n private get providerOptionsName(): string {\n return this.config.provider.split(\".\")[0].trim()\n }\n\n /**\n * Generates the arguments and warnings required for a language model generation call.\n *\n * This function prepares the argument object based on the provided generation options and mode,\n * including any necessary warnings for unsupported settings. It handles different generation modes\n * such as regular, object-json, and object-tool.\n *\n * @param options.mode - The generation mode configuration containing the type and additional settings.\n * @param options.prompt - The prompt input used to generate chat messages.\n * @param options.maxTokens - The maximum number of tokens to generate.\n * @param options.temperature - The temperature setting to control randomness in generation.\n * @param options.topP - The nucleus sampling parameter (top-p) for token selection.\n * @param options.topK - The top-k sampling parameter; if provided, it triggers a warning as it is unsupported.\n * @param options.frequencyPenalty - The penalty applied to frequently occurring tokens.\n * @param options.presencePenalty - The penalty applied based on the presence of tokens.\n * @param options.providerMetadata - Additional metadata customized for the specific provider.\n * @param options.stopSequences - An array of sequences that will signal the generation to stop.\n * @param options.responseFormat - The desired response format; supports JSON schema formatting when structured outputs are enabled.\n * @param options.seed - An optional seed value for randomization.\n *\n * @returns An object containing:\n * - args: The arguments constructed for the language model generation request.\n * - warnings: A list of warnings related to unsupported or deprecated settings.\n */\n private getArgs({\n mode,\n prompt,\n maxTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n providerMetadata,\n stopSequences,\n responseFormat,\n seed,\n }: Parameters<LanguageModelV1[\"doGenerate\"]>[0]) {\n // Determine the type of generation mode.\n const type = mode.type\n\n const warnings: LanguageModelV1CallWarning[] = []\n\n // Warn if unsupported settings are used:\n if (topK != null) {\n warnings.push({\n type: \"unsupported-setting\",\n setting: \"topK\",\n })\n }\n\n if (\n responseFormat?.type === \"json\"\n && responseFormat.schema != null\n && !this.supportsStructuredOutputs\n ) {\n warnings.push({\n type: \"unsupported-setting\",\n setting: \"responseFormat\",\n details:\n \"JSON response format schema is only supported with structuredOutputs\",\n })\n }\n\n const baseArgs = {\n // model id:\n model: this.modelId,\n\n // model specific settings:\n user: this.settings.user,\n\n // standardized settings:\n max_tokens: maxTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format:\n responseFormat?.type === \"json\"\n ? this.supportsStructuredOutputs === true\n && responseFormat.schema != null\n ? {\n type: \"json_schema\",\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? \"response\",\n description: responseFormat.description,\n },\n }\n : { type: \"json_object\" }\n : undefined,\n\n stop: stopSequences,\n seed,\n ...providerMetadata?.[this.providerOptionsName],\n\n // messages:\n messages: convertToQwenChatMessages(prompt),\n }\n\n // Handling various generation modes.\n switch (type) {\n case \"regular\": {\n const { tools, tool_choice, toolWarnings } = prepareTools({\n mode,\n structuredOutputs: this.supportsStructuredOutputs,\n })\n\n return {\n args: { ...baseArgs, tools, tool_choice },\n warnings: [...warnings, ...toolWarnings],\n }\n }\n\n case \"object-json\": {\n return {\n args: {\n ...baseArgs,\n response_format:\n this.supportsStructuredOutputs === true && mode.schema != null\n ? {\n type: \"json_schema\",\n json_schema: {\n schema: mode.schema,\n name: mode.name ?? \"response\",\n description: mode.description,\n },\n }\n : { type: \"json_object\" },\n },\n warnings,\n }\n }\n\n case \"object-tool\": {\n return {\n args: {\n ...baseArgs,\n tool_choice: {\n type: \"function\",\n function: { name: mode.tool.name },\n },\n tools: [\n {\n type: \"function\",\n function: {\n name: mode.tool.name,\n description: mode.tool.description,\n parameters: mode.tool.parameters,\n },\n },\n ],\n },\n warnings,\n }\n }\n\n default: {\n const _exhaustiveCheck: never = type\n throw new Error(`Unsupported type: ${_exhaustiveCheck}`)\n }\n }\n }\n\n /**\n * Generates a text response from the model.\n * @param options - Generation options.\n * @returns A promise resolving with the generation result.\n */\n async doGenerate(\n options: Parameters<LanguageModelV1[\"doGenerate\"]>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>> {\n const { args, warnings } = this.getArgs({ ...options })\n\n const body = JSON.stringify(args)\n\n // Send request for generation using POST JSON.\n const {\n responseHeaders,\n value: responseBody,\n rawValue: parsedBody,\n } = await postJsonToApi({\n url: this.config.url({\n path: \"/chat/completions\",\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n QwenChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n })\n\n const { messages: rawPrompt, ...rawSettings } = args\n const choice = responseBody.choices[0]\n const providerMetadata = this.config.metadataExtractor?.extractMetadata?.({\n parsedBody,\n })\n\n // Return structured generation details.\n return {\n text: choice.message.content ?? undefined,\n reasoning: choice.message.reasoning_content ?? undefined,\n toolCalls: choice.message.tool_calls?.map(toolCall => ({\n toolCallType: \"function\",\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n args: toolCall.function.arguments!,\n })),\n finishReason: mapQwenFinishReason(choice.finish_reason),\n usage: {\n promptTokens: responseBody.usage?.prompt_tokens ?? Number.NaN,\n completionTokens: responseBody.usage?.completion_tokens ?? Number.NaN,\n },\n ...(providerMetadata && { providerMetadata }),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n response: getResponseMetadata(responseBody),\n warnings,\n request: { body },\n }\n }\n\n /**\n * Returns a stream of model responses.\n * @param options - Stream generation options.\n * @returns A promise resolving with the stream and additional metadata.\n */\n async doStream(\n options: Parameters<LanguageModelV1[\"doStream\"]>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doStream\"]>>> {\n if (this.settings.simulateStreaming) {\n // Simulate streaming by generating a full response and splitting it.\n const result = await this.doGenerate(options)\n const simulatedStream = new ReadableStream<LanguageModelV1StreamPart>({\n start(controller) {\n // Send metadata then text deltas.\n controller.enqueue({ type: \"response-metadata\", ...result.response })\n if (result.reasoning) {\n const reasoningText = typeof result.reasoning === \"string\"\n ? result.reasoning\n : result.reasoning.map(item => item.type === \"text\" ? item.text : \"\").join(\"\")\n controller.enqueue({\n type: \"reasoning\",\n textDelta: reasoningText,\n })\n }\n if (result.text) {\n controller.enqueue({\n type: \"text-delta\",\n textDelta: result.text,\n })\n }\n if (result.toolCalls) {\n for (const toolCall of result.toolCalls) {\n controller.enqueue({\n type: \"tool-call\",\n ...toolCall,\n })\n }\n }\n controller.enqueue({\n type: \"finish\",\n finishReason: result.finishReason,\n usage: result.usage,\n logprobs: result.logprobs,\n providerMetadata: result.providerMetadata,\n })\n controller.close()\n },\n })\n return {\n stream: simulatedStream,\n rawCall: result.rawCall,\n rawResponse: result.rawResponse,\n warnings: result.warnings,\n }\n }\n\n const { args, warnings } = this.getArgs({ ...options })\n\n const requestBody = {\n ...args,\n stream: true,\n stream_options: {\n include_usage: true,\n },\n }\n\n // Set stream flag to true for the API.\n const body = JSON.stringify(requestBody)\n const metadataExtractor\n = this.config.metadataExtractor?.createStreamExtractor()\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: \"/chat/completions\",\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n this.chunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n })\n\n const { messages: rawPrompt, ...rawSettings } = args\n\n const toolCalls: Array<{\n id: string\n type: \"function\"\n function: {\n name: string\n arguments: string\n }\n hasFinished: boolean\n }> = []\n\n let finishReason: LanguageModelV1FinishReason = \"unknown\"\n let usage: {\n promptTokens: number | undefined\n completionTokens: number | undefined\n } = {\n promptTokens: undefined,\n completionTokens: undefined,\n }\n let isFirstChunk = true\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV1StreamPart\n >({\n // Transforms incoming chunks and maps them to stream parts.\n transform(chunk, controller) {\n // If validation fails, emit an error.\n if (!chunk.success) {\n finishReason = \"error\"\n controller.enqueue({ type: \"error\", error: chunk.error })\n return\n }\n const value = chunk.value\n\n metadataExtractor?.processChunk(chunk.rawValue)\n\n // If API sends an error field in the value.\n if (\"error\" in value) {\n finishReason = \"error\"\n controller.enqueue({ type: \"error\", error: value.error.message })\n return\n }\n\n if (isFirstChunk) {\n isFirstChunk = false\n\n controller.enqueue({\n type: \"response-metadata\",\n ...getResponseMetadata(value),\n })\n }\n\n if (value.usage != null) {\n usage = {\n promptTokens: value.usage.prompt_tokens ?? undefined,\n completionTokens: value.usage.completion_tokens ?? undefined,\n }\n }\n\n const choice = value.choices[0]\n\n if (choice?.finish_reason != null) {\n finishReason = mapQwenFinishReason(\n choice.finish_reason,\n )\n }\n\n if (choice?.delta == null) {\n return\n }\n\n const delta = choice.delta\n\n // Emit reasoning before the main content.\n if (delta.reasoning_content != null) {\n controller.enqueue({\n type: \"reasoning\",\n textDelta: delta.reasoning_content,\n })\n }\n\n if (delta.content != null) {\n controller.enqueue({\n type: \"text-delta\",\n textDelta: delta.content,\n })\n }\n\n // Process and merge tool call deltas.\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index\n\n if (toolCalls[index] == null) {\n if (toolCallDelta.type !== \"function\") {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`,\n })\n }\n\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`,\n })\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`,\n })\n }\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: \"function\",\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? \"\",\n },\n hasFinished: false,\n }\n\n const toolCall = toolCalls[index]\n\n if (\n toolCall.function?.name != null\n && toolCall.function?.arguments != null\n ) {\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: \"tool-call-delta\",\n toolCallType: \"function\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n argsTextDelta: toolCall.function.arguments,\n })\n }\n\n // If the accumulated arguments are valid JSON, finish the tool call.\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n args: toolCall.function.arguments,\n })\n toolCall.hasFinished = true\n }\n }\n\n continue\n }\n\n // Merge new delta with ongoing tool call.\n const toolCall = toolCalls[index]\n\n if (toolCall.hasFinished) {\n continue\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function!.arguments\n += toolCallDelta.function?.arguments ?? \"\"\n }\n\n controller.enqueue({\n type: \"tool-call-delta\",\n toolCallType: \"function\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n argsTextDelta: toolCallDelta.function.arguments ?? \"\",\n })\n\n if (\n toolCall.function?.name != null\n && toolCall.function?.arguments != null\n && isParsableJson(toolCall.function.arguments)\n ) {\n controller.enqueue({\n type: \"tool-call\",\n toolCallType: \"function\",\n toolCallId: toolCall.id ?? generateId(),\n toolName: toolCall.function.name,\n args: toolCall.function.arguments,\n })\n toolCall.hasFinished = true\n }\n }\n }\n },\n\n flush(controller) {\n // Build final metadata and finish streaming.\n const metadata = metadataExtractor?.buildMetadata()\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: {\n promptTokens: usage.promptTokens ?? Number.NaN,\n completionTokens: usage.completionTokens ?? Number.NaN,\n },\n ...(metadata && { providerMetadata: metadata }),\n })\n },\n }),\n ),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n warnings,\n request: { body },\n }\n }\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nfunction createQwenChatChunkSchema<ERROR_SCHEMA extends z.ZodType>(errorSchema: ERROR_SCHEMA) {\n return z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum([\"assistant\"]).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal(\"function\").optional(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n }),\n )\n .nullish(),\n })\n .nullish(),\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n })\n .nullish(),\n }),\n errorSchema,\n ])\n}\n","import type {\n LanguageModelV1Prompt,\n LanguageModelV1ProviderMetadata,\n} from \"@ai-sdk/provider\"\nimport type { QwenChatPrompt } from \"./qwen-api-types\"\nimport {\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\"\nimport { convertUint8ArrayToBase64 } from \"@ai-sdk/provider-utils\"\n\n// JSDoc for helper function to extract Qwen metadata.\n/**\n * Extracts Qwen-specific metadata from a message.\n *\n * @param message - An object that may contain providerMetadata\n * @param message.providerMetadata - Provider-specific metadata containing Qwen configuration\n * @returns The Qwen metadata object or an empty object if none exists\n */\n\nfunction getQwenMetadata(message: {\n providerMetadata?: LanguageModelV1ProviderMetadata\n}) {\n return message?.providerMetadata?.qwen ?? {}\n}\n\n/**\n * Converts a generic language model prompt to Qwen chat messages.\n *\n * @param prompt The language model prompt to convert.\n * @returns An array of Qwen chat messages.\n */\nexport function convertToQwenChatMessages(\n prompt: LanguageModelV1Prompt,\n): QwenChatPrompt {\n const messages: QwenChatPrompt = []\n // Iterate over each prompt message.\n for (const { role, content, ...message } of prompt) {\n const metadata = getQwenMetadata({ ...message })\n switch (role) {\n case \"system\": {\n // System messages are sent directly with metadata.\n messages.push({ role: \"system\", content, ...metadata })\n break\n }\n\n case \"user\": {\n if (content.length === 1 && content[0].type === \"text\") {\n // For a single text element, simplify the conversion.\n messages.push({\n role: \"user\",\n content: content[0].text,\n ...getQwenMetadata(content[0]),\n })\n break\n }\n // For multiple content parts, process each part.\n messages.push({\n role: \"user\",\n content: content.map((part) => {\n const partMetadata = getQwenMetadata(part)\n switch (part.type) {\n case \"text\": {\n // Plain text conversion.\n return { type: \"text\", text: part.text, ...partMetadata }\n }\n case \"image\": {\n // Convert images and encode if necessary.\n return {\n type: \"image_url\",\n image_url: {\n url:\n part.image instanceof URL\n ? part.image.toString()\n : `data:${\n part.mimeType ?? \"image/jpeg\"\n };base64,${convertUint8ArrayToBase64(part.image)}`,\n },\n ...partMetadata,\n }\n }\n default: {\n // Unsupported file content parts trigger an error.\n throw new UnsupportedFunctionalityError({\n functionality: \"File content parts in user messages\",\n })\n }\n }\n }),\n ...metadata,\n })\n\n break\n }\n\n case \"assistant\": {\n // Build text response and accumulate function/tool calls.\n let text = \"\"\n const toolCalls: Array<{\n id: string\n type: \"function\"\n function: { name: string, arguments: string }\n }> = []\n\n for (const part of content) {\n const partMetadata = getQwenMetadata(part)\n switch (part.type) {\n case \"text\": {\n // Append each text part.\n text += part.text\n break\n }\n case \"tool-call\": {\n // Convert tool calls to function calls with serialized arguments.\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.args),\n },\n ...partMetadata,\n })\n break\n }\n case \"file\": // Add cases in v5\n case \"reasoning\":\n case \"redacted-reasoning\": {\n // Ignore or handle these part types as needed\n throw new UnsupportedFunctionalityError({\n functionality: `${part.type} content parts in assistant messages`,\n })\n }\n default: {\n // This branch should never occur.\n const _exhaustiveCheck: never = part\n throw new Error(`Unsupported part: ${_exhaustiveCheck}`)\n }\n }\n }\n\n messages.push({\n role: \"assistant\",\n content: text,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n ...metadata,\n })\n\n break\n }\n\n case \"tool\": {\n // Process tool responses by converting result to JSON string.\n for (const toolResponse of content) {\n const toolResponseMetadata = getQwenMetadata(toolResponse)\n messages.push({\n role: \"tool\",\n tool_call_id: toolResponse.toolCallId,\n content: JSON.stringify(toolResponse.result),\n ...toolResponseMetadata,\n })\n }\n break\n }\n\n default: {\n // Ensure all roles are handled.\n const _exhaustiveCheck: never = role\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`)\n }\n }\n }\n\n return messages\n}\n","/**\n * Generates metadata for a response object.\n *\n * @param {object} params - Input parameters.\n * @param {string | undefined | null} params.id - A unique identifier for the response.\n * @param {string | undefined | null} params.model - Identifier for the model used.\n * @param {number | undefined | null} params.created - Unix timestamp (in seconds) of when the response was created.\n * @returns {object} An object containing normalized metadata.\n */\nexport function getResponseMetadata({\n id,\n model,\n created,\n}: {\n id?: string | undefined | null\n created?: number | undefined | null\n model?: string | undefined | null\n}) {\n // Normalize and construct the response metadata object.\n return {\n // Assign 'id' if provided; otherwise, leave as undefined.\n id: id ?? undefined,\n // Map 'model' to 'modelId' for improved clarity; assign if provided.\n modelId: model ?? undefined,\n // If 'created' is provided, convert the Unix timestamp (seconds) to a JavaScript Date object.\n timestamp: created != null ? new Date(created * 1000) : undefined,\n }\n}\n","import type { LanguageModelV1FinishReason } from \"@ai-sdk/provider\"\n\n/**\n * Maps the finish reason from the backend response to a standardized format.\n *\n * @param finishReason - The original finish reason string.\n * @returns The mapped LanguageModelV1FinishReason.\n */\nexport function mapQwenFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV1FinishReason {\n switch (finishReason) {\n case \"stop\":\n return \"stop\"\n case \"length\":\n return \"length\"\n case \"tool_calls\":\n return \"tool-calls\"\n default:\n return \"unknown\"\n }\n}\n","import type { ZodSchema } from \"zod\"\nimport { createJsonErrorResponseHandler } from \"@ai-sdk/provider-utils\"\nimport { z } from \"zod\"\n\n/**\n * Schema defining the structure of a Qwen error response.\n */\nconst qwenErrorDataSchema = z.object({\n object: z.literal(\"error\"),\n message: z.string(),\n type: z.string(),\n param: z.string().nullable(),\n code: z.string().nullable(),\n})\n\nexport type QwenErrorData = z.infer<typeof qwenErrorDataSchema>\n\n/**\n * Interface for defining error structures for Qwen.\n */\nexport interface QwenErrorStructure<T> {\n /**\n * Zod schema to validate error data.\n */\n errorSchema: ZodSchema<T>\n /**\n * Maps error details to a human-readable message.\n */\n errorToMessage: (error: T) => string\n /**\n * Determines if an error is retryable.\n */\n isRetryable?: (response: Response, error?: T) => boolean\n}\n\n// Create a handler for failed responses using the defined schema.\nexport const qwenFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: qwenErrorDataSchema,\n errorToMessage: error => error.message,\n})\n\nexport const defaultQwenErrorStructure: QwenErrorStructure<QwenErrorData> = {\n errorSchema: qwenErrorDataSchema,\n errorToMessage: data => data.message,\n}\n","import type {\n LanguageModelV1,\n LanguageModelV1CallWarning,\n} from \"@ai-sdk/provider\"\nimport {\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\"\n\n/**\n * Prepares the tool configuration for language model generation.\n * @param param0 Object containing mode details and structured output flag.\n * @returns An object with tools, tool choice and any warnings.\n */\nexport function prepareTools({\n mode,\n}: {\n mode: Parameters<LanguageModelV1[\"doGenerate\"]>[0][\"mode\"] & {\n type: \"regular\"\n }\n structuredOutputs: boolean\n}): {\n tools:\n | undefined\n | Array<{\n type: \"function\"\n function: {\n name: string\n description: string | undefined\n parameters: unknown\n }\n }>\n tool_choice:\n | { type: \"function\", function: { name: string } }\n | \"auto\"\n | \"none\"\n | \"required\"\n | undefined\n toolWarnings: LanguageModelV1CallWarning[]\n} {\n // Normalize tools array by converting empty array to undefined.\n const tools = mode.tools?.length ? mode.tools : undefined\n const toolWarnings: LanguageModelV1CallWarning[] = []\n\n if (tools == null) {\n return { tools: undefined, tool_choice: undefined, toolWarnings }\n }\n\n const toolChoice = mode.toolChoice\n const qwenCompatTools: Array<{\n type: \"function\"\n function: {\n name: string\n description: string | undefined\n parameters: unknown\n }\n }> = []\n\n // Process each tool and format for compatibility.\n for (const tool of tools) {\n if (tool.type === \"provider-defined\") {\n // Warn if the tool is provider-defined.\n toolWarnings.push({ type: \"unsupported-tool\", tool })\n }\n else {\n qwenCompatTools.push({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n })\n }\n }\n\n if (toolChoice == null) {\n return { tools: qwenCompatTools, tool_choice: undefined, toolWarnings }\n }\n\n const type = toolChoice.type\n\n // Determine tool choice strategy.\n switch (type) {\n case \"auto\":\n case \"none\":\n case \"required\":\n return { tools: qwenCompatTools, tool_choice: type, toolWarnings }\n case \"tool\":\n return {\n tools: qwenCompatTools,\n tool_choice: {\n type: \"function\",\n function: {\n name: toolChoice.toolName,\n },\n },\n toolWarnings,\n }\n default: {\n // Exhaustive check to ensure all cases are handled.\n const _exhaustiveCheck: never = type\n throw new UnsupportedFunctionalityError({\n functionality: `Unsupported tool choice type: ${_exhaustiveCheck}`,\n })\n }\n }\n}\n","import type {\n APICallError,\n LanguageModelV1,\n LanguageModelV1CallWarning,\n LanguageModelV1FinishReason,\n LanguageModelV1StreamPart,\n} from \"@ai-sdk/provider\"\nimport type {\n FetchFunction,\n ParseResult,\n ResponseHandler,\n} from \"@ai-sdk/provider-utils\"\nimport type {\n QwenCompletionModelId,\n QwenCompletionSettings,\n} from \"./qwen-completion-settings\"\nimport type {\n QwenErrorStructure,\n} from \"./qwen-error\"\nimport {\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\"\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\"\nimport { z } from \"zod\"\nimport { convertToQwenCompletionPrompt } from \"./convert-to-qwen-completion-prompt\"\nimport { getResponseMetadata } from \"./get-response-metadata\"\nimport { mapQwenFinishReason } from \"./map-qwen-finish-reason\"\nimport {\n defaultQwenErrorStructure,\n} from \"./qwen-error\"\n\ninterface QwenCompletionConfig {\n provider: string\n headers: () => Record<string, string | undefined>\n url: (options: { modelId: string, path: string }) => string\n fetch?: FetchFunction\n errorStructure?: QwenErrorStructure<any>\n}\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst QwenCompletionResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n text: z.string(),\n finish_reason: z.string(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n })\n .nullish(),\n})\n\n/**\n * A language model implementation for Qwen completions.\n *\n * @remarks\n * Implements the LanguageModelV1 interface and handles regular, streaming completions.\n */\nexport class QwenCompletionLanguageModel\nimplements LanguageModelV1 {\n readonly specificationVersion = \"v1\"\n readonly defaultObjectGenerationMode = undefined\n\n readonly modelId: QwenCompletionModelId\n readonly settings: QwenCompletionSettings\n\n private readonly config: QwenCompletionConfig\n private readonly failedResponseHandler: ResponseHandler<APICallError>\n private readonly chunkSchema // type inferred via constructor\n\n /**\n * Creates an instance of QwenCompletionLanguageModel.\n *\n * @param modelId - The model identifier.\n * @param settings - The settings specific for Qwen completions.\n * @param config - The configuration object which includes provider options and error handling.\n */\n constructor(\n modelId: QwenCompletionModelId,\n settings: QwenCompletionSettings,\n config: QwenCompletionConfig,\n ) {\n this.modelId = modelId\n this.settings = settings\n this.config = config\n\n // Initialize error handling schema and response handler.\n const errorStructure\n = config.errorStructure ?? defaultQwenErrorStructure\n this.chunkSchema = createQwenCompletionChunkSchema(\n errorStructure.errorSchema,\n )\n this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure)\n }\n\n get provider(): string {\n return this.config.provider\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split(\".\")[0].trim()\n }\n\n /**\n * Generates the arguments for invoking the LanguageModelV1 doGenerate method.\n *\n * This function processes the given options to build a configuration object for the request. It converts the\n * input prompt to a Qwen-specific format, merges stop sequences from both the user and the prompt conversion,\n * and applies standardized settings for model generation. Additionally, it emits warnings for any unsupported\n * settings (e.g., topK and non-text response formats) and throws errors if unsupported functionalities\n * (such as tools, toolChoice, or specific modes) are detected.\n *\n * @param options - The configuration options for generating completion arguments.\n * @param options.mode - The mode for generation, specifying the type and any additional functionalities.\n * @param options.inputFormat - The format of the input prompt.\n * @param options.prompt - The prompt text to be processed and used for generating a completion.\n * @param options.maxTokens - The maximum number of tokens to generate.\n * @param options.temperature - The sampling temperature for generation randomness.\n * @param options.topP - The nucleus sampling probability threshold.\n * @param options.topK - The Top-K sampling parameter (unsupported; will trigger a warning if provided).\n * @param options.frequencyPenalty - The frequency penalty to reduce token repetition.\n * @param options.presencePenalty - The presence penalty to encourage novel token generation.\n * @param options.stopSequences - Additional stop sequences provided by the user.\n * @param options.responseFormat - The desired response format (non-text formats will trigger a warning).\n * @param options.seed - The seed for random number generation, ensuring deterministic outputs.\n * @param options.providerMetadata - Additional metadata to be merged into the provider-specific settings.\n *\n * @returns An object containing:\n * - args: The built arguments object ready to be passed to the generation method.\n * - warnings: A list of warnings for unsupported settings that were detected.\n *\n * @throws UnsupportedFunctionalityError If unsupported functionalities (tools, toolChoice, object-json mode,\n * or object-tool mode) are specified in the mode configuration.\n */\n private getArgs({\n mode,\n inputFormat,\n prompt,\n maxTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences: userStopSequences,\n responseFormat,\n seed,\n providerMetadata,\n }: Parameters<LanguageModelV1[\"doGenerate\"]>[0]) {\n const type = mode.type\n\n const warnings: LanguageModelV1CallWarning[] = []\n\n // Warn if unsupported settings are used.\n if (topK != null) {\n warnings.push({\n type: \"unsupported-setting\",\n setting: \"topK\",\n })\n }\n\n if (responseFormat != null && responseFormat.type !== \"text\") {\n warnings.push({\n type: \"unsupported-setting\",\n setting: \"responseFormat\",\n details: \"JSON response format is not supported.\",\n })\n }\n\n // Convert prompt to Qwen-specific prompt info.\n const { prompt: completionPrompt, stopSequences }\n = convertToQwenCompletionPrompt({ prompt, inputFormat })\n\n const stop = [...(stopSequences ?? []), ...(userStopSequences ?? [])]\n\n const baseArgs = {\n // Model id and settings:\n model: this.modelId,\n echo: this.settings.echo,\n logit_bias: this.settings.logitBias,\n suffix: this.settings.suffix,\n user: this.settings.user,\n // Standardized settings:\n max_tokens: maxTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n ...providerMetadata?.[this.providerOptionsName],\n // Prompt and stop sequences:\n prompt: completionPrompt,\n stop: stop.length > 0 ? stop : undefined,\n }\n\n switch (type) {\n case \"regular\": {\n // Tools are not supported in \"regular\" mode.\n if (mode.tools?.length) {\n throw new UnsupportedFunctionalityError({\n functionality: \"tools\",\n })\n }\n\n if (mode.toolChoice) {\n throw new UnsupportedFunctionalityError({\n functionality: \"toolChoice\",\n })\n }\n\n return { args: baseArgs, warnings }\n }\n\n case \"object-json\": {\n throw new UnsupportedFunctionalityError({\n functionality: \"object-json mode\",\n })\n }\n\n case \"object-tool\": {\n throw new UnsupportedFunctionalityError({\n functionality: \"object-tool mode\",\n })\n }\n\n default: {\n const _exhaustiveCheck: never = type\n throw new Error(`Unsupported type: ${_exhaustiveCheck}`)\n }\n }\n }\n\n /**\n * Generates a completion response.\n *\n * @param options - Generation options including prompt and parameters.\n * @returns A promise resolving the generated text, usage, finish status, and metadata.\n */\n async doGenerate(\n options: Parameters<LanguageModelV1[\"doGenerate\"]>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>> {\n const { args, warnings } = this.getArgs(options)\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: \"/completions\",\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n QwenCompletionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n })\n\n // Extract raw prompt and settings for debugging.\n const { prompt: rawPrompt, ...rawSettings } = args\n const choice = response.choices[0]\n\n return {\n text: choice.text,\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? Number.NaN,\n completionTokens: response.usage?.completion_tokens ?? Number.NaN,\n },\n finishReason: mapQwenFinishReason(choice.finish_reason),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n response: getResponseMetadata(response),\n warnings,\n request: { body: JSON.stringify(args) },\n }\n }\n\n /**\n * Streams a completion response.\n *\n * @param options - Generation options including prompt and parameters.\n * @returns A promise resolving a stream of response parts and metadata.\n */\n async doStream(\n options: Parameters<LanguageModelV1[\"doStream\"]>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV1[\"doStream\"]>>> {\n const { args, warnings } = this.getArgs(options)\n\n const body = {\n ...args,\n stream: true,\n }\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: \"/completions\",\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n this.chunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n })\n\n const { prompt: rawPrompt, ...rawSettings } = args\n\n let finishReason: LanguageModelV1FinishReason = \"unknown\"\n let usage: { promptTokens: number, completionTokens: number } = {\n promptTokens: Number.NaN,\n completionTokens: Number.NaN,\n }\n let isFirstChunk = true\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof this.chunkSchema>>,\n LanguageModelV1StreamPart\n >({\n transform(chunk, controller) {\n // Validate the current chunk and handle potential errors.\n if (!chunk.success) {\n finishReason = \"error\"\n controller.enqueue({ type: \"error\", error: chunk.error })\n return\n }\n\n const value = chunk.value\n\n // If the API returns an error inside the chunk.\n if (\"error\" in value) {\n finishReason = \"error\"\n controller.enqueue({ type: \"error\", error: value.error })\n return\n }\n\n if (isFirstChunk) {\n isFirstChunk = false\n\n // Send response metadata on first successful chunk.\n controller.enqueue({\n type: \"response-metadata\",\n ...getResponseMetadata(value),\n })\n }\n\n if (value.usage != null) {\n usage = {\n promptTokens: value.usage.prompt_tokens,\n completionTokens: value.usage.completion_tokens,\n }\n }\n\n const choice = value.choices[0]\n\n if (choice?.finish_reason != null) {\n finishReason = mapQwenFinishReason(\n choice.finish_reason,\n )\n }\n\n if (choice?.text != null) {\n // Enqueue text delta for streaming.\n controller.enqueue({\n type: \"text-delta\",\n textDelta: choice.text,\n })\n }\n },\n\n flush(controller) {\n // Signal the end of the stream, passing finish reason and usage data.\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage,\n })\n },\n }),\n ),\n rawCall: { rawPrompt, rawSettings },\n rawResponse: { headers: responseHeaders },\n warnings,\n request: { body: JSON.stringify(body) },\n }\n }\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\n/**\n * Creates a Zod schema to validate Qwen completion stream chunks.\n *\n * @param errorSchema - Schema to validate error objects.\n * @returns A union schema for a valid chunk or an error.\n */\nfunction createQwenCompletionChunkSchema<\n ERROR_SCHEMA extends z.ZodType,\n>(errorSchema: ERROR_SCHEMA) {\n return z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n text: z.string(),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n })\n .nullish(),\n }),\n errorSchema,\n ])\n}\n","/* eslint-disable array-callback-return */\nimport type {\n LanguageModelV1Prompt,\n} from \"@ai-sdk/provider\"\nimport {\n InvalidPromptError,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\"\n\n/**\n * Converts a LanguageModelV1Prompt into a Qwen completion prompt.\n *\n * @param options - The configuration options\n * @param options.prompt - The input prompt in LanguageModelV1Prompt format\n * @param options.inputFormat - Either \"prompt\" (raw text input) or \"messages\" (chat messages)\n * @param options.user - Label for user messages (default: \"user\")\n * @param options.assistant - Label for assistant messages (default: \"assistant\")\n * @returns An object containing:\n * - prompt: The constructed prompt string\n * - stopSequences?: Array of strings to use as stop sequences\n * @throws {InvalidPromptError} When an unexpected system message is encountered\n * @throws {UnsupportedFunctionalityError} For unsupported content types such as images or tool-calls\n */\nexport function convertToQwenCompletionPrompt({\n prompt,\n inputFormat,\n user = \"user\",\n assistant = \"assistant\",\n}: {\n prompt: LanguageModelV1Prompt\n inputFormat: \"prompt\" | \"messages\"\n user?: string\n assistant?: string\n}): {\n prompt: string\n stopSequences?: string[]\n} {\n // If input is a straightforward prompt with one user message, return it directly.\n if (\n inputFormat === \"prompt\"\n && prompt.length === 1\n && prompt[0].role === \"user\"\n && prompt[0].content.length === 1\n && prompt[0].content[0].type === \"text\"\n ) {\n // Return the original text without transformation.\n return { prompt: prompt[0].content[0].text }\n }\n\n // Start assembling the text for a chat message format.\n let text = \"\"\n\n // If the first message is a system message, add its content first.\n if (prompt[0].role === \"system\") {\n text += `${prompt[0].content}\\n\\n`\n prompt = prompt.slice(1) // Remove the system message after processing.\n }\n\n // Process each message in the prompt.\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n // System messages are not expected beyond the first message.\n throw new InvalidPromptError({\n message: `Unexpected system message in prompt: ${content}`,\n prompt,\n })\n }\n\n case \"user\": {\n // Concatenate the parts of user messages.\n const userMessage = content\n .map((part) => {\n switch (part.type) {\n case \"text\": {\n return part.text\n }\n case \"image\": {\n // Images are not supported.\n throw new UnsupportedFunctionalityError({\n functionality: \"images\",\n })\n }\n default: {\n throw new Error(`Unsupported content part type: ${part.type}`)\n }\n }\n })\n .join(\"\")\n // Append user label and the message.\n text += `${user}:\\n${userMessage}\\n\\n`\n break\n }\n\n case \"assistant\": {\n // Process assistant messages similarly.\n const assistantMessage = content\n .map((part) => {\n switch (part.type) {\n case \"text\": {\n return part.text\n }\n case \"tool-call\": {\n // Tool-call messages are unsupported.\n throw new UnsupportedFunctionalityError({\n functionality: \"tool-call messages\",\n })\n }\n }\n })\n .join(\"\")\n // Append assistant label and the message.\n text += `${assistant}:\\n${assistantMessage}\\n\\n`\n break\n }\n\n case \"tool\": {\n // Tool messages are not supported.\n throw new UnsupportedFunctionalityError({\n functionality: \"tool messages\",\n })\n }\n\n default: {\n // Ensure exhaustive check.\n const _exhaustiveCheck: never = role\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`)\n }\n }\n }\n\n // Append the final assistant signal to the chat completion.\n text += `${assistant}:\\n`\n\n // Return the constructed prompt along with a stop sequence to separate future user inputs.\n return {\n prompt: text,\n stopSequences: [`\\n${user}:`],\n }\n}\n","import type {\n EmbeddingModelV1,\n} from \"@ai-sdk/provider\"\nimport type {\n FetchFunction,\n} from \"@ai-sdk/provider-utils\"\nimport type {\n QwenEmbeddingModelId,\n QwenEmbeddingSettings,\n} from \"./qwen-embedding-settings\"\nimport type {\n QwenErrorStructure,\n} from \"./qwen-error\"\nimport {\n TooManyEmbeddingValuesForCallError,\n} from \"@ai-sdk/provider\"\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n} from \"@ai-sdk/provider-utils\"\nimport { z } from \"zod\"\nimport {\n defaultQwenErrorStructure,\n} from \"./qwen-error\"\n\ninterface QwenEmbeddingConfig {\n /**\n Override the maximum number of embeddings per call.\n */\n maxEmbeddingsPerCall?: number\n\n /**\n Override the parallelism of embedding calls.\n */\n supportsParallelCalls?: boolean\n\n provider: string\n url: (options: { modelId: string, path: string }) => string\n headers: () => Record<string, string | undefined>\n fetch?: FetchFunction\n errorStructure?: QwenErrorStructure<any>\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst qwenTextEmbeddingResponseSchema = z.object({\n data: z.array(z.object({ embedding: z.array(z.number()) })),\n usage: z.object({ prompt_tokens: z.number() }).nullish(),\n})\n\nexport class QwenEmbeddingModel\nimplements EmbeddingModelV1<string> {\n readonly specificationVersion = \"v1\"\n readonly modelId: QwenEmbeddingModelId\n\n private readonly config: QwenEmbeddingConfig\n private readonly settings: QwenEmbeddingSettings\n\n get provider(): string {\n return this.config.provider\n }\n\n get maxEmbeddingsPerCall(): number {\n return this.config.maxEmbeddingsPerCall ?? 2048\n }\n\n get supportsParallelCalls(): boolean {\n return this.config.supportsParallelCalls ?? true\n }\n\n constructor(\n modelId: QwenEmbeddingModelId,\n settings: QwenEmbeddingSettings,\n config: QwenEmbeddingConfig,\n ) {\n this.modelId = modelId\n this.settings = settings\n this.config = config\n }\n\n /**\n * Sends a request to the Qwen API to generate embeddings for the provided text inputs.\n *\n * This function validates that the number of embedding values does not exceed the allowed limit,\n * constructs a JSON payload with the required parameters, and sends it to the API endpoint.\n * It processes the response to extract embeddings, usage statistics, and raw response headers.\n *\n * @param param0 - The parameters object.\n * @param param0.values - An array of strings to be embedded.\n * @param param0.headers - Optional HTTP headers for the API request.\n * @param param0.abortSignal - Optional signal to abort the API request.\n * @returns A promise that resolves with an object containing:\n * - embeddings: An array of embedding arrays.\n * - usage: Optional usage information, including token counts.\n * - rawResponse: The response headers from the API call.\n *\n * @throws TooManyEmbeddingValuesForCallError if the number of input values exceeds the maximum allowed.\n */\n async doEmbed({\n values,\n headers,\n abortSignal,\n }: Parameters<EmbeddingModelV1<string>[\"doEmbed\"]>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV1<string>[\"doEmbed\"]>>\n > {\n // Validate that number of embeddings does not exceed maximum allowed.\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n })\n }\n\n // Post the JSON payload to the API endpoint.\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: \"/embeddings\",\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), headers),\n body: {\n model: this.modelId,\n input: values,\n encoding_format: \"float\",\n dimensions: this.settings.dimensions,\n user: this.settings.user,\n },\n // Handle response errors using the provided error structure.\n failedResponseHandler: createJsonErrorResponseHandler(\n this.config.errorStructure ?? defaultQwenErrorStructure,\n ),\n // Process successful responses based on a minimal schema.\n successfulResponseHandler: createJsonResponseHandler(\n qwenTextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n })\n\n // Map response data to output format.\n return {\n embeddings: response.data.map(item => item.embedding),\n usage: response.usage\n ? { tokens: response.usage.prompt_tokens }\n : undefined,\n rawResponse: { headers: responseHeaders },\n }\n }\n}\n"],"mappings":"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","names":["createJsonErrorResponseHandler","z","UnsupportedFunctionalityError","z","createJsonErrorResponseHandler","_a","toolCall","UnsupportedFunctionalityError","combineHeaders","createEventSourceResponseHandler","createJsonErrorResponseHandler","createJsonResponseHandler","postJsonToApi","z","UnsupportedFunctionalityError","z","createJsonErrorResponseHandler","UnsupportedFunctionalityError","postJsonToApi","combineHeaders","createJsonResponseHandler","createEventSourceResponseHandler","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","postJsonToApi","z","z","postJsonToApi","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler"]}