Toutes les pages
Sur cette page

Partager une conversation

Le partage donne à une conversation un lien public en lecture seule. Toute personne à qui vous l’envoyez peut lire le fil de la conversation dans son navigateur sans se connecter, et suit la conversation à mesure qu’elle avance. Elle ne peut rien envoyer, arrêter, modifier ni ouvrir d’autre sur votre relais. Vous décidez de ce que montre le lien : certains messages peuvent être masqués, et les chemins de l’hôte du relais sont filtrés. Vous voyez toujours vous-même la conversation complète, et Settings → Sharing (Réglages → Partage) liste tous les liens avec un journal de qui les a ouverts.

Le lien est public

Toute personne qui a l’adresse peut lire le fil partagé, et il peut être transmis. Le relais ne demande pas qui l’ouvre. Traitez-le comme un mot de passe pour cette seule conversation, et relisez la conversation avec Preview as shared (Aperçu tel que partagé) avant de l’envoyer.

Créer le lien #

  1. Ouvrez la conversation.
  2. Ouvrez son menu ⋯ et choisissez ➡️ Share conversation (Partager la conversation).

Il n’y a pas de boîte de dialogue. Le relais crée le lien et le copie dans votre presse-papiers, et un court avis l’indique :

Share link copied to clipboard.

Si le navigateur ne laisse pas la page écrire dans le presse-papiers, l’avis affiche l’adresse elle-même à la place, et vous la copiez depuis là.

L’adresse ressemble à https://relay.example.com/shared/ suivi d’un long token aléatoire (64 caractères hexadécimaux). L’hôte est celui que vous avez utilisé pour joindre le relais ; derrière un proxy sur une autre machine, c’est celui que le proxy transmet, une fois que le relais fait confiance à ce proxy. Si le relais est servi sous un sous-chemin (remotePath dans config.json), le sous-chemin fait partie de l’adresse.

Choisir à nouveau ➡️ Share conversation ne crée pas de second lien : tant que la conversation a un lien actif, vous récupérez la même adresse. Toute conversation peut être partagée, une conversation archivée aussi.

Vos liens partagés Ajouté en 0.9.11 #

Settings → Sharing liste toutes les conversations qui ont un lien en ce moment, avec la date du partage (et du renouvellement), la date de la dernière ouverture, le nombre d’ouvertures et le nombre de lecteurs. Un clic sur le titre ouvre la conversation. Chaque ligne a :

Bouton Ce qu’il fait
Copy link (Copier le lien) Copie le lien.
Renew link (Renouveler le lien) Donne un nouveau lien à la conversation, après confirmation, et le copie. L’ancien lien cesse aussitôt de fonctionner. Le journal d’accès passe au nouveau lien. Utilisez-le quand un lien est allé plus loin qu’il n’aurait dû.
Stop sharing (Arrêter le partage) Met fin au lien, après confirmation. Il cesse aussitôt de fonctionner, y compris pour quelqu’un qui est en train de lire, et son journal d’accès est supprimé.
Access log (Journal d’accès) Déplie le journal d’accès du lien.

Tant que la conversation ouverte est partagée, son menu ⋯ propose aussi ⛔ Stop sharing, qui demande confirmation lui aussi.

Après un arrêt ou un renouvellement #

Un lien arrêté ou renouvelé répond un simple 404, pour la page comme pour les données, exactement comme un lien qui n’a jamais existé. Une page partagée encore ouverte sur ce lien s’arrête à son actualisation suivante, en environ une seconde. Choisir à nouveau ➡️ Share conversation après un arrêt crée un nouveau lien avec un nouveau token ; une ancienne adresse ne revient jamais.

La même chose fonctionne sans l’app, avec le token d’auth (Accès et connexion) dans un en-tête, par exemple pour arrêter le partage depuis un script :

curl -X DELETE -H "Authorization: Bearer YOUR_TOKEN" \
  https://relay.example.com/api/conversation/CONVERSATION_ID/share

POST sur la même adresse crée le lien, POST …/share/renew le renouvelle, et GET /api/shares les liste.

Le journal d’accès #

Chaque ligne de la liste se déplie en son journal d’accès, du plus récent au plus ancien. Une entrée correspond à une ouverture de la page partagée, pas à chaque actualisation : la page recharge la conversation environ toutes les secondes, et seul le premier chargement compte. Un second chargement par le même lecteur dans les 10 secondes ne compte qu’une fois. Un lecteur qui revient après 30 minutes sans lire compte de nouveau, par exemple une page endormie dans un onglet en arrière-plan. Un script qui lit le lien sans la page compte de la même façon : personne ne lit donc le lien sans laisser d’entrée.

