trae cn和trae work请立即停止上传用户本地文件,你们用于上传的理由根本就不必要!

关于「临时上传代码库文件计算嵌入向量」的反驳

对 TRAE 官方说明的技术质证 —— 基于客户端本体的实测证据
审计对象:TraeCode CN 3.3.102(TRAE IDE)· TraeWork CN 0.1.67(原 TRAE SOLO)
环境:Windows / 单一实机 · 方法:数据目录取证 + 二进制静态分析 + 运行日志行为追踪(全程只读)
成文时间:2026-09-21

官方就"代码库索引是否需要上传"给出的说法,原文如下。本说明的每一处反驳,都只使用客户端本机可复现的证据, 不使用任何推测、不使用任何第三方转述,并明确区分"已证实"与"无法证实"。

TRAE 官方说明(被质证对象)

「为了实现代码库索引功能,当你将某个目录作为项目在 TRAE 中打开时,TRAE Work(原 TRAE SOLO)和 TRAE IDE 确实会临时将代码库文件上传至服务器计算嵌入向量。计算完成后所有明文代码将被永久删除。」

「无论隐私模式是否开启,TraeCode 绝不会将你的代码库文件用于数据分析、产品优化或模型训练……代码库文件将始终保存在你的本地设备上。」

结论:这段话里只有"会上传"是真的;"为了实现代码库索引功能"是目的倒置,"永久删除"客户端无从验证。

官方把整件事框定为「因为要索引,所以必须上传」。但在这套软件的本地二进制里,"索引"被明确实现成了两条并列的分支: 一条全本地、一条全远端。走哪条,由服务器下发的一个配置项决定—— 实测结果是 100% 走远端,本地分支一次都没有执行过。

这不是"做不到本地",而是"被配置成不做本地"。把这种策略选择表述成技术必然, 是本说明要反驳的核心。

〇、先把"能验证 / 不能验证"的边界划清楚

公开讨论这类问题最容易失焦,所以先把三句话拆开,逐句给出可验证性和实测结论。

官方表述 可验证性 本机实测结论
①「为了实现代码库索引功能……会临时将代码库文件上传」 客户端可验证 因果关系不成立。本地嵌入分支在二进制里完整存在、客户端启动参数默认点名的就是本地嵌入( local_embedding:true),但本机实测该分支执行 0 次,远端分支 288 次(Trae CN 73 + TraeWork 215)。详见第一节。
②「临时将代码库文件上传」 客户端可验证 成立——但"临时"的代价被严重轻描淡写。实测单次索引中,上传耗时占整个初始化耗时的 91%~98.6%;55 个文件的一次索引,光上传就跑了 3026 秒(约 50 分钟)。详见第三节。
③「计算完成后所有明文代码将被永久删除」 客户端不可验证 这是纯服务端行为,客户端日志、缓存、协议里没有任何与此相关的痕迹可查。 作为一句承诺可以存在,但不能作为技术事实被引用,更不能用来消解前两句的问题。
④「无论隐私模式是否开启,绝不会……用于分析/训练」 部分可验证 服务端用途无法验证;但可以验证的是隐私开关并没有生效在索引链路上—— 服务端把 appPrivacyMode 置为 on 之后,CKG 自己维护的 is_privacy_mode 至今仍为 false,上传在"开启隐私模式"之后照常继续。详见第四节。

本说明的举证原则:凡标注"实测"的结论,均给出来源文件与原始行;凡属推断的,明确标注"推断"; 凡客户端无法验证的(服务端行为),一律标注"不可验证",不写成结论。

一、反驳点一:上传不是索引的必要条件,是服务端把它选成了默认路径

这是整份反驳里最硬的一条,因为它不依赖任何主观判断——双分支的代码定义、客户端的启动参数、日志里的执行计数, 三者互相独立、指向同一结论。

1.1 二进制内部:索引被实现成了两条并列的分支

在 CKG 内核 libckg.dll(39,761,808 字节)中,内嵌了一段可完整解析的流水线定义(JSON 原文, 偏移 0x1490adb)。起点是 operation_router → file_counter, 然后进入一个叫 local_remote_embedding_selector(“本地/远端嵌入选择器”)的节点。 这个节点显式配置了两条互斥分支:

