Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,20 @@ build-backend = "uv_build"

[project]
name = "seahaven"
version = "0.0.1"
version = "0.5.0"
description = "Synthetic world framework for agent evals and RL."
readme = "README.md"
requires-python = ">=3.14"
license = "MIT"
license-files = ["LICENSE"]
authors = [{ name = "Steve Cosman" }]
keywords = ["ai", "agents", "rl", "evaluation", "environments", "simulation"]
classifiers = [
"Development Status :: 1 - Planning",
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.14",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
# Lower bounds are the versions this project is known to work on, not the
Expand Down
10 changes: 0 additions & 10 deletions src/seahaven/docs/authoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,6 @@ notes/
tests/test_fixtures.py # the fixture recipe above, run into a temporary directory
```

**Before you run the `uv sync` that `seahaven new` prints as its next step:** while Seahaven is
unpublished, that step does not do what it looks like. A scaffold depends on `seahaven~=0.0`, and
that resolves to a placeholder release on PyPI which contains none of the framework. `uv sync`
succeeds, and the world then fails at import with `ModuleNotFoundError: No module named
'seahaven.world'`, raised by the scaffold's own `middleware/error_handler.py`, which says nothing
about where the package came from. `seahaven check` does not even start, because the placeholder
ships no console script. Install the framework from a checkout instead (`uv pip install -e
/path/to/Seahaven`, with `[serve]` if the world will be served), or work in an environment that
already has it. This paragraph disappears when Seahaven is published.

Three rules about the layout are worth stating now.

**A world is a package**, never a directory loaded by path. The tooling finds a world by importing
Expand Down
6 changes: 3 additions & 3 deletions src/seahaven/docs/http_apis.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ Seahaven adds nothing for this. It is a plain function call.
### Install the server

The server needs Starlette and uvicorn, which the `serve` extra installs.
[Install the extra from a checkout](serving_and_openenv.md#install-the-serve-extra) until Seahaven
is published. Without it, `seahaven.http.app` and `serve` raise an `ImportError` that says so, and
`serve_http.py` prints the same message and exits 1.
[Install the extra](serving_and_openenv.md#install-the-serve-extra). Without it,
`seahaven.http.app` and `serve` raise an `ImportError` that says so, and `serve_http.py` prints the
same message and exits 1.

### The script

Expand Down
8 changes: 1 addition & 7 deletions src/seahaven/docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,7 @@ reaches the scaffolded `world.py` verbatim, so a world it cannot import is refus
directory is written. A name whose package has the same name as a standard library module or
`seahaven` is refused too, because Python imports that module instead of the world.

The command finishes by printing what to do next. While Seahaven is unpublished, the `uv sync` in
that list is a trap: the scaffold's `seahaven~=0.0` resolves to a placeholder release that contains
none of the framework, so the sync succeeds and the world fails at import with `ModuleNotFoundError:
No module named 'seahaven.world'`. `seahaven check` itself cannot start either, because the
placeholder ships no console script. Install the framework from a checkout until publication. The
same applies to `--hub`: the `Dockerfile` it writes runs `uv sync --extra serve`, which today builds
an image whose container cannot start.
The command finishes by printing what to do next.

## `seahaven check`

Expand Down
20 changes: 7 additions & 13 deletions src/seahaven/docs/serving_and_openenv.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,12 @@ The server and the client are in Seahaven's `serve` extra, because OpenEnv's dep
large and a world used in process should not pay for it. The environment needs a final CPython 3.14
or newer, not a release candidate.

**Do not run `pip install "seahaven[serve]"`.** The framework is not published yet. The `seahaven`
name on PyPI currently holds a placeholder release that contains none of this and has no `serve`
extra, so that command succeeds and installs nothing useful, which is worse than failing. Until
publication, install the framework and its extra from a checkout of the Seahaven repository, for
example `uv pip install -e "/path/to/Seahaven[serve]"` into the environment your world runs in.
A world made by `seahaven new` has a `serve` extra that installs Seahaven's. Run `uv sync --extra
serve` in the world's directory. In any other project, add `seahaven[serve]` as a dependency:

```sh
uv add "seahaven[serve]"
```

### The app file

Expand Down Expand Up @@ -554,12 +555,6 @@ root `Dockerfile`, a root `__init__.py`, `client.py` and `models.py`. It adds no
world that does not publish to a hub carries none of them. `client.py` is a single re-export,
because the typed client for every Seahaven world is `SeahavenClient`.

**That `Dockerfile` does not build a working image today.** Its build step is `RUN uv sync --extra
serve`, and the world's `serve` extra is `seahaven[serve]`, which resolves to the placeholder
release described at the top of this page. The image builds, and the container cannot start: there
is no `seahaven.openenv` in it. Until publication, an image has to get the framework from a checkout
or a private index, which means editing that `RUN` line.

**The image is a checkout, and has to stay one.** The generated `Dockerfile` does `COPY . /app` and
then `uv sync`, so the container holds the world's whole directory with the framework installed into
its environment. Replace those two lines with a plain install of the world and the image builds, the
Expand Down Expand Up @@ -602,8 +597,7 @@ document and no control tool.

Two steps run a world in a client:

1. `uv run --extra mcp seahaven mcp`, in the world's own directory ([from a checkout until
publication](#install-the-serve-extra)).
1. `uv run --extra mcp seahaven mcp`, in the world's own directory.
2. Give a client that same command. The `.mcp.json` below is the whole configuration:

```json
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading