[Bug]: strict json.loads on lax LLM JSON breaks extraction (trailing commas) and 500s /flush
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 74/100
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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: DashScopetext-embedding-v4- Observed under real multi-session traffic (~170
/add, ~50/flushper 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/flushreturns 500 instead of degrading gracefully; the memcells stay buffered and retry later, delaying memory availability and logging a traceback every time. episode_extract_retryre-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) → barejson.loads(json_str)— noresponse_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_objectalready 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)
- One repair pass before strict parsing: strip commas directly preceding
}/], e.g.re.sub(r",\s*([}\]])", r"\1", json_str)onJSONDecodeError, retry once. - Route all extractor call sites through
everalgo.llm.parse.parse_llm_json_objectand add the same repair as a strategy there (single choke point — the four_extract_json_objectcopies are already duplicated). - Optionally enforce
response_format={"type": "json_object"}for OpenAI-compatible providers that support it. - Separately: catch extraction exceptions in the
/flushhandler 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.
- Lenguaje dominante
- Python
- Estrellas
- 13.3k
- Forks
- 926
- Merge medio
- 19 h 29 min
- PR fusionados (30 d)
- 43
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de EverMind-AI/EverOS
-
Dificultad 2/5 Medio día Aptitud para principiantes 62/100
EverMind-AI/EverOS#414 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
EverMind-AI/EverOS#558 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 67/100
EverMind-AI/EverOS#551 ·
Los mantenedores suelen responder en 1 día
-
memory: keep a raw input log of /add requests, independent of extractionPosiblemente ocupada @chuiwenwei la tomó hace 1 día. Abiertoenhancement
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
EverMind-AI/EverOS#537 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
memorize(): make delivery resumable per memcell so retries and replays are idempotentPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
EverMind-AI/EverOS#516 ·
Los mantenedores suelen responder en 1 día
Todos los issues de EverMind-AI/EverOS
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
pylint-dev/pylint#11791 ·
Los mantenedores suelen responder en 1 día
-
Rasterio granule reads never retry, so one 503 (Service Unavailable) fails the whole requestPosiblemente ocupada @chuckwondo la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
developmentseed/titiler-cmr#305 ·
Los mantenedores suelen responder en 1 día
-
community enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día