ニュースURLやPDFを、投資家向けの構造化レポートに変換するWebアプリ
IR-Brain は、ニュース記事のURLまたはPDFを投入すると、本文抽出とAI要約を非同期で実行し、投資判断向けの観点で整理したレポートを返す .NET 8 ベースのWebアプリです。単発の要約UIではなく、認証、課金、マルチテナント、非同期ワーカー、永続化まで含めて一つのアプリとして組んでいます。
IR-Brain は、ニュース記事のURLまたはPDFを投入すると、本文抽出とAI要約を非同期で実行し、投資判断向けの観点で整理したレポートを返す .NET 8 ベースのWebアプリです。単発の要約UIではなく、認証、課金、マルチテナント、非同期ワーカー、永続化まで含めて一つのアプリとして組んでいます。
ニュースやIR資料を読んで投資判断に必要な情報を抜き出す作業は、単なる要約よりも整理の仕方が難しいと考えています。IR-Brain では、記事やPDFの本文を取って終わりではなく、投資家が見たい比較軸に寄せて結果を構造化することを重視しています。
そのため、出力は自由文だけではなく、executive summary / highlights / positives / negatives / risks / guidance / stock impact / performance / company / ticker といった項目で扱える前提にしています。
ユーザーはニュースURLまたはPDFを登録します。登録時点では Source を Pending として保存し、本文取得や要約はリクエスト同期で完結させずに SourceWorker へ渡します。処理完了後、抽出本文は DocumentText、要約結果は Summary に保存され、レポート画面はポーリングで進捗と結果を追従します。
Pending 状態で登録する
Done または Error に更新する
URL入力と PDF アップロードの両方に対応しています。URL取得は 15 秒タイムアウト、HTML抽出では script / style を除去してテキスト正規化を行います。PDF は PdfPig で全文抽出し、アップロードサイズは 20MB 上限です。
投入直後に重い処理を同期実行せず、Source を状態管理しながら HostedService の SourceWorker で非同期処理します。進行状態が明示されるため、UI、DB、ワーカーの責務を分離しやすい構成です。
要約では複数の観点プリセットを選択でき、インカム投資家、バリュー投資家、グロース投資家、イベント短期、共通比較軸などを反映できます。単なる「短くする要約」ではなく、見る人の意思決定軸を先に置いた設計です。
結果は自由文ではなく構造化されたサマリーとして保持します。company / ticker のような識別情報に加えて、highlights、positives、negatives、risks などを分けて表示できるため、後段の比較やUI整理にもつなげやすい形です。
ASP.NET Core Identity をベースに Cookie 認証を構成し、Microsoft OpenID Connect ログインに対応しています。現状の認証導線は Microsoft サインイン中心です。EmailConfirmed を考慮したユーザー管理、ロックアウト、強めのパスワード要件、Admin ロールと AdminOnly ポリシーも入れています。
Stripe を連携し、free / pro / biz のプラン定義とサブスクリプション管理を実装しています。Webhook では署名検証を行い、Tenant ごとに有効な Subscription を 1 件に制約しています。利用数は処理開始時ではなく Done 後にコミットする設計です。
ApplicationUser が TenantId を持ち、TenantProvider がログインユーザーからテナントを解決します。Source、Summary、DocumentText、Subscription、UsageCounter などのデータは Tenant 単位で分離しています。管理者向けにはテナント作成、更新、停止、再開、ユーザーの Tenant 紐付け、ロック制御、メール確認状態更新の画面があります。
SQLite を Entity Framework Core 8 で扱い、Migration を用意しています。Source と DocumentText / Summary は 1:1 関係で保持し、ユニーク制約やインデックスも設定しています。SQLite 運用なので、大規模高並行を前提にした説明は避けつつ、個人開発の一貫した永続化基盤として実装しています。
Blazor Server(InteractiveServer)
サーバー側状態管理を活かしつつ、フォーム入力やレポート画面を構成。
.NET 8 / ASP.NET Core / Minimal API / HostedService
UI本体と API、非同期処理を同じアプリケーション境界で扱っています。
Entity Framework Core 8 / SQLite
Migration、1:1 関係、TenantId ベースの分離、各種制約を実装。
ASP.NET Core Identity / Cookie 認証 / Microsoft OpenID Connect
EmailConfirmed、ロックアウト、AdminOnly ポリシーあり。
Azure Key Vault / Azure OpenAI / Azure AI Search / Stripe / SignalR / PdfPig
AI、機密情報管理、課金、PDF抽出などを必要範囲で接続しています。
SourceWorker を HostedService として分離したことで、UIから見える登録処理と、時間のかかる本文抽出・要約処理を分けています。Source の状態遷移を軸にすることで、後から失敗時挙動や再試行戦略を整理しやすい土台になっています。
Azure OpenAI は ChatClient / EmbeddingClient を利用できる構成ですが、利用不可時は DummySummarizer にフォールバックする実装があります。AI 接続の有無でアプリ全体が起動不能にならないようにしている点は、開発段階でも扱いやすい設計です。
TenantId を主要エンティティに持たせ、アプリ利用者とデータ境界を明確にしています。個人開発のアプリでも、後から権限や課金を足すのではなく、最初からテナント単位でまとめる設計に寄せています。
サブスクリプションは Tenant ごとに有効 1 件へ制約し、課金状態を曖昧にしにくくしています。利用数も成功前に先行計上せず、処理完了後にコミットするため、課金と処理成功がずれにくい設計です。現状の課金予約は改善余地がありますが、制約の置き方は明確です。
起動時に migration と seed を流す仕組みを持たせ、初期管理者や基本データの立ち上がりをコード側で完結させています。開発環境とデプロイ先での初期差分を減らしやすい構成です。
Azure Key Vault の読み込みに失敗しても起動継続できるようにしており、Managed Identity 優先、API Key フォールバックの実装もあります。Azure App Service 上の SQLite 配置も考慮しており、構成の前提がコードに反映されています。
IR-Brain の特徴は、ニュースやPDFを要約すること自体ではなく、投資判断に使う情報の並び方まで含めて設計している点です。投資家の観点プリセットを選べること、結果を構造化データとして持つことにより、出力の使い方が最初から具体化されています。
ポートフォリオではフロントだけが見えやすいですが、このアプリでは Blazor UI の背後に、Minimal API、Identity、Worker、SQLite、Stripe、Key Vault、Tenant 管理まで実装しています。画面を作るだけでなく、アプリとして継続運用できる形に寄せようとしている点を強く出したい制作物です。
IR-Brain は、ニュースURLやPDFを入力として、本文抽出、AI要約、構造化レポート表示までをつなぐ Web アプリです。見せたい価値は「要約できます」ではなく、投資判断向けの情報整理を、UI・API・Worker・DB・認証・課金・テナント管理まで含めて一体実装している点にあります。
個人開発の段階でも、処理の流れ、データ境界、権限、課金、失敗時フォールバックまで考慮して組んでいるため、単機能デモではなく、実装力の広さと設計の接続性を見せられる制作物になっています。