Extract the entities group from a plan dict, with graceful fallback. Returns ``{"create": [...], "update": [...], "related": [...]}``. A missing/malformed ``entities`` key yields empty lists, so older or partial LLM responses never raise.
(parsed: object, valid_types: frozenset | None = None)
| 654 | |
| 655 | |
| 656 | def _parse_entities_plan(parsed: object, valid_types: frozenset | None = None) -> dict: |
| 657 | """Extract the entities group from a plan dict, with graceful fallback. |
| 658 | |
| 659 | Returns ``{"create": [...], "update": [...], "related": [...]}``. A |
| 660 | missing/malformed ``entities`` key yields empty lists, so older or |
| 661 | partial LLM responses never raise. |
| 662 | """ |
| 663 | empty = {"create": [], "update": [], "related": []} |
| 664 | if not isinstance(parsed, dict): |
| 665 | return empty |
| 666 | group = parsed.get("entities") |
| 667 | if not isinstance(group, dict): |
| 668 | return empty |
| 669 | return { |
| 670 | "create": _filter_entity_items(group.get("create", []), valid_types), |
| 671 | "update": _filter_entity_items(group.get("update", []), valid_types), |
| 672 | "related": _filter_related_slugs(group.get("related", [])), |
| 673 | } |
| 674 | |
| 675 | |
| 676 | # --------------------------------------------------------------------------- |