ホスト型プロダクトを探していますか? Jinba Trail はBrowserflowの上に構築されたWebサービスです。ブラウザータスクを自然文で説明し、AIエージェントが記録した内容をレビューし、決定論的なHTTPSエンドポイントとして公開できます。エンジンコードは不要です。このページと残りのエンジンdocsは、その下にあるオープンソースSDKを扱います。
問題
チームは同じような自動化を2通りの方法で行いがちで、どちらも失敗します。- 閉じ込められたホスト型オーケストレーター。 強力ですが、自分のラップトップで動かしたり、forkしたり、安価にセルフホストしたりできません。プロセスは他者のランタイム内に置かれます。
- 接着剤スクリプトの引き出し。 ネットワークが一瞬途切れる、依存関係が新しいバージョンへ浮動する、理解していた1人が離れる、そうした瞬間までは動きます。
1つの信念
Browserflow は、1つの信念に基づいてゼロから作られています。プロセスの定義とそれが同じように実行される保証こそがプロダクトです。それ以外、storage、transport、UI、hostingはすべてadapterです。このドキュメント全体では、それを具体化するために1つの実行例を使います。
daily-price-watch です。browser tool search-price@1.2.0を実行し、結果をtransformし、価格が下がったときにsecret webhookへ条件付きでhttp.postするFlowです。一度作成してpinすれば、ラップトップ、CI、RESTエンドポイントの背後で同一に実行されます。runtimeで何かを決めるmodelはありません。
参照であり、依存ではありません。 Browserflowはsibling projectである
browser-flowから哲学を借りています。runtimeにLLMを置かない、author once / run forever、content-addressedなprovenance、secrets at the boundary。しかし、そのcodeは一切importしていません。自己完結しています。何であるか
次を備えたワークフローエンジン兼サービスです。- 2つのオーサリング面。fluentで型安全なTypeScript SDKと、宣言的なYAML formatです。どちらも1つのFlowSpec(IR)へloweringされます。SDK and YAMLを参照してください。
- 決定論的な実行エンジン(“Rider”)。DAG of stepsをretries、idempotency、checkpointing、resume付きでscheduleし、runtimeではmodelを呼びません。Executionを参照してください。
- Tool contract。browser automation(Playwright)、HTTP call、shell command、pure transform、または独自処理など、任意の決定論的unit of workをwrapします。Tools and Packsを参照してください。
- Pack system。ToolsとFlowsをまとめたversionedでcontent-addressedなbundles(デプロイする”SDKs”)を、registriesへpublishし、registries間でreplicateします。Packsを参照してください。
- Launcher layer。CLI、REST、MCP、cron、CI、container、edgeにまたがって、engineを変更せずに実行します。Launchersを参照してください。
- optionalなcontrol plane。engineをserviceにします。scheduling、secrets、RBAC、replication、run inspectorを追加します。Control planeを参照してください。
daily-price-watch Flowを2通りで作成すると、次のようになります。2つの顔、1つの真実(tenet T1)であり、同一のFlowSpec digestへコンパイルされます。
正確なSDKとYAML surfaceはSDK and YAMLで定義されています。expression syntax(
${{ ... }})はexpression languageで扱います。何ではないか
意図的な非目標が4つあります。- AI agent frameworkではありません。 実行pathにmodelはありません。AIはFlowの作成を助けることがあります(stepをsuggestする、YAML draftを書く)。しかし、runtimeでFlowが何をするかは決めません。stepからmodelを呼ぶことはできますが、それはrecorded inputs and outputsを持つ通常のdeclared Toolであり、隠れたdecision-makerではありません。
- general programming languageではありません。 Flowsはtyped stepsのgraphsであり、arbitrary codeではありません。escape hatch(
codetool)はありますが、happy pathはdeclarativeでinspectableです。 - 丸ごと採用しなければならないplatformではありません。 coreはlibraryとbinaryです。serviceはopt-inで置き換え可能です。Open core、Apache-2.0です。
- infrastructureに強い意見を持ちません。 storage、queues、secrets、transportはinterfacesであり、妥当なlocal defaults(SQLite、filesystem)があります。
8つの設計原則
これらのtenetsはload-bearingです。将来のdecisionがこれらと衝突する場合、明示的に文書でoverrideされない限りtenetが勝ちます。| Tenet | Name | Gist |
|---|---|---|
| T1 | One truth, two faces | SDKとYAMLは対等なfirst-class citizenです。どちらもFlowSpecへコンパイルされ、FlowSpecはYAMLへround-tripできます。片方のsurfaceでしか動かないtoolはbugです。 |
| T2 | Deterministic by default, effects by permission | stepは、そうでないと宣言するまではpureです。time、randomness、environment、network、filesystem、secrets、process spawningは、ambientではなくrun contextを通じて注入されるcapabilitiesです。 |
| T3 | Reproducibility is content-addressed | Flowはstableなsha256 digestを持つcanonical FlowSpecへコンパイルされます。flow digest、tool/pack versions、recorded inputsをpinすれば、runは任意のmachineでofflineでも再現可能です。digestこそがversionです。 |
| T4 | Portable core, pluggable edges | engineは少数のinterfaces(Store、Clock、Random、Secrets、Logger、ToolHost、Journal)だけに依存します。すべてのlauncherとbackendがそれらを実装します。engineはcloud SDKをimportしません。 |
| T5 | Minimal code, maximal legibility | 新しいtoolは、Zod-typedなinput/output schemaとrun functionを持つ小さなobjectです。新しいlauncherはengine.run()を包む薄いshellです。featureが大量のcore codeを必要とするなら、おそらくPackに属します。 |
| T6 | Local-first, cloud-optional | すべてzero infrastructureで動きます。stateにはSQLite、artifactsにはfilesystem、secretsにはfileを使えます。scale outはimplementationを差し替えることであり、conceptを差し替えることではありません。 |
| T7 | Fail loud, resume clean | errorsはtyped(DomainError lineage)であり、原因となったstep、input、journal frameとともにsurfaceされます。どのrunも、完了済みstepsを再実行せず、最後のdurable checkpointからresumeします。 |
| T8 | Boring on purpose, secrets at the boundary | stable formats、explicit versions、clever globalsなし。secret: trueとmarkされたinputsはFlowSpec、journal、log、published Packに入りません。値は、secrets capabilityをdeclaredしたstepの内部でのみ、runtimeに解決されます。 |
60秒のメンタルモデル
実行する
RiderはDAGをscheduleし、PackからresolvedしたToolsをinvokeし、Journalを書きます。retries、idempotency、resumeを備え、modelはloopに入りません。
リプレイする
digest、pack versions、recorded inputsをpinし、任意のmachineでofflineでもRunをバイト単位で再現します。testing and replayを参照してください。
このドキュメントの構成
コンセプト
big picture、architecture、FlowSpec、Tools、Packs、Runsを支える正確なdomain model。
オーサリング
SDKまたはYAMLでFlowsを書く方法。2つの顔、1つの真実。expression languageとcontrol flowも扱います。
Runtime: ToolsとPacks
Tool contract、standard packs(http、transform、shell、fs、control、model)、browser tool。
Service: コントロールプレーン
optionalでopt-inなplane。scheduling、secrets、RBAC、replication、run inspector。
最初のFlowを作成する
daily-price-watch Flowをend to endで構築し、実行するhands-on walkthrough。用語集
FlowSpec、Rider、Pack、Launcher、capability、Journalなど、すべてのtermを1か所で正確に定義します。
次のステップ
インストール
browserflow binaryとSDKをlocalにセットアップします。クイックスタート
zero infrastructureで数分のうちにFlowをcompileしてrunします。
ロードマップ
build orderを確認します。contracts、engine、authoring、browser、packs、launchers、service。
アーキテクチャ
portable coreとpluggable edgesがどう組み合わさるか。