# Cordialement.ai — Déploiement sur VPS PHP

Ce dossier est **prêt à déployer** sur n'importe quel hébergement PHP standard
(VPS, mutualisé, Docker…). L'interface est statique ; les scripts PHP servent de
pont vers le fournisseur d'IA de votre choix et **détiennent tout le savoir-faire
(prompts) côté serveur** — rien de sensible n'est exposé dans le navigateur.

```
cordialement-vps/
├── index.html          ← l'application (interface "muette" : aucun prompt)
├── support.js          ← moteur de rendu de l'interface
├── llm.config.js       ← pont front → backend (n'envoie que { action, texte })
└── api/
    ├── llm.php         ← routeur IA multi-fournisseurs
    ├── prompts.php     ← LE SECRET : tous les prompts + bandes d'intensité
    ├── config.php      ← VOTRE configuration : fournisseur, clés, modèles
    └── .htaccess       ← bloque l'accès direct à config.php et prompts.php
```

> **Confidentialité du savoir-faire.** Depuis cette version, les prompts ne sont
> plus dans le code de la page (donc plus visibles via « Afficher le code
> source »). Ils vivent dans `api/prompts.php`, côté serveur. Le navigateur
> n'envoie qu'une action (`cordialiser` / `decode` / `reply`), le texte et
> l'intensité ; le serveur fait tout le reste.

---

## 1. Pré-requis (déjà présents sur 99 % des VPS)

- **PHP 7.4 ou plus récent**
- L'extension **cURL** activée (`php -m | grep curl` doit afficher `curl`)

Aucune base de données, aucun framework, aucune dépendance à installer.

---

## 2. Installation en 4 étapes

1. **Copiez** tout le contenu de ce dossier dans la racine web de votre site
   (ex. `/var/www/cordialement/`).

2. **Choisissez votre fournisseur d'IA** dans `api/config.php`, ligne
   `'provider'` :

   ```php
   'provider' => 'gemini',   // 'gemini' | 'anthropic' | 'deepseek' | 'openai'
   ```

3. **Renseignez la clé API** correspondante. Deux options :

   - **Recommandé — variable d'environnement** (la clé ne traîne pas dans un
     fichier). Par exemple avec Apache, ajoutez dans le vhost ou un `.htaccess`
     serveur :

     ```apache
     SetEnv GEMINI_API_KEY "votre-cle-ici"
     ```

     ou en ligne de commande / service systemd :

     ```bash
     export GEMINI_API_KEY="votre-cle-ici"
     ```

   - **Plus simple — en dur** : dans `api/config.php`, remplacez le `''` après
     le `?:` par votre clé :

     ```php
     'gemini' => getenv('GEMINI_API_KEY') ?: 'votre-cle-ici',
     ```

4. **Ouvrez votre site** dans un navigateur. C'est tout — tapez un message,
   cliquez « Cordialiser ». 🎉

---

## 3. Changer de fournisseur ou de modèle

Tout se passe dans **`api/config.php`**, vous ne touchez jamais à l'interface.

- **Changer de fournisseur** : modifiez la ligne `'provider'`.
- **Changer de modèle** : modifiez la valeur correspondante dans `'models'`.

