官方 DevDay 刚把 Dots 这个名字配上托管版常驻 Agent,GitHub 上几乎同一时间就出现了开源版的身影:feder-cr/dots 创建于 2026 年 9 月 29 日 23:06(UTC),截至 2026 年 10 月 2 日快照已有 2,416 星与 421 次 fork,MIT 许可证,README 末尾用一句原文划清界限:Not affiliated with OpenAI,与 OpenAI 无任何亲属关系。
这篇 SOP 只解决一件事:怎么把开源 dots 在你自己的电脑上跑起来,并且跑顺。全文命令一律取自仓库 README 原文,不改任何参数;文中数字全部来自 2026-10-02 的仓库快照与 README 原文,不掺编造成分。如果你已经在维护 OpenClaw 这类本地优先的自托管 Agent,OpenClaw 2.0 升级迁移 SOP 讲的是那条路线的迁移与升级;本文的 dots 是另一种形态的自托管,两条路线互不替代。
这只 Agent 是什么
三句话讲完。第一句,README 的定位原意:每个 AI agent 都是模型加浏览器,模型可以用一个参数换掉,浏览器才是网站看到的东西。第二句,开源 dots 自带一只真 Firefox 引擎的浏览器,启动时接上 OpenRouter 上任意模型,就是一个能替你操作网页的 Agent。第三句,它不托管在任何人手里,就跑在你本机,界面是本地的一个网页端口。
技术原理层面它为什么值得单独写一篇文章,本文不展开,这里只管把它跑起来。但定位里有一句话值得先咬文嚼字:浏览器才是网站看到的东西。模型再强,任务失败的原因往往不在模型,页面没加载出来、登录过期、点击没落上,全都发生在浏览器里,发生在模型开始思考之前。这就是为什么这篇 SOP 花这么多篇幅讲浏览器相关的参数,而不是讲提示词技巧。
准备清单:一个 key,两处网络,三条纪律
跑之前把三样东西备齐。
其一,OpenRouter 的 API key。dots 启动时必须带 --openrouter-key 参数,模型调用全部走 OpenRouter,所以 key 从 OpenRouter 拿:注册账号后进 Keys 页面创建一个新 key,key 以 sk-or- 开头,README 命令里的 sk-or-... 就是它的占位符。拿到后立刻存进你的密码管理器,别贴进聊天窗口。
其二,一台 Windows 或 Linux 机器。README 官方给了这两条路线,macOS 用户等官方补文档,不要自己脑补。uv 不用提前装,安装脚本会搞定;Python 也不用你管,uvx 会自动处理运行环境,这是后面命令能压到三条的根本原因。
其三,网络能连通三处:astral.sh(装 uv 的脚本)、GitHub(拉 dots 代码)、OpenRouter(模型调用)。首次运行要从 GitHub 拉整个仓库和依赖,任何一处不通,后面全卡,先把网络确认了。
另外立个规矩:这个 key 是你钱包的钥匙。不进 git、不上截图、不进共享文档,踩坑一节还会再说一遍。
三条命令上手:Windows 与 Linux 各三行
两条路线各三行,命令全部是 README 原文,一字未改。
Windows 下开 PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uvx --from git+https://github.com/feder-cr/dots dots --openrouter-key sk-or-...Linux 下开终端:
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uvx --from git+https://github.com/feder-cr/dots dots --openrouter-key sk-or-...逐行说清每步在干什么,以及为什么这么设计。
第一行都是装 uv。uv 是 Astral 出的 Python 工具管理器,dots 借它解决「环境从哪来」的问题:你不需要自己装 Python,也不需要建虚拟环境。PowerShell 那行里的 ByPass 只作用于这一次启动的子进程,不改你系统的执行策略,装完即忘。
第二行是把 uv 的安装位置加进当前会话的 PATH。Windows 是把用户目录下的 .local\bin 追加进 Path,Linux 是 source 官方的 env 脚本。这一行只影响当前窗口,如果以后新开窗口找不到 uv 命令,先检查新会话的 PATH。
第三行是真正的启动命令。uvx 会从 GitHub 拉取 feder-cr/dots 这个仓库,在隔离环境里装好依赖,然后执行其中的 dots 命令,--openrouter-key 把你的 key 传进去。sk-or-... 是占位符,换成你自己的完整 key。第一次跑这一行会明显慢,因为要拉代码装依赖,属正常现象,不是卡死。
命令跑起来之后,用浏览器打开 http://127.0.0.1:8765 ,你就到位了。
三条命令里没有一步是手工配环境,这是这条上手路线最值得称道的地方:安装、依赖、隔离全部交给 uv 一家处理,你唯一要提供的是 key 和网络。环境配置越少,出问题时可以怀疑的地方就越少。
8765 页面:左边对话,右边浏览器
README 对这个界面的描述只有一句:对话在左,浏览器在右,实时(The conversation on the left, the browser on the right, live)。
这句话值得单独一节,因为它是自托管与云端托管最大的体验差异。你在左边输入任务,右边那只 Firefox 对每一个动作给出实时画面:去哪个 URL、点了哪里、填了什么、页面回了什么,全程可见。出了问题不用翻日志,直接看它停在哪一步;任务做完,整个执行过程本身就是最好的交付凭证。127.0.0.1 意味着界面跑在你本机;但模型调用仍然会经 OpenRouter 出网,这一点心里要有数。
换模型:只改一个参数
README 原文说得很直接:模型是 OpenRouter 上的任意模型,--model 一个参数就能换。
这是自托管路线最实际的好处。同一个浏览器、同一套任务提示词,模型这一层完全由你决定:想让日常任务便宜点,换低价模型;想让复杂任务更稳,换更强的模型。换法就是在启动命令末尾追加 --model 与 OpenRouter 上的模型名,其他什么都不用动。浏览器行为与模型解耦,正是 README 开篇那句 You can swap the model with one flag 在工程上的落地。
它同时意味着你的成本结构是透明的。模型调用按 token 计费,用什么模型、跑多少任务,账都算在你自己头上;托管订阅则替你打包了这笔账。自托管把决定权还给你,连同算账的责任一起。
进阶四参数:seed、profile-dir、proxy、help
README 提到的参数不多,但每一个都对应一类真实需求,按使用频率讲四个。
--seed:一个 seed 一个身份。屏幕、字体、GPU、时区、语言这些特征互相一致,并且同一个 seed 每次跑出同一个「人」。如果有一类任务需要反复执行、希望每次环境一致,固定 seed 就够了;调试时想复现某次行为,把当时的 seed 拿回来用就能对上。
--profile-dir:让浏览器记住登录与 Cookie,跨次运行保留。需要登录态的任务,查你自己订的行程、管你自己的后台,不该每次重走一遍登录流程。把 profile 固定到一个目录,第二次起它就带着登录态干活。Agent 的凭证与权限该怎么管、各方案边界在哪,本站有一篇 Agent 凭证与权限对比 可以对照着读。
--proxy:出口即身份。挂上代理后,时区与语言会跟随出口所在地。这条参数与 --seed 的身份一致性配合才有意义,README 的设计意图是让各项特征互相印证,而不是单点伪装。也正因为这条参数的存在,你更应该想清楚把它指向哪里、为什么指向那里,合规一节还会回到这个话题。
--help:所有参数的总入口。前三个只是 README 重点介绍的,完整参数列表一条命令看:
dots --help接进你自己的 CLI:invisible_playwright_mcp
dots 本身是个带界面的完整产品,但它背后的浏览器可以单独拆出来用。同一个组织还有另一个仓库 invisible_playwright_mcp,README 原文说得很清楚:Claude Code、Codex、Gemini CLI 或任何 MCP 客户端,都可以通过它把这只浏览器当作 server 接进去;dots 是这个能力的界面。
对你的日常意味着什么:你在编码 CLI 里让 Agent 干活时,遇到要看网页、点网页的环节,不用再切出去手动代劳,直接用同一只浏览器后端。如果你的 Codex 环境还没接入外部工具,先看这篇 Codex harness 接入 SOP,再回来接这个 server;想理解这类浏览器操作型 Agent 的完整搭建思路,计算机操作 Agent 搭建 SOP 是更好的长篇读物。
示例任务:一句提示词里藏着纪律
README 给了一个示例任务,原文大意如下:去某个 URL,查米兰到里斯本的单程经济舱、一位成人,把下个月 12 日到 16 日每一天的最低价逐日读出来;某天没有票,就说没有票;不许猜数字。
这个任务的写法本身值得学。它把四个要素一次给齐:明确的 URL、明确的筛选条件、明确的时间范围,以及最重要的一条,把模型的幻觉出口堵死。「没票就说没票,不许编数字」这句话看起来朴素,实际上决定了你能不能相信这个 Agent 交付的结果:一个被明确禁止猜数字的任务,返回的每个数字你才敢用。以后你给这只 Agent,或者给任何 Agent,派任务都建议照这个格式写:条件、范围、拿不准时怎么办,一条不缺。模糊的任务不会换来一个谨慎的 Agent,只会换来一个自信的 Agent,而后者更危险:它给每个数字都配上了笃定的语气,你要花双倍时间逐个核对。
合规使用边界
这一节不是免责套话,是这篇 SOP 的一部分,请当成使用前提来读。
第一,遵守目标网站的服务条款与当地法律法规。各网站对自动化访问的态度不同,你的使用场景是否被允许,判断责任在你。
第二,只自动化你有权访问的账户与自有业务。查你自己的行程、管你自己的后台,是这类工具的正常用途;替别人操作账户、越权访问,不在讨论范围内。
第三,不要用于欺诈、抢票、黄牛、批量注册。这些场景不仅违反服务条款,在不少司法辖区还直接触法。
第四,反检测不是无前提的豁免。本文如实介绍了 README 中的技术设计(引擎级指纹、seed 身份一致性、逐键输入的可信事件),这些是中性技术事实;但「页面检不出来」不等于「可以随便用」,工具的合规性永远由使用方式决定。如果有人向你承诺「用了它就不会被封」,把这句话当营销话术处理。
踩坑提示
五条高频提醒,全是常识级,但每一条都有人栽。
其一,首跑慢是正常的。uvx 第一次启动要从 GitHub 拉仓库、装依赖,耗时远长于以后每次,别在第几分钟就动手杀进程。
其二,key 的三条纪律:不进 git、不上截图、不进共享文档。万一怀疑泄露,去 OpenRouter 撤销旧 key 重建一个,代价一分钟,比账号被盗刷便宜得多。
其三,占位符别照抄。命令里的 sk-or-... 必须换成完整 key,原样执行会在模型调用时失败。
其四,两条路线别串门。PowerShell 的命令贴进 Linux 终端、bash 的命令贴进 PowerShell,都会在第一行就失败。Windows 用户注意用 PowerShell,不是老式 cmd。
其五,任务提示词别太省。示例任务那四要素(URL、条件、范围、不许编)是模板,不是修辞。派模糊的任务给 Agent,得到的只能是模糊的结果。
常见问题
Q1: 需要提前装 Python 或配虚拟环境吗?
不需要。README 的路线用 uv 解决一切:安装脚本先装 uv,uvx 再在隔离环境里拉起 dots 及其依赖。你只需要保证网络可达 astral.sh、GitHub 与 OpenRouter,再加上一个 OpenRouter key。
Q2: 能不能用 OpenRouter 之外的模型?
按 README 原文,模型是 OpenRouter 上任意模型,启动必须带 --openrouter-key,换模型用 --model。README 没有提供其他模型接入方式,本文不猜。
Q3: 我的登录态怎么保留?
用 --profile-dir 把浏览器 profile 固定到某个目录,登录与 Cookie 会跨次运行保留。第一次登录之后,后续任务直接带着登录态执行。
Q4: 它能给我的 Claude Code 或 Codex 当浏览器用吗?
可以。同组织的 invisible_playwright_mcp 仓库把这只浏览器以 MCP server 形式提供给 Claude Code、Codex、Gemini CLI 等 MCP 客户端,dots 是它的界面。参数细节用 dots --help 查看。
Q5: 这个项目与 OpenAI 有关系吗?
没有。README 末尾原文声明 Not affiliated with OpenAI,许可证为 MIT。托管版 Dots 是 OpenAI 的产品,开源 dots 是社区独立实现,两者不要混为一谈。
三条命令跑起来后,你第一个派给它的任务是什么?