{
 "id": "default-remote-dsl",
 "nodes": {
  "local_remote_embedding_selector:0": {
   "type": "local_remote_embedding_selector",
   "configurations": {
    "local_branch":  "collect_files:1",                       // ← 全本地分支
    "remote_branch": "collect_files_and_remote_embedding:0",  // ← 全远端分支
    "in_edge": "file_counter"
   },
   "successors": {
    "to_local":  "collect_files:1",
    "to_remote": "collect_files_and_remote_embedding:0"
   }
  }
 }
}

两条分支各自的后续,是完全独立的:

operation_router→file_counter→local_remote_embedding_selector

to_local→collect_files→local_chunk_and_embedding→idle本机执行 0 次

to_remote→collect_files_and_remote_embedding→上传至服务器→idle本机执行 100%

本地分支的完整定义(同一 JSON):local_chunk_and_embedding 的 type=local_chunk_and_embedding、embedding_model=codekg_bge_m3、 split_method=v3、next_step=idle。 它是一条走到 idle 正常结束的完整流水线,途中没有任何网络节点——不是残留代码,是与远端分支等价的一等公民。

1.2 客户端生产代码:默认要求的就是本地嵌入,不是上传

更关键的是,发起索引的一方(桌面客户端)主动要求的是本地嵌入。 在 resources\app\out\main.js(偏移约 1,257,653)中,客户端构造给 CKG 的配置对象是:

const b = {
    port: String(e.defaultCkgFreePort),
    version_code: 2,
    storage_path: r,
    local_embedding: !0,                    // ← true,明确要求本地嵌入
    embedding_storage_type: "sqlite_vec",   // ← 本地向量库类型
    app_id: "6eefa01c-1036-4c7e-9ca5-d891f63bfcd8",
    limit_cpu: 1,
    source_product: "native_ide"
};
if (this.F.isRemote) { /* 拼成命令行参数 */ }
else { p.CKG_CONFIG_JSON = JSON.stringify(b); }   // ← 桌面本地模式走这里

同目录 modules\ckg\start.bat 里的正式启动命令,同样带 -local_embedding -embedding_storage_type=sqlite_vec。 也就是说:客户端说的是"给我在本地算",而实际发生的是"全部送到服务器算"。 这两者之间的矛盾,需要一个解释——而官方说明没有提供。

1.3 运行日志:本地分支签名全部为 0,远端分支 288 次

把两个应用的全部 codekg.log.* 逐条统计,得到的是一个非常干净的 0 : N 对照:

日志签名 归属分支 Trae CN TraeWork
[CollectFilesStep] 本地 0 0
[LocalChunkAndEmbeddingStep] 本地 0 0
ckg_local_index_step 本地 0 0
to_local_index 本地 0 0
BatchLocalIndexEmbeddingTask 本地 0 0
no_local_embedding_storage 本地 0 0
[CollectFilesAndRemoteEmbeddingStep] 远端 73 215
[DocumentUpdateStep] 远端 56 1200
uploadKnowledgebaseFiles(上传文件实体) 远端 408 33,285

1.4 裁决依据:一个服务器下发的"空名单"

那么选择器凭什么决定走哪条?答案写在它自己的日志格式里(libckg.dll 偏移 0x1474aef):

[LocalRemoteEmbeddingSelector] git uri: %s, iLRWL: %v, iAWL: %v
                                    ↑ inLargeRepoWhiteList        ↑ inAnyWhiteList

而它对照的两个名单,来自服务器下发的 GetCKGRAGConfig 回显(两个应用完全一致):

服务端配置项 下发值 含义
RAGRepoWhiteList (空列表) 允许走本地索引的仓库白名单 —— 空的
RAGRepoNotOnlyWhiteList true "不只白名单内的仓库"也参与 —— 与空名单叠加,使白名单彻底失效
RAGRemoteIndexThreshold -1 远端索引阈值被设为 -1(不设下限)
RemoteNonGitFileCountLimit 3000 非 Git 仓库单次采集上限(实测多次恰好卡在 3000)
UploadFileIDsBatchSize 1000 哈希清单批大小
UploadKnowledgebaseFilesBatchSize 5 文件实体批大小

于是本机的真值分布是这样的——没有任何一次例外:

