{"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            controller.enqueue({\n              type: \"reasoning\",\n              textDelta: result.reasoning,\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    // Set stream flag to true for the API.\n    const body = JSON.stringify({ ...args, stream: true })\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: {\n        ...args,\n        stream: true,\n      },\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            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"]}