Metadata-Version: 2.4
Name: yachay
Version: 0.1.4
Summary: Python SDK for Yachay — Condor Models inference API (OpenAI-compatible)
Author-email: Chicha Technology LLC <hello@chichatechnology.com>
License: MIT
Project-URL: Homepage, https://yachaymodels.com
Project-URL: Documentation, https://yachaymodels.com/docs
Project-URL: Source, https://github.com/ChichaTechnology/yachay-python
Project-URL: Bug Tracker, https://github.com/ChichaTechnology/yachay-python/issues
Keywords: yachay,condor,llm,inference,openai,ai
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
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: Programming Language :: Python :: 3.14
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx>=0.28
Requires-Dist: typer>=0.12
Requires-Dist: rich>=13.0
Requires-Dist: keyring>=24.0
Requires-Dist: click>=8.0
Provides-Extra: dev
Requires-Dist: pytest>=8.0; extra == "dev"
Dynamic: license-file

# Yachay Python SDK

Python client for [Yachay — Condor Models](https://yachaymodels.com) inference API.
Designed to feel like the OpenAI SDK so migrating existing code takes minutes.

## Install

```bash
pip install yachay
```

Requires Python 3.9+.

## Quickstart

```python
import yachay

client = yachay.Client()  # reads YACHAY_API_KEY from environment

response = client.chat.completions.create(
    model="llama-3.1-8b",
    messages=[{"role": "user", "content": "Explain gradient descent in one paragraph."}],
)
print(response.choices[0].message.content)
```

## Authentication

Create a customer API key in the [Yachay dashboard](https://yachaymodels.com/dashboard/api-access).
Keys are prefixed `yck_`.

**Recommended — environment variable:**

```bash
export YACHAY_API_KEY="yck_your_key_here"
```

**Or pass directly:**

```python
client = yachay.Client(api_key="yck_your_key_here")
```

## Available models

Run the CLI or call the SDK to see the current catalog (the list changes as new models are added):

```bash
yachay models list
```

```python
models = client.models.list()
for model in models.data:
    print(model.id, model.display_name)
```

## CLI

The `yachay` command ships with the package and covers the full developer workflow — authentication, fine-tuning jobs, inference, datasets, endpoints, and account management.

### Authentication

```bash
# Sign in via browser (credentials saved to the OS keychain; auto-refreshed)
yachay login

# Check who you're signed in as
yachay auth status

# CI/non-interactive: pass a key directly (or set YACHAY_API_KEY)
YACHAY_API_KEY=yck_... yachay jobs list
```

### Command groups

| Group | Example | Description |
|---|---|---|
| `auth` | `yachay auth status` | Sign in/out and check credentials |
| `models` | `yachay models list` | List available inference models |
| `jobs` | `yachay jobs submit --model llama-3.1-8b --model-name my-bot --dataset train.jsonl --agreed-max-usd 10` | Submit and manage fine-tuning jobs |
| `jobs` | `yachay jobs list`, `yachay jobs status <id>`, `yachay jobs download <id>` | Track and retrieve jobs |
| `jobs` | `yachay jobs estimate --model llama-3.1-8b --dataset-size-mb 5` | Cost/ETA estimate before submitting |
| `jobs` | `yachay jobs cancel <id>`, `yachay jobs metrics <id>`, `yachay jobs extend-storage <id>` | Manage active jobs |
| `datasets` | `yachay datasets generate --task-type chat --source "..."` | AI-assisted dataset generation |
| `datasets` | `yachay datasets upload <file.jsonl> --model llama-3.1-8b --model-name my-bot --agreed-max-usd 10` | Upload a BYO dataset |
| `infer` | `yachay infer playground --model llama-3.1-8b --prompt "Hello"` | Run a prompt through the inference playground |
| `endpoints` | `yachay endpoints deploy --job-id <id> --name my-endpoint` | Deploy a fine-tuned adapter to hosted inference |
| `account` | `yachay account me`, `yachay account prefs` | Account summary and notification preferences |
| `billing` | `yachay billing` | Show billing summary |
| `chat` | `yachay chat --model llama-3.1-8b --prompt "Hi"` | One-shot or interactive chat REPL |

### Useful flags

| Flag | Effect |
|---|---|
| `--json` | Machine-readable JSON output on stdout (errors on stderr) |
| `--yes` / `-y` | Skip confirmation prompts (CI/scripted use) |
| `--api-key KEY` | Override stored credentials (also `YACHAY_API_KEY` env var) |

### Credential storage

Login credentials (refresh token) are stored in the OS keychain (macOS Keychain, Linux Secret Service, Windows Credential Manager). Run `yachay logout` to remove them.

## Chat completions

```python
response = client.chat.completions.create(
    model="deepseek-r1-distill-llama-8b",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is the capital of Peru?"},
    ],
    max_tokens=256,
    temperature=0.7,
)

# Access the generated text
print(response.choices[0].message.content)

# Access token usage
print(f"Tokens used: {response.usage.total_tokens}")
```

## Context manager

```python
with yachay.Client() as client:
    response = client.chat.completions.create(
        model="llama-3.1-8b",
        messages=[{"role": "user", "content": "Hello!"}],
    )
    print(response.choices[0].message.content)
# HTTP connection pool is closed automatically
```

## Migrating from OpenAI

The client mirrors the OpenAI SDK's nested-namespace pattern. Replace:

```python
# Before
import openai
client = openai.OpenAI(api_key="sk-...")
response = client.chat.completions.create(model="gpt-4o", messages=[...])
```

with:

```python
# After
import yachay
client = yachay.Client(api_key="yck_...")
response = client.chat.completions.create(model="llama-3.1-8b", messages=[...])
```

Response objects share the same shape: `.choices[0].message.content`, `.usage.total_tokens`, etc.

## Error handling

```python
from yachay import AuthError, RateLimitError, APIError

try:
    response = client.chat.completions.create(...)
except AuthError:
    print("Invalid API key")
except RateLimitError:
    print("Slow down — you are being rate-limited")
except APIError as e:
    print(f"API error {e.status}: {e.body}")
```

All errors are subclasses of `yachay.YachayError`.

## Custom base URL and timeout

```python
client = yachay.Client(
    api_key="yck_...",
    base_url="https://api.yachaymodels.com/v1",  # default; override for testing
    timeout=30.0,  # seconds
)
```

## What v1 does NOT include

- **Streaming** — `stream=True` is not yet supported in the Python client. Passing `stream=True` raises an `APIError` with a clear message. Submit a feature request at [yachaymodels.com/support](https://yachaymodels.com/support).
- **SDK-native fine-tuning methods** — `client.jobs.*` and `client.datasets.*` are not exposed on the `Client` object in v1. Use the `yachay` CLI (see the CLI section above) for the full fine-tuning and dataset workflow.
- **Embeddings** — not available in v1.

## Documentation

Full API reference and guides at [yachaymodels.com/docs](https://yachaymodels.com/docs).

## License

MIT — see [LICENSE](../LICENSE) for details.
