simbiot-harness/venv/lib/python3.12/site-packages/strands/multiagent/_snapshot.py
Simbiot Harness b60439152b Simbiot Harness v0.1: тактовая лестница на Strands + CQRS/ES-спина
- harness/es.py: append-only event store + проекции (образец — кооп-портал)
- harness/levels.py: уровни 1с/1м/1ч/1д, контекст ∝ масштабу
- harness/scheduler.py: уровневые потоки, идемпотентные тики, absorbed-стабы
- harness/isolated_runner.py + _llm_worker.py: LLM-тик в сабпроцессе
  (глобальный asyncio-рантайм Strands не переживает 2+ create_harness)
- cli.py: init/task/tasks/status/events + requeue (написан самим минутным агентом)
- 9router: отдельный ключ sk-simbiot, модель auto (glm-5.3 первым)
2026-09-29 15:28:50 +00:00

59 lines
2.2 KiB
Python

"""Snapshot capture and restore for multi-agent orchestrators (Graph and Swarm).
Wraps an orchestrator's :meth:`~strands.multiagent.base.MultiAgentBase.serialize_state`
output in the versioned :class:`~strands.types._snapshot.Snapshot` envelope so the persisted
format can evolve, mirroring the TypeScript SDK's ``multiagent/snapshot.ts``.
Well-known keys in ``data``:
- ``orchestrator_id`` — orchestrator identity, verified on load.
- ``state`` — the orchestrator's serialized execution state.
"""
from typing import TYPE_CHECKING, Any
from ..types._snapshot import SNAPSHOT_SCHEMA_VERSION, Snapshot
from ..types.exceptions import SnapshotException
if TYPE_CHECKING:
from .base import MultiAgentBase
def take_snapshot(orchestrator: "MultiAgentBase", *, app_data: dict[str, Any] | None = None) -> Snapshot:
"""Capture an orchestrator's execution state as a versioned snapshot.
Args:
orchestrator: The Graph or Swarm to capture.
app_data: Application-owned data. Strands does not read or modify it.
Returns:
A ``multiAgent``-scope snapshot wrapping the orchestrator's serialized state.
"""
return Snapshot(
scope="multiAgent",
schema_version=SNAPSHOT_SCHEMA_VERSION,
data={"orchestrator_id": orchestrator.id, "state": orchestrator.serialize_state()},
app_data=app_data or {},
)
def load_snapshot(orchestrator: "MultiAgentBase", snapshot: Snapshot) -> None:
"""Restore an orchestrator's execution state from a snapshot.
Args:
orchestrator: The Graph or Swarm to restore into.
snapshot: The snapshot to load.
Raises:
SnapshotException: If the snapshot is not a current-schema ``multiAgent`` snapshot,
or its ``orchestrator_id`` does not match ``orchestrator.id``.
"""
snapshot.validate()
if snapshot.scope != "multiAgent":
raise SnapshotException(f"Expected snapshot scope 'multiAgent', got {snapshot.scope!r}")
snapshot_id = snapshot.data.get("orchestrator_id")
if snapshot_id != orchestrator.id:
raise SnapshotException(f"Snapshot orchestrator id mismatch: expected {orchestrator.id!r}, got {snapshot_id!r}")
orchestrator.deserialize_state(snapshot.data["state"])