問診メイトは、個人クリニックでも、病院でも無料で使える問診システムです。 現役医師が自分のクリニックでの活用を視野に開発しています。
固定問診項目で、条件分岐質問や、年齢や性別で質問の制限、 患者さんにもわかりやすい、画像付きの質問も設定できます。
また、別途LM StudioやOllamaでローカルLLMを接続することで、 外部に患者情報を漏らさず、AIにフォローアップの追加質問をさせたり、問診内容のサマリを作成させることが可能になります。
バックエンドは FastAPI、フロントエンドは React(Vite + Chakra UI)で構成されています。 Dockerコンテナで簡単にセットアップできます。
- 問診テンプレート管理: 初診・再診ごとにテンプレートを作成・編集・複製・削除・ID変更できます。項目の型(string/multi/yesno/date/slider)、必須、選択肢、条件表示(when)、年齢・性別による表示制限、説明文、画像添付に対応。テンプレート一式のエクスポート/インポート(画像同梱・任意パスワード暗号化)も可能です。
- セッション管理: 氏名・生年月日・性別・受診種別と全回答を保存。固定フォームの回答に加えて、LLM 追加質問の「質問文」と回答も履歴化します。検索(氏名/生年月日/期間)、詳細表示、単体/一括ダウンロード(PDF/Markdown/CSV)、単体/一括削除、JSON エクスポート/インポート(任意パスワード暗号化)に対応。
- LLM 連携: 不足項目に応じた追加質問の生成と、問診完了時の要約作成を提供。ollama もしくは OpenAI 互換(LM Studio 等)に接続できます。プロバイダ・モデル・温度・システムプロンプト・タイムアウトは管理画面から設定でき、モデル一覧取得と疎通テストを備えます(既定は無効で、設定しない限り外部送信はありません)。
- エクスポート/出力: 問診結果を PDF / CSV / Markdown で出力可能。複数選択の ZIP(MD/PDF)や集計 CSV に対応。テンプレート・セッションの JSON エクスポート/インポートはパスワード付き暗号化(Fernet)に対応し、画像(項目画像・ロゴ)も同梱します。
- 管理画面(設定): タイムゾーン、施設表示名、導入文/完了文のカスタマイズ、テーマカラー、ロゴ/アイコンのアップロード、PDF レイアウト(構造化/レガシー)、既定テンプレートの切替を提供します。状態カードで DB 種別・LLM 疎通状況を表示します。
- 二段階認証(Authenticator/TOTP): 管理者ログインに TOTP を導入できます。TOTP シークレットの暗号化保存(
TOTP_ENC_KEY)や非常用リセット(ADMIN_EMERGENCY_RESET_PASSWORD)、適用モード(off/reset_only/login_and_reset)を備えます。 - データ永続化: 既定は SQLite。環境変数で CouchDB を有効化するとセッション/回答のみを CouchDB に保存します。
- 運用補助: ヘルスチェック(/health, /healthz, /readyz)、メトリクス(/metrics, /metrics/ui)、監査ログ(パスワード/TOTP変更・ログイン試行)を提供します。
- バックエンド: FastAPI(
backend/app/main.py)。Uvicorn でポート8001を公開。 - フロントエンド: React + Vite + Chakra UI(
frontend/)。開発は Vite、配信は Nginx(frontend/Dockerfile)。 - 永続化:
- SQLite(既定): テンプレート/各種設定/監査ログ/管理ユーザー等を保存。
MONSHINMATE_DB未設定時はbackend/app/app.sqlite3を使用。 - CouchDB(任意): セッションと回答を保存。
COUCHDB_URLを設定すると有効化。
- SQLite(既定): テンプレート/各種設定/監査ログ/管理ユーザー等を保存。
- LLM ゲートウェイ: ollama または OpenAI 互換 API(LM Studio 等)に接続(
backend/app/llm_gateway.py)。モデル一覧取得と疎通テストを提供。 - 配布/起動:
docker-compose.ymlでcouchdb/backend/frontendを定義。FRONTEND_HTTP_PORTでフロントのホスト側ポート変更可。
- リポジトリ直下でビルドして起動します。
docker compose build
docker compose up -d
- アクセス
- フロントエンド:
http://localhost:5173(FRONTEND_HTTP_PORTで変更可) - バックエンド API:
http://localhost:8001 - CouchDB 管理画面:
http://localhost:5984/_utils(既定ユーザーadmin/admin)
- 初期セットアップ
- 管理ユーザーは
admin。初期パスワードはADMIN_PASSWORD(未設定時はadmin)です。ログイン後に必ず変更してください。 - 「セキュリティ」から TOTP(二段階認証)を有効化できます(QR を読み取り 6 桁コードを登録)。
- 「LLM 設定」でプロバイダ・ベース URL・モデル・API キーを設定して疎通テストを実行してください(未設定のままでも動作します)。
停止/削除
docker compose down
補足
- compose では
backendにCOUCHDB_URL=http://couchdb:5984/を渡します。セッションは CouchDB に保存され、テンプレートなどは SQLite に保存されます。
前提: Python 3.11 以上、Node.js 18 以上。
バックエンド(API)
cd backend
python -m venv venv
venv\Scripts\activate # Windows(PowerShell)
# または source venv/bin/activate # macOS/Linux
pip install --upgrade pip
pip install -e .
uvicorn app.main:app --reload --port 8001
動作確認: curl http://localhost:8001/healthz → {"status":"ok"} で正常。
フロントエンド(開発サーバ)
cd frontend
npm install
npm run dev
# http://localhost:5173 を開く(`FRONTEND_HTTP_PORT` で調整可)
開発サーバの API へのアクセスは frontend/vite.config.ts のプロキシで http://localhost:8001 へ転送されます。
一括起動(開発用ユーティリティ)
- macOS/Linux:
./dev.shまたはmake dev - Windows:
powershell -File dev.ps1
補足: dev.sh はバックエンド/フロントのみを起動します。CouchDB を利用する場合は docker compose up couchdb で起動し、.env で COUCHDB_URL 等を設定してください。
- 基本/実行:
MONSHINMATE_ENV(既定local)、FRONTEND_HTTP_PORT - 管理者/認証:
ADMIN_PASSWORD、ADMIN_EMERGENCY_RESET_PASSWORD、SECRET_KEY(JWT 署名鍵) - 二段階認証:
TOTP_ENC_KEY(Fernet 鍵。URL-safe Base64 32byte) - データベース(SQLite/CouchDB):
MONSHINMATE_DB(SQLite ファイルパス。Compose 既定は/app/data/sqlite/app.sqlite3)COUCHDB_URL、COUCHDB_DB(既定monshin_sessions)、COUCHDB_USER、COUCHDB_PASSWORD
- (CouchDB を使う場合は
COUCHDB_URL等を設定してください) - Secret Manager(任意・プライベートモジュール導入時):
MONSHINMATE_SECRET_MANAGER_ADAPTER(例:monshinmate_cloud.secret_manager:load_secrets)SECRET_MANAGER_ENABLED、SECRET_MANAGER_PROJECT、SECRET_MANAGER_PREFIX
- ファイルストレージ(任意):
FILE_STORAGE_BACKEND(既定local)、GCS_BUCKET、STORAGE_EMULATOR_HOST、GCS_SIGNED_URL_TTL
Docker Compose の既定値は docker-compose.yml と .env.example を参照してください。
- 管理ログインにはパスワードが必須です。初回は
admin/ADMIN_PASSWORDでログインし、速やかに変更してください。 - 二段階認証は管理画面「セキュリティ」で有効化します。QR を Authenticator アプリで読み取り、6 桁コードを登録します。
- 非常時の復旧:
- TOTP が無効のときは
ADMIN_EMERGENCY_RESET_PASSWORD設定時に UI から非常用パスワードで初期化できます。 - UI が使えない場合は
backend/tools/reset_admin_password.pyで初期化(実行前に DB バックアップを推奨)。
- TOTP が無効のときは
- セキュリティ強化:
TOTP_ENC_KEYを設定すると TOTP シークレットを暗号化保存します。- パスワード変更/TOTP 状態変更/ログイン試行は
backend/app/logs/security.logと SQLiteaudit_logsに監査記録します(PII は平文で出力しません)。
- 既定は SQLite。Compose では
./data/sqlite/app.sqlite3(コンテナ内/app/data/sqlite/app.sqlite3)に保存します。 COUCHDB_URLを設定すると、セッション/回答のみ CouchDB に保存されます。テンプレート・設定は SQLite に保存します。- 管理画面の「メイン」カードで、現在の DB 種別(SQLite/CouchDB/エラー)を確認できます。
- 住所自動入力用の初期データは
backend/app/postal_code_data/utf_ken_all.csvに配置しています。 - データ元は日本郵便の「住所の郵便番号(1レコード1行、UTF-8形式)(CSV形式)」です。最新データは https://www.post.japanpost.jp/service/search/zipcode/download/utf-zip.html から取得できます。
- 初回利用時に上記 CSV から検索用 SQLite 辞書を生成します。生成された
backend/app/postal_code_data/postal_codes.sqlite3は実行時データのため Git 管理対象外です。 - マスタ更新は管理画面の「郵便番号辞書」から KEN_ALL 形式のUTF-8 CSVを手動アップロードして行えます。更新後は患者基本情報画面の郵便番号による住所自動入力へ反映されます。
- 管理画面のセッション一覧から、単体の PDF / Markdown / CSV をダウンロードできます。
- 一括出力ボタンで、複数選択の ZIP(PDF/MD)または集計 CSV をダウンロードできます。
- テンプレート設定・問診データの JSON エクスポート/インポートに対応。任意パスワードで暗号化できます(インポートは merge/replace 指定)。
- バックエンド API 例:
GET /admin/sessions/{id}/download/{fmt}(fmt=md|pdf|csv)GET /admin/sessions/bulk/download/{fmt}(ids=...。MD/PDF は ZIP、CSV は 1 枚の集計)POST /admin/questionnaires/export/POST /admin/questionnaires/importPOST /admin/sessions/export/POST /admin/sessions/import
- ライフチェック/状態:
GET /healthGET /healthzGET /readyzGET /metricsPOST /metrics/uiGET /system/llm-statusGET /system/database-status - テンプレート:
GET /questionnairesPOST /questionnairesDELETE /questionnaires/{id}POST /questionnaires/{id}/duplicatePOST /questionnaires/{id}/renamePOST /questionnaires/{id}/resetPOST /questionnaires/default/resetGET /questionnaires/{id}/template - プロンプト:
GET/POST /questionnaires/{id}/summary-promptGET/POST /questionnaires/{id}/followup-prompt - 項目画像/ロゴ:
POST /questionnaire-item-imagesDELETE /questionnaire-item-images/{filename}POST /system-logoGET /system/logo - システム設定:
GET/PUT /system/timezoneGET/PUT /system/display-nameGET/PUT /system/entry-messageGET/PUT /system/completion-messageGET/PUT /system/theme-colorGET/PUT /system/pdf-layoutGET/PUT /system/default-questionnaire - セッション:
POST /sessionsPOST /sessions/{id}/answersPOST /sessions/{id}/llm-questionsPOST /sessions/{id}/llm-answersPOST /sessions/{id}/finalize - 管理/セッション一覧:
GET /admin/sessions(検索クエリ:patient_name/dob/start_date/end_date)GET /admin/sessions/{id}GET /admin/sessions/stream(SSE) - ダウンロード/入出力:
GET /admin/sessions/{id}/download/{fmt}GET /admin/sessions/bulk/download/{fmt}POST /admin/sessions/exportPOST /admin/sessions/import - 削除:
DELETE /admin/sessions/{id}POST /admin/sessions/bulk/delete - LLM 設定/テスト:
GET/PUT /llm/settingsPOST /llm/settings/testPOST /llm/list-models - 認証/TOTP:
GET /admin/auth/statusPOST /admin/loginPOST /admin/passwordPOST /admin/password/changePOST /admin/password/reset/requestPOST /admin/password/reset/confirmPOST /admin/password/reset/emergencyGET/PUT /admin/totp/modeGET /admin/totp/setupPOST /admin/totp/verifyPOST /admin/totp/disablePOST /admin/totp/regenerate
詳細仕様は docs/session_api.md と管理画面マニュアル(docs/admin_user_manual.md)を参照してください。
backend/tools/reset_admin_password.py: 管理者パスワードを強制リセット(TOTP 無効化を含む)backend/tools/audit_dump.py: 監査ログのダンプ(--limit/--db)backend/tools/encrypt_totp_secrets.py: 既存 DB の TOTP シークレットを暗号化保存へ移行backend/tools/collect_licenses.py: 依存ライブラリのライセンス情報を収集
電子カルテや予約システム画面に表示されている患者名と生年月日を読み取り、問診メイトから最新の問診結果を取得・コピーできるChrome拡張機能を提供しています。
- 機能: 任意のWebカルテ画面からワンクリックで患者の問診情報を取得
- ソースコード:
extensions/patient-summary/ - 特徴: XPathによる柔軟な読み取り設定、Markdown形式でのクリップボードコピー
- インストール: Chrome Web Storeからインストールするか、ソースコードをデベロッパーモードで読み込んで使用します。
- 本プロジェクトは GNU AFFERO GENERAL PUBLIC LICENSE に基づき公開しています。詳細はリポジトリ直下の
LICENSEを参照してください。
- 本リポジトリの本体は、上記のとおり単体で全機能が動作します(Docker Compose またはローカル開発手順のみで可)。
- 作者が管理・運用するサービスでは一部で Firestore を利用しています。これに関連するサブモジュールや設定は、セキュリティ上の理由から非公開としています。
- これらのサブモジュールは本体機能の必須要件ではなく、存在しなくても全機能が利用できます。必要に応じて各自のインフラ(例: 自前の DB/認証/ホスティング)へ置き換えて運用してください。