{"record":{"id":"b3b3b75091bca92b","repo":"mastra-ai/mastra","slug":"observer-produced-degenerate-output-after-retry","errorCode":null,"errorMessage":"Observer produced degenerate output after retry. ${describeDegenerateOutput(result.text)}","messagePattern":"Observer produced degenerate output after retry\\. (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/memory/src/processors/observational-memory/observer-runner.ts","lineNumber":314,"sourceCode":"      );\n    };\n\n    let result = await doGenerate();\n    let parsed = parseObserverOutput(result.text, activeExtractors);\n    let retriedDueToDegenerate = false;\n\n    if (parsed.degenerate) {\n      omDebug(\n        `[OM:callObserver] degenerate repetition detected, retrying once. ${describeDegenerateOutput(result.text, 2000)}`,\n      );\n      result = await doGenerate();\n      parsed = parseObserverOutput(result.text, activeExtractors);\n      retriedDueToDegenerate = true;\n      if (parsed.degenerate) {\n        omDebug(\n          `[OM:callObserver] degenerate repetition on retry, failing. ${describeDegenerateOutput(result.text, 2000)}`,\n        );\n        throw new Error(`Observer produced degenerate output after retry. ${describeDegenerateOutput(result.text)}`);\n      }\n    }\n\n    const structuredExtraction = await extractStructuredValues({\n      agent,\n      source: 'observer',\n      extractors: activeExtractors,\n      memory: temporaryMemory?.options,\n      priorExtractedValues: options?.priorExtractedValues,\n      requestContext: internalRequestContext,\n      observabilityContext: options?.observabilityContext,\n      abortSignal,\n    });\n    const extractedValues = mergeExtractedValues(parsed.extractedValues, structuredExtraction.values);\n    const extractionFailures = mergeExtractionFailures(parsed.extractionFailures, structuredExtraction.failures);\n    const builtIns = getBuiltInExtractedValues(extractedValues);\n\n    const systemPrompt = buildObserverSystemPrompt(","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/memory/src/processors/observational-memory/observer-runner.ts#L296-L332","documentation":"In `ObserverRunner.call`, the Observer model's text output is parsed by `parseObserverOutput`, which flags degenerate output (pathological repetition loops common to small/local LLMs). If the first attempt is degenerate the runner retries the generation once; if the retry is also degenerate it throws this error (observer-runner.ts:314), failing the observation step rather than persisting garbage observations.","triggerScenarios":"The configured observation model produces a repetition loop (e.g. repeated observation blocks or tokens) in the Observer prompt, and after one automatic retry (`doGenerate()` again) still produces degenerate output. Typically triggered by weak/quantized local models (small Ollama models, unstable fine-tunes) or too-high temperature/maxTokens settings for the observer.","commonSituations":"Using a tiny local model (e.g. 1-3B quantized) as `observationModel` which loops on the structured observer prompt; a provider outage returning filler/repetitive text; prompt overflow causing truncated/degenerate completion; model settings (temperature too low for structured output, or repetition penalties unset) producing loops.","solutions":["Use a stronger observation model: set `observationModel` in the ObservationalMemory processor config to a capable model (e.g. 'openai/gpt-4o-mini' or similar) instead of a small local model.","Tune `modelSettings` for the observer — add a `repetitionPenalty`/`frequencyPenalty` or raise temperature slightly so the model breaks out of loops.","Check whether the observer prompt/context is being truncated (huge threads); reduce thread size or enable earlier observation cycles so the prompt stays small.","Retry the overall operation later (transient provider degradation) or add a fallback observation model; inspect `describeDegenerateOutput` in the error text to see the repetition pattern."],"exampleFix":"// before\nnew ObservationalMemory({\n  observationModel: 'ollama/llama3.2:1b', // degenerates on structured prompts\n});\n\n// after\nnew ObservationalMemory({\n  observationModel: 'openai/gpt-4o-mini',\n  modelSettings: { temperature: 0.3, frequencyPenalty: 0.5 },\n});","handlingStrategy":"fallback","validationCode":"// sanity-check the observation model before wiring it in\nconst resp = await model.doGenerate({\n  prompt: [{ role: 'user', content: [{ type: 'text', text: 'Reply with the word: OK' }] }],\n});\nif (new Set(resp.text.split(/\\s+/)).size < 3 && resp.text.length > 200) {\n  throw new Error('observation model appears prone to repetition; choose a stronger model');\n}","typeGuard":"function looksDegenerate(text: string): boolean {\n  const lines = text.split('\\n').map(l => l.trim()).filter(Boolean);\n  if (lines.length < 4) return false;\n  const unique = new Set(lines);\n  return unique.size / lines.length < 0.5; // >50% duplicate lines\n}","tryCatchPattern":"try {\n  await memory.process(messages, { abortSignal: signal });\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Observer produced degenerate output')) {\n    logger.warn('observer model looping; switching to fallback model');\n    await memoryWithFallbackModel.process(messages, { abortSignal: signal });\n    return;\n  }\n  throw err;\n}","preventionTips":["Use a capable instruction-tuned model as observationModel; avoid sub-3B/quantized models for observer duties.","Set frequencyPenalty/repetitionPenalty and moderate temperature in observer modelSettings.","Keep observer prompts small: observe frequently so each cycle sees few messages.","Verify context-window size of the observation model exceeds your largest thread batch."],"tags":["llm-output","degenerate-repetition","observational-memory","model-quality"],"backgroundTag":"llm-degenerate-repetition","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}