[Bug]: strict json.loads on lax LLM JSON breaks extraction (trailing commas) and 500s /flush

オープン
#564 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@1AbdullahButt がすでに取り組んでいます。

2026年11月6日 から。

  • #580 @1AbdullahButt による — オープン

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
74/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
ai, backend

調査の方向性

Start with everalgo/user_memory/episode.py and its _extract_json_object() parsing path, then compare the related call sites in profile.py, atomic_fact.py, and foresight.py. Reproduce with the trailing-comma JSON example in the issue and trace how extraction errors reach /api/v2/memory/flush. Done when malformed LLM JSON no longer crashes flush with a 500 and extraction failures are handled as described.

索引モデルが issue の本文から書いたものです。

説明

Title: memorize_extraction_failed with strict json.loads on lax LLM JSON; extraction error crashes /flush with 500

Environment

  • everos 1.5.1 (uv tool install), everalgo vendored
  • [llm] provider: DeepSeek (deepseek-chat, OpenAI-compatible), embeddings: DashScope text-embedding-v4
  • Observed under real multi-session traffic (~170 /add, ~50 /flush per day)

Symptoms

Intermittent (14 occurrences in ~30h) on flush-triggered extraction:

memorize_extraction_failed  error='JSONDecodeError: Expecting property name enclosed in double quotes: line 4 column 1 (char 2954)'
unhandled_exception         exception_type=JSONDecodeError path=/api/v2/memory/flush
  • The parse failure is unhandled at the route level: POST /api/v2/memory/flush returns 500 instead of degrading gracefully; the memcells stay buffered and retry later, delaying memory availability and logging a traceback every time.
  • episode_extract_retry re-prompts, but retries reproduce the same malformed JSON.

Root cause

LLM output (DeepSeek in our case) is occasionally not strict RFC-8259 JSON — e.g. trailing commas before a closing brace ({..., }), which produces exactly Expecting property name enclosed in double quotes: line N column 1. The extraction path does strict parsing with no repair:

  • everalgo/user_memory/episode.py: _extract_json_object() (brace-balanced substring) → bare json.loads(json_str) — no response_format={"type":"json_object"} enforcement, no sanitization.
  • Same pattern in profile.py (×3 sites), atomic_fact.py, foresight.py. (everalgo.llm.parse.parse_llm_json_object already has a multi-strategy parser, but these modules don't use it.)

GLM and some other providers happen to emit strict JSON, which masks the bug; switching providers exposes it.

Suggested fixes (any one suffices; first is smallest)

  1. One repair pass before strict parsing: strip commas directly preceding } / ], e.g. re.sub(r",\s*([}\]])", r"\1", json_str) on JSONDecodeError, retry once.
  2. Route all extractor call sites through everalgo.llm.parse.parse_llm_json_object and add the same repair as a strategy there (single choke point — the four _extract_json_object copies are already duplicated).
  3. Optionally enforce response_format={"type": "json_object"} for OpenAI-compatible providers that support it.
  4. Separately: catch extraction exceptions in the /flush handler and return a structured error envelope instead of an unhandled 500.

Repro

Any OpenAI-compatible model that emits a trailing comma (DeepSeek deepseek-chat does this intermittently) + a flush that triggers episode extraction. Local repro of the parse failure: json.loads('{\n"title": "<1200 chars>",\n"content": "<1500 chars>",\n}') → JSONDecodeError: Expecting property name enclosed in double quotes: line 4 column 1.

Local workaround

Patched the four modules with a _loads_lenient helper (repair-once-on-JSONDecodeError); failures stopped. Happy to send the diff/PR.

主要言語
Python
スター
13.3k
フォーク
926
平均マージ
19時間 29分
マージ済み PR(30日)
43

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

EverMind-AI/EverOS のほかの issue

EverMind-AI/EverOS の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。