将那些恶劣的线条ID与便捷的书面标签相结合 If you’ve been building on top of OpenAI’s shiny Assistants API, you’ve probably hit the same wall I did: There’s no API endpoint to list your thread IDs. None. Zero. Nada. 没有 API 端点来列出您的主题 ID。 无,无,无。 您可以创建一个线索( )。 POST /v1/threads 您可以获取一个线程,如果您已经知道其ID( )。 GET /v1/threads/{id} 你甚至可以删除一个( )。 DELETE /v1/threads/{id} 如果你想要一个简单的 列出你创建的所有线程? 它不存在,而缺乏这个单一的终端改变了你如何在这个平台上建立的一切。 GET /v1/threads Forget it. CRUD循环中缺少这样一个基本部分,这让开发人员觉得他们正在盲目工作。 这种设计选择似乎是故意的,OpenAI希望把坚持带回你身上: “你有责任存储线程ID。 But half the time we’re just prototyping so: 我们没有线程的数据库表。 我们不想建立一个数据库管道,只是为了测试一个想法。 我们只想拍摄一堆测试线程,看看发生了什么,然后继续前进。 然后有一天你意识到你已经生成了数百个(或数万个,取决于规模)的线程,现在你需要清理它们,审核它们,或者简单地确认存在的东西。 那就是当你撞入墙壁时,你甚至看不到你创建了什么。你越思考它,你越意识到这是一个可见性问题,影响从调试到合规性的一切。 差距开放AI留下广泛开放 Every sane API platform in the known universe usually has a list endpoint. 它是最基本的CRUD生命周期 - 创建,阅读,更新,删除,而“R”不仅仅是收集一个记录,它也涉及列举它们。 开发者希望能够问, 但是不是在这里,通过放弃它,OpenAI有效地迫使您从第一天开始登录和存储ID - 或者完全失去跟踪的风险。 “什么存在?” From a developer’s perspective, that’s a liability. From a data management perspective, it’s a bloody mess. From a security standpoint? A fucking nightmare. 更少的列表终端意味着对其侧面仍然存在的数据负起更少的责任。 没有列表终端,您无法审核使用。 你不能轻易地清理不稳定的实验。 你不能自动化生命周期管理。 你被留在黑暗中,希望相信自己的日志,永远不要问什么在那里。 無論是關於安全性、隱私,還是只是保持 API 表面較小,結果都是一樣: 这种缺席不仅会造成不便,还会产生不信任,这让开发人员猜测他们是否真的控制了他们创建的内容。 we can’t list our own threads. 用你的浏览器和我的简单的JavaScript书面标签窃取从OpenAI的列表终端 If OpenAI won’t give us a list endpoint, well, we’ll just have to pull up our pants and scrape the goddamn thing. 但是,而不是使用无头工作流代理构建一些愚蠢的特定工具,还有更多。 比你能正确地记住...你已经拥有了完美的工具。 Python 的 你的浏览器,和一个谦虚的JavaScript书标。 图标标记只是一个浏览器标记,它对您所访问的页面运行JavaScript,如果您正在浏览器中查看API响应日志,您已经拥有所需的所有线程ID - 它们只是埋藏在文本中。 但最好的事情是,书面标签并不在乎页面是否格式化或漂亮。 它是最接近“穷人的清单终点”的东西。 thread_... Here’s the magic snippet: javascript:(function(){ const ids = [...document.body.innerText.matchAll(/thread_[A-Za-z0-9]+/g)] .map(m => m[0]); if (!ids.length) { alert("No thread IDs found on this page."); return; } navigator.clipboard.writeText([...new Set(ids)].join("\n")) .then(() => alert("Copied " + ids.length + " thread IDs to clipboard!")); })(); 将其添加为浏览器标记的URL,点击在任何页面上显示线程ID,并蓬勃发展:每一个 字符串被扫描,重复,并复制到您的剪辑板。 thread_... 没有插件. 没有扩展. 没有开发工具体操. 只需一个点击。 So yes, it takes a little time… 摇滚 加载更多 摇滚 加载更多 但是一旦你到达终点(或你想要的长度),你可以单击上面保存的书籍标签......并爆炸一个精心复制的线程ID列表,以便你做你想要的。 为什么这关系到 This isn’t only a neat, functional hack. It’s a reminder of the gap between developer needs and API design. 我们习惯了透明的全生命周期API,OpenAI的决定将线程列表排除在外,感觉就像一个黑暗的模式,使我们更难看到背景中积累了什么。 他们是否保留了这些数据是超越了点 - 重要的是 我们不能自己验证。 如果你正在构建一个受监管的产品,在那里审计能力很重要,你实际上无法证明你已经扭曲了哪些线程。 如果你正在实验,你可以保证你看不到的混乱。 Bookmarklet 是恢复这种可见性的一种方法. 它不会修复缺失的 API,但它会为您提供机构。 通过单击,您可以看到您的日志中可见的每个线程 ID,将其剪辑,并将其导入大量删除的流程。 它还重塑了这种关系:开发人员不应该依赖黑客来获取有关自己的资源的信息,这是一个信号,该平台不尽可能地为其用户提供服务。 一旦你有你的线程ID,该怎么办 将其粘贴到文本文件中,Google 表格,任何东西,如果需要,将其保留为参考,排序和删除。 使用 HTTP 请求来循环每个 ID 并拨打 DELETE /v1/threads/{id}。 如果您不再需要这些线程,请擦除它们并更好地睡觉,知道它们已经消失。 添加生命周期计划. 继续,决定是否要永久地登录 ID,在使用后立即清除它们,或通过 TTL 暂时存储它们。 自动清理。设置一个重复的任务或工作流程,自动扫描旧的ID。与警报相结合,以便您知道何时悬挂线条。 定期审计,即使你使用书签,让它成为一个习惯,看看有什么在时间表上。 更大的图片 OpenAI可以用一个愚蠢的简单的终点来解决这个问题: GET /v1/threads 开发人员不必通过 n8n 日志扫描, bookmarklet 或 spelunk. 然而,直到他们这样做,这样的 bookmarklets 是保持事情在移动的管道胶带。 That’s it. 我们需要浏览器黑客来管理自己的资源是荒谬的。 它破坏了开发人员在API中所拥有的信任,当缺少这样一个基本的功能时,我们不应该被迫为应该成为桌面赌注而发明解决方案。 这不仅仅是开发者的不便,它是一个可见性问题,可见性是问责性,没有它,用户无法证明数据存在,无法自信地删除,无法建立可靠的自动化。 Bookmarklet是一个聪明的绷带,但伤口是OpenAI的故意遗漏,但在实践中,它让所有开发人员不断猜测: 我创造了什么?还有什么在那里?我真的控制了吗? 当我们依靠黑客来管理自己的内容时,我们强调平台对我们有多少权力,当功能被阻止时,我们有多少回应权。 是的,助理 API 是强大的,但没有标准的简单可见性是危险的,如果你认真使用它在生产中,从第一天开始记录你的线程 ID。 但是,如果你像我们其他人一样 - 混乱,快速原型,然后意识到你需要清理 - 我的书店是你的弥赛亚。 Click, copy, paste, delete. Done. 也许,也许,OpenAI会采取线索,并给我们一个每个开发人员期望的终点:一种列出我们自己的资源的方式。 Until then, hacks like this bookmarklet aren’t just useful. They’re essential. 直到那时,像这本书的黑客不仅有用,而且是必不可少的。