Harvey raised 500M for legal AI, I built the same and open sourced it
Harvey raised 500M for legal AI, I built the same and open sourced it (github.com)
要約
HarveyがリーガルAIで5億ドルを調達したのに対し、投稿者は同様の機能をオープンソースで開発した「CaseCite」を紹介しています。CaseCiteは、プライベートな法的RAG(Retrieval-Augmented Generation)プラットフォームであり、セルフホスト可能で、法律事務所の文書をアップロードして質問したり、判例や裁判官を調査したりできます。すべてのデータはユーザーのサーバーに保存され、AIプロバイダーへのデータ送信はユーザーが設定したAPIキーを通じて行われ、プライバシーとセキュリティを確保しています。
全文翻訳
CaseCite — Private Legal RAG
CaseCiteは、オープンソースでセルフホスト可能な法的リサーチプラットフォームです。事務所の文書をアップロードし、質問し、判例や裁判官を調査できます — あなたが管理するインフラストラクチャ上で。文書、検索インデックス、チャット履歴はすべてあなたのサーバーに保存されます。AI機能は、あなたが設定したAIプロバイダーに、あなた自身のAPIキー(BYOK)を使用して質問と関連文書テキストを送信します。CaseCiteのメンテナーに何も送信されず、テレメトリもありません。あなたのインフラストラクチャから何が送信されるかを参照してください。
What it does
1つのログインの後ろにある8つのツールが、すべて同じ文書コーパスを読み取ります。
Research (/research) | 事務所の文書をチャット — キーワード(BM25)による候補の再スコアリングを備えたセマンティック検索、およびソースへのインライン引用。 |
Documents (/documents) | コーパスのアップロード、インデックス化、整理。Google Drive、OneDrive、Box、Dropbox、iManage、NetDocuments、Filevine、またはClioからインポート — OAuth同期、またはOAuth検証が不要なファイルピッカー。 |
Contracts (/contracts) | 完全な契約レビューパイプライン:インデックス化された契約または貼り付けられたテキストを分析し、単一の契約とチャットし、ベースラインに対して2〜4の契約を条項ごとに比較し、レッドライン、ドラフト、または分析自体をエクスポートします。 |
Drafting (/drafting) | ナレッジベースから選択した最大4つの文書に基づいた文書を作成します。サーバーサイドのテキスト抽出とPDF変換を備えています。長文文書(30ページの契約)の目標長を設定します。まずセクションプランを確認し、次に各セクションが完全な参照に対して独自のコンテキストウィンドウで作成され、全体が調整されます。長文ドラフトの改訂は、それが触れるセクションにスコープされます。 |
Case view (/case/:id) | CourtListenerの意見を開き、直接チャットします。 |
Authority map (/case-citations) | 選択した文書全体で引用されている権威をマッピングします。 |
Judge intel (/judge-intel) | CourtListenerからの裁判官分析。 |
Legal tools (/tools) | 判例検索、引用チェック(Shepard's/KeyCiteの代替ではない、引用された意見のネガティブな扱いの言語のスキャン)、先例、dockets、口頭弁論、および判例のトレンド。 |
Screenshots
モックされたAPIと架空の事務所、案件、判例データに対して実際のUIからキャプチャされました(frontend/e2e/screenshots.spec.ts)。実際のクライアントや判例は表示されていません。
Practice profile. どのようなプラクティスエリアに関するものも、製品に組み込まれていません。あなたが実践していることを述べると、CaseCiteはそのプラクティスで重要なことのプロファイルをドラフトし、あなたはそれを編集して所有します(設定で保存)。その後、すべてのレビュー、レッドライン、ドラフトに常時コンテキストとして付随します。
すべてのAI生成された回答、分析、ドラフトには、依存する前にソース文書と現在の法律に対して検証するようにという通知が付随します。CaseCiteはリサーチエイドであり、弁護士の判断やシテーターの代替ではありません。
What leaves your infrastructure
文書、ベクトルインデックス、チャット履歴、分析は、あなたのデプロイメントにのみ保存されます。AI機能の使用は、あなたが選択したサードパーティにコンテンツを送信します。
- 文書のアップロードは、そのテキストを埋め込みプロバイダー(デフォルトではOpenAI、設定されていればVoyageまたはCohere)に送信します。
- 質問、分析、またはドラフトの作成は、質問と関連文書テキストをLLMプロバイダー(OpenAI、Anthropic、またはGemini)に送信します。
- 判例ツールは、検索クエリと引用をCourtListenerに送信します。
文書テキストを完全にネットワーク内に保持するには、両方のモデルを自分で実行してください。OPENAI_BASE_URL(チャット)およびEMBEDDING_BASE_URL(埋め込み)を、あなたがホストするOpenAI互換サーバーに設定します。最初のものだけを設定しても、文書テキストは埋め込みのためにOpenAIに送信されます。送信されるデータフローの完全なリストと、それらを制限する方法は、docs/subprocessors.mdにあります。
License & use
Copyright 2026 Thomas Unise. CaseCiteは、OSI承認の寛容なライセンスであるApache License 2.0(LICENSE)の下でオープンソースです。平易な言葉で言うと:
- ✅セルフホスト、内部使用または他者向けに、変更ありなしで無料。
- ✅変更、フォーク、再配布、販売、プロプライエタリ製品内での使用を含む、著作権およびライセンス通知とNOTICE.mdの帰属表示を保持し、変更した内容を明記する限り無料。
- ✅貢献者は、MITライセンスにはない明示的な特許ライセンスを貢献に対して付与します。
- あなたの文書、プロンプト、出力はあなたのものです。ライセンスはCaseCiteコードを対象とし、それを通過させるものは対象としません。
商用サポートおよびプライベートインストールは、メンテナーである@thomasuniseから利用可能です。SUPPORT.mdを参照してください。バージョン1.3.0までのバージョンはElastic License 2.0の下でリリースされました。そのライセンスはそれらのバージョンに引き続き適用されます。
Quick start
Prerequisites
- Docker + Docker Compose
openssl(シークレット生成用)- AIプロバイダーAPIキー(OpenAIが最も簡単な開始点です。チャットと埋め込みの両方をカバーします)。サーバーレベルではオプション — 各ユーザーが自身のキーを保存できます。
Run it (self-contained: bundles Postgres, Redis, and an HTTPS proxy)
git clone https://github.com/thomasunise/casecite.git && cd casecite
cp .env.example .env
# 1. REQUIRED secrets 3つを生成します(.env.exampleのプレースホルダーは
# 意図的に起動を拒否します)。各値を.envにコピーします:
openssl rand -hex 32 # -> SECRET_KEY
openssl rand -hex 32 # -> AUDIT_HMAC_KEY
openssl rand -hex 16 # -> ENCRYPTION_SALT
# 2. .envでOPENAI_API_KEY(または別のプロバイダー)も設定します(または空のままにして、サインイン後に設定でキーを保存します)。次に、「Bundled production stack」セクションのDOMAIN、POSTGRES_PASSWORD、REDIS_PASSWORDのコメントを解除して設定します(生成ヒントはファイル内にあります。マシンで試すにはDOMAIN=localhostを使用します)。CORS_ORIGINSとALLOWED_HOSTSはDOMAINからデフォルト設定されます。
# REGISTRATION_BOOTSTRAP_TOKENも設定します(openssl rand -hex 16) — 最初のユーザーを作成するために必要です。
# 3. .envでDISK_ENCRYPTION_ACKNOWLEDGED=trueを設定します(起動に必要)。
# これが認識すること:アプリはBYOKキーとアップロードされた文書を
# アプリケーションレイヤー(AES-256-GCM)で暗号化しますが、派生されたテキスト(ベクトルチャンク、チャット履歴、分析)は、アプリ、Postgres、
# Redisボリュームにクリアテキストで保存されます — ホストのフルディスク暗号化はあなたの責任です。
# 4. フルスタック(バンドルされたPostgres + Redis + Caddy)を起動します:
docker compose -f docker-compose.prod.yml up -d
python3 scripts/setup_production.py --create-env --domain <host>はステップ1〜2を自動で行います(すべてのシークレットを生成し、モード0600で.envを書き込みます)。
次にhttps://$DOMAIN(DOMAIN=localhostの場合:https://localhost)を開きます。localhostトライアルでは、CaddyはHTTPをHTTPSにリダイレクトし、独自の自己署名ローカルCAから証明書を提供します — 初回訪問時のブラウザ警告は予想されるものです。docs/deployment.mdの「TLS on Internal Networks」を参照して、そのCAを信頼するか、独自の証明書を持参してください。
最初に登録したアカウントが管理者になり、それを登録するには.envのREGISTRATION_BOOTSTRAP_TOKENが必要です — そのため、新しいインスタンスに到達した他の誰もそれを主張できません。正確なコマンドは、docs/deployment.mdの「Create the admin account」の下にあります。その後、設定から同僚を招待してください → Users。セルフサービス登録はデフォルトでオフになっています。
既存のリバースプロキシ(Coolify/Traefik)の後ろにデプロイしていますか?ルート
docker-compose.ymlを使用してください(外部PostgresとRedisを想定し、永続データボリュームを宣言します)。deploy/COOLIFY-SETUP.mdを読み、TRUSTED_PROXIESをプロキシのサブネットまたはクライアントIPに設定する必要があります。
Key custody (BYOK)
ユーザーは設定モーダルを介してAIプロバイダーキーを提供します。事務所の評価担当者が知っておくべきキーの管理について:
- ユーザーごとのキーは、データボリューム上のファイルストアに、AES-256-GCMで暗号化されてサーバーサイドに保存されます(PBKDF2キー導出、HKDFレコードごとの分離)。
- キーはマスク表示のみされ、ブラウザには送信されません。バックエンドは各リクエストでオンデマンドで復号化します。
- 環境変数で設定されたフォールバックキー(例:
.envのOPENAI_API_KEY)は、インストールのすべてのユーザーによって共有されます — ユーザーごとのコスト配分には、ユーザーごとのBYOKキーが必要です。 ENCRYPTION_SALTは、保存されたキーを失うことなくローテーションできます。古い値をENCRYPTION_SALT_PREVIOUSに保持し、バックエンドコンテナ内でpython -m app.utils.reencryptを実行してください —docs/secret-rotation.mdを参照してください。SECRET_KEYは、保存された文書を読み取れなくすることなくローテーションできません。安全に保管し、サーバー外にバックアップしてください。
Configuration
Required env vars
スタックは、これらのいずれかが欠落しているか、プレースホルダーのままの場合、起動時に閉じた状態になります。
| Variable | Description |
|---|---|
SECRET_KEY | JWT/CSRF署名キーおよびアットレスト暗号化のルート — openssl rand -hex 32(初回実行後は変更しないでください) |
ENCRYPTION_SALT | アットレスト暗号化ソルト — openssl rand -hex 16(初回実行後は変更しないでください(ローテーション手順を除く)) |
AUDIT_HMAC_KEY | 監査ログチェーンキー、少なくとも32文字 — openssl rand -hex 32 |
POSTGRES_PASSWORD | バンドルされたPostgresのパスワード |
REDIS_PASSWORD | バンドルされたRedisのパスワード |
DOMAIN | 公開ホスト名(またはlocalhost);CORS_ORIGINS + ALLOWED_HOSTSはデフォルトでこれに設定されます |
DISK_ENCRYPTION_ACKNOWLEDGED | ホストボリュームのフルディスク暗号化があなたの責任であることを認識するためにtrueに設定します(アプリレイヤーAES-256-GCMはBYOKキー+元の文書をカバーします。派生テキストはクリアテキストです) |
REGISTRATION_BOOTSTRAP_TOKEN | 最初の(管理者)アカウントを登録するために必要 — openssl rand -hex 16 |
起動には必須ではありませんが、製品はこれなしではほとんど機能しません。
| Variable | Description |
|---|---|
OPENAI_API_KEY (or another provider) | すべてのユーザーが共有するサーバーレベルのプロバイダーキー。これがない場合、各ユーザーはチャット、分析、またはインデックス作成が機能する前に、設定で独自のキーを保存する必要があります。 |
COURTLISTENER_API_TOKEN | CourtListenerはアプリ内の唯一の判例ソースです。引用チェックにはトークンが必要ですが、他の判例ツールはトークンなしでも動作しますが、レート制限が厳しくなります。無料トークン。 CourtListener API tokenを参照してください。 |
ルート
docker-compose.yml(外部DB/Redis)を使用していますか?その場合、DATABASE_URL、REDIS_URL、CORS_ORIGINS、ALLOWED_HOSTSが直接必要になり、マネージドデータベースの場合はDB_SSL=requireを設定します。
Optional env vars
| Variable | Default | Description |
|---|---|---|
ANTHROPIC_API_KEY | — | Claudeアクセス |
VOYAGE_API_KEY | — | Voyage AIリーガル埋め込み |
OPENAI_BASE_URL | — | チャット用のOpenAI互換エンドポイント(セルフホストモデルまたはゲートウェイ) |
EMBEDDING_BASE_URL | — | 埋め込み用のOpenAI互換エンドポイント。文書テキストをネットワーク内に保持するためにOPENAI_BASE_URLと共に設定します |
VECTOR_DB | chroma | chroma(ローカル)またはpinecone(Pineconeで文書テキストを保存) |
TRUSTED_PROXIES | 127.0.0.1 | リバースプロキシIP/CIDR — プロキシの後ろでは必須 |
REQUIRE_MFA | false | すべてのパスワードアカウントにTOTP MFAとリカバリコードの登録を要求する |
SESSION_ABSOLUTE_TIMEOUT_HOURS / SESSION_IDLE_TIMEOUT_MINUTES | 8 / 120 | セッションの有効期間とアイドルタイムアウト |
ALLOW_REGISTRATION | false | 最初の後、セルフサービスサインアップを許可する |
SENDGRID_API_KEY | — | パスワードリセットメールを有効にする(アプリ内でのパスワード変更はこれなしで機能します) |
.env.exampleはすべての設定を文書化しています。
Connector notes
- 同期APIは1つのフォルダ(
folder_id)をインポートするか、明示的なsync_allでアカウント全体をインポートします。UIにはまだフォルダピッカーがありません。「Sync Now」は、そのように表示される2回目の確認の後、接続されたアカウント全体をインポートします。選択したファイルを取り込むには、代わりにファイルピッカーを使用してください。 - Filevineは事務所全体で1つのAPIキーを使用するため、
FILEVINE_ENABLED=trueが設定されていない限りオフであり、管理者のみが利用できます。 - iManageおよびNetDocumentsコネクタは、ベンダーの公開APIに対して実装されていますが、ライブテナントに対して検証されていません。依存する前に、ご自身の環境でテストしてください。
- MicrosoftおよびGoogle接続は読み取り専用スコープを要求します。このリリースより前に作成された接続は、再接続されるまで、より広い権限を保持します。
CourtListener API token
Legal tools、Judge intel、Case view、および戦略エンジンの判例側はすべてCourtListenerから読み取ります。CourtListenerはアプリ内の唯一の判例ソースです。アプリはトークンなしで開始しますが、製品の判例部分はトークンなしでは使用できません。
- 引用チェックはトークンなしではハードフェイルします —
validate_citationは実行を拒否し、「token required」エラーを返します。これはトークンを設定する場所を示します(backend/app/services/courtlistener_client.pyの_check_token)。 - 他のすべてのCourtListener呼び出しは匿名アクセスにフォールバックしますが、これは実際の負荷の下ではリサーチ機能が使用不能になるほど厳しくレート制限されています。
https://www.courtlistener.com/help/api/rest/#permissionsで無料トークンを取得し、.envにCOURTLISTENER_API_TOKENを設定するか、管理者としてインスタンス全体に保存します(Settings → API Keys、またはPOST /api/v1/admin/integrations/courtlistener)。保存されたトークンは、再起動なしで実行時に.env値をオーバーライドします。
Project structure
backend/
app/
main.py FastAPI app, middleware, health
config.py Pydantic settings
routers/ API routers
services/
rag/ RAG pipeline (search, generation, citations, intent)
vectordb.py ChromaDB/Pinecone abstraction
embeddings.py Multi-provider embeddings
auth.py JWT auth
strategy.py Matter strategy briefs
courtlistener.py CourtListener API
...
middleware/ Security, CSRF
migrations/ Alembic migrations
frontend/
src/
App.tsx
api/ Per-domain API clients
views/ Page views
stores/ Zustand stores
components/ Shared components + modals
layout/ App shell
scripts/ Backup/restore, production setup, key rotation, NOTICE generator
docs/ Deployment, data flows, secret rotation, incident response, ADRs
Dockerfile Unified image (frontend + backend)
docker-compose.prod.yml Bundled stack: Caddy + Postgres + Redis + backend
docker-compose.yml Behind an existing proxy (Coolify/Traefik); external Postgres + Redis
docker-compose.dev.yml Local development
API-only (no UI yet)
これらは実装されており、API経由でアクセス可能ですが、フロントエンドはまだ公開していません。プレビューとして扱ってください。
- Matters (
/api/v1/matters) — 案件レコード、メンバーシップ、およびメンバー間の文書とチャットの共有。案件の作成とメンバーシップの変更にはmatters.manage権限が必要です。 - Strategy briefs (
/api/v1/strategy) — 各命題はCourtListenerで検索され、候補となる意見が読み取られ、実際の意見テキストで逐語的な引用が見つかった場合にのみ引用が保持されます。サポートされていない引用は、表示されずにドロップされます。 - Azure AD SSO — バックエンドトークン交換のみ。サインインボタンはありません。SAML、汎用OIDC、SCIMはサポートされていません。
機能テーブルの他のすべて、およびユーザー管理と監査ログ(設定、管理者のみ)にはUIがあります。
Security
- オプションまたは必須のTOTP MFAとリカバリコードを備えたパスワードサインイン(PBKDF2-SHA256)。メールによるパスワードリセットとアプリ内でのパスワード変更。
- httpOnly CookieのJWTアクセストークンとリフレッシュトークンのローテーション、RedisでのJTI失効(本番環境で必須)。「すべてからサインアウト」。
- ユーザーあたり最大5セッション、8時間の絶対有効期間とアイドルタイムアウト。
- 管理者によってロールごとに調整可能なロールベースの権限(
require_permission)。 - すべての文書、チャット、分析に対するユーザーごと(および案件ごと)のスコープ。
- CSRFダブルサブミットCookie、HMAC署名付き。IPごとのレート制限。アカウントロックアウト。
- アップロードされたオリジナル、APIキー、コネクタトークン、MFAシークレットのAES-256-GCMアットレスト暗号化。ベクトルインデックスとデータベースは、あなたが提供するディスク暗号化に依存します。
- CSP、HSTS、X-Frame-Options、Permissions-Policyヘッダー。
- HMAC-SHA256チェーンハッシュを備えた監査ログ。起動時およびオンデマンドで検証されます。
CaseCiteはセキュリティ認証(SOC 2、ISO 27001、HIPAA)を持っていません。それが何を行い、何を行わないかはSECURITY.mdに記載されており、脆弱性の報告方法も説明しています。既知のギャップはROADMAP.mdにリストされています。
Contributing
CONTRIBUTING.mdを参照してください。PR歓迎。貢献は、開発者証明書オブオリジン(DCO)サインオフ(git commit -s)の下でApache License 2.0で受け付けられます。