自分の街、自分の世代の話を、60 秒で。
Citify は、自治体の議事録・プレスリリース・統計を AI が読み、役所言葉を若者の言葉に翻訳して TikTok 風の縦スクロールフィード(テキスト + AI 生成サムネ)で届ける マルチエージェント AI プロダクト です。「街の見張り番」Watcher エージェントが自分で調査計画を立て、統計・議題・人口推移を並列調査して「あなたに合う街」を自己検証つきで結論します。
🧭 設計の核: 「自分で調べて考える」同じ自律エージェントの仕組みを、"あなたの街選び"(Watcher) にも、"自分たちの運用の見張り"(Ops crew) にも使っています。「なぜ多エージェントか」と「なぜ DevOps × AI か」が 1 つの答えに収束します。
自治体ホームページは「図書館」(整然と並んでいるが自分で探しに行く必要がある)。Citify は「For You フィード」(関心軸でキュレーションされ、向こうから流れてくる)。
| 🌐 デモ (デプロイ済み) | https://citify-web--citify-dev.asia-east1.hosted.app/ |
| 🏆 ハッカソン | Findy DevOps × AI Agent Hackathon 2026 (提出 2026-07-10) |
| 👤 開発 | Yuji Matsumoto (個人開発 / Vibe Coding) |
全国 1,795 自治体マスタのうち 830 自治体・議会が稼働中 (apps/web/public/municipalities.json の is_active)、4,500 件超の議題を処理 (2026-07 時点の BigQuery scored_speeches_latest で distinct speech_id = 4,553)。図は上の SVG が正、コンポーネント補足は docs/ARCHITECTURE.md (一部は初期設計時の記述・Veo 等は未使用)。
| 画面 | 内容 |
|---|---|
| 📰 For You フィード | 議事録・プレスを年代×関心×地理で採点し縦スクロール配信。Imagen サムネ + 3 行サマリ |
| 🔭 Watcher (街の見張り番) | ADK 自律エージェント。調査計画→ツール並列実行→自己検証→根拠つき結論 + アクションプラン |
| ⚖️ 自治体比較 | 2〜3 自治体 × テーマの横並び比較 + AI の中立観察 |
| 💬 コンシェルジュ | 対話で街探し。4 つの BQ ツールを自律選択する ADK ツールループ (翻訳/影響度を sub_agents に構成) |
| 🏙️ 街ダッシュボード | 全国順位・人口推移 (実績+推計)・年齢構成・関心軸別議題 |
| 🗾 全国ヒートマップ / 🕰 タイムライン | Agent が指標を自動選定する 47 都道府県比較 / 議論の時系列ナラティブ |
🛠️ 運用SREクルー (/ops) |
Scraper Doctor + Cost Hunter + データ鮮度を統括する自律クルー。Watcher と同型の「計画→並列専門家→批判→人間ゲート」を自分たちの運用に適用 (DevOps × AI Agent)。自動実行はせず提案まで |
| For You フィード | Watcher | 街ダッシュボード |
|---|---|---|
![]() |
![]() |
![]() |
| 系統 | Agent | 役割 |
|---|---|---|
| パイプライン (Pub/Sub + Cloud Run Jobs) | 🖊️ Translator | 役所言葉→年代別に平易化 (Gemini 2.5 Flash) |
| 🎯 Relevance | 4 軸採点 × 5 ペルソナ fan-out | |
| 📮 Distributor | MMR 多様性ランキング (非 LLM・設計判断) | |
| 🧪 Critic | 翻訳品質の自己批評ループ (CITIFY_ENABLE_CRITIQUE=1 で opt-in) |
|
| ADK (自律・対話) | 🔭 Watcher | 自律ツールループ + 並列専門家 + 自己検証。本作のヒーロー |
| 💬 Concierge | 4 つの BQ ツールを自律選択する ADK ツールループ (CITIFY_CONCIERGE_ADK=1 で本番・sync fallback 付き)。translator/relevance を sub_agents に構成 |
|
| 📝 Preferences | 自然言語の自己紹介から関心軸を構造化抽出 | |
| 分析 API | 🕰 Timeline / 📈 Forecast / 🗾 Heatmap Advisor / 🔍 Reasoner | 時系列ナラティブ / 件数予測 / 指標自動選定 / 説明の平易化 (全てルールベース fallback 付き) |
| 運用 (DevOps × AI Agent) | 🩺 Scraper Doctor / 💰 Cost Hunter | 失敗診断・修正提案 / コスト異常検知・削減提案 (自動実行なし)。運用SREクルー /ops の専門家として合成 |
同一の自律パターン 「計画 → 並列専門家 → 批判 (Critic/悪魔の代弁者) → 人間ゲート・自動実行なし」 を、対象を変えて 2 ドメインで実証しています:
- Watcher (街選び) — プランナーが調査計画を立て、4 専門家 (人口/財政/暮らし・安全/議題) を並列実行、Critic と悪魔の代弁者が検証、倫理ゲートを通過。
- Ops crew (
/ops, 自分たちの運用) — 同じパターンをスクレイパー健全性・コスト・データ鮮度の診断に適用。「なぜ多エージェントか」と「なぜ DevOps か」が 1 つの答えに収束。
加えて Concierge (対話での街探し) は、4 つの BQ ツールを自律選択する ADK ツールループ・エージェントです (translator/relevance を sub_agents に構成)。
決定論で十分な部分 (Distributor=MMR, Forecast=回帰) は LLM を使わない設計判断であり、水増しではなく適材適所です。
- 国会会議録 検索 API (国立国会図書館) — 発言 2,000 件超を取得、うち 1,428 件を RAG コーパス化
- 自治体議事録 (kaigiroku.net / Playwright)
- 自治体プレスリリース RSS (都道府県 + 政令市 + 中核市を対象。実運用で巡回中は 45 自治体 /
infra/seed/tier1_supplements.csv) - e-Stat 国勢調査 / 不動産情報ライブラリ (Reinfolib) — 統計・人口推移
DB-Search 系 (150+ 自治体) は robots.txt が議事録パスを全面 Disallow のため対応コードごと Drop しました (倫理方針: robots.txt 尊重)。
| 層 | 技術 |
|---|---|
| AI | ADK (Watcher/Concierge/Preferences) / Gemini 2.5 Pro・Flash / Vertex AI RAG Engine / Imagen 3 / Embeddings (text-multilingual-embedding-002) |
| バックエンド | Python 3.12 / FastAPI / Cloud Run + Cloud Run Jobs / Pub/Sub (4 段パイプライン + DLQ) |
| データ | BigQuery / Firestore / Cloud Storage |
| フロントエンド | Next.js 16 (App Router) + TypeScript / Tailwind CSS / zod / Firebase App Hosting |
| DevOps | Terraform (全リソース IaC + 監視アラートポリシー: Cloud Run 5xx/p95・Pub/Sub DLQ) / GitHub Actions (ruff・pytest・tsc・vitest・build・gitleaks) / Cloud Build (パスベース検知→自動デプロイ) / Cloud Scheduler / Cloud Logging |
| 認証・冪等性 | Firebase 認証 (ID トークン検証、CITIFY_AUTH_MODE=firebase で段階導入・IDOR 解消) / BigQuery MERGE upsert 冪等化 (CITIFY_BQ_MERGE=1) |
- 開発環境: Linux / macOS / WSL2 (Ubuntu 24.04 推奨、Windows ユーザー向け)
- Node.js 20+ / Python 3.12+ / Google Cloud SDK / Terraform 1.7+
Windows ユーザーの方は、WSL2 + VSCode Remote 環境での開発を推奨しています。詳細は docs/GETTING_STARTED.md を参照。
git clone https://github.com/yujmatsu/citify.git
cd citifycp .env.example .env.local
# .env.local を編集して値を設定gcloud config set project citify-dev
gcloud auth application-default login
gcloud auth application-default set-quota-project citify-dev
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com \
firestore.googleapis.com \
bigquery.googleapis.com \
storage.googleapis.com \
pubsub.googleapis.com \
cloudscheduler.googleapis.com \
secretmanager.googleapis.com \
logging.googleapis.com \
cloudtrace.googleapis.com \
iamcredentials.googleapis.comcd infra/env/dev
terraform init
terraform plan
terraform applycd apps/api
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
uvicorn main:app --reloadcd apps/web
npm install
npm run devブラウザで http://localhost:3000 を開く。
citify/
├── README.md # このファイル (公開フェイス)
├── CLAUDE.md # Claude Code が自動読込
├── AGENTS.md # 他のAIコーディングエージェント向け
│
├── docs/ # 設計ドキュメント集
│ ├── PROJECT.md # プロダクト概要 (北極星)
│ ├── FEATURES.md # 機能仕様
│ ├── ARCHITECTURE.md # アーキテクチャ詳細
│ ├── DEMO_SCRIPT.md # デモ動画スクリプト
│ ├── assets/ # アーキテクチャ図 (SVG/PNG)
│ └── submission/ # ProtoPedia 提出素材 + スクリーンショット
│
├── apps/
│ ├── web/ # Next.js フロントエンド (16 画面)
│ ├── api/ # FastAPI BFF (Cloud Run)
│ └── workers/ # Cloud Run Jobs (Pub/Sub workers)
│
├── agents/ # 13 AI エージェント
│ ├── translator/ relevance/ distributor/ critic/ # パイプライン
│ ├── watcher/ concierge/ preferences/ # ADK (自律・対話)
│ ├── timeline/ forecast/ heatmap_advisor/ reasoner/ # 分析 API
│ ├── scraper_doctor/ cost_hunter/ # 運用
│ └── _shared/ # 共通倫理ガードレール
│
├── scrapers/ # データ収集
│ ├── kokkai/ # 国会会議録 API (JSON)
│ ├── kaigiroku_net/ # DiscussNet SPA (Playwright)
│ ├── press_rss/ # プレスリリース RSS (45 自治体)
│ ├── reinfolib/ # 不動産情報ライブラリ (統計・人口)
│ └── voices_asp/ # VOICES (robots.txt 制約で limited scope)
│
├── infra/ # Terraform IaC + seed データ
├── scripts/ # 運用スクリプト
└── .github/workflows/ # GitHub Actions
# Python (700+ tests)
apps/api/.venv/bin/python -m pytest
# TypeScript
cd apps/web
npx vitest run
npx tsc --noEmit# main にマージで自動デプロイ (Cloud Build: API / Firebase App Hosting: web)
git push origin main
# workers (Cloud Run Jobs) は手動トリガー
gcloud builds submit --config cloudbuild-workers.yamlCitify は以下を厳守します:
- 政治的中立性: 特定政党・候補者の推奨は一切しません。賛否も出しません (多層ガードレール + 失敗時ルールベース代替)
- AI 生成コンテンツの明示: すべての画像に SynthID + 「AI 生成」ラベル付与
- 政治家描写の禁止: 実在の政治家・首長・議員の顔・声・名前を含む生成はしません (
person_generation="dont_allow") - 議事録の引用: 全文転載せず、要約 + 原典 URL の形式
- robots.txt の尊重: Disallow のソースは対応コードごと Drop
- 個人情報の最小化: リアクションは集計後匿名化
詳細は docs/PROJECT.md の倫理セクション参照。
提出前に自己コードレビュー(critique-loop)のパスを回し、見つけた問題を修正しました:
- CORS 資格情報反射の脆弱性を発見・修正:
allow_origins="*"+allow_credentials=Trueは Origin を反射し任意サイトから資格情報付きで叩けるアンチパターン(CWE-942)。web ドメイン限定 + credentials off に修正 - レート制限: 高コストな LLM/エージェント endpoint(
/v1/concierge・/v1/watcher/*/run)に user 単位のスライディングウィンドウ制限を追加(無認証コスト暴走の緩和) - 倫理フィルタの全生成エージェント配線: 政党名・氏名+役職の leak 検出を translator / relevance / concierge / watcher に集約配線(自己申告 boolean に依存しない独立検出)
- エージェントの堅牢性: 全 LLM エージェントに rule-based fallback / leak 検出 / graceful degrade。Watcher は暴走ツール呼び出しの停止・引用 speech_id の接地(実在ID照合)・verdict 温度固定
- CI ゲート: ruff(lint+format)/ pytest / tsc / vitest / next build / terraform fmt に加え gitleaks の全履歴シークレットスキャン
- 既知の残課題(提出後): 本人確認を伴う認証は現状デモ用の簡易方式。真の認証(Firebase Auth)・BQ MERGE 冪等化・配信時パーソナライズは提出後対応として設計済み
| ドキュメント | 内容 |
|---|---|
| CLAUDE.md | Claude Code 向け開発ガイド |
| AGENTS.md | 他の AI コーディングエージェント向け指示 |
| ドキュメント | 内容 |
|---|---|
| PROJECT.md | 北極星:プロダクトビジョン、倫理制約 |
| FEATURES.md | 機能仕様 (Must/Should/Could/Won't) |
| ARCHITECTURE.md | アーキテクチャ補足 (1 枚図は上の SVG が正。本文の一部は初期設計時の記述で Veo 等は未使用) |
| DATA_SOURCES.md | データソース仕様 |
| DATA_MODEL.md | Firestore/BigQuery スキーマ |
| DEMO_SCRIPT.md | デモ動画・ピッチスクリプト |
| TERRAFORM_GUIDE.md | Terraform 初期化・運用ガイド |
| GETTING_STARTED.md | 開発開始ガイド |
本リポジトリはハッカソン応募作品です。コントリビューションは現在受け付けていませんが、コメント・フィードバックは Issue で歓迎します。
MIT License (詳細は LICENSE 参照)
- データ提供:
- 国立国会図書館 (国会会議録 検索API)
- 各自治体 (議事録・プレスリリース)
- NTT-AT (kaigiroku.net)
- 政府統計の総合窓口 e-Stat / 国土交通省 不動産情報ライブラリ
- 技術提供:
- Google Cloud (Vertex AI, Gemini, Imagen, ADK)
- Firebase
- ハッカソン主催:
- Findy 株式会社
- グーグル・クラウド・ジャパン合同会社
- 開発者: Yuji Matsumoto
- GitHub Issues: issues
「自分の街、自分の世代の話を、60 秒で。」
Citify が、若者と自治体の距離を縮めるきっかけになれたら嬉しいです。


