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.
Des transformations configurables, déclenchées automatiquement depuis Grist.
Remplace noms, adresses, e-mails et données sensibles par des pseudonymes neutres pour objectiver les décisions en commission.
Condense les textes longs en trois points clés au format Markdown, directement dans la colonne Processed.
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.
Le widget lit le prompt dans la table Config (colonnes Param / Value) avec le paramètre GRIST_AI_TRANSFORMER_PROMPT.
Les clés API et URL internes ne transitent jamais par le frontend ; elles sont stockées dans config/params.json sur le serveur.
Fonctionne avec n'importe quel endpoint compatible OpenAI Responses API — modèle interne ou cloud.
Cinq composants qui collaborent de bout en bout.
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.
Sert le frontend en HTTPS et fait office de reverse-proxy vers localhost:8000 pour toutes les routes /api/*, sans exposer l'API directement.
main.py)Reçoit text et prompt depuis le widget, puis appelle le LLM via httpx.
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.
Quatre étapes pour démarrer depuis zéro.
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
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
}
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
}
}
Dans votre document Grist :
https://votre-plugin.entreprise.com/grist-plugin/index.htmlProcessed).Source et Processed dans les options du widget.Config avec les colonnes Param et Value.Param = GRIST_AI_TRANSFORMER_PROMPT avec le prompt complet dans Value.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 :
| Colonne | Type | Rôle |
|---|---|---|
Source | Texte / Markdown | Texte d'entrée à transformer |
Processed | Texte / Markdown | Résultat écrit par le widget |
Bonnes pratiques recommandées pour un déploiement en production.