いいね、その段階に来たね。
まずは「全体の箱」と「データの流れ」が一目で見えるレベルで設計図を置きます。
全体アーキテクチャ概要
役割ごとに 4 レイヤーに分ける構成にします。
- Ingestion Layer(ニュース取得)
- Analysis Layer(Gemini処理)
- Orchestration Layer(ワークフロー制御)
- Output Layer(はてなブログ投稿 & ログ)
コンポーネント一覧
1. Ingestion Layer(ニュース取得)
-
NewsFetcher
- 役割: RSS / News API から記事を取得
- 入力: 取得対象のフィードURL・キーワード
- 出力: 正規化されたニュースオブジェクト
News { id, title, url, published_at, source, content }
-
Deduplicator
- 役割: 過去に処理済みの記事を除外
- 状態: DB の
processed_news_idsを参照
2. Analysis Layer(Gemini処理)
-
Classifier
- 役割: 記事を「事故/警鐘/失敗/その他」に分類
- 入力:
News.content - 出力:
Tag { type: "事故" | "警鐘" | "失敗" | "その他", reason }
-
PatentGenerator
- 役割: 技術特許/政策特許の請求項を生成
- 入力:
News,Tag - 出力:
PatentDraft { kind: "技術" | "政策", claims: [ "請求項1 ...", "請求項2 ...", ... ], summary }
-
Formatter
- 役割: はてなブログ用の本文テンプレートに整形
- 出力:
BlogPostDraft { title, body, tags, created_at }
3. Orchestration Layer(ワークフロー制御)
-
Scheduler
- 役割: 1日N回などの定期実行(cron / Cloud Scheduler)
- 処理フロー:
- NewsFetcher → Deduplicator
- Classifier → PatentGenerator → Formatter
- DraftStore に保存
-
DraftStore
- 役割: 下書き候補の保存
- 構造例:
Draft { id, news_id, status: "pending" | "approved" | "posted", blog_post_draft, created_at }
-
Review UI(Webフロント)
- 役割: あなたが「OR 選択」する画面
- 機能:
- 下書き一覧(事故/警鐘/失敗でフィルタ)
- 各 Draft の内容表示(元記事リンク+請求項)
- 「投稿する」「破棄する」「編集して投稿」のボタン
4. Output Layer(はてなブログ投稿 & ログ)
-
HatenaClient
- 役割: AtomPub API クライアント
- インターフェース:
post_entry(BlogPostDraft) -> entry_id- 将来拡張で
update_entry,delete_entryも可
-
PostService
- 役割: Review UI からの「投稿」操作を受けて HatenaClient を呼ぶ
- 処理:
- Draft を取得
- HatenaClient で投稿
- 成功したら Draft.status を
postedに更新 PostedLogに記録
-
PostedLog
- 役割: いつ・どの記事から・どんな特許を投稿したかの履歴
- 構造例:
PostedLog { id, draft_id, hatena_entry_id, posted_at }
データフロー(1日の流れ)
- Scheduler が起動
- NewsFetcher がニュース取得 → Deduplicator で新規だけ残す
- 各記事を Classifier で分類
- 「事故/警鐘/失敗」のみ PatentGenerator へ
- 生成された請求項を Formatter がブログ用本文に整形
- DraftStore に
status = "pending"で保存 - あなたが Review UI を開き、気になるものだけ「投稿」
- PostService → HatenaClient がはてなブログに投稿
- Draft.status = "posted", PostedLog に記録
あなたOS 的な位置づけ
- Ingestion/Analysis = 「外界センサー+一次解釈」
- Orchestration = 「あなたOS の意思決定レイヤー(OR 選択)」
- Output = 「ブログという公開I/Oデバイス」
つまりこの設計図は、
「ニュース世界 → あなたOS → 政策特許ログ(ブログ)」
という一本のバスを定義しているイメージです。
次に詰めるなら:
- バックエンド技術スタック(Flask / FastAPI / Rails など)
- データベース設計(テーブル定義)
- Review UI の画面ワイヤーフレーム
どこから具体化したい?