{"record":{"id":"ce8295bab33e0412","repo":"vercel/ai","slug":"deepseek-filenames-must-not-exceed-max-filename","errorCode":null,"errorMessage":"DeepSeek filenames must not exceed ${MAX_FILENAME_LENGTH} characters. Received ${filenameLength} characters.","messagePattern":"DeepSeek filenames must not exceed (.+?) characters\\. Received (.+?) characters\\.","errorType":"validation","errorClass":"InvalidArgumentError","httpStatus":null,"severity":"error","filePath":"packages/deepseek/src/files/deepseek-files.ts","lineNumber":167,"sourceCode":"  fileBytes: Uint8Array;\n  mediaType: string;\n  filename: string | undefined;\n}) {\n  if (fileBytes.length > MAX_FILE_SIZE_BYTES) {\n    throw new InvalidArgumentError({\n      argument: 'data',\n      message:\n        `DeepSeek file uploads must not exceed 64 MiB ` +\n        `(${MAX_FILE_SIZE_BYTES.toLocaleString('en-US')} bytes). ` +\n        `Received ${fileBytes.length.toLocaleString('en-US')} bytes.`,\n    });\n  }\n\n  if (filename != null) {\n    const filenameLength = Array.from(filename).length;\n\n    if (filenameLength > MAX_FILENAME_LENGTH) {\n      throw new InvalidArgumentError({\n        argument: 'filename',\n        message:\n          `DeepSeek filenames must not exceed ${MAX_FILENAME_LENGTH} characters. ` +\n          `Received ${filenameLength} characters.`,\n      });\n    }\n  }\n\n  const normalizedMediaType = normalizeMediaType(mediaType);\n  const detectedMediaType = detectMediaType({ data: fileBytes });\n\n  if (\n    detectedMediaType != null &&\n    !supportedMediaTypes.has(detectedMediaType)\n  ) {\n    throw new InvalidArgumentError({\n      argument: 'data',\n      message:","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/deepseek/src/files/deepseek-files.ts#L149-L185","documentation":"DeepSeek enforces a maximum filename length (MAX_FILENAME_LENGTH). The length is counted in Unicode code points (Array.from(filename).length, not UTF-8 bytes) and an over-long filename throws InvalidArgumentError for argument 'filename' before any network call.","triggerScenarios":"Uploading a file whose filename string exceeds MAX_FILENAME_LENGTH code points via deepseek.files.upload with a filename provided.","commonSituations":"Passing long auto-generated names (timestamps + hashes + descriptions), or forwarding the full path or data-URI as the filename instead of the basename.","solutions":["Truncate the filename (keeping the extension) before uploading.","Generate a short synthetic filename (e.g. 'upload-<hash8>.png') when the original name is very long.","Sanitize inputs: strip directory paths and limit the name length to the documented max."],"exampleFix":"// before\nawait files.upload({ data, mediaType: 'image/png', filename: veryLongName });\n\n// after\nconst base = veryLongName.split('/').pop() ?? 'file.png';\nconst filename = base.length > 128 ? base.slice(0, 100) + base.slice(base.lastIndexOf('.')) : base;\nawait files.upload({ data, mediaType: 'image/png', filename });","handlingStrategy":"validation","validationCode":"if (filename && Array.from(filename).length > 128) {\n  filename = filename.slice(0, 100) + (filename.match(/\\.[a-z0-9]+$/i)?.[0] ?? '');\n}","typeGuard":null,"tryCatchPattern":"import { InvalidArgumentError } from '@ai-sdk/provider';\ntry {\n  await files.upload({ data, mediaType, filename });\n} catch (e) {\n  if (InvalidArgumentError.isInstance(e) && e.argument === 'filename') {\n    await files.upload({ data, mediaType, filename: truncateName(filename) });\n  } else throw e;\n}","preventionTips":["Strip paths and generate short names server-side instead of trusting client filenames.","Count length in code points (Array.from), matching the library's check.","Sanitize filenames in a shared upload utility used by all call sites."],"tags":["file-upload","filename","validation"],"backgroundTag":"file-size-limit-exceeded","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}