MemPalace/mempalace · error · ValueError
--metadata is not valid JSON: {exc}
Error message
--metadata is not valid JSON: {exc} What it means
Raised by _parse_metadata_arg() in the CLI when the --metadata option value cannot be parsed by json.loads. The metadata option expects a raw JSON document on the command line; any JSON syntax error (trailing comma, unquoted keys, smart quotes from shell paste, unterminated string) triggers this ValueError with the underlying parser message appended.
Source
Thrown at mempalace/cli.py:1512
raise ValueError("pass inline text or a file, not both")
if file_arg is not None:
if file_arg == "-":
return _read_stdin_exact()
return Path(os.path.expanduser(file_arg)).read_bytes().decode("utf-8")
if inline is not None:
return inline
return default
def _parse_metadata_arg(raw):
import json
if raw is None:
return None
try:
value = json.loads(raw)
except ValueError as exc:
raise ValueError(f"--metadata is not valid JSON: {exc}") from None
if not isinstance(value, dict):
raise ValueError("--metadata must be a JSON object")
return value
def _print_event_line(event):
target = event["to_agent"] or "*"
corr = f" corr={event['correlation_id']}" if event["correlation_id"] else ""
status = f" [{event['status']}]" if event["status"] else ""
arts = f" artifacts={len(event['artifact_ids'])}" if event["artifact_ids"] else ""
body = event["body"].replace("\n", " ")
if len(body) > 80:
body = body[:77] + "..."
body = f" :: {body}" if body else ""
print(
f" {event['id']} {event['created_at']} {event['type']} "
f"{event['stream']}/{event['room']} {event['from_agent']}->{target}"
f"{status}{corr}{arts}{body}"View on GitHub (pinned to 06cb6987f0)
Solutions
- Quote the JSON correctly for your shell, using single quotes outside and double quotes inside: --metadata '{"source":"cli"}'
- Validate the string with `echo "$META" | python3 -m json.tool` or jq before running the command
- If the metadata lives in a variable, build it with jq -n or a here-doc to guarantee valid JSON
Example fix
# before
mempalace event add ... --metadata "{'source':'cli'}"
# after
mempalace event add ... --metadata '{"source":"cli"}' Defensive patterns
Strategy: validation
Validate before calling
import json
# Validate before passing --metadata
try:
json.loads(metadata_raw)
except ValueError as exc:
raise SystemExit(f"bad --metadata JSON: {exc}") Type guard
def is_valid_metadata_json(raw: str) -> bool:
try:
json.loads(raw)
return True
except (ValueError, TypeError):
return False Try / catch
try:
meta = _parse_metadata_arg(raw)
except ValueError as exc:
if "not valid JSON" in str(exc):
meta = _parse_metadata_arg(json.dumps(eval_shorthand(raw))) # or re-prompt user
else:
raise Prevention
- Build metadata with jq -n or json.dumps, never string concatenation
- Shell-quote with single quotes outside, double quotes inside the JSON
- Pipe draft JSON through `jq .` before pasting into commands
When it happens
Trigger: Passing --metadata with malformed JSON, e.g. `--metadata "{'a':1}"` (single quotes), `--metadata "{a:1}"` (unquoted key), or a value mangled by shell quoting/escaping so the string reaching the CLI is not valid JSON.
Common situations: Single-quoted Python-style dicts pasted into shell; shell interpolation stripping inner quotes; smart quotes introduced by editors/terminals; truncated JSON from variable expansion.
Related errors
- --metadata must be a JSON object
- pass inline text or a file, not both
- operator {key!r} not supported by chroma backend
- daemon is not running
- daemon is not running; job {args.job_id} is {job['state']}
AI-assisted analysis of MemPalace/mempalace@06cb6987f0 (2026-08-15).
Data as JSON: /api/errors/a3496ce8dd582e0e.
Report an issue: GitHub.