langchain-ai/deepagents · error · FleetImportError

: zip entry uncompressed size exceeds limit

Error message

{name}: zip entry uncompressed size exceeds limit

What it means

A single zip entry declares an uncompressed (`file_size`) value over 256 MiB (`_MAX_ZIP_UNCOMPRESSED_BYTES`). Per-entry size caps are declared-size checks run during validation, before any bytes are extracted, to stop oversized or malicious archives early.

Solutions

  1. Remove or move the oversized file out of the Fleet export
  2. Verify entry sizes up front: `max(zi.file_size for zi in zipfile.ZipFile(p).infolist())` and locate the offender
  3. Compress or split the asset and reference it externally (URL, separate download) instead of embedding it in the zip

Example fix

# before: bundled model in skills/
skills/heavy/model.bin (400 MB)
// after: ship without the asset and document the download
skills/heavy/README.md  # 'download model.bin from ...'
Defensive patterns

Strategy: validation

Validate before calling

import zipfile

MAX_ENTRY = 256 * 1024 * 1024

def has_oversized_entry(path):
    with zipfile.ZipFile(path) as z:
        return any(zi.file_size > MAX_ENTRY for zi in z.infolist())

Try / catch

try:
    import_fleet_zip(zip_path, target_dir=target)
except FleetImportError as exc:
    if "uncompressed size exceeds limit" in str(exc):
        print("Remove or externalize the >256MiB asset from the export")
    raise

Prevention

When it happens

Trigger: `import_fleet_zip` validates an entry whose `info.file_size > 256 * 1024 * 1024`.

Common situations: Export accidentally includes large binaries, model weights, datasets, videos, or docker layer tarballs inside `skills/`.

Related errors


AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29). Data as JSON: /api/errors/356a65faad0bc320. Report an issue: GitHub.

Appendix: source

Thrown at libs/talon/deepagents_talon/fleet_import.py:260

    posix = PurePosixPath(name)
    windows = PureWindowsPath(name)
    return (
        posix.is_absolute()
        or windows.is_absolute()
        or windows.drive != ""
        or any(part in {"", ".", ".."} for part in posix.parts)
    )


def _is_symlink(info: zipfile.ZipInfo) -> bool:
    file_type = (info.external_attr >> 16) & _ZIP_FILE_TYPE_MASK
    return file_type == _ZIP_SYMLINK_TYPE


def _validate_zip_entry_size(name: str, info: zipfile.ZipInfo) -> None:
    if info.file_size > _MAX_ZIP_UNCOMPRESSED_BYTES:
        msg = f"{name}: zip entry uncompressed size exceeds limit"
        raise FleetImportError(msg)
    if info.compress_size == 0:
        return
    if info.file_size > info.compress_size * _MAX_ZIP_COMPRESSION_RATIO:
        msg = f"{name}: zip entry compression ratio exceeds limit"
        raise FleetImportError(msg)


def _materialize_staging(
    archive: zipfile.ZipFile,
    entries: Mapping[str, zipfile.ZipInfo],
    staging: Path,
) -> None:
    _copy_zip_file(archive, entries["AGENTS.md"], staging / "AGENTS.md")

    for name, info in entries.items():
        if name.startswith("skills/"):
            _copy_zip_file(archive, info, staging / name)
        elif _is_subagent_prompt_path(name):

View on GitHub (pinned to a1af029e6e)