AI・機械学習
Typesafe-computer-use: 1ステップあたり1/50セントでMacを目標達成に導く
Typesafe-computer-use drives a Mac toward a goal for 1/50th of a cent per step (github.com)
要約
Typesafe-computer-useは、ユーザーが自然言語で指示した目標に対し、1ステップあたり約1/50セントという低コストでMacを操作するシステムです。スクリーンショットを大規模モデルに送信せず、画面を決定論的に読み取り、小規模な分類器で次のアクションを選択し、テキスト入力が必要な場合にのみライティングモデルを呼び出します。これにより、従来のフロンティアモデルを使用したコンピューター操作と比較して、大幅なコスト削減と高速化を実現します。
全文翻訳
typesafe-computer-useは、あなたがタイプした目標に向かってMacを操作します。1ステップあたり約50分の1セントで済みます。これは、大規模モデルにスクリーンショットを送信することはありません。代わりに、画面を決定論的に読み取り、小さな分類器に次のアクションを尋ね、テキストフィールドが本当に自由なテキストを必要とする場合にのみライティングモデルを呼び出します。
クリック "techcrunchに行って、彼らの次のイベントの最も安いチケットの購入ページに連れて行って" --act
フロンティアモデルのコンピューター使用がなぜ可能で高価なのか:
各ステップでスクリーンショットを送信し、計画のために数秒待機します。ほとんどのステップは計画を必要としません。それらは、短く安価に、ゲートできる信頼度スコアで作成されたリストから1つの選択を必要とします。TypeSafeはまさにそれを販売しています。それは、最大255の選択肢の中から1つの選択を、完全な確率分布と調整された信頼度で、数ミリ秒で、無料の出力トークンで回答する決定モデルです。このプロジェクトは、その周りに構築されたコンピューター使用ループです。
同じスクリーンショットと目標で測定した場合、各決定:
| | typesafe (jev) | Claude Opus 5 |
| ------------------- | -------------- | ------------- |
| bare screenshot input tokens | 4,882 | 4,785 |
| same cost per decision | $0.0002 | $0.032 |
| realistic loop with history | $0.0002 | $0.035 to $0.08 |
| cost per 12-step task | $0.003 | $0.40 to $0.90 |
| model latency | 0.13 to 0.38 s | 5.2 s |
| end-to-end step, with capture and OCR | about 1.5 s | about 5.5 s |
| | typesafe (jev) | Claude Opus 5 |
| ------------------- | -------------- | ------------- |
| 155x cheaper cost per decision | | |
| 170x to 390x cheaper cost per decision | | |
| 130x to 300x cheaper cost per 12-step task | | |
| 14x to 40x faster model latency | | |
| 3.7x faster end-to-end step, with capture and OCR | | |
正直な注意点:
大規模モデルはピクセルからイベントの日付を読み取り、それを単独で比較しました。分類器は、以下に説明する日付解析を必要としました。フロンティアモデルが無料で実行するすべての推論は、ここで決定論的な状態として再構築する必要があります。
インストール
macOS 14以降、Python 3.12以降、uvが必要です。
```bash
git clone https://github.com/awlevin/typesafe-computer-use
cd typesafe-computer-use
uv sync
cp .env.example .env
# キーを入力してください
```
| variable | required | purpose |
| -------------------- | -------- | ---------------------------------------------------------------------- |
| TYPESAFE_API_KEY | yes | every decision |
| ANTHROPIC_API_KEY | no | type_text, writer-proposed URLs, and the final answer |
| CLICKER_EMAIL | no | enables the type_email action |
| CLICKER_BROWSER | no | defaults to Google Chrome |
| CLICKER_WRITER_MODEL | no | defaults to claude-haiku-4-5 |
| CLICKER_ANSWER_MODEL | no | reads the last screen for the final answer; defaults to claude-sonnet-5 |
システム設定 > プライバシーとセキュリティで、ターミナルに画面収録とアクセシビリティの許可を与えてください。前者がないと、キャプチャは壁紙になります。後者がないと、合成クリックはサイレントにドロップされ、--actは開始を拒否します。
```bash
uv run clicker "open the Playground" # ドライラン: 1ステップ、何をするかを出力します
uv run clicker "open the Playground" --act # マシンを操作します、最大100ステップ
uv run clicker "log in" --act --steps 20 --delay 3 # より長く、より遅く
uv run clicker-inspect "any goal" # 3-2-1、キャプチャ、注釈付き画面+ペイロードを開きます
```
ターミナルを最初にクリアしてください。それは画面上にあるため、そのテキストはOCR入力です。
ライブ実行の停止。
ターミナルにフォーカスがあるときにCtrl-Cを押すか、どのアプリからでもマウスを画面の左上隅に叩きつけてください。ループは、完了またはなし、信頼度が--min-confidence(0.4)を下回った場合、2回の連続したノーオペレーションの後、または--steps後に自動的に停止します。
回答。
ループが自動停止すると、ライターは停止した画面を読み取り、結果を出力します。それは、目標が求めていた情報、または画面にそれがない場合の状況と次のステップです。ドライランや中止された実行は、回答を出力しません。
ステップの仕組み
スクリーンキャプチャ ─► Vision OCR ─► 行をブロックにマージ ─► 目標をエコーする行をドロップ
アクセシビリティ ─► 操作可能な要素(ロール、ラベル、フレーム)、表示に限定され、ラベル付けされたプレス可能なもの、オフスクリーンコントロールとして保持されるもの
│ └─► 1つの番号付きリスト項目、それぞれが出所を保持
│ アクセシビリティ ─► フォーカスされたフィールド(ロール、ラベル、プレースホルダー、値、フレーム)
AppleScript ─► 最前面のアプリとpid、アクティブなタブのURL
時計 ─► ローカルの日時
dates.py ─► "2026-10-13"(27日後)という日付のブロック、またはその隣にある"日付が...の行の近く"というテキスト
│ ▼ 1つのTypeSafeリクエスト、3つの選択肢、オフスクリーンコントロール付きの4つ
┌────────────────────────────────────────────────────────────┐
│ kind : click_item | use_browser | type_text | scroll… │
│ item : which item (used only for click_item) │
│ site : which website (used only for use_browser) │
│ offscreen : which hidden control (only for press_offscreen)│
└────────────────────────────────────────────────────────────┘
│ ▼ 決定論的なアクション ─► 待機 ─► 次のステップ
項目はそれらがどこから来たかを示します:OCRはテキストブロックから、AXはアプリが宣言したコントロールから、AX+OCRは両方が同じものを見つけた場合です。AX項目は、分類器が実際のコントロールとテキスト行を区別できるように、基準としてボタン「共有」(右上)と読み取られます。決定を3つの質問に分割することで、画面のノイズをアクション選択から除外します。これを構築中に見つかったすべての遅延は、同じ意味を持つ2つのオプションから生じました。信頼度は集中度を測定するため、重複するオプションは常に疑いとして読み取られます。アクションセットは相互に排他的に保ってください。
OCRコスト
ビジョンはステップの約3分の2を占め、ピクセル数ではなくテキスト量で課金されるため、唯一の実際の節約は画面の読み取り量を減らすことです。クロップ。
各ステップは、8ptのマージンと、同じ列のメニューバーのストリップを含む最前面ウィンドウを読み取ります。これはディスプレイにクランプされます。デスクトップやバックグラウンドウィンドウのテキストは、決定にとってノイズです。ストリップをウィンドウの幅にクリッピングすることが、フルハイトウィンドウでクロップを効果的にするものです。コスト:時計とウィンドウの右側にあるメニューの追加情報は読み取られません。それらはアクセシビリティツリーを通じてクリック可能なままです。
再利用。
キャプチャは、256pxタイルで1/8スケールで前のものと比較されます。変更されていないタイルは、前回のステップで生成した行を保持します。変更されたタイルはブロブにクラスター化され、辺と角は接触すると見なされ、各ブロブは個別に読み取られる長方形になります。散発的な変更が一般的なケースであり、時計の数字と1つの再描画、そしてそれらの周りの1つの長方形が表示全体に広がります。各長方形は、既知の行がその端を横切らなくなるまで成長します。なぜなら、行を横切るクロップはその見える半分を返すからです。成長後に互いに会うものはマージされ、4つを超えるものは最も近いペアで4つにマージされます。変更されたタイルの60%以上、合計長方形面積の領域の60%以上、またはアプリの切り替えやウィンドウの移動が発生した場合、領域全体が代わりに読み取られます。タイミングラインは、どれだけ読み取られたか、そしていくつの部分で読み取られたかを示します:OCR 0.31秒(画面の22%、2つの長方形)。リプレイ(--image)は常に画像全体を読み取り、再利用しないため、オフラインでの再現は元の実行と一致します。
アクセシビリティツリー
OCRはアイコンを見ることができません。アクセシビリティツリーはそれを見ることができるため、各ステップは最前面のプロセスのラベル付けされたオン・スクリーン・コントロールもウォークします。カバレッジは不均一で、1台のMac上の10個のアプリで測定されています:Finder 100%のオン・スクリーン・コントロールにラベル付け、Chrome 88%、Slack 85%、Notion 68%、Spotify 0(そのCEFシェルは3つのウィンドウボタンのみを公開し、他は何も公開しません)。ターミナルはグリッドを1つのテキストエリアとして公開します。したがって、AXはボーナスソースであり、決して置き換えではありません。ラベルはWebおよびElectronではAXDescription、AppKitではAXTitle、それ以外では短いAXValueにあります。装飾的な画像は、その周りのコントロールのラベルを取ります。リスト行は、浅いAXStaticTextからラベルを取ります。フレームは嘘をつくため、ウォークは厳しくプルーニングされます:実際のフレームが表示に合わないサブツリーをスキップ(Notesは200画面下の行を報告し、Chromeはビューポート外のノードを上に駐車します)。幅または高さが4pt未満のノードをスキップ(Chromiumはビューポート外のWebノードをスライバーにクランプします)。数千のゼロサイズのアイテムの後ろにあるAXMenuサブツリーをスキップします。名前のないAXGroupレイアウトボックスをスキップします。これらはプレス可能なものでもスキップします。4000ノードまたは0.6秒で停止し、その旨を伝えます。
ここで測定されたウォーク:Finder 152コントロール(0.08秒)、Chrome 172(0.59秒)。
アシスタティブハンドシェイク属性(AXManualAccessibility、AXEnhancedUserInterface)は、このmacOSではサポートされていないため、何もそれに依存しません。
オフスクリーンコントロール
AXPressは要素を必要としません...