# Configuration Affine AI (OpenAI Override)

#### 1. Contexte et Problématique

Par défaut, les versions self-hosted d'Affine (v0.18+) sont configurées pour utiliser des modèles Google Gemini spécifiques. L'objectif est de forcer l'utilisation d'OpenAI (GPT-4o) pour tous les scénarios IA en contournant les limitations hardcodées du backend.

#### 2. Configuration Infrastructure (Docker Compose)

<span style="white-space: pre-wrap;">La variable d'environnement </span>`<span class="editor-theme-code">selfhosted=true</span>`<span style="white-space: pre-wrap;"> est </span>**obligatoire**<span style="white-space: pre-wrap;"> pour débloquer le menu d'administration IA et autoriser les API tiers.</span>

##### <span style="white-space: pre-wrap;">Modification du fichier </span>`<span class="editor-theme-code">docker-compose.yml</span>`

<span style="white-space: pre-wrap;">Modifier le service </span>`<span class="editor-theme-code">affine</span>`<span style="white-space: pre-wrap;"> pour ajouter les variables et fixer le montage du fichier de configuration dans un répertoire neutre (</span>`<span class="editor-theme-code">/opt</span>`<span style="white-space: pre-wrap;">) pour éviter les problèmes de permissions </span>`<span class="editor-theme-code">root</span>`<span style="white-space: pre-wrap;"> vs </span>`<span class="editor-theme-code">node</span>`.

```yaml
services:
  affine:
    image: ghcr.io/toeverything/affine:stable
    environment:
      # ... variables existantes (DB, Redis) ...
      - AFFINE_COPILOT_ENABLED=true
      
      # CRITIQUE : Active le support des API tiers et l'interface Admin AI
      - selfhosted=true
      
      # Force le chemin de configuration (évite les erreurs de dossier home)
      - AFFINE_CONFIG_PATH=/opt/affine_config.json
      
    volumes:
      - ${UPLOAD_LOCATION}:/root/.affine/self-host/storage
      # Montage dans /opt pour contourner les restrictions de permissions /root
      - ${CONFIG_LOCATION}:/opt/affine_config.json
```

<p class="callout info">**Note : Assurez-vous que* `<em class="editor-theme-code editor-theme-italic">${CONFIG_LOCATION}</em>` *dans le fichier* `<em class="editor-theme-code editor-theme-italic">.env</em>` *pointe bien vers votre fichier json sur l'hôte.**</p>

#### 3. Configuration Initiale (Fichier JSON)

Ce fichier sert uniquement à déclarer le fournisseur. La configuration fine des modèles se fera via l'interface web.

**Fichier sur l'hôte :**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">config.json</span>`

```json
{
  "copilot": {
    "enabled": true,
    "providers": {
      "openai": {
        "apiKey": "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
      }
    },
    "embedding": {
      "provider": "openai",
      "model": "text-embedding-3-small",
      "apiKey": "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
  }
}
```

<p class="callout info">**Note : Laisser les permissions du fichier à* `<em class="editor-theme-code editor-theme-italic">644</em>` *pour qu'il soit lisible par le conteneur.**</p>

#### 4. Configuration Finale (Interface Web Admin)

C'est la méthode recommandée ("Plan B") pour assurer la persistance et mapper correctement les modèles internes d'Affine vers OpenAI.

1. Se connecter à l'instance Affine.
2. <span style="white-space: pre-wrap;">Accéder à l'URL : </span>`<span class="editor-theme-code">https://votre-domaine-affine.com/admin</span>`<span style="white-space: pre-wrap;"> (ou via le menu </span>**Settings &gt; Admin Panel**).
3. <span style="white-space: pre-wrap;">Aller dans l'onglet </span>**AI**<span style="white-space: pre-wrap;"> (ou Intelligence).</span>
4. <span style="white-space: pre-wrap;">Activer l'option </span>**Enable Copilot**.

#### Mapping des Scénarios (Surcharge)

<span style="white-space: pre-wrap;">Dans la section de configuration des scénarios (Custom Models), coller le JSON suivant. </span>**Important :**<span style="white-space: pre-wrap;"> Cette configuration redirige toutes les requêtes internes (qui demandent par défaut </span>`<span class="editor-theme-code">gemini-2.5-flash</span>`<span style="white-space: pre-wrap;">) vers </span>`<span class="editor-theme-code">gpt-4o</span>`.

```json
{
  "scenarios": {
    "chat": "gpt-4o",
    "chat_stream": "gpt-4o",
    "writing": "gpt-4o",
    "translation": "gpt-4o",
    "summary": "gpt-4o",
    "brainstorm": "gpt-4o",
    "coding": "gpt-4o",
    "check_grammar": "gpt-4o",
    "quick_decision_making": "gpt-4o",
    "quick_text_generation": "gpt-4o",
    "complex_text_generation": "gpt-4o",
    "polish_and_summarize": "gpt-4o",
    "audio_transcribing": "whisper-1",
    "image": "dall-e-3"
  },
  "override_enabled": true
}
```

#### Vérification OpenAI Provider

<span style="white-space: pre-wrap;">Juste en dessous, dans la section </span>**OpenAI Provider**, vérifier que la clé API est bien détectée (masquée). Si nécessaire, forcer la configuration :

```json
{
  "apiKey": "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
```

#### 5. Dépannage Rapide

Si l'IA ne répond pas (Erreur 500 ou "No provider available") :

1. <span style="white-space: pre-wrap;">Vérifier les logs : </span>`<span class="editor-theme-code">docker compose logs -f affine</span>`
2. <span style="white-space: pre-wrap;">Si erreur </span>`<span class="editor-theme-code">ZodError</span>`<span style="white-space: pre-wrap;"> : Le fichier JSON est mal formé ou le modèle retourné par l'API n'est pas une liste valide.</span>
3. <span style="white-space: pre-wrap;">Si erreur </span>`<span class="editor-theme-code">Permission denied</span>`<span style="white-space: pre-wrap;"> : Vérifier que le montage Docker n'est pas dans </span>`<span class="editor-theme-code">/root</span>`<span style="white-space: pre-wrap;"> côté conteneur.</span>
4. <span style="white-space: pre-wrap;">Si les menus Admin sont invisibles : Vérifier que </span>`<span class="editor-theme-code">selfhosted=true</span>`<span style="white-space: pre-wrap;"> est bien chargé dans les variables d'environnement.</span>