# Modèles personnalisés Factory Droid : utiliser Claude et GPT avec votre clé API

> Ajouter Claude, GPT et d'autres modèles à Factory Droid avec customModels dans settings.json : quel provider choisir, une configuration testée et quatre erreurs.

- Canonical HTML: https://omniakey.com/fr/blog/factory-droid-custom-models
- Markdown: https://omniakey.com/fr/blog/factory-droid-custom-models.md
- Published: 2026-10-30 (updated 2026-10-30)
- Author: Kiki, COO at OmniaKey
- Language: fr
- Category: API setup
- Reading time: 9 min
- All posts: https://omniakey.com/blog/llms.txt

---

Ajoutez chaque modèle dans `customModels` du fichier `~/.factory/settings.json`, avec `model`, `baseUrl`, `apiKey` et `provider` : `anthropic` pour Claude avec l'hôte nu, `openai` pour GPT, `generic-chat-completion-api` pour tout le reste. Sur Droid 1.0.0, Claude Sonnet 5.5, GPT-6.1 Terra et MiniMax M3.1 Flash ont corrigé le même bug en 33,7, 77,4 et 30,7 secondes.

Les trois exécutions sont passées par OmniaKey avec une seule clé, ce qui nous a donné accès à [Claude Sonnet 5.5](https://omniakey.com/fr/claude-sonnet-5-5), [GPT-6.1 Terra](https://omniakey.com/fr/gpt-6-1-terra) et [MiniMax M3.1 Flash](https://omniakey.com/fr/minimax-m3-1-flash). Chacun a reçu la même fonction `median()` cassée et l'a réparée.

## Réponse courte

- **Où ça se passe.** `customModels` dans `~/.factory/settings.json` (doc des réglages de Factory, vérifiée le 30 octobre 2026), avec `model`, `baseUrl`, `apiKey` et `provider`.
- **Quel provider.** `anthropic` pour Claude, `openai` pour les modèles GPT, `generic-chat-completion-api` pour tout le reste qui parle Chat Completions.
- **Où va `/v1`.** `anthropic` prend l'hôte nu, parce que Droid ajoute `/v1/messages` ; `openai` et `generic-chat-completion-api` prennent une URL qui finit par `/v1`.
- **L'id pour `droid exec`.** `custom:`, le nom affiché avec des tirets à la place des espaces, puis la position à partir de 0 : `custom:Claude-Sonnet-5.5-[OmniaKey]-0`.
- **Ce que montrent nos exécutions.** Les trois ont corrigé le bug ; 30,7 s pour Flash, 33,7 s pour Claude, 77,4 s pour GPT-6.1 Terra.

## Quel provider choisir ?

Choisissez le provider d'après l'API que parle votre endpoint, pas d'après le nom du modèle.

- `anthropic` envoie des requêtes à l'Anthropic Messages API. À utiliser pour Claude ; l'URL de base d'Anthropic est `https://api.anthropic.com`.
- `openai` envoie des requêtes à l'OpenAI Responses API. À utiliser pour les modèles GPT ; l'URL de base d'OpenAI est `https://api.openai.com/v1`.
- `generic-chat-completion-api` envoie des requêtes OpenAI Chat Completions. À utiliser pour la plupart des autres modèles, gateways et serveurs locaux, avec l'URL `/v1` du fournisseur.

Factory recommande `generic-chat-completion-api` pour OpenRouter, Fireworks, Together AI, Ollama, vLLM et la plupart des fournisseurs open source, et conseille cette valeur tant que vous n'appelez pas l'API officielle d'OpenAI ou d'Anthropic (doc BYOK de Factory, vérifiée le 30 octobre 2026).

Une gateway qui parle aussi le Messages API ou le Responses API peut utiliser `anthropic` ou `openai`. Nos entrées Claude et GPT-6.1 Terra passaient par OmniaKey, et les deux ont tourné ; OmniaKey sert les modèles GPT sur `POST /v1/responses` (doc d'OmniaKey sur la compatibilité OpenAI, vérifiée le 30 octobre 2026).

Une quatrième valeur, `bedrock-converse`, concerne les modèles de l'API Converse d'AWS Bedrock. Factory prévient que seuls les modèles Anthropic et OpenAI sur leurs API officielles sont entièrement testés et benchmarkés, et que les modèles de moins de 30 milliards de paramètres font nettement moins bien sur le code agentique (doc BYOK de Factory, vérifiée le 30 octobre 2026).

## Le settings.json que nous utilisons

Droid crée `~/.factory/settings.json` au premier lancement : ajoutez `customModels` au fichier déjà présent (doc des réglages de Factory, vérifiée le 30 octobre 2026). Voici le nôtre :

```json
{
  "customModels": [
    {
      "model": "claude-sonnet-5-5",
      "displayName": "Claude Sonnet 5.5 [OmniaKey]",
      "baseUrl": "https://api.omniakey.com",
      "apiKey": "${OMNIAKEY_API_KEY}",
      "provider": "anthropic",
      "maxOutputTokens": 16000
    },
    {
      "model": "gpt-6.1-terra",
      "displayName": "GPT-6.1 Terra [OmniaKey]",
      "baseUrl": "https://api.omniakey.com/v1",
      "apiKey": "${OMNIAKEY_API_KEY}",
      "provider": "openai",
      "maxOutputTokens": 16000
    },
    {
      "model": "minimax-m3.1-flash",
      "displayName": "MiniMax M3.1 Flash [OmniaKey]",
      "baseUrl": "https://api.omniakey.com/v1",
      "apiKey": "${OMNIAKEY_API_KEY}",
      "provider": "generic-chat-completion-api",
      "maxOutputTokens": 16000
    }
  ]
}
```

- `model` est l'id envoyé à l'API ; copiez-le depuis la liste de modèles du fournisseur. `displayName` est votre libellé : il s'affiche dans `/model` et compose l'id `custom:`.
- `baseUrl` est l'hôte nu pour `anthropic`, et finit par `/v1` pour les deux autres.
- `apiKey: "${OMNIAKEY_API_KEY}"` lit la clé depuis une variable d'environnement, pour qu'elle reste hors du fichier (doc BYOK de Factory, vérifiée le 30 octobre 2026).
- `provider` choisit l'API ; une faute de frappe ici donne l'erreur « Invalid provider » plus bas.
- `maxOutputTokens: 16000` plafonne la longueur de chaque réponse.

Une clé et deux [URL de base](https://docs.omniakey.com/en/api/overview) couvrent les trois modèles : l'hôte nu d'OmniaKey pour Claude, son hôte `/v1` pour les deux autres. Si vous avez déjà suivi [l'installation d'OmniaKey pour les agents de code](https://docs.omniakey.com/en/coding), la même clé fonctionne ici.

Factory indique que les clés restent locales et ne sont pas envoyées aux serveurs de Factory (doc BYOK de Factory, vérifiée le 30 octobre 2026). Les anciens guides placent les modèles dans `~/.factory/config.json`. La doc BYOK de Factory dit toujours que Droid les copie dans `settings.json` au démarrage. Une pull request du dépôt GitHub de Factory (#76) indique qu'une modification de code fusionnée le 15 octobre 2026 a supprimé cette copie : placez donc les nouveaux modèles directement dans `settings.json`.

## Comment choisir un modèle personnalisé dans Droid ?

Dans l'application, ouvrez `/model` et regardez sous Custom Models ; en ligne de commande, passez un id `custom:` à `droid exec`.

La doc de Factory indique que les modèles enregistrés y apparaissent avec leur `displayName`, et que vous pouvez en ajouter depuis `/settings` > Custom models ou `/model` > Manage custom models (vérifiée le 30 octobre 2026).

L'id `droid exec` se compose de `custom:`, du nom affiché avec des tirets à la place des espaces, d'un tiret et de la position du modèle dans `customModels`, à partir de 0 (doc `droid exec` de Factory, vérifiée le 30 octobre 2026). Chez nous : `custom:Claude-Sonnet-5.5-[OmniaKey]-0`, `custom:GPT-6.1-Terra-[OmniaKey]-1` et `custom:MiniMax-M3.1-Flash-[OmniaKey]-2`.

L'index suit l'ordre du tableau : insérer un modèle au-dessus décale tous les ids en dessous. Recopiez l'id après avoir modifié le fichier.

`-r` / `--reasoning-effort` dans `droid exec` ne s'applique pas aux modèles personnalisés (doc `droid exec` de Factory, vérifiée le 30 octobre 2026). Réglez `reasoningEffort` dans l'entrée à la place.

## Trois modèles sur le même bug

Deux fichiers, une commande, une exécution par modèle. `stats.py` :

```python
def median(values):
    """Return the median of a non-empty list of numbers."""
    ordered = sorted(values)
    mid = len(ordered) // 2
    return ordered[mid]
```

`test_stats.py` :

```python
from stats import median

assert median([3, 1, 2]) == 2
assert median([4, 1, 3, 2]) == 2.5
assert median([5]) == 5
assert median([1.5, 2.5]) == 2.0
print("all tests passed")
```

La commande, où seule la valeur de `--model` change entre les exécutions :

```bash
droid exec --auto medium -o json --model "custom:Claude-Sonnet-5.5-[OmniaKey]-0" "python3 test_stats.py fails. Fix the bug in stats.py without changing the tests, run python3 test_stats.py again, and tell me in one sentence what you changed."
```

|Modèle|Durée|Tours|Tokens de sortie|
|-|-|-|-|
|Claude Sonnet 5.5|33,7 s|3|702|
|GPT-6.1 Terra|77,4 s|4|451|
|MiniMax M3.1 Flash|30,7 s|4|525|

Ce sont les chiffres de Droid lui-même (`duration_ms`, `num_turns`, `output_tokens`). Flash a fini le plus vite, en 30,7 s, Claude a utilisé le moins de tours, et GPT-6.1 Terra a pris le plus de temps, 77,4 s. Droid a signalé le premier token après 8,7 s pour Claude, 17,8 s pour Terra et 7,0 s pour Flash. Les trois ont corrigé le bug sans toucher à `test_stats.py`, et les tests ont affiché `all tests passed`.

La modification de Claude :

```diff
-    return ordered[mid]
+    if len(ordered) % 2:
+        return ordered[mid]
+    return (ordered[mid - 1] + ordered[mid]) / 2
```

GPT-6.1 Terra a ajouté la même branche au-dessus de l'ancienne ligne de retour, et MiniMax M3.1 Flash l'a écrite avec `% 2 == 1`. Les trois réponses décrivent cette correction : faire la moyenne des deux valeurs du milieu quand la liste a une longueur paire. Le [test de MiniMax M3.1 Flash](https://omniakey.com/fr/blog/minimax-m3-1-flash-review) détaille ce modèle.

Le résultat JSON de Droid affichait aussi `factory_credits` à chaque exécution, alors que nous n'étions jamais connectés : 31 534 pour Claude Sonnet 5.5, 4 830 pour GPT-6.1 Terra et 835 pour MiniMax M3.1 Flash. La doc de Factory n'explique pas ce que mesure ce nombre ni son lien avec l'enveloppe BYOK (vérifiée le 30 octobre 2026).

## Faut-il un compte ou un forfait Factory ?

Lors de nos exécutions, `droid exec` avec un modèle `custom:` n'a pas eu besoin de compte Factory. Les modèles propres à Factory et l'application interactive en demandaient un.

Droid CLI 1.0.0 est sorti le 29 octobre 2026 (changelog de Factory, vérifié le 30 octobre 2026). Dans un dossier personnel vierge, sans connexion Factory, chaque appel `droid exec` avec un modèle `custom:` a tourné sur notre propre clé. La même commande sans `--model` s'est arrêtée aussitôt sur « Authentication failed. Please log in using /login or set a valid FACTORY\_API\_KEY environment variable. » (« Échec de l'authentification. Connectez-vous avec /login ou définissez une variable d'environnement FACTORY\_API\_KEY valide. ») L'entrée de changelog de Factory v0.236.0 (8 octobre 2026) porte sur la reprise d'une session : « Droid exec now resumes a session on your own model credentials without a Factory sign-in. » (« Droid exec reprend désormais une session avec vos propres identifiants de modèle, sans connexion à Factory. »)

Lancer `droid` sans argument dans le même dossier s'est arrêté sur « Please login with your Factory account to continue. » (« Connectez-vous avec votre compte Factory pour continuer. »). Sans connexion, nous n'avons pas pu essayer les modèles personnalisés dans l'application interactive ou de bureau, et nous n'avons pas testé les images en entrée, Bedrock, `apiKeyHelper`, `reasoningEffort`, les réglages de raisonnement, Windows, les sessions de plus d'une tâche ni l'ancien fichier `config.json`.

Les forfaits Individual de Factory coûtent $20 (Pro), $100 (Plus) et $200 (Max) par mois ; la page tarifaire ajoute Teams à $60 par mois et par équipe plus $40 par siège, sans forfait individuel gratuit (doc tarifaire et page de prix de Factory, vérifiées le 30 octobre 2026).

La doc tarifaire des forfaits Individual dit : « BYOK is free up to an allowance on all Individual plans. After that, usage is charged according to your specific plan. » (« BYOK est gratuit jusqu'à une enveloppe sur tous les forfaits Individual. Au-delà, l'usage est facturé selon votre forfait. ») Factory ne dit pas quelle est la taille de cette enveloppe ni à quoi ressemble la facturation ensuite.

Les modèles personnalisés personnels fonctionnent dans la CLI et dans l'application de bureau, et n'apparaissent pas dans les applications web et mobiles hébergées de Factory (doc BYOK de Factory, vérifiée le 30 octobre 2026).

## Quelles erreurs allez-vous rencontrer, et que faire ?

Chacune venait d'une seule valeur erronée dans une installation qui marchait par ailleurs, sur Droid 1.0.0.

1. `anthropic` avec `/v1` dans l'URL de base. Droid a affiché « Requested model was not found on the API provider » (« Le modèle demandé n'a pas été trouvé chez le fournisseur d'API ») au bout de 0,9 s, et son journal montrait `404` sur `Invalid URL (POST /v1/v1/messages)`. Droid ajoute `/v1/messages` lui-même, notre `/v1` le doublait. Correction : l'hôte nu, `https://api.anthropic.com` ou `https://api.omniakey.com`.

2. `openai` avec l'hôte nu. Droid a affiché `404` et une page nginx « 404 Not Found » au bout de 1,4 s ; la Responses API se trouve sous `/v1`. Correction : `https://api.openai.com/v1` ou `https://api.omniakey.com/v1`.

3. Un id de modèle avec des points, `claude-sonnet-5.5`, au lieu de `claude-sonnet-5-5`. L'endpoint a répondu `503` avec le code `model_not_found` et le message « No available channel for model claude-sonnet-5.5 » (« Aucun canal disponible pour le modèle claude-sonnet-5.5 »). Le journal de Droid étiquetait chaque échec « overloaded » et a fait 10 tentatives en 259,7 secondes (environ 4 minutes 20) avant de sortir avec ce message. La formulation vient de la gateway ; les tentatives répétées viennent de Droid. Correction : copier l'id exact depuis la liste de modèles de votre fournisseur.

4. `OMNIAKEY_API_KEY` vide dans le shell qui a lancé Droid. Droid a reçu `401` avec « Invalid token » (« Jeton invalide ») au bout de 2,8 s. Correction : exportez la clé dans le shell d'où vous lancez `droid`, puis démarrez une nouvelle session.

La liste de dépannage de Factory en ajoute deux. « Invalid provider » signifie que la valeur est mal orthographiée ou capitalisée autrement, et doit être exactement `anthropic`, `openai`, `generic-chat-completion-api` ou `bedrock-converse`. Si un modèle manque dans le sélecteur, la doc conseille de vérifier la syntaxe JSON dans `~/.factory/settings.json` et que chaque entrée a bien ses champs obligatoires (vérifiée le 30 octobre 2026).

## FAQ

### Où se trouve le fichier de réglages de Droid sous Windows ?

`%USERPROFILE%\.factory\settings.json`, le même fichier que `~/.factory/settings.json` sous macOS et Linux (doc des réglages de Factory, vérifiée le 30 octobre 2026). Mettez `customModels` à cet endroit.

### Pourquoi mon modèle personnalisé n'apparaît-il pas dans `/model` ?

Vérifiez d'abord la syntaxe JSON dans `~/.factory/settings.json`, puis les champs `model`, `baseUrl` et `provider`. Droid détecte les modifications enregistrées par surveillance de fichier (doc BYOK de Factory, vérifiée le 30 octobre 2026). D'après un rapport sur Desktop 0.184.0 avec CLI 0.227.0, les modèles personnalisés apparaissaient brièvement dans le sélecteur de bureau puis disparaissaient, alors que `droid exec --help` en listait toujours 14 ; cette issue est désormais fermée (Factory-AI issue #40, vérifiée le 30 octobre 2026).

### Les modèles personnalisés peuvent-ils lire des images ?

Les images sont activées par défaut pour `anthropic` et `openai`, et désactivées pour `generic-chat-completion-api`, où `noImageSupport` vaut `true` (doc BYOK de Factory, vérifiée le 30 octobre 2026). Mettez `noImageSupport: false` sur une entrée générique pour les autoriser. Selon un signalement, les images étaient quand même supprimées avec la CLI v0.205.1 et cette valeur définie (Factory-AI issue #24, vérifiée le 30 octobre 2026).

### Peut-on régler l'effort de raisonnement d'un modèle personnalisé ?

`-r` / `--reasoning-effort` dans `droid exec` ne s'applique pas aux modèles personnalisés. Réglez plutôt `reasoningEffort` dans l'entrée : la valeur fixe l'effort par défaut d'un modèle que Droid ne reconnaît pas et ajoute off, low, medium et high au sélecteur (doc BYOK de Factory, vérifiée le 30 octobre 2026).

### Les modèles personnalisés fonctionnent-ils dans l'application de bureau Droid ?

Oui : les modèles personnalisés personnels sont disponibles dans la CLI et dans l'application de bureau, et restent absents des applications web et mobiles hébergées. Les éditeurs de modèles de la CLI et de l'application de bureau enregistrent tous les deux dans `~/.factory/settings.json` (doc BYOK de Factory, vérifiée le 30 octobre 2026).

## Sources vérifiées

- [Doc BYOK de Factory](https://docs.factory.com/model-independence/byok.md), vérifiée le 30 octobre 2026
- [Doc des réglages de Factory](https://docs.factory.com/droid-cli/settings.md), vérifiée le 30 octobre 2026
- [Doc droid exec de Factory](https://docs.factory.com/droid-exec/overview.md), vérifiée le 30 octobre 2026
- [Notes de version de Factory](https://docs.factory.com/changelog/release-notes.md), vérifiées le 30 octobre 2026
- [Forfaits Individual de Factory](https://docs.factory.com/pricing/individuals.md), vérifiés le 30 octobre 2026
- [Tarifs Factory](https://factory.com/pricing), vérifiés le 30 octobre 2026
- [Factory-AI issue #40 : les modèles personnalisés disparaissent du sélecteur de bureau](https://github.com/Factory-AI/factory/issues/40), vérifiée le 30 octobre 2026
- [Factory-AI issue #24 : images supprimées](https://github.com/Factory-AI/factory/issues/24), vérifiée le 30 octobre 2026
- [Factory-AI pull request #76 : migration de config.json](https://github.com/Factory-AI/factory/pull/76), vérifiée le 30 octobre 2026

La documentation d'OmniaKey, vérifiée le 30 octobre 2026 : [présentation de l'API](https://docs.omniakey.com/en/api/overview) et [API compatible OpenAI](https://docs.omniakey.com/en/api/openai-compatible).
