HKUDS/DeepTutor · error · ValueError

unknown layer {layer!r}

Error message

unknown layer {layer!r}

What it means

merge's _path_for is identical in spirit to dedup's: it resolves a memory file path per layer and only knows 'L2' and 'L3'. An unrecognized layer string raises ValueError inside run_merge before any merge work starts.

Source

Thrown at deeptutor/services/memory/consolidator/modes/merge.py:213

                if resolved is None or resolved in seen:
                    continue
                seen.add(resolved)
                new_refs.append(resolved)
            else:
                if ref in seen:
                    continue
                seen.add(ref)
                new_refs.append(ref)
        entry.refs = new_refs
    return migrated


def _path_for(layer: str, key: str):
    if layer == "L2":
        return paths.l2_file(key)  # type: ignore[arg-type]
    if layer == "L3":
        return paths.l3_file(key)  # type: ignore[arg-type]
    raise ValueError(f"unknown layer {layer!r}")


def _default_title(layer: str, key: str) -> str:
    if layer == "L2":
        return f"{key} memory"
    return {
        "recent": "Recent summary",
        "profile": "User profile",
        "scope": "Knowledge scope",
        "preferences": "Preferences",
    }.get(key, f"{key} memory")


__all__ = ["MergeResult", "run_merge"]

View on GitHub (pinned to 3e82f13042)

Solutions

  1. Pass exactly 'L2' or 'L3'
  2. Whitelist-validate the layer parameter where it enters your program
  3. Define a Literal['L2','L3'] type or enum shared with dedup/update/audit

Example fix

# before
await run_merge(layer="L3 ", keys=[...])
# after
await run_merge(layer="L3", keys=[...])
Defensive patterns

Strategy: type-guard

Validate before calling

if layer not in ("L2", "L3"):
    raise ValueError("layer must be 'L2' or 'L3'")

Type guard

from typing import Literal, TypeGuard

Layer = Literal["L2", "L3"]

def is_layer(v: object) -> TypeGuard[Layer]:
    return isinstance(v, str) and v in ("L2", "L3")

Prevention

When it happens

Trigger: Calling run_merge with a layer value other than the exact strings 'L2' or 'L3' (typos, casing, or an unvalidated external parameter).

Common situations: CLI or API exposure of the layer parameter without whitelist validation; inconsistent constants after upgrading the memory package.

Related errors


AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27). Data as JSON: /api/errors/4f1aa873a542c514. Report an issue: GitHub.