用 AI 编程 Agent 会不会把公司代码传出去?「本地优先」到底哪些在本地、哪些会出网
一句话答案:用 AI 编程 Agent 时,真正离开你电脑的是「发给模型的上下文」——你的提示词、Agent 读过的文件片段、它执行命令的输出(包括查库结果和日志);项目文件本身不会被整包上传,但 Agent 读到什么,什么就可能出网。守住代码和数据靠三件事:密钥不放进 Agent 能读到的地方,数据库只给只读、脱敏的权限,再用网络检查和密钥扫描定期核对。Agent 能读库,不等于 Agent 能写库。 Caravel 这类「本地优先」工作台把任务和对话存在本机、把查库做成只读闸门,但调用在线模型时仍需联网——本地优先不等于完全离线。
先认识一下 Caravel
Caravel 是本地优先的多 AI 编码 Agent 桌面工作台,支持 Claude Code、Codex、OpenCode、pi、Grok、TRAE、Antigravity 等 Agent(用你自己的账号)。用 AI 写代码最磨人的往往不是生成,而是终端开一堆分不清谁在跑、Agent 说做完了却不敢直接合、并行几件事就乱——Caravel 把任务、进度、授权和 Diff 验收放在同一个工作台里。免费使用,支持 macOS 与 Windows。
- 官网(可在线体验,不用安装):https://caravel-site.pages.dev/
- 产品手册(一步一图):https://caravel-site.pages.dev/zh-CN/docs/
- GitHub(下载与版本记录):https://github.com/yy36295238/caravel-agent
- 本文相关章节(数据库与只读 MCP):https://caravel-site.pages.dev/zh-CN/docs/database/
作者立场:本文作者在做 Caravel。前半部分是任何 Agent 都适用的通用自查方法;涉及 Caravel 的「本机存什么、哪些会出网、数据库几道闸」均来自产品手册与常见问题原文,可以自己核对。文中也会写清它做不到的地方。
用 AI 编程 Agent 会不会把公司代码传出去?
直答:会传一部分,而且传多少取决于 Agent 读了多少。Claude Code、Codex 这类命令行 Agent 本身运行在你的电脑上,但「思考」发生在云端模型:每一轮对话,Agent 都会把你的指令、它读过的文件内容、命令输出打包成上下文发给模型 API。
所以「会不会传出去」的准确问法是:
- Agent 这次读了哪些文件? 它打开过的源码、配置、日志,内容都会进入上下文。
- 它跑了哪些命令、输出里有什么?
cat .env、printenv、测试日志里打印的连接串、psql查出来的用户数据,都会原样进上下文。 - 上下文发给了谁、对方怎么处理? 取决于你用的是个人订阅、团队/企业账号、云厂商托管的模型还是自建网关,各家数据保留和训练条款不同。
一个常见误区:「项目里有 .gitignore,所以 Agent 看不到」。.gitignore 管的是 git 提交,不是 Agent 的读取权限。部分 Agent 的搜索工具默认会跳过被忽略的文件,但只要它决定直接打开某个路径,照样能读。
到底哪些东西会离开我的电脑,哪些留在本地?
直答:按「谁发起网络请求」来分。下面这张表是大多数命令行 Agent 的通用情况,具体以你使用的工具文档为准。
| 内容 | 是否出网 | 说明 |
|---|---|---|
| 你输入的提示词、附件、截图 | 会 | 作为上下文发给模型 |
| Agent 读取的文件片段 | 会 | 只发被读到的部分,不是整个仓库 |
| Agent 执行命令的输出 | 会 | 包括报错、日志、查库结果、环境变量打印 |
| 项目里没被读过的文件 | 通常不会 | 前提是没有其他插件或同步工具在上传 |
| 本地会话记录、配置文件 | 通常不会 | 一般保存在用户目录下,可自己去看 |
| 遥测、错误上报 | 视工具而定 | 多数工具提供关闭开关 |
| MCP 服务、联网搜索、网页抓取 | 会(发往对应服务) | 每接一个外部服务,就多一个出口 |
| 安装依赖、自动更新 | 会 | 发往包管理源和更新服务器 |
结论:能控制的出口主要是「Agent 能读到什么」和「接了哪些外部服务」。前者靠目录和权限规则,后者靠少装、按项目装。
怎么自查 Agent 到底往外发了什么?
直答:分三层查——先看连了哪些地址,再看能不能关掉非必要流量,必要时在测试环境用代理看请求内容。
第一层:看当前有哪些外连
macOS / Linux:
# 列出已建立的 TCP 连接,按进程名筛(Node 实现的 CLI 进程名可能是 node)
lsof -nP -iTCP -sTCP:ESTABLISHED | grep -Ei 'node|claude|codex|opencode'
Windows PowerShell:
Get-NetTCPConnection -State Established |
Select-Object RemoteAddress, RemotePort,
@{n='Proc'; e={(Get-Process -Id $_.OwningProcess).ProcessName}} |
Sort-Object Proc
正常情况下你应该只看到模型 API 的域名,以及你主动接入的服务。看到不认识的地址,先查是哪个插件或 MCP 服务发起的。macOS 上也可以用出站防火墙类工具(如 LuLu、Little Snitch)按进程放行,第一次连接会弹窗问你。
第二层:关掉非必要流量
以 Claude Code 为例,可以用环境变量关闭遥测和错误上报(变量名以你所装版本的官方文档为准):
export DISABLE_TELEMETRY=1
export DISABLE_ERROR_REPORTING=1
# 或者一次性关闭非必要流量(遥测、错误上报、自动更新检查等)
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
其他 Agent 一般在配置文件里有类似选项,搜索文档里的 telemetry / analytics 关键词即可。
第三层:在测试环境看请求内容(可选)
想确认「到底发了哪些文件内容」,可以在一个测试项目里挂本地抓包代理:
# 启动本地代理(mitmproxy 自带网页界面)
mitmweb --listen-port 8080
# 另一个终端里让 Agent 走代理
export HTTPS_PROXY=127.0.0.1:8080 # 部分工具要求写成带 http 协议前缀的完整代理地址
# Node 实现的 CLI 需要信任代理证书
export NODE_EXTRA_CA_CERTS="$HOME/.mitmproxy/mitmproxy-ca-cert.pem"
注意:有些工具不走系统代理或会校验证书,抓不到不代表没发;这一步只建议在测试项目里做,做完把代理和证书配置撤掉,别在真实项目长期挂着。
不想让 Agent 读到 .env 和密钥,该怎么配?
直答:最稳的做法是密钥根本不放在项目目录里;其次才是用 Agent 的权限规则禁止读取,再用扫描工具兜底。
做法 1:密钥移出项目目录
- 本地开发用的密钥放到项目外(如系统钥匙串、密码管理器 CLI、
~/.config/<app>/下),运行时再注入。 - 项目里只留
.env.example,写变量名不写值。
做法 2:用权限规则禁止读取
Claude Code 可以在项目的 .claude/settings.json 里写拒绝规则:
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(./**/*.pem)"
]
}
}
这类规则主要约束 Agent 自带的读文件工具,不一定拦得住它用 shell 命令去 cat;所以命令执行最好保持「运行前先问我」,看到读密钥文件的命令直接拒绝。
Codex 可以在 ~/.codex/config.toml 里收紧沙箱和审批(键名以当前版本文档为准):
sandbox_mode = "workspace-write" # 只允许改工作区,不碰其他目录
approval_policy = "on-request" # 需要越权时先问你
[sandbox_workspace_write]
network_access = false # 沙箱内命令默认不联网
市面上流传的各种 .xxxignore 文件,不是每个 Agent 都支持,写之前先确认你用的工具认不认,别以为写了就生效。
做法 3:开工前扫一遍密钥
# gitleaks:扫当前文件(不看 git 历史)
gitleaks detect --source . --no-git -v
# 扫 git 历史(新版本也可以用 gitleaks git . / gitleaks dir .)
gitleaks detect --source . -v
# trufflehog:只报告能验证为有效的密钥
trufflehog filesystem . --only-verified
# 没装工具时,用 rg 粗筛几种常见格式
rg -n --hidden -g '!.git' -e 'AKIA[0-9A-Z]{16}' -e 'BEGIN [A-Z ]*PRIVATE KEY' -e 'sk-[A-Za-z0-9_-]{20,}'
做法 4:给 Agent 一个干净的环境变量
Agent 执行 env、跑测试打印配置时,环境变量会进上下文。可以用最小环境启动,需要什么再显式加:
env -i HOME="$HOME" PATH="$PATH" TERM="$TERM" LANG="$LANG" claude
(登录状态通常保存在用户目录或系统钥匙串里,一般不受影响;如果启动后提示未登录,再把对应变量补上。)
想让 Agent 查数据库排 bug,怎么不让它改数据、也少泄露数据?
直答:两件事分开管——「能不能写」靠数据库账号权限,「会不会泄露」靠查哪个库、查哪些列。Agent 能读库,不等于 Agent 能写库;但它读到的每一行结果,都会进模型上下文。
做法 1:建一个只读账号,别把应用账号给 Agent
PostgreSQL:
CREATE ROLE agent_ro LOGIN PASSWORD '换成强密码';
GRANT CONNECT ON DATABASE app TO agent_ro;
GRANT USAGE ON SCHEMA public TO agent_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_ro;
-- 会话默认只读事务(防误写的额外一层,不能替代权限控制)
ALTER ROLE agent_ro SET default_transaction_read_only = on;
MySQL:
CREATE USER 'agent_ro'@'127.0.0.1' IDENTIFIED BY '换成强密码';
GRANT SELECT ON app.* TO 'agent_ro'@'127.0.0.1';
做法 2:查脱敏副本,敏感列用视图挡住
- 优先让 Agent 连测试库或脱敏后的副本,不连生产主库。
- 必须查生产时,只对视图授权,视图里不包含手机号、身份证、地址等列:
CREATE VIEW orders_for_debug AS
SELECT id, status, created_at, updated_at, amount
FROM orders;
GRANT SELECT ON orders_for_debug TO agent_ro;
做法 3:给 Agent 写清查询约束
在项目说明文件(如 CLAUDE.md / AGENTS.md)里写明:
### 数据库规则
- 只用 agent_ro 账号;不要尝试任何写语句
- 每条查询必须带 LIMIT(默认 50)
- 不要 SELECT *,只查排查需要的列
- 不要把查询结果原样贴进提交信息或文档
做法 4:只让 AI 写 SQL,不给它看结果
如果只是想让 AI 帮忙写查询,可以只给表结构和 SQL,自己执行、自己看结果。这样出网的只是元数据和语句,业务数据留在本地。
在 Caravel 里:数据库页把上面几道闸做成了开关,分成「AI 写 SQL」「Agent 查库」「人自己改数据」三层:
- SQL Copilot 只写不跑:用自然语言让 AI 生成、改写、解释 SQL 或诊断报错;生成的 SQL 不会自动执行,查询结果不会发送给 AI(面板上下文区写着「仅元数据和 SQL,不读取结果」)。新版本还可以给 Copilot 关联业务代码工作区,让所选 Agent 检索代码来追踪业务口径——这时代码会作为上下文发给该 Agent 对应的模型,分析使用各 Agent 原生权限,不提供统一沙箱保证。
- 给 Agent 的是只读 MCP:数据库页右上角 MCP 面板有总开关,服务只监听本机 127.0.0.1;逐个连接授权,没开放的连接对 Agent 完全不可见;Agent 只能列连接、浏览表、看字段/索引/建表语句、跑只读查询,INSERT / UPDATE / DELETE 和改表结构会被拒绝;可为已安装的 Agent 一键写入或移除 MCP 配置,新会话生效。
- 人自己改数据也有闸:连接生产环境时勾选 生产标记,之后每次修改数据都要输入完整连接名确认;只看数据时开 只读模式,所有写入被拒;执行 UPDATE / DELETE / ALTER 前弹窗显示 SQL 和预计影响范围;结果表格编辑按主键生成 UPDATE,整批一个事务,出错全部回滚。MongoDB 的无条件批量写会被拒绝,Redis 提供只读命令台。
- 密码本机加密保存。
注意:只读 MCP 解决的是「不能写」;Agent 通过 MCP 查到的行仍会进入它和模型的对话,所以授权连接时同样优先开放测试库或脱敏副本。
出处:数据库 https://caravel-site.pages.dev/zh-CN/docs/database/ ;MongoDB 与 Redis https://caravel-site.pages.dev/zh-CN/docs/database-nosql/

