I've been stress-testing OpenPipe for the last eight months in a pre-production environment, and while the fine-tuning and cost tracking are decent, our legal team has raised data sovereignty concerns that mean we need to prepare an exit strategy. The core question they asked, and the one I had to find an answer for, is: how do you actually get *all* of your data out if you decide to terminate the contract?
The platform's UI is predictably focused on day-to-day operations, not data liberation. After digging through API docs and running several extraction jobs, here is the breakdown of what you can export and the non-obvious gaps you need to plan for.
**What you can export via API (with effort):**
* **Fine-tuned Models:** You can retrieve the model adapter weights (e.g., for Llama or Mistral) via the API. However, they are in OpenPipe's proprietary format. You'll need to use their `openpipe` Python package to convert them to a standard Hugging Face format, which adds a dependency step to your export process.
* **Training Datasets:** Your prompt/completion pairs used for fine-tuning can be exported as JSONL. This is straightforward but requires paginating through the API. You lose the metadata about which dataset version was used for which training run unless you manually correlate IDs.
* **Logs & Cost Data:** Request logs and associated costs can be fetched. This is crucial for rebuilding audit trails. The data volume here is massive, so you need to script it and handle rate limits.
**The problematic gaps and procedural lock-in:**
* **Inference Data:** Your production inference logs (prompts/completions) are not directly exportable in a bulk format. You must rely on the logged requests you already have, meaning if your retention setting was short, that data is gone.
* **Project Structure & Configuration:** The relationships between projects, datasets, training runs, and model deployments are not part of any export. You will have to manually document your pipeline topology, which is a significant overhead for complex setups.
* **Vendor-Locked Format:** The model conversion step is a clear vendor lock. Your exit timeline must include time to convert all model variants and then validate their performance match in your new environment.
Here is the basic script skeleton I used to kick off dataset exports. You'll need to expand it with pagination and error handling.
```python
import requests
import json
API_KEY = "your_key_here"
BASE_URL = "https://app.openpipe.ai/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Fetch list of datasets
datasets_resp = requests.get(f"{BASE_URL}/datasets", headers=headers)
datasets = datasets_resp.json()["data"]
for dataset in datasets:
dataset_id = dataset["id"]
# This endpoint returns the dataset *rows* for training
data_resp = requests.get(
f"{BASE_URL}/datasets/{dataset_id}/export",
headers=headers,
params={"format": "jsonl"}
)
filename = f"dataset_{dataset_id}.jsonl"
with open(filename, 'w') as f:
for line in data_resp.iter_lines():
if line:
f.write(line.decode('utf-8') + 'n')
print(f"Exported {filename}")
```
**Recommendation:** Start your data export process **well before** your planned migration. Treat it like a backup restoration drill—actually try to rebuild a single fine-tuned model and its pipeline from the exported data in a sandbox. You will discover missing linkages and format issues that aren't apparent until you try to operationalize the data elsewhere. For us, the lack of a structured, self-contained export bundle means the exit is manual, fraught with data loss risks, and requires significant engineering time to reassemble the pieces.
-- as
Thanks for starting this, it's exactly the kind of practical detail I've been worrying about. The point about the model weights being in a proprietary format is crucial, that dependency on their Python package for conversion feels like a vendor lock-in trap disguised as a feature.
You mentioned the training datasets can be exported as JSONL. Did you run into any issues with the integrity of that data, like whether the exported prompts still have all their original metadata and tags attached? I'm trying to figure out if the export is truly lossless or if we'd be losing organizational context we built up during training.
The JSONL export is lossless for the raw training examples, but the metadata is a separate API call. You need to fetch tags and project structures from the `/tags` and `/projects` endpoints, then join it yourself. It's not a complete snapshot.
EXPLAIN ANALYZE
Thanks for sharing this, it's super helpful to see a breakdown like this. I'm actually just starting to look at OpenPipe for a small project, so I'm saving this for later.
You mentioned the model weights are in a proprietary format. Does their `openpipe` package convert it to a standard safetensors file, or is it more complex than that? That extra conversion step feels like a hidden hurdle.
Also, for someone like me who's still learning, is the pagination for the JSONL export pretty straightforward, or did you have to write a bunch of custom logic? Thanks again for the details
You've nailed the critical first layer, the API-accessible assets. Let's talk about the second layer, the operational data that's harder to scrape but just as important for an audit trail.
Your list is missing the continuous inference logs - every prompt you sent and the response you got, which includes latency, token counts, and cost. That's your proof of historical performance and billing integrity. You can get it via their reporting API, but you'll need to script date-range queries; it doesn't just dump everything.
Also, watch out for the project configuration itself - the model parameters, sampling temperature, and token limits you set for each pipeline. If you ever need to re-create the exact tuning setup elsewhere, that's in the `/projects/{id}` endpoint, not bundled with the model weights.