本システムで扱うデータ定義です。記録時に各モジュール(YOLO、OCR、Python)が個別に取得する「生データ」の構造を先に行い、それらをコンテキスト理解や自己修復のために集約・紐付けした「統合データ」の構造を後ろに定義します。
JSONファイル自体の肥大化を防ぎ、かつ画像パスを決定論的に特定するため、マクロごとに一意なディレクトリ(workflow_ID)を作成し、リソースをカプセル化します。
macros/
└── wf_12345/ // workflow_IDをルートとする
├── integrated.json // 統合データ(1マクロにつき1つ)
├── workflow.json // ワークフローデータ(1マクロにつき1つ)
├── images/ // 画像格納用ディレクトリ
│ ├── evt_001_pre.png // 操作直前の全体スクリーンショット(※マウスクリックおよびキー操作の両方で生成)
│ ├── evt_001_crop.png // 操作対象UI要素のクロップ画像
│ ├── evt_002_pre.png
│ └── ...
└── temp/ // 一時データ格納ディレクトリ(統合・生成フェーズ完了後に自動破棄)
├── input_logs.json // リアルタイム操作の生ログ(1マクロにつき1つ)
├── evt_001_yolo.json // イベントごとのYOLO認識生データ
└── evt_001_ocr.json // イベントごとのOCR認識生データ
※操作直後(Post)のスクリーンショットに関する設計変更:
操作の直後に個別のスクリーンショット(post)を撮る仕様は廃止されました。これは、連続する「次の操作の直前(pre)」に撮影される画像が、実質的に前のアクションの直後状態を写していると判断できるためです。これにより、不要なキャプチャ処理のオーバーヘッドとストレージへの二重保存を防止します。
※生データおよび画像リソースのライフサイクルについて:
各モジュールが取得する生データ(YOLO、OCR、入力ログ)は、マクロの生成処理中にのみ temp/ ディレクトリ内へ一時的に保存され、生成完了後に自動破棄されます。また、images/ 内に保存されるスクリーンショットは、マウスクリック時だけでなくキーボード操作時(文字入力等)にも撮影がトリガーされます。ただし、連続したテキスト入力のように「画面の変化率が著しく低い操作」が続いた場合、ストレージ容量の圧迫やデータの冗長化を防ぐため、前回のスクリーンショットとの差分解析を行い、変化率が閾値未満のときは該当する低い画像を自動的に削除・間引きする最適化が実行されます。
解析モード(録画)中、各認識エンジンおよびフックモジュールが出力するデータ構造です(統合後に破棄)。
保存先階層: ai-macro-system/macros/wf_{workflow_ID}/temp/evt_{event_id}_yolo.json
| プロパティ (階層) | 型 | 説明・格納される値 |
|---|---|---|
| uiAnalysis.timestamp | number | 画像を取得・解析した時間(Unixタイムスタンプ) |
| uiAnalysis.boundingBox | object | 認識したUI要素のバウンディングボックス座標 {x, y, width, height} |
| uiAnalysis.type | string | 物体認識されたUIの種類(button, dropdown, input など) |
| uiAnalysis.confidence | number | AIによるUI認識の信頼度・精度 (0.0〜1.0) |
保存先階層: ai-macro-system/macros/wf_{workflow_ID}/temp/evt_{event_id}_ocr.json
| プロパティ (階層) | 型 | 説明・格納される値 |
|---|---|---|
| textAnalysis.timestamp | number | 画像を取得・解析した時間(Unixタイムスタンプ) |
| textAnalysis.boundingBox | object | 認識したテキスト領域のバウンディングボックス座標 {x, y, width, height} |
| textAnalysis.content | string | OCRエンジンにより読み取られた文字列内容 |
| textAnalysis.confidence | number | OCRによるテキスト認識の信頼度・精度 (0.0〜1.0) |
保存先階層: ai-macro-system/macros/wf_{workflow_ID}/temp/input_logs.json
| プロパティ (階層) | 型 | 説明・格納される値 |
|---|---|---|
| inputLog.timestamp | number | OSレベルで操作をフック・検出した時間(Unixタイムスタンプ) |
| inputLog.type | string | 入力操作の種類(click_down, key_down, mouse_scroll など) |
| inputLog.content | string | 具体的な入力内容(left_click, Enter, または入力文字など) |
| inputLog.windowName | string | 操作対象となったアプリケーションのウィンドウタイトル名 |
| inputLog.windowSize | object | 対象ウィンドウの全体サイズ {width, height} |
| inputLog.windowCoordinates | object | 対象ウィンドウのデスクトップ上における絶対座標 {x, y} |
| inputLog.cursorCoordinates | object | 操作が実行された瞬間のマウスカーソルの絶対座標 {x, y}(※キー操作時はNoneを許容) |
自律機能やAI生成コアが「コンテキスト理解」を確保するため、一時データをウィンドウ基準の階層型ツリー(DOMライク)に統合したデータモデルです。
※階層ツリー構築と推論誤差の吸収 (IoA判定):
YOLOやOCRが検出した要素の親子関係(包含関係)を構築する際、単なる座標の完全内包ではなく、交差面積率(IoA: Intersection over Area)を計算します。AIの推論による数ピクセルのはみ出しを許容するため、子要素の面積のうち閾値(例: 70%)以上が親要素と重なっていれば内包されていると判定し、堅牢なXMLライクのUIツリーを構築します。
保存先階層: ai-macro-system/macros/wf_{workflow_ID}/integrated.json
| プロパティ (階層) | 型 | 説明・格納される値 |
|---|---|---|
| id | string | 統合ログの一意なID (例: evt_001) |
| timestamp | number | アクション実行時のUnixタイムスタンプ |
| window.name | string | 操作対象となったアクティブウィンドウの名前(タイトル) |
| window.size | object | ウィンドウのサイズ {width, height} |
| window.coordinates | object | ウィンドウの画面上の絶対座標 {x, y} |
| window.UIs | array | 対象ウィンドウ内で認識され、操作に関与したUI要素の配列(ルート要素) |
| window.UIs[].type | string | UIの種類(form, container, button, input 等) |
| window.UIs[].relativeBoundingBox | object | 対象ウィンドウの左上を原点(0,0)とした相対座標とサイズ {x, y, width, height} |
| window.UIs[].confidence | number | AIによるUI認識精度 (0.0〜1.0) |
| window.UIs[].action | object | 当該UIに対して行われた入力操作の詳細(非インタラクティブ要素の場合はnull) |
| window.UIs[].action.inputType | string | 入力タイプ(click_down, key_down 等) |
| window.UIs[].action.inputValue | string | 入力内容(left_click, Enter 等) |
| window.UIs[].action.cursorRelativeCoordinates | object | 対象ウィンドウ内でのカーソル相対座標 {x, y} |
| window.UIs[].action.diffRatio | number | 操作による前画面変化率(待機判定に使用) |
| window.UIs[].context | array | UI要素を直接補足する周辺情報(テキストやアイコン等)の配列 |
| window.UIs[].context[].type | string | コンテキストの種類(text, icon 等) |
| window.UIs[].context[].content | string | 読み取られたテキストや記号の種類名 |
| window.UIs[].context[].relativeBoundingBox | object | 対象ウィンドウ内での相対座標とサイズ {x, y, width, height} |
| window.UIs[].context[].confidence | number | 認識精度 (0.0〜1.0) |
| window.UIs[].context[].parentRelevance | number | 親要素(対象UI)との関連度合い(距離や意味合いから算出) |
| window.UIs[].children | array | 子UI要素の配列(交差面積率による内包判定から再帰的に構築されるツリー構造) |
{
"id": "evt_012",
"timestamp": 1717654800123,
"window": {
"name": "社内システム - Google Chrome",
"size": { "width": 1920, "height": 1080 },
"coordinates": { "x": 0, "y": 0 },
"UIs": [
{
"type": "form",
"relativeBoundingBox": { "x": 1000, "y": 200, "width": 400, "height": 300 },
"confidence": 0.90,
"action": null,
"context": [],
"children": [
{
"type": "button",
"relativeBoundingBox": { "x": 1220, "y": 280, "width": 60, "height": 40 },
"confidence": 0.95,
"action": {
"inputType": "click_down",
"inputValue": "left_click",
"cursorRelativeCoordinates": { "x": 1250, "y": 300 },
"diffRatio": 0.12
},
"context": [
{
"type": "text",
"content": "保存する",
"relativeBoundingBox": { "x": 1225, "y": 285, "width": 50, "height": 30 },
"confidence": 0.98,
"parentRelevance": 0.99
}
],
"children": []
}
]
}
]
}
}
統合ログからAIによって抽出・生成され、実行エンジンへと引き渡されるマクロシナリオの構造です。本システムでは、あらゆるユーザー操作にスケーラブルに対応するため、「コマンドパターン」と「ユニバーサルセレクタ」を採用した抽象度の高い設計(Omnipotent Workflow)としています。
command(例: MOUSE_CLICK, KEYBOARD_SHORTCUT)として定義し、その実行に必要な変数を parameters オブジェクトにカプセル化します。これにより、将来新しい操作概念が追加された場合でも、JSONのルート構造を壊さずに拡張できます。variables.json に切り出し、workflow.json 内からは ${変数名} で参照します。AIは「何をすべきか(ロジック)」に集中でき、ユーザーはマクロを汎用的に使い回せます。保存先階層: ai-macro-system/macros/wf_{workflow_ID}/variables.json
| プロパティ | 型 | 説明・構造の意図 |
|---|---|---|
| (key_name) | string/number |
検索キーワード、対象ファイル名、URLなど、実行環境や目的に依存する具体的なデータ。 意図: ここに具体値を集約させることで、同じ操作手順のマクロであっても、このファイルの値を差し替えるだけで汎用的に転用可能にします。 |
保存先階層: ai-macro-system/macros/wf_{workflow_ID}/workflow.json
| プロパティ (階層) | 型 | 説明・構造の意図 |
|---|---|---|
| version | string | スキーマのバージョン(例: "2.0")。パーサーの後方互換性を担保するため。 |
| metadata | object | OS、画面解像度、所要時間などの実行環境メタデータ。マクロ共有時に環境差異を吸収するヒントとして使用。 |
| steps | array | 物理的な操作を意味的な作業単位に要約したステップの配列。 |
| steps[].intent | string |
標準化されたアクション分類(DRAG_AND_DROP, WAIT_FOR_PROCESS など)。 意図: AIや実行エンジンが「このステップで最終的に何を達成したいのか」を文脈として理解するためのフラグ。 |
| steps[].description | string | ステップの目的を説明する自然言語の文章(英語)。 |
| steps[].context | object |
実行前に満たすべき前提条件(アクティブなウィンドウ名など)。 意図: 予期せぬ画面での操作暴発を防ぐアサーション。修復エンジン(Healer)の復帰基準となります。 |
| steps[].action.command | string | 実行すべきシステムのルートコマンド(MOUSE_CLICK, MOUSE_DRAG, TYPE_TEXT, SYSTEM_WAIT 等)。 |
| steps[].action.parameters | object | コマンドの実行に必要なペイロード(変数群)。コマンドの種類に応じて動的に中身(target, destination, key, text等)が変わる多態性オブジェクト。 |
| ...parameters.target (UniversalSelector) |
object |
操作対象を特定するための複合情報(semantic_role, text_contains, image_template, absolute_coordinates)。意図: 一つのUIを探す際に、複数の手段(テキスト検索→画像検索→座標)をフォールバックとして持たせ、堅牢性を担保します。 |
| steps[].fallback_raw_events | array | この要約ステップの根拠となった統合ログ(integrated.json)の生イベントID。エラートレース用。 |
コマンドパターンとユニバーサルセレクタを採用した、あらゆる操作に対応可能なマクロの生成例です。
{
"target_file_name": "report_2026.pdf",
"search_keyword": "ai macro system"
}
{
"version": "2.0",
"workflow_ID": "wf_omnipotent_001",
"metadata": {
"os": "Windows",
"resolution": { "width": 1920, "height": 1080 },
"duration_ms": 15000
},
"steps": [
{
"step_id": 1,
"intent": "DRAG_AND_DROP",
"description": "Drag the specific file to the upload dropzone.",
"context": {
"active_window_name": "Explorer"
},
"action": {
"command": "MOUSE_DRAG",
"parameters": {
"target": {
"semantic_role": "listitem",
"text_contains": "${target_file_name}"
},
"destination": {
"semantic_role": "dropzone",
"image_template": "upload_area_template.png"
},
"button": "left"
}
},
"fallback_raw_events": ["evt_001", "evt_002"]
},
{
"step_id": 2,
"intent": "COPY_TEXT",
"description": "Copy the selected text using keyboard shortcuts.",
"context": {
"active_window_name": "Browser"
},
"action": {
"command": "KEYBOARD_SHORTCUT",
"parameters": {
"modifiers": ["control"],
"key": "c"
}
},
"fallback_raw_events": ["evt_003"]
},
{
"step_id": 3,
"intent": "WAIT_FOR_PROCESS",
"description": "Wait until the loading spinner disappears before proceeding.",
"context": {},
"action": {
"command": "SYSTEM_WAIT",
"parameters": {
"condition": "ELEMENT_NOT_VISIBLE",
"target": {
"semantic_role": "progressbar"
},
"timeout_ms": 10000
}
},
"fallback_raw_events": []
}
]
}
ユーザーが画面上の設定エリアから変更した接続先エンドポイントなどの情報を管理・永続化するためのデータ構造です。本ファイルはアプリケーションのルートディレクトリに配置されます。
保存先階層: ai-macro-system/config.json
| プロパティ | 型 | 説明・格納される値 |
|---|---|---|
| ai_mode | string | AIの動作モード("local" または "cloud") |
| llm_host | string | マクロ生成用AI(LLM)の接続先(IPアドレスまたはホスト名) |
| llm_port | string | LLM APIのポート番号。未指定時はデフォルトで "8844" を使用 |
| cv_host | string | Computer Vision API(YOLO/OCR)の接続先(IPアドレスまたはホスト名) |
| cv_port | string | Computer Vision APIのポート番号。未指定時はデフォルトで "8843" を使用 |
{
"ai_mode": "local",
"llm_host": "127.0.0.1",
"llm_port": "8844",
"cv_host": "192.168.1.10",
"cv_port": "8843"
}
実行エンジンが直接解釈可能な、メソッド名と解決済み引数を持つマクロ用JSONです。LLMが workflow.json の意図と integrated.json の座標データを組み合わせて生成した状態を表現し、実行時にそのまま使用されます。
保存先階層: ai-macro-system/macros/wf_{workflow_ID}/executable_macro.json (またはLLMからの直接返却)
| プロパティ (階層) | 型 | 説明・格納される値 |
|---|---|---|
| macro_id | string | マクロを一意に識別する識別子ID |
| target_application | string | 操作対象となる主要なアプリケーション名、またはウィンドウタイトル名 |
| commands | array | 実行エンジンがシーケンシャルに呼び出す実行コマンドオブジェクトの配列 |
| commands[].method | string | 呼び出す操作メソッド名。リテラル限定("wait", "click", "type_text", "press_key") |
| commands[].args | object | メソッドごとに定義される、実行時解決済みの引数オブジェクト(多態性データ構造) |
| ...args (method: "wait") | object | 待機コマンド用のペイロード。内包プロパティ: ・ duration (number): 次のコマンド実行まで待機する秒数 |
| ...args (method: "click") | object | マウスボタン入力用のペイロード。内包プロパティ: ・ x (number): デスクトップ上の絶対X座標・ y (number): デスクトップ上の絶対Y座標・ button (string): 使用ボタン("left", "right" など)・ clicks (number): クリック回数(1=シングル、2=ダブル) |
| ...args (method: "type_text") | object | キーボード文字列入力用のペイロード。内包プロパティ: ・ text (string): フォーム等に直接流し込む入力対象の文字列内容 |
| ...args (method: "press_key") | object | 単発の特殊キー制御用のペイロード。内包プロパティ: ・ key (string): 入力するキー名("tab", "enter", "esc" など) |
Webブラウザ上の業務システム(顧客管理システムや経費精算など)で、「新規登録ボタンを押し、フォームに社名とメールアドレスを入力して保存する」といった一般的なデータ入力作業を想定した例です。
{
"macro_id": "macro_002_customer_registration",
"target_application": "Google Chrome - 顧客管理システム",
"commands": [
{
"method": "wait",
"args": {
"duration": 1.0
}
},
{
"method": "click",
"args": {
"x": 1200,
"y": 150,
"button": "left",
"clicks": 1
}
},
{
"method": "wait",
"args": {
"duration": 0.5
}
},
{
"method": "click",
"args": {
"x": 400,
"y": 300,
"button": "left",
"clicks": 1
}
},
{
"method": "type_text",
"args": {
"text": "株式会社テスト"
}
},
{
"method": "press_key",
"args": {
"key": "tab"
}
},
{
"method": "type_text",
"args": {
"text": "info@example.com"
}
},
{
"method": "click",
"args": {
"x": 400,
"y": 600,
"button": "left",
"clicks": 1
}
}
]
}
wait): 1秒待機し、システムの画面が完全に表示されるのを待ちます。click): 画面右上(例: x=1200, y=150)にあるボタンをクリックします。wait): 入力フォームが開くのを0.5秒待ちます。click): 入力欄(例: x=400, y=300)をクリックしてカーソルを合わせます。type_text): "株式会社テスト" という文字列を直接入力します。press_key): tab キーを押下し、マウスを使わずに次の「メールアドレス」入力欄へフォーカスを移動させます。type_text): "info@example.com" を入力します。click): 画面下部(例: x=400, y=600)の保存ボタンをクリックして完了します。事務作業の場合、マウスによる座標クリック(click)だけでなく、入力効率の高い tab キーでの移動(press_key)や、まとまった文字列の流し込み(type_text)が多用されます。このデータ構造により、そうしたRPA特有の挙動も無理なく表現できます。