The Response Healing plugin automatically validates and repairs malformed JSON responses from AI models. When models return imperfect formatting – missing brackets, trailing commas, markdown wrappers, or mixed text – this plugin attempts to repair the response so you receive valid, parseable JSON.
Overview
Response Healing provides:
Automatic JSON repair: Fixes missing brackets, commas, quotes, and other syntax errors
Markdown extraction: Extracts JSON from markdown code blocks
How It Works
The plugin activates for non-streaming requests when you set text.format in a Responses API request (or response_format on Chat Completions) to either type: "json_schema" or type: "json_object", and include the response-healing plugin in your plugins array. See the Complete Example below for a full implementation.
What Gets Fixed
The Response Healing plugin handles common issues in LLM responses:
JSON Syntax Errors
Input: Missing closing bracket
{"name": "Alice", "age": 30
Output: Fixed
{"name": "Alice", "age": 30}
Markdown Code Blocks
Input: Wrapped in markdown
```json{"name": "Bob"}```
Output: Extracted
{"name": "Bob"}
Mixed Text and JSON
Input: Text before JSON
Here's the data you requested:{"name": "Charlie", "age": 25}
import requestsimport jsonresponse = requests.post( "https://openrouter.ai/api/v1/responses", headers={ "Authorization": f"Bearer <OPENROUTER_API_KEY>", "Content-Type": "application/json", }, json={ "model": "google/gemini-2.5-flash", "input": "Generate a product listing with name, price, and description", "text": { "format": { "type": "json_schema", "name": "Product", "schema": { "type": "object", "properties": { "name": { "type": "string", "description": "Product name" }, "price": { "type": "number", "description": "Price in USD" }, "description": { "type": "string", "description": "Product description" } }, "required": ["name", "price"] } } }, "plugins": [ {"id": "response-healing"} ] })data = response.json()message = next(item for item in reversed(data["output"]) if item["type"] == "message")product = json.loads( next(part["text"] for part in message["content"] if part["type"] == "output_text"))# The plugin attempts to repair malformed JSON syntaxprint(product["name"], product["price"])
Limitations
Non-Streaming Requests OnlyResponse Healing only applies to non-streaming requests.
Will not repair all JSONSome malformed JSON responses may still be unrepairable. In particular, if the response is truncated by max_output_tokens, the plugin will not be able to repair it.