Metadata-Version: 2.5
Name: se3labs
Version: 0.0.0a0
Summary: SE3 Labs client library: evaluate your robot policy on an SE3 Labs station without shipping model code.
Project-URL: Documentation, https://se3labs.github.io/YAM-Station/
Project-URL: Source, https://github.com/se3labs/YAM-Station
Author: SE3 Labs
License-Expression: Apache-2.0
Keywords: grpc,policy-evaluation,robotics
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.10
Requires-Dist: grpcio>=1.75
Requires-Dist: protobuf>=6
Description-Content-Type: text/markdown

# se3labs

Client library for evaluating a robot policy on an SE3 Labs station. Your
model runs on your machine; the station streams observations to it over one
gRPC stream, executes the actions it returns under the station's safety
layer, and records everything. Nothing here touches hardware: the only
dependencies are `grpcio` and `protobuf`.

```bash
pip install se3labs
```

Run a reference policy against the job id your SE3 Labs contact gives you,
and poll the job's progress:

```bash
se3labs eval run    --job job_… --address relay.example.com:7443 --policy hold
se3labs eval status --job job_… --address relay.example.com:7443
```

Wrap your own model:

```python
from se3labs.eval.policy import client
from se3labs.eval.policy.proto import policy_session_pb2 as pb


class MyPolicy:
    def manifest(self) -> pb.ClientManifest:
        return client.default_manifest(model="my-model", version="1", max_horizon=8)

    def reset(self, reset: pb.Reset) -> None:
        pass

    def act(self, observe: pb.Observe) -> list[pb.Action]:
        targets = {a.name: (list(a.joint_pos_rad), None) for a in observe.observation.arms}
        return [client.joint_action(targets) for _ in range(8)]


client.serve_policy("job_…", "relay.example.com:7443", MyPolicy())
```

Or, with that class saved in `my_policy.py`, without writing the last line:

```bash
se3labs eval run --job job_… --address relay.example.com:7443 --policy my_policy:MyPolicy
```

Full documentation: https://se3labs.github.io/YAM-Station/

Protocol version: `se3labs.eval.policy.PROTOCOL_VERSION`. A release that
changes it cannot talk to a station expecting the old one.