Trae CN    iLRWL: false × 25     iAWL: false × 12
TraeWork   iLRWL: false × 68     iAWL: false × 34
                          ↑ 100% 为 false

一个小结:这条链路本可以在本地跑完,是服务器下发的一个空名单把它推到了云端。

官方说「为了实现代码库索引功能……会上传」。但代码本身证明的是: 索引功能不需要上传——上传是选择器的另一个分支。 真实的关系是「上传是这条链路被配置成的默认路径,索引是它的产物」, 而不是「因为要索引,所以必须上传」。这个因果方向被颠倒了。

1.5 一个必须一并提出的疑点:客户端要本地模型,包里却没有本地模型

为了不把话说满,这里也要如实说明一个不利事实:本机不存在任何 CKG 嵌入模型文件。 modules\ckg\ 全目录只有 libckg.dll(39.76 MB)和三个 gcc 运行库, 合计约 42.4 MB;全盘搜索 *.onnx / *.gguf / *.ggml / *.safetensors 零命中 (仅有 VSCode 自带的语言检测小模型、对话分词器、RTC 资源包,均已逐项排除,与 CKG 无关)。 一个 bge-m3 量级的嵌入模型,INT8 量化后约 560 MB、FP32 约 2.2 GB,不可能藏在 42 MB 里。

因此本说明的措辞严格限定为:

「本地分支的代码路径完整存在,且客户端默认要求走本地; 但本机从未触发过该分支,因此也从未下载过本地模型,无法证明它在这个版本里端到端可用。」

但反过来,这恰恰构成新的疑问:客户端生产代码主动传 local_embedding:true, 而安装包既不提供本地模型、运行期也从不下载——这个参数在当前分发形态下根本无法生效。 如果官方要主张"只能上云",那么需要解释的就是:为什么客户端要发一个自己并不打算兑现的参数?

二、反驳点二:被上传的对象和"代码库"没有关系

官方说的是"上传代码库文件"。但实测显示,决定"传不传"的不是内容是不是代码, 而是"这个目录有没有被作为项目打开" + “服务端白名单里有没有它”。 这两条判据都不看内容的语义,所以出现下面的情况是必然的。

2.1 一个 168 万文件的局放数据集,被当成"代码库"索引并上传

被上传的目录清单里,有一个非常典型的例子:f:\allDataset\PD\all。 这是工程上用于局放(局部放电)识别的数据集目录,实测包含 1,681,216 个文件,顶层结构如下:

f:\allDataset\PD\all\
├── 4a\  4b\  4c\                  (原始采集数据分卷)
├── 放电标签csv\   放电标签prpd\   放电标签图片\
├── 无放电标签csv\  无放电标签prpd\
├── temp50\ temp100\ temp200a\ temp200b\ temp200c\   (解压中间产物)
├── _ungzip_tmp\
├── run_ungzip.bat   ungzip_fullprpd.py   verify_channels.py   verify_report.txt
└── .idea\  .trae\  .workbuddy\  __pycache__\

里面是 .fullprpd 原始波形、.csv 标签、图片——没有任何"代码库"语义。 对这样的目录做"代码库索引",在功能上没有任何意义。但日志显示,它被完整地走了一遍上传流程:

[CollectFilesAndRemoteEmbeddingStep] project f:\allDataset\PD\all
    initialize finished, build time: 3118.2421564 s,
    upload files time: 3026.1917772 s,
    total files: 55, total uploaded files: 55, total failed files: 0

类似地,声纹样本目录 f:\allDataset\姑苏换流变防火墙声纹样本sound(含"频谱图片"子目录) 也出现在远端项目清单里并被上传。

这里要给出一个诚实的限定:PD 数据集目录中,本次被 CKG 采集成"需上传"的是 55 个文件(其余因扩展名/二进制判定被跳过;且当时该目录正处于数据构建过程中), 并非 168 万个文件全部外传。我们不去夸大这个数字。

但这个案例恰恰说明了问题所在:它的筛选逻辑是"按内容类型挑能索引的文件",而不是"这是不是代码库"。 所以只要一个目录被当成项目打开,无论里面装的是代码、数据集还是样本, 符合类型的部分都会被送上云端——这正是"代码库索引"这个说法最名不副实的地方。

2.2 判定依据仍然是"目录级"的,不是"内容级"的

