membrane-temp / models.py
luffy-orf
Initial Membrane Space layout
8393390
Raw
History Blame Contribute Delete
3.23 kB
"""
Membrane OpenEnv data contracts.
Full field list and enums: ../docs/05-types-and-api.md and ../docs/SPEC.md
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Dict, List, Literal, Optional
Verb = Literal["QUERY", "SEND", "PLAN", "COMMIT", "REFUSE", "VERIFY"]
MessageSurface = Literal["USER_REPLY", "AGENT_DM", "TEAM_MEMORY", "TOOL_PAYLOAD", "RUN_LOG"]
try:
from pydantic import Field
from openenv.core.env_server import Action, Observation, State
class MembraneAction(Action):
verb: Verb = "QUERY"
surface: Optional[MessageSurface] = None
content: str = ""
disclosure_tier: Optional[str] = None
target_agent: Optional[str] = None
reason: str = ""
refusal_kind: Optional[str] = None
acting_as: Optional[str] = None
metadata: Dict[str, Any] = Field(default_factory=dict)
class MembraneObservation(Observation):
episode_goal: str = ""
message: str = ""
visible_fact_ids: List[str] = Field(default_factory=list)
metadata: Dict[str, Any] = Field(default_factory=dict)
class MembraneState(State):
world_state_hash: str = ""
surface_audit_json: str = "{}"
failure_tags: List[str] = Field(default_factory=list)
metadata: Dict[str, Any] = Field(default_factory=dict)
except ImportError:
# Minimal dataclasses for tests / docs without openenv-core + pydantic
@dataclass
class MembraneAction:
verb: Verb = "QUERY"
surface: Optional[MessageSurface] = None
content: str = ""
disclosure_tier: Optional[str] = None
target_agent: Optional[str] = None
reason: str = ""
refusal_kind: Optional[str] = None
acting_as: Optional[str] = None
metadata: Dict[str, Any] = field(default_factory=dict)
@dataclass
class MembraneObservation:
done: bool = False
reward: Optional[float] = None
episode_goal: str = ""
message: str = ""
visible_fact_ids: List[str] = field(default_factory=list)
metadata: Dict[str, Any] = field(default_factory=dict)
def model_dump(self) -> Dict[str, Any]:
return {
"done": self.done,
"reward": self.reward,
"episode_goal": self.episode_goal,
"message": self.message,
"visible_fact_ids": self.visible_fact_ids,
"metadata": self.metadata,
}
@dataclass
class MembraneState:
episode_id: Optional[str] = None
step_count: int = 0
world_state_hash: str = ""
surface_audit_json: str = "{}"
failure_tags: List[str] = field(default_factory=list)
metadata: Dict[str, Any] = field(default_factory=dict)
def model_dump(self) -> Dict[str, Any]:
return {
"episode_id": self.episode_id,
"step_count": self.step_count,
"world_state_hash": self.world_state_hash,
"surface_audit_json": self.surface_audit_json,
"failure_tags": self.failure_tags,
"metadata": self.metadata,
}