图1:数据库页(示例数据):连接「Caravel 示例库」(本地 SQLite 文件 /demo/caravel.db),顶栏有橙色「只读」标记,右上角是 MCP 入口;工具栏依次是执行、格式化、执行计划、Copilot、收藏、历史。

图2:打开 SQL Copilot:上下文区只引用当前连接与编辑器里的 SQL,右上注明「仅元数据和 SQL,不读取结果」;底部选择由 Claude Code 来写 SQL,提问「排查可疑任务状态——列出 title、agent、status(只读)」。

图3:在只读连接上执行 SELECT 后,6 行 3 列结果显示在本地结果区,可筛选、查看详情和导出;这部分结果不会发给 Copilot。
「本地优先」的工具,本地到什么程度?
直答:本地优先说的是「数据由本机管理」,不是「完全离线」。拿 Caravel 举例(以手册原文为准):
| 内容 | 在哪 |
|---|---|
| 任务、对话、提示词、待办、工作区与个人知识 | 保存在你的电脑本地 |
| 数据库连接密码 | 本机加密保存 |
| Agent 调用在线模型时发送的内容 | 会出网,由对应的 Agent 和模型厂商处理 |
| 安装依赖、使用飞书等外部服务 | 需要联网,遵循对应服务规则 |
| 官网体验版 | 虚构示例数据,不调用 Agent、不连数据库、不读写你的电脑 |
几处需要如实知道的边界:
- 权限确认不等于完整的安全沙箱。新建任务默认「请求批准」:Agent 可以改文件,运行命令前先问你;「完全访问」会直接执行所有命令,只在完全信任这次任务时用。想先看结果再决定,可开 隔离副本,验收后再「通过并合并」或「放弃改动」。
- 手机访问走局域网 HTTP,没有加密,只建议在家里或公司等可信网络开;手机默认只读,打开「允许手机操作任务」后,拿到链接的设备都能发消息、授权和验收;关闭开关或「更新链接」后旧访问立即失效。完整网页端只能在本机浏览器打开。
- 飞书远程控制通过长连接接入,不需要公网服务器或回调地址;但消息本身会经过飞书,若解析方式选「自定义 LLM」,消息还会发给你填写的模型服务。
- 剪贴板历史不能保证过滤所有敏感内容,复制过密码的话记得清理。
- Caravel 本身不带模型,用的是你电脑上已安装并登录的 Agent;数据去向取决于你给这些 Agent 配的账号与模型。
出处:常见问题 https://caravel-site.pages.dev/zh-CN/docs/faq/ ;网页与手机访问 https://caravel-site.pages.dev/zh-CN/docs/web-access/ ;运行方式 https://caravel-site.pages.dev/zh-CN/docs/run-modes/
公司要求代码不进训练、数据不乱流,有哪些正规选项?
直答:看账号类型和接入方式,而不是看工具名字。常见路线有四条,按改动从小到大排:
- 确认账号条款:个人订阅、团队/企业账号、API 账号的数据保留和训练条款往往不同,去对应账号的隐私设置和最新条款里确认,需要合规结论时以合同为准。
- 走云厂商托管的模型:例如 Claude Code 支持通过 Amazon Bedrock、Google Vertex AI 调用模型(环境变量
CLAUDE_CODE_USE_BEDROCK=1/CLAUDE_CODE_USE_VERTEX=1),数据走公司已签约的云账号。 - 统一走公司网关:通过
ANTHROPIC_BASE_URL等变量或 Agent 的自定义模型提供方配置,把请求统一发到公司自建的模型网关,便于审计和限流。 - 本地或自建模型:部分 Agent 支持接本地模型端点(如通过 Ollama 一类工具),数据不出内网;但代码能力和工具调用稳定性差距可能很大,先拿小任务试。
以上配置项和支持范围更新很快,落地前以各工具当前文档为准。
开工前的 10 项检查清单
- [ ] 项目目录里没有真实密钥(.env 只留 .env.example)
- [ ] 跑过一次 gitleaks / trufflehog
- [ ] Agent 权限规则里禁止读密钥文件
- [ ] 命令执行保持「运行前先问我」,不用完全放开的模式
- [ ] 关闭不需要的遥测和错误上报
- [ ] 只装本项目需要的 MCP / 插件
- [ ] 数据库只给只读账号,优先连脱敏副本
- [ ] 项目说明文件里写清查询约束(LIMIT、禁止写语句)
- [ ] 确认账号类型的数据保留与训练条款
- [ ] 每月看一次外连地址,确认没有陌生出口
常见问答
- 项目没被读过的文件会被上传吗? 一般不会,Agent 只发它读到的内容;但别忘了 IDE 插件、云盘同步等其他工具可能在单独上传。
.gitignore能挡住 Agent 吗? 挡不住。它影响的是 git 和部分搜索工具,不是读取权限。- 用只读数据库账号就安全了吗? 只解决「改数据」的风险;查出来的结果仍会进上下文,敏感数据要靠脱敏副本和视图。
- 完全不想出网能做到吗? 只有接本地模型才接近;用云端模型就一定有上下文出网,只能控制发什么、发给谁。
- Caravel 会把我的代码传到自己的服务器吗? 手册的说法是:任务、对话、提示词、待办等数据保存在你的电脑本地;Agent 调用在线模型时,发送的内容由对应的 Agent 和模型厂商处理。
- Caravel 收费吗?开源吗? 免费使用,但不是开源软件;模型费用由各厂商按你的订阅或 API 收取。
- 支持哪些 Agent 和系统? Claude Code、Codex、OpenCode、pi、Grok、TRAE、Antigravity;macOS 与 Windows x64。
边界说明
- 文中命令和配置项基于常见版本整理,各工具更新频繁,变量名和键名以当前官方文档为准。
- 权限规则和审批确认能减少误操作,但不等于安全沙箱;Agent 执行的是你电脑上的真实命令。
- 抓包和网络检查只能看到「连了哪里」和部分内容,不能替代厂商条款和公司安全评审。
- 本文不是法律或合规意见,涉及客户数据、跨境传输等问题请走公司流程。
- Caravel 免费使用,但不是开源软件;目前提供 macOS 与 Windows x64 桌面版。
- Caravel 的只读 MCP、生产标记、只读模式降低的是误写风险,不替代数据库自身的账号权限设计;Agent 查到的数据仍会进入模型上下文。
想试试的话
- 先在官网体验版点一遍数据库页(示例数据,不用安装、不调 Agent、不读写你的电脑):https://caravel-site.pages.dev/demo/?lang=zh-CN#database
- 按手册「新手上路」装好后,对照本文打开数据库一章,先给测试库开只读 MCP:https://caravel-site.pages.dev/zh-CN/docs/database/
- 下载 / 关注更新:https://github.com/yy36295238/caravel-agent (Windows 用户请在 Releases 列表里找带 x64-setup.exe 的版本)

浙公网安备 33010602011771号