Partie d’une entrée D’où elle vient
Heure Le moment où la page a été ouverte.
Adresse IP L’adresse du lecteur, telle que le relais la voit. Derrière un proxy, c’est l’adresse que le proxy transmet, si le relais lui fait confiance ; sinon tous les lecteurs ont l’adresse du proxy. IP not stored (IP non enregistrée) quand Store viewer IP addresses (Enregistrer les adresses IP des lecteurs) était désactivé.
Pays Le code de pays qu’ajoute un tunnel Cloudflare, repris uniquement d’un proxy de confiance. Vide sinon.
viewer … Un court hachage à clé de l’adresse et du navigateur, le même pour chaque ouverture par le même lecteur, même quand l’adresse n’est pas enregistrée.
Navigateur Le user agent envoyé par le navigateur du lecteur, sous forme de texte.

La liste affiche les 200 ouvertures les plus récentes et indique leur nombre total.

Le journal passe au nouveau lien quand vous renouvelez le lien. Il est conservé tant que le lien est partagé, et supprimé quand vous arrêtez le partage ou supprimez la conversation.

Store viewer IP addresses sous Access log (activé par défaut) décide si les nouvelles entrées conservent l’adresse. Désactivé, les nouvelles entrées n’en conservent aucune, pas plus que la ligne du journal du relais pour une lecture partagée. Si des adresses sont déjà enregistrées, OAR demande s’il faut les supprimer aussi : Remove them (Les supprimer) les efface de toutes les entrées du journal d’accès et du journal d’état des lectures partagées, les entrées elles-mêmes restent ; Keep them (Les garder) les laisse. Le réglage s’applique à tous les liens du relais.

Chemins et noms de fichiers Ajouté en 0.9.11 #

Une vue partagée ne transporte pas les chemins complets de l’hôte du relais. Le relais filtre tout ce qu’il sert à un lien, selon le réglage Paths and file names (Chemins et noms de fichiers) dans Settings → Sharing :

Option Ce qu’un lecteur voit pour /srv/projects/shop/src/cart.js
Show every path and file name (Afficher tous les chemins et noms de fichiers) le chemin tel quel
Hide the path, show the file name (Masquer le chemin, afficher le nom du fichier) (valeur par défaut) cart.js
Hide paths and file names (Masquer les chemins et noms de fichiers) ‹hidden›

Le réglage s’applique à tous les liens du relais, à partir de l’actualisation suivante d’une page partagée. Votre propre vue affiche toujours tout.

Ce que le filtre attrape :

  • Toujours : les chemins dans les arguments d’outils, les mentions de fichiers (@file:, @folder:, relatives aussi), les noms de pièces jointes, les enregistrements des subagents et les en-têtes de fichiers des diffs.
  • Dans le texte libre, c’est-à-dire les réponses, le raisonnement, la sortie des outils et les blocs de code : les dossiers que le relais connaît (le dossier de travail de la conversation, les racines du workspace, votre dossier personnel, les dossiers de données et de fichiers envoyés du relais) avec ce qui les suit, les chemins absolus Windows et Unix, les chemins ~/…, et votre nom d’utilisateur entre séparateurs. Il s’agit d’un filtrage au mieux.
  • Non attrapé : les chemins relatifs dans le texte libre (src/cart.js), les chemins à un seul niveau comme /tmp, les adresses web, et tout ce qui se trouve dans une image.

Preview as shared (Aperçu tel que partagé) #

🔍 Preview as shared dans le menu ⋯ de la conversation ouvre la conversation telle que son lien la montre, sans créer de lien et sans entrée dans aucun journal d’accès. Le vert marque ce que les lecteurs reçoivent à la place d’un chemin. L’ambre marque ce qui ressemble encore à un chemin : un chemin relatif avec une extension de fichier, un fragment home/… ou Users/…, votre nom d’utilisateur comme mot isolé et, avec Show every path and file name, tout chemin absolu. Lisez les marques ambre, et masquez un message qui en révèle plus qu’il ne devrait.

Quand vous archivez, supprimez ou compactez #

  • Archive (Archiver) ne met pas fin au lien : une conversation archivée reste lisible par ce lien, et la désarchiver ne change rien.
  • Delete (Supprimer) y met fin et supprime son journal d’accès : le lien répond 404.
  • Le compactage (voir Compacter une conversation) archive la conversation et continue dans une nouvelle. Le lien reste attaché à l’ancienne conversation, archivée, et continue de montrer ce qu’il montrait. La nouvelle conversation n’a pas de lien : elle n’est donc pas partagée tant que vous ne la partagez pas.

Voir La liste des conversations pour l’archivage et la suppression.

Ce que voit un lecteur #

Le lien ouvre la conversation dans la mise en page normale du chat, sans la barre latérale et sans la zone de saisie. Le titre est celui de la conversation.

Partie de la conversation Dans la vue partagée
Vos messages et les réponses Affichés, avec les chemins filtrés.
Lignes d’activité des outils et raisonnement Affichés, avec les chemins filtrés.
Pièces jointes et images Affichées, y compris les images générées par un agent, sous un nom filtré. Le lecteur peut ouvrir celles des messages qui lui sont visibles.
Lignes de subagent Affichées. Ajouté en 0.9.11 Une ligne ouvre l’enregistrement du subagent, en lecture seule, sans Stop (Arrêter), et filtré comme le reste.
Cartes d’aperçu Affichées avec leur libellé seulement, sans le lien. Un lien d’aperçu cité n’importe où dans le texte devient [preview link removed]. Une conversation partagée ne publie pas l’app prévisualisée.
Lignes d’événement du relais (issues des sessions surveillées) Affichées comme lignes d’événement. Le texte nomme la session surveillée.
Messages venus d’un autre relais Affichés avec un badge. L’adresse du relais et l’id de l’autre conversation sont retirés ; son nom, le titre de l’autre conversation, le fournisseur et le modèle restent.
Cartes de question et tableaux de plan Non affichés. Ils ne font pas partie des données que reçoit un lecteur : un lecteur ne voit donc que ce que l’agent a écrit autour.
Images et liens de fichiers dans le texte des messages qui pointent vers des fichiers de votre relais Ils ne se chargent pas pour un lecteur : ces fichiers exigent votre connexion.
Messages que vous avez masqués Pas envoyés du tout.
Messages épinglés et la liste 🙈 Non affichés : ils sont à vous.
Dossier de travail, détails de session et de runtime Pas envoyés.
Recherche, bouton de contexte, sélecteurs de modèle et de mode, plein écran, installation de l’app Non disponibles.

Les données que la page charge portent aussi le modèle utilisé pour chaque message. La page partagée demande aux moteurs de recherche de ne pas l’indexer.

Mises à jour en direct #

La page partagée recharge la conversation toutes les 0,9 secondes tant qu’elle est au premier plan : les nouveaux messages apparaissent donc à mesure que la conversation continue. Elle n’ouvre pas de connexion en direct avec le relais, et une page dans un onglet en arrière-plan ne se recharge pas. Un lecteur qui remonte pour lire n’est pas ramené à la fin.

Lecteurs présents #

Chaque page partagée ouverte signale au relais sa présence toutes les 12 secondes. Vous voyez combien de personnes lisent dans une info-bulle sur le titre de la conversation dans votre propre vue, par exemple 2 watchers currently reading this conversation. L’indicateur n’est là que tant qu’au moins une personne lit. Un lecteur resté silencieux pendant 45 secondes sort du décompte.

Masquer certains messages #

Chaque message de votre propre vue a un bouton Hide (Masquer), affiché quand vous survolez le message (sur un écran tactile, appuyez sur le message). Appuyez dessus et le message quitte la vue partagée. Il n’est pas supprimé. Chaque message est masqué individuellement : masquer votre question ne masque pas la réponse, et inversement. L’activité des outils et le raisonnement d’une réponse suivent la réponse.

  • Dans votre vue, le message reste complet et est marqué Hidden from shared viewers (Masqué pour les lecteurs du partage). Son bouton affiche désormais Unhide (Afficher) ; appuyez dessus et le message redevient visible pour les lecteurs.
  • Un lecteur ne voit rien à sa place. Le message est simplement absent du fil. Les pièces jointes d’un message masqué ne peuvent pas non plus être récupérées par le lien, sauf si le même fichier est joint à un message visible.
  • Un avis confirme chaque changement : Message hidden from shared viewers. ou Message visible to shared viewers.
  • Hide n’est pas proposé pour un message encore en file, ni pour les messages du turn en cours. Masquez-les après le turn.

Un message masqué l’est pour tous les liens de la conversation, y compris un nouveau lien créé plus tard. La marque survit à un redémarrage du relais.

La liste 🙈 Ajouté en 0.9.11 #

Tant qu’une conversation masque des messages, un bouton 🙈 avec leur nombre se trouve à côté de 📍 dans son en-tête (jamais dans la vue partagée). Il ouvre la liste des messages masqués, comme celle des messages épinglés :

  • Une ligne mène à son message, même très haut dans l’historique, et a Unhide.
  • Unhide all (Tout afficher) demande confirmation. Un message dont le turn tourne encore reste masqué, et la liste le signale.
  • Le nombre et la liste couvrent aussi les messages pas encore chargés, et les autres onglets et appareils suivent un changement sans rechargement.

Ce que peut faire un lecteur #

Le menu ⋯ de la vue partagée ne contient qu’une entrée, ☀️ Day mode (Mode Jour) ou 🌙 Night mode (Mode Nuit), qui change le thème de la page pour ce lecteur. Au-delà, le lecteur peut faire défiler le fil, charger les messages précédents, déplier l’activité repliée, ouvrir les enregistrements des subagents et ouvrir les pièces jointes. Le champ de saisie est désactivé et affiche Shared conversation (read-only) (Conversation partagée, lecture seule). Rien de ce que fait un lecteur ne modifie la conversation.

Limites #

Lecteurs comptés à la fois, par conversation 200 (sharedPresenceMaxPerConversation).
Lecteurs comptés à la fois, au total 5 000 (sharedPresenceMaxGlobal).
Expiration Aucune. Un lien fonctionne jusqu’à ce que vous arrêtiez le partage, le renouveliez ou supprimiez la conversation.

Les deux limites se trouvent dans config.json. Quand une limite est atteinte, le lecteur inactif depuis le plus longtemps est retiré du décompte pour faire de la place à un nouveau. Les limites plafonnent le décompte, c’est-à-dire le nombre de lecteurs que vous voyez ; la requête du fil elle-même ne les vérifie pas : un lecteur au-delà du décompte peut donc toujours lire.

Joindre le relais #

La page partagée et ses images sont servies par votre relais, pas par oar.sh ni par aucun autre service. Un lecteur doit pouvoir joindre l’adresse du relais depuis l’endroit où il se trouve. Un relais qui n’écoute que sur votre propre machine (localhostOnly) ne peut être ouvert par personne d’autre. Pour partager au-delà de votre réseau, rendez le relais joignable par un tunnel.

Si le tunnel a des règles d’accès, elles s’appliquent aussi au lien partagé. Avec une application Cloudflare Access sur le nom d’hôte, les lecteurs sont invités à se connecter et le lien ne fonctionne pas pour eux, sauf si l’application laisse passer /shared/* et /api/shared/* sans connexion. Ne mettez pas non plus de règle de cache sur /api/shared/* : la page recharge cette adresse pour suivre la conversation, et une réponse en cache continuerait d’afficher un ancien état.

Par fournisseur #

Rien ne diffère selon le fournisseur. Le partage lit la conversation enregistrée : il fonctionne donc de la même façon pour les chats GitHub Copilot, OpenAI, Claude, Claude Cloud, Cursor, Grok et DeepSeek, et pour les chats OpenAI Image, dont les images générées sont servies par le lien. Ajouté en 0.9.11 Une réponse ne porte la puce rouge ran on … dans la vue partagée que quand elle a réellement tourné sur un autre fournisseur que celui de la conversation.

Si ça ne marche pas #

Ce que vous voyez Cause et solution
Le lien répond 404 Le partage a été arrêté, le lien a été renouvelé, ou la conversation a été supprimée. Settings → Sharing liste les liens qui fonctionnent.
Le lecteur est invité à se connecter, ou voit un ancien état Cloudflare Access ou une règle de cache devant le relais. Voir Joindre le relais.
Toutes les entrées du journal d’accès ont la même adresse Un proxy sur une autre machine auquel le relais ne fait pas confiance. Définissez trustProxy.
Un chemin apparaît encore dans la vue partagée Il est relatif, ou dans une image. Vérifiez avec Preview as shared et masquez le message.

Pour le fil que lit le lecteur, voir Lire le fil de la conversation.