---
title: "Keep each customer's data in its own · Agent Wranglers"
url: https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback/tenant-fine-tunes
updated: 2026-10-21
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Keep each customer's data in its own fine-tuned model

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Logs, privacy and feedback](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers). Updated 2026-10-21.

- ID: AIF-58
- Level: Required
- Chapter: [Logs, privacy and feedback](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback)
- Rule: A model fine-tuned on one customer's private data answers only that customer. Never train a model that several customers share on data that one of them owns.
- Risk: Data leaked or lost
- Applies when: The project uses AI models, or has user accounts.
- How: A model can repeat its training data word for word, and no filter on the prompt reliably stops that. Train shared models only on data every customer may see, such as your own help pages or examples you wrote. Record the owner account of each fine-tuned model in the gateway, and route calls to it only for that account. Put a unique canary string, such as `CANARY-7f3a91`, into each customer's training set. After every training run, ask the other customers' models and the shared models to complete it. The legal basis for training is in [train only on data people agreed to share](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback/consent-before-training).
- Check: A test calls the gateway as customer B with customer A's model ID and gets an error with no model call. After each training run, 20 prompts with the canary's first half sent to every other model never return its second half.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### TypeScript example

```ts
export function checkModelAccess(accountId: string, modelId: string): void {
  const owner = fineTunedModelOwners.get(modelId);
  if (owner && owner !== accountId) throw new Error('model_not_owned');
}
```

### Python example

```python
def check_model_access(account_id: str, model_id: str) -> None:
    owner = fine_tuned_model_owners.get(model_id)
    if owner and owner != account_id:
        raise PermissionError("model_not_owned")
```

## Sources

- [OWASP LLM02:2025 Sensitive Information Disclosure](https://genai.owasp.org/llmrisk/llm022025-sensitive-information-disclosure/)

## Related rules

- [Train only on data people agreed to share](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback/consent-before-training) in AI features

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback/tenant-fine-tunes">Agent Wranglers AI features playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Train only on data people agreed to share](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback/consent-before-training)
- Next: [Erase a person's data from every AI store](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback/erase-from-ai-stores)
- [Logs, privacy and feedback](https://agentwranglers.se/playbook/ai-features/logs-privacy-and-feedback)
