Metadata-Version: 2.4
Name: river-client
Version: 0.1.1
Summary: Python client for River ML training API
Project-URL: Homepage, https://river.ai
Author-email: River AI <api@river.ai>
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: fine-tuning,grpc,llm,lora,reinforcement-learning,river,training
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.12
Requires-Dist: googleapis-common-protos>=1.60.0
Requires-Dist: grpcio>=1.80.0
Requires-Dist: numpy>=2.0.0
Requires-Dist: protobuf>=4.25.0
Requires-Dist: transformers>=4.40.0
Requires-Dist: xxhash>=3.0.0
Provides-Extra: examples
Requires-Dist: datasets>=2.14.0; extra == 'examples'
Requires-Dist: wandb>=0.16.0; extra == 'examples'
Description-Content-Type: text/markdown

# river-client

Python client for the [River](https://river.ai) ML training API — sampling,
LoRA fine-tuning, and reinforcement learning against River-hosted models.

## Installation

```bash
pip install river-client
```

Requires Python 3.12+.

## Quick start

```python
import river_client as river

client = river.Client(api_key="your-key", endpoint="api.river.ai")

# Stateless sampling from a base model
samples = client.sample(
    "What is 2+2?",
    base_model="Qwen/Qwen3.6-35B-A3B-FP8",
    max_tokens=50,
)
print(samples[0].text)

# Training with a session
with client.session() as session:
    model = session.create_model(
        base_model="Qwen/Qwen3.6-35B-A3B-FP8",
        lora=river.LoraConfig(rank=16),
    )

    # Forward + backward, then an optimizer step
    result = model.forward_backward(data, loss_fn="cross_entropy")
    model.optim_step(lr=1e-4)

    # Sample from the current weights
    sample_groups = model.sample("Continue:", max_tokens=100)
```

## License

Apache-2.0. See [`LICENSE`](LICENSE).
