debatefloor / docs /source /getting_started /contributing-envs.md
AniketAsla's picture
sync: mirror git d05fcb5 to Space
b4ac377 verified
# Contributing to Hugging Face
**Part 5 of 5** in the OpenEnv Getting Started Series
OpenEnv environments are designed to be shared. The `openenv` CLI provides first-class
commands for publishing, forking, and contributing to environments hosted as
[Hugging Face Spaces](https://huggingface.co/spaces).
Envs are deployed as Hugging Face Spaces which are; Git repositories, Docker images, Python packages, and Gradio apps
This guide covers three workflows:
1. **Push** a new environment you built to the Hub.
2. **Fork** someone else's environment to your Hugging Face account to make changes.
3. **Download** an environment, make changes, and open a Pull Request.
## Prerequisites
Before you start, make sure you have:
- Python 3.11+ and [`uv`](https://github.com/astral-sh/uv) installed
- The OpenEnv CLI: `pip install openenv-core[cli]` (or install from source)
- A [Hugging Face account](https://huggingface.co/join) with a [write token](https://huggingface.co/settings/tokens)
Authenticate with the Hub:
```bash
hf auth login
```
The `openenv` CLI will also prompt you to log in automatically if you haven't already.
## 1. Push a New Environment to the Hub
Once you've [built an environment](environment-builder.md), publishing it to a Hugging Face Space is a single command.
```bash
# Push the env at '.' to the hub with config in env.yaml
openenv push
# Push the env to a specific repo
openenv push --repo-id my-org/my-custom-env
# Push the env as private
openenv push --private
# Push the env at 'path/to/my_env' to the hub with config in openenv.yaml
openenv push path/to/my_env
```
That's it. The CLI validates your environment, stages the files, adds the Hugging Face Space frontmatter, enables the web interface, and uploads everything. Your environment will be live at
`https://huggingface.co/spaces/<your-username>/my_env`.
```{warning}
If you are getting errors on deployment, it is likely because the environment structure is not valid. Run `openenv validate --verbose` to see the errors. This checks for the required files (`openenv.yaml`, `pyproject.toml`, `server/app.py`) and validates the Dockerfile and entry points.
```
## 2. Fork Someone Else's Environment
Forking creates a copy of a Hugging Face Space under your own account. This is
the fastest way to start experimenting with an existing environment.
```bash
# Fork the openenv/wordle-env environment to your account
openenv fork owner/space-name
```
This duplicates the Space to `<your-username>/space-name` using the same name and config. To make changes, you can fork to a specific repo name, set environment variables and secrets, and request hardware.
```bash
# Fork to a specific repo name
openenv fork openenv/wordle-env --repo-id my-username/my-wordle
# Fork the openenv/coding-env environment to your account with environment variables and secrets
openenv fork openenv/coding-env \
--set-env MODEL_ID=meta-llama/Llama-3-8B \
--set-secret HF_TOKEN=hf_xxxxxxxxxxxxx
# Fork the openenv/coding-env environment to your account with a GPU
openenv fork openenv/coding-env --hardware t4-medium
```
Once forked, you have a fully independent copy. You can:
- Visit it at `https://huggingface.co/spaces/<your-username>/<space-name>`
- Clone it locally to make changes (see the next section)
- Push updates with `openenv push`
## 3. Pull, Modify, and Open a Pull Request
The contribution workflow lets you improve an existing environment and submit
your changes for review, just like a GitHub Pull Request but on the Hugging
Face Hub.
### 3.1 Download the Space locally
Hugging Face Spaces are Git repositories. Download the one you want to contribute to:
```bash
hf download owner/space-name --local-dir space-name --repo-type space
cd space-name
```
```{warning}
If the Space is private and you have access, make sure you're logged in with
`hf auth login` first.
```
#### 3.2 Make your changes
Edit the environment files as needed.
```{tip}
You can test your changes locally before submitting:
# Run the server locally
cd space-name
uvicorn server.app:app --host 0.0.0.0 --port 8000
# Or build and run in Docker
openenv build
openenv validate --verbose
```
#### 3.3 Push your changes as a Pull Request
From the cloned directory, use `openenv push` with the `--create-pr` flag:
```bash
openenv push --repo-id owner/space-name --create-pr
```
This uploads your modified files and opens a Pull Request on the Hub. The environment owner can review your changes, leave comments, and merge them.
```{warning}
When using `--create-pr`, the CLI uploads your changes to a new branch and
opens a PR on the **original** Space. You do not need to create the Space
yourself.
```
### Alternative: Fork-then-PR workflow
If you prefer to develop against your own fork first, you can combine the fork
and PR workflows:
```bash
# 1. Fork the environment to your account
openenv fork owner/space-name --repo-id my-username/space-name
# 2. Download the forked environment to your local directory
hf download my-username/space-name --local-dir space-name --repo-type space
cd space-name
# 3. Make and test your changes
# ... edit files, run locally, validate ...
# 4. Push the changes back to your fork
openenv push
# 5. Submit a PR to the original Space
openenv push --repo-id owner/space-name --create-pr
```
## End-to-End Example
Here's a complete example: forking the Echo environment, adding a feature, and
submitting a PR.
```bash
# Fork the echo environment
openenv fork openenv/echo-env --repo-id my-username/echo-env-improved
# Clone your fork
git clone https://huggingface.co/spaces/my-username/echo-env-improved
cd echo-env-improved
# Make changes (e.g., add a timestamp to observations)
# ... edit server/echo_environment.py ...
# Test locally
openenv validate --verbose
# Push your improvement as a PR to the original
openenv push --repo-id openenv/echo-env --create-pr
```
## Next Steps
- [Build your own environment from scratch](environment-builder.md)
- [Customize the web UI](../customizing-web-ui.md)
- [Browse available environments](../environments.md)
- [End-to-end tutorial](../tutorials/openenv-tutorial.md)