> **Et pour modifier les PROMPTS / le ton de l'app ?** Tout est dans
> **`api/prompts.php`** (les 3 prompts cordialiser / decode / reply, les bandes
> d'intensité, et les réglages température/longueur par action). C'est le seul
> fichier à éditer pour affiner le comportement de l'IA — plus jamais le HTML.

### Modèles préconfigurés (recommandés pour cette app)

Cette tâche — reformuler un message en français — n'a **pas besoin** d'un modèle
coûteux. Les modèles ci-dessous offrent le meilleur rapport qualité/prix :

| Fournisseur | Modèle par défaut       | Profil                                          |
|-------------|-------------------------|-------------------------------------------------|
| `gemini`    | `gemini-2.0-flash`      | ⚡ Le moins cher, rapide, très bon en français — **défaut conseillé** |
| `anthropic` | `claude-3-5-haiku-latest` | 🎯 Le plus fin sur le ton et l'humour          |
| `deepseek`  | `deepseek-chat`         | 💸 Le moins cher absolu (qualité « classe GPT-4 ») |
| `openai`    | `gpt-4o-mini`           | ✅ La valeur sûre, outillage le plus mûr        |

> **Conseil** : démarrez sur **Gemini Flash**. Si le ton des reformulations vous
> semble trop fade, testez **Claude Haiku** — c'est généralement le plus
> savoureux pour l'humour pince-sans-rire. La différence de coût entre les
> quatre est négligeable à l'échelle de cette app.

Pour un modèle plus récent/puissant, mettez simplement son identifiant exact
(vérifié dans la doc du fournisseur) dans `'models'`.

---

## 4. Où obtenir les clés API

| Fournisseur | Console                              |
|-------------|--------------------------------------|
| Gemini      | https://aistudio.google.com/apikey   |
| Anthropic   | https://console.anthropic.com/       |
| DeepSeek    | https://platform.deepseek.com/       |
| OpenAI      | https://platform.openai.com/api-keys |

---

## 5. Sécurité — points importants

- **La clé API reste sur le serveur.** Elle n'est jamais envoyée au navigateur :
  le front parle uniquement à `api/llm.php`, qui parle au fournisseur. C'est la
  bonne pratique — ne mettez jamais de clé dans `llm.config.js`.
- **Les prompts restent sur le serveur.** Ils vivent dans `api/prompts.php` et
  ne sont jamais envoyés au navigateur : « Afficher le code source » de la page
  ne révèle plus rien de votre savoir-faire. Le front n'émet qu'une action
  (`cordialiser` / `decode` / `reply`), le texte et l'intensité.
- **`config.php` et `prompts.php` sont protégés** par le `.htaccess` fourni
  (accès direct bloqué). Si vous n'utilisez pas Apache (ex. Nginx), interdisez
  l'accès direct à ces deux fichiers dans votre config serveur, ou placez-les
  hors de la racine web et ajustez les `require` dans `llm.php`. (Par sécurité,
  `prompts.php` refuse de toute façon de s'exécuter s'il est appelé directement.)
- Le backend **ignore volontairement** tout réglage qui viendrait du navigateur
  (fournisseur, modèle, température…) : il n'utilise que ce qui est défini dans
  `config.php` et `prompts.php`. Impossible pour un visiteur d'utiliser vos clés
  avec un autre modèle ou de gonfler la longueur des réponses.

---

## 6. Dictée vocale (micro)

La saisie vocale utilise la reconnaissance vocale du navigateur. Elle ne
fonctionne **que sur une origine sécurisée** : pensez à servir le site en
**HTTPS** (un certificat Let's Encrypt gratuit suffit). En HTTP simple, le micro
sera désactivé mais le reste de l'app fonctionne normalement.

---

## 7. Vérifier la config avant de lancer (page de test)

Le dossier inclut une page de diagnostic au nom volontairement aléatoire :
**`api/test-7390482156.php`**.

Ouvrez-la dans votre navigateur (ex. `https://votre-site/api/test-7390482156.php`).
Elle vérifie d'un coup d'œil :

- que cURL est bien disponible ;
- que le fournisseur et la clé API sont correctement configurés ;
- puis elle fait **un vrai appel** au modèle et affiche sa réponse (ou l'erreur exacte).

Si tout est vert, votre app est opérationnelle. **Supprimez ensuite ce fichier** :
il ne sert qu'au diagnostic, et le suffixe aléatoire n'est pas une vraie
protection.

---

## 8. Dépannage

| Symptôme                                   | Cause probable / solution                                            |
|--------------------------------------------|----------------------------------------------------------------------|
| « la diplomatie a buggé »                  | Le backend a renvoyé une erreur — voir le message exact (voir ci-dessous). |
| Erreur « Clé API absente »                 | La clé n'est pas renseignée pour le fournisseur actif dans `config.php`. |
| Erreur « Connexion au fournisseur impossible » | Le serveur n'a pas accès à Internet, ou cURL est désactivé.        |
| Réponse « HTTP 401 / 403 »                 | Clé API invalide ou expirée.                                         |
| Réponse « HTTP 429 »                       | Quota dépassé chez le fournisseur.                                   |
| Le nom de modèle est refusé (404)          | L'identifiant du modèle a changé — mettez le nom exact à jour.       |

Pour voir l'erreur exacte renvoyée par le backend, ouvrez la console du
navigateur (F12 → onglet Réseau → la requête `llm.php`), ou consultez les logs
PHP de votre serveur.
