Plugin Grist · FastAPI · IA

Transformez vos textes dans Grist
avec l'IA en un clic

Grist AI Transformer est un widget Custom Grist connecté à une API FastAPI. Le prompt est lu depuis une table Config du document Grist, puis appliqué automatiquement aux données texte.

Installer Voir l'architecture

Fonctionnalités

Des transformations configurables, déclenchées automatiquement depuis Grist.

🕵️

Anonymisation

Remplace noms, adresses, e-mails et données sensibles par des pseudonymes neutres pour objectiver les décisions en commission.

📝

Résumé automatique

Condense les textes longs en trois points clés au format Markdown, directement dans la colonne Processed.

Déclenchement réactif

Le widget surveille la colonne Source via grist.onRecord et n'appelle l'API que lorsqu'une valeur est présente et non encore traitée.

🔌

Prompt piloté par table Grist

Le widget lit le prompt dans la table Config (colonnes Param / Value) avec le paramètre GRIST_AI_TRANSFORMER_PROMPT.

🔒

Clés cachées côté serveur

Les clés API et URL internes ne transitent jamais par le frontend ; elles sont stockées dans config/params.json sur le serveur.

🔄

Compatible OpenAI / Llama

Fonctionne avec n'importe quel endpoint compatible OpenAI Responses API — modèle interne ou cloud.


Architecture

Cinq composants qui collaborent de bout en bout.

📊
Grist
Custom Widget
🔀
Caddy
HTTPS + Proxy
⚙️
FastAPI
Backend Python
🤖
LLM
Llama / OpenAI
Grist
Colonne Processed

1 · Grist (widget)

Le fichier grist-plugin/index.html s'abonne aux changements de ligne via grist.onRecord. Quand Source est rempli et Processed est vide, il envoie une requête POST /api/process.

2 · Caddy

Sert le frontend en HTTPS et fait office de reverse-proxy vers localhost:8000 pour toutes les routes /api/*, sans exposer l'API directement.

3 · FastAPI (main.py)

Reçoit text et prompt depuis le widget, puis appelle le LLM via httpx.

4 · LLM

N'importe quel modèle exposant l'API POST /responses compatible OpenAI. La clé, l'URL et le nom du modèle sont dans config/params.json.


Installation

Quatre étapes pour démarrer depuis zéro.

1

Backend Python (FastAPI)

Installez les dépendances puis démarrez le serveur :

pip install fastapi uvicorn httpx python-multipart
uvicorn main:app --host 127.0.0.1 --port 8000
2

Paramètres (config/params.json)

Créez ce fichier avec vos identifiants IA (jamais versionnés) :

{
  "ai_api_url": "https://api.openai.com/v1/responses",
  "ai_api_model": "gpt-5.4",
  "ai_api_key": "sk-proj-...",
  "temperature": 0.2
}
3

Proxy Caddy

Ajoutez ce bloc à votre Caddyfile pour servir le frontend et proxifier l'API :

votre-plugin.entreprise.com {
    root * ./frontend
    file_server
    handle_path /api/* {
        reverse_proxy localhost:8000
    }
}
4

Widget dans Grist

Dans votre document Grist :

  1. Ajoutez un widget Custom à votre table.
  2. URL : https://votre-plugin.entreprise.com/grist-plugin/index.html
  3. Access Level : Full Access (nécessaire pour écrire dans Processed).
  4. Mappez les colonnes Source et Processed dans les options du widget.
  5. Créez une table Config avec les colonnes Param et Value.
  6. Ajoutez la ligne Param = GRIST_AI_TRANSFORMER_PROMPT avec le prompt complet dans Value.

Configuration des transformations

Le prompt est défini dans la table Config du document Grist.

Table: Config
Colonnes:
  - Param
  - Value

Ligne requise:
  Param = GRIST_AI_TRANSFORMER_PROMPT
  Value = <votre prompt complet>

Le prompt est appliqué au niveau du module (widget) pour toutes les lignes traitées.

Colonnes Grist requises :

ColonneTypeRôle
SourceTexte / MarkdownTexte d'entrée à transformer
ProcessedTexte / MarkdownRésultat écrit par le widget

Sécurité

Bonnes pratiques recommandées pour un déploiement en production.

🔑
Clés hors du dépôt : ajoutez config/params.json à .gitignore. Ne versionnez jamais votre clé API ni l'URL interne du LLM.
🌐
Filtrage IP : utilisez la directive forward_auth ou un @internal matcher Caddy pour restreindre l'accès au widget aux seuls utilisateurs autorisés.
🛡️
HTTPS obligatoire : Caddy gère automatiquement TLS via Let's Encrypt. N'exposez jamais le backend FastAPI directement sur Internet.
Access Level Grist : le widget demande Full Access uniquement pour écrire dans la colonne Processed. Vérifiez que personne d'autre n'a accès à la table si les données sont sensibles.