CaseCite — 私有法律 RAG
CaseCite 是一个开源、自托管法律研究平台。上传你律所的文件、提出问题,并研究案例与法官——全部运行在你掌控的基础设施上。文档、搜索索引和聊天记录都存储在你自己的服务器上。AI 功能会将你的问题和相关文档文本发送给你所配置的AI 提供商,使用你自己的 API 密钥(BYOK);不会向 CaseCite 维护者发送任何内容,也没有遥测。参见哪些数据会离开你的基础设施。
功能概览
一个登录入口后的八个工具,全部读取同一份文档语料库。
研究(/research) |
基于你律所文档的聊天——语义检索,并对候选结果进行关键词(BM25)重打分,同时提供指向来源的行内引用。 |
文档(/documents) |
上传、索引并整理你的语料库。可从 Google Drive、OneDrive、Box、Dropbox、Filevine 或 Clio 导入——支持 OAuth 同步,或在无需 OAuth 验证时使用文件选择器。iManage 和 NetDocuments 连接器已存在但属于实验性功能(未针对真实租户测试),除非EXPERIMENTAL_CONNECTORS=true,否则默认关闭。 |
合同(/contracts) |
完整的合同审查流水线:分析已索引的合同或粘贴的文本、与单份合同对话、将 2–4 份合同与基线逐条比对,并导出修订稿、草稿或分析本身。 |
起草(/drafting) |
基于你从知识库中挑选的最多四份文档起草文件,支持服务端文本提取和 PDF 转换。可为长文档(30 页的协议)设定目标长度:你先审阅章节规划,然后每个章节在各自的上下文窗口中对照完整参考资料起草,最后整体进行协调统一。对长草稿的修订仅限于其涉及的章节。 |
案例视图(/case/:id) |
打开一份 CourtListener 判决意见并直接与之对话。 |
权威图谱(/case-citations) |
梳理你所选文档中引用的权威判例。 |
法官情报(/judge-intel) |
来自 CourtListener 的法官分析。 |
法律工具(/tools) |
案例查询、引用核查(扫描引用该案的判决意见中的负面处理措辞——不能替代 Shepard's/KeyCite)、先例、案卷、口头辩论以及判例趋势。 |
截图
截取自真实 UI,针对模拟 API 和虚构的律所、案件及案例数据(frontend/e2e/screenshots.spec.ts)。不出现任何真实客户或案例。
| 对律所文件进行研究 | 知识库 |
|---|---|
![]() |
![]() |
| 合同分析 | 引证核查 |
|---|---|
![]() |
![]() |
执业画像。产品中并未内置任何关于执业领域的内容。你说明自己的执业范围,CaseCite 会起草一份该执业领域中重要事项的画像,由你编辑并拥有(通过设置保存)。随后它会作为常驻上下文,伴随每一次审阅、修订和起草。
每一个 AI 生成的回答、分析和草稿都附带提示:在依赖之前,请对照源文件和现行法律进行核实。CaseCite 是研究辅助工具,不能替代律师的判断,也不能替代引证工具。
哪些内容会离开你的基础设施
文件、向量索引、聊天记录和分析存储仅存储在你的部署环境中。使用 AI 功能会将内容传输给
- 你选择的第三方:上传文件会将其文本发送给嵌入服务提供商(默认为 OpenAI;如已配置则为 Voyage 或 Cohere)。
- 提问、分析或起草会将问题和相关文件文本发送给 LLM 提供商(OpenAI、Anthropic 或 Gemini)。
- 判例法工具会将搜索查询和引证发送给 CourtListener。
若要让文件文本完全留在你的网络中,请自行运行两个模型:将OPENAI_BASE_URL(聊天)和 EMBEDDING_BASE_URL(嵌入)设置为docs/subprocessors.md。
许可与使用
Copyright 2026 Thomas Unise。CaseCite 以Apache License 2.0(LICENSE)开源,这是一份经 OSI 批准的宽松许可证。通俗来说:
- ✅ 可自由自托管,用于内部或供他人使用,无论是否修改。
- ✅ 可自由修改、分叉、再分发和销售,包括嵌入专有产品中,只要你保留版权和许可声明以及NOTICE.md中的署名,并说明你做了哪些改动。
- ✅ 贡献者为其贡献授予明确的专利许可,这是 MIT 许可证所不具备的。
- 你的文件、提示词和输出都归你所有。该许可证覆盖的是 CaseCite 代码,而非你通过它处理的内容。
维护者提供商业支持和私有部署,@thomasunise。参见SUPPORT.md. 1.3.0 及之前的版本以 Elastic License 2.0 发布;该许可证继续适用于这些版本。
快速开始
前置条件
- Docker + Docker Compose
openssl(用于生成密钥)- 一个 AI 提供商的 API 密钥(OpenAI 是最简单的起点:它同时覆盖聊天和嵌入)。在服务器层面是可选的——每个用户都可以保存自己的密钥。
运行它(自包含:捆绑了 Postgres、Redis 和 HTTPS 代理)
git clone https://github.com/thomasunise/casecite.git && cd casecite cp .env.example .env #1. 生成三个必需的密钥(.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(或者留空,登录后在 #设置中保存一个密钥),然后取消注释并设置 DOMAIN、 #POSTGRES_PASSWORD 和 REDIS_PASSWORD,位于 "Bundled production stack" #部分(生成提示在文件中;使用 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 卷中以明文存储——主机的全盘加密是 YOUR 的责任。 #4. 启动完整栈(捆绑的 Postgres + Redis + Caddy): #为你执行步骤 1–2(它会生成每个密钥并写入 docker compose -f docker-compose.prod.yml up -d
python3 scripts/setup_production.py --create-env --domain <host>(权限模式 0600)。.env然后打开
https://$DOMAIN(使用:DOMAIN=localhosthttps://localhost)。在 localhost 试用中,Caddy 会将 HTTP 重定向到 HTTPS,并提供来自其自签名本地 CA 的证书——首次访问时的浏览器警告是预期内的。请参阅docs/deployment.md中的 "TLS on Internal Networks" 以信任该 CA 或使用你自己的证书。
你注册的第一个账户将成为管理员,注册它需要REGISTRATION_BOOTSTRAP_TOKEN来自.env——这样其他任何访问到全新实例的人都无法认领它。确切命令位于docs/deployment.md中的 "Create the admin account"。之后,从 设置 → 用户 邀请同事;自助注册默认关闭。
部署在现有反向代理(Coolify/Traefik)后面?请使用根
docker-compose.yml代替(它期望外部 Postgres 和 Redis,并声明持久化数据卷),并阅读deploy/COOLIFY-SETUP.md—— 你还必须将TRUSTED_PROXIES设置为代理的子网或客户端 IP,否则会合并为一个。
密钥托管(BYOK)
用户通过设置弹窗提供 AI 提供商密钥。企业评估者应了解的托管要点:
- 每个用户的密钥存储在服务端,采用 AES-256-GCM 加密(PBKDF2 密钥派生,HKDF 按记录分离),存放在数据卷上的文件存储中。
- 密钥仅以掩码形式显示,并且绝不会发送到浏览器;后端在每次请求时按需解密。
- 环境变量配置的备用密钥(例如
OPENAI_API_KEY在.env中)由所有用户共享——按用户成本归因需要按用户的 BYOK 密钥。 ENCRYPTION_SALT可以在不丢失已存储密钥的情况下轮换:将旧值保留在ENCRYPTION_SALT_PREVIOUS中,并在后端容器内运行python -m app.utils.reencrypt——参见docs/secret-rotation.md。SECRET_KEY无法在不使已存储文档不可读的情况下轮换;请妥善保管并备份到服务器之外。
配置
必需的环境变量
如果其中任何一项缺失或仍为占位符,堆栈将在启动时失败关闭。
| 变量 | 描述 |
|---|---|
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 |
启动时不需要,但没有它们产品几乎无法使用:
| 变量 | 描述 |
|---|---|
OPENAI_API_KEY (或其他提供商) |
所有用户共享的服务器级提供商密钥。没有它,每个用户必须在设置中保存自己的密钥,聊天、分析或索引才能工作。 |
COURTLISTENER_API_TOKEN |
CourtListener 是应用中唯一的判例法来源。引文检查需要令牌;其他判例法工具无需令牌即可使用,但会受到严格限流。免费令牌;参见CourtListener API 令牌。 |
使用根
docker-compose.yml(外部 DB/Redis)代替捆绑的DATABASE_URL、REDIS_URL、CORS_ORIGINS、和ALLOWED_HOSTS为直接必需,并设置DB_SSL=require用于托管数据库。
可选环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
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记录每一项设置。
连接器说明
- 同步 API 导入一个文件夹(
folder_id)或,在显式指定sync_all时,导入整个账户。UI 目前没有文件夹选择器:“立即同步”会在第二次确认(确认内容已说明这一点)后导入整个已连接账户。要导入选定的文件,请改用文件选择器。Clio 的列表是账户级的,因此 Clio 无法同步单个文件夹。 - Filevine 使用一个事务所范围的 API 密钥,因此在
FILEVINE_ENABLED=true之前处于关闭状态,之后仅对管理员可用。 - iManage 和 NetDocuments 连接器处于实验性阶段。它们
是针对厂商公开的 API 实现的,但尚未针对真实租户进行测试,因此默认不注册:它们不会
出现在连接器列表中,且其所有路由都会被拒绝。设置
EXPERIMENTAL_CONNECTORS=true以启用它们(启用后它们会以"experimental": true列出)。如果你针对真实租户测试了它们, 维护者欢迎你报告哪些功能可用、哪些不可用。 - Microsoft 和 Google 连接请求只读权限范围。在此版本之前建立的连接会保留其更宽泛的授权,直到重新连接。
CourtListener API 令牌
法律工具、法官情报、案件视图以及策略引擎的法理部分都读取自CourtListener。CourtListener 是 应用中唯一的法理来源。应用在没有令牌的情况下也能启动,但没有令牌时产品的法理部分 无法使用:
- 引用检查在没有令牌时会硬性失败—
validate_citation拒绝运行 并返回“需要令牌”错误,该错误会指明在哪里设置令牌 (_check_token位于backend/app/services/courtlistener_client.py)。 - 其他所有 CourtListener 调用都会回退到匿名访问,其速率限制非常严格,以至于在任何 真实负载下研究功能都会变得不可用。
获取一个免费令牌,地址为https://www.courtlistener.com/help/api/rest/#permissions,然后要么设置COURTLISTENER_API_TOKEN在.env中,要么以管理员身份将其保存为实例级配置
(Settings → API Keys,或POST /api/v1/admin/integrations/courtlistener)——
存储的 token 会在运行时覆盖.env值,无需重启。
项目结构
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(暂无 UI)
这些功能已实现并可通过 API 访问,但前端尚未 暴露它们。请将其视为预览:
- 事项(
/api/v1/matters)——事项记录、成员资格,以及成员之间 文档和聊天的共享。创建事项和更改 成员资格需要matters.manage权限。 - 策略简报(
/api/v1/strategy)——每个命题都会在 CourtListener 上检索,读取候选意见书,只有当能在真实意见书文本中 定位到逐字引用时,才会保留该引文。不支持的 引文会被丢弃,而不是展示出来。 - Azure AD SSO——仅后端 token 交换;没有登录按钮。 不支持 SAML、通用 OIDC 和 SCIM。
上表功能中的其他所有内容,以及用户管理和 审计日志(Settings,仅管理员),都有 UI。
安全
- 密码登录(PBKDF2-SHA256),可选或强制 TOTP MFA 和 恢复码;通过电子邮件重置密码,以及在应用中修改密码
- JWT 访问令牌,配合 httpOnly cookie 中的轮换刷新令牌,在 Redis 中 撤销 JTI(生产环境必需),"在所有地方退出登录"
- 每个用户最多 5 个会话,绝对生命周期为 8 小时,并有空闲 超时
- 基于角色的权限(
require_permission),可由管理员按角色调整 - 每个文档、聊天和分析都按用户(以及按事项)限定作用域
- CSRF 双重提交 cookie,使用 HMAC 签名;按 IP 限流;账户锁定
- 对上传的原始文件、API 密钥、连接器 token 和 MFA 密钥使用 AES-256-GCM 静态加密。向量索引和数据库依赖你提供的磁盘 加密
- CSP、HSTS、X-Frame-Options、Permissions-Policy 响应头
- 审计日志使用 HMAC-SHA256 链式哈希,在启动时和按需验证
CaseCite 不持有任何安全认证(SOC 2、ISO 27001、HIPAA)。它 做什么和不做什么在SECURITY.md中描述,其中还 说明了如何报告漏洞;已知缺口列在ROADMAP.md中。
贡献
参见CONTRIBUTING.md欢迎提交 PR。贡献需在 Apache License 2.0 下接受,并附上开发者原创声明(Developer Certificate of Origin)签署(git commit -s)。



