分享对话
分享会为对话提供一个公开的只读链接。你把链接发给谁,谁就能在浏览器中阅读对话记录,无需登录,并且能随着对话的进行持续跟进。他们无法发送、停止、更改或打开你中继上的其他任何内容。链接显示什么由你决定:单条消息可以隐藏,中继主机的路径会被过滤掉。你自己始终能看到完整的对话,Settings → Sharing(设置 → 分享)会列出每个链接以及谁打开过它的日志。
链接是公开的
任何拥有该地址的人都能阅读分享的对话记录,而且地址可以被转发。中继不会询问打开者是谁。请把它当作那一个对话的密码,并在发送之前用 Preview as shared(预览分享效果)把对话读一遍。
创建链接 #
- 打开对话。
- 打开它的
⋯菜单,选择 ➡️ Share conversation(分享对话)。
不会出现对话框。中继会创建链接并将其复制到你的剪贴板,同时有一条简短提示说明:
Share link copied to clipboard.
如果浏览器不允许页面写入剪贴板,提示会直接显示地址本身,你从那里复制即可。
地址形如 https://,后面跟一个很长的随机令牌(64 个十六进制字符)。主机是你访问中继时所用的那个;在其他机器上的代理后面时,则是代理报告的那个,前提是中继信任该代理。如果中继在子路径下提供服务(config.json 中的 remote),子路径也是地址的一部分。
再次选择 ➡️ 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 …/ 会更新链接,GET / 会列出所有链接。
访问日志 #
列表的每一行都可以展开为它的访问日志,最新的在前。一条记录代表分享页面的一次打开,而不是每次刷新:页面大约每秒重新加载一次对话,只有第一次加载才计数。同一查看者在 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(路径和文件名)设置,过滤它提供给链接的所有内容:
| 选项 | 对于 /,查看者看到的是 |
|---|---|
| Show every path and file name(显示所有路径和文件名) | 原样的路径 |
| Hide the path, show the file name(隐藏路径,显示文件名)(默认) | cart. |
| 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(shared)。 |
| 总共同时计数的查看者 | 5000(shared)。 |
| 过期 | 无。链接一直有效,直到你停止分享、更新链接或删除对话。 |
这两个上限都在 config.json 中。达到上限时,空闲最久的查看者会从计数中移除,为新查看者腾出位置。这些上限限制的是计数,即你看到的监视者人数;对话记录请求本身不检查它们,因此超出计数的查看者仍然可以阅读。
访问中继 #
分享页面及其图片由你的中继提供,而不是由 oar.sh 或任何其他服务提供。查看者必须能从他们所在的位置访问中继的地址。只在你自己机器上监听的中继(localhost)无法被其他任何人打开。要在你的网络之外分享,请通过隧道访问中继。
如果隧道有访问规则,这些规则同样适用于分享链接。如果主机名前面有 Cloudflare Access 应用,查看者会被要求登录,链接对他们无效,除非该应用允许 / 和 / 无需登录即可通过。也不要对 / 设置缓存规则:页面会重新加载该地址来跟进对话,缓存的响应会一直显示旧的状态。
按提供商 #
各提供商之间没有任何差异。分享读取的是已存储的对话,因此对于 GitHub Copilot、OpenAI、Claude、Claude Cloud、Cursor、Grok 和 DeepSeek 对话,以及 OpenAI Image 对话,它的工作方式都相同;OpenAI Image 对话生成的图片会通过链接提供。0.9.11 新增 只有当某条回复确实在与对话本身不同的提供商上运行时,它在分享视图中才会带有红色的 ran on … 小标签。
无法正常工作时 #
| 你看到的情况 | 原因与解决方法 |
|---|---|
链接返回 404 |
分享已停止、链接已更新,或对话已被删除。Settings → Sharing 列出仍然有效的链接。 |
| 查看者被要求登录,或看到旧的状态 | 中继前面有 Cloudflare Access 或缓存规则。参见访问中继。 |
| 访问日志的每条记录都是同一个地址 | 其他机器上有一个中继不信任的代理。请设置 trust。 |
| 分享视图中仍然显示某个路径 | 它是相对路径,或在图片中。用 Preview as shared 检查,并隐藏该消息。 |
关于查看者阅读的对话记录,参见阅读对话记录。