ymq
|
98389da60b
|
fix(ids): 全仓 ID 生成统一 getID()/uuid()——禁 uuid4 截断
- api_core.py 5处、init.py 6处、pipeline.py 1处: uuid4().hex -> getID()
(uuid4 hex 32位+chunk后缀_cN 溢出 VARCHAR(32) → ingest 1406 DataError,
即 search 0 命中根因;getID() 21位放得下)
- upload_file.dspy: 去掉 replace('-','')[:16] 手工截断,直用沙箱 uuid()
- 规范:.py 必须 getID(),.dspy 必须 uuid()
|
2026-09-03 16:29:15 +08:00 |
|
ymq
|
51b0bf1b85
|
refactor(rag-api): API Key 改由平台 dapi 模块统一管理
- 删除自建 rag_api_keys 表 model + api_key_create/list/revoke 管理端点
(key 申请/管理走 dapi 的 downapp/downapikey UI,避免两套 key 体系)
- verify_api_key 改调 dapi.get_apikey_user:有效性/过期/IP白名单全走平台机制,
从认证用户 orgid 注入机构边界
- 7 个对外端点去掉 rag 侧 scopes 检查(授权粒度归 dapi 账号)
- 部署目标:产线平台测试环境(ragserver 弃用),rag 模块已在 pipeline-app pkgs
|
2026-09-03 16:04:54 +08:00 |
|
ymq
|
00262a6d2a
|
feat(rag-api): 对外B2B API+内部tools包装
- wwwroot/api/ 六个对外端点(Bearer Key 鉴权,路由授 any、业务鉴权在 api_core):
kb_create/kb_delete/doc_upload/doc_delete/tag_create/doc_set_tags/search
- rag/api_core.py: verify_api_key + make_api_env(org注入) + 六个业务核心
(复用 init.py 底层检索/入库能力,杜绝双实现分叉)
- 统一返回格式 {"status":"ok"|"error","data":...}
- rag/ingest.py: 入库管线从 upload_file.dspy 抽出共享(UI/API同一引擎)
- rag/tools.py: RAG_TOOL_SCHEMAS + exec_rag_tool(与API同构,供内部助手调用)
- rag_api_keys 表 model(key 只存 SHA256);管理端 api_key_create/list/revoke
- load_path.py 注册 7 个 API 端点(any) + 3 个管理端点(logined)
|
2026-09-03 15:51:19 +08:00 |
|
ymq
|
49276c7a0e
|
fix(rag-ui): 删除new_kb_form.ui重复binds键——JSON后键覆盖前键导致刷新bind失效
|
2026-09-02 15:02:47 +08:00 |
|
ymq
|
fd2a52a1a5
|
fix(rag-perm): file_list/file_serve 维护者也需要看文件列表和下载——maintain或search任一通过
|
2026-09-02 14:58:43 +08:00 |
|
ymq
|
c9a2f4d7e8
|
fix(rag-ui): 新建知识库submit后刷新列表——Form加submited事件bind重建kb_list
|
2026-09-02 14:52:25 +08:00 |
|
ymq
|
728dbc328e
|
feat(rag-ui): 维护/检索角色改多选checkbox(multicheck)+role_options.dspy角色选项
|
2026-09-02 13:55:37 +08:00 |
|
ymq
|
1c1ef65931
|
feat(rag): 机构rags目录+容量检查参数化+KB级角色权限
- 存储: 知识库文件存 {workspace_base}/{org}/rags/{kb}/ (机构目录下开设rags目录)
- 容量: rag_check_storage_quota 参数控制是否检查机构上限(默认不检查)
- 权限: rag_knowledge_bases 加 maintain_roles/search_roles; 空=同机构默认可用
维护入口(upload/delete/rename/tree/tags)校验maintain; 检索入口(search/file_list/file_serve)校验search
- file_serve.dspy: 下载/预览走校验端点, 堵住/idfile/猜路径越权
- 机构隔离: 跨机构KB一律拒绝
|
2026-09-02 12:09:16 +08:00 |
|
ymq
|
03dbf0f2b5
|
feat(rag): 多媒体知识库接回——qwen3-vl在线(2560维)+CLIP保留给GPU;VDB地址读upapp;在线重排;配置界面4引擎
|
2026-09-01 15:47:21 +08:00 |
|
ymq
|
576f0b6368
|
fix(rag): 引擎配置入口改用Popup(与新建知识库同模式)
|
2026-09-01 14:09:07 +08:00 |
|
ymq
|
42f283b665
|
feat(rag): 知识库页加引擎配置入口按钮
|
2026-09-01 14:06:23 +08:00 |
|
ymq
|
c7a82dc570
|
fix(popup): 弹窗居中显示 archor:cc + 修 height:auto 导致的 NaN 位置
Popup 位置计算(height→h)只支持 px/百分比/cheight,不支持 auto:
height:'auto' → parseFloat('auto')=NaN → t=(rect.height-NaN)/2=NaN → top='NaNpx'
浏览器忽略无效值 → 弹窗跑到顶部,表现像 archor:'tc'。
改为 height:'60%' + 显式 archor:'cc'(默认本就是 cc,显式写清居中意图)。
|
2026-08-25 17:01:25 +08:00 |
|
ymq
|
f2afaa82e8
|
fix(popup): 新建知识库弹窗点击即关闭 + Cancel 按钮无法关闭弹窗
根因(核实 bricks/popup.js 源码):
1. popup_options 显式写了 auto_dismiss:true,Popup 构造时把 click 绑到整个 bricks.Body,
而 click_outside 只判断 event.target != this.dom_element(无子树 contains 判定),
点击弹窗内任何子元素(输入框/下拉/按钮)都命中 → 立即 dismiss。改为 auto_dismiss:false。
2. 加 dismiss_events:['cancel','submited'] 让 Form 的取消/提交完成关闭弹窗。
但 set_dismiss_events 只绑 load_content 返回的根 widget,而 dispatch 用
new Event() 不冒泡(bubbles:false) —— 原根节点是 VBox、事件由子 Form 发出,绑不上。
故把 Form 提为 new_kb_form.ui 根 widget,标题改用 Form 自带 title 选项。
(title 不是 Popup 的合法 option,仅 PopupWindow/Form 支持)
|
2026-08-25 16:05:57 +08:00 |
|
ymq
|
51c9968093
|
fix(host): 后台入库任务禁硬编码库名,改经 get_module_dbname 映射
ingest_doc 是 background_reco 后台任务(无 request/env),原用 db.sqlorContext('rag') 6 处。
在 ragserver 上库名恰为 rag 所以能跑,接入 pipeline-app(库名 pipeline)后
sqlorFactory 报 NoneType.get → 入库全程失败,status 永久 pending、向量丢失。
改为函数开头 _dbname = get_module_dbname('rag') 统一映射。
|
2026-08-25 15:45:44 +08:00 |
|
ymq
|
e9d28c57ce
|
fix(search): 修 KeyError 'file_name' — 向量/关键词召回 hit 补全 file_name/file_path + 渲染改防御性 .get
向量检索路径构造的 hit 只含 chunk 信息(无 file_name),渲染时 h['file_name'] 直接下标 KeyError 500。
此前 CLIP 检索长期 0 命中掩盖了该 bug,bge-m3 通路修复后首次有真实命中即暴露。
|
2026-08-25 14:55:12 +08:00 |
|
ymq
|
789960a1cf
|
refactor(schema): rag 模块全部数据表加 rag_ 前缀(模块跨应用复用防冲突)
- models/ 重建为正确表定义格式(summary+fields+indexes),覆盖全部 11 个表
修正原 models/ 误放 CRUD 格式副本(缺 summary)导致 json2ddl 100% 失败被静默忽略
- json/ 6 个 CRUD 定义 tblname 加前缀 + 文件改名
- 129 处 SQL/sor 表名加 rag_ 前缀(URL 路径 knowledge_bases_list 保持不变)
- 新增 init/migrate_rag_prefix.sql 幂等 RENAME TABLE 迁移
|
2026-08-25 14:24:37 +08:00 |
|
ymq
|
fb2cf3e703
|
fix(display): 知识库卡片显示友好向量引擎名(文本 bge-m3 / 多媒体 CLIP)
|
2026-08-25 13:26:17 +08:00 |
|
ymq
|
1054dbb3a9
|
feat(embedding): 知识库支持文本(bge-m3 /txte)/多媒体(CLIP /mme)双向量引擎
- create_kb/new_kb_form 加向量引擎选择(文本 bge-m3 / 多媒体 clip-vith14)
- upload_file/batch_ingest/search_result/init.py 按 embedding_engine 路由到 /txte 或 /mme
- 文本知识库上传媒体文件友好拒绝(不再崩溃报错)
|
2026-08-25 13:15:11 +08:00 |
|
ymq
|
5354108546
|
fix: 视频用原生video标签(controls+autoplay+muted)替换VideoPlayer组件
|
2026-08-12 11:22:56 +08:00 |
|
ymq
|
0398ca247f
|
fix: autoplay true -> True (Python syntax)
|
2026-08-12 11:16:25 +08:00 |
|
ymq
|
590fa48fbc
|
fix: VideoPlayer去掉cheight改用autoplay
|
2026-08-12 11:15:05 +08:00 |
|
ymq
|
67c13f626d
|
feat: 入库时存储人脸bbox和视频时间戳到chunk metadata
- upload_file: 图片/视频人脸检测保存face_bboxes
- upload_file: 视频帧chunk INSERT加metadata列(start_time+bboxes)
- search_result: 检索结果显示bbox坐标和视频时间戳
- init.py: chunk INSERT加metadata列
- media_cards: 标签同时读media_tags表和metadata.tags
- search_result: 媒体URL用entire_url转完整路径
|
2026-08-12 11:10:50 +08:00 |
|
ymq
|
631b2da7a4
|
feat: 检索结果媒体使用entire_url()+位置信息(bbox/时间戳)显示
|
2026-08-12 11:07:15 +08:00 |
|
rag
|
9c602a0e8d
|
fix: media_cards 标签同时读取 media_tags 表和 metadata.tags
|
2026-08-12 10:59:24 +08:00 |
|
rag
|
afae286434
|
fix: 声纹页面修复 - 移除broken quotes+暂时跳过tags查询
|
2026-08-11 18:06:43 +08:00 |
|
rag
|
51ea4096aa
|
fix: 声纹页面显示+tags查询sqlor兼容
|
2026-08-11 18:01:09 +08:00 |
|
rag
|
da0ec1397b
|
fix: 声纹页面查询包含已提取声纹的视频
|
2026-08-11 17:11:31 +08:00 |
|
ymq
|
3458af766c
|
fix: graph API 用 localhost:9092(无外网端口)
|
2026-08-11 17:04:31 +08:00 |
|
ymq
|
239b82c85d
|
fix: KB删除时清理VDB/Graph/physical文件
- 修复物理文件删除:路径不以/idfile/开头,改为检查/开头
- 新增VDB向量删除:调用vectordb API删除该KB的所有向量
- 新增Graph图数据库清理
- 新增entities/entity_relations表清理
|
2026-08-11 17:03:33 +08:00 |
|
ymq
|
3b1cda8d2f
|
feat: 检索结果多媒体文件使用 bricks 控件播放
- 视频(mp4等): VideoPlayer 控件
- 音频(mp3等): Html <audio> 控件
- 图片(png等): Image 控件
- file_path 透传到前端构造媒体 URL
|
2026-08-10 18:09:15 +08:00 |
|
ymq
|
6dbec41c34
|
fix: LIKE 中的 % 需转义为 %% 避免被 sqlor 误解析
|
2026-08-10 17:53:28 +08:00 |
|
ymq
|
f86cda6ebd
|
fix: 标签检索过滤人脸生成文件,metadata含face的文档不再出现在检索结果
|
2026-08-10 17:51:35 +08:00 |
|
ymq
|
9ac8192693
|
fix: 视频上传增加声纹提取,修复 metadata 永远 pending
- 视频处理新增:ffmpeg 提取音频 → voiceprint/extract 声纹 API
- meta_parts['video'] 成功时从 'pending' 改为 'done'
- voiceprint 结果写入 meta_parts
|
2026-08-10 17:42:52 +08:00 |
|
ymq
|
a22ea76cb8
|
fix: document_chunks also use created_at (no updated_at column)
|
2026-08-10 17:02:08 +08:00 |
|
ymq
|
1a45ca2cb3
|
fix: use created_at instead of updated_at for ORDER BY
|
2026-08-10 16:59:12 +08:00 |
|
ymq
|
f181de9a10
|
fix: 纯标签检索支持非文本文档(视频/图片等)
- tag-only 检索从 documents 表查询而非仅查 document_chunks
- 对无 chunks 的文档显示文件名和类型图标
- 有 chunks 的文本文档显示内容预览
|
2026-08-10 16:56:54 +08:00 |
|
ymq
|
3425c09188
|
feat: 标签支持多选后直接检索,无关键词时可纯标签检索
- search_result.dspy: 标签解析提前,query为空但标签有值时走直接DB查询
- search.ui: tag_selector添加changed事件触发检索,更新首页提示文案
|
2026-08-10 11:20:00 +08:00 |
|
ymq
|
70a958180f
|
fix: 搜索页标签过滤改用UiCode多选+声明式{{widget}}传参,移除自定义JS
|
2026-08-07 18:00:03 +08:00 |
|
ymq
|
9c86291bbf
|
fix: 标签属于组织非知识库 — tag_options按org_id过滤,search.ui页面加载即显示,search_result kb_id=all时不限
|
2026-08-07 17:52:31 +08:00 |
|
ymq
|
172b302641
|
fix: kb_options.dspy org_id过滤与kb_list一致,用用户实际org_id
|
2026-08-07 17:49:29 +08:00 |
|
ymq
|
1206e27336
|
feat: 知识检索添加多选标签过滤 — tag_options.dspy + search.ui标签芯片 + search_result按标签过滤
|
2026-08-07 17:27:47 +08:00 |
|
ymq
|
c912805534
|
fix: 标签选中状态改用☑文字判断,不再依赖Bricks未渲染的data-sel DOM属性
|
2026-08-07 16:55:30 +08:00 |
|
ymq
|
86e235df58
|
fix: DSPY中用uuid()不用getID()
|
2026-08-07 16:49:14 +08:00 |
|
ymq
|
fcb7d1b744
|
fix: getID不带参数调用
|
2026-08-07 16:48:54 +08:00 |
|
ymq
|
24bc017e1f
|
fix: 所有id统一32字节 — init.py去掉[:16], DSPY文件改用getID(32)去import uuid
|
2026-08-07 16:47:50 +08:00 |
|
ymq
|
0fff825331
|
fix: save_tags.dspy media_tags id改为32字节 getID(32)
|
2026-08-07 16:40:38 +08:00 |
|
ymq
|
608be82e68
|
fix: save_tags.dspy uuid→getID(16),DSPY禁止import,改用预置getID
|
2026-08-07 16:31:57 +08:00 |
|
ymq
|
417ea70a34
|
fix: save_tags.dspy 缺少 import uuid,导致 uuid.uuid4() 报错无法写入标签
|
2026-08-07 15:46:31 +08:00 |
|
ymq
|
1c03bb8071
|
fix: 标签保存后不再整页刷新,改为关闭弹窗+AJAX刷新卡片面板
|
2026-08-07 15:38:20 +08:00 |
|
|
|
000b3c0b10
|
fix: tag save blocks browser — capture 'this' before fetch (then callback 'this' is window, causing infinite loop)
|
2026-08-06 16:06:43 +08:00 |
|