Schematron V2 SmallはHTMLから型付きJSONを抽出しますが、Webサイトを開いたりブラウザーを操作したりはしません。Tabbit Browserなどの許可されたローカルブラウザーで必要な範囲だけを取得し、そのHTMLとJSON SchemaをInference.netへ送ります。APIは自由形式のタスク指示やブラウザーツールを受け取らないため、抽出ルールはスキーマに書きます。公式ドキュメントに基本例があります。
ログイン済みページでは、ローカルツールを使えるエージェントにTabbit CLIを通じて専用タブで作業させ、必要なレコードだけを読み取ります。結果を検証し、名前付きのレビュー用ドラフトに保存します。許可とデータポリシーを確認せず、アカウント情報やページ内容を外部APIへ送らないでください。
要点
SmallはHTMLから抽出するモデルです。閲覧、クリック、ログイン、ページ選択は行いません。
API IDは
inference-net/schematron-v2-smallです。先にブラウザーで取得範囲を絞ります。Tabbit CLIはローカルブラウザーへの引き継ぎに使えます。
抽出ルールはスキーマに記述し、システムプロンプトには頼りません。
公開ページとログイン済みページを分け、出力を元ページと照合します。
Smallでできること
| 用途 | Smallの役割 | 別コンポーネントの役割 |
|---|---|---|
| ページを読む | 渡されたHTMLから項目を抽出 | Tabbit BrowserなどがHTMLを取得 |
| ルールを適用 | JSON Schemaの形で値を返す | スキーマで項目、型、説明、必須項目を定義 |
| URLへ移動 | 対応しない。APIが受け取るのはHTML | ローカルブラウザーが許可されたページを開く |
| ログイン状態を使う | モデルはセッションにアクセスしない | 許可されたTabbit環境でタスクタブを開く |
| 正しさを確認 | 出力形式を整える | コードまたは人が元ページと照合 |
Inference.netはSmallを複雑なスキーマや長いページ向けに位置付け、128KトークンのコンテキストとlxmlによるHTML前処理を案内しています。非常に長いページは切り分けます。これは提供元の説明であり、本記事の実測値ではありません。Schematron公式ドキュメントを参照してください。
ブラウザー取得と抽出を分ける
取得: ローカルブラウザーで公開または許可されたページを開き、描画を待って限定したHTMLを返します。Cookie、プロフィール、隠しフォーム、無関係な内容は含めません。
抽出: アプリケーションからHTMLをユーザーメッセージとして送り、JSON Schemaを
response_formatに指定します。返った値をクライアント側で検証します。
SchematronにはURL、ブラウザーセッション、移動指示は渡りません。JavaScriptで描画するページはHTTP取得だけでは空の枠になることがあるため、先にブラウザーで描画してください。以下は公式例に沿い、リリースノートの項目を定義した例です。
import os
from pathlib import Path
from typing import Optional
from openai import OpenAI
from pydantic import BaseModel, Field
class ReleaseNote(BaseModel):
record_id: str = Field(description="ページに表示された安定IDの原文。")
title: str = Field(description="レコードの可視タイトルの原文。")
status: Optional[str] = Field(description="表示された状態。なければnull。")
date: Optional[str] = Field(description="元ページに表示された日付。推測しない。")
client = OpenAI(
base_url="https://api.inference.net/v1",
api_key=os.environ["INFERENCE_API_KEY"],
)
bounded_html = Path("approved-record.html").read_text(encoding="utf-8")
response = client.chat.completions.parse(
model="inference-net/schematron-v2-small",
messages=[{"role": "user", "content": bounded_html}],
response_format=ReleaseNote,
temperature=0,
)
record = response.choices[0].message.parsed
if record is None:
raise ValueError("No parsed record returned")
print(record.model_dump_json())bounded_htmlはブラウザーが返した断片です。メッセージに指示は含めず、項目の意味はスキーマに書きます。設定はクイックスタート、利用条件はモデル文書で確認してください。実際のAPIキーをプロンプトやページ、Git管理ファイルに入れないでください。
公開ページと認証ページの確認項目
| ページ | 取得ルール | API送信前 | レビュー |
|---|---|---|---|
| 公開製品ページや文書 | 関連する本文やカードと周辺ラベルを残す | スクリプト、スタイル、ナビゲーション、無関係な記録を除く | 表示された値と照合 |
| ログイン済み業務ページ | 許可されたアカウントとレコードだけを読む | 個人情報、認証情報、隠し入力、無関係な記録を除く | 元タブで安定IDと重要項目を確認 |
公開ページの小さなサンプルから始め、明示的なスキーマを用意します。非公開データでは利便性よりデータ境界が大切です。ページを読む権限と、内容をサービス提供元へ送信する権限の両方を確認してください。不明な場合はローカル処理に留めるか管理者へ確認します。
Tabbit CLIでローカル取得する
Tabbit BrowserとローカルCLIをインストールし、ローカルツールを実行できるエージェントクライアントを選びます。Skillの呼び出し方はクライアントごとに異なります。名前付きSkillに対応する場合は/tabbit、Piでは/skill:tabbit、その他は各クライアントの一覧を確認してください。Skillの検出、CLIランチャーの実行、サイトへのログインは別々の確認事項です。既存ブラウザーへの接続とCodexのTabbit CLI設定も参考になります。
タスクに名前を付け、専用タブを使います。たとえば、公開リリースノートから主レコードだけを返すよう依頼します。CLIのnodejs構文では固有のrequest IDを指定します。
"$HOME/.local/bin/tabbit-cli" nodejs \
--task "リリースノート抽出レビュー" \
--request-id release-notes-capture-20261110 <<'JS'
await page.goto('https://example.com/release-notes', {waitUntil: 'domcontentloaded'});
const result = await page.evaluate(() => {
const record = document.querySelector('[data-record-id="GEO-104"]');
if (!record) return null;
const fields = [
['Record ID', '[data-field="record-id"]'],
['Title', 'h1'],
['Status', '[data-field="status"]'],
['Date', 'time'],
];
const fragment = document.createElement('section');
for (const [label, selector] of fields) {
const element = record.querySelector(selector);
if (!element || !element.checkVisibility({ visibilityProperty: true })) continue;
const row = document.createElement('p');
row.textContent = label + ': ' + element.innerText.trim().slice(0, 500);
fragment.append(row);
}
return fragment.childElementCount ? fragment.outerHTML : null;
});
return {url: page.url(), html: result};
JS返された断片を確認し、許可された HTML を approved-record.html に保存してから Python の例を実行します。取り込み処理は許可された表示項目から HTML を作り直します。
セレクターは説明用です。ページを確認して安定したレコード領域を選び、HTML量を制限してください。この環境では、インストール済みCLI Skillが単独の--groupを受け付けないため付けません。ログインが必要なら許可されたTabbit環境と正しいアカウントを確認します。以前のローカルテストでは、短時間のテストセッションを作った後、別のCLIタスクから同じテストページを読めました。これはそのテスト環境のセッション再利用を示すだけで、外部サイトのアクセスや外部Agent連携を証明しません。
返却値のIDと重要項目を元タブで照合し、リリースノート確認稿 — GEO-104という名前のドラフトに保存します。レビュー時に元ページを開けるようタブを残し、Agentは自分のタスクタブで作業します。初回ブラウザーAgentタスクのチェックリストも参照してください。
Smallが向く場面と限界
HTMLが用意できていて、型の決まった出力が必要な場合はSmallを検討できます。ブラウザーAgentの代わりにはなりません。ローカルブラウザーが閲覧と許可済みセッションを担当し、Schematronが限定HTMLから抽出し、コードが型と根拠を確認し、人が例外をレビューします。
Inference.netはTurboを高スループット・低コスト、Smallを複雑スキーマ・長ページ向けに案内しています。自分のラベル付きデータで比較してください。レイアウトが一定なら通常のセレクターやAPIの方が簡単で安い場合があります。HTMLの構造が不規則ならスキーマ抽出で専用パーサーを減らせる可能性がありますが、監視は必要です。
Redditでは、2,000件以上の不規則なHTMLを扱う利用者が、入れ子の表や用語の違いで固定XPathが難しいと述べています。別のスクレイピング利用者は、本番ではLLMを抽出済みDOM要素の軽い推論層として使う経験を共有しています。いずれも個人の経験で、Schematron V2 Smallの試験ではありません。不規則HTMLの議論と本番利用の議論を参照してください。
繰り返しのブラウザー作業にはTabbit CLIガイド、CLIとBrowser MCPの比較、ブラウザープロファイル、ワークスペース、タブグループの違いが役立ちます。判断に使う結果には、値、元URL、レコードID、時刻、レビュー状態を保存します。スキーマに適合したJSONは引き継ぎに便利ですが、ページの解釈が正しい証明ではありません。
まずは許可された公開レコードを一件だけ取得し、必要な項目に絞ったスキーマで自分のAPIアカウントから実行します。値を元ページと照合してから範囲を広げてください。
ブラウザーAgentの担当範囲を決めるなら、エージェント型ブラウザーとは何かとブラウザー自動化を参照してください。抽出前の操作部分を説明しています。
よくある質問
Schematron V2 Smallは自分でWebサイトを開けますか?
いいえ。Inference.netはSchematronをHTML抽出モデルとして説明しています。ブラウザーなどでページを取得し、HTMLとスキーマをAPIに送る必要があります。
通常のプロンプトを受け取れますか?
公式ドキュメントによると、ユーザーやシステムの指示文は使いません。型、必須項目、説明を含むJSON Schemaに抽出ルールを記述します。
ログイン済みのページにも使えますか?
ローカルブラウザータスクに閲覧権限があり、内容をInference.netへ送信する許可があれば使えます。取得範囲を絞り、個人情報や機密項目を除いてください。
Schematron V2 SmallのモデルIDは何ですか?
Inference.netのドキュメントではinference-net/schematron-v2-smallです。利用前にモデル一覧とアカウント権限を確認してください。
SmallとTurboのどちらを選ぶべきですか?
Inference.netは複雑なスキーマや長いページの品質重視にSmall、大量処理の速度とコスト重視にTurboを案内しています。自分のデータで比較してください。
出力JSONを確認せず使えますか?
いいえ。スキーマ検証に加えて、重要な値を元ページのテキストと照合し、不明な項目は人が確認してください。形式が正しくても事実が正しいとは限りません。