---
name: parse_llm_json
kind: function
lang: py
domain: core
version: "1.0.0"
purity: impure
signature: "def parse_llm_json(response: str) -> dict"
description: "Parsea una respuesta LLM como JSON, limpiando primero think tags y markdown codeblocks. Combina strip_think_tags + strip_markdown_codeblock + json.loads."
tags: [llm, json, parsing, cleaning, think, codeblock]
uses_functions: [strip_think_tags_py_core, strip_markdown_codeblock_py_core]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [json]
params:
  - name: response
    desc: "String con respuesta del LLM (posiblemente con think tags y markdown codeblocks)"
output: "Diccionario parseado del JSON limpio"
tested: true
tests: ["JSON limpio es parseado correctamente", "JSON con think tags y codeblock es parseado correctamente", "JSON invalido lanza ValueError"]
test_file_path: "python/functions/core/parse_llm_json_test.py"
file_path: "python/functions/core/parse_llm_json.py"
---

## Ejemplo

```python
# Respuesta limpia
result = parse_llm_json('{"status": "ok"}')
# {"status": "ok"}

# Respuesta con think tags y codeblock
raw = '<think>I need to return JSON.</think>\n```json\n{"status": "ok"}\n```'
result = parse_llm_json(raw)
# {"status": "ok"}

# JSON invalido lanza ValueError
parse_llm_json("not json at all")
# ValueError: parse_llm_json: invalid JSON after cleaning. Cleaned text: 'not json at all'
```

## Notas

Funcion impura porque puede lanzar ValueError. El mensaje de error incluye el texto ya limpiado (post strip_think_tags y strip_markdown_codeblock) para facilitar el debugging. Composicion de tres funciones: strip_think_tags → strip_markdown_codeblock → json.loads.