结合 1.4 节可以看得很清楚:RAGRepoWhiteList 是仓库(目录)粒度的白名单, 空名单意味着所有被打开为项目的目录一律走远端。 这里既没有"内容敏感度"的判定,也没有"用户是否同意"的判定。 "代码库索引"这个命名,会让人以为只有代码会被处理;实际的行为是项目目录级的整体采集与上传。

三、反驳点三:上传在工程上是净损失,且代价不可控

这是你原本提的第二条理由——“文件大了,等他传完,花都谢了”。 它其实可以升级成一条硬性技术论据:把耗时数据摆出来,"必要性"的说法就自己站不住了。

3.1 实测:索引流程的时间,几乎全部花在上传上

日志里每一行 initialize finished 同时给出两个数: build time(整个初始化耗时)和 upload files time(其中用在"上传文件"上的耗时)。 把所有可用样本拉出来对比:

项目 文件数 上传耗时 总初始化耗时 上传占比
f:\allDataset\PD\all 55 3026.19 s 3118.24 s 97.1%
f:\allDataset\PD\all 54 1166.70 s 1235.94 s 94.4%
e:\Work\Java\demo_web - 2026年9月11日 161 82.99 s 84.19 s 98.6%
e:\Work\Java\demo_web - 2026年9月11日 152 51.24 s 52.48 s 97.6%
e:\Work\disCharge\liuyi\二维数组直接识别 3000 88.19 s 90.82 s 97.1%
e:\Work\disCharge\liuyi\二维数组直接识别 3000 41.50 s 44.49 s 93.3%
e:\Work\Java\demo_web - 2026年8月31日… 127 20.62 s 22.23 s 92.8%

数据来源:%APPDATA%\Trae CN\ModularData\ckg_server\codekg.log.* 与 %APPDATA%\TRAE SOLO CN\ModularData\ckg_server\codekg.log.*, 过滤 [CollectFilesAndRemoteEmbeddingStep] project … initialize finished 行,按原文去重。

所谓"本地建索引"这件事,在时间上基本就是"把文件传上去"。

表里的上传占比稳定落在 92%~98.6%。也就是说, 用户等待"代码库索引构建完成"的那段时间里,几乎没有本地计算在发生,全部是在等上行带宽。 在这种事实下,把上传说成"为了实现索引功能"的必要步骤,等于承认: 这套设计把一件本可离线完成的事,做成了一件必须排队等网络的事。

3.2 更致命的是波动:同一份输入,耗时差 5~18 倍

把同一项目、几乎相同文件数的多次运行放在一起,差异是这样的:

项目(文件数) 上传耗时(多次运行) 最大倍数
demo_web - 2026年9月11日(169 → 161 个文件) 4.67 s · 6.58 s · 82.99 s 17.8×
二维数组直接识别(均为 3000 个文件) 16.44 s · 19.43 s · 41.36 s · 88.19 s 5.4×

文件数几乎没变,耗时却差出一个数量级——本地计算不可能产生这种波动,只有网络会。 这一条同时证明了两件事:其一,瓶颈确实在网络而不是本地算力;其二, 用户对"什么时候能用上索引"完全没有预期管理能力—— 同样的项目,今天 5 秒,明天可能 80 秒,后天遇到服务端 embedding_failed 还要重来。

3.3 还有失败重试与排队,成本被进一步放大

日志里大量出现服务端返回失败并要求重传的记录,例如:

[BatchUploadKnowledgebaseFilesTask] some files failed:
    map[348222c23d82e94c70d07753893491af34092adf:embedding_failed:
    rpc error: code = ErrInternal desc = We're sorry, something went wrong. Please…]

这意味着链路上还叠加了:服务端向量化失败 → 客户端重传; 以及 UploadKnowledgebaseFilesRateLimit: 3、 UploadKnowledgebaseFilesLimiterWindowSize: 50 之类的服务端限流。 本地的 CPU 就在那里空着,而任务在等服务端配额。

3.4 把三条并起来看

  1. 有本地实现(第一节:分支完整、客户端默认请求本地);
  2. 被配置成不用(第一节:空白名单使之永不生效);
  3. 代价还更大(本节:92%~98.6% 的时间在上传、波动 5~18 倍、有失败重试与限流)。

一个"更慢、更不稳定、还依赖外部服务"的实现,被说成是"为了实现功能"的唯一(或默认)路径, 在工程逻辑上是说不通的。

四、反驳点四:可验证性与告知义务不一致

4.1 "永久删除"是一句无法被检验的承诺

客户端侧可查的一切——CKG 日志、本地缓存目录、协议结构、网络请求记录——都没有任何 与"明文代码在服务端被删除"相关的痕迹。这句话在技术上既无法证实、也无法证伪。 这不代表它一定是假的,但它不能作为消解前三个问题的理由: "我会删掉"和"你不该被我传"是两件事。

4.2 隐私模式的开关,没有传导到索引链路上

这是可以验证的,而且结论很直接:

观测项 实测值
UI 层隐私模式状态(服务端 2026-09-17 09:59 写入,标记 {"type":"server"}) appPrivacyMode:<uid> = on 已开启
CKG 自己维护的 local_env.json → is_privacy_mode false(两个应用均如此,实时读取)
开启隐私模式之后,是否还在上传 持续上传(09-17 晚 / 09-18 / 09-19 / 09-20 均有记录)
日志中 privacy 关键词命中次数 0(两个应用的 CKG 日志中,索引链路从未打印过隐私状态)

也就是说:用户在界面上打开的"隐私模式",并没有作用在代码索引上传这条链路上。 这与官方"隐私模式生效、且无论如何都不会上传用于分析"的表述之间, 存在一个客户端侧可以直接观察到的落差。

4.3 一个对照:堆快照上传时,它是会问的

同一个安装包里,另有一条"采集进程内存快照并上传"的通道。它的界面文案是这样的:

「进程(PID:{0})内存占用过高,我们将采集堆快照并上传到分析服务器,如果你需要取消,请点击取消按钮。」

它会告知、并提供取消入口。而代码库索引的文件上传, 在界面上没有任何提示,也没有任何"这一次不要传"的选项—— 唯一的开关是"要不要用这个 AI 功能"。 同一个产品对两类数据外传采取了两种完全不同的告知标准, 这本身就说明:哪些该告知、哪些不方便告知,设计者是清楚的。

五、我们不否认的部分(以及对可能反驳的事前回应)

一份只有指控的质证是没有说服力的。下面这些是对我们不利、但我们必须承认的事实, 以及官方可能的回应和我们的事前答复。

认我们承认的事实

  • "确实会上传"是真的。本机两个应用合计观测到 20,328 次内容上传请求 (uploadKnowledgebaseFiles:Trae CN 408 次、TraeWork 33,285 次),指向 trae-api-cn.mchost.guru/api/ide/v1/knowledgebase/uploadKnowledgebaseFiles。 这一点官方没有隐瞒。
  • 上传的是文件实体,不是哈希。这一点我们有量化判据(见下),因此也不接受"只传了元数据"的说辞。
  • 云端索引本身不是违法行为。我们质疑的不是"能不能做",而是 描述是否准确、选择权是否存在、代价是否被如实告知。

辨可能出现的五种回应,与我们的答复

回应一:「本地分支只是预留代码,并不代表实际可用」

如果是这样,那么需要解释的是:为什么客户端生产代码要默认下发 local_embedding:true 并配 embedding_storage_type:"sqlite_vec"? 为什么官方文档里的启动命令也带这两个开关? 一个"不可用"的路径,不会在产品代码里被默认请求。 退一步说,即使它真的不可用,那也应当明确告知"本产品不提供本地索引", 而不是用"为了实现索引功能"来暗示上传不可避免。

回应二:「上传是为了索引质量更好/支持多端使用」

这是产品目标,不是技术必要性。而且"向量化"和"多端同步"是两件不同的事: 前者是计算,后者是存储与分发。用后者为前者的必要性辩护,属于偷换论题。 更重要的是,即使接受这个目标,也应当提供"仅本地索引"的选项让用户自己取舍。

回应三:「隐私模式已经保护了用户」

实测否定:is_privacy_mode 在隐私模式开启后仍为 false, 且上传持续发生(见 4.2)。请公布隐私开关与索引链路的对应关系, 并解释为什么两套状态不同步。

回应四:「上传的是分块和向量,不是原始文件」

这与量化判据冲突。四条独立证据:

判据 数据 它说明了什么
批大小不对称 哈希清单 uploadFileIDs 批 = 1000; 文件实体 uploadKnowledgebaseFiles 批 = 5 两者是不同的东西,后者一批只敢拿 5 个
耗时不对称 1000 个哈希 ID ≈ 374 ms; 1 个文件实体 ≈ 2520 ms; 55 个文件 ≈ 3026 s 只有传输文件内容才会呈现这种量级
服务端行为 服务端对上传物按文件返回 embedding_failed 服务端是在对上传内容做向量化,不是在读哈希
协议结构 二进制内含 UserFileContent / user_file_content 字节字段 协议里就为"文件内容"留了位置

需要说明:本机未抓取到明文请求体(其自研网络库 ahanet 不记录 body), 因此"传内容"这一结论是由上述量化判据与协议结构共同支持的强推断, 而非直接抓包。我们把这一点标注清楚。

回应五:「用户可以选择关闭索引」

关闭索引 = 关闭 AI 对代码库的理解能力,等于放弃这个产品的核心价值。 用"关掉功能"来替代"提供纯本地选项",本质上是把功能胁迫包装成选择权。 而且,官方目前没有提供"保持索引但不上传"的开关—— 这正是第一节所证明的、技术上完全可行的那个选项。

六、结论与诉求

三个结论

  1. 因果被颠倒了。"为了实现代码库索引功能……会上传"暗示上传是技术必然。 但客户端二进制里存在完整的、不经过网络的本地嵌入分支,且客户端生产代码默认请求的就是它; 本机 100% 走远端的原因,是服务端下发的 RAGRepoWhiteList 为空。 正确的表述应当是:“索引有两种实现,本产品的服务端策略选择了需要上传的那一种”。
  2. 代价被轻描淡写了。“临时上传"在实测中是索引流程耗时的主要成分(92%~98.6%), 并且随网络波动 5~18 倍,还有失败重传与服务端限流。 对一个 55 文件的数据集目录,单次上传耗时达到 3026 秒。 这不是"临时”,这是把可用性押在了上行带宽上。
  3. 承诺不可验证,且开关未生效。"永久删除"在客户端无任何可验证痕迹; 而可验证的是——界面上的隐私模式开启后,CKG 的 is_privacy_mode 仍为 false,上传照常继续。

基于以上,我们提出四点诉求

  1. 修正表述。请把"为了实现代码库索引功能……会临时上传"改为如实描述: 索引存在本地与远端两种实现,当前默认策略为远端上传; 并明确"上传是策略选择,而非技术必需"。
  2. 提供真正可用的纯本地索引选项。既然本地分支已在代码中存在、客户端也已在默认请求它, 那么补齐本地模型(随包提供或首次启用时下载)、并使该分支实际生效,是工程上已被证明可行的事。 若因某些原因无法提供,请公开说明具体原因,而不是以功能需要为由回避。
  3. 把告知与授权做在索引上传之前。做到与堆快照上传同等的标准: 明确告知、提供取消入口;并支持"按目录"粒度的授权—— 允许用户把数据集、样本库、素材库这类目录排除在索引之外, 而不是只能在"用功能"和"不传"之间二选一。
  4. 公开"永久删除"的可验证机制,并修正隐私开关的行为。 说明明文在服务端的留存周期、删除方式、以及用户如何自证; 同时修复"界面已开启隐私模式、CKG 内部仍为 false"的状态不同步问题。

附录 A:证据来源与复现方式

本说明的全部数据均可在同一台机器上复现,路径如下。

证据类别 位置 / 方法
索引分支定义(本地/远端) libckg.dll 偏移 0x1490adb,内嵌 JSON(流水线 DSL,可直接解析)
选择器日志格式 libckg.dll 偏移 0x1474aef: [LocalRemoteEmbeddingSelector] git uri: %s, iLRWL: %v, iAWL: %v
客户端启动参数 <安装目录>\resources\app\out\main.js 偏移约 1,257,653 (local_embedding:!0);modules\ckg\start.bat
服务端配置回显 CKG 日志中 GetCKGRAGConfig 输出(RAGRepoWhiteList 等)
执行计数 / 上传耗时 %APPDATA%\Trae CN\ModularData\ckg_server\codekg.log.*
%APPDATA%\TRAE SOLO CN\ModularData\ckg_server\codekg.log.*
过滤 [CollectFilesAndRemoteEmbeddingStep]、[LocalRemoteEmbeddingSelector]、 uploadKnowledgebaseFiles
本地模型缺失 modules\ckg\ 目录清单;全盘搜 *.onnx / *.gguf / *.ggml / *.safetensors (零命中,已排除 VSCode 语言检测模型、对话分词器、RTC 资源包)
隐私开关状态 local_env.json 的 is_privacy_mode;UI 层 appPrivacyMode 存储
堆快照告知文案 应用内本地化文案:「进程(PID:{0})内存占用过高,我们将采集堆快照并上传到分析服务器,如果你需要取消,请点击取消按钮。」

附录 B:本文刻意没有使用的论据(以及原因)

为了让反驳站得住,下面这些"看起来更有冲击力"的说法被主动排除了:

被排除的说法 排除原因
“上传了 168 万个数据集文件” 不实。该目录被采集并上传的是 55 个文件(见 2.1 的限定说明)。 夸大数字只会给对方一个现成的反击口。
“它把明文代码永久保存/贩卖” 无法证明。“永久删除"无法证实,但同样无法证伪。本文只主张"不可验证”, 不主张"没有删除"。
“本地模型明明能用却故意不用” 本机确实不存在任何 CKG 嵌入模型(42.4 MB 的目录装不下 bge-m3)。 因此只能说"代码路径存在、客户端默认请求、却从未触发且从未下载模型", 不能说"本地明明是能用的"。
“抓到了明文请求体” 其自研网络库 ahanet 不记录 body,本机未抓到明文载荷。 "传的是内容"是由批大小、耗时量级、服务端 embedding_failed、 协议含 user_file_content 字段四条判据共同支持的强推断,本文如实标注为推断。
“阻断 trae-api-cn.mchost.guru 就能解决” 不成立。该域名同时承载对话、补全、Cue、Hub 等多个服务(见 product.json), 屏蔽它会连带废掉 AI 功能本身,不能作为论据。
9 个赞

所以这个paper是为了什么,要求ide优化grep?还是文件管理

5 个赞

禁止再上传用户本地文件,因为官方说的需要上传的理由根本就不必要,还带来了巨大的问题

5 个赞

放到几百t的数据给它上传 :grinning_face:

5 个赞

啥 trae干啥了

3 个赞

还以为只有智谱这么玩,没想到TRAE你个浓眉大眼的也…

3 个赞

其实所有的软件都有上传,例如AI产品,因为毕竟涉及到多端,这很难实现不上传到云端服务器吧,且上传不等于用你的数据进行训练
那这个时候又要说了,Zcode也只是实锤上传为什么要被喷呢,问题其实出在 Zcode 并没有告知用户有上传这一个步骤,在他的用户隐私协议和用户协议中都没有说,且在设置中也没有体现出来,所以这才是被喷的点!!!
整体可以说:所有 AI 产品基本上都会涉及上传到云端这一操作,但大家都在协议中保证了不会用你的数据进行训练,但是这个时候有一个产品不一样 了
Qoder你不充钱,人家在设置中直接告诉你了:你的数据会被用于训练


说到最后如果大家觉得上传这个行为就不行,那大家只能选择开源+本地模型这样,这才是一点问题都没有的

2 个赞

3 个赞

每个项目放个蓝光,改成.py

4 个赞

代码库索引与上传:为实现代码库索引功能(即日志中体现的知识图谱构建),TRAE IDE 确实会临时将代码库文件上传至服务器计算嵌入向量(embedding)。针对文件数量小于等于 5000 的项目,TRAE 会在打开项目时自动执行全量构建。
隐私模式的边界:无论隐私模式是否开启,这个索引过程都会发生。但计算完成后,所有明文代码将被永久删除。TRAE IDE 绝不会将你的代码库文件用于数据分析、产品优化或模型训练。

2 个赞

是否允许用户选择使用本地嵌入模型这个部分我认为有道理

但我觉得云端做嵌入确实提供了服务

说个我的实际情况,
本机经常运行MinimaxH3和Qwen3.8:27b开200KB上下文,它们是对显存吃干抹净的,
加个不大的bge-m3就能导致卸层。
我的代码用CodebaseMCP分块大概37000块,重建发现每次修改在2000~10000块之间,
CPU硬跑需要几分钟和明显满载,

此外部分用户可能不具备跑bge-m3的显卡,典型的是没插电的笔记本。
云端跑嵌入我觉得有客观意义。

它更像是一个漏洞或者连漏洞都不算,属于功能有限,而非主观恶意。

比如这么想:
偷代码情况多余搞个专门名头!还要消耗算力,直接加密了偷偷上传你奈我何?

3 个赞

Zcode已卸载, 检测出来打包上传了我好几个G的代码库,又让AI分析下我其他在使用的CLI和IDE;

目前Codebuddy CLI是比较干净的,setting.json设置里的开关真起作用;其他解决措施通过屏蔽hosts可以解决。

腾讯 Galileo 遥测(coding-copilot 扩展 / CodeBuddy CN IDE / CLI 共用)

127.0.0.1 galileotelemetry.tencent.com

#------- Trae / 字节 遥测屏蔽 -------
127.0.0.1 tosv.byted.org
127.0.0.1 metrics.byted.org
127.0.0.1 pc-mon-sg.byteintlapi.com
127.0.0.1 data.bytedance.net
127.0.0.1 mon.zijieapi.com
127.0.0.1 mcs.zijieapi.com
127.0.0.1 pc-mon.zijieapi.com
127.0.0.1 tosv.tiktokd.org

#------- WorkBuddy / 腾讯 遥测屏蔽 -------
127.0.0.1 otheve.beacon.qcloud.com
127.0.0.1 ardot.tencent.com
127.0.0.1 test.ardot.tencent.com

#------- CodeBuddy CN IDE 遥测屏蔽 -------
127.0.0.1 aegis.qq.com
127.0.0.1 tamaegis.com
127.0.0.1 otheve.beacon.qq.com

3 个赞

顶, TRAE WORK CN大量占用上传,短时间上传流量累计达数GB
早就发现了反馈也没啥用,我还没开始呢,新建个对话就开始向api5-normal.mchost.guru几个GB几个GB的上传

3 个赞

修改host没有用的,它们用了了一种能绕后host继续上传的方法

2 个赞

什么方法还绕过hosts :joy:

2 个赞

这个机制是 HTTPDNS,具体落在 Trae 自研的网络库上:

Trae_bootstrapping_hosts_的_HTTPDNS_机制

叫 HTTPDNS。Trae 用的是字节自研的网络库(ahanet/ttnet),它自己解析域名,不走 Windows 的解析器——所以 hosts 文件它压根不读。

落到硬盘上的证据(我顺着原路径又看了一遍,现在就在机器上):

plaintext

%APPDATA%\TRAE SOLO CN\ahanet\
├── hostcache_sync_v1      432 B   域名 → IP 列表缓存
├── node_race_results       47 B   多节点竞速结果(选最快的 IP)
├── tt_net_config.config   104 B   带 device_id 和 abtest 分组
└── server.json           6769 B

hostcache_sync_v1 是明文的,一行一条:

plaintext

api5-normal.mchost.guru|443|https|0|0|0|0|0|#2408:874f:b000:31:...
122.188.69.132,113.57.56.109,122.188.69.138|6|-1000000|13434531220605749

域名、端口、协议,后面挂一串 IP(含 IPv6)。网络库直接拿这些 IP 连,DNS 这一步跳过去了,hosts 自然也没机会生效。

两个补强点:

  1. 这个机制是活的——TRAE SOLO CN 那份缓存文件的修改时间是今天 14:17(也就是刚刚)。不是升级残留,是在用的。
  2. node_race_results 更狠一层:它同时对多个 CDN 节点竞速、挑最快的用。这意味着即使你封了某个 IP,它下次可能换一个——IP 黑名单式的封锁天然打不过它。
4 个赞

3 个赞

你们最新的trae cn新增了一个工作区是否构建索引的选项,我再来看看选择关闭构建,是否还会上传本地文件到云端。

2 个赞

利用hips规则禁止Trae对libckg.dll的读取权限即可

2 个赞

还有做一个蜜罐思路,换号看看思路会不会被盗走给其他人。

2 个赞