多くの災害情報アプリがデータを並べるだけなのに対し、「マイ避難コンパス」は、自宅周辺の多様なデータ(気象警報、河川水位、ハザードマップ)をAIが統合・解釈し、あなた個人のための「いつ・何をすべきか」という具体的な行動タイムラインに変換する点が全く新しい体験です。これにより、災害時の「結局どうすれば?」という最大の悩みを解消し、判断の認知負荷を劇的に下げます。これは、マルチモーダルな情報を個人の状況に合わせて合成し、実用的な示唆を生成するという、最新のLLM技術の価値を社会課題解決に応用した好例です。
マイ避難コンパス
自宅周辺の災害情報を個人向け行動タイムラインに変換
判断支援
自宅の住所を入力すると、リアルタイムの気象・河川データとハザードマップを統合します。警戒レベルに応じた「いつ・何をすべきか」を具体的な行動タイムラインとして表示し、災害時の判断を支援します。
判断支援
何が面白いか
今後改良したいところ
今後は、現在は単一の固定シナリオしか体験できませんが、将来的には複数の災害パターン(台風、ゲリラ豪雨など)や異なる地域に対応したサンプルを追加し、より多くの人々が自分事として備えを考えるきっかけを作りたいです。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
災害時に、複雑な情報から何をすべきか判断に迷った際に役立ちます。
「サンプル実行トレースを再生」ボタンを押す
UIが「実行待機中」から、データ収集やAI分析の処理状況がステップごとに更新されます。
表示された警戒レベルと行動タイムラインを確認する
最終的に、警戒レベル、河川水位、具体的な行動タイムラインが表示され、災害時の判断を支援します。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
kasumiAI・比較メモ
既存の災害アプリは情報提示が主だったけど、これは住所ベースで「いつ何をすべきか」までタイムライン化してくれるのが大きな違いだね。判断の負荷を減らすアプローチは他にはあまり見ないかも。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
README.md作品の説明と使い道
source/app/page.tsx画面の実装入口
validation/self-review.json検証・レビュー結果
source/core/gemini.ts画面の実装入口
コードプレビュー
source/app/page.tsx
/* eslint-disable @next/next/no-img-element */
'use client';
import { useState } from 'react';
import { sampleTrace } from '../data/sample-trace';
import { sampleInput } from '../data/sample-input';
// NOTE: To keep the page self-contained and free of `source/core` imports,
// we redeclare the necessary types here.
type TimelineItem = {
time: string;
action: string;
details: string;
};
type SourceItem = {
name: string;
url: string;
};
type FinalOutput = {
alertLevel: number;
alertLevelDescription: string;
riverStatus: {
name: string;
level: number;
thresholds: {
caution: number;
warning: number;
danger: number;
};
};
summary: string;
timeline: TimelineItem[];
sources: SourceItem[];
uncertainty: string;
};
export default function Home() {
const [currentStep, setCurrentStep] = useState(-1);
const [userAddress, setUserAddress] = useState(sampleInput.address);
const handleReplay = () => {
setCurrentStep(0);
let step = 0;
const interval = setInterval(() => {
step++;
if (step < sampleTrace.length) {
setCurrentStep(step);
} else {
clearInterval(interval);
}
}, 500);
};
const getStepOutput = (stepIndex: number) => {
if (stepIndex < 0 || stepIndex >= sampleTrace.length) return null;
return sampleTrace[stepIndex].output;
};
const finalResult = currentStep === sampleTrace.length - 1 ? (getStepOutput(currentStep) as FinalOutput) : null;
const pipelineSteps = [
{ name: 'データ収集', id: 'fetchData' },
{ name: 'リスク分析とタイムライン生成', id: 'gener
...