Thor の AI 駆動のフルスタック
本 web アプリは、iPhone のヘルスケアデータから睡眠パターンを推定・分析し、LLM からフィードバックを取得するWebサービスです。
-
アンケート回答 - 睡眠に関する3つの質問に答える
- スマホの充電タイミング
- 家の中でスマホを持ち歩くか
- 普段の就寝時刻
-
データアップロード - Apple ヘルスケアからエクスポートした XML ファイルをアップロード
-
歩数抽出 - XML から歩数データ(+睡眠データ)を抽出
-
睡眠推定 - 歩数データ+アンケート回答をもとに、日ごとの就寝・起床時刻を推定
-
結果表示 - 推定結果をチャートで可視化
- 就寝・起床時刻の折れ線グラフ
- 睡眠時間の棒グラフ
-
AIフィードバック - LLM( Ollama 経由)が睡眠パターンについてマークダウン形式のアドバイスを生成
本サービスは Apple ヘルスケアの XML エクスポートを利用するため、iPhone ユーザーを対象としています。Android など他のデバイスをお使いの方は、ヘルスデータを指定の形式に変換したうえで API を直接呼び出すことでご利用いただけます。
独自のアルゴリズムによって推定された睡眠データを参考に、ローカル LLM を使用してフィードバックを行います。対応経路によって使用するモデルとプロンプトが異なります。
-
ブラウザ表示では解析結果がグラフで視覚的に確認できるため、LLM フィードバックは補助的な位置づけです。応答速度がユーザー体験に直結するため、軽量モデルを使用し、プロンプトも睡眠傾向の要約と手軽なアドバイスに絞っています。
-
メール送信では応答速度より質を優先できます。グラフを伴わないテキストのみの出力になります。睡眠パター ンの詳細な分析・専門的見解・生活習慣への影響・具体的な改善アドバイスを含む包括的なフィードバックを返すプロンプトを使用しています。
| 種別 | モデル | レスポンス内容 | レスポンス速度 | 対応経路 |
|---|---|---|---|---|
| 専門的なフィードバック | gemma3:27b | 解析結果をもとにした睡眠異常・専門的見解・生活への影響・具体的な改善アドバイス | 1分程度 | メール経由のみ |
| 簡易的なフィードバック | mistral-small3.1:24b | 睡眠傾向のサマリーと、すぐに実践できる簡単なアドバイス | 10秒程度 | ブラウザ・メール経由 |
- Frontend: React + TypeScript + Tailwind CSS
- Backend: FastAPI (Python 3.12+)
- AI/LLM: Ollama (ホストマシン)
- インフラ: Docker Compose
- タスクランナー: Go-Task
- Coding Agent: Claude Code
- VSCode
- Docker
- 事前に GitHub で ssh key を発行して ssh 接続ができるよう準備してください。
こちらから Ollama をインストール
git clone git@github.com:273Do/Thor-Monorepo.git以下のコマンドを実行してollama/ 内に用意された LLM を読み込みます。かなり時間がかかります。
chmod +x ollama/setup.sh
./ollama/setup.shうまく読み込めると以下のように表示されますが、自作モデル(thor-*)はベースモデルの重みを共有して参照しているだけなので、ディスク容量が2倍になるわけではありません。Modelfile で設定したパラメータの差分だけが追加で保持されています。
NAME ID SIZE MODIFIED
gemma3:27b abcdefghijkl 17 GB X hours ago
thor-gemma3-27b:latest mnopqrstuvwx 17 GB X hours ago
thor-mistral-small3-1-24b:latest yz0123456789 15 GB X hours ago
mistral-small3.1:24b ABCDEFGHIJKL 15 GB X hours ago
Modelfile の各パラメータ詳細は公式ドキュメントを参照。
VSCode で Dev Container でプロジェクトを開きます。
-
backendディレクトリに事前のデータを格納するディレクトリを作成します。 -
以下の手順に従って送信用のメールアドレスを設定します。
- myaccount.google.com/security を開きます。
- 「2段階認証プロセス」を有効にします。
- myaccount.google.com/apppasswords を開きます。
- 「アプリ名」に任意の名前を入力して「作成」を押し、表示された16文字のパスワード(xxxx xxxx xxxx xxxx形式<環境変数に設定する際は空白は含まない>)を控える。
-
各環境変数を作成します。
-
以下のコマンドでパッケージをインストールします。
task frontend -- pnpm i
task backend -- uv sync- 以下のコマンドでアプリを起動します。
task frontend:dev
task backend:dev- アプリを公開する場合はドメインを取得しておきます。
Claude Code を契約している場合はターミナルから以下のコマンドでセットアップが可能です。
claude- 各種コマンドは
task -lで確認できます。 - http://localhost:8000/docs で Swagger を使用できます。
- API 仕様書を作成する場合はこちらのツールを使用すると楽です。
- cloudflare tunnel を使用してアプリを公開します。(未対応)
-
Cloudflareダッシュボードから [Zero Trust] > [Networks] > [Overview] > [Manage Tunnels] > [Create new cloudflared Tunnel] を選択します。
-
トンネル名を入力して作成します。
-
[Configure] 画面にて [Install and run a connector] の項目で [Docker] を選択し、表示されているコマンド内のトークンを env ファイルに設定します。
-
[Published application routes] 画面にてルーティング設定を行います。
Subdomain Domain Service Type URL (Docker内部名) (空欄) example.com HTTP http://frontend:5173 api example.com HTTP http://backend:8000
- 開発:273*
- This source code contains a partially modified version of applehealthdata .
- この作成物および同梱物を使用したことによって生じたすべての障害・損害・不具合等に関しては,私と私の関係者および私の所属するいかなる団体・組織とも,一切の責任を負いません.各自の責任においてご使用ください.