{"version":3,"sources":["jsdelivr-header.js","/npm/dify-client@3.0.0/src/types/common.ts","/npm/dify-client@3.0.0/src/errors/dify-error.ts","/npm/dify-client@3.0.0/src/http/form-data.ts","/npm/dify-client@3.0.0/src/http/sse.ts","/npm/dify-client@3.0.0/src/http/retry.ts","/npm/dify-client@3.0.0/src/client/validation.ts","/npm/dify-client@3.0.0/src/http/client.ts","/npm/dify-client@3.0.0/src/client/base.ts","/npm/dify-client@3.0.0/src/client/chat.ts","/npm/dify-client@3.0.0/src/client/completion.ts","/npm/dify-client@3.0.0/src/client/workflow.ts","/npm/dify-client@3.0.0/src/client/knowledge-base.ts","/npm/dify-client@3.0.0/src/client/workspace.ts","/npm/dify-client@3.0.0/src/index.ts"],"names":[],"mappings":"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","file":"/npm/dify-client@3.0.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/dify-client@3.0.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export const DEFAULT_BASE_URL = \"https://api.dify.ai/v1\";\nexport const DEFAULT_TIMEOUT_SECONDS = 60;\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_RETRY_DELAY_SECONDS = 1;\n\nexport type RequestMethod = \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n\nexport type QueryParamValue =\n  | string\n  | number\n  | boolean\n  | Array<string | number | boolean>\n  | undefined;\n\nexport type QueryParams = Record<string, QueryParamValue>;\n\nexport type Headers = Record<string, string>;\n\nexport type DifyClientConfig = {\n  apiKey: string;\n  baseUrl?: string;\n  timeout?: number;\n  maxRetries?: number;\n  retryDelay?: number;\n  enableLogging?: boolean;\n};\n\nexport type DifyResponse<T> = {\n  data: T;\n  status: number;\n  headers: Headers;\n  requestId?: string;\n};\n\nexport type MessageFeedbackRequest = {\n  messageId: string;\n  user: string;\n  rating?: \"like\" | \"dislike\" | null;\n  content?: string | null;\n};\n\nexport type TextToAudioRequest = {\n  user: string;\n  text?: string;\n  message_id?: string;\n  streaming?: boolean;\n  voice?: string;\n};\n\nexport type StreamEvent<T = unknown> = {\n  event?: string;\n  data: T | string | null;\n  raw: string;\n};\n\nexport type DifyStream<T = unknown> = AsyncIterable<StreamEvent<T>> & {\n  data: NodeJS.ReadableStream;\n  status: number;\n  headers: Headers;\n  requestId?: string;\n  toText(): Promise<string>;\n  toReadable(): NodeJS.ReadableStream;\n};\n\nexport type BinaryStream = {\n  data: NodeJS.ReadableStream;\n  status: number;\n  headers: Headers;\n  requestId?: string;\n  toReadable(): NodeJS.ReadableStream;\n};\n","export type DifyErrorOptions = {\n  statusCode?: number;\n  responseBody?: unknown;\n  requestId?: string;\n  retryAfter?: number;\n  cause?: unknown;\n};\n\nexport class DifyError extends Error {\n  statusCode?: number;\n  responseBody?: unknown;\n  requestId?: string;\n  retryAfter?: number;\n\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message);\n    this.name = \"DifyError\";\n    this.statusCode = options.statusCode;\n    this.responseBody = options.responseBody;\n    this.requestId = options.requestId;\n    this.retryAfter = options.retryAfter;\n    if (options.cause) {\n      (this as { cause?: unknown }).cause = options.cause;\n    }\n  }\n}\n\nexport class APIError extends DifyError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"APIError\";\n  }\n}\n\nexport class AuthenticationError extends APIError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"AuthenticationError\";\n  }\n}\n\nexport class RateLimitError extends APIError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"RateLimitError\";\n  }\n}\n\nexport class ValidationError extends APIError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"ValidationError\";\n  }\n}\n\nexport class NetworkError extends DifyError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"NetworkError\";\n  }\n}\n\nexport class TimeoutError extends DifyError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"TimeoutError\";\n  }\n}\n\nexport class FileUploadError extends DifyError {\n  constructor(message: string, options: DifyErrorOptions = {}) {\n    super(message, options);\n    this.name = \"FileUploadError\";\n  }\n}\n","import type { Headers } from \"../types/common\";\n\nexport type FormDataLike = {\n  append: (...args: unknown[]) => void;\n  getHeaders?: () => Headers;\n  constructor?: { name?: string };\n};\n\nexport const isFormData = (value: unknown): value is FormDataLike => {\n  if (!value || typeof value !== \"object\") {\n    return false;\n  }\n  if (typeof FormData !== \"undefined\" && value instanceof FormData) {\n    return true;\n  }\n  const candidate = value as FormDataLike;\n  if (typeof candidate.append !== \"function\") {\n    return false;\n  }\n  if (typeof candidate.getHeaders === \"function\") {\n    return true;\n  }\n  return candidate.constructor?.name === \"FormData\";\n};\n\nexport const getFormDataHeaders = (form: FormDataLike): Headers => {\n  if (typeof form.getHeaders === \"function\") {\n    return form.getHeaders();\n  }\n  return {};\n};\n","import type { Readable } from \"node:stream\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport type { BinaryStream, DifyStream, Headers, StreamEvent } from \"../types/common\";\n\nconst readLines = async function* (stream: Readable): AsyncIterable<string> {\n  const decoder = new StringDecoder(\"utf8\");\n  let buffered = \"\";\n  for await (const chunk of stream) {\n    buffered += decoder.write(chunk as Buffer);\n    let index = buffered.indexOf(\"\\n\");\n    while (index >= 0) {\n      let line = buffered.slice(0, index);\n      buffered = buffered.slice(index + 1);\n      if (line.endsWith(\"\\r\")) {\n        line = line.slice(0, -1);\n      }\n      yield line;\n      index = buffered.indexOf(\"\\n\");\n    }\n  }\n  buffered += decoder.end();\n  if (buffered) {\n    yield buffered;\n  }\n};\n\nconst parseMaybeJson = (value: string): unknown => {\n  if (!value) {\n    return null;\n  }\n  try {\n    return JSON.parse(value);\n  } catch {\n    return value;\n  }\n};\n\nexport const parseSseStream = async function* <T>(\n  stream: Readable\n): AsyncIterable<StreamEvent<T>> {\n  let eventName: string | undefined;\n  const dataLines: string[] = [];\n\n  const emitEvent = function* (): Iterable<StreamEvent<T>> {\n    if (!eventName && dataLines.length === 0) {\n      return;\n    }\n    const raw = dataLines.join(\"\\n\");\n    const parsed = parseMaybeJson(raw) as T | string | null;\n    yield {\n      event: eventName,\n      data: parsed,\n      raw,\n    };\n    eventName = undefined;\n    dataLines.length = 0;\n  };\n\n  for await (const line of readLines(stream)) {\n    if (!line) {\n      yield* emitEvent();\n      continue;\n    }\n    if (line.startsWith(\":\")) {\n      continue;\n    }\n    if (line.startsWith(\"event:\")) {\n      eventName = line.slice(\"event:\".length).trim();\n      continue;\n    }\n    if (line.startsWith(\"data:\")) {\n      dataLines.push(line.slice(\"data:\".length).trimStart());\n      continue;\n    }\n  }\n\n  yield* emitEvent();\n};\n\nconst extractTextFromEvent = (data: unknown): string => {\n  if (typeof data === \"string\") {\n    return data;\n  }\n  if (!data || typeof data !== \"object\") {\n    return \"\";\n  }\n  const record = data as Record<string, unknown>;\n  if (typeof record.answer === \"string\") {\n    return record.answer;\n  }\n  if (typeof record.text === \"string\") {\n    return record.text;\n  }\n  if (typeof record.delta === \"string\") {\n    return record.delta;\n  }\n  return \"\";\n};\n\nexport const createSseStream = <T>(\n  stream: Readable,\n  meta: { status: number; headers: Headers; requestId?: string }\n): DifyStream<T> => {\n  const iterator = parseSseStream<T>(stream)[Symbol.asyncIterator]();\n  const iterable = {\n    [Symbol.asyncIterator]: () => iterator,\n    data: stream,\n    status: meta.status,\n    headers: meta.headers,\n    requestId: meta.requestId,\n    toReadable: () => stream,\n    toText: async () => {\n      let text = \"\";\n      for await (const event of iterable) {\n        text += extractTextFromEvent(event.data);\n      }\n      return text;\n    },\n  } satisfies DifyStream<T>;\n\n  return iterable;\n};\n\nexport const createBinaryStream = (\n  stream: Readable,\n  meta: { status: number; headers: Headers; requestId?: string }\n): BinaryStream => ({\n  data: stream,\n  status: meta.status,\n  headers: meta.headers,\n  requestId: meta.requestId,\n  toReadable: () => stream,\n});\n","import { RateLimitError, NetworkError, TimeoutError } from \"../errors/dify-error\";\n\nexport const sleep = (ms: number): Promise<void> =>\n  new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n\nexport const getRetryDelayMs = (\n  attempt: number,\n  retryDelaySeconds: number,\n  retryAfterSeconds?: number\n): number => {\n  if (retryAfterSeconds && retryAfterSeconds > 0) {\n    return retryAfterSeconds * 1000;\n  }\n  const base = retryDelaySeconds * 1000;\n  const exponential = base * Math.pow(2, Math.max(0, attempt - 1));\n  const jitter = Math.random() * base;\n  return exponential + jitter;\n};\n\nexport const shouldRetry = (\n  error: unknown,\n  attempt: number,\n  maxRetries: number\n): boolean => {\n  if (attempt >= maxRetries) {\n    return false;\n  }\n  if (error instanceof TimeoutError) {\n    return true;\n  }\n  if (error instanceof NetworkError) {\n    return true;\n  }\n  if (error instanceof RateLimitError) {\n    return true;\n  }\n  return false;\n};\n","import { ValidationError } from \"../errors/dify-error\";\n\nconst MAX_STRING_LENGTH = 10000;\nconst MAX_LIST_LENGTH = 1000;\nconst MAX_DICT_LENGTH = 100;\n\nexport function ensureNonEmptyString(\n  value: unknown,\n  name: string\n): asserts value is string {\n  if (typeof value !== \"string\" || value.trim().length === 0) {\n    throw new ValidationError(`${name} must be a non-empty string`);\n  }\n  if (value.length > MAX_STRING_LENGTH) {\n    throw new ValidationError(\n      `${name} exceeds maximum length of ${MAX_STRING_LENGTH} characters`\n    );\n  }\n}\n\n/**\n * Validates optional string fields that must be non-empty when provided.\n * Use this for fields like `name` that are optional but should not be empty strings.\n *\n * For filter parameters that accept empty strings (e.g., `keyword: \"\"`),\n * use `validateParams` which allows empty strings for optional params.\n */\nexport function ensureOptionalString(value: unknown, name: string): void {\n  if (value === undefined || value === null) {\n    return;\n  }\n  if (typeof value !== \"string\" || value.trim().length === 0) {\n    throw new ValidationError(`${name} must be a non-empty string when set`);\n  }\n  if (value.length > MAX_STRING_LENGTH) {\n    throw new ValidationError(\n      `${name} exceeds maximum length of ${MAX_STRING_LENGTH} characters`\n    );\n  }\n}\n\nexport function ensureOptionalInt(value: unknown, name: string): void {\n  if (value === undefined || value === null) {\n    return;\n  }\n  if (!Number.isInteger(value)) {\n    throw new ValidationError(`${name} must be an integer when set`);\n  }\n}\n\nexport function ensureOptionalBoolean(value: unknown, name: string): void {\n  if (value === undefined || value === null) {\n    return;\n  }\n  if (typeof value !== \"boolean\") {\n    throw new ValidationError(`${name} must be a boolean when set`);\n  }\n}\n\nexport function ensureStringArray(value: unknown, name: string): void {\n  if (!Array.isArray(value) || value.length === 0) {\n    throw new ValidationError(`${name} must be a non-empty string array`);\n  }\n  if (value.length > MAX_LIST_LENGTH) {\n    throw new ValidationError(\n      `${name} exceeds maximum size of ${MAX_LIST_LENGTH} items`\n    );\n  }\n  value.forEach((item) => {\n    if (typeof item !== \"string\" || item.trim().length === 0) {\n      throw new ValidationError(`${name} must contain non-empty strings`);\n    }\n  });\n}\n\nexport function ensureOptionalStringArray(value: unknown, name: string): void {\n  if (value === undefined || value === null) {\n    return;\n  }\n  ensureStringArray(value, name);\n}\n\nexport function ensureRating(value: unknown): void {\n  if (value === undefined || value === null) {\n    return;\n  }\n  if (value !== \"like\" && value !== \"dislike\") {\n    throw new ValidationError(\"rating must be either 'like' or 'dislike'\");\n  }\n}\n\nexport function validateParams(params: Record<string, unknown>): void {\n  Object.entries(params).forEach(([key, value]) => {\n    if (value === undefined || value === null) {\n      return;\n    }\n\n    // Only check max length for strings; empty strings are allowed for optional params\n    // Required fields are validated at method level via ensureNonEmptyString\n    if (typeof value === \"string\") {\n      if (value.length > MAX_STRING_LENGTH) {\n        throw new ValidationError(\n          `Parameter '${key}' exceeds maximum length of ${MAX_STRING_LENGTH} characters`\n        );\n      }\n    } else if (Array.isArray(value)) {\n      if (value.length > MAX_LIST_LENGTH) {\n        throw new ValidationError(\n          `Parameter '${key}' exceeds maximum size of ${MAX_LIST_LENGTH} items`\n        );\n      }\n    } else if (typeof value === \"object\") {\n      if (Object.keys(value as Record<string, unknown>).length > MAX_DICT_LENGTH) {\n        throw new ValidationError(\n          `Parameter '${key}' exceeds maximum size of ${MAX_DICT_LENGTH} items`\n        );\n      }\n    }\n\n    if (key === \"user\" && typeof value !== \"string\") {\n      throw new ValidationError(`Parameter '${key}' must be a string`);\n    }\n    if (\n      (key === \"page\" || key === \"limit\" || key === \"page_size\") &&\n      !Number.isInteger(value)\n    ) {\n      throw new ValidationError(`Parameter '${key}' must be an integer`);\n    }\n    if (key === \"files\" && !Array.isArray(value) && typeof value !== \"object\") {\n      throw new ValidationError(`Parameter '${key}' must be a list or dict`);\n    }\n    if (key === \"rating\" && value !== \"like\" && value !== \"dislike\") {\n      throw new ValidationError(`Parameter '${key}' must be 'like' or 'dislike'`);\n    }\n  });\n}\n","import axios from \"axios\";\nimport type {\n  AxiosError,\n  AxiosInstance,\n  AxiosRequestConfig,\n  AxiosResponse,\n} from \"axios\";\nimport type { Readable } from \"node:stream\";\nimport {\n  DEFAULT_BASE_URL,\n  DEFAULT_MAX_RETRIES,\n  DEFAULT_RETRY_DELAY_SECONDS,\n  DEFAULT_TIMEOUT_SECONDS,\n} from \"../types/common\";\nimport type {\n  DifyClientConfig,\n  DifyResponse,\n  Headers,\n  QueryParams,\n  RequestMethod,\n} from \"../types/common\";\nimport type { DifyError } from \"../errors/dify-error\";\nimport {\n  APIError,\n  AuthenticationError,\n  FileUploadError,\n  NetworkError,\n  RateLimitError,\n  TimeoutError,\n  ValidationError,\n} from \"../errors/dify-error\";\nimport { getFormDataHeaders, isFormData } from \"./form-data\";\nimport { createBinaryStream, createSseStream } from \"./sse\";\nimport { getRetryDelayMs, shouldRetry, sleep } from \"./retry\";\nimport { validateParams } from \"../client/validation\";\n\nconst DEFAULT_USER_AGENT = \"dify-client-node\";\n\nexport type RequestOptions = {\n  method: RequestMethod;\n  path: string;\n  query?: QueryParams;\n  data?: unknown;\n  headers?: Headers;\n  responseType?: AxiosRequestConfig[\"responseType\"];\n};\n\nexport type HttpClientSettings = Required<\n  Omit<DifyClientConfig, \"apiKey\">\n> & {\n  apiKey: string;\n};\n\nconst normalizeSettings = (config: DifyClientConfig): HttpClientSettings => ({\n  apiKey: config.apiKey,\n  baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n  timeout: config.timeout ?? DEFAULT_TIMEOUT_SECONDS,\n  maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,\n  retryDelay: config.retryDelay ?? DEFAULT_RETRY_DELAY_SECONDS,\n  enableLogging: config.enableLogging ?? false,\n});\n\nconst normalizeHeaders = (headers: AxiosResponse[\"headers\"]): Headers => {\n  const result: Headers = {};\n  if (!headers) {\n    return result;\n  }\n  Object.entries(headers).forEach(([key, value]) => {\n    if (Array.isArray(value)) {\n      result[key.toLowerCase()] = value.join(\", \");\n    } else if (typeof value === \"string\") {\n      result[key.toLowerCase()] = value;\n    } else if (typeof value === \"number\") {\n      result[key.toLowerCase()] = value.toString();\n    }\n  });\n  return result;\n};\n\nconst resolveRequestId = (headers: Headers): string | undefined =>\n  headers[\"x-request-id\"] ?? headers[\"x-requestid\"];\n\nconst buildRequestUrl = (baseUrl: string, path: string): string => {\n  const trimmed = baseUrl.replace(/\\/+$/, \"\");\n  return `${trimmed}${path}`;\n};\n\nconst buildQueryString = (params?: QueryParams): string => {\n  if (!params) {\n    return \"\";\n  }\n  const searchParams = new URLSearchParams();\n  Object.entries(params).forEach(([key, value]) => {\n    if (value === undefined || value === null) {\n      return;\n    }\n    if (Array.isArray(value)) {\n      value.forEach((item) => {\n        searchParams.append(key, String(item));\n      });\n      return;\n    }\n    searchParams.append(key, String(value));\n  });\n  return searchParams.toString();\n};\n\nconst parseRetryAfterSeconds = (headerValue?: string): number | undefined => {\n  if (!headerValue) {\n    return undefined;\n  }\n  const asNumber = Number.parseInt(headerValue, 10);\n  if (!Number.isNaN(asNumber)) {\n    return asNumber;\n  }\n  const asDate = Date.parse(headerValue);\n  if (!Number.isNaN(asDate)) {\n    const diff = asDate - Date.now();\n    return diff > 0 ? Math.ceil(diff / 1000) : 0;\n  }\n  return undefined;\n};\n\nconst isReadableStream = (value: unknown): value is Readable => {\n  if (!value || typeof value !== \"object\") {\n    return false;\n  }\n  return typeof (value as { pipe?: unknown }).pipe === \"function\";\n};\n\nconst isUploadLikeRequest = (config?: AxiosRequestConfig): boolean => {\n  const url = (config?.url ?? \"\").toLowerCase();\n  if (!url) {\n    return false;\n  }\n  return (\n    url.includes(\"upload\") ||\n    url.includes(\"/files/\") ||\n    url.includes(\"audio-to-text\") ||\n    url.includes(\"create_by_file\") ||\n    url.includes(\"update_by_file\")\n  );\n};\n\nconst resolveErrorMessage = (status: number, responseBody: unknown): string => {\n  if (typeof responseBody === \"string\" && responseBody.trim().length > 0) {\n    return responseBody;\n  }\n  if (\n    responseBody &&\n    typeof responseBody === \"object\" &&\n    \"message\" in responseBody\n  ) {\n    const message = (responseBody as Record<string, unknown>).message;\n    if (typeof message === \"string\" && message.trim().length > 0) {\n      return message;\n    }\n  }\n  return `Request failed with status code ${status}`;\n};\n\nconst mapAxiosError = (error: unknown): DifyError => {\n  if (axios.isAxiosError(error)) {\n    const axiosError = error as AxiosError;\n    if (axiosError.response) {\n      const status = axiosError.response.status;\n      const headers = normalizeHeaders(axiosError.response.headers);\n      const requestId = resolveRequestId(headers);\n      const responseBody = axiosError.response.data;\n      const message = resolveErrorMessage(status, responseBody);\n\n      if (status === 401) {\n        return new AuthenticationError(message, {\n          statusCode: status,\n          responseBody,\n          requestId,\n        });\n      }\n      if (status === 429) {\n        const retryAfter = parseRetryAfterSeconds(headers[\"retry-after\"]);\n        return new RateLimitError(message, {\n          statusCode: status,\n          responseBody,\n          requestId,\n          retryAfter,\n        });\n      }\n      if (status === 422) {\n        return new ValidationError(message, {\n          statusCode: status,\n          responseBody,\n          requestId,\n        });\n      }\n      if (status === 400) {\n        if (isUploadLikeRequest(axiosError.config)) {\n          return new FileUploadError(message, {\n            statusCode: status,\n            responseBody,\n            requestId,\n          });\n        }\n      }\n      return new APIError(message, {\n        statusCode: status,\n        responseBody,\n        requestId,\n      });\n    }\n    if (axiosError.code === \"ECONNABORTED\") {\n      return new TimeoutError(\"Request timed out\", { cause: axiosError });\n    }\n    return new NetworkError(axiosError.message, { cause: axiosError });\n  }\n  if (error instanceof Error) {\n    return new NetworkError(error.message, { cause: error });\n  }\n  return new NetworkError(\"Unexpected network error\", { cause: error });\n};\n\nexport class HttpClient {\n  private axios: AxiosInstance;\n  private settings: HttpClientSettings;\n\n  constructor(config: DifyClientConfig) {\n    this.settings = normalizeSettings(config);\n    this.axios = axios.create({\n      baseURL: this.settings.baseUrl,\n      timeout: this.settings.timeout * 1000,\n    });\n  }\n\n  updateApiKey(apiKey: string): void {\n    this.settings.apiKey = apiKey;\n  }\n\n  getSettings(): HttpClientSettings {\n    return { ...this.settings };\n  }\n\n  async request<T>(options: RequestOptions): Promise<DifyResponse<T>> {\n    const response = await this.requestRaw(options);\n    const headers = normalizeHeaders(response.headers);\n    return {\n      data: response.data as T,\n      status: response.status,\n      headers,\n      requestId: resolveRequestId(headers),\n    };\n  }\n\n  async requestStream<T>(options: RequestOptions) {\n    const response = await this.requestRaw({\n      ...options,\n      responseType: \"stream\",\n    });\n    const headers = normalizeHeaders(response.headers);\n    return createSseStream<T>(response.data as Readable, {\n      status: response.status,\n      headers,\n      requestId: resolveRequestId(headers),\n    });\n  }\n\n  async requestBinaryStream(options: RequestOptions) {\n    const response = await this.requestRaw({\n      ...options,\n      responseType: \"stream\",\n    });\n    const headers = normalizeHeaders(response.headers);\n    return createBinaryStream(response.data as Readable, {\n      status: response.status,\n      headers,\n      requestId: resolveRequestId(headers),\n    });\n  }\n\n  async requestRaw(options: RequestOptions): Promise<AxiosResponse> {\n    const { method, path, query, data, headers, responseType } = options;\n    const { apiKey, enableLogging, maxRetries, retryDelay, timeout } =\n      this.settings;\n\n    if (query) {\n      validateParams(query as Record<string, unknown>);\n    }\n    if (\n      data &&\n      typeof data === \"object\" &&\n      !Array.isArray(data) &&\n      !isFormData(data) &&\n      !isReadableStream(data)\n    ) {\n      validateParams(data as Record<string, unknown>);\n    }\n\n    const requestHeaders: Headers = {\n      Authorization: `Bearer ${apiKey}`,\n      ...headers,\n    };\n    if (\n      typeof process !== \"undefined\" &&\n      !!process.versions?.node &&\n      !requestHeaders[\"User-Agent\"] &&\n      !requestHeaders[\"user-agent\"]\n    ) {\n      requestHeaders[\"User-Agent\"] = DEFAULT_USER_AGENT;\n    }\n\n    if (isFormData(data)) {\n      Object.assign(requestHeaders, getFormDataHeaders(data));\n    } else if (data && method !== \"GET\") {\n      requestHeaders[\"Content-Type\"] = \"application/json\";\n    }\n\n    const url = buildRequestUrl(this.settings.baseUrl, path);\n\n    if (enableLogging) {\n      console.info(`dify-client-node request ${method} ${url}`);\n    }\n\n    const axiosConfig: AxiosRequestConfig = {\n      method,\n      url: path,\n      params: query,\n      paramsSerializer: {\n        serialize: (params) => buildQueryString(params as QueryParams),\n      },\n      headers: requestHeaders,\n      responseType: responseType ?? \"json\",\n      timeout: timeout * 1000,\n    };\n\n    if (method !== \"GET\" && data !== undefined) {\n      axiosConfig.data = data;\n    }\n\n    let attempt = 0;\n    // `attempt` is a zero-based retry counter\n    // Total attempts = 1 (initial) + maxRetries\n    // e.g., maxRetries=3 means: attempt 0 (initial), then retries at 1, 2, 3\n    while (true) {\n      try {\n        const response = await this.axios.request(axiosConfig);\n        if (enableLogging) {\n          console.info(\n            `dify-client-node response ${response.status} ${method} ${url}`\n          );\n        }\n        return response;\n      } catch (error) {\n        const mapped = mapAxiosError(error);\n        if (!shouldRetry(mapped, attempt, maxRetries)) {\n          throw mapped;\n        }\n        const retryAfterSeconds =\n          mapped instanceof RateLimitError ? mapped.retryAfter : undefined;\n        const delay = getRetryDelayMs(attempt + 1, retryDelay, retryAfterSeconds);\n        if (enableLogging) {\n          console.info(\n            `dify-client-node retry ${attempt + 1} in ${delay}ms for ${method} ${url}`\n          );\n        }\n        attempt += 1;\n        await sleep(delay);\n      }\n    }\n  }\n}\n","import type {\n  BinaryStream,\n  DifyClientConfig,\n  DifyResponse,\n  MessageFeedbackRequest,\n  QueryParams,\n  RequestMethod,\n  TextToAudioRequest,\n} from \"../types/common\";\nimport { HttpClient } from \"../http/client\";\nimport { ensureNonEmptyString, ensureRating } from \"./validation\";\nimport { FileUploadError, ValidationError } from \"../errors/dify-error\";\nimport { isFormData } from \"../http/form-data\";\n\nconst toConfig = (\n  init: string | DifyClientConfig,\n  baseUrl?: string\n): DifyClientConfig => {\n  if (typeof init === \"string\") {\n    return {\n      apiKey: init,\n      baseUrl,\n    };\n  }\n  return init;\n};\n\nconst appendUserToFormData = (form: unknown, user: string): void => {\n  if (!isFormData(form)) {\n    throw new FileUploadError(\"FormData is required for file uploads\");\n  }\n  if (typeof form.append === \"function\") {\n    form.append(\"user\", user);\n  }\n};\n\nexport class DifyClient {\n  protected http: HttpClient;\n\n  constructor(config: string | DifyClientConfig | HttpClient, baseUrl?: string) {\n    if (config instanceof HttpClient) {\n      this.http = config;\n    } else {\n      this.http = new HttpClient(toConfig(config, baseUrl));\n    }\n  }\n\n  updateApiKey(apiKey: string): void {\n    ensureNonEmptyString(apiKey, \"apiKey\");\n    this.http.updateApiKey(apiKey);\n  }\n\n  getHttpClient(): HttpClient {\n    return this.http;\n  }\n\n  sendRequest(\n    method: RequestMethod,\n    endpoint: string,\n    data: unknown = null,\n    params: QueryParams | null = null,\n    stream = false,\n    headerParams: Record<string, string> = {}\n  ): ReturnType<HttpClient[\"requestRaw\"]> {\n    return this.http.requestRaw({\n      method,\n      path: endpoint,\n      data,\n      query: params ?? undefined,\n      headers: headerParams,\n      responseType: stream ? \"stream\" : \"json\",\n    });\n  }\n\n  getRoot(): Promise<DifyResponse<unknown>> {\n    return this.http.request({\n      method: \"GET\",\n      path: \"/\",\n    });\n  }\n\n  getApplicationParameters(user?: string): Promise<DifyResponse<unknown>> {\n    if (user) {\n      ensureNonEmptyString(user, \"user\");\n    }\n    return this.http.request({\n      method: \"GET\",\n      path: \"/parameters\",\n      query: user ? { user } : undefined,\n    });\n  }\n\n  async getParameters(user?: string): Promise<DifyResponse<unknown>> {\n    return this.getApplicationParameters(user);\n  }\n\n  getMeta(user?: string): Promise<DifyResponse<unknown>> {\n    if (user) {\n      ensureNonEmptyString(user, \"user\");\n    }\n    return this.http.request({\n      method: \"GET\",\n      path: \"/meta\",\n      query: user ? { user } : undefined,\n    });\n  }\n\n  messageFeedback(\n    request: MessageFeedbackRequest\n  ): Promise<DifyResponse<Record<string, unknown>>>;\n  messageFeedback(\n    messageId: string,\n    rating: \"like\" | \"dislike\" | null,\n    user: string,\n    content?: string\n  ): Promise<DifyResponse<Record<string, unknown>>>;\n  messageFeedback(\n    messageIdOrRequest: string | MessageFeedbackRequest,\n    rating?: \"like\" | \"dislike\" | null,\n    user?: string,\n    content?: string\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    let messageId: string;\n    const payload: Record<string, unknown> = {};\n\n    if (typeof messageIdOrRequest === \"string\") {\n      messageId = messageIdOrRequest;\n      ensureNonEmptyString(messageId, \"messageId\");\n      ensureNonEmptyString(user, \"user\");\n      payload.user = user;\n      if (rating !== undefined && rating !== null) {\n        ensureRating(rating);\n        payload.rating = rating;\n      }\n      if (content !== undefined) {\n        payload.content = content;\n      }\n    } else {\n      const request = messageIdOrRequest;\n      messageId = request.messageId;\n      ensureNonEmptyString(messageId, \"messageId\");\n      ensureNonEmptyString(request.user, \"user\");\n      payload.user = request.user;\n      if (request.rating !== undefined && request.rating !== null) {\n        ensureRating(request.rating);\n        payload.rating = request.rating;\n      }\n      if (request.content !== undefined) {\n        payload.content = request.content;\n      }\n    }\n\n    return this.http.request({\n      method: \"POST\",\n      path: `/messages/${messageId}/feedbacks`,\n      data: payload,\n    });\n  }\n\n  getInfo(user?: string): Promise<DifyResponse<unknown>> {\n    if (user) {\n      ensureNonEmptyString(user, \"user\");\n    }\n    return this.http.request({\n      method: \"GET\",\n      path: \"/info\",\n      query: user ? { user } : undefined,\n    });\n  }\n\n  getSite(user?: string): Promise<DifyResponse<unknown>> {\n    if (user) {\n      ensureNonEmptyString(user, \"user\");\n    }\n    return this.http.request({\n      method: \"GET\",\n      path: \"/site\",\n      query: user ? { user } : undefined,\n    });\n  }\n\n  fileUpload(form: unknown, user: string): Promise<DifyResponse<unknown>> {\n    if (!isFormData(form)) {\n      throw new FileUploadError(\"FormData is required for file uploads\");\n    }\n    ensureNonEmptyString(user, \"user\");\n    appendUserToFormData(form, user);\n    return this.http.request({\n      method: \"POST\",\n      path: \"/files/upload\",\n      data: form,\n    });\n  }\n\n  filePreview(\n    fileId: string,\n    user: string,\n    asAttachment?: boolean\n  ): Promise<DifyResponse<Buffer>> {\n    ensureNonEmptyString(fileId, \"fileId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request<Buffer>({\n      method: \"GET\",\n      path: `/files/${fileId}/preview`,\n      query: {\n        user,\n        as_attachment: asAttachment ? \"true\" : undefined,\n      },\n      responseType: \"arraybuffer\",\n    });\n  }\n\n  audioToText(form: unknown, user: string): Promise<DifyResponse<unknown>> {\n    if (!isFormData(form)) {\n      throw new FileUploadError(\"FormData is required for audio uploads\");\n    }\n    ensureNonEmptyString(user, \"user\");\n    appendUserToFormData(form, user);\n    return this.http.request({\n      method: \"POST\",\n      path: \"/audio-to-text\",\n      data: form,\n    });\n  }\n\n  textToAudio(\n    request: TextToAudioRequest\n  ): Promise<DifyResponse<Buffer> | BinaryStream>;\n  textToAudio(\n    text: string,\n    user: string,\n    streaming?: boolean,\n    voice?: string\n  ): Promise<DifyResponse<Buffer> | BinaryStream>;\n  textToAudio(\n    textOrRequest: string | TextToAudioRequest,\n    user?: string,\n    streaming = false,\n    voice?: string\n  ): Promise<DifyResponse<Buffer> | BinaryStream> {\n    let payload: TextToAudioRequest;\n\n    if (typeof textOrRequest === \"string\") {\n      ensureNonEmptyString(textOrRequest, \"text\");\n      ensureNonEmptyString(user, \"user\");\n      payload = {\n        text: textOrRequest,\n        user,\n        streaming,\n      };\n      if (voice) {\n        payload.voice = voice;\n      }\n    } else {\n      payload = { ...textOrRequest };\n      ensureNonEmptyString(payload.user, \"user\");\n      if (payload.text !== undefined && payload.text !== null) {\n        ensureNonEmptyString(payload.text, \"text\");\n      }\n      if (payload.message_id !== undefined && payload.message_id !== null) {\n        ensureNonEmptyString(payload.message_id, \"messageId\");\n      }\n      if (!payload.text && !payload.message_id) {\n        throw new ValidationError(\"text or message_id is required\");\n      }\n      payload.streaming = payload.streaming ?? false;\n    }\n\n    if (payload.streaming) {\n      return this.http.requestBinaryStream({\n        method: \"POST\",\n        path: \"/text-to-audio\",\n        data: payload,\n      });\n    }\n\n    return this.http.request<Buffer>({\n      method: \"POST\",\n      path: \"/text-to-audio\",\n      data: payload,\n      responseType: \"arraybuffer\",\n    });\n  }\n}\n","import { DifyClient } from \"./base\";\nimport type { ChatMessageRequest, ChatMessageResponse } from \"../types/chat\";\nimport type {\n  AnnotationCreateRequest,\n  AnnotationListOptions,\n  AnnotationReplyActionRequest,\n  AnnotationResponse,\n} from \"../types/annotation\";\nimport type {\n  DifyResponse,\n  DifyStream,\n  QueryParams,\n} from \"../types/common\";\nimport {\n  ensureNonEmptyString,\n  ensureOptionalInt,\n  ensureOptionalString,\n} from \"./validation\";\n\nexport class ChatClient extends DifyClient {\n  createChatMessage(\n    request: ChatMessageRequest\n  ): Promise<DifyResponse<ChatMessageResponse> | DifyStream<ChatMessageResponse>>;\n  createChatMessage(\n    inputs: Record<string, unknown>,\n    query: string,\n    user: string,\n    stream?: boolean,\n    conversationId?: string | null,\n    files?: Array<Record<string, unknown>> | null\n  ): Promise<DifyResponse<ChatMessageResponse> | DifyStream<ChatMessageResponse>>;\n  createChatMessage(\n    inputOrRequest: ChatMessageRequest | Record<string, unknown>,\n    query?: string,\n    user?: string,\n    stream = false,\n    conversationId?: string | null,\n    files?: Array<Record<string, unknown>> | null\n  ): Promise<DifyResponse<ChatMessageResponse> | DifyStream<ChatMessageResponse>> {\n    let payload: ChatMessageRequest;\n    let shouldStream = stream;\n\n    if (query === undefined && \"user\" in (inputOrRequest as ChatMessageRequest)) {\n      payload = inputOrRequest as ChatMessageRequest;\n      shouldStream = payload.response_mode === \"streaming\";\n    } else {\n      ensureNonEmptyString(query, \"query\");\n      ensureNonEmptyString(user, \"user\");\n      payload = {\n        inputs: inputOrRequest as Record<string, unknown>,\n        query,\n        user,\n        response_mode: stream ? \"streaming\" : \"blocking\",\n        files,\n      };\n      if (conversationId) {\n        payload.conversation_id = conversationId;\n      }\n    }\n\n    ensureNonEmptyString(payload.user, \"user\");\n    ensureNonEmptyString(payload.query, \"query\");\n\n    if (shouldStream) {\n      return this.http.requestStream<ChatMessageResponse>({\n        method: \"POST\",\n        path: \"/chat-messages\",\n        data: payload,\n      });\n    }\n\n    return this.http.request<ChatMessageResponse>({\n      method: \"POST\",\n      path: \"/chat-messages\",\n      data: payload,\n    });\n  }\n\n  stopChatMessage(\n    taskId: string,\n    user: string\n  ): Promise<DifyResponse<ChatMessageResponse>> {\n    ensureNonEmptyString(taskId, \"taskId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request<ChatMessageResponse>({\n      method: \"POST\",\n      path: `/chat-messages/${taskId}/stop`,\n      data: { user },\n    });\n  }\n\n  stopMessage(\n    taskId: string,\n    user: string\n  ): Promise<DifyResponse<ChatMessageResponse>> {\n    return this.stopChatMessage(taskId, user);\n  }\n\n  getSuggested(\n    messageId: string,\n    user: string\n  ): Promise<DifyResponse<ChatMessageResponse>> {\n    ensureNonEmptyString(messageId, \"messageId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request<ChatMessageResponse>({\n      method: \"GET\",\n      path: `/messages/${messageId}/suggested`,\n      query: { user },\n    });\n  }\n\n  // Note: messageFeedback is inherited from DifyClient\n\n  getAppFeedbacks(\n    page?: number,\n    limit?: number\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureOptionalInt(page, \"page\");\n    ensureOptionalInt(limit, \"limit\");\n    return this.http.request({\n      method: \"GET\",\n      path: \"/app/feedbacks\",\n      query: {\n        page,\n        limit,\n      },\n    });\n  }\n\n  getConversations(\n    user: string,\n    lastId?: string | null,\n    limit?: number | null,\n    sortByOrPinned?: string | boolean | null\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureNonEmptyString(user, \"user\");\n    ensureOptionalString(lastId, \"lastId\");\n    ensureOptionalInt(limit, \"limit\");\n\n    const params: QueryParams = { user };\n    if (lastId) {\n      params.last_id = lastId;\n    }\n    if (limit) {\n      params.limit = limit;\n    }\n    if (typeof sortByOrPinned === \"string\") {\n      params.sort_by = sortByOrPinned;\n    } else if (typeof sortByOrPinned === \"boolean\") {\n      params.pinned = sortByOrPinned;\n    }\n\n    return this.http.request({\n      method: \"GET\",\n      path: \"/conversations\",\n      query: params,\n    });\n  }\n\n  getConversationMessages(\n    user: string,\n    conversationId: string,\n    firstId?: string | null,\n    limit?: number | null\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureNonEmptyString(user, \"user\");\n    ensureNonEmptyString(conversationId, \"conversationId\");\n    ensureOptionalString(firstId, \"firstId\");\n    ensureOptionalInt(limit, \"limit\");\n\n    const params: QueryParams = { user };\n    params.conversation_id = conversationId;\n    if (firstId) {\n      params.first_id = firstId;\n    }\n    if (limit) {\n      params.limit = limit;\n    }\n\n    return this.http.request({\n      method: \"GET\",\n      path: \"/messages\",\n      query: params,\n    });\n  }\n\n  renameConversation(\n    conversationId: string,\n    name: string,\n    user: string,\n    autoGenerate?: boolean\n  ): Promise<DifyResponse<Record<string, unknown>>>;\n  renameConversation(\n    conversationId: string,\n    user: string,\n    options?: { name?: string | null; autoGenerate?: boolean }\n  ): Promise<DifyResponse<Record<string, unknown>>>;\n  renameConversation(\n    conversationId: string,\n    nameOrUser: string,\n    userOrOptions?: string | { name?: string | null; autoGenerate?: boolean },\n    autoGenerate?: boolean\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureNonEmptyString(conversationId, \"conversationId\");\n\n    let name: string | null | undefined;\n    let user: string;\n    let resolvedAutoGenerate: boolean;\n\n    if (typeof userOrOptions === \"string\" || userOrOptions === undefined) {\n      name = nameOrUser;\n      user = userOrOptions ?? \"\";\n      resolvedAutoGenerate = autoGenerate ?? false;\n    } else {\n      user = nameOrUser;\n      name = userOrOptions.name;\n      resolvedAutoGenerate = userOrOptions.autoGenerate ?? false;\n    }\n\n    ensureNonEmptyString(user, \"user\");\n    if (!resolvedAutoGenerate) {\n      ensureNonEmptyString(name, \"name\");\n    }\n\n    const payload: Record<string, unknown> = {\n      user,\n      auto_generate: resolvedAutoGenerate,\n    };\n    if (typeof name === \"string\" && name.trim().length > 0) {\n      payload.name = name;\n    }\n\n    return this.http.request({\n      method: \"POST\",\n      path: `/conversations/${conversationId}/name`,\n      data: payload,\n    });\n  }\n\n  deleteConversation(\n    conversationId: string,\n    user: string\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureNonEmptyString(conversationId, \"conversationId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/conversations/${conversationId}`,\n      data: { user },\n    });\n  }\n\n  getConversationVariables(\n    conversationId: string,\n    user: string,\n    lastId?: string | null,\n    limit?: number | null,\n    variableName?: string | null\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureNonEmptyString(conversationId, \"conversationId\");\n    ensureNonEmptyString(user, \"user\");\n    ensureOptionalString(lastId, \"lastId\");\n    ensureOptionalInt(limit, \"limit\");\n    ensureOptionalString(variableName, \"variableName\");\n\n    return this.http.request({\n      method: \"GET\",\n      path: `/conversations/${conversationId}/variables`,\n      query: {\n        user,\n        last_id: lastId ?? undefined,\n        limit: limit ?? undefined,\n        variable_name: variableName ?? undefined,\n      },\n    });\n  }\n\n  updateConversationVariable(\n    conversationId: string,\n    variableId: string,\n    user: string,\n    value: unknown\n  ): Promise<DifyResponse<Record<string, unknown>>> {\n    ensureNonEmptyString(conversationId, \"conversationId\");\n    ensureNonEmptyString(variableId, \"variableId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request({\n      method: \"PUT\",\n      path: `/conversations/${conversationId}/variables/${variableId}`,\n      data: {\n        user,\n        value,\n      },\n    });\n  }\n\n  annotationReplyAction(\n    action: \"enable\" | \"disable\",\n    request: AnnotationReplyActionRequest\n  ): Promise<DifyResponse<AnnotationResponse>> {\n    ensureNonEmptyString(action, \"action\");\n    ensureNonEmptyString(request.embedding_provider_name, \"embedding_provider_name\");\n    ensureNonEmptyString(request.embedding_model_name, \"embedding_model_name\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/apps/annotation-reply/${action}`,\n      data: request,\n    });\n  }\n\n  getAnnotationReplyStatus(\n    action: \"enable\" | \"disable\",\n    jobId: string\n  ): Promise<DifyResponse<AnnotationResponse>> {\n    ensureNonEmptyString(action, \"action\");\n    ensureNonEmptyString(jobId, \"jobId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/apps/annotation-reply/${action}/status/${jobId}`,\n    });\n  }\n\n  listAnnotations(\n    options?: AnnotationListOptions\n  ): Promise<DifyResponse<AnnotationResponse>> {\n    ensureOptionalInt(options?.page, \"page\");\n    ensureOptionalInt(options?.limit, \"limit\");\n    ensureOptionalString(options?.keyword, \"keyword\");\n    return this.http.request({\n      method: \"GET\",\n      path: \"/apps/annotations\",\n      query: {\n        page: options?.page,\n        limit: options?.limit,\n        keyword: options?.keyword ?? undefined,\n      },\n    });\n  }\n\n  createAnnotation(\n    request: AnnotationCreateRequest\n  ): Promise<DifyResponse<AnnotationResponse>> {\n    ensureNonEmptyString(request.question, \"question\");\n    ensureNonEmptyString(request.answer, \"answer\");\n    return this.http.request({\n      method: \"POST\",\n      path: \"/apps/annotations\",\n      data: request,\n    });\n  }\n\n  updateAnnotation(\n    annotationId: string,\n    request: AnnotationCreateRequest\n  ): Promise<DifyResponse<AnnotationResponse>> {\n    ensureNonEmptyString(annotationId, \"annotationId\");\n    ensureNonEmptyString(request.question, \"question\");\n    ensureNonEmptyString(request.answer, \"answer\");\n    return this.http.request({\n      method: \"PUT\",\n      path: `/apps/annotations/${annotationId}`,\n      data: request,\n    });\n  }\n\n  deleteAnnotation(\n    annotationId: string\n  ): Promise<DifyResponse<AnnotationResponse>> {\n    ensureNonEmptyString(annotationId, \"annotationId\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/apps/annotations/${annotationId}`,\n    });\n  }\n\n  // Note: audioToText is inherited from DifyClient\n}\n","import { DifyClient } from \"./base\";\nimport type { CompletionRequest, CompletionResponse } from \"../types/completion\";\nimport type { DifyResponse, DifyStream } from \"../types/common\";\nimport { ensureNonEmptyString } from \"./validation\";\n\nconst warned = new Set<string>();\nconst warnOnce = (message: string): void => {\n  if (warned.has(message)) {\n    return;\n  }\n  warned.add(message);\n  console.warn(message);\n};\n\nexport class CompletionClient extends DifyClient {\n  createCompletionMessage(\n    request: CompletionRequest\n  ): Promise<DifyResponse<CompletionResponse> | DifyStream<CompletionResponse>>;\n  createCompletionMessage(\n    inputs: Record<string, unknown>,\n    user: string,\n    stream?: boolean,\n    files?: Array<Record<string, unknown>> | null\n  ): Promise<DifyResponse<CompletionResponse> | DifyStream<CompletionResponse>>;\n  createCompletionMessage(\n    inputOrRequest: CompletionRequest | Record<string, unknown>,\n    user?: string,\n    stream = false,\n    files?: Array<Record<string, unknown>> | null\n  ): Promise<DifyResponse<CompletionResponse> | DifyStream<CompletionResponse>> {\n    let payload: CompletionRequest;\n    let shouldStream = stream;\n\n    if (user === undefined && \"user\" in (inputOrRequest as CompletionRequest)) {\n      payload = inputOrRequest as CompletionRequest;\n      shouldStream = payload.response_mode === \"streaming\";\n    } else {\n      ensureNonEmptyString(user, \"user\");\n      payload = {\n        inputs: inputOrRequest as Record<string, unknown>,\n        user,\n        files,\n        response_mode: stream ? \"streaming\" : \"blocking\",\n      };\n    }\n\n    ensureNonEmptyString(payload.user, \"user\");\n\n    if (shouldStream) {\n      return this.http.requestStream<CompletionResponse>({\n        method: \"POST\",\n        path: \"/completion-messages\",\n        data: payload,\n      });\n    }\n\n    return this.http.request<CompletionResponse>({\n      method: \"POST\",\n      path: \"/completion-messages\",\n      data: payload,\n    });\n  }\n\n  stopCompletionMessage(\n    taskId: string,\n    user: string\n  ): Promise<DifyResponse<CompletionResponse>> {\n    ensureNonEmptyString(taskId, \"taskId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request<CompletionResponse>({\n      method: \"POST\",\n      path: `/completion-messages/${taskId}/stop`,\n      data: { user },\n    });\n  }\n\n  stop(\n    taskId: string,\n    user: string\n  ): Promise<DifyResponse<CompletionResponse>> {\n    return this.stopCompletionMessage(taskId, user);\n  }\n\n  runWorkflow(\n    inputs: Record<string, unknown>,\n    user: string,\n    stream = false\n  ): Promise<DifyResponse<Record<string, unknown>> | DifyStream<Record<string, unknown>>> {\n    warnOnce(\n      \"CompletionClient.runWorkflow is deprecated. Use WorkflowClient.run instead.\"\n    );\n    ensureNonEmptyString(user, \"user\");\n    const payload = {\n      inputs,\n      user,\n      response_mode: stream ? \"streaming\" : \"blocking\",\n    };\n    if (stream) {\n      return this.http.requestStream<Record<string, unknown>>({\n        method: \"POST\",\n        path: \"/workflows/run\",\n        data: payload,\n      });\n    }\n    return this.http.request<Record<string, unknown>>({\n      method: \"POST\",\n      path: \"/workflows/run\",\n      data: payload,\n    });\n  }\n}\n","import { DifyClient } from \"./base\";\nimport type { WorkflowRunRequest, WorkflowRunResponse } from \"../types/workflow\";\nimport type { DifyResponse, DifyStream, QueryParams } from \"../types/common\";\nimport {\n  ensureNonEmptyString,\n  ensureOptionalInt,\n  ensureOptionalString,\n} from \"./validation\";\n\nexport class WorkflowClient extends DifyClient {\n  run(\n    request: WorkflowRunRequest\n  ): Promise<DifyResponse<WorkflowRunResponse> | DifyStream<WorkflowRunResponse>>;\n  run(\n    inputs: Record<string, unknown>,\n    user: string,\n    stream?: boolean\n  ): Promise<DifyResponse<WorkflowRunResponse> | DifyStream<WorkflowRunResponse>>;\n  run(\n    inputOrRequest: WorkflowRunRequest | Record<string, unknown>,\n    user?: string,\n    stream = false\n  ): Promise<DifyResponse<WorkflowRunResponse> | DifyStream<WorkflowRunResponse>> {\n    let payload: WorkflowRunRequest;\n    let shouldStream = stream;\n\n    if (user === undefined && \"user\" in (inputOrRequest as WorkflowRunRequest)) {\n      payload = inputOrRequest as WorkflowRunRequest;\n      shouldStream = payload.response_mode === \"streaming\";\n    } else {\n      ensureNonEmptyString(user, \"user\");\n      payload = {\n        inputs: inputOrRequest as Record<string, unknown>,\n        user,\n        response_mode: stream ? \"streaming\" : \"blocking\",\n      };\n    }\n\n    ensureNonEmptyString(payload.user, \"user\");\n\n    if (shouldStream) {\n      return this.http.requestStream<WorkflowRunResponse>({\n        method: \"POST\",\n        path: \"/workflows/run\",\n        data: payload,\n      });\n    }\n\n    return this.http.request<WorkflowRunResponse>({\n      method: \"POST\",\n      path: \"/workflows/run\",\n      data: payload,\n    });\n  }\n\n  runById(\n    workflowId: string,\n    request: WorkflowRunRequest\n  ): Promise<DifyResponse<WorkflowRunResponse> | DifyStream<WorkflowRunResponse>> {\n    ensureNonEmptyString(workflowId, \"workflowId\");\n    ensureNonEmptyString(request.user, \"user\");\n    if (request.response_mode === \"streaming\") {\n      return this.http.requestStream<WorkflowRunResponse>({\n        method: \"POST\",\n        path: `/workflows/${workflowId}/run`,\n        data: request,\n      });\n    }\n    return this.http.request<WorkflowRunResponse>({\n      method: \"POST\",\n      path: `/workflows/${workflowId}/run`,\n      data: request,\n    });\n  }\n\n  getRun(workflowRunId: string): Promise<DifyResponse<WorkflowRunResponse>> {\n    ensureNonEmptyString(workflowRunId, \"workflowRunId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/workflows/run/${workflowRunId}`,\n    });\n  }\n\n  stop(\n    taskId: string,\n    user: string\n  ): Promise<DifyResponse<WorkflowRunResponse>> {\n    ensureNonEmptyString(taskId, \"taskId\");\n    ensureNonEmptyString(user, \"user\");\n    return this.http.request<WorkflowRunResponse>({\n      method: \"POST\",\n      path: `/workflows/tasks/${taskId}/stop`,\n      data: { user },\n    });\n  }\n\n  /**\n   * Get workflow execution logs with filtering options.\n   *\n   * Note: The backend API filters by `createdByEndUserSessionId` (end user session ID)\n   * or `createdByAccount` (account ID), not by a generic `user` parameter.\n   */\n  getLogs(options?: {\n    keyword?: string;\n    status?: string;\n    createdAtBefore?: string;\n    createdAtAfter?: string;\n    createdByEndUserSessionId?: string;\n    createdByAccount?: string;\n    page?: number;\n    limit?: number;\n    startTime?: string;\n    endTime?: string;\n  }): Promise<DifyResponse<Record<string, unknown>>> {\n    if (options?.keyword) {\n      ensureOptionalString(options.keyword, \"keyword\");\n    }\n    if (options?.status) {\n      ensureOptionalString(options.status, \"status\");\n    }\n    if (options?.createdAtBefore) {\n      ensureOptionalString(options.createdAtBefore, \"createdAtBefore\");\n    }\n    if (options?.createdAtAfter) {\n      ensureOptionalString(options.createdAtAfter, \"createdAtAfter\");\n    }\n    if (options?.createdByEndUserSessionId) {\n      ensureOptionalString(\n        options.createdByEndUserSessionId,\n        \"createdByEndUserSessionId\"\n      );\n    }\n    if (options?.createdByAccount) {\n      ensureOptionalString(options.createdByAccount, \"createdByAccount\");\n    }\n    if (options?.startTime) {\n      ensureOptionalString(options.startTime, \"startTime\");\n    }\n    if (options?.endTime) {\n      ensureOptionalString(options.endTime, \"endTime\");\n    }\n    ensureOptionalInt(options?.page, \"page\");\n    ensureOptionalInt(options?.limit, \"limit\");\n\n    const createdAtAfter = options?.createdAtAfter ?? options?.startTime;\n    const createdAtBefore = options?.createdAtBefore ?? options?.endTime;\n\n    const query: QueryParams = {\n      keyword: options?.keyword,\n      status: options?.status,\n      created_at__before: createdAtBefore,\n      created_at__after: createdAtAfter,\n      created_by_end_user_session_id: options?.createdByEndUserSessionId,\n      created_by_account: options?.createdByAccount,\n      page: options?.page,\n      limit: options?.limit,\n    };\n\n    return this.http.request({\n      method: \"GET\",\n      path: \"/workflows/logs\",\n      query,\n    });\n  }\n}\n","import { DifyClient } from \"./base\";\nimport type {\n  DatasetCreateRequest,\n  DatasetListOptions,\n  DatasetTagBindingRequest,\n  DatasetTagCreateRequest,\n  DatasetTagDeleteRequest,\n  DatasetTagUnbindingRequest,\n  DatasetTagUpdateRequest,\n  DatasetUpdateRequest,\n  DocumentGetOptions,\n  DocumentListOptions,\n  DocumentStatusAction,\n  DocumentTextCreateRequest,\n  DocumentTextUpdateRequest,\n  SegmentCreateRequest,\n  SegmentListOptions,\n  SegmentUpdateRequest,\n  ChildChunkCreateRequest,\n  ChildChunkListOptions,\n  ChildChunkUpdateRequest,\n  MetadataCreateRequest,\n  MetadataOperationRequest,\n  MetadataUpdateRequest,\n  HitTestingRequest,\n  DatasourcePluginListOptions,\n  DatasourceNodeRunRequest,\n  PipelineRunRequest,\n  KnowledgeBaseResponse,\n  PipelineStreamEvent,\n} from \"../types/knowledge-base\";\nimport type { DifyResponse, DifyStream, QueryParams } from \"../types/common\";\nimport {\n  ensureNonEmptyString,\n  ensureOptionalBoolean,\n  ensureOptionalInt,\n  ensureOptionalString,\n  ensureStringArray,\n} from \"./validation\";\nimport { FileUploadError, ValidationError } from \"../errors/dify-error\";\nimport { isFormData } from \"../http/form-data\";\n\nconst warned = new Set<string>();\nconst warnOnce = (message: string): void => {\n  if (warned.has(message)) {\n    return;\n  }\n  warned.add(message);\n  console.warn(message);\n};\n\nconst ensureFormData = (form: unknown, context: string): void => {\n  if (!isFormData(form)) {\n    throw new FileUploadError(`${context} requires FormData`);\n  }\n};\n\nconst ensureNonEmptyArray = (value: unknown, name: string): void => {\n  if (!Array.isArray(value) || value.length === 0) {\n    throw new ValidationError(`${name} must be a non-empty array`);\n  }\n};\n\nconst warnPipelineRoutes = (): void => {\n  warnOnce(\n    \"RAG pipeline endpoints may be unavailable unless the service API registers dataset/rag_pipeline routes.\"\n  );\n};\n\nexport class KnowledgeBaseClient extends DifyClient {\n  async listDatasets(\n    options?: DatasetListOptions\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureOptionalInt(options?.page, \"page\");\n    ensureOptionalInt(options?.limit, \"limit\");\n    ensureOptionalString(options?.keyword, \"keyword\");\n    ensureOptionalBoolean(options?.includeAll, \"includeAll\");\n\n    const query: QueryParams = {\n      page: options?.page,\n      limit: options?.limit,\n      keyword: options?.keyword ?? undefined,\n      include_all: options?.includeAll ?? undefined,\n    };\n\n    if (options?.tagIds && options.tagIds.length > 0) {\n      ensureStringArray(options.tagIds, \"tagIds\");\n      query.tag_ids = options.tagIds;\n    }\n\n    return this.http.request({\n      method: \"GET\",\n      path: \"/datasets\",\n      query,\n    });\n  }\n\n  async createDataset(\n    request: DatasetCreateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(request.name, \"name\");\n    return this.http.request({\n      method: \"POST\",\n      path: \"/datasets\",\n      data: request,\n    });\n  }\n\n  async getDataset(datasetId: string): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}`,\n    });\n  }\n\n  async updateDataset(\n    datasetId: string,\n    request: DatasetUpdateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    if (request.name !== undefined && request.name !== null) {\n      ensureNonEmptyString(request.name, \"name\");\n    }\n    return this.http.request({\n      method: \"PATCH\",\n      path: `/datasets/${datasetId}`,\n      data: request,\n    });\n  }\n\n  async deleteDataset(datasetId: string): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/datasets/${datasetId}`,\n    });\n  }\n\n  async updateDocumentStatus(\n    datasetId: string,\n    action: DocumentStatusAction,\n    documentIds: string[]\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(action, \"action\");\n    ensureStringArray(documentIds, \"documentIds\");\n    return this.http.request({\n      method: \"PATCH\",\n      path: `/datasets/${datasetId}/documents/status/${action}`,\n      data: {\n        document_ids: documentIds,\n      },\n    });\n  }\n\n  async listTags(): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    return this.http.request({\n      method: \"GET\",\n      path: \"/datasets/tags\",\n    });\n  }\n\n  async createTag(\n    request: DatasetTagCreateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(request.name, \"name\");\n    return this.http.request({\n      method: \"POST\",\n      path: \"/datasets/tags\",\n      data: request,\n    });\n  }\n\n  async updateTag(\n    request: DatasetTagUpdateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(request.tag_id, \"tag_id\");\n    ensureNonEmptyString(request.name, \"name\");\n    return this.http.request({\n      method: \"PATCH\",\n      path: \"/datasets/tags\",\n      data: request,\n    });\n  }\n\n  async deleteTag(\n    request: DatasetTagDeleteRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(request.tag_id, \"tag_id\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: \"/datasets/tags\",\n      data: request,\n    });\n  }\n\n  async bindTags(\n    request: DatasetTagBindingRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureStringArray(request.tag_ids, \"tag_ids\");\n    ensureNonEmptyString(request.target_id, \"target_id\");\n    return this.http.request({\n      method: \"POST\",\n      path: \"/datasets/tags/binding\",\n      data: request,\n    });\n  }\n\n  async unbindTags(\n    request: DatasetTagUnbindingRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(request.tag_id, \"tag_id\");\n    ensureNonEmptyString(request.target_id, \"target_id\");\n    return this.http.request({\n      method: \"POST\",\n      path: \"/datasets/tags/unbinding\",\n      data: request,\n    });\n  }\n\n  async getDatasetTags(\n    datasetId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/tags`,\n    });\n  }\n\n  async createDocumentByText(\n    datasetId: string,\n    request: DocumentTextCreateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(request.name, \"name\");\n    ensureNonEmptyString(request.text, \"text\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/document/create_by_text`,\n      data: request,\n    });\n  }\n\n  async updateDocumentByText(\n    datasetId: string,\n    documentId: string,\n    request: DocumentTextUpdateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    if (request.name !== undefined && request.name !== null) {\n      ensureNonEmptyString(request.name, \"name\");\n    }\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/documents/${documentId}/update_by_text`,\n      data: request,\n    });\n  }\n\n  async createDocumentByFile(\n    datasetId: string,\n    form: unknown\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureFormData(form, \"createDocumentByFile\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/document/create_by_file`,\n      data: form,\n    });\n  }\n\n  async updateDocumentByFile(\n    datasetId: string,\n    documentId: string,\n    form: unknown\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureFormData(form, \"updateDocumentByFile\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/documents/${documentId}/update_by_file`,\n      data: form,\n    });\n  }\n\n  async listDocuments(\n    datasetId: string,\n    options?: DocumentListOptions\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureOptionalInt(options?.page, \"page\");\n    ensureOptionalInt(options?.limit, \"limit\");\n    ensureOptionalString(options?.keyword, \"keyword\");\n    ensureOptionalString(options?.status, \"status\");\n\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/documents`,\n      query: {\n        page: options?.page,\n        limit: options?.limit,\n        keyword: options?.keyword ?? undefined,\n        status: options?.status ?? undefined,\n      },\n    });\n  }\n\n  async getDocument(\n    datasetId: string,\n    documentId: string,\n    options?: DocumentGetOptions\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    if (options?.metadata) {\n      const allowed = new Set([\"all\", \"only\", \"without\"]);\n      if (!allowed.has(options.metadata)) {\n        throw new ValidationError(\"metadata must be one of all, only, without\");\n      }\n    }\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/documents/${documentId}`,\n      query: {\n        metadata: options?.metadata ?? undefined,\n      },\n    });\n  }\n\n  async deleteDocument(\n    datasetId: string,\n    documentId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/datasets/${datasetId}/documents/${documentId}`,\n    });\n  }\n\n  async getDocumentIndexingStatus(\n    datasetId: string,\n    batch: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(batch, \"batch\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/documents/${batch}/indexing-status`,\n    });\n  }\n\n  async createSegments(\n    datasetId: string,\n    documentId: string,\n    request: SegmentCreateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyArray(request.segments, \"segments\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments`,\n      data: request,\n    });\n  }\n\n  async listSegments(\n    datasetId: string,\n    documentId: string,\n    options?: SegmentListOptions\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureOptionalInt(options?.page, \"page\");\n    ensureOptionalInt(options?.limit, \"limit\");\n    ensureOptionalString(options?.keyword, \"keyword\");\n    if (options?.status && options.status.length > 0) {\n      ensureStringArray(options.status, \"status\");\n    }\n\n    const query: QueryParams = {\n      page: options?.page,\n      limit: options?.limit,\n      keyword: options?.keyword ?? undefined,\n    };\n    if (options?.status && options.status.length > 0) {\n      query.status = options.status;\n    }\n\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments`,\n      query,\n    });\n  }\n\n  async getSegment(\n    datasetId: string,\n    documentId: string,\n    segmentId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}`,\n    });\n  }\n\n  async updateSegment(\n    datasetId: string,\n    documentId: string,\n    segmentId: string,\n    request: SegmentUpdateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}`,\n      data: request,\n    });\n  }\n\n  async deleteSegment(\n    datasetId: string,\n    documentId: string,\n    segmentId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}`,\n    });\n  }\n\n  async createChildChunk(\n    datasetId: string,\n    documentId: string,\n    segmentId: string,\n    request: ChildChunkCreateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    ensureNonEmptyString(request.content, \"content\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`,\n      data: request,\n    });\n  }\n\n  async listChildChunks(\n    datasetId: string,\n    documentId: string,\n    segmentId: string,\n    options?: ChildChunkListOptions\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    ensureOptionalInt(options?.page, \"page\");\n    ensureOptionalInt(options?.limit, \"limit\");\n    ensureOptionalString(options?.keyword, \"keyword\");\n\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`,\n      query: {\n        page: options?.page,\n        limit: options?.limit,\n        keyword: options?.keyword ?? undefined,\n      },\n    });\n  }\n\n  async updateChildChunk(\n    datasetId: string,\n    documentId: string,\n    segmentId: string,\n    childChunkId: string,\n    request: ChildChunkUpdateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    ensureNonEmptyString(childChunkId, \"childChunkId\");\n    ensureNonEmptyString(request.content, \"content\");\n    return this.http.request({\n      method: \"PATCH\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks/${childChunkId}`,\n      data: request,\n    });\n  }\n\n  async deleteChildChunk(\n    datasetId: string,\n    documentId: string,\n    segmentId: string,\n    childChunkId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(documentId, \"documentId\");\n    ensureNonEmptyString(segmentId, \"segmentId\");\n    ensureNonEmptyString(childChunkId, \"childChunkId\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks/${childChunkId}`,\n    });\n  }\n\n  async listMetadata(\n    datasetId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/metadata`,\n    });\n  }\n\n  async createMetadata(\n    datasetId: string,\n    request: MetadataCreateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(request.name, \"name\");\n    ensureNonEmptyString(request.type, \"type\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/metadata`,\n      data: request,\n    });\n  }\n\n  async updateMetadata(\n    datasetId: string,\n    metadataId: string,\n    request: MetadataUpdateRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(metadataId, \"metadataId\");\n    ensureNonEmptyString(request.name, \"name\");\n    return this.http.request({\n      method: \"PATCH\",\n      path: `/datasets/${datasetId}/metadata/${metadataId}`,\n      data: request,\n    });\n  }\n\n  async deleteMetadata(\n    datasetId: string,\n    metadataId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(metadataId, \"metadataId\");\n    return this.http.request({\n      method: \"DELETE\",\n      path: `/datasets/${datasetId}/metadata/${metadataId}`,\n    });\n  }\n\n  async listBuiltInMetadata(\n    datasetId: string\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/metadata/built-in`,\n    });\n  }\n\n  async updateBuiltInMetadata(\n    datasetId: string,\n    action: \"enable\" | \"disable\"\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(action, \"action\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/metadata/built-in/${action}`,\n    });\n  }\n\n  async updateDocumentsMetadata(\n    datasetId: string,\n    request: MetadataOperationRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyArray(request.operation_data, \"operation_data\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/documents/metadata`,\n      data: request,\n    });\n  }\n\n  async hitTesting(\n    datasetId: string,\n    request: HitTestingRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    if (request.query !== undefined && request.query !== null) {\n      ensureOptionalString(request.query, \"query\");\n    }\n    if (request.attachment_ids && request.attachment_ids.length > 0) {\n      ensureStringArray(request.attachment_ids, \"attachment_ids\");\n    }\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/hit-testing`,\n      data: request,\n    });\n  }\n\n  async retrieve(\n    datasetId: string,\n    request: HitTestingRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    return this.http.request({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/retrieve`,\n      data: request,\n    });\n  }\n\n  async listDatasourcePlugins(\n    datasetId: string,\n    options?: DatasourcePluginListOptions\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    warnPipelineRoutes();\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureOptionalBoolean(options?.isPublished, \"isPublished\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/datasets/${datasetId}/pipeline/datasource-plugins`,\n      query: {\n        is_published: options?.isPublished ?? undefined,\n      },\n    });\n  }\n\n  async runDatasourceNode(\n    datasetId: string,\n    nodeId: string,\n    request: DatasourceNodeRunRequest\n  ): Promise<DifyStream<PipelineStreamEvent>> {\n    warnPipelineRoutes();\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(nodeId, \"nodeId\");\n    ensureNonEmptyString(request.datasource_type, \"datasource_type\");\n    return this.http.requestStream<PipelineStreamEvent>({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/pipeline/datasource/nodes/${nodeId}/run`,\n      data: request,\n    });\n  }\n\n  async runPipeline(\n    datasetId: string,\n    request: PipelineRunRequest\n  ): Promise<DifyResponse<KnowledgeBaseResponse> | DifyStream<PipelineStreamEvent>> {\n    warnPipelineRoutes();\n    ensureNonEmptyString(datasetId, \"datasetId\");\n    ensureNonEmptyString(request.datasource_type, \"datasource_type\");\n    ensureNonEmptyString(request.start_node_id, \"start_node_id\");\n    const shouldStream = request.response_mode === \"streaming\";\n    if (shouldStream) {\n      return this.http.requestStream<PipelineStreamEvent>({\n        method: \"POST\",\n        path: `/datasets/${datasetId}/pipeline/run`,\n        data: request,\n      });\n    }\n    return this.http.request<KnowledgeBaseResponse>({\n      method: \"POST\",\n      path: `/datasets/${datasetId}/pipeline/run`,\n      data: request,\n    });\n  }\n\n  async uploadPipelineFile(\n    form: unknown\n  ): Promise<DifyResponse<KnowledgeBaseResponse>> {\n    warnPipelineRoutes();\n    ensureFormData(form, \"uploadPipelineFile\");\n    return this.http.request({\n      method: \"POST\",\n      path: \"/datasets/pipeline/file-upload\",\n      data: form,\n    });\n  }\n}\n","import { DifyClient } from \"./base\";\nimport type { WorkspaceModelType, WorkspaceModelsResponse } from \"../types/workspace\";\nimport type { DifyResponse } from \"../types/common\";\nimport { ensureNonEmptyString } from \"./validation\";\n\nexport class WorkspaceClient extends DifyClient {\n  async getModelsByType(\n    modelType: WorkspaceModelType\n  ): Promise<DifyResponse<WorkspaceModelsResponse>> {\n    ensureNonEmptyString(modelType, \"modelType\");\n    return this.http.request({\n      method: \"GET\",\n      path: `/workspaces/current/models/model-types/${modelType}`,\n    });\n  }\n}\n","import { DEFAULT_BASE_URL } from \"./types/common\";\n\nexport const BASE_URL = DEFAULT_BASE_URL;\n\nexport const routes = {\n  feedback: {\n    method: \"POST\",\n    url: (messageId: string) => `/messages/${messageId}/feedbacks`,\n  },\n  application: {\n    method: \"GET\",\n    url: () => \"/parameters\",\n  },\n  fileUpload: {\n    method: \"POST\",\n    url: () => \"/files/upload\",\n  },\n  filePreview: {\n    method: \"GET\",\n    url: (fileId: string) => `/files/${fileId}/preview`,\n  },\n  textToAudio: {\n    method: \"POST\",\n    url: () => \"/text-to-audio\",\n  },\n  audioToText: {\n    method: \"POST\",\n    url: () => \"/audio-to-text\",\n  },\n  getMeta: {\n    method: \"GET\",\n    url: () => \"/meta\",\n  },\n  getInfo: {\n    method: \"GET\",\n    url: () => \"/info\",\n  },\n  getSite: {\n    method: \"GET\",\n    url: () => \"/site\",\n  },\n  createCompletionMessage: {\n    method: \"POST\",\n    url: () => \"/completion-messages\",\n  },\n  stopCompletionMessage: {\n    method: \"POST\",\n    url: (taskId: string) => `/completion-messages/${taskId}/stop`,\n  },\n  createChatMessage: {\n    method: \"POST\",\n    url: () => \"/chat-messages\",\n  },\n  getSuggested: {\n    method: \"GET\",\n    url: (messageId: string) => `/messages/${messageId}/suggested`,\n  },\n  stopChatMessage: {\n    method: \"POST\",\n    url: (taskId: string) => `/chat-messages/${taskId}/stop`,\n  },\n  getConversations: {\n    method: \"GET\",\n    url: () => \"/conversations\",\n  },\n  getConversationMessages: {\n    method: \"GET\",\n    url: () => \"/messages\",\n  },\n  renameConversation: {\n    method: \"POST\",\n    url: (conversationId: string) => `/conversations/${conversationId}/name`,\n  },\n  deleteConversation: {\n    method: \"DELETE\",\n    url: (conversationId: string) => `/conversations/${conversationId}`,\n  },\n  runWorkflow: {\n    method: \"POST\",\n    url: () => \"/workflows/run\",\n  },\n  stopWorkflow: {\n    method: \"POST\",\n    url: (taskId: string) => `/workflows/tasks/${taskId}/stop`,\n  },\n};\n\nexport { DifyClient } from \"./client/base\";\nexport { ChatClient } from \"./client/chat\";\nexport { CompletionClient } from \"./client/completion\";\nexport { WorkflowClient } from \"./client/workflow\";\nexport { KnowledgeBaseClient } from \"./client/knowledge-base\";\nexport { WorkspaceClient } from \"./client/workspace\";\n\nexport * from \"./errors/dify-error\";\nexport * from \"./types/common\";\nexport * from \"./types/annotation\";\nexport * from \"./types/chat\";\nexport * from \"./types/completion\";\nexport * from \"./types/knowledge-base\";\nexport * from \"./types/workflow\";\nexport * from \"./types/workspace\";\nexport { HttpClient } from \"./http/client\";\n"]}