claude-d3js-skill
d3.jsを使用して、高度でインタラクティブなデータビジュアライゼーションを作成するためのガイダンスを提供するスキルです。グラフやチャートの実装から複雑なビジュアル表現まで、d3.jsを活用したデータの視覚化をサポートします。
description の原文を見る
This skill provides guidance for creating sophisticated, interactive data visualisations using d3.js.
SKILL.md 本文
D3.js ビジュアライゼーション
概要
このスキルは、d3.js を使用して洗練されたインタラクティブなデータビジュアライゼーションを作成するためのガイダンスを提供します。D3.js (Data-Driven Documents) は、データを DOM 要素にバインドし、データドリブンな変換を適用して、すべてのビジュアル要素を精密に制御できるカスタム出版品質のビジュアライゼーションを作成することに優れています。これらの技術は、vanilla JavaScript、React、Vue、Svelte、その他のフレームワークなど、あらゆる JavaScript 環境で機能します。
d3.js を使用する場合
d3.js を使用するべき場合:
- ユニークなビジュアルエンコーディングまたはレイアウトが必要なカスタムビジュアライゼーション
- 複雑なパン、ズーム、またはブラッシュ動作を伴うインタラクティブな探索
- ネットワーク/グラフビジュアライゼーション(力指向レイアウト、ツリー図、階層構造、コード図)
- カスタム投影法による地理的ビジュアライゼーション
- スムーズでオーケストレーションされた遷移が必要なビジュアライゼーション
- 細かい制御が可能な出版品質のグラフィックス
- 標準ライブラリで利用できない新規チャートタイプ
代替案を検討すべき場合:
- 3D ビジュアライゼーション - Three.js を代わりに使用してください
コアワークフロー
1. d3.js の設定
スクリプトの最上部で d3 をインポートします:
import * as d3 from 'd3';
または CDN バージョン (7.x) を使用します:
<script src="https://d3js.org/d3.v7.min.js"></script>
すべてのモジュール(スケール、軸、シェイプ、遷移など)は d3 名前空間を通じてアクセスできます。
2. 統合パターンの選択
パターン A: 直接 DOM 操作(ほとんどの場合に推奨) d3 を使用して DOM 要素を選択し、命令型で操作します。これはあらゆる JavaScript 環境で機能します:
function drawChart(data) {
if (!data || data.length === 0) return;
const svg = d3.select('#chart'); // ID、クラス、または DOM 要素で選択
// 前のコンテンツをクリア
svg.selectAll("*").remove();
// サイズを設定
const width = 800;
const height = 400;
const margin = { top: 20, right: 30, bottom: 40, left: 50 };
// スケール、軸を作成し、ビジュアライゼーションを描画
// ... d3 コードはここに ...
}
// データが変更されたときに呼び出す
drawChart(myData);
パターン B: 宣言型レンダリング(テンプレート機能を持つフレームワーク用) d3 をデータ計算(スケール、レイアウト)に使用しますが、要素はフレームワーク経由でレンダリングします:
function getChartElements(data) {
const xScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.value)])
.range([0, 400]);
return data.map((d, i) => ({
x: 50,
y: i * 30,
width: xScale(d.value),
height: 25
}));
}
// React では: {getChartElements(data).map((d, i) => <rect key={i} {...d} fill="steelblue" />)}
// Vue では: 返されたarray上でv-forディレクティブを使用
// vanilla JS では: 返されたデータから要素を手動で作成
複雑なビジュアライゼーション、遷移、インタラクション、または d3 の全機能を活用する場合はパターン A を使用します。シンプルなビジュアライゼーションまたはフレームワークが宣言型レンダリングを好む場合はパターン B を使用します。
3. ビジュアライゼーションコードの構造化
描画関数で次の標準構造に従います:
function drawVisualization(data) {
if (!data || data.length === 0) return;
const svg = d3.select('#chart'); // またはセレクタ/要素を渡す
svg.selectAll("*").remove(); // 前のレンダリングをクリア
// 1. サイズを定義
const width = 800;
const height = 400;
const margin = { top: 20, right: 30, bottom: 40, left: 50 };
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
// 2. マージンを持つメイングループを作成
const g = svg.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`);
// 3. スケールを作成
const xScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.x)])
.range([0, innerWidth]);
const yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.y)])
.range([innerHeight, 0]); // 注記: SVG 座標のため反転
// 4. 軸を作成して追加
const xAxis = d3.axisBottom(xScale);
const yAxis = d3.axisLeft(yScale);
g.append("g")
.attr("transform", `translate(0,${innerHeight})`)
.call(xAxis);
g.append("g")
.call(yAxis);
// 5. データをバインドしてビジュアル要素を作成
g.selectAll("circle")
.data(data)
.join("circle")
.attr("cx", d => xScale(d.x))
.attr("cy", d => yScale(d.y))
.attr("r", 5)
.attr("fill", "steelblue");
}
// データが変更されたときに呼び出す
drawVisualization(myData);
4. レスポンシブサイズの実装
コンテナサイズに対応したビジュアライゼーションを作成します:
function setupResponsiveChart(containerId, data) {
const container = document.getElementById(containerId);
const svg = d3.select(`#${containerId}`).append('svg');
function updateChart() {
const { width, height } = container.getBoundingClientRect();
svg.attr('width', width).attr('height', height);
// 新しいサイズでビジュアライゼーションを再描画
drawChart(data, svg, width, height);
}
// 初期ロード時に更新
updateChart();
// ウィンドウリサイズ時に更新
window.addEventListener('resize', updateChart);
// クリーンアップ関数を返す
return () => window.removeEventListener('resize', updateChart);
}
// 使用法:
// const cleanup = setupResponsiveChart('chart-container', myData);
// cleanup(); // コンポーネントのアンマウント時または要素削除時に呼び出す
またはより直接的なコンテナモニタリング用に ResizeObserver を使用します:
function setupResponsiveChartWithObserver(svgElement, data) {
const observer = new ResizeObserver(() => {
const { width, height } = svgElement.getBoundingClientRect();
d3.select(svgElement)
.attr('width', width)
.attr('height', height);
// ビジュアライゼーションを再描画
drawChart(data, d3.select(svgElement), width, height);
});
observer.observe(svgElement.parentElement);
return () => observer.disconnect();
}
一般的なビジュアライゼーションパターン
棒グラフ
function drawBarChart(data, svgElement) {
if (!data || data.length === 0) return;
const svg = d3.select(svgElement);
svg.selectAll("*").remove();
const width = 800;
const height = 400;
const margin = { top: 20, right: 30, bottom: 40, left: 50 };
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const g = svg.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`);
const xScale = d3.scaleBand()
.domain(data.map(d => d.category))
.range([0, innerWidth])
.padding(0.1);
const yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.value)])
.range([innerHeight, 0]);
g.append("g")
.attr("transform", `translate(0,${innerHeight})`)
.call(d3.axisBottom(xScale));
g.append("g")
.call(d3.axisLeft(yScale));
g.selectAll("rect")
.data(data)
.join("rect")
.attr("x", d => xScale(d.category))
.attr("y", d => yScale(d.value))
.attr("width", xScale.bandwidth())
.attr("height", d => innerHeight - yScale(d.value))
.attr("fill", "steelblue");
}
// 使用法:
// drawBarChart(myData, document.getElementById('chart'));
折れ線グラフ
const line = d3.line()
.x(d => xScale(d.date))
.y(d => yScale(d.value))
.curve(d3.curveMonotoneX); // スムーズな曲線
g.append("path")
.datum(data)
.attr("fill", "none")
.attr("stroke", "steelblue")
.attr("stroke-width", 2)
.attr("d", line);
散布図
g.selectAll("circle")
.data(data)
.join("circle")
.attr("cx", d => xScale(d.x))
.attr("cy", d => yScale(d.y))
.attr("r", d => sizeScale(d.size)) // オプション: サイズエンコーディング
.attr("fill", d => colourScale(d.category)) // オプション: 色エンコーディング
.attr("opacity", 0.7);
コード図
コード図は円形レイアウトでエンティティ間の関係を表示し、リボンがそれら間のフローを表します:
function drawChordDiagram(data) {
// data フォーマット: source、target、value を持つオブジェクトの配列
// 例: [{ source: 'A', target: 'B', value: 10 }, ...]
if (!data || data.length === 0) return;
const svg = d3.select('#chart');
svg.selectAll("*").remove();
const width = 600;
const height = 600;
const innerRadius = Math.min(width, height) * 0.3;
const outerRadius = innerRadius + 30;
// データからマトリックスを作成
const nodes = Array.from(new Set(data.flatMap(d => [d.source, d.target])));
const matrix = Array.from({ length: nodes.length }, () => Array(nodes.length).fill(0));
data.forEach(d => {
const i = nodes.indexOf(d.source);
const j = nodes.indexOf(d.target);
matrix[i][j] += d.value;
matrix[j][i] += d.value;
});
// コードレイアウトを作成
const chord = d3.chord()
.padAngle(0.05)
.sortSubgroups(d3.descending);
const arc = d3.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
const ribbon = d3.ribbon()
.source(d => d.source)
.target(d => d.target);
const colourScale = d3.scaleOrdinal(d3.schemeCategory10)
.domain(nodes);
const g = svg.append("g")
.attr("transform", `translate(${width / 2},${height / 2})`);
const chords = chord(matrix);
// リボンを描画
g.append("g")
.attr("fill-opacity", 0.67)
.selectAll("path")
.data(chords)
.join("path")
.attr("d", ribbon)
.attr("fill", d => colourScale(nodes[d.source.index]))
.attr("stroke", d => d3.rgb(colourScale(nodes[d.source.index])).darker());
// グループ(アーク)を描画
const group = g.append("g")
.selectAll("g")
.data(chords.groups)
.join("g");
group.append("path")
.attr("d", arc)
.attr("fill", d => colourScale(nodes[d.index]))
.attr("stroke", d => d3.rgb(colourScale(nodes[d.index])).darker());
// ラベルを追加
group.append("text")
.each(d => { d.angle = (d.startAngle + d.endAngle) / 2; })
.attr("dy", "0.31em")
.attr("transform", d => `rotate(${(d.angle * 180 / Math.PI) - 90})translate(${outerRadius + 30})${d.angle > Math.PI ? "rotate(180)" : ""}`)
.attr("text-anchor", d => d.angle > Math.PI ? "end" : null)
.text((d, i) => nodes[i])
.style("font-size", "12px");
}
ヒートマップ
ヒートマップは 2 次元グリッドの値をエンコードするために色を使用し、カテゴリ全体のパターンを表示するのに便利です:
function drawHeatmap(data) {
// data フォーマット: row、column、value を持つオブジェクトの配列
// 例: [{ row: 'A', column: 'X', value: 10 }, ...]
if (!data || data.length === 0) return;
const svg = d3.select('#chart');
svg.selectAll("*").remove();
const width = 800;
const height = 600;
const margin = { top: 100, right: 30, bottom: 30, left: 100 };
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
// ユニークな行と列を取得
const rows = Array.from(new Set(data.map(d => d.row)));
const columns = Array.from(new Set(data.map(d => d.column)));
const g = svg.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`);
// スケールを作成
const xScale = d3.scaleBand()
.domain(columns)
.range([0, innerWidth])
.padding(0.01);
const yScale = d3.scaleBand()
.domain(rows)
.range([0, innerHeight])
.padding(0.01);
// 値用の色スケール
const colourScale = d3.scaleSequential(d3.interpolateYlOrRd)
.domain([0, d3.max(data, d => d.value)]);
// 矩形を描画
g.selectAll("rect")
.data(data)
.join("rect")
.attr("x", d => xScale(d.column))
.attr("y", d => yScale(d.row))
.attr("width", xScale.bandwidth())
.attr("height", yScale.bandwidth())
.attr("fill", d => colourScale(d.value));
// X 軸ラベルを追加
svg.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`)
.selectAll("text")
.data(columns)
.join("text")
.attr("x", d => xScale(d) + xScale.bandwidth() / 2)
.attr("y", -10)
.attr("text-anchor", "middle")
.text(d => d)
.style("font-size", "12px");
// Y 軸ラベルを追加
svg.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`)
.selectAll("text")
.data(rows)
.join("text")
.attr("x", -10)
.attr("y", d => yScale(d) + yScale.bandwidth() / 2)
.attr("dy", "0.35em")
.attr("text-anchor", "end")
.text(d => d)
.style("font-size", "12px");
// 色凡例を追加
const legendWidth = 20;
const legendHeight = 200;
const legend = svg.append("g")
.attr("transform", `translate(${width - 60},${margin.top})`);
const legendScale = d3.scaleLinear()
.domain(colourScale.domain())
.range([legendHeight, 0]);
const legendAxis = d3.axisRight(legendScale)
.ticks(5);
// 凡例に色グラデーションを描画
for (let i = 0; i < legendHeight; i++) {
legend.append("rect")
.attr("y", i)
.attr("width", legendWidth)
.attr("height", 1)
.attr("fill", colourScale(legendScale.invert(i)));
}
legend.append("g")
.attr("transform", `translate(${legendWidth},0)`)
.call(legendAxis);
}
円グラフ
const pie = d3.pie()
.value(d => d.value)
.sort(null);
const arc = d3.arc()
.innerRadius(0)
.outerRadius(Math.min(width, height) / 2 - 20);
const colourScale = d3.scaleOrdinal(d3.schemeCategory10);
const g = svg.append("g")
.attr("transform", `translate(${width / 2},${height / 2})`);
g.selectAll("path")
.data(pie(data))
.join("path")
.attr("d", arc)
.attr("fill", (d, i) => colourScale(i))
.attr("stroke", "white")
.attr("stroke-width", 2);
力指向ネットワーク
const simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id).distance(100))
.force("charge", d3.forceManyBody().strength(-300))
.force("center", d3.forceCenter(width / 2, height / 2));
const link = g.selectAll("line")
.data(links)
.join("line")
.attr("stroke", "#999")
.attr("stroke-width", 1);
const node = g.selectAll("circle")
.data(nodes)
.join("circle")
.attr("r", 8)
.attr("fill", "steelblue")
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
simulation.on("tick", () => {
link
.attr("x1", d => d.source.x)
.attr("y1", d => d.source.y)
.attr("x2", d => d.target.x)
.attr("y2", d => d.target.y);
node
.attr("cx", d => d.x)
.attr("cy", d => d.y);
});
function dragstarted(event) {
if (!event.active) simulation.alphaTarget(0.3).restart();
event.subject.fx = event.subject.x;
event.subject.fy = event.subject.y;
}
function dragged(event) {
event.subject.fx = event.x;
event.subject.fy = event.y;
}
function dragended(event) {
if (!event.active) simulation.alphaTarget(0);
event.subject.fx = null;
event.subject.fy = null;
}
インタラクティブ性の追加
ツールチップ
// ツールチップ div を作成(SVG の外部)
const tooltip = d3.select("body").append("div")
.attr("class", "tooltip")
.style("position", "absolute")
.style("visibility", "hidden")
.style("background-color", "white")
.style("border", "1px solid #ddd")
.style("padding", "10px")
.style("border-radius", "4px")
.style("pointer-events", "none");
// 要素に追加
circles
.on("mouseover", function(event, d) {
d3.select(this).attr("opacity", 1);
tooltip
.style("visibility", "visible")
.html(`<strong>${d.label}</strong><br/>Value: ${d.value}`);
})
.on("mousemove", function(event) {
tooltip
.style("top", (event.pageY - 10) + "px")
.style("left", (event.pageX + 10) + "px");
})
.on("mouseout", function() {
d3.select(this).attr("opacity", 0.7);
tooltip.style("visibility", "hidden");
});
ズームとパン
const zoom = d3.zoom()
.scaleExtent([0.5, 10])
.on("zoom", (event) => {
g.attr("transform", event.transform);
});
svg.call(zoom);
クリックインタラクション
circles
.on("click", function(event, d) {
// クリックを処理(イベント送出、アプリ状態の更新など)
console.log("Clicked:", d);
// ビジュアルフィードバック
d3.selectAll("circle").attr("fill", "steelblue");
d3.select(this).attr("fill", "orange");
// オプション: フレームワーク/アプリがリッスンするカスタムイベントをディスパッチ
// window.dispatchEvent(new CustomEvent('chartClick', { detail: d }));
});
遷移とアニメーション
ビジュアルな変更にスムーズな遷移を追加します:
// 基本的な遷移
circles
.transition()
.duration(750)
.attr("r", 10);
// チェーンされた遷移
circles
.transition()
.duration(500)
.attr("fill", "orange")
.transition()
.duration(500)
.attr("r", 15);
// スタッガード遷移
circles
.transition()
.delay((d, i) => i * 50)
.duration(500)
.attr("cy", d => yScale(d.value));
// カスタムイージング
circles
.transition()
.duration(1000)
.ease(d3.easeBounceOut)
.attr("r", 10);
スケールリファレンス
定量的スケール
// リニアスケール
const xScale = d3.scaleLinear()
.domain([0, 100])
.range([0, 500]);
// ログスケール(指数データ用)
const logScale = d3.scaleLog()
.domain([1, 1000])
.range([0, 500]);
// パワースケール
const powScale = d3.scalePow()
.exponent(2)
.domain([0, 100])
.range([0, 500]);
// タイムスケール
const timeScale = d3.scaleTime()
.domain([new Date(2020, 0, 1), new Date(2024, 0, 1)])
.range([0, 500]);
順序スケール
// バンドスケール(棒グラフ用)
const bandScale = d3.scaleBand()
.domain(['A', 'B', 'C', 'D'])
.range([0, 400])
.padding(0.1);
// ポイントスケール(折れ線/散布図のカテゴリ用)
const pointScale = d3.scalePoint()
.domain(['A', 'B', 'C', 'D'])
.range([0, 400]);
// 順序スケール(色用)
const colourScale = d3.scaleOrdinal(d3.schemeCategory10);
連続的スケール
// 連続的色スケール
const colourScale = d3.scaleSequential(d3.interpolateBlues)
.domain([0, 100]);
// 発散色スケール
const divScale = d3.scaleDiverging(d3.interpolateRdBu)
.domain([-10, 0, 10]);
ベストプラクティス
データの準備
ビジュアライゼーションの前に常にデータを検証して準備します:
// 無効な値をフィルタリング
const cleanData = data.filter(d => d.value != null && !isNaN(d.value));
// 順序が重要な場合はデータをソート
const sortedData = [...data].sort((a, b) => b.value - a.value);
// 日付をパース
const parsedData = data.map(d => ({
...d,
date: d3.timeParse("%Y-%m-%d")(d.date)
}));
パフォーマンス最適化
大規模なデータセット(>1000 要素)の場合:
// SVG の代わりに canvas を使用
// 衝突検出用に quadtree を使用
// d3.line().curve(d3.curveStep) でパスを簡略化
// 大規模なリスト用に仮想スクロールを実装
// カスタムアニメーション用に requestAnimationFrame を使用
アクセシビリティ
ビジュアライゼーションをアクセスしやすくします:
// ARIA ラベルを追加
svg.attr("role", "img")
.attr("aria-label", "四半期収益を示す棒グラフ");
// タイトルと説明を追加
svg.append("title").text("2024年四半期収益");
svg.append("desc").text("4つの四半期全体の収益成長を示す棒グラフ");
// 十分な色コントラストを確保
// インタラクティブ要素のキーボードナビゲーションを提供
// データテーブルの代替案を含める
スタイリング
一貫した専門的なスタイリングを使用します:
// 色パレットを事前に定義
const colours = {
primary: '#4A90E2',
secondary: '#7B68EE',
background: '#F5F7FA',
text: '#333333',
gridLines: '#E0E0E0'
};
// 一貫したタイポグラフィを適用
svg.selectAll("text")
.style("font-family", "Inter, sans-serif")
.style("font-size", "12px");
// 微妙なグリッドラインを使用
g.selectAll(".tick line")
.attr("stroke", colours.gridLines)
.attr("stroke-dasharray", "2,2");
一般的な問題と解決策
問題: 軸が表示されない
- スケールが有効なドメインを持つことを確認(NaN 値をチェック)
- 軸が正しいグループに追加されていることを確認
- 変換の翻訳が正しいことを確認
問題: 遷移が機能しない
- 属性の変更前に
.transition()を呼び出す - 要素が適切なデータバインディング用に固有のキーを持つことを確認
- useEffect の依存関係にすべての変更データが含まれていることを確認
問題: レスポンシブサイズが機能しない
- ResizeObserver またはウィンドウリサイズリスナーを使用
- 再レンダリングをトリガーするために状態のサイズを更新
- SVG に width/height 属性または viewBox があることを確認
問題: パフォーマンスの問題
- DOM 要素の数を制限(>1000 個の項目には canvas を検討)
- リサイズハンドラーをデバウンス
- 個別の enter/update/exit 選択の代わりに
.join()を使用 - 依存関係をチェックして不要な再レンダリングを回避
リソース
references/
詳細なリファレンス資料が含まれています:
d3-patterns.md- ビジュアライゼーションパターンとコード例の包括的なコレクションscale-reference.md- d3 スケールの完全ガイドと例colour-schemes.md- D3 色スキームとパレットの推奨事項
assets/
ボイラープレートテンプレートが含まれています:
chart-template.js- 基本的なチャート用のスターターテンプレートinteractive-template.js- ツールチップ、ズーム、インタラクション付きテンプレートsample-data.json- テスト用のサンプルデータセット
これらのテンプレートは vanilla JavaScript、React、Vue、Svelte、またはその他の JavaScript 環境で機能します。必要に応じて特定のフレームワーク用に調整してください。
これらのリソースを使用するには、特定のビジュアライゼーションタイプやパターンについて詳細なガイダンスが必要な場合は関連するファイルを読んでください。
制限事項
- このスキルは上記で説明されたスコープと明確に一致するタスクの場合のみ使用してください。
- 出力を環境固有の検証、テスト、または専門家のレビューの代替と見なさないでください。
- 必要な入力、許可、安全性の境界、または成功基準が不足している場合は停止して明確化を求めてください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。