mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-03 06:12:14 +08:00
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
|
|
"""Sandbox metadata for cross-process discovery and state persistence."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import time
|
||
|
|
from dataclasses import dataclass, field
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass
|
||
|
|
class SandboxInfo:
|
||
|
|
"""Persisted sandbox metadata that enables cross-process discovery.
|
||
|
|
|
||
|
|
This dataclass holds all the information needed to reconnect to an
|
||
|
|
existing sandbox from a different process (e.g., gateway vs langgraph,
|
||
|
|
multiple workers, or across K8s pods with shared storage).
|
||
|
|
"""
|
||
|
|
|
||
|
|
sandbox_id: str
|
||
|
|
sandbox_url: str # e.g. http://localhost:8080 or http://k3s:30001
|
||
|
|
container_name: str | None = None # Only for local container backend
|
||
|
|
container_id: str | None = None # Only for local container backend
|
||
|
|
created_at: float = field(default_factory=time.time)
|
||
|
|
|
||
|
|
def to_dict(self) -> dict:
|
||
|
|
return {
|
||
|
|
"sandbox_id": self.sandbox_id,
|
||
|
|
"sandbox_url": self.sandbox_url,
|
||
|
|
"container_name": self.container_name,
|
||
|
|
"container_id": self.container_id,
|
||
|
|
"created_at": self.created_at,
|
||
|
|
}
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_dict(cls, data: dict) -> SandboxInfo:
|
||
|
|
return cls(
|
||
|
|
sandbox_id=data["sandbox_id"],
|
||
|
|
sandbox_url=data.get("sandbox_url", data.get("base_url", "")),
|
||
|
|
container_name=data.get("container_name"),
|
||
|
|
container_id=data.get("container_id"),
|
||
|
|
created_at=data.get("created_at", time.time()),
|
||
|
|
)
|