50戸から500戸の物件を管理するプロパティマネージャーは、今も電話、WhatsAppグループ、スプレッドシートに頼っています。入居者がボイラーの故障を報告すると、業者を手配するまでに電話を5回かける必要があります。追跡なし、SLAなし、可視性なし。
この問題を解決するためにOPSLYを作りました — 入居者が問題を報告し、AIの損傷評価のために写真をアップロードする音声と視覚のマルチモーダルAIプラットフォームで、技術者はハンズフリーで作業指示を受け、管理者はすべての更新を1つのダッシュボードでリアルタイムに監視します。
本プロジェクトはGemini Live Agent Challengeのハッカソンへの参加を目的として作成されました。
OPSLY アーキテクチャ
スタック
| レイヤー | 技術 |
|---|---|
| バックエンド | NestJS + TypeScript + Prisma ORM |
| データベース | PostgreSQL (Supabase) |
| フロントエンド | React + TypeScript + Vite + Tailwind CSS |
| リアルタイム | Socket.IO (WebSockets) |
| AI — 音声 | Gemini Live API |
| AI — ビジョン | Gemini Vision |
| AI — エージェント | Google ADK (6 エージェント) |
| デプロイ | Google Cloud Run (バックエンド) + Vercel (フロントエンド) |
Geminiがすべてのレイヤーを機能させる仕組み
1. Gemini Live API — 音声対話
OPSLYの最初のコアとなる差別化要因は、誰もタイプしないことです。入居者はAIエージェントに自然に話しかけてメンテナンスの問題を報告し、技術者は現場でハンズフリーで作業指示を受け取ります。2つ目はAIが視ることができる点です — 入居者は損傷写真をアップロードし、Gemini Visionは深刻度、損傷タイプ、信頼度を即座に評価します。
双方向ストリーミング音声セッションには、Gemini Live API(gemini-2.5-flash-native-audio)を使用しました。これを機能させた主な特徴は次のとおりです:
- リアルタイムストリーミング — 入居者が話し、AIが会話的に応答する、リクエスト/レスポンスのサイクルではなく
- 途中割り込み対応 — 入居者はエージェントの途中で話を遮ることができ、自然に処理します。これは実際の対話感を生み出すうえで不可欠です
- 音声中のツール呼び出し — 会話中、エージェントがバックエンドツールを呼び出して作業指示を作成したり、ユニットの詳細を照合したり、既存の問題を確認します
フローの仕組みは以下のとおりです:
Tenant speaks → Gemini Live API processes audio
→ Agent identifies intent (new issue report)
→ Agent asks clarifying questions (location, severity)
→ Agent calls createWorkOrder tool
→ Backend creates work order + emits WebSocket event
→ Manager's dashboard updates in real-time
同じ音声アーキテクチャは技術者向けブリーフィングをも動かします — 技術者が「次の作業を要約して」と言うと、AIが住所、問題の説明、深刻度、入居者のメモを読み上げます。道具を持っている人や運転中の人にとって、完全にハンズフリーです。
2. Google ADK — マルチエージェント・オーケストレーション
すべてを一手に引き受けようとする1つのAIエージェントが、トリアージ、ステータス照会、スケジューリング、エスカレーション、分析を処理するには不安定です。Google ADKを使って中央ルーターを備えたマルチエージェントシステムを構築しました:
┌───────────────────┐
│ OpslyRouterAgent │ ← Classifies intent, routes to specialist
└─────────┬─────────┘
│
┌─────┴──────────────────────────────────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌──────────┐ ┌───────┐ ┌─────────┐
│ Triage │ │ Status │ │ Schedule │ │Escal. │ │Analytics│
│ Agent │ │ Agent │ │ Agent │ │ Agent │ │ Agent │
└────────┘ └────────┘ └──────────┘ └───────┘ └─────────┘
- TriageAgent — 入居者から問題の詳細を収集し、写真をリクエストし、作業指示を作成します
- StatusAgent — 作業指示の状況、担当、ETAに関する質問に回答します
- ScheduleAgent — 技術者が作業キューを管理し、ステータスを更新するのを支援します
- EscalationAgent — SLA違反と緊急エスカレーションを処理します
- AnalyticsAgent — 管理者向けの運用指標を提供します
各エージェントには焦点を絞ったシステムプロンプトと独自のバックエンドツールセットがあります。ルーターエージェントはユーザーの意図を分類し、適切なスペシャリストに委任します。これにより各エージェントはシンプルで信頼性が高くなり、持っていない機能についての幻覚は生まれません。
重要なのは、エージェントはデータベースに直接書き込むことは決してないという点です。 すべてのアクションは認証済みのRESTエンドポイントを通じて行われます。これにより、APIを保護する同じ検証、RBACガード、および監査トレイルがエージェントのアクションを保護します。
3. Gemini Vision — 写真による損傷評価
入居者が問題を報告すると、AIは写真のアップロードを求めます。その写真はGemini Vision(gemini-2.5-flash)を通じて自動損傷評価に回されます:
{"damageType": "water_leak", "severity": "HIGH", "confidence": 0.92, "description": "Active water leak from ceiling with visible water damage and staining on drywall"}
この構造化された評価は、作業指示の優先度を自動的に設定します。深刻度が高い水漏れは緊急となり、積極的なSLA期限が設定されます。外観上の傷は低優先度のままです。マネージャーはダッシュボードで入居者の写真とともにこの評価を確認します。手動のトリアージは不要です。
4. Google Cloud Run — 本番デプロイ
NestJS バックエンドは、多段階の Docker ビルド(Node 20 Alpine)でコンテナ化され、Google Cloud Runにデプロイされます。これにより次の利点があります:
- 自動スケーリング(コスト効率のためのスケール・ツー・ゼロを含む)
- HTTPSが標準で搭載
- リアルタイムダッシュボード更新のためのWebSocketサポート
- 秘密情報の環境変数管理が容易
デプロイはGitHub Actionsを通じて自動化されています — mainへプッシュするとビルドが開始され、Artifact Registryへプッシュされ、Cloud Runへ自動デプロイされます。
リアルタイムアーキテクチャ
OPSLYを“生きている”と感じさせるのは、すべての状態変化が3つのユーザーロールすべてに対して瞬時に伝播する点です:
- 入居者の報告 — 音声で報告すると、作業指示がマネージャーのダッシュボードに表示されます(WebSocketプッシュ)
- 管理者が技術者を割り当てる — 入居者に通知が届き、技術者は作業のキューへ追加されます
- 技術者がETAを送信 — 入居者がカウントダウンタイマーを表示します
- 技術者が作業を完了 — マネージャーのKPIが更新され、入居者は解決を確認します
これらはすべて、ロールでフィルタリングされたSocket.IOルームを通じて起こります。マネージャーはすべてを見ます。入居者は自分の作業指示のみを見ます。技術者は割り当てられた作業のみを見ます。
学んだこと
Gemini Live APIの途中割り込み処理は本当に印象的です。 非ストリーミング方式の以前のプロトタイプでは、AIを中断すると違和感がありました。Gemini Liveでは、エージェントが自然に停止し、中断を認識して会話を続けます。これこそ、ボットではなく人と話しているように感じさせる理由です。
ADKを用いたマルチエージェント・オーケストレーションは、モノリシックなエージェントよりもクリーンです。 各専門エージェントには、小さく焦点を絞ったプロンプトと限定されたツールのセットがあります。ルーターエージェントの役割は「意図を分類して適切な専門家に委任する」ことだけです。この分離により、デバッグがはるかに容易になりました — スケジュールエージェントが誤った応答を返したとき、1つのプロンプトを修正すればよく、2000行のシステムプロンプトをほどく必要はありませんでした。
構造化された評価のためのGemini Visionは時間の節約になります。 カスタムの損傷分類モデルを構築する代わりに、Gemini Visionは損傷タイプ、深刻度、信頼度を含む構造化JSONを返します。物件管理の文脈では、これはトリアージを自動化するのに十分正確で、信頼度スコアによりマネージャーが再確認すべき時期を知らせます。
試してみる
デモアカウント(すべてのパスワードは password123 を使用):
- テナント:
tenant@opsly.io - マネージャー:
sarah@opsly.io - 技術者:
mike@opsly.io
OPSLYは、Gemini Live Agent Challengeのハッカソンのために Claude Code を使用して単独で構築されました。バックエンド、フロントエンド、AIエージェント、音声+視覚の統合、デプロイメントを含む、プラットフォーム全体が2週間未満で構築されました。
#GeminiLiveAgentChallenge
