CaseCite — 私有法律 RAG

License: Apache-2.0

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)。不出现任何真实客户或案例。

对律所文件进行研究 知识库
Research view: a question about a liability cap answered with inline citations to three source documents and the AI-review notice Knowledge Base: indexed documents grouped in matter folders with chunk counts
合同分析 引证核查
Contracts view: analysis card with parties, executive summary and verified key terms over the contract text Citation check: result card with a negative-treatment badge, citing opinions and the AI-review notice

执业画像。产品中并未内置任何关于执业领域的内容。你说明自己的执业范围,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)。