v0.1.0 源码可见 · 本地模型优先

说一句话,
让浏览器自己动起来

MoonOS 是一个基于浏览器的 AI 操作系统:给定目标,Agent 自主完成感知 → 决策 → 执行循环直到任务结束。底层由 CloakBrowser(反检测 Chromium + Playwright 包装层)驱动,决策与视觉识别都可以跑在本地 LLM / VLM 上。

Python ≥ 3.11 · Windows GUI 控制台 + CLI 双入口 8 层架构 · 6 类资源统一管理
示例站点 · 搜索页 profile · seed 07A3
click_at
帮我在站内搜索 MoonOS,打开第一条结果
感知:DOM 读取可见输入框与按钮清单
决策:本地 LLM → type + click
感知决策执行
动作白名单 ✓ URL / SSRF 校验 ✓ 出站脱敏 ✓ 预算熔断 step 7 / 30
Capability

不是脚本录制,是会自己想办法的 Agent

命中已知流程就走确定性执行,没命中就交给模型循环;跑成功的路径还会沉淀成经验,下次直接复用。

感知→执行对话驱动闭环给目标即可,无需写脚本
9 种原子动作browser 层统一封装
6 类资源统一管理设备 / 环境 / 人设 / 账号 / 实例 / 任务
本地优先LLM / VLM 可离线OpenAI 兼容接口,不依赖 function calling

给定目标,Agent 自主循环到完成

每一步都从页面读取事实,交给模型判断语义,再执行动作。感知不到可用元素时降级视觉模型看图决策。

  • 感知:browser 层做页面感知,输出可见元素、输入框与按钮清单
  • 决策:本地 LLM(OpenAI 兼容接口)选择下一步动作,不依赖 function calling
  • 执行:9 种原子动作落地,agent 层负责编排循环与预算熔断
  • 降级:感知失败时用 VLM 看图决策,支持 click_at 坐标点击
Agent Loop
goal 自然语言目标
↓
perceive 页面感知 / DOM 事实
↓
decide 本地 LLM 决策动作
↓
act 原子动作执行
↓
guard 预算熔断 · 失败归档

能确定的就别猜:Playbook 优先

router 层维护 Playbook 注册表,两级匹配命中后走确定性流程;失败自动降级到通用 LLM 循环,成功轨迹还能反向晋升为新 Playbook。

  • 两级匹配:先粗匹配目标意图,再细匹配站点流程
  • 确定性执行:命中即按既定步骤跑,稳定且可复现
  • 自动降级:Playbook 失败立刻转通用 LLM 循环,不卡在原地
  • 轨迹晋升:通用循环跑成功的路径沉淀为新 Playbook
Router 分流
in 目标描述
↓
match Playbook 两级匹配
↓
hit 确定性流程执行 → 成功
miss / fail 降级通用 LLM 循环
promote 成功轨迹 → 晋升 Playbook

多实例并行,环境互不可见

每个实例拥有独立指纹种子与独立 profile,cookie 互相不可见。该能力仅用于合法授权范围内的多环境并行测试与兼容性验证。

  • 独立 profile:实例之间不共享登录态与缓存
  • 代理预检:实例启动前做 SOCKS5 / HTTP 握手,三态结论 ok / auth_failed / unreachable
  • 链式代理:境外通道(mihomo)+ 每实例中继拼接,可按设备指定住宅出口
  • 泄露防护:预检不通过直接阻断启动,并有代理时禁用 QUIC,避免真实 IP 静默外泄
Chain Relay
instance A · seed 07A3独立 profile
instance B · seed 5C1F独立 profile
instance C · seed 9E28独立 profile
浏览器 → 中继(随机空闲端口)仅支持 SOCKS5 上游
境外通道 · 本地监听mihomo 内核
设备海外住宅端点端点与账密随设备档案
预检失败 → 阻断启动不创建浏览器

跑过一次的坑,不用踩第二次

experience 层把成功轨迹与失败现场持久化到 SQLite,遇到相似目标先检索复用;失败自动留档截图与 HTML 供人工复查。

  • 轨迹入库:步骤序列、站点、结果一并存档
  • 相似检索:新目标匹配历史经验,减少无效探索
  • 失败留档:截图 + HTML 双留存,问题可回溯
  • 诊断取证据:scripts/diagnose.py 输出状态码、验证特征命中、可见输入框清单与元素尺寸
Experience Store
run 任务执行轨迹
↓
store SQLite 持久化
success 可检索复用 → 晋升 Playbook
failure 截图 + HTML 归档
↓
next run 相似目标命中经验,跳过试错

宁可停下,也不乱点

core 层统一负责配置加载、日志与安全守卫。所有动作先过白名单与 URL/SSRF 校验,出站数据脱敏,密钥不落库不写日志。

  • 动作白名单 + URL/SSRF 校验:越界动作直接拒绝
  • 越界坐标不点击:VLM 返回坐标非法或出画布即转人工,绝不"先试试再说"
  • 事实与语义分离:DOM 读事实,文本 LLM 只判语义;映射不到候选集合或数量不符即转人工
  • 密钥优先级:环境变量优先,未设置回退配置文件;真密钥建议只放环境变量
