# `LangExtract.WireFormat`
[🔗](https://github.com/mdepolli/lang_extract/blob/v0.10.0/lib/lang_extract/wire_format.ex#L1)

Port between external LLM format and internal domain.

Serializes `%Extraction{}` structs to fenced dynamic-key JSON for prompts
(matching upstream langextract's default — decided by the 2026-07-05
format A/B, see benchmark/decisions/), and normalizes raw LLM output
back to canonical format for the parser. Decoding is JSON-only (since
0.7.0; the YAML tolerance path and its repair machinery were removed
once JSON became the wire format).

Both directions of the wire format live here on purpose — they share the
dynamic-key `_attributes` contract. `Prompt.Builder` uses the encode half;
`Pipeline` uses the decode half.

# `format_extractions`

```elixir
@spec format_extractions([LangExtract.Extraction.t()]) :: String.t()
```

# `normalize`

```elixir
@spec normalize(String.t()) :: {:ok, map()} | {:error, {:invalid_format, String.t()}}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
