mirror of
https://github.com/Tencent/WeKnora.git
synced 2026-10-28 03:29:30 +08:00
* feat(datasource/dingtalk): 摄取钉钉"上传文件"(docx/pptx/xlsx/pdf)
钉钉连接器此前只导入原生 .adoc 文档:知识库里的上传文件既不会出现在选择器里,
也不会被同步,而且没有任何提示。
- 节点判定拆成 isOnlineDocument / isBinaryDocument / binaryContentType,isDocument()
变成"在线文档 ∪ 二进制文档",上传文件因此可被枚举与摄取;表格(axls)等其它原生
类型仍不在其中,避免枚举出同步读不了的节点。
- 上传文件通过钉盘下载 API 逐字节传输,交给 WeKnora 自己的解析器:先用
/v2.0/doc/dentries/{id}/queryDentryId 把节点 UUID 换成数字 spaceId/dentryId
(存储 API 拒绝非数字 spaceId),再取预签名 URL 下载。
- 大小上限加在传输上而不是列表元数据上:node.size 与存储对象并不一致。
- 预签名 URL 短命且带版本,传输失败会用新签名重试。
- Validate 对上传文件"解析位置但不传 payload",凭证校验不必为每个候选文件下载
数 MB;adoc 仍走 blocks API。
- 同步按类型分派:adoc 渲染 blocks,上传文件落原始字节并带上具体 MIME 类型与只含
一个扩展名的文件名;下载失败与读取失败一样是可重试的失败项,不推进游标。
本提交只含 C(上传文件摄取)。不含:校验循环容错(A)、跳过项日志与可见性(B)、
原生表格 axls(D)、多维表/手工引用/前端(E)。
* test(datasource/dingtalk): 上传文件用例改用合成文档名与占位 ID
- 夹具、断言与文件名注释里的文档名统一换成合成名 Employee-Handbook.docx,
用例语义不变:仍覆盖"名字已带扩展名时不重复追加"与 PK\x03\x04 字节断言。
- 去掉测试注释里"as verified against the live tenant"的表述,改为描述调用顺序。
- dentry 响应示例与用例中的数字 ID 换成明确占位符,不再出现可被误认的真实 ID。
* fix(datasource/dingtalk): 上传文件摄取改为数据源级开关,超限不再重试
评审意见(#3786):上传文件是本次新增的摄取路径,存量数据源升级后无需用户显式启用
就会在下一次同步(含增量)开始下载并向量化所选范围内的 docx/pptx/xlsx/pdf,可能
增加存储与 embedding 成本;同时单次下载里超出体积上限被当成可重试错误,没有
Content-Length 的超大文件会重签名再下满 3 次。
- 新增 `Settings.include_uploaded_files`(默认 false,未设置/非法值一律按 false)。
读取走与本仓库语雀连接器同名的 settingBool(v, def),并新增 documentSettings /
parseDocumentSettings 承载开关。
- 判定拆成"有没有读取路径"(isDocument)与"这个数据源收不收"(isIngestible):
Validate 的探测、ListResources、全量同步与增量同步(共用 scanWorkspace)四处
全部改用 isIngestible,关闭时行为与 main 一致。
- skipReason 对"能读但没开开关"的上传文件给出可操作的原因:说明
include_uploaded_files 未启用,而不是伪装成类型不支持;媒体文件与真正没有
摄取路径的类型保持原有说法。
- readLimited 改为返回哨兵错误 errDocumentTooLarge(同时包装上限字节数),
fetchSigned 据此返回 retryable=false:体积是对象的属性,新签名只会拿到同样的
字节。普通读错误仍然 retryable=true,仍会重签名重试。
- 前端数据源编辑弹窗(同步策略步骤)加对应开关,未触碰时不写回 settings;5 个
语言包补齐文案。
- website-docs 钉钉一节写明支持范围、默认值、64 MiB 单文件上限与成本影响。
测试补 include_uploaded_files 的未设置/显式关闭/显式开启三种状态:校验、资源列表、
全量同步、增量同步四处各自断言,直接选择上传文件在关闭时仍是失败的资源;流式超限
用例断言签名查询与对象下载各只发生一次,另加"普通读错误仍重试"的用例。
---------
Co-authored-by: linus-liu-web <11640009+linus-liu-web@users.noreply.github.com>
Co-authored-by: linus-liu-web <linus-liu-web@users.noreply.github.com>
54 lines
1.8 KiB
Go
54 lines
1.8 KiB
Go
package dingtalk
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/Tencent/WeKnora/internal/types"
|
|
)
|
|
|
|
// settingBool interprets a data source settings value as a boolean, returning
|
|
// def when the value is absent or of an unrecognised shape. Settings arrive
|
|
// from JSON, so a hand-edited config may carry either a real bool or its string
|
|
// form. The accepted spellings are the ones the Yuque connector's settingBool
|
|
// accepts, so every connector reads its switches the same way.
|
|
func settingBool(v interface{}, def bool) bool {
|
|
switch t := v.(type) {
|
|
case bool:
|
|
return t
|
|
case string:
|
|
switch strings.ToLower(strings.TrimSpace(t)) {
|
|
case "true", "1", "yes", "on":
|
|
return true
|
|
case "false", "0", "no", "off":
|
|
return false
|
|
}
|
|
}
|
|
return def
|
|
}
|
|
|
|
// documentSettings holds the optional ingestion switches carried in
|
|
// DataSourceConfig.Settings.
|
|
//
|
|
// Every switch defaults to false: a data source created before the switch
|
|
// existed keeps the behaviour it had then until an operator turns the switch on
|
|
// deliberately, so an upgrade never starts downloading or embedding content
|
|
// nobody asked for.
|
|
type documentSettings struct {
|
|
// IncludeUploadedFiles admits uploaded Office/PDF files (FILE/DOCUMENT
|
|
// nodes) that are downloaded from 钉盘 and parsed by WeKnora itself.
|
|
IncludeUploadedFiles bool
|
|
}
|
|
|
|
// parseDocumentSettings reads the settings bag of a data source. A missing or
|
|
// malformed value leaves the switch off, so a hand-edited config can only ever
|
|
// opt in to an ingest path, never alter one by accident.
|
|
func parseDocumentSettings(dataSourceConfig *types.DataSourceConfig) documentSettings {
|
|
var raw map[string]interface{}
|
|
if dataSourceConfig != nil {
|
|
raw = dataSourceConfig.Settings
|
|
}
|
|
return documentSettings{
|
|
IncludeUploadedFiles: settingBool(raw["include_uploaded_files"], false),
|
|
}
|
|
}
|