Guard Matrix
确定性模态math / rotate / slider · 不触网
语义模态quiz / imageClick / dragSort
兜底触发网络错误 / 5xx / 401
结果不可用ok=false / 数量不足 / 坐标非法
越界坐标一律不点击 → 人工兜底
证书校验补齐中间+根证书,不开 CERT_NONE
Playground

输一句目标,看看 Agent 会怎么想

网页内置示意 · 非真实执行

下面是 MoonOS 轨迹记录的展示格式(感知到的事实、模型决策、执行动作、经验沉淀)。本页面为纯前端演示,不会真的打开浏览器或访问任何站点。

输入目标或点一条示例,右侧时间轴会按 MoonOS 的循环顺序展开。
STEPS0
ROUTER—
MODEL本地 LLM
STORE—
Architecture

8 层 + 入口,每层职责单一

点左侧任意一层,查看它的职责与关键实现。目录均以 src/moonos/ 为根。

src/moonos/core/

core · 底座与守门人

配置加载、日志与安全守卫。所有动作与 URL 在到达浏览器之前先经过这一层的校验。

    依赖:无(最底层)
    Quick Start

    从安装到第一条任务

    Windows 环境,Python 3.11 起。CloakBrowser 为本地 editable 依赖,需单独安装。

    1

    独立虚拟环境

    用 .venv 隔离依赖,避免污染系统 Python。

    2

    装 CloakBrowser 并下载浏览器二进制

    二进制落在 bin/cloakbrowser/(约 536MB,不入库);刻意不设 CLOAKBROWSER_BINARY_PATH,以免锁死版本。

    3

    装 MoonOS 与 GeoIP extra

    只补装 socksio 与 geoip2 两个传递依赖。socksio 缺失会让 webrtc_ip=auto 被静默摘除,导致宿主真实 IP 泄露。

    4

    复制配置、填端点

    config.example.json → config.json(已被 gitignore)。本地 vLLM 一类服务可把 api_key 填 EMPTY;同名环境变量优先覆盖配置文件。

    5

    跑任务

    CLI 单次任务跑完即退,GUI 模式带主控制台与实例控制面板(窗口吸附)。

    # 1. 独立虚拟环境
    python -m venv .venv
    .venv\Scripts\activate
    
    # 2. 安装 CloakBrowser(按你的实际路径)
    pip install -e [CLOAKBROWSER_PATH]
    python -m cloakbrowser install
    
    # 3. 安装本项目
    pip install -e .
    
    # 4. GeoIP extra:设备用代理 / WebRTC IP=auto 时必需
    pip install "socksio>=1.0" "geoip2>=4.0"
    // config.json(已被 .gitignore 忽略,不入库)
    {
      "llm":    { "base_url": "[BASE_URL]",
                  "model": "Qwen/Qwen3-VL-30B-A3B-Instruct-FP8",
                  "api_key": "EMPTY" },
      "vision": { "enabled": true,
                  "base_url": "[BASE_URL]",
                  "model": "Qwen/Qwen3-VL-30B-A3B-Instruct-FP8" }
    }
    
    # 临时切换端点/模型/密钥走环境变量(优先级高于配置文件)
    set MOONOS_LLM_BASE_URL=[BASE_URL]
    set MOONOS_LLM_MODEL=openai/gpt-oss-120b
    set MOONOS_VISION_BASE_URL=[BASE_URL]
    # 单次任务(跑完即退)
    python -m moonos --goal "帮我搜索 MoonOS"
    
    # 图形界面:主控制台 + 每窗口吸附的实例控制面板
    python -m moonos --gui
    
    # 代理链路自检(端口 / 隧道 / 出口 IP / 住宅性 / 设备时区一致性)
    python scripts/probe_local_proxy.py [PORT] --device dev_xxx
    python scripts/probe_chain_relay.py
    # 遇到「元素不可用 / 动作失败 / 疑似反爬」,先取证据再下结论
    python scripts/diagnose.py [URL]
    python scripts/diagnose.py [URL] -s "#kw" --out .cache/diag.png
    
    # 输出:HTTP 状态 / 最终 URL / 标题、验证特征词命中、正文预览、
    #      全页可见输入框清单、指定 selector 的可见性与盒子尺寸
    
    # 单元测试(标准库 unittest,浏览器与 LLM 均 mock,可离线跑)
    python -m unittest discover -s tests -p "test_*.py"
    Use Cases

    它适合被用在这些地方

    以下场景均以「合法授权范围内」为前提;超出授权的使用一律不适用。

    多环境兼容性测试

    多实例并行、互不可见的 profile 与代理出口,用来在不同环境下重复验证同一套流程是否一致。

    独立指纹种子代理预检三态实例并行

    重复性操作自动化

    跨站点的固定动作——查询、填表、翻页、截图——用一句目标描述代替手写脚本,命中 Playbook 后走确定性流程。

    自然语言目标Playbook 复用预算熔断

    安全评估与自检

    验证出口 IP 是否真按预期生效、代理失效时会不会静默回落直连——这类最隐蔽的失效点正是它重点防护的。

    链路自检脚本QUIC 旁路禁用脱敏日志

    学习与研究 Agent 架构

    感知—决策—执行循环、Router 分流、经验检索与失败降级都是可读可跑的完整实现,带单测与规范体系。

    specs 规范unittest 离线GLOSSARY 术语

    合规使用边界(请务必阅读)

    使用本项目即视为已阅读、理解并同意遵守项目 README 中的免责声明。

    ✓用途限定

    仅供学习、研究,以及在合法授权范围内开展浏览器自动化、兼容性测试、安全评估与个人效率提升。

    ✓遵守义务

    须自行遵守目标站点服务条款、robots.txt、隐私政策及所在司法辖区法律法规。

    ✓能力边界

    环境一致性仅用于授权范围内模拟真实环境、多环境并行测试;人机验证自动处理仅限本人拥有或已获书面授权的站点,默认失败转人工兜底。

    ✕禁止用途

    不得用于破解他人账号、批量注册 / 薅羊毛 / 刷量、抓取受法律或合同保护的数据、对抗第三方风控、非法爬虫。

    ✕不绕过授权

    不用于绕过访问控制与授权机制;作者不对使用者的违规违法行为及后果承担责任。

    ©商标声明

    文档中提及的第三方产品名称仅作能力类比与技术说明,不代表关联、赞助或背书关系,商标归各自权利人所有。

    FAQ

    开始之前,通常会问这些

    Python ≥ 3.11,Windows(GUI 窗口吸附依赖 pywin32),并按本地 editable 方式安装 CloakBrowser。GUI 层基于 PySide6(Qt for Python,LGPL v3),本项目以动态链接方式使用、不修改其源码。
    决策默认走本地 LLM(OpenAI 兼容接口),且不依赖 function calling;感知失败时降级本地 VLM 看图决策。在线兜底服务是可选项,需要在配置里显式开启 fallback.enabled = true。出站数据经过脱敏,密钥不落库、不写日志。
    实例启动前会做一次连通性预检(SOCKS5 / HTTP 握手),给出三态结论:ok(可正常启动)、auth_failed(检查账号口令、套餐有效期、出口 IP 白名单)、unreachable(服务端不可用、端口未开放或被防火墙丢弃)。预检不通过会直接阻断启动、不创建浏览器——因为代理不通时 Chromium 仍能打开网页,但 WebRTC 伪装会被静默摘除,宿主真实 IP 会泄露却无人察觉。
    WebRTC 的 STUN 请求仍走本机真实网络(Chromium 不支持 SOCKS5 UDP),WebRTC IP=auto 是伪装上报的 IP,不是转发 UDP。若不禁用有代理时的 QUIC,UDP 旁路会造成出口 IP 不一致,所以 MoonOS 在该场景下直接关闭 QUIC。
    这类服务商规定海外代理仅限境外网络环境使用(TCP 可建连但 SOCKS5 协商后立刻 FIN),需要两级串联:① 境外通道由 mihomo 内核承载(本地监听端口);② 链式拼接由 MoonOS 侧按实例起中继,随机空闲端口,再经境外通道连到设备填写的海外代理。之所以拆两段:mihomo 的单个 listener 无法按客户端路由到不同上游(SOCKS5 握手没有路由字段),"一个固定端口对应多个海外代理设备"只能在 MoonOS 侧按实例拼接。前置代理是每台设备各自的开关。总开关关着时填海外住宅端点会被判不可达,这是预期行为。
    本地端点出现网络错误 / 5xx / 401,或本地 VLM 返回结果不可用(ok=false、目标数量不足、坐标非法或越出画布)。越界坐标一律不点击、直接转人工,绝不"乱点碰运气"。语义模态 quiz / imageClick / dragSort 由 DOM 读取事实、文本 LLM 只判语义:答复映射不到候选集合或数量不符即转人工——imageClick 点错一格即失败、dragSort 错拖一次即失败,不允许"先试试再说"。确定性模态 math / rotate / slider / sliderDecoy 不触网,不受影响。
    每个实例独立指纹种子 + 独立 profile,cookie 互不可见。该能力仅用于在授权范围内模拟真实用户环境、开展多环境并行测试,不用于对抗第三方风控系统或绕过访问控制与授权机制。
    先取证据再下结论:运行 python scripts/diagnose.py [URL],可加 -s "#kw" --out .cache/diag.png 查看指定 selector 的可见性与盒子尺寸。失败任务还会自动留档截图与 HTML,可从 experience 层回看。
    可以。单元测试基于标准库 unittest,不依赖真实浏览器与 LLM(均 mock),覆盖安全护栏、router 匹配、配置加载与 Agent 主循环,可在无网络环境离线运行。
    采用 MoonOS Source-Available 许可:非商业用途(个人学习、研究、技术评估)免费使用;任何商业、生产或营利性使用须事先取得权利人书面授权。项目按协议"按现状"提供。

    把重复的浏览器操作,交给会说人话的系统

    本地模型、可审计的护栏、能沉淀经验的执行循环。在合法授权范围内,从一条 --goal 开始。

    商业与生产用途请事先取得书面授权:lplulu@foxmail.com