* refactor: fastgpt object storage & global proxy (#6155)

* feat: migrate to fastgpt storage sdk

* chore: rename env variable

* chore: move to sdk dir

* docs: object storage

* CHORE

* chore: storage mocks

* chore: update docker-compose

* fix: global proxy agent

* fix: update COS proxy

* refactor: use fetch instead of http.request

* fix: axios request base url

* fix: axios proxy request behavior

* fix: bumps axios

* fix: patch axios for proxy

* fix: replace axios with proxied axios

* fix: upload txt file encoding

* clean code

* fix: use "minio" for minio adapter (#6205)

* fix: use minio client to delete files when using minio vendor (#6206)

* doc

* feat: filter citations and add response button control (#6170)

* feat: filter citations and add response button control

* i18n

* fix

* fix test

* perf: chat api code

* fix: workflow edge overlap and auto-align in folded loop nodes (#6204)

* fix: workflow edge overlap and auto-align in folded loop nodes

* sort

* fix

* fix edge

* fix icon

* perf: s3 file name

* perf: admin get app api

* perf: catch user error

* fix: refactor useOrg hook to use debounced search key (#6180)

* chore: comment minio adapter (#6207)

* chore: filename with suffix random id

* perf: s3 storage code

* fix: encode filename when copy object

---------

Co-authored-by: archer <545436317@qq.com>

* fix: node card link

* json

* perf: chat index;

* index

* chat item soft delete (#6216)

* chat item soft delete

* temp

* fix

* remove code

* perf: delete chat item

---------

Co-authored-by: archer <545436317@qq.com>

* feat: select wheather filter sensitive info when export apps (#6222)

* fix some bugs (#6210)

* fix v4.14.5 bugs

* type

* fix

* fix

* custom feedback

* fix

* code

* fix

* remove invalid function

---------

Co-authored-by: archer <545436317@qq.com>

* perf: test

* fix file default local upload (#6223)

* docs: improve object storage introduction (#6224)

* doc

---------

Co-authored-by: roy <whoeverimf5@gmail.com>
Co-authored-by: heheer <heheer@sealos.io>
Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>
This commit is contained in:
Archer
2026-01-09 18:25:02 +08:00
committed by GitHub
parent 56ec86e2fe
commit c93c3937e1
281 changed files with 11562 additions and 2527 deletions

View File

@@ -0,0 +1,381 @@
import type {
DeleteObjectParams,
DeleteObjectResult,
DeleteObjectsParams,
DeleteObjectsResult,
DeleteObjectsByPrefixParams,
DownloadObjectParams,
DownloadObjectResult,
EnsureBucketResult,
GetObjectMetadataParams,
GetObjectMetadataResult,
ListObjectsParams,
ListObjectsResult,
PresignedPutUrlParams,
PresignedPutUrlResult,
UploadObjectParams,
UploadObjectResult,
ExistsObjectParams,
ExistsObjectResult,
PresignedGetUrlParams,
PresignedGetUrlResult,
CopyObjectParams,
CopyObjectResult,
GeneratePublicGetUrlParams,
GeneratePublicGetUrlResult
} from './types';
/**
* 通用存储配置(与具体云厂商无关)。
*
* 说明:
* - 本包的适配器以「对象存储」为抽象S3/OSS/COS/MinIO 等)。
* - `bucket` / `region` / `credentials` 是大多数厂商的最小必填集合。
* - `endpoint` 用于 S3 兼容协议的自定义域名/私有部署地址等场景。
*
* 注意:
* - 不同厂商对 `region` 的含义略有差异(有的会叫作 `region`,有的叫 `location`),这里统一命名为 `region`
* 由各 adapter 在内部做映射或直传。
*/
export interface ICommonStorageOptions {
/**
* 存储桶名称Bucket
*
* - 一般全局唯一(取决于厂商),建议使用小写字母/数字/短横线组合。
* - 对于已存在的 bucket此处填写目标 bucket 名称即可。
*/
bucket: string;
/**
* 区域Region / Location
*
* - AWS: 例如 `ap-northeast-1`
* - 腾讯云 COS: 例如 `ap-guangzhou`
* - 阿里云 OSS: 例如 `oss-cn-hangzhou`(具体取值以厂商为准)
*/
region: string;
/**
* 访问凭证AK/SK
*
* 注意:
* - 不同厂商字段命名不同,这里统一为 `accessKeyId` / `secretAccessKey`。
* - 强烈建议从环境变量/密钥管理服务中读取,不要硬编码在仓库里。
*/
credentials: {
/** AccessKeyId / SecretId / AK */
accessKeyId: string;
/** SecretAccessKey / SecretKey / SK */
secretAccessKey: string;
};
}
/**
* AWS S3 兼容协议的存储配置。
*
* 适用范围:
* - AWS S3
* - MinIO以及其他兼容 S3 的对象存储)
*
* 设计:
* - 通过 `vendor` 做判别联合discriminated union便于在运行时和类型层面区分不同厂商配置。
*/
export interface IAwsS3CompatibleStorageOptions extends ICommonStorageOptions {
/**
* 存储厂商标识S3 兼容系)。
*
* - `aws-s3`: AWS S3
* - `minio`: MinIOS3 协议兼容)
*/
vendor: 'aws-s3' | 'minio';
/**
* 自定义服务端点Endpoint可选。
*
* 常见用途:
* - MinIO / 私有 S3 兼容服务:`http(s)://host:port`
* - 某些厂商的加速域名、内网域名等
*
* 注意:是否需要带协议、端口、路径取决于具体 adapter 的实现。
*/
endpoint: string;
/**
* 是否强制使用 Path-Style 访问(`/{bucket}/{key}`),可选。
*
* 背景:
* - S3 支持两种寻址方式virtual-hosted-style`{bucket}.endpoint/{key}`)和 path-style`endpoint/{bucket}/{key}`)。
* - 一些自建/本地化服务(或特定网络环境)对 virtual-hosted-style 支持不完整,此时可能需要开启。
*/
forcePathStyle?: boolean;
/**
* 最大重试次数,可选。
*
* 说明:
* - 仅影响 adapter 内部使用的 SDK 请求重试策略(如果 adapter 支持)。
* - 若不设置,通常由 SDK 使用默认值。
*/
maxRetries?: number;
}
/**
* 阿里云 OSS 存储配置。
*/
export interface IOssStorageOptions extends ICommonStorageOptions {
/** 存储厂商标识OSS。 */
vendor: 'oss';
/**
* 是否使用自定义域名CNAME可选。
*
* - 开启后通常会影响 endpoint/host 的拼接方式。
* - 具体行为取决于 OSS SDK 与 adapter 实现。
*/
cname?: boolean;
/**
* 自定义服务端点Endpoint可选。
*
* 常见用途:
* - MinIO / 私有 S3 兼容服务:`http(s)://host:port`
* - 某些厂商的加速域名、内网域名等
*
* 注意:是否需要带协议、端口、路径取决于具体 adapter 的实现。
*/
endpoint?: string;
/**
* 是否使用 HTTPS 协议,可选。
*
* 说明:
* - 默认使用 HTTPS 协议。
* - 如果设置为 false则使用 HTTP 协议。
*/
secure?: boolean;
/**
* 是否启用代理,可选。
*/
enableProxy?: boolean;
/**
* 是否走内网internal endpoint可选。
*
* - 在同地域云内网环境可显著降低延迟与流量费用。
* - 若设置为 trueadapter 可能会自动选择 internal endpoint。
*/
internal?: boolean;
}
/**
* 腾讯云 COS 存储配置。
*/
export interface ICosStorageOptions extends ICommonStorageOptions {
/** 存储厂商标识COS。 */
vendor: 'cos';
/**
* 请求协议,可选。
*
* - `https:` 为默认推荐
* - 某些内网/测试环境可能使用 `http:`
*/
protocol?: 'http:' | 'https:';
/**
* 是否启用全球加速,可选。
*
* 说明:
* - 仅当 COS 账号/桶已开通加速能力时才有意义。
* - 开启后 endpoint/域名可能会发生变化(由 adapter 处理)。
*/
useAccelerate?: boolean;
/**
* 自定义域名,可选。
*
* 说明:
* - 用于替代默认的域名,例如 `https://{bucket}.cos.${region}.myqcloud.com`。
* - 通常用于某些厂商的私有化部署环境。
*/
domain?: string;
/**
* 代理,可选。
*
* 说明:
* - 用于 HTTP 代理访问,例如 `http://127.0.0.1:8080`。
*/
proxy?: string;
}
/**
* 百度 BOS 存储配置(预留)。
*
* 说明:
* - 当前 `IStorageOptions` 并未包含该类型,可能尚未完整实现/接入。
* - 先保留接口便于后续扩展。
*/
export interface IBosStorageOptions extends ICommonStorageOptions {
/** 存储厂商标识BOS。 */
vendor: 'bos';
}
/**
* 存储配置联合类型(判别联合)。
*
* 用法:
* - 根据 `vendor` 字段区分不同厂商配置adapter 工厂函数通常也会基于该字段选择实现。
*
* 注意:
* - 当前仅包含 `aws-s3`/`minio`/`oss`/`cos`;若后续接入新厂商,需要在此处补齐联合成员。
*/
export type IStorageOptions =
| IAwsS3CompatibleStorageOptions
| IOssStorageOptions
| ICosStorageOptions;
/**
* 统一的对象存储能力接口vendor-agnostic
*
* 约定:
* - `key` 通常表示对象在 bucket 内的路径(例如 `a/b/c.txt`),由调用方自行约定命名规则。
* - 所有方法都应当是幂等或尽可能接近幂等(例如删除不存在的对象不应抛出致命错误),以便业务层重试。
*/
export interface IStorage {
bucketName: string;
/**
* 确保存储桶存在;若不存在则**可能**尝试创建(取决于 vendor 与账号权限)。
*
* 返回值说明:
* - `exists`: 调用前 bucket 是否存在
* - `created`: 本次调用是否创建了 bucket
*
* 建议:
* - 对于 OSS/COS 等厂商,很多团队更倾向于在控制台/基础设施层面创建 bucket权限/策略/生命周期等更可控),
* 应用侧仅做存在性校验即可bucket 不存在时会抛出底层 SDK 错误)。
*/
ensureBucket(): Promise<EnsureBucketResult>;
/**
* 判断对象是否存在。
*
* 返回值说明:
* - `exists`: 对象是否存在
*/
checkObjectExists(params: ExistsObjectParams): Promise<ExistsObjectResult>;
/**
* 上传对象到 bucket。
*
* 典型用法:
* - 上传文件内容Buffer/Readable
* - 上传文本string
*
* 注意:
* - `contentType`/`contentDisposition`/`metadata` 会映射为不同厂商的 HTTP 头或元数据字段adapter 负责兼容。
*/
uploadObject(params: UploadObjectParams): Promise<UploadObjectResult>;
/**
* 下载对象(以 Node.js `Readable` 流形式返回)。
*
* 说明:
* - 适合大文件流式读取,避免一次性加载到内存。
* - 调用方负责消费/关闭流(正常读取结束会自动关闭)。
*/
downloadObject(params: DownloadObjectParams): Promise<DownloadObjectResult>;
/**
* 删除单个对象(按 key
*
* 建议:
* - 作为幂等操作处理:若对象不存在,最好仍返回成功(由 adapter 决定具体行为)。
*/
deleteObject(params: DeleteObjectParams): Promise<DeleteObjectResult>;
/**
* 根据多个 key 批量删除对象。
*
* 注意:
* - 各厂商对单次批量删除的最大数量限制不同adapter 可能需要分批处理。
* - 返回的 `deleted` 通常只包含实际删除/确认删除的 key。
*/
deleteObjectsByMultiKeys(params: DeleteObjectsParams): Promise<DeleteObjectsResult>;
/**
* 根据前缀批量删除对象(危险操作)。
*
* 安全建议:
* - `prefix` 必须是非空字符串,且建议包含业务域前缀(例如 `team/{teamId}/`),避免误删整个 bucket。
* - 对于大规模删除adapter 可能会先 list 再 delete耗时与费用需评估。
*
* 注意:
* - 理论上可以使用 `this.listObjects` 然后 `this.deleteObjectsByMultiKeys`
* 但是这样可能会产生不必要的内存占用问题,所以这里单独实现了一个方法
*/
deleteObjectsByPrefix(params: DeleteObjectsByPrefixParams): Promise<DeleteObjectsResult>;
/**
* 生成对象的上传预签名 URLPresigned URL
*
* 用途:
* - 前端直传PUT
*
* 注意:
* - 过期时间、签名算法、header 约束等通常由 adapter 或其底层 SDK 决定。
* - 返回值中的 `metadata` 字段语义更接近“直传时需要附带的 headers”不同厂商前缀不同如 `x-oss-meta-*` / `x-cos-meta-*`)。
* 字段名因历史原因沿用 `metadata`。
*/
generatePresignedPutUrl(params: PresignedPutUrlParams): Promise<PresignedPutUrlResult>;
/**
* 生成对象的下载预签名 URLPresigned URL
*
* 用途:
* - 临时授权下载GET
*/
generatePresignedGetUrl(params: PresignedGetUrlParams): Promise<PresignedGetUrlResult>;
/**
* 生成公共对象的访问 URL。
*/
generatePublicGetUrl(params: GeneratePublicGetUrlParams): GeneratePublicGetUrlResult;
/**
* 列出对象 key可按前缀过滤
*
* 注意:
* - 当前返回结构只包含 key 列表,未包含分页/marker/continuationToken 等信息;
* 若业务需要大规模遍历,应扩展 `ListObjectsParams/Result` 支持分页与更多元数据。
* - `prefix` 为可选;不传则表示列出整个 bucket 内对象(注意对象很多时可能会很慢/很贵)。
* - 不要用 listObjects + deleteObjectsByMultiKeys 来实现“按前缀删除”:批量删除单次最多 1000 个对象,且 list 结果量可能很大;
* 请使用 `deleteObjectsByPrefix`adapter 会在内部分页与分批删除)。
*/
listObjects(params: ListObjectsParams): Promise<ListObjectsResult>;
/**
* 复制对象。
*/
copyObjectInSelfBucket(params: CopyObjectParams): Promise<CopyObjectResult>;
/**
* 获取对象元数据Metadata
*
* 说明:
* - 元数据通常包含用户自定义 metadata 以及部分系统字段(取决于 adapter 的实现)。
* - 不同厂商会对 metadata 的 key 前缀、大小写、可用字符做限制,调用方应尽量使用简单的 ASCII key。
*/
getObjectMetadata(params: GetObjectMetadataParams): Promise<GetObjectMetadataResult>;
/**
* 资源清理/连接释放。
*
* 说明:
* - 某些 SDK 会维护连接池或后台任务,业务在进程退出前可调用以更快释放资源。
* - 若 adapter 无需清理应实现为空操作resolved Promise
*/
destroy(): Promise<void>;
}