feat(s3): add short access links and SDK core#7281
Conversation
Coverage Report
File CoverageNo changed files found. |
|
✅ Admin Preview Image Ready! 🕒 Time: 2026-07-16 19:04:59 (UTC+8) |
5bfe7be to
1518715
Compare
|
✅ Build Successful - Preview fastgpt Image for this PR: 🕒 Time: 2026-07-16 18:57:41 (UTC+8) |
e597ef1 to
93ec562
Compare
e08c553 to
3f36136
Compare
210408f to
c849f1e
Compare
c121914yu
left a comment
There was a problem hiding this comment.
结论:当前不建议合并。核心短链协议的 SDK/runtime 分层方向合理,但最新 head c849f1e 存在确定性构建阻塞、配置回归和下载语义问题。
必须修改
- FastGPT 镜像无法构建。
presignDraftChatFilePostUrl.ts、新旧 system file route 共 5 个文件引用了最新 main 已删除的@fastgpt/service/type/next,应改用@fastgpt/next/type。当前 Docker build 已在presignDraftChatFilePostUrl.ts:1失败。 - Pro 未适配共享契约。
pro/admin/src/service/core/ai/auxiliaryGeneration/chatAgentHelper/service.ts:316调用persistChatFiles时缺少sourceType/sourceId/chatId,Admin 镜像构建失败。 - Pro tests 无法解析 SDK subpath。
pro/admin/vitest.config.ts:8将@fastgpt-sdk/storage映射到index.ts,导致@fastgpt-sdk/storage/access-link被拼成index.ts/access-link并报ENOTDIR。请补精确 alias 或统一从 package root 导入。 - 默认环境模板不可用。
projects/app/.env.template:92在 MinIO 且 external/CDN endpoint 为空时默认启用short-redirect,下载必然 500;:111-112又把 Mongo URI 错误断成两行。建议与 service 默认统一为short-proxy并恢复完整 URI。 - 短链过期和撤销会被缓存绕过。
projects/app/src/service/common/s3/proxy.ts:314返回public, max-age=31536000。浏览器或共享缓存命中后不会重新校验 expiry、disabledAt或对象删除状态。私有短链至少需要no-store,或将缓存上限约束到剩余 TTL 并明确撤销语义。 - 下载 mode API 不兼容且语义未真正实现。 OpenAPI 将旧
proxy删除,已有客户端会得到 400;同时short-proxy和short-redirect生成相同 URL,最终传输方式只读取全局 env,单次调用传入的 mode 不能强制对应行为。请保留旧值映射,并明确 mode 是签发模式还是传输模式。 short-redirect的 HEAD 会失败。 route 接受 HEAD,但proxy.ts:403始终生成 GET presigned URL;S3 签名包含 HTTP method,客户端跟随 HEAD 302 后会验签失败。应为 HEAD 返回 metadata,或生成对应的 HEAD 签名。- 真实存储 404 会落成 500。 当前错误映射只识别
CommonErrEnum.fileNotFound,AWS/OSS 的 Head/Get 异常不会命中。现有测试用undefined/nullmock,未覆盖真实 adapter 错误。
范围与性能
PR 自身的 .agents/design/common/s3/pr-split-plan.md 明确要求把短链、上传校验、ChatBox abort 拆成 3 个 PR,但当前三者以及 Sandbox/Invoke 文件生命周期全部混入。后者已经修改共享契约并导致 Pro 构建失败,建议按文档拆分后再审。
批量 alias API 已实现,但 collection/export.ts:114 仍最多对 50,000 行逐条处理 q/a,data/v2/list.ts:61 也逐字段、逐图片签发。请按 export chunk/page 汇总 key 后调用 createS3DownloadAccessUrls。
另外请删除 dispatchChatCompletion.ts:75 的 console.dir,并合并重复的 downloadAlias/entity.ts 与实际 store adapter。
验证
git diff --check、global/service/app unit tests 通过;FastGPT-Pro-Test、Preview Admin Image、Preview FastGPT Image 三项 CI 失败。补齐后还需要覆盖 redirect HEAD、真实 adapter 404、缓存后的过期/撤销、旧 mode: proxy 兼容和大批量导出。
Summary
/api/system/file/d/<alias>.<exp>.<sig>) and short upload session URLs (/api/system/file/u/<token>).@fastgpt-sdk/storage/access-linkso other trusted services can reuse HMAC signing, TTL bucketing, alias reuse, upload token hashing, verification, and revoke logic.Tests
pnpm exec vitest run -c vitest.config.mts test/sdk/storage/accessLink.test.tspnpm --filter @fastgpt-sdk/storage buildpnpm --filter @fastgpt/app typecheckpackages/service:pnpm exec vitest run -c vitest.config.ts test/common/s3/accessLink.test.ts test/common/s3/token.test.ts test/core/dataset/utils.test.ts test/core/dataset/data/controller.test.tsprojects/app:pnpm exec vitest run -c vitest.config.ts test/api/system/file/accessLink.test.ts test/api/system/file/sourceContentType.test.tsgit diff --checkNotes