Antigravity リモートエージェント活用ガイド
Antigravity のリモートエージェント機能により、SSH接続先のサーバーやクラウドVM上でAIエージェントを実行できます。ローカルマシンのリソースを消費することなく、大規模なデータ処理やバッチ自動化を実現する強力な機能です。
リモートエージェントの概要
リモートエージェントは、Antigravity がSSH経由で接続したサーバー上で動作するAIエージェントです。以下のような用途に適しています。
- 大規模データ処理: テラバイト級のログ解析やファイル変換
- 長時間実行タスク: 数時間~数日のバッチ処理
- リソース集約的な作業: 機械学習モデルの训练やコンパイル
- 本番環境での自動修復: インシデント対応の自動化
- 分散マルチサーバー処理: 複数のサーバーを並列活用
SSH接続の設定
リモートエージェントを使用する前に、SSH接続を適切に設定します。
SSH鍵の生成と配置
# ローカルマシンで SSH鍵を生成(未作成の場合)
ssh-keygen -t ed25519 -C "antigravity@example.com" -f ~/.ssh/antigravity_key
# 公開鍵をリモートサーバーに配置
ssh-copy-id -i ~/.ssh/antigravity_key.pub user@remote-server.com
# SSH接続テスト
ssh -i ~/.ssh/antigravity_key user@remote-server.com "echo 'Connection successful'"Antigravity の SSH設定
~/.antigravity/config.yaml でSSH接続情報を登録します。
remote_hosts:
production:
host: "prod-server.example.com"
port: 22
user: "antigravity"
key_path: "~/.ssh/antigravity_key"
timeout: 30
keep_alive_interval: 60
staging:
host: "staging-server.example.com"
port: 22
user: "antigravity"
key_path: "~/.ssh/staging_key"
gcp_instance:
host: "34.123.45.67"
port: 22
user: "ubuntu"
key_path: "~/.ssh/gcp_key"
bastion_host: "bastion.example.com" # オプション: 踏み台サーバー経由の場合SSH鍵は絶対にバージョン管理に含めないでください。`.antigravityignore` に追加するか、環境変数で指定することを推奨します。
クラウドVM設定(GCP/AWS)
Google Cloud Platform での設定
# GCE インスタンスの起動
gcloud compute instances create antigravity-agent \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud \
--machine-type=n1-standard-4 \
--zone=asia-northeast1-a
# SSH接続キーの設定
gcloud compute os-login ssh-keys add --key-file=~/.ssh/antigravity_key.pub
# インスタンスへのSSH接続確認
gcloud compute ssh antigravity-agent --zone=asia-northeast1-aAWS EC2 での設定
# EC2 インスタンスの起動(AWS CLI)
aws ec2 run-instances \
--image-id ami-0c802847a7dd848c0 \
--instance-type t3.xlarge \
--key-name antigravity-key \
--security-group-ids sg-xxxxxxxx \
--region ap-northeast-1
# セキュリティグループ設定(SSHアクセス許可)
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxxxxx \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0本番環境では SSH アクセスを特定の IP アドレスに制限してください。`0.0.0.0/0` は開発環境のみの設定です。
リモートエージェントの実装
リモートエージェントの作成と実行
// antigravity-agent.js
import Antigravity from "@antigravitylab/sdk";
const client = new Antigravity({
apiKey: process.env.ANTIGRAVITY_API_KEY,
});
// リモートサーバーで実行するエージェント
const remoteAgent = await client.createRemoteAgent({
name: "log-analyzer-agent",
host: "production", // config.yaml で定義したホスト名
workDir: "/tmp/antigravity-workspace",
capabilities: {
fileSystem: true,
commandExecution: true,
networkAccess: true,
},
});
// エージェントにタスクを割り当て
const task = await remoteAgent.execute({
instruction: `
/tmp/logs ディレクトリ内のすべてのログファイルを分析し、
エラーの発生パターンを抽出してレポートを作成してください。
特に ERROR と CRITICAL レベルのログを重点的に分析します。
`,
timeout: 3600, // 1時間
maxRetries: 3,
});
// 実行結果の取得
console.log("Task Status:", task.status);
console.log("Output:", task.output);
console.log("Execution Time:", task.executionTime);リモート実行の監視
// リアルタイム進捗の監視
remoteAgent.on("progress", (event) => {
console.log(`[${event.timestamp}] ${event.message}`);
});
remoteAgent.on("error", (error) => {
console.error(`Execution Error: ${error.message}`);
});
remoteAgent.on("complete", (result) => {
console.log(`Task completed in ${result.duration}ms`);
console.log(`Output size: ${result.outputSize} bytes`);
});
// 実行中のセッション情報を取得
const sessionInfo = await remoteAgent.getSessionInfo();
console.log("CPU Usage:", sessionInfo.cpuUsage);
console.log("Memory Usage:", sessionInfo.memoryUsage);
console.log("Network I/O:", sessionInfo.networkIO);ファイル同期戦略
単方向同期(ローカル → リモート)
// ローカルのプロジェクトファイルをリモートに同期
const syncResult = await remoteAgent.syncFiles({
direction: "upload",
source: "./src",
destination: "/remote/project/src",
patterns: {
include: ["**/*.js", "**/*.json", "**/*.md"],
exclude: ["node_modules", ".git", "dist"],
},
compression: true, // 転送中に圧縮
parallel: 4, // 4並列で転送
});
console.log(`Synced ${syncResult.filesTransferred} files`);
console.log(`Total size: ${syncResult.totalSize} bytes`);双方向同期(結果の取り戻し)
// リモートの実行結果をローカルに取得
await remoteAgent.syncFiles({
direction: "download",
source: "/remote/workspace/output",
destination: "./results",
patterns: {
include: ["**/*.log", "**/*.csv", "**/*.json"],
},
preserve: true, // タイムスタンプを保持
});
// 差分同期(変更されたファイルのみ)
await remoteAgent.syncFiles({
direction: "bidirectional",
source: "./data",
destination: "/remote/data",
deltaSync: true, // 差分のみ転送
checksum: "md5", // MD5チェックサムで変更検出
});大量のファイルを転送する場合は、`.antigravityignore` で不要なファイルを除外し、圧縮を有効にすることで転送時間を大幅に削減できます。
永続セッションの管理
セッションの保存と復帰
// 長時間実行タスク用に永続セッションを作成
const persistentSession = await remoteAgent.createPersistentSession({
name: "data-pipeline",
maxIdleTime: 3600, // 1時間のアイドル後に自動削除
autoReconnect: true, // 接続切断時に自動再接続
checkpoint: true, // 定期的なチェックポイント作成
});
// セッションに複数のタスクを追加(キュー方式)
await persistentSession.queue({
id: "task-1",
instruction: "Step 1: Download data from source",
dependencies: [],
});
await persistentSession.queue({
id: "task-2",
instruction: "Step 2: Process and transform data",
dependencies: ["task-1"],
});
await persistentSession.queue({
id: "task-3",
instruction: "Step 3: Upload results to storage",
dependencies: ["task-2"],
});
// パイプライン実行開始
await persistentSession.start();
// 進捗状況のポーリング
const checkProgress = setInterval(async () => {
const status = await persistentSession.getStatus();
console.log(`Pipeline Progress: ${status.completedTasks}/${status.totalTasks}`);
if (status.completed) {
clearInterval(checkProgress);
console.log("Pipeline finished successfully");
}
}, 30000); // 30秒ごとに確認セッションの復帰と再開
// 保存済みセッションを復帰
const session = await remoteAgent.resumePersistentSession("data-pipeline");
// チェックポイント情報を確認
const checkpoints = await session.listCheckpoints();
console.log("Available checkpoints:", checkpoints);
// 特定のチェックポイントから再開
await session.resume(checkpoints[0].id);
// セッションの詳細情報
const stats = await session.getStatistics();
console.log("Total execution time:", stats.totalTime);
console.log("Task success rate:", stats.successRate);
console.log("Average task duration:", stats.avgDuration);リモート実行の監視とログ
リアルタイムログの取得
// リモートエージェントのログをストリーミング
const logStream = remoteAgent.streamLogs({
level: "DEBUG",
filter: {
component: "executor",
tags: ["performance", "error"],
},
follow: true, // 継続的に新しいログを受け取る
});
logStream.on("data", (log) => {
console.log(`[${log.level}] ${log.timestamp}: ${log.message}`);
});
logStream.on("error", (err) => {
console.error("Log stream error:", err);
});メトリクスと性能監視
// リモートサーバーの性能指標を監視
const metrics = await remoteAgent.getMetrics({
interval: 60, // 60秒間隔で収集
duration: 3600, // 1時間分のメトリクス
});
console.log("CPU Usage Over Time:");
metrics.cpu.forEach(point => {
console.log(` ${point.timestamp}: ${point.value}%`);
});
console.log("Memory Usage (Peak):", metrics.memory.peak, "MB");
console.log("Disk I/O (Total):", metrics.diskIO.totalBytes, "bytes");
console.log("Network Throughput:", metrics.network.throughput, "Mbps");コスト最適化戦略
自動スケーリング
# Antigravity のスケーリング設定
remote_hosts:
auto_scaling_pool:
type: "aws_auto_scaling_group"
min_instances: 1
max_instances: 10
target_instance_type: "t3.large"
scale_up_policy:
metric: "cpu_usage"
threshold: 75
scale_increment: 2
cooldown: 300
scale_down_policy:
metric: "cpu_usage"
threshold: 25
scale_decrement: 1
cooldown: 600
cost_optimization:
spot_instances: true
spot_max_price: "0.15"
preemptible: true計算リソースの効率化
// 複数タスクの並列実行で効率を最大化
const tasks = Array.from({ length: 100 }, (_, i) => ({
id: `task-${i}`,
instruction: `Process file segment ${i}`,
}));
// バッチ実行(指定した数のタスクを並列実行)
const batchResult = await remoteAgent.executeBatch(tasks, {
parallelism: 8, // 同時実行数
batchSize: 50, // バッチサイズ
progressCallback: (completed, total) => {
console.log(`Progress: ${completed}/${total}`);
},
});
console.log(`Total cost: $${batchResult.estimatedCost}`);
console.log(`Time saved by parallelization: ${batchResult.timeSaved}s`);クラウド環境では課金が継続します。不要になったインスタンスやセッションは確実に削除してください。
実行結果の最適化
// リモートで処理した結果をフィルター&圧縮して転送
const optimizedResult = await remoteAgent.getResult({
outputPath: "/remote/output",
compression: "gzip", // gzip 圧縮
chunkSize: "10MB", // 大きなファイルは分割
cleanup: true, // ダウンロード後にリモートのファイルを削除
});
console.log(`Downloaded ${optimizedResult.files} files`);
console.log(`Compressed size: ${optimizedResult.compressedSize} MB`);実践例:大規模ログ分析
リモートエージェントを使用した実践的な例です。
// 本番サーバーで大規模ログを分析
const analysisTask = await client.createRemoteAgent({
name: "log-analyzer",
host: "production",
}).execute({
instruction: `
/var/log/application.log の過去24時間分を分析し、
以下を実施してください:
1. エラー発生箇所の特定
2. エラー頻度の計算
3. パターン分析(どの操作の後で発生するか)
4. 影響受けたユーザー数の推定
5. JSON形式でレポート作成
`,
timeout: 1800,
});
// 結果をローカルに取得&可視化
const report = JSON.parse(analysisTask.output);
console.log("=== Error Analysis Report ===");
console.log(`Total errors: ${report.summary.totalErrors}`);
console.log(`Unique patterns: ${report.patterns.length}`);
console.log(`Affected users: ${report.affectedUsers}`);
report.patterns.forEach(pattern => {
console.log(`\nPattern: ${pattern.name}`);
console.log(` Frequency: ${pattern.count}`);
console.log(` Severity: ${pattern.severity}`);
});次のステップ
- リモートエージェントの監視とアラート設定
- クラウド環境でのセキュリティベストプラクティス
- マルチリージョンの分散処理戦略
- 本番運用での トラブルシューティング
リモートエージェント機能により、Antigravity のスケーラビリティが飛躍的に向上します。クラウドの力を最大限に活用しましょう。
個人開発12年とアーティスト活動から見るエージェント設計
線引きするときの3つの判断軸
- 失敗時の影響が金銭やユーザー体験にどれだけ波及するか
- 復旧オペレーションが明文化されているか
- 観測ログから人間が再現できる粒度に整っているか
まとめ — 検証ステップの推奨
- 観測メトリクスとアラートを設置
- 限定ロールアウトで本番検証