# Show HN： Libretto - 让 AI 浏览器自动化操作具有确定性

- 来源：Hacker News 热门（buzzing.cc 中文翻译）
- 作者：muchael
- 发布时间：2026-04-16 16:58
- AIHOT 链接：https://aihot.virxact.com/items/cmo19bxpr00yzslzfy1t36j7j
- 原文链接：https://github.com/saffron-health/libretto

## AI 摘要

Libretto 是一款开源 AI 浏览器自动化工具，通过技术手段解决传统 AI 自动化中的不确定性问题，使浏览器操作具备确定性和可预测性。该项目已在 GitHub 发布，并在 Hacker News 获得 100 点关注，为开发者提供了更可靠的 AI 驱动浏览器自动化方案。

## 正文

Libretto

Libretto is a toolkit for building robust web integrations. It gives your coding agent a live browser and a token-efficient CLI to:

Inspect live pages with minimal context overhead

Capture network traffic to reverse-engineer site APIs

Record user actions and replay them as automation scripts

Debug broken workflows interactively against the real site

We at Saffron Health built Libretto to help us maintain our browser integrations to common healthcare software. We're open-sourcing it so other teams have an easier time doing the same thing.

Quick Links

Website: libretto.sh

Docs: libretto.sh/docs

Repository: github.com/saffron-health/libretto

Discord: discord.gg/NYrG56hVDt

Installation

# Add Libretto to your project. Requires Node.js and npm. npm install libretto # First-time onboarding: install skills and download Chromium npx libretto setup # Check workspace readiness at any time npx libretto status

setup creates the .libretto/ directory, installs agent skills, and downloads Chromium unless you pass --skip-browsers.

setup

.libretto/

--skip-browsers

Use cases

Libretto is designed to be used as a skill through your coding agent. Here are some example prompts:

One-shot script generation

Use the Libretto skill. Go on LinkedIn and scrape the first 10 posts for content, who posted it, the number of reactions, the first 25 comments, and the first 25 reposts.

Use the Libretto skill. Go on LinkedIn and scrape the first 10 posts for content, who posted it, the number of reactions, the first 25 comments, and the first 25 reposts.

Your coding agent will open a window for you to log into LinkedIn, and then automatically start exploring.

Interactive script building

I'm gonna show you a workflow in the eclinicalworks EHR to get a patient's primary insurance ID. Use libretto skill to turn it into a playwright script that takes patient name and dob as input to get back the insurance ID. URL is ...

I'm gonna show you a workflow in the eclinicalworks EHR to get a patient's primary insurance ID. Use libretto skill to turn it into a playwright script that takes patient name and dob as input to get back the insurance ID. URL is ...

Libretto can read your actions you perform in the browser, so you can perform a workflow, then ask it to use your actions to rebuild the workflow.

Convert browser automation to network requests

We have a browser script at ./integration.ts that automates going to Hacker News and getting the first 10 posts. Convert it to direct network scripts instead. Use the Libretto skill.

We have a browser script at ./integration.ts that automates going to Hacker News and getting the first 10 posts. Convert it to direct network scripts instead. Use the Libretto skill.

Libretto can read network requests from the browser, which it can use to reverse engineer the API and create a script that directly calls those requests. Directly making API calls is faster, and more reliable, than UI automation. You can also ask Libretto to conduct a security analysis which analyzes the requests for common security cookies, so you can understand whether a network request approach will be safe.

Fix broken integrations

We have a browser script at ./integration.ts that is supposed to go to Availity and perform an eligibility check for a patient. But I'm getting a broken selector error when I run it. Fix it. Use the Libretto skill.

We have a browser script at ./integration.ts that is supposed to go to Availity and perform an eligibility check for a patient. But I'm getting a broken selector error when I run it. Fix it. Use the Libretto skill.

Agents can use Libretto to reproduce the failure, pause the workflow at any point, inspect the live page, and fix issues, all autonomously.

CLI usage

You can also use Libretto directly from the command line. All commands accept --session to target a specific session.

--session

npx libretto open # launch browser and open a URL npx libretto run ./integration.ts --headless # run a workflow and close on success npx libretto run ./integration.ts --headless --stay-open-on-success # keep a successful run inspectable npx libretto snapshot --session # capture a screenshot and compact accessibility tree npx libretto exec "" # execute Playwright TypeScript against the open page npx libretto close # close the browser

run sessions are inspectable through the same daemon-backed commands as open sessions. Successful runs close the browser by default; pass --stay-open-on-success to keep the browser open for pages, snapshot, and exec. Failed or paused workflows keep the browser open so you can inspect the exact page state before fixing or resuming the workflow.

run

open

--stay-open-on-success

pages

snapshot

exec

Run npx libretto help for the full list of commands.

npx libretto help

Configuration

All Libretto state lives in a .libretto/ directory at your project root. See the configuration docs for details on config files, sessions, and profiles.

.libretto/

Telemetry

Libretto records anonymous CLI telemetry to help understand CLI usage and help us prioritize improvements. Each resolved command can send only an install id, timestamp, command event name such as libretto run, error boolean, package version, and build channel (node_modules, source, or unknown). Libretto does not send command arguments, URLs, project paths, auth state, API keys, error messages or details, or user identity.

libretto run

node_modules

source

unknown

The install id is stored in the telemetry file at ~/.libretto/telemetry.json. The implementation lives in packages/libretto/src/cli/core/telemetry.ts.

~/.libretto/telemetry.json

packages/libretto/src/cli/core/telemetry.ts

To disable telemetry, set LIBRETTO_TELEMETRY_DISABLED=1, set DO_NOT_TRACK=1, run with CI=1, or edit ~/.libretto/telemetry.json and set "enabled": false.

LIBRETTO_TELEMETRY_DISABLED=1

DO_NOT_TRACK=1

CI=1

~/.libretto/telemetry.json

"enabled": false

Join the Community

Join our Discord to connect with other developers, get help, and share what you've built:

For longer-form threads, head to GitHub Discussions. Found a bug? Open an issue.

License

MIT License — use it freely in commercial and open-source projects.

Development

For local development in this repository:

pnpm i pnpm build pnpm type-check pnpm test

Source layout:

packages/libretto/src/cli/ — CLI commands

packages/libretto/src/cli/

packages/libretto/src/runtime/ — browser runtime (network, recovery, downloads)

packages/libretto/src/runtime/

packages/libretto/src/shared/ — shared utilities (config, LLM client, logging, state)

packages/libretto/src/shared/

packages/libretto/test/ — test files (*.spec.ts)

packages/libretto/test/

*.spec.ts

packages/libretto/README.template.md — source of truth for the repo and package READMEs

packages/libretto/README.template.md

packages/libretto/skills/libretto/ — source of truth for the Libretto skill

packages/libretto/skills/libretto/

Run pnpm sync:mirrors after editing packages/libretto/README.template.md or anything under packages/libretto/skills/libretto/.

pnpm sync:mirrors

packages/libretto/README.template.md

packages/libretto/skills/libretto/

To check that generated READMEs, skill mirrors, and skill version metadata are in sync without fixing them, run pnpm check:mirrors. To release, run pnpm prepare-release.

pnpm check:mirrors

pnpm prepare-release

Note

This is an early-stage project under active development. APIs may change before version 1.0. We recommend pinning to specific versions in production.

Built by the team at Saffron Health.
