Metadata-Version: 2.4
Name: jammi-ai-platform
Version: 0.7.0
Summary: Python SDK for Jammi AI Platform — the commercial managed audit-native AI platform
Project-URL: Homepage, https://console.jammi.cloud
Project-URL: Documentation, https://docs.jammi.cloud
Author: F-Inverse
License: Proprietary
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: Other/Proprietary 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: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.9
Requires-Dist: grpcio>=1.60
Requires-Dist: jammi-client>=0.21
Requires-Dist: protobuf>=4.25
Requires-Dist: pyarrow>=14
Requires-Dist: typing-extensions>=4.0
Provides-Extra: dev
Requires-Dist: grpcio-tools>=1.60; extra == 'dev'
Requires-Dist: pytest>=7; extra == 'dev'
Requires-Dist: requests>=2.31; extra == 'dev'
Description-Content-Type: text/markdown

# jammi-ai-platform

Python SDK for the Jammi AI Platform — the commercial managed
audit-native AI platform. Talks to a Jammi SaaS endpoint via gRPC with
bearer-token authentication.

## Install

```bash
pip install jammi-ai-platform
```

Wheel-only distribution. Python 3.9+ on Linux / macOS / Windows.

## Quickstart

```python
import jammi_ai_platform as jap

with jap.Connection(url="https://api.jammi.cloud", api_key="jt_…") as conn:
    print(conn.tenant_id)         # resolved via WhoAmI at connect time
    print(conn.token_label)       # label of the bearer in use

    registry = jap.Registry(conn)
    model_id = registry.register_model("recall-q4", task="embedding")
    version_id = registry.register_version(
        model_id,
        jammi_model_id="bge-small-en-v1.5",
        source=jap.ManualSource(metric_name="recall_at_k", metric_value=0.92),
    )

    jap.Gate(conn).check(
        version_id,
        jap.GateConfig(
            gate_name="ship-gate",
            source_id="patents",
            golden_set="golden-1",
            k=10,
            rule=jap.ThresholdRule(
                metric_name=jap.MetricName.RECALL_AT_K,
                threshold=0.85,
                op=jap.ThresholdOp.GE,
            ),
        ),
    )
```

Use `http://…` / `grpc://…` instead of `https://…` / `grpcs://…` for local
insecure development.

## Configuration is typed

Every control-plane config is a typed builder, not an untyped dict: enums for
the `*_type`/`direction`/`op` fields (so an invalid value is a construction
error), and tagged-union variants dispatched by type — `MaxIterationsBudget` /
`WallClockBudget` / `NoImprovementBudget` for an `ExperimentConfig` budget,
`EmbeddingTarget` / `InferenceTarget` for a `MonitorConfig` target,
`ThresholdRule` / `RangeRule` / `WelchTTestRule` / `MannWhitneyURule` /
`ParetoDominatesRule` / `CompoundRule` for a gate `Rule`, and
`ExperimentIterationSource` / `ManualSource` for a registry version source. The
open JSON/Struct payloads — an experiment's `search_space`, a validation's
`perturbation_params`, an evidence `config_json` — stay plain dicts.

## Data plane (composed from jammi-client)

`connect`, `RemoteDatabase`, and `BearerCredentials` are re-exported from
`jammi-client`: the embed / search / sql data plane comes from there, the
control plane lives here, and both ride jammi-client's bearer transport.

The data plane and the control plane open **separate** sessions. A
`jap.Connection` is bearer-scoped — it resolves a tenant via `WhoAmI` and vends
the control-plane handles. `jap.connect(target, credentials=...)` opens its own
`RemoteDatabase` session (jammi-session-id scoped) for the data plane. They are
two independent connections, not one shared channel; open each explicitly.

## Surface

- `Connection` — control-plane gRPC channel + bearer auth, calls `WhoAmI` at connect
- `connect` / `RemoteDatabase` — re-exported jammi-client data plane (embed / search / sql)
- `Registry` — model + version + evidence catalog
- `Gate` — quality-gate checks
- `Monitor` — embedding / inference / divergence monitors + run streaming
- `Experiment` — Bayesian / Grid / Random experiments
- `DeploymentBlocks` — block / unblock sources from production traffic
- `Resilience` — perturbation-based validation runs
- `Auth` — issue / revoke / list API keys; `WhoAmI`
- `Tenants` — read-only tenant directory lookup

## Errors

`status_to_exception` (in `jammi_ai_platform.errors`) maps every
gRPC status code to a typed Python exception. The hierarchy:

- `EnterpriseException`
  - `NotFoundError`
  - `AlreadyExistsError`
  - `TransitionNotAllowedError`
  - `TenantUnboundError`
  - `ConfigError`
  - `PermissionDeniedError`

## Docs

Full docs at https://docs.jammi.cloud.
