# Importer un profil JSON dans un jeu d’essai local

Importez un profil JSON dans un jeu d’essai local avec une validation déterministe en Python, sans API ni dépendance externe.

- URL canonique: https://www.harmate.com/fr/blog/importer-un-profil-json-dans-un-jeu-dessai-local
- Auteur: Harmate Team
- Publié le: 2026-11-15
- Mise à jour: 2026-11-15T01:52:15.111881+00:00
- Langue: fr

## Contenu

# Importer un profil JSON dans un jeu d’essai local

Un profil JSON reçu d’un collègue ou produit par votre propre outil peut servir de contexte à un jeu d’essai. Avant de le transmettre à un modèle, vérifiez que le fichier est bien un objet JSON, que son contenu reste intact et que le cas qui l’utilise porte un identifiant explicite. Cet exemple montre une intégration locale en Python, sans API ni dépendance externe.

Le format d’enveloppe ci-dessous est créé pour ce guide. Ce n’est ni un schéma Harmate, ni une API d’import, ni un format de profil universel. Le profil est un exemple fictif écrit pour l’exercice :

```json
{
  "role": "fictional library assistant",
  "work_context": "helps visitors find public information",
  "preferences": [
    "asks one clarifying question when needed",
    "does not claim to reserve books"
  ]
}
```

## Encadrer les données sans les réécrire

L’importateur lit le fichier, refuse les objets vides ou les racines d’un autre type, puis place le profil sous une enveloppe de test. L’identifiant du cas permet de retrouver les entrées et sorties associées. Les clés et valeurs du profil sont conservées telles quelles : l’import n’infère aucune qualité et ne transforme pas les préférences en règles système.

Un parseur JSON standard accepte parfois des extensions ou écrase une clé répétée. Pour rendre l’entrée plus prévisible, le petit script de démonstration rejette les clés dupliquées, les constantes non conformes telles que `NaN`, le JSON mal formé et un identifiant vide. Il sérialise ensuite l’enveloppe avec les clés triées. Un second chargement vérifie que le profil obtenu égale l’objet d’origine.

Lancez cet exemple complet avec `python3 importer_fixture.py`, ou copiez-le dans un fichier Python. Les données sont incluses pour que l’exemple soit autonome :

```python
import json

PROFILE_JSON = '''{"role":"fictional library assistant","work_context":"helps visitors find public information","preferences":["asks one clarifying question when needed","does not claim to reserve books"]}'''

def unique_object(pairs):
    result = {}
    for key, value in pairs:
        if key in result:
            raise ValueError(f"duplicate key: {key}")
        result[key] = value
    return result

def reject_constant(value):
    raise ValueError(f"not standard JSON: {value}")

def import_profile(text, case_id):
    profile = json.loads(text, object_pairs_hook=unique_object,
                         parse_constant=reject_constant)
    if not isinstance(profile, dict) or not profile:
        raise ValueError("profile must be a non-empty object")
    if not isinstance(case_id, str) or not case_id.strip():
        raise ValueError("case_id must be non-empty")
    return {"fixture_format": "tutorial-local-fixture/v1",
            "case_id": case_id, "profile": profile}

def must_reject(text, case_id="library-search-01"):
    try:
        import_profile(text, case_id)
    except (json.JSONDecodeError, ValueError):
        return
    raise AssertionError("invalid input was accepted")

fixture = import_profile(PROFILE_JSON, "library-search-01")
encoded = json.dumps(fixture, ensure_ascii=False, sort_keys=True, indent=2)
decoded = json.loads(encoded)
assert decoded["profile"] == json.loads(PROFILE_JSON)
assert encoded == json.dumps(decoded, ensure_ascii=False, sort_keys=True, indent=2)
for bad in ("[]", "{}", '{"role":"a","role":"b"}',
            '{"role":NaN}', "{broken"):
    must_reject(bad)
must_reject(PROFILE_JSON, "  ")
print("PASS imported profile preserved")
print("PASS sorted serialization is deterministic")
print("PASS rejected six invalid inputs")
print("PASS no network, model, or API call")
```

Sortie attendue :

```text
PASS imported profile preserved
PASS sorted serialization is deterministic
PASS rejected six invalid inputs
PASS no network, model, or API call
```

Le code complet ci-dessus est celui qui a été exécuté pour cet exemple. Il valide uniquement la structure et la conservation; il n’évalue ni le profil ni un modèle.

## Garder l’import distinct de l’évaluation

La validation porte sur la structure et la conservation du fichier, pas sur l’exactitude métier du profil ni sur la qualité d’une réponse générée. Après cette étape, un test séparé peut associer un message d’entrée, des attentes vérifiables et une sortie à examiner. Enregistrez le profil, le cas et la réponse avec leurs versions pour savoir exactement ce qui a été rejoué.

Avant d’utiliser des données réelles, retirez les identifiants inutiles et appliquez les règles de stockage de votre équipe. Ne mettez pas de secrets dans le fixture. Un exemple local ne démontre ni qu’un format est pris en charge par un fournisseur, ni qu’un système est prêt pour la production. Il démontre seulement que votre propre importateur accepte les données prévues et rend visibles les entrées qu’il refuse. Pour un exemple de rejeu d’un cas, consultez [Construire un cas de régression pour un agent IA](https://www.harmate.com/fr/blog/construire-un-cas-de-r%C3%A9gression-pour-un-agent-ia).

Le [profil public de la banque](https://www.harmate.com/fr/pricing/api#personae-example-title) montre un exemple de données que l’on peut examiner. Le script ci-dessus utilise un profil fictif indépendant et son format propre.