Skip to content

Dev/michaelhu#362

Merged
Matrix-X merged 55 commits intodevelopfrom
dev/michaelhu
Mar 4, 2026
Merged

Dev/michaelhu#362
Matrix-X merged 55 commits intodevelopfrom
dev/michaelhu

Conversation

@Matrix-X
Copy link
Contributor

@Matrix-X Matrix-X commented Mar 4, 2026

No description provided.

Matrix-X and others added 30 commits January 6, 2026 01:23
…/db-migrations.md,写清 RAG 模块(A–O)对底座索引(dense/sparse/hier/kg/

    structured/time)的复用关系、哪些需要 DB 辅助表、以及 make db-migrate 的行为与验收 SQL。
  - 实现 T206–T209(并在 specs/011-knowledge-space/tasks.md 标记为 [X]):
      - pgvector 迁移:backend/pkg/corex/db/migration/202601120001_knowledge_pgvector_tables.go(vector 扩展 + knowledge_vectors + 索引)
      - KG 协助表:backend/pkg/corex/db/migration/202601120002_knowledge_kg_assist_tables.go(knowledge_kg_nodes/edges + 索引)
      - make db-migrate/db-refresh 对齐与条件执行:backend/cmd/database/migrate.go、backend/cmd/database/main.go
      - 迁移验证测试(需 DSN 环境变量):backend/tests/integration/knowledge_space/db_migrate_prereq_test.go
  - 实现 T210–T214(并在 specs/011-knowledge-space/tasks.md 标记为 [X]):
      - 新增显式配置 knowledge_space.index_backends(B 方案默认 postgres-backed):backend/config/config.go、backend/config/defaults.go
      - chunk store 迁移:backend/pkg/corex/db/migration/202601120003_knowledge_chunk_store_tables.go(knowledge_chunks + FTS/jsonb/kind 索引)
      - chunk links 迁移:backend/pkg/corex/db/migration/202601120004_knowledge_chunk_links_tables.go(knowledge_chunk_links + 索引)
      - db-migrate 按 index_backends gating 创建 knowledge_chunks/knowledge_chunk_links:backend/cmd/database/migrate.go
      - 双配置验证测试:backend/tests/integration/knowledge_space/db_migrate_chunk_store_test.go
  - 更新配置示例文件,补齐新字段:
      - backend/etc/config.yaml
      - backend/etc/config_example.yaml
  - 修复 make db-refresh 编译错误(refresh 分支漏传 cfg):backend/cmd/database/main.go
  - Hugging Face embedding 已稳定可用
      - 优先走 /hf-inference/models/{model}/pipeline/feature-extraction
      - /v1/embeddings 不可用时自动 fallback 到 HF 原生接口
      - “测试连接”已成功(BAAI/bge-m3)
  - Hugging Face LLM 已接入 OpenAI‑compatible
      - LLM 测试连接走 /v1/chat/completions
      - 后端已把 Hugging Face 映射为 OpenAI 客户端驱动
  - 模型列表已更新为你认可的主流梯队
      - Embedding:BGE / GTE / E5
      - LLM:Qwen / Llama / DeepSeek / Gemma / Mistral / Phi
  - UI 默认 Base URL
      - Embedding:https://router.huggingface.co/v1(实际请求会自动走 hf-inference)
      - LLM:https://router.huggingface.co/v1
  - backend/internal/transport/http/admin/knowledge_space/dto.go 新增 docUuid
  - backend/internal/transport/http/admin/knowledge_space/ingestion_handlers.go 传入 DocUUID
  - backend/internal/service/knowledge_space/ingestion_service.go 贯通到 chunking
  - backend/internal/service/knowledge_space/chunking.go 优先使用 DocUUID
  - web-admin/app/composables/useKnowledgeSpaces.ts payload 增 docUuid
  - web-admin/app/pages/knowledge-spaces/index.vue 上传时把 lastUploadedMediaUUID 写进 docUuid
  - 修复 PDF 分页优先:pdftotext 保留分页符;分页优先时页内 ≤ chunkSize 不再细分
  - 追加入库分段日志:backend/logs/ingestion_jobs/<jobId>.log
  - 修复向量存储 DSN 优先级(pgvector → db.dsn → host/port 拼接)
  - HuggingFace:embedding 走 /hf-inference/.../pipeline/feature-extraction;模型列表更新
  - UI:分页优先改为独立 checkbox;联动说明完善;切块预览排序按 section→segment_part→chunk_idx;去掉前端伪“段落拆分”
  - UI:入库任务列表进度条、返回按钮、删除弹窗修复;i18n common.cancel 修复
  - Media 上传去重:基于内容 hash + tenant + member/user 生成稳定 storage_key;同租户同用户去重
  - Ingestion doc_uuid:上传入库时 doc_uuid = media_assets.uuid(写入 chunk/vector metadata)
  - AI Settings:保存配置不再清空 embedding cap_cache;刷新后回填测试结果

  下一步(不在本次提交)

  - 通用 WS 消息总线(方案已写 docs/plan/wx/WS-NOTIFY.md)
  - 入库进度实时推送/替代轮询
  - 非分页时“chunkSize 优先”切块策略调整
…模型改为 bge-m3

      - 文件:backend/config/agents/providers.d/ollama.yaml
  - Ollama max_input_tokens 探测增强:支持 model_info/details 里的 context_length,bge-m3 能识别到 8192
      - 文件:backend/internal/service/agent/agent_setting_service.go
  - AI Settings:探测值展示与稳定性
      - 维度/最大输入不会再因为切换而清空
      - 切换 provider/model 时强制从后端 profiles 回填探测值
      - 测试连接后自动设置为“激活模型”(刷新也能读到该模型的探测值)
      - 草稿不再覆盖维度,测试成功会清理草稿
      - 文件:web-admin/app/pages/settings/ai/index.vue
  - 保存时不覆盖维度(后端保护)
      - dimensions <= 0 不写入 defaults,避免覆盖探测值
      - 文件:backend/internal/transport/http/admin/agent/setting_handler.go
  - USelect 控制台 aria-hidden 警告
      - 截断策略下拉改为 portal=false + 打开时 blur 处理
      - 文件:web-admin/app/components/settings/ai/ModalityParamsForm.vue
…ze 95–100,让耗时阶段更平滑。

  - chunk/embed/persist 都支持细粒度进度推送(按 2% 步进)。
  - 移除进度日志输出,避免后台刷屏。
- Ollama embedding 列表更新:去掉 bge-base-en/bge-large-zh,新增 bge-large,并把默认…
Matrix-X and others added 25 commits January 28, 2026 23:55
…LLM/Embedding 走真实调用,其他模态先占位;/agents/invoke

  改为真实执行;Agent 会话支持 uuid,新增会话内 invoke/stream,强制 session_id;env 解析统一优先 JWT/tenant current_env,default 不再误导;修复 catalog 路径兜底与
  tenant header 逻辑;补齐相关文档与 quickstart 示例。
  - Image 驱动
      - OpenAI Image:已实现真实 HTTP 调用,日志确认可用。
      - Gemini Image:已实现真实 HTTP 调用(Nano Banana)。
      - 即梦 Image:改成异步提交+轮询流程(CVSync2AsyncSubmitTask / CVSync2AsyncGetResult)。
  - AI Settings & manifest
      - openai.yaml 补齐图像模型:gpt-image-1 / gpt-image-1-mini / gpt-image-1.5 / dall-e-2 / dall-e-3
      - google.yaml 新增(Gemini image)
      - volcengine.yaml 同步并改为即梦异步接口 + 正确 req_key 模型列表 + 默认 force_single
  - 日志
      - image 测试连接可见 [agent_setting] ping_image start
      - 驱动级日志:[ai-image] openai|gemini|volcengine http_call ...
  - 文档
      - 新增轮询机制开发计划:docs/plan/integration/poller_mechanism.md
      - 更新 WS Bus 文档:docs/plan/wx/WS-NOTIFY.md 增加“宿主模式发布入口”章节

  当前已知问题/待做

  - 即梦异步接口已接入,但没有抽成通用 poller(计划文档已写)。
  - WS Bus specs/023-websocket-notify 还没同步补齐(只改了 docs)。
  - 如果要合并:需要你决定是否切新分支来做 WS Bus 相关补齐/实现。
已完成/变更内容(当前分支)
…/admin/runtime/routes.go、backend/internal/transport/http/admin/runtime/ws_bus_handler.go,并扩展

    websocket bus(hub.go/client.go/authorizer.go)与发布逻辑 bus/publish.go,附带测试 bus/hub_test.go。
  - 管理端路由扩展:backend/internal/transport/http/admin/routes.go 注册 runtime 相关路由。
  - 集成网关规范更新:specs/007-integration-gateway-and-mcp/contracts/ai-multimodal.http-openapi.yaml 更新以覆盖多模态/流式场景。
  - 文档/规格:specs/023-websocket-notify/* 与 docs/plan/wx/WS-NOTIFY.md 更新(计划、spec、quickstart、tasks)。
- 为多处依赖本地端口/Redis 的测试增加环境检测并跳过(SkipIfNoLocalListener / SkipIfNoTCPDial),避免受限环境下失败。
  - 修复知识空间相关测试环境:补齐 knowledge_chunks 与 ai_provider_credentials 表,强制 ingestion 同步入库,清理配置与错误码期望差异。
  - 修正配置加载逻辑与空配置文件问题:etc/config.yaml 占位 + 配置文件向上级目录回溯查找。
  - 调整知识空间流转清理逻辑(RetireSpace 时 DropVectors),避免向量残留导致断言失败。
  - 补充/修正 Redis 测试的 setup 与调用签名,确保构建通过。
  - 新增 WebSocket 通知/事件总线能力:增加运行时路由与处理器 backend/internal/transport/htt…
  - 新增 WS Bus 动态注册入口:POST /api/v1/internal/ws-bus/register,用于宿主/插件运行时注册可发布 topic(幂等)。见 backend/internal/transport/http/admin/runtime/routes.go:14、backend/
    internal/transport/http/admin/runtime/ws_bus_handler.go:30。
  - 保留并增强发布入口:POST /api/v1/internal/ws-bus/publish,发布前做“静态白名单 + 动态注册”联合校验。见 backend/internal/transport/http/admin/runtime/ws_bus_handler.go:61、backend/internal/
    transport/websocket/bus/publish.go:74。
  - 发布 topic 策略升级为租户级动态表(内存):支持按 tenant_uuid 注册/校验,避免跨租户误放行。见 backend/internal/transport/websocket/bus/publish.go:13。
  - 新增白名单 topic powerx.org_sync.progress.v1,并保留 org_sync.progress。见 backend/internal/transport/websocket/bus/hub.go:14、backend/internal/transport/websocket/bus/publish.go:8。

  鉴权与可观测性

  - WS 订阅鉴权支持“动态注册 topic 直接放行”,同时保留原有知识库 RBAC 与白名单策略。见 backend/internal/transport/websocket/bus/authorizer.go:54。
  - 补充发布拒绝/放行的 debug 日志字段(tenant/topic/whitelist/dynamic),便于远程排查。见 backend/internal/transport/http/admin/runtime/ws_bus_handler.go:84、backend/internal/transport/
    websocket/bus/authorizer.go:36。

  文档与契约

  - OpenAPI 契约补齐了 register/publish 两个内部接口。见 specs/023-websocket-notify/contracts/http-openapi.yaml:13。
  - Quickstart 改为先 register 再 publish,并覆盖 org_sync.progress 与 powerx.org_sync.progress.v1。见 specs/023-websocket-notify/quickstart.md:36。
  - Spec/Plan/Tasks 同步更新了 FR-015(动态注册)与任务拆分。见 specs/023-websocket-notify/spec.md:93、specs/023-websocket-notify/tasks.md:76、docs/plan/wx/WS-NOTIFY.md:264。

  测试状态

  - 新增用例:register -> publish 成功、未注册 topic 发布被拒绝、动态 topic 租户隔离、静态白名单校验。见 backend/internal/transport/http/admin/runtime/ws_bus_handler_test.go:16、backend/
    internal/transport/websocket/bus/publish_test.go:11。
  - 已本地通过:go test ./internal/transport/http/admin/runtime ./internal/transport/websocket/bus(针对新增 WS 用例)。
  - 新增 WS Bus 动态注册入口:POST /api/v1/internal/ws-bus/register,用于宿主/插件运行时注册可发布 topic(幂等)。见 backend/internal/transport/http/admin/runtime/routes.go:14、backend/
    internal/transport/http/admin/runtime/ws_bus_handler.go:30。
  - 保留并增强发布入口:POST /api/v1/internal/ws-bus/publish,发布前做“静态白名单 + 动态注册”联合校验。见 backend/internal/transport/http/admin/runtime/ws_bus_handler.go:61、backend/internal/
    transport/websocket/bus/publish.go:74。
  - 发布 topic 策略升级为租户级动态表(内存):支持按 tenant_uuid 注册/校验,避免跨租户误放行。见 backend/internal/transport/websocket/bus/publish.go:13。
  - 新增白名单 topic powerx.org_sync.progress.v1,并保留 org_sync.progress。见 backend/internal/transport/websocket/bus/hub.go:14、backend/internal/transport/websocket/bus/publish.go:8。

  鉴权与可观测性

  - WS 订阅鉴权支持“动态注册 topic 直接放行”,同时保留原有知识库 RBAC 与白名单策略。见 backend/internal/transport/websocket/bus/authorizer.go:54。
  - 补充发布拒绝/放行的 debug 日志字段(tenant/topic/whitelist/dynamic),便于远程排查。见 backend/internal/transport/http/admin/runtime/ws_bus_handler.go:84、backend/internal/transport/
    websocket/bus/authorizer.go:36。

  文档与契约

  - OpenAPI 契约补齐了 register/publish 两个内部接口。见 specs/023-websocket-notify/contracts/http-openapi.yaml:13。
  - Quickstart 改为先 register 再 publish,并覆盖 org_sync.progress 与 powerx.org_sync.progress.v1。见 specs/023-websocket-notify/quickstart.md:36。
  - Spec/Plan/Tasks 同步更新了 FR-015(动态注册)与任务拆分。见 specs/023-websocket-notify/spec.md:93、specs/023-websocket-notify/tasks.md:76、docs/plan/wx/WS-NOTIFY.md:264。

  测试状态

  - 新增用例:register -> publish 成功、未注册 topic 发布被拒绝、动态 topic 租户隔离、静态白名单校验。见 backend/internal/transport/http/admin/runtime/ws_bus_handler_test.go:16、backend/
    internal/transport/websocket/bus/publish_test.go:11。
  - 已本地通过:go test ./internal/transport/http/admin/runtime ./internal/transport/websocket/bus(针对新增 WS 用例)。
  - 这次把异步链路从“分散功能”收敛成统一运行时:Event Topic + Task + WebSocket + Scheduler(Cron),并按同一命名与联调方式对齐。
  - 你当前已实测通过:WS 实时订阅/多 topic 复用、Replay 状态推送、Pipeline 通知推送、Cron run-now/pause/resume。

  核心实现调整

  - 统一 WS 入口为 /api/ws(不再走 /ws 兼容思路),并修复前端连接构造避免再打到 /ws。
  - 联调入口统一为两类任务:replay 与 pipeline,并通过 Task 队列落地和历史可追溯。
  - Queue 语义明确为分片模型:tenant_key + subscriber_id;运行态与历史态分离,历史可持续追溯。
  - 系统级 topic 与业务/插件/第三方 topic 的治理逻辑已按 event_topics 统一管理路径推进。

  脚本与回归体系

  - Event 现有:scripts/event_fabric/integration_playbook.sh
  - 新增 WebSocket:scripts/websocket/integration_playbook.sh:1
  - 新增 Cron:scripts/cron/integration_playbook.sh:1
  - 旧 smoke 已改为转发壳:scripts/event_fabric/smoke_task_event.sh:1
  - Layer1 回归已对齐并通过:scripts/ci/event_fabric_layer1.sh:26

  文档体系重构

  - 总入口已收敛到 docs/guides/async_runtime/README.md
  - Task 手册(已补成可操作步骤):docs/guides/async_runtime/task/README.md:6
  - Scheduler 手册(已补成可操作步骤):docs/guides/async_runtime/scheduler/README.md:6
  - Event 联调总手册:docs/guides/async_runtime/event_fabric/integration_playbook.md:91
  - WS 规范文档已对齐 /api/ws:docs/plan/wx/WS-NOTIFY.md:191

  当前结论

  - 这条链路已经不是“概念设计”,而是“可执行、可联调、可回归”的状态。
  - 你现在继续做手工验收是正确阶段。需要的话我下一步可以给你一份“验收打勾清单(按页面+接口+日志)”。
  - 把旧导入改为新包:
      - backend/tests/integration/capability_registry/load/load_test.go:21
      - backend/tests/integration/capability_registry/event_latency_test.go:10
  - 同步修正事件常量引用:
      - backend/tests/integration/capability_registry/event_latency_test.go:87
  - 删除我刚才加的兼容文件:
      - backend/internal/eventbus/topics_compat.go
      - backend/internal/eventbus/subscribers_compat.go
  - 在 backend/internal/app/shared/deps.go:942 保持 retryWorkerFallbackEnabled = true。
  - 删除了 kafka/rabbitmq/nats 分支里把它改成 false 的逻辑(以及对应 degrade 日志)。
  - 结果是:只要配置了 Redis fallback driver,EventFabricRetryWorker.Run 就不会提前退出,delivery.PollRetry 会继续跑。

  关键位置

  - backend/internal/app/shared/deps.go:942
  - backend/internal/app/shared/deps.go:943
  - backend/internal/app/shared/deps.go:954
  - backend/internal/app/shared/deps.go:966

  本地校验

  - 已跑最小编译检查:go test ./internal/app/shared -run TestTaskHistory -count=1(通过)。

  这次改动后,非 Redis 主驱动 + Redis fallback 的场景下,retry 队列不会因 worker 关闭而堆积不分发。
  - 重构为“按步骤操作”结构,先做什么后做什么一眼可见。
    web-admin/app/pages/settings/monitor.vue
  - 状态区语义化:
      - 连接状态:已连接/连接中/未连接/错误
      - 订阅状态:已订阅(绿色)、未订阅(黄色)
  - 连接控制交互优化:
      - 当前只显示可执行主动作(连接或断开)
      - 断开按钮改为红色语义
  - topic 选择改为下拉(USelectMenu),不再要求手输记忆。
  - topic 默认值改为 _topic.system.notification(最符合 Replay/Pipeline 联调观察)。
  - 进入 WebSocket 页签会加载 topic 列表(合并默认 + 后端 topics)。
  - 文案明确了 Replay/Pipeline 推荐订阅 topic 和预期结果。
  - 实时消息预览补了 type/topic/trace_id/payload,便于现场判读。

  你刚才实测结果判断

  - Replay 3 条(pending/running/completed)= 正常
  - Pipeline 1 条通知实体事件 = 正常
  - JWT 主体验证:cache-first + DB-fallback + 回填缓存
  - 主动失效:user/member/tenant 更新或删除后,立即清理对应认证缓存 key

  本次改动

  - 新增:backend/internal/http/auth_subject_validator.go:1
      - 校验 tenant/user/member 状态与归属一致性
      - 缓存 key:
          - auth:user:{user_id}
          - auth:member:{member_id}
          - auth:tenant_uuid:{tenant_uuid}
      - TTL:60s
      - 注册 GORM 回调(update/delete)做缓存主动失效
  - 接入路由:backend/internal/http/router.go:18
      - 在 SetupRouter 注册缓存失效回调
      - 把 JWT 主体验证回调挂入 APIKeyOrJwtMiddleware
      - wscat 成功连接 /api/ws
      - subscribe _topic.template.update 收到 ack
      - 能收到实际事件 payload(含 trace_id)
  - 鉴权与权限模型已对齐
      - ws-bus/register 全面改为 ws-bus/grant
      - grant 只做授权绑定,不创建 topic
      - topic 必须先在 event_topics 存在
      - API Key 权限改为固定动作级(publish/subscribe/replay),不按 topic 自动生 permission
  - 关键行为已修正
      - Profile 权限保存后,自动同步该 Profile 下 active key 的快照(不再强制轮换)
      - 新增同步日志与返回字段:synced_keys/synced_perms
      - API Key 支持“删除”(软删除并从列表隐藏),保留“吊销”
  - 文档已对齐
      - 插件 topic 双层约束已明确:plugin.yaml 声明层 + config/event_fabric.yaml 执行层
      - 明确 topics 创建 与 grant 授权边界
      - wscat 成功连接 /api/ws
      - subscribe _topic.template.update 收到 ack
      - 能收到实际事件 payload(含 trace_id)
  - 鉴权与权限模型已对齐
      - ws-bus/register 全面改为 ws-bus/grant
      - grant 只做授权绑定,不创建 topic
      - topic 必须先在 event_topics 存在
      - API Key 权限改为固定动作级(publish/subscribe/replay),不按 topic 自动生 permission
  - 关键行为已修正
      - Profile 权限保存后,自动同步该 Profile 下 active key 的快照(不再强制轮换)
      - 新增同步日志与返回字段:synced_keys/synced_perms
      - API Key 支持“删除”(软删除并从列表隐藏),保留“吊销”
  - 文档已对齐
      - 插件 topic 双层约束已明确:plugin.yaml 声明层 + config/event_fabric.yaml 执行层
      - 明确 topics 创建 与 grant 授权边界
本轮结果

  - standalone 已通过:/api/ws 订阅 + publish 推送可收到 event。
  - standalone + proxy 已通过:topic 创建、grant、publish 全链路可用。

  核心修复点

  - ws-bus/register 全面收口为 ws-bus/grant。
  - 插件新增 topic 代理入口:POST /api/v1/admin/runtime/internal/event-fabric/topics。
  - 修复上游响应解析:兼容 PowerX code/message/data,不再误判 message=success 为失败。
  - 修复错误透传:保留上游 error 细节,不再只返回泛化 create topic failed。
  - 去掉 proxy 出站 X-PowerX-Tenant 透传,租户统一由 PowerX 凭证解析。
  - 修复 proxy publish 的 TENANT_REQUIRED:proxy 分支直接走 HostClient,不在插件侧强制 tenant。

  文档对齐完成

  - docs/guides/async_runtime/event_fabric/integration_playbook.md
  - docs/guides/async_runtime/websocket/debug_playbook.md
  - 统一口径:grant 只授权不建 topic、topic 真相源是 event_topics、二段校验(topic存在 + 权限存在)。

  当前可执行结论

  - 你现在可以按现有 async_runtime 文档继续联调,不需要再额外传 tenant_uuid 给 proxy 调试接口。
…流,qwen 走 VLM 驱动真实探活。

  - 修复了 Qwen 默认接入地址体验:前端会自动回填 provider 默认 base_url,不再要求手填。
  - 支持了 Qwen 国内/国际双 provider:
      - qwen-intl(默认 dashscope-intl)
      - qwen-cn(默认 dashscope)
        并保留 qwen -> qwen-intl 别名兼容。
  - 统一了运行时驱动映射:AI service 调用 image/vlm/video/tts 时按 provider manifest 的 drivers 路由,避免 provider 别名导致 unknown driver。
  - 优化了测试失败展示:默认显示简洁错误,不再把整段 JSON 原样暴露;新增“查看技术详情”折叠区。
  - 新增管理接口:
      - GET /api/v1/admin/capabilities/sources(source 枚举/别名/默认值)
      - GET /api/v1/admin/gateway/meta(base_url、api_prefix、auth schemes、示例路径)
  - 统一了 platform-capabilities 的分页行为:支持 page/page_size 并返回分页字段。
  - 文档对齐更新:
      - docs/guides/develop/gateway_contract.md(新增,路由+认证契约)
      - docs/guides/develop/api_key_token_playbook.md(补 source 定义、接口选型、新增接口说明)
  - 在 service.go 的 ImageInvoke 中新增分流:
      - 若 resolveProviderDriver(provider, "image") == "qwen",直接走 VLMInvoke
      - 不再进入 imagefactory.NewClient("qwen")

  这样 /ai/image/invoke 使用 qwen-intl/qwen-cn 时不会再报 unknown image provider。

  已验证:

  - go test ./internal/service/ai ./internal/transport/http/openapi/ai ./internal/server/ai/factory/image ./internal/server/ai/factory/vlm ./internal/
    server/ai/drivers/qwen 通过。
  - 租户判定收敛为“只信凭证上下文”:只用 JWT claims / ApiKey 注入的 tenant。
  - 删除 /api/v1/tenant/invocations 对 body tenant_uuid 的 mismatch 拒绝逻辑。
  - 清理生产代码里通过 header/query 注入 tenant 的入口(核心链路):
      - 移除 JWT as_tenant_uuid 代理入口。
      - plugin_release local install 不再读 tenant_uuid/tenantUuid query。
      - admin/integration_gateway(routes + apikey 管理)不再从 body/query 取 tenant,统一从 reqctx 取。
      - admin/dev_hotload list/clear 会话改为只用 reqctx tenant。
      - admin/capability_registry/catalog tenant 过滤改为 reqctx tenant。
      - admin/event_fabric/directory 强制当前 tenant,不再读 query tenant。
      - admin/agent/tenant_handlers 列表接口不再读 query tenant。
      - admin/iam/rbac 的 check 不再支持 query tenant 覆盖。

  关键文件

  - tenant_handler.go
  - jwt.go
  - local_install_handler.go
  - handler.go
  - apikey_handler.go
  - routes.go
  - catalog_handler.go
  - directory_handler.go
  - tenant_handlers.go
  - rbac_handler.go

  验证结果

  - 生产代码扫描:
      - Header.Get/Set(...tenant...):0 命中
      - c.Query("tenant_uuid"/"tenantUuid"/"as_tenant_uuid"):0 命中(剩余仅模型字段字符串,不是取参逻辑)
  - 编译回归通过(受影响包 go test ... -run TestDoesNotExist 全通过)。

  你最新这段日志的结论

  - 后端调用成功:POST /tenant/invocations 200,内部 GET /media/assets 200。
  - “没有订阅者”是事件总线提示,不是业务失败。
  - 插件侧若仍报错,问题应在插件对返回体/日志的判定逻辑,不在这条后端链路。
- 修复了 qwen 图像测试报 unknown image provider:PingImage 现在按 drivers.image 分…
  1. 租户来源彻底收敛

  - 统一只信凭证上下文(JWT claims / ApiKey 注入)。
  - 去掉 /tenant/invocations 对 body tenant_uuid 的 mismatch 拒绝。
  - 清掉生产代码里 tenant header 读取;核心管理/调用链路不再用 query/body 覆盖 tenant。

  2. Gateway 调用标准收敛为单一格式(你定的)

  - model_key 只认 payload.body.model_key
  - env 只认 payload.query.env(/tenant/invocations 场景)
  - 不再依赖 payload.model_key / context.env 作为标准输入

  3. 解决你遇到的两类报错

  - model_key required:原因是网关校验与 body 结构不一致,已改为从 payload.body 取。
  - model_key ... not configured for tenant(直调通、网关不通):原因是 env 口径不一致,已改为网关校验使用 payload.query.env。

  4. 插件侧现状判定

  - 你当前插件请求体(payload.query.env + payload.body.model_key)是正确标准。
  - 仍出现 OPTIONS /api/v1/integration/capabilities/invoke 是前端旧预检路径遗留,不影响主请求到 /tenant/invocations,但建议后续清理。

  5. 文档已对齐

  - api_key_token_playbook.md
  - gateway_contract.md

  都已明确写成同一个标准:

  - payload.query.env
  - payload.body.model_key
  - 禁用旧路径 /integration/capabilities/invoke 及非标准字段来源。
  1. 流式请求缺 model_key 不再静默成功

  - 原来分支会 return result, nil,导致调用“看起来成功但无结果”。
  - 现在改成显式返回错误:model_key required。
  - 文件:invocation_service.go

  2. 测试引用未定义 helper

  - invocation_service_payload_test.go 里调用了不存在的 extractStringFromPayload。
  - 已改成与当前标准一致的 extractStringFromBody,并调整测试语义为“只认 body”。
  - 文件:invocation_service_payload_test.go

  验证情况:

  - 已做调用链编译检查通过:
    go test ./internal/transport/http/openapi/capability_registry -run TestDoesNotExist
  - 不能完整跑 ./internal/service/capability_registry 包测试(沙箱禁止联网拉 miniredis 依赖),所以该包全量测试未完成。
• 本次已完成的调整总结如下:
@Matrix-X Matrix-X merged commit 38378ec into develop Mar 4, 2026
2 checks passed
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bde2a2c30a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


agentAdminGroup.POST("/:id/shares", shareH.CreateShare)
agentAdminGroup.POST("/:uuid/shares", shareH.CreateShare)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 保持分享路由参数名与处理器解析一致

我检查了 backend/internal/transport/http/admin/agent/api.gobackend/internal/transport/http/admin/agent/share_handlers.goCreateShare 处理器只读取 agent_idid 路由参数,但这里把路径改成了 /:uuid/shares,Gin 不会自动把 uuid 映射到前两者,结果 agentIDStr 为空并稳定触发 invalid agent_id,使该接口在所有请求下都无法创建分享记录。

Useful? React with 👍 / 👎.

meta["content_hash"] = ksvc.ContentHash(content)
if err := h.vs.Upsert(c.Request.Context(), spaceID, []vectorstore.VectorRecord{{
ChunkID: chunkUUID,
Embedding: ksvc.HashEmbedding(content, 32),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 按活动索引维度重建编辑后的 chunk 向量

这里把编辑后向量固定写成 HashEmbedding(content, 32),但知识库向量索引维度是可配置/可路由的(默认配置就是 1536,并且会随激活 embedding 模型变化),因此当空间当前索引维度不为 32 时该 Upsert 会因维度不匹配失败并返回 500,导致 chunk 编辑后无法完成索引重建。

Useful? React with 👍 / 👎.

Comment on lines +497 to +499
sourceURI: in.SourceURI,
ingestionProfile: in.IngestionProfile,
processorProfile: in.ProcessorProfile,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 在异步入库管线中透传 docUUID

TriggerAsync 组装 pipelineInput 时没有传入 docUUID,而同步路径 Trigger/TriggerWithDocUnits 已透传该字段;这会让带 docUuid 的异步入库请求丢失文档绑定,chunk 元数据中的 doc_uuid 退回为按 sourceURI 推导值,在同源多文档场景下会造成追踪和关联错误。

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant