Skip to content

Prepare data for your own AI

Reading data is not permission to use it for AI. Ophiolite keeps a separate choice, made by the owner of each original or result, for three uses: Find similar data (embedding), Train models and Test models (evaluation). Everything below happens inside your deployment; Ophiolite runs no hosted model and trains nothing.

In the item’s sharing panel, Use for AI lists the people who can read it. Tick what each may do and choose Save AI use. The choice is saved against the version you saw (a conflict asks you to reload), recorded in the activity history, and only counts while the person can read the item: removing their read access, or narrowing who can ever see the original, removes it. People who can read an item see only their own permission. The owner may always use their own data.

from ophiolite import Client
from ophiolite.corpus import verify
corpus = client.export_corpus([(asset, revision, ['GR']), ...], 'corpus-2026-09',
purpose='training', seed=7, fractions=(0.8, 0.1, 0.1))
verify('corpus-2026-09')

The server first authorizes the whole selection for that purpose — one item without permission refuses everything and names only its position — and records the authorization (valid for 15 minutes; revoking later stops future exports, not one already authorized). The folder then holds:

  • bundle/ — an ordinary portable bundle: exact originals, descriptors and curves with their checksums, units, depth references and missing values.
  • corpus.json — ophiolite.ai-corpus/1: the exact selection, why each item was allowed (owner or granted), the purpose, the split algorithm, seed and fractions, the group and split of every item, declared transformations (none: values as published), file checksums, the SDK version and an MLflow-style dataset reference (name, digest, source).
  • samples.jsonl (and samples.parquet when pyarrow is installed) — one row per sample: item, group, split, curve, unit, depth, depth unit and reference, value (null for missing; zero stays zero).

Splits keep a well’s data together: every item is grouped by its LAS WELL (as las-well:<WELL>) or by a group you name (groups={asset: 'north block'}); the split is sha256(seed ‖ NUL ‖ group) placed on the fractions (split/1). Items without a well need a named group. verify() recomputes checksums, membership, splits and every sample from the bundle.

client.search('gamma ray near the reservoir') ranks what you may read by its description (name, type, curves, units, well, how it was made). By default the ranking uses words. An operator can set OPHIOLITE_EMBEDDING_COMMAND to a local program that reads one JSON text per line and prints one vector per line; the gateway always starts it in a network namespace with no interfaces (unshare -rn), so it cannot reach any host, and refuses to run it otherwise. The gateway host must allow unprivileged user namespaces (on Ubuntu 24.04: kernel.apparmor_restrict_unprivileged_userns=0, or an AppArmor profile for the gateway); where it does not, search by meaning answers “unavailable” and nothing is sent to the model. Only items you may use to find similar data are sent to the model; the answer says how many readable items were not searched by meaning, and method='words' searches them all by words. Vectors are cached per model and exact version.

An MCP search tool for AI assistants (it waits for the remote MCP endpoint), model training or hosting, and vector databases.