所有页面
本页内容

分享对话

分享会为对话提供一个公开的只读链接。你把链接发给谁,谁就能在浏览器中阅读对话记录,无需登录,并且能随着对话的进行持续跟进。他们无法发送、停止、更改或打开你中继上的其他任何内容。链接显示什么由你决定:单条消息可以隐藏,中继主机的路径会被过滤掉。你自己始终能看到完整的对话,Settings → Sharing(设置 → 分享)会列出每个链接以及谁打开过它的日志。

链接是公开的

任何拥有该地址的人都能阅读分享的对话记录,而且地址可以被转发。中继不会询问打开者是谁。请把它当作那一个对话的密码,并在发送之前用 Preview as shared(预览分享效果)把对话读一遍。

创建链接 #

  1. 打开对话。
  2. 打开它的 ⋯ 菜单,选择 ➡️ Share conversation(分享对话)。

不会出现对话框。中继会创建链接并将其复制到你的剪贴板,同时有一条简短提示说明:

Share link copied to clipboard.

如果浏览器不允许页面写入剪贴板,提示会直接显示地址本身,你从那里复制即可。

地址形如 https://relay.example.com/shared/,后面跟一个很长的随机令牌(64 个十六进制字符)。主机是你访问中继时所用的那个;在其他机器上的代理后面时,则是代理报告的那个,前提是中继信任该代理。如果中继在子路径下提供服务(config.json 中的 remotePath),子路径也是地址的一部分。

再次选择 ➡️ Share conversation 不会生成第二个链接:只要对话有一个有效链接,你拿到的就是同一个地址。任何对话都可以分享,已归档的对话也可以。

你的分享链接 0.9.11 新增 #

Settings → Sharing 列出当前拥有链接的每个对话,并显示分享(以及更新)的时间、上次打开的时间、打开次数和查看者人数。点击标题会打开该对话。每一行都有:

按钮 作用
Copy link(复制链接) 复制链接。
Renew link(更新链接) 确认后为对话生成一个新链接,并复制它。旧链接会立即失效。访问日志会转移到新链接。当链接传播得超出了预期时使用它。
Stop sharing(停止分享) 确认后结束该链接。它会立即失效,对正在阅读的人也是如此,其访问日志也会被删除。
Access log(访问日志) 展开该链接的访问日志。

当打开的对话已被分享时,它的 ⋯ 菜单中也有 ⛔ Stop sharing,同样会先询问。

停止或更新之后 #

已停止或已更新的链接会返回普通的 404,页面和数据都是如此,与从未存在过的链接完全一样。仍在该链接上打开的分享页面会在下一次刷新时停止,大约在一秒之内。停止后再次选择 ➡️ Share conversation 会创建一个带新令牌的新链接;旧地址永远不会恢复。

不使用应用也可以做到,只需把认证令牌(访问)作为请求头,例如用脚本停止分享:

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

对同一地址发送 POST 会创建链接,POST …/share/renew 会更新链接,GET /api/shares 会列出所有链接。

访问日志 #

列表的每一行都可以展开为它的访问日志,最新的在前。一条记录代表分享页面的一次打开,而不是每次刷新:页面大约每秒重新加载一次对话,只有第一次加载才计数。同一查看者在 10 秒内的第二次加载只计一次。查看者在 30 分钟没有阅读之后再回来,会再计一次,例如在后台标签页中休眠过的页面。不通过页面而直接读取链接的脚本也按同样方式计数,因此任何人读取链接都会留下记录。

记录的组成部分 来源
时间 页面被打开的时间。
IP 地址 中继看到的查看者地址。在代理后面时,如果中继信任该代理,这是代理报告的地址;否则每个查看者的地址都是代理的地址。当 Store viewer IP addresses(保存查看者的 IP 地址)处于关闭状态时,显示 IP not stored(未保存 IP)。
国家 Cloudflare 隧道添加的国家代码,只从受信任的代理获取。其他情况下为空。
viewer … 由地址和浏览器计算出的简短带密钥哈希,同一查看者每次打开都相同,即使地址没有被保存也是如此。
浏览器 查看者浏览器发送的用户代理,以文本形式显示。

列表显示最新的 200 次打开,并说明总共有多少次。

更新链接时日志会随之转移。只要链接处于分享状态,日志就会保留;停止分享或删除对话时,日志会被删除。

Access log 下的 Store viewer IP addresses(默认开启)决定新记录是否保留地址。关闭后,新记录不再保留地址,中继自己针对分享读取的日志行也不再保留。如果已经保存了地址,OAR 会询问是否也删除它们:Remove them(删除)会把它们从每条访问日志记录和分享读取的状态日志中清除,记录本身保留;Keep them(保留)则保留它们。该设置适用于中继的所有链接。

路径和文件名 0.9.11 新增 #

分享视图不会完整携带中继主机的路径。中继会按照 Settings → Sharing 中的 Paths and file names(路径和文件名)设置,过滤它提供给链接的所有内容:

选项 对于 /srv/projects/shop/src/cart.js,查看者看到的是
Show every path and file name(显示所有路径和文件名) 原样的路径
Hide the path, show the file name(隐藏路径,显示文件名)(默认) cart.js
Hide paths and file names(隐藏路径和文件名) ‹hidden›

该设置适用于中继的每个链接,从分享页面的下一次刷新起生效。你自己的视图始终显示全部内容。

过滤器能捕获的内容:

  • 始终:工具参数中的路径、文件提及(@file:、@folder:,包括相对路径)、附件名称、子智能体记录以及差异的文件头。
  • 自由文本中,即回复、思考、工具输出和代码块中:中继已知的文件夹(对话的工作目录、工作区根目录、你的主文件夹、中继自己的数据文件夹和上传文件夹)及其后跟随的任何内容,Windows 和 Unix 的绝对路径,~/… 路径,以及位于分隔符之间的你的用户名。这是尽力而为的过滤。
  • 不会捕获:自由文本中的相对路径(src/cart.js)、诸如 /tmp 的一级路径、网址,以及图片中的任何内容。

预览分享效果 #

对话 ⋯ 菜单中的 🔍 Preview as shared 会按链接显示的样子打开对话,既不创建链接,也不在任何访问日志中留下记录。绿色标出查看者看到的替代路径的内容。琥珀色标出仍然像路径的内容:带文件扩展名的相对路径、home/… 或 Users/… 片段、作为单词出现的你的用户名,以及在选择 Show every path and file name 时的每个绝对路径。请阅读琥珀色标记,并隐藏泄露过多信息的消息。

归档、删除或压缩时 #

  • 归档不会结束链接:已归档的对话仍可通过链接阅读,取消归档也不会改变任何东西。
  • 删除会结束链接,并删除其访问日志:链接返回 404。
  • 压缩(参见压缩对话)会归档该对话,并在一个新对话中继续。链接留在旧的、已归档的对话上,并继续显示它原来显示的内容。新对话没有链接,因此在你分享它之前,它不会被分享。

归档和删除的方法见对话列表。

查看者看到什么 #

链接会以普通的对话布局打开对话,但没有侧边栏,也没有输入区。标题就是对话的标题。

对话的组成部分 在分享视图中
你的消息和回复 显示,路径经过过滤。
工具活动行和思考 显示,路径经过过滤。
附件和图片 显示,包括智能体生成的图片,名称经过过滤。查看者可以打开对他们可见的消息上的附件和图片。
子智能体行 显示。0.9.11 新增 点击一行会打开子智能体的记录,只读,没有 Stop(停止),并与其他内容一样经过过滤。
预览卡片 只显示其标签,不带链接。文本中任何地方引用的预览链接都显示为 [preview link removed]。分享对话不会公开被预览的应用。
中继事件行(来自监视会话) 显示为事件行。文本会写出被监视会话的名称。
来自其他中继的消息 显示,并带有徽标。中继的地址和另一个对话的 id 会被移除;其名称、另一个对话的标题、提供商和模型保留。
提问卡片和计划看板 不显示。它们不属于查看者获得的数据,因此查看者只能看到智能体在它们前后写的内容。
消息文本中指向你中继上文件的图片和文件链接 对查看者不加载:这些文件需要你的登录。
你隐藏的消息 完全不发送。
置顶消息和 🙈 列表 不显示:它们只属于你。
工作目录、会话和运行时详情 不发送。
搜索、上下文按钮、模型和模式选择器、全屏、应用安装 不可用。

页面加载的数据还包含每条消息所用的模型。分享页面会要求搜索引擎不要将其编入索引。

实时更新 #

分享页面在前台时每 0.9 秒重新加载一次对话,因此随着对话继续,新消息会出现。它不会与中继建立实时连接,处于后台标签页中的页面也不会重新加载。向上滚动阅读的查看者不会被拉到末尾。

监视者 #

每个打开的分享页面每 12 秒告诉中继一次它还在。在你自己的视图中,对话标题上的提示文字会显示有多少人正在阅读,例如 2 watchers currently reading this conversation。只有至少有一人正在阅读时才会显示这个指示。45 秒没有动静的查看者会从计数中移除。

隐藏单条消息 #

在你自己的视图中,每条消息都有一个 Hide(隐藏)按钮,悬停在消息上时显示(在触摸屏上,轻点消息)。按下后,该消息会离开分享视图。它不会被删除。每条消息单独隐藏:隐藏你的提问不会隐藏对它的回复,反之亦然。回复的工具活动和思考随回复一起。

  • 在你的视图中,该消息保持完整,并标记为 Hidden from shared viewers(对分享查看者隐藏)。它的按钮此时显示 Unhide(取消隐藏);按下后,该消息对查看者重新可见。
  • 查看者在它的位置上什么也看不到。该消息只是从对话记录中消失。被隐藏消息的附件也无法通过链接获取,除非同一个文件也附加在一条可见的消息上。
  • 每次更改都有一条提示确认:Message hidden from shared viewers. 或 Message visible to shared viewers.
  • 对仍在排队的消息,或正在运行的一轮中的消息,不提供 Hide。请在该轮结束后再隐藏它们。

被隐藏的消息对该对话的每个链接都隐藏,包括之后创建的新链接。这个标记在中继重启后依然保留。

🙈 列表 0.9.11 新增 #

当对话隐藏了消息时,其标题栏中 📍 旁边会有一个带数量的 🙈 按钮(分享视图中永远没有)。它会打开被隐藏消息的列表,与置顶消息的列表类似:

  • 点击一行会跳到对应的消息,即使它在历史记录中很靠前,每行还带有 Unhide。
  • Unhide all(全部取消隐藏)会先询问。所在轮次仍在运行的消息会保持隐藏,列表会标明它。
  • 数量和列表也涵盖尚未加载的消息,其他标签页和设备无需重新加载就会同步更改。

查看者能做什么 #

分享视图中的 ⋯ 菜单只有一个条目:☀️ Day mode(日间模式)或 🌙 Night mode(夜间模式),用于为该查看者切换页面主题。除此之外,查看者可以滚动对话记录、加载更早的消息、展开折叠的活动、打开子智能体记录以及打开附件。输入框处于禁用状态,显示 Shared conversation (read-only)(已分享的对话,只读)。查看者所做的任何事都不会改变对话。

限制 #

每个对话同时计数的查看者 200(sharedPresenceMaxPerConversation)。
总共同时计数的查看者 5000(sharedPresenceMaxGlobal)。
过期 无。链接一直有效,直到你停止分享、更新链接或删除对话。

这两个上限都在 config.json 中。达到上限时,空闲最久的查看者会从计数中移除,为新查看者腾出位置。这些上限限制的是计数,即你看到的监视者人数;对话记录请求本身不检查它们,因此超出计数的查看者仍然可以阅读。

访问中继 #

分享页面及其图片由你的中继提供,而不是由 oar.sh 或任何其他服务提供。查看者必须能从他们所在的位置访问中继的地址。只在你自己机器上监听的中继(localhostOnly)无法被其他任何人打开。要在你的网络之外分享,请通过隧道访问中继。

如果隧道有访问规则,这些规则同样适用于分享链接。如果主机名前面有 Cloudflare Access 应用,查看者会被要求登录,链接对他们无效,除非该应用允许 /shared/* 和 /api/shared/* 无需登录即可通过。也不要对 /api/shared/* 设置缓存规则:页面会重新加载该地址来跟进对话,缓存的响应会一直显示旧的状态。

按提供商 #

各提供商之间没有任何差异。分享读取的是已存储的对话,因此对于 GitHub Copilot、OpenAI、Claude、Claude Cloud、Cursor、Grok 和 DeepSeek 对话,以及 OpenAI Image 对话,它的工作方式都相同;OpenAI Image 对话生成的图片会通过链接提供。0.9.11 新增 只有当某条回复确实在与对话本身不同的提供商上运行时,它在分享视图中才会带有红色的 ran on … 小标签。

无法正常工作时 #

你看到的情况 原因与解决方法
链接返回 404 分享已停止、链接已更新,或对话已被删除。Settings → Sharing 列出仍然有效的链接。
查看者被要求登录,或看到旧的状态 中继前面有 Cloudflare Access 或缓存规则。参见访问中继。
访问日志的每条记录都是同一个地址 其他机器上有一个中继不信任的代理。请设置 trustProxy。
分享视图中仍然显示某个路径 它是相对路径,或在图片中。用 Preview as shared 检查,并隐藏该消息。

关于查看者阅读的对话记录,参见阅读对话记录。