Agent API (window.midas)

AI エージェントや Playwright などの外部ツールから MIDAS をプログラムで操作するための API です。

概要

window.midas は、ブラウザの DevTools コンソールや Playwright などの自動化ツールから MIDAS の機能にアクセスするための JavaScript API です。データセットの操作、タブの管理、統計モデルの実行、レポートの編集などを行えます。

API が利用可能なタイミング

  • プロジェクト画面: すべてのメソッドが利用可能
  • ランチャー画面: help() のみ利用可能。他のメソッドは NO_PROJECT エラーを返す

使い方

DevTools コンソールから使う

ブラウザの DevTools を開き、コンソールで直接呼び出します。

// プロジェクトの状態を確認
const result = await window.midas.status();
console.log(result.data);
// { datasets: 3, tabs: 2, models: 1, ... }

Playwright から使う

const result = await page.evaluate(async () => {
  return await window.midas.datasets.list();
});
console.log(result.data);
// [{ id: '...', name: 'Iris', rows: 150, columns: 5, type: 'primary' }, ...]

ヘルプを表示する

help() メソッドで、利用可能なメソッドの一覧とシグネチャを確認できます。

const help = window.midas.help();
console.log(help);

レスポンス形式

help() を除くすべてのメソッドは非同期で、APIResult<T> 型の統一されたレスポンスを返します。help() のみ同期メソッドで、HelpInfo オブジェクトを直接返します。

// 成功時
{
  success: true,
  message: "Found 3 datasets",
  data: [...]
}

// 失敗時
{
  success: false,
  message: "Dataset not found",
  error: {
    code: "NOT_FOUND",
    message: "No dataset with ID 'abc'",
    suggestion: "Use datasets.list() to see available datasets"
  }
}

warnings フィールドが含まれる場合もあります。処理自体は成功していますが、注意が必要な点を示します。

メソッド一覧

status()

プロジェクトの状態を取得します。

const result = await window.midas.status();
// result.data:
// {
//   datasets: 3,
//   derivedDatasets: 1,
//   tabs: 2,
//   models: 1,
//   reports: 1,
//   activeDatasetId: 'ds_001',
//   activeTabId: 'tab_001'
// }

datasets

datasets.list()

プロジェクト内のデータセット一覧を取得します。

const result = await window.midas.datasets.list();
// result.data: [{ id, name, rows, columns, type }, ...]

type'primary'(読み込んだデータ)、'derived'(SQL やその他の操作で作成)、'ephemeral'(一時的)のいずれかです。

datasets.describe(id)

データセットの詳細情報を取得します。

const result = await window.midas.datasets.describe('ds_001');
// result.data:
// {
//   id: 'ds_001',
//   name: 'Iris',
//   type: 'primary',
//   rowCount: 150,
//   columns: [
//     { id: 'col_001', name: 'sepal_length', type: 'float64', scale: 'ratio' },
//     { id: 'col_002', name: 'species', type: 'string', scale: 'nominal' },
//     ...
//   ]
// }

datasets.query(sql, name, options?)

SQL クエリを実行し、結果を新しい派生データセットとして保存します。

const result = await window.midas.datasets.query(
  'SELECT species, AVG(sepal_length) as avg_sl FROM Iris GROUP BY species',
  'Species Averages'
);
// result.data: { datasetId: 'derived_...', name: 'Species Averages', rowCount: 3, columnCount: 2 }

テーブル名はデータセット名から自動解決されます(大文字小文字を区別しません)。デフォルトでは同名の派生データセットが存在する場合に自動的に上書き(既存を削除して新規作成)します。options.overwritefalse にすると、同名の派生データセットが既に存在する場合にエラーを返します。

tabs

tabs.list()

開いているタブの一覧を取得します。

const result = await window.midas.tabs.list();
// result.data: [{ id, type, title }, ...]

tabs.open(config)

新しいタブを開きます。

// Graph Builder を開く
const result = await window.midas.tabs.open({
  type: 'graph-builder',
  title: 'My Graph',
  datasetId: 'ds_001'
});
// result.data: { tabId: 'tab_...', type: 'graph-builder', title: 'My Graph' }

// SQL Editor を開く
const result2 = await window.midas.tabs.open({
  type: 'sql-editor',
  initialQuery: 'SELECT * FROM Iris LIMIT 10',
  initialOutputName: 'Preview'
});

利用可能なタブタイプは help() で確認できます。

tabs.close(id)

タブを閉じます。

await window.midas.tabs.close('tab_001');

tabs.closeOthers(keepTabId)

指定したタブ以外をすべて閉じます。

const result = await window.midas.tabs.closeOthers('tab_001');
// result.data: { closedCount: 3 }

tabs.getGraphBuilder(tabId)

Graph Builder タブの設定を取得します。

const result = await window.midas.tabs.getGraphBuilder('tab_001');
// result.data: { tabId, graphType, datasetId, config, aspectRatio }

tabs.updateGraphBuilder(tabId, config)

Graph Builder タブの設定を更新します。

await window.midas.tabs.updateGraphBuilder('tab_001', {
  graphType: 'custom',
  datasetId: 'ds_001'
});

tabs.addGraphLayer(tabId, layer)

カスタムグラフにレイヤーを追加します。graphType'custom' のタブでのみ使用できます。

const result = await window.midas.tabs.addGraphLayer('tab_001', {
  geom: { type: 'point' },
  aes: { x: 'col_sepal_length', y: 'col_sepal_width', color: 'col_species' },
  stats: [{ type: 'identity' }]
});
// result.data: { layerIndex: 0 }

Aesthetic マッピング (aes) ではカラム ID を指定します。固定色を使う場合は { fixedColor: '#FF0000' } 形式で指定できます。

tabs.updateGraphLayer(tabId, layerIndex, layer)

既存のレイヤーを部分更新します。

await window.midas.tabs.updateGraphLayer('tab_001', 0, {
  geom: { type: 'line' }
});

tabs.removeGraphLayer(tabId, layerIndex)

レイヤーを削除します。

await window.midas.tabs.removeGraphLayer('tab_001', 0);

tabs.moveToPane(tabId, toPaneId)

タブを別のペインに移動します。layout.split() で作成したペインの ID を指定します。

await window.midas.tabs.moveToPane('tab_001', 'pane_002');

models

models.list()

訓練済みモデルの一覧を取得します。

const result = await window.midas.models.list();
// result.data: [{ id, type, name, datasetId, family }, ...]

models.run(config)

統計モデルを実行します。カラムは名前で指定でき、大文字小文字を区別しません。

const result = await window.midas.models.run({
  type: 'glm',
  datasetId: 'ds_001',
  yColumn: 'sepal_length',
  xColumns: ['sepal_width', 'petal_length'],
  family: 'gaussian'
});
// result.data: { tabId: 'tab_...', type: 'glm', title: 'GLM' }

type'glm''glmm''random-forest' のいずれかです。family は GLM の場合に指定し、'gaussian''binomial''poisson''gamma''negative-binomial' から選択します。link でリンク関数('identity''logit''log''inverse''probit')を指定できます。GLMM の場合は groupColumn でグループ変数を指定します。

models.describe(id)

モデルの詳細を取得します。GLM、GLMM、Random Forest に対応しています。レスポンス構造はモデルタイプにより異なります(result.data.type で判別)。

GLM: 係数、適合度指標(AIC, BIC, deviance)、診断サマリーを返します。

GLMM: 固定効果(GLM の係数と同形式)、ランダム効果(グループ変数、分散、ICC、BLUP)、適合度指標(AIC, BIC, deviance, REML 対数尤度)、診断サマリーを返します。

Random Forest: タスクタイプ(classification/regression)、ハイパーパラメータ、変数重要度(保存されている場合)を返します。

const result = await window.midas.models.describe('model_001');
// GLM の例 - result.data:
// {
//   type: 'glm',
//   coefficients: [
//     { variable: '(Intercept)', estimate: 2.25, se: 0.31, z: 7.23, p: 0.0001 },
//     { variable: 'sepal_width', estimate: 0.60, se: 0.09, z: 6.45, p: 0.0001 },
//     ...
//   ],
//   fit: { aic: 183.94, bic: 193.47, converged: true, ... },
//   ...
// }

reports

reports.list()

レポートの一覧を取得します。

const result = await window.midas.reports.list();
// result.data: [{ id, name, elementCount }, ...]

reports.addContent(reportId, markdown)

レポートに Markdown テキストを追加します。

await window.midas.reports.addContent('report_001', '## Analysis Results\n\nThe model shows...');

reports.addModelSummary(reportId, modelId)

モデルのサマリーを Markdown としてレポートに追加します。GLM、GLMM、Random Forest に対応しています。

await window.midas.reports.addModelSummary('report_001', 'model_001');

layout

layout.split(config)

ペインを分割して新しい領域を作成します。

const result = await window.midas.layout.split({
  tabId: 'tab_001',
  direction: 'horizontal'  // 'horizontal' または 'vertical'
});
// result.data: { newPaneId: 'pane_...', originalPaneId: 'pane_...' }

返された newPaneIdtabs.moveToPane() に渡すことで、タブを新しいペインに配置できます。

主要なエラーコード

コード説明
NO_PROJECTプロジェクトが読み込まれていない
NOT_FOUND指定したリソースが見つからない
COLUMN_NOT_FOUNDカラムが見つからない
INVALID_TAB_TYPEタブタイプが無効
INVALID_GRAPH_TYPEカスタムグラフ以外でレイヤー操作を試みた
INDEX_OUT_OF_RANGEレイヤーインデックスが範囲外
DATASET_ALREADY_EXISTS同名のデータセットが既に存在する(overwrite: false 時)
AMBIGUOUS_TABLE_NAMEテーブル名に case-insensitive で複数のデータセットがマッチした
EXECUTION_ERRORSQL 実行エラー
UNSUPPORTED_MODEL_TYPE未対応のモデルタイプ

参考

  • ライブリファレンス: プロジェクト画面で window.midas.help() を実行
  • 型定義: src/app/agent-api/types.ts