diff --git a/AGENTS.md b/AGENTS.md index 6ff8a7ea..a46bd5e0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -48,7 +48,7 @@ ## 当前业务边界 - 管理端业务路由集中在 `frontend/src/router/index.ts`,覆盖首页、AI 面试、训练运营、问题榜、案例、知识空间、SOP、资料处理、系统配置、组织权限和成长激励;侧栏过滤在 `frontend/src/layout/components/Sidebar/index.vue`,不要恢复若依默认全量菜单。 -- 用户侧只改 `mobile-uni/src/pages/*`;员工、候选人、主管首页分别为 `/pages/user/today/index`、`/pages/candidate/index/index`、`/pages/supervisor/index/index`,旧 `/h5/user|candidate|supervisor|employee|admin` 只做兼容重定向。底栏固定「今日/练/问/我」;问师傅文字和现场附件查询复用 `/api/knowledge/query`、`/api/knowledge/query-media`,内部登录端可带 `conversationId/contextVersion` 使用 30 分钟、最近 6 轮的短期会话,原文件/视频只通过 `/api/knowledge/resources/{attachmentId}/content` 重新鉴权交付;总结卡复用 `/api/knowledge/summary-card`,失败不兜假数据。显式“记一下/帮我记/保存一下”复用同一 query 返回确认卡,确认后按 `PRIVATE/COMPANY` 写 `aihr_assistant_capture`;COMPANY 只表示 `PENDING` 待流转,不得冒充已派单或已送达。外部知识 API 保持无状态。 +- 用户侧只改 `mobile-uni/src/pages/*`,旧 `/h5/user|candidate|supervisor|employee|admin` 只做兼容重定向,底栏固定「今日/练/问/我」。“问”统一调用 `/api/aihr/agent/messages|messages/media`,服务端规划意图并按固定策略选择既有工具,客户端不得提交 `toolCode`;旧知识查询仅作底层/兼容。短会话、资源重新鉴权、全网外发同意和不透明 `draftId` 确认均沿用 `docs/API_INTEGRATION.md` 契约;COMPANY 只表示 `PENDING`,`aihr_agent_run` 不保存问题、答案或附件。 - 大喇叭详情追问只让客户端传 `broadcastMessageId`,消息正文、附件文本、租户和身份均由服务端重新校验并加载;撤回、跨租户或非在职员工不得继续使用消息上下文。消息/知识回答不得把通用建议包装成当前员工的真实待办,强行动入口只能来自服务端已授权的真实任务数据。 - 术语和数据边界:工作助手承载日常事实与确认式记忆;现有 `/pages/user/report/index`、`/api/aihr/work-report/**` 和 `aihr_work_report` 只承载 CASE/VIDEO/SOP/KNOWLEDGE 四类投稿审核,产品名为“成果投稿”;“今日工作成果”按员工 + 项目 + 自然日从已确认记录确定性聚合,员工页为 `/pages/user/work-results/index`,主管页为 `/pages/supervisor/work-results/index`,默认当日但允许查看历史日期且不得选择未来日期。不要把三条链路合表或自动互写。多项目交互只让用户按项目名称选择,内部项目编码必须由服务端按当前身份复核,不让用户输入编码。 - 不要把三端概括成全模态:员工对练/每日题和问师傅支持文字/语音,问师傅图片/视频只用于本次分析,案例传音频;候选面试支持文字/语音,资料可传文档/图片但图片不参与评分;主管写文字复盘/指派并回听录音。员工对练图像/视频情境、服务录像回放和方言正式验收仍未完成;语音继续复用 `services/speech.ts` 与 `/api/ai/asr`。 @@ -70,22 +70,10 @@ - 向量库状态接口是 `GET /api/knowledge/doc/vector-index-status`,重建接口是 `POST /api/knowledge/doc/rebuild-vector-index`;外部 embedding 成功但 Qdrant collection 维度不一致时不要静默降级,走状态提示和重建。 - 资料处理接口是 `GET /api/knowledge/processing/overview`,直接聚合 `aihr_knowledge_attach`、`aihr_knowledge_fragment` 和 `sys_oss.ext1`;页面只保留“批量导入”,走 `POST /api/knowledge/doc/upload-async`,不要恢复“选择目录”“服务端导入”或目录导入任务面板。`POST /api/knowledge/doc/import-local`、`POST /api/knowledge/doc/import-local-task`、`GET /api/knowledge/doc/import-tasks` 和 `POST /api/knowledge/doc/import-tasks/{id}/cancel` 仅保留为后端运维/调试接口;目录只能是 `aihr.import.root` 下的相对路径。 - `ruoyi-ai` 只按 `docs/RUOYI_AI_INCREMENTAL_MIGRATION.md` 分片迁移到 `ruoyi-aihr`,不要整包搬 `ruoyi-chat`;已落地页面保持真实接口/模型优先与 seed fallback,不能退回静态壳。 -- 本项目 AI 表前缀用 `aihr_*`:知识库是 `aihr_knowledge_info/attach/fragment`,问师傅短期会话是 `aihr_knowledge_conversation`,确认式采集是 `aihr_memory_candidate` / `aihr_assistant_capture`(旧项目记录兼容 `aihr_service_memory/version`),上传队列是 `aihr_knowledge_upload_item`,导入任务是 `aihr_knowledge_import_task`,模型配置是 `aihr_model_provider/config`,移动端训练记录是 `aihr_practice_session`,候选人补充资料是 `aihr_candidate_material`,组织人员快照是 `aihr_org_snapshot`(本地 reset 有 Demo seed;生产/试点从 `docs/open-org-sync-api-design-v1.md` 对应开放组织系统同步,入口 `POST /api/aihr/org/sync`)。 +- 自有 AI 表统一用 `aihr_*`;知识、短会话、Agent 审计、确认式采集、训练和组织快照等表的完整契约以 `docs/API_INTEGRATION.md` 和生产迁移 Runbook 为准。`aihr_org_snapshot` 本地 reset 可带 Demo seed,生产/试点只从开放组织系统经 `POST /api/aihr/org/sync` 同步。 ## 业务文档 -- 总入口:`README.md` -- 文档索引:`docs/README.md` -- Figma 实现与逐页视觉验收以 `docs/FIGMA_DESIGN_INVENTORY.md` 为准;复用既有变量/组件并人工查看当次截图,结构、视觉、功能、发布和生产验证分别记录。 -- MVP 演示与验收:`docs/DEMO_ACCEPTANCE.md` -- 阶段交付归档:`docs/archive/2026-07-mvp-delivery/` -- 分阶段总纲:`docs/银城员工端APP分阶段实施总纲.md` -- AI 陪练二期推进(阶段一执行):`docs/AI陪练二期开发推进计划.md` -- 数字师傅产品定案(2026-07-08 学练问报/问题榜/学分):`docs/20260708/数字师傅学练问报整合方案.md` -- 工作助手后续施工顺序:`docs/工作助手与今日工作成果迭代计划-20260721.md` -- 产品功能优先级与本轮增量:`docs/银城帮道产品功能优先级与实施计划-20260721.md` -- AI 陪练缺口修订:`docs/AI陪练功能优化与缺口分析(修订).md` -- 后端 API 对接:`docs/API_INTEGRATION.md` -- 对外会议版口径:`docs/AI人力资源系统项目规划方案与AI接口说明.md` -- 业务需求:`docs/物业AI人力资源系统业务需求文档BRD.md` -- 开发规格:`docs/物业AI人力资源系统开发规格TechSpec.md` +- 总入口和索引是 `README.md`、`docs/README.md`;后者定义事实源优先级。 +- 实现与契约看 `docs/BRD_IMPLEMENTATION_AUDIT.md`、生产 Runbook、`docs/API_INTEGRATION.md` 和 BRD/TechSpec。 +- Figma 实现与验收看 `docs/FIGMA_DESIGN_INVENTORY.md`,分开记录实现、视觉、发布和生产验证。 diff --git a/README.md b/README.md index 4edbe9bc..3e564540 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - 品牌:前端标题为“物业AI人力资源系统”,侧栏 logo 使用银城物业图标。 - 基础链路:租户列表、验证码、`000000 / admin / admin123` 加密登录已验证。 - 管理端:除 AI 面试、训练、案例、SOP 和资料处理外,已包含常见难题、问题榜运营、知识空间、全网 AI 配置、组织权限和成长激励。 -- 用户侧:`mobile-uni/` 承载员工、候选人和主管三端;已接手机号登录、问师傅文字/语音/附件与播报、30 分钟短期多轮追问、原文件/视频受控交付,以及“记一下”确认卡、仅自己保存/提交公司待流转和权限化召回;同时包含三级字号、训练/题目反馈、开放问题榜与积分、岗位考试、案例、候选面试/资料、主管复盘/派发及学员模式。旧 `mobile/` 只用于历史回溯。 +- 用户侧:`mobile-uni/` 承载员工、候选人和主管三端;“问”已在本地改为数字师傅 Agent,文字、ASR 转写和图片/视频统一先做意图规划,再按服务端权限调用知识、训练、待办、记忆、媒体或全网工具,寒暄和不完整表达不再机械落入 RAG。短期多轮、受控原文件/视频、确认式“记一下”和 PRIVATE/COMPANY 边界继续复用既有领域能力;该 Agent 增量尚未部署或完成真机正式账号验收。旧 `mobile/` 只用于历史回溯。 - 英雄路径:AI 面试(真模型出题/评分)、三角色对练(真 LLM 客户回复+评分,asr/tts 配置后支持语音)、案例沉淀(真实语音上传+ASR 转写+模型整理)均为真模型优先、未配置或失败回退本地兜底;SOP 知识库已接中文关键词 + MySQL Fulltext + Qdrant 混合召回 + rerank 重排,支持 txt/md/PDF/Word/Excel/PPT/图片/视频上传解析入库(图片走 vision OCR,视频走 ffmpeg 抽音轨转写+关键帧描述),资料处理中心支持 ZIP 异步展开后逐文件入队;模型配置页可查看向量库维度/点数并一键重建。 - 资料处理:已新增解析任务状态页,按 `aihr_knowledge_attach` 和 `aihr_knowledge_fragment` 展示等待解析、解析中、已完成、失败、片段数和向量化状态;任务列表按当前筛选结果前端分页(10/20/50 条,筛选或刷新回到第一页)。页面只保留“批量导入”,通过异步队列处理多文件或 ZIP,不提供浏览器目录选择和服务端目录导入入口。后端目录导入接口仅保留为运维/调试能力。 - 组织人员:`aihr_org_snapshot` 本地 reset 保留演示 seed;生产通过 `POST /api/aihr/org/sync` 同步外部组织。最近记录的生产快照为 3417 人、2938 人在职、3392 个手机号映射、175 名在职主管和 20 名项目经理;人数属于时点事实,发布或验收前应重新查询。 @@ -54,6 +54,8 @@ | [原生 App 真机验收](docs/MOBILE_APP_DEVICE_ACCEPTANCE.md) | Android/iOS 自定义基座或签名包的验收清单 | | [MVP 演示与验收清单](docs/DEMO_ACCEPTANCE.md) | MVP 演示脚本、录屏兜底和验收口径 | | [后端 API 对接指南](docs/API_INTEGRATION.md) | 后端模块落点、正式试点 CSV、移动端训练/复盘、候选资料上传/审核和 SOP 上传解析接口 | +| [数字师傅 Agent 总体设计](docs/superpowers/specs/2026-07-24-digital-master-agent-design.md) | “问”模块的最终产品边界、意图/工具/权限/确认/审计契约和当前实现差距 | +| [数字师傅 Agent 实施计划](docs/superpowers/plans/2026-07-24-digital-master-agent.md) | 当前本地实现、自动化与浏览器验证记录,以及未部署、未完成的正式验收项 | | [问师傅多轮会话与原始资料交付设计](docs/20260718/问师傅多轮会话与原始资料交付设计.md) | 已实现的短期会话、指代改写、意图路由、原文件/视频安全交付及分层验收记录 | | [工作助手与今日工作成果迭代计划](docs/工作助手与今日工作成果迭代计划-20260721.md) | 项目名称选择、日常采集、来源追溯、今日成果、主管视图、成果投稿和外部流转的实施顺序;含当前本地实现、390×844 证据、权威高保真路径和剩余生产边界 | | [银城帮道产品功能优先级与实施计划](docs/银城帮道产品功能优先级与实施计划-20260721.md) | 《银城帮道介绍》十项能力的事实校正、P0–P3 优先级、明确不做项和本轮实施证据 | diff --git a/docs/20260718/问师傅多轮会话与原始资料交付设计.md b/docs/20260718/问师傅多轮会话与原始资料交付设计.md index d2890651..8ee17405 100644 --- a/docs/20260718/问师傅多轮会话与原始资料交付设计.md +++ b/docs/20260718/问师傅多轮会话与原始资料交付设计.md @@ -2,6 +2,8 @@ > 状态:代码、自动化、本地真实 HTTP、本地 390×844 移动端交互和生产基础发布验证已完成;生产正式账号多轮、真机文件权限与正式业务验收仍须分别记录。 > +> 当前边界:移动端“问”的主入口已在本地切换为 `/api/aihr/agent/**`;本文只维护 Agent 底层复用的知识短会话、指代改写和受控资源交付契约,不能再作为通用意图路由设计。 +> > 目标:让“问·数字师傅”能理解本次连续对话中的指代,并在当前授权范围内交付命中的原文件或操作视频。 ## 1. 当前事实与问题 diff --git a/docs/API_INTEGRATION.md b/docs/API_INTEGRATION.md index d06163bd..51e279ef 100644 --- a/docs/API_INTEGRATION.md +++ b/docs/API_INTEGRATION.md @@ -32,6 +32,42 @@ | 开放问题榜与积分 | 移动端 `/api/aihr/community/questions`、`questions/{id}`、`questions/{id}/answers`、`questions/{id}/best-answer`、`points/me`;后台 `/api/aihr/question-admin/**`、`/api/aihr/incentive-admin/rules` | 问题、答案、最佳答案和奖励全程按租户/身份授权;重复选优不重复入账。奖励只有积分与学习学分,不代表现金或提现 | | 全网 AI | 员工 `GET /api/aihr/web-ai/capabilities`、`POST /api/aihr/web-ai/query`;提供方管理 `/api/aihr/web-search/providers/**` | 与企业知识问答分入口和来源。仅接受公网 HTTPS 提供方,地址或密钥变更后必须重新连接测试;未配置/未启用时返回明确不可用,不生成假答案 | +## 数字师傅 Agent 接入 + +移动端“问”只调用 Agent,旧 `/api/knowledge/query`、`query-media` 和 `/api/aihr/web-ai/**` 仅作底层/兼容能力。示例中的 token、会话、项目和草稿号均为占位值: + +```bash +API_BASE=${API_BASE:-https://wygj-api.localhost} +TOKEN='REPLACE_WITH_MOBILE_ACCESS_TOKEN' + +curl -fsS "$API_BASE/api/aihr/agent/messages" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"question":"我今天有什么训练任务","conversationId":"","contextVersion":1,"projectCode":"","externalConsent":false}' + +curl -fsS "$API_BASE/api/aihr/agent/messages/media" \ + -H "Authorization: Bearer $TOKEN" \ + -F 'file=@/path/to/image.jpg' \ + -F 'question=图中是什么宠物' \ + -F 'externalConsent=false' +``` + +文字问题去空白后必须为 1–1000 字;媒体接口的 `question` 为空时使用“请分析附件内容”。请求不接受身份、角色、`toolCode`、知识空间 ID、SQL 或任意 URL。响应继续使用若依信封,`data.status` 只会是 `COMPLETED/NEEDS_INPUT/NEEDS_CONFIRMATION/NO_EVIDENCE/FORBIDDEN/UNAVAILABLE/FAILED`,按钮分别读取 `actionDraft/clarification/resources/nextActions`,不得解析 `answer` 猜状态。 + +全网意图在 `externalConsent=false` 时以业务成功响应返回 `NEEDS_INPUT`,用户同意后原请求携带 `externalConsent=true` 重试。确认式记忆先取得 `actionDraft.draftId`,再提交卡片中可编辑的完整 `draft`: + +```bash +curl -fsS "$API_BASE/api/aihr/agent/actions//confirm" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"expectedVersion":1,"idempotencyKey":"","draft":{"category":"FOLLOW_UP","title":"业主回访","summary":"3栋1201待回访","occurredAt":"2026-07-24T09:00:00+08:00"},"enableReminder":false,"saveScope":"PRIVATE"}' + +curl -fsS -X POST "$API_BASE/api/aihr/agent/actions//dismiss" \ + -H "Authorization: Bearer $TOKEN" +``` + +校验失败返回业务码 `400`;角色/工具/项目/知识空间越权返回 `403`;会话版本、候选版本或幂等冲突返回 `409`;草稿票据 30 分钟过期后必须重新生成。Agent 审计只记录最小路由元数据,不保存上述问题、回答或附件。 + ## 后端落点 - 业务模块:`backend/ruoyi-modules/ruoyi-aihr` diff --git a/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md b/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md index f29a9f34..ec410bf8 100644 --- a/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md +++ b/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md @@ -33,6 +33,8 @@ - 本次完整备份位于 `/opt/wygj/backups/aihr-full-20260723-094600-f023417a`,包含数据库、旧静态资源和旧 JAR; - 发布后仅完成公开接口和未登录 H5 页面的基础检查。正式认证账号的“管理发布—员工阅读—消息追问”闭环、真机媒体及完整个人资料能力仍未作为生产验收完成。 +2026-07-24 的数字师傅 Agent、`aihr_agent_run` 和对应移动端改造当前仅是本地发布候选;下文列入迁移顺序是为了下一次完整包发布,不代表生产已存在或已验收。 + ## 发布前置条件 1. 确认发布窗口、DB 备份和回滚负责人;迁移脚本包含 `ALTER TABLE`,不能在无备份状态执行。 @@ -103,7 +105,7 @@ WHERE table_schema = DATABASE() 'aihr_practice_audio', 'aihr_practice_audio_upload', 'aihr_practice_calibration', 'aihr_practice_help_event', 'aihr_knowledge_gap', 'aihr_knowledge_answer_feedback', 'aihr_knowledge_space_grant', 'aihr_knowledge_app', 'aihr_knowledge_app_space', 'aihr_knowledge_category', - 'aihr_knowledge_query_log', 'aihr_knowledge_admin_audit', 'aihr_knowledge_conversation', + 'aihr_knowledge_query_log', 'aihr_knowledge_admin_audit', 'aihr_knowledge_conversation', 'aihr_agent_run', 'aihr_practice_question_feedback', 'aihr_onboard_exam', 'aihr_onboard_exam_target', 'aihr_onboard_exam_question', 'aihr_onboard_exam_attempt', 'aihr_onboard_exam_answer', @@ -149,6 +151,7 @@ WHERE table_schema = DATABASE() OR (table_name = 'aihr_memory_candidate' AND column_name IN ('work_date', 'source_snapshot_json')) OR (table_name = 'aihr_assistant_capture' AND column_name IN ('work_date', 'source_snapshot_json', 'business_status')) OR (table_name = 'aihr_knowledge_conversation' AND column_name IN ('project_code', 'broadcast_message_id')) + OR (table_name = 'aihr_agent_run' AND column_name IN ('run_id', 'tenant_id', 'client_key', 'user_id', 'conversation_id', 'context_version', 'intent', 'tool', 'status', 'source_type', 'duration_ms', 'error_code', 'result_ref', 'create_time')) OR (table_name = 'aihr_daily_work_result' AND column_name = 'content_hash') OR (table_name = 'aihr_web_search_provider' AND column_name IN ('agent_id', 'agent_version')) ) @@ -207,7 +210,7 @@ GROUP BY d.dimension_code ORDER BY d.dimension_code; ``` -预期是三张场景/Rubric 表、岗位题库、训练反馈表与训练求助事件表、五张考试表、三张全网检索表、问题榜/激励六张表、三张证据表、知识平台治理表和空间内分类表、三张候选人/面试表、四张岗位/SOP/任务/资格契约表、平台组织目录与租户绑定表、四张记忆表、采集状态历史表、每日成果表、原工作上报表、三张大喇叭消息/阅读/v1快照表、两张 M1 定向规则/对象快照表及十张独立个人资料表均存在。`57/57` 只代表当时较窄的发布清单;后续线上只读复核已确认 M1 的目标表和必读字段,但当前线上不存在 `aihr_practice_help_event`,因此不得把包含该表的 M2 完整清单写成已发布。工作上报幂等字段为 `2/2`,大喇叭发布/撤回审计字段为 `3/3`,其发布幂等索引为 `0 | tenant_id,published_by,publish_request_key | 0`,M1 必读/目标载荷字段契约为 `2/2`,两张目标表字段契约为 `16/16`,定向规则与对象快照唯一约束分别为 `4/4`、`3/3`,公司消息追问会话字段为 `1/1`,工作助手新增字段为 `8/8`,会话证据字段为 `8/8`,专项批量/内容快照字段为 `8/8`,候选资料审核字段为 `2/2`,面试复核字段为 `6/6`,字段查询覆盖所有列,内置 Prompt 数量为 `6`。私有资料配置只应返回 `ruoyi-personal`、私有策略和 `configured` 状态,不显示访问密钥。五个岗位各有 `20` 个场景,`daily/special` 各有 `100` 道题;其中 `14` 个未完成正式审核的高风险场景及其 `28` 道题保持禁用。岗位/SOP/任务/资格表及新记忆表为空是允许的;这只证明 schema/seed 迁移完成,不证明已有员工确认过记忆、完整个人知识库或严格试点完成。 +预期是三张场景/Rubric 表、岗位题库、训练反馈表与训练求助事件表、五张考试表、三张全网检索表、问题榜/激励六张表、三张证据表、知识平台治理表和空间内分类表、三张候选人/面试表、四张岗位/SOP/任务/资格契约表、平台组织目录与租户绑定表、四张记忆表、采集状态历史表、每日成果表、原工作上报表、三张大喇叭消息/阅读/v1快照表、两张 M1 定向规则/对象快照表、`aihr_agent_run` 及十张独立个人资料表均存在。`57/57` 只代表当时较窄的发布清单;后续线上只读复核已确认 M1 的目标表和必读字段,但当前线上不存在 `aihr_practice_help_event`,Agent 迁移也仍是本地发布候选,因此不得把包含它们的完整清单写成已发布。Agent 审计字段应为 `14/14`,且表中不得出现问题、答案或附件列。工作上报幂等字段为 `2/2`,大喇叭发布/撤回审计字段为 `3/3`,其发布幂等索引为 `0 | tenant_id,published_by,publish_request_key | 0`,M1 必读/目标载荷字段契约为 `2/2`,两张目标表字段契约为 `16/16`,定向规则与对象快照唯一约束分别为 `4/4`、`3/3`,公司消息追问会话字段为 `1/1`,工作助手新增字段为 `8/8`,会话证据字段为 `8/8`,专项批量/内容快照字段为 `8/8`,候选资料审核字段为 `2/2`,面试复核字段为 `6/6`,字段查询覆盖所有列,内置 Prompt 数量为 `6`。私有资料配置只应返回 `ruoyi-personal`、私有策略和 `configured` 状态,不显示访问密钥。五个岗位各有 `20` 个场景,`daily/special` 各有 `100` 道题;其中 `14` 个未完成正式审核的高风险场景及其 `28` 道题保持禁用。岗位/SOP/任务/资格表及新记忆表为空是允许的;这只证明 schema/seed 迁移完成,不证明已有员工确认过记忆、完整个人知识库或严格试点完成。 ## 迁移后应用回归 @@ -218,8 +221,9 @@ ORDER BY d.dimension_code; 5. 在“今日工作成果”按员工 + 项目 + 日期重复生成两次,内容不变时版本哈希必须一致;员工访问团队结果、主管访问非授权项目必须被拒绝。生产无主管正式测试账号时必须明确记录未验收,不以本地 seed 代替。 6. 用员工测试账号进入“成果投稿”,确认其仍只承载优秀案例、操作视频、完整 SOP 和有用知识,不回退为日常事实表单。重复提交同一 `request_key` 只有一条 `PENDING` 记录;普通员工审核仍为 `403`,审核通过不自动写入案例、知识或积分表。 7. 用 `superadmin` 或 `hr_operator` 在当前租户发布同一 `requestId` 两次:同内容必须只生成一条消息和一个 v1 快照,改动正文后必须返回 `409`。撤回时提交非空原因,员工端随即不可见;重复撤回不得改写首个撤回人、时间或原因。再确认管理列表不跨租户返回消息。 -8. 完整包发布后运行 `RELEASE_VERIFY_REMOTE_MATCH=true RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true ./scripts/release-preflight.sh`;必须同时获得线上资源、AIHR 模块和 schema 成功结果。该检查不替代第 7 项的认证态业务闭环。 -9. 迁移完成后再按同一正式时间窗运行: +8. 用正式移动端员工账号验证数字师傅 Agent:寒暄不得调用 RAG;本人待办/训练显示实时来源;普通图片不要求知识空间;现场制度问题只在授权空间补充 SOP;全网查询必须先返回同意卡;“记一下”确认前不落库。再检查 `aihr_agent_run` 只有主体、意图、工具、状态、来源和耗时等元数据,没有问题、答案或附件。生产无对应角色、媒体或撤权样本时必须记录未验收。 +9. 完整包发布后运行 `RELEASE_VERIFY_REMOTE_MATCH=true RELEASE_VERIFY_REMOTE_BACKEND=true RELEASE_VERIFY_REMOTE_SCHEMA=true ./scripts/release-preflight.sh`;必须同时获得线上资源、AIHR 模块和 schema 成功结果。该检查不替代第 7、8 项的认证态业务闭环。 +10. 迁移完成后再按同一正式时间窗运行: ```bash AIHR_PILOT_TENANT_ID=000000 \ diff --git a/docs/KNOWLEDGE_PLATFORM_RUNBOOK.md b/docs/KNOWLEDGE_PLATFORM_RUNBOOK.md index 0b4637c1..c8bd6db0 100644 --- a/docs/KNOWLEDGE_PLATFORM_RUNBOOK.md +++ b/docs/KNOWLEDGE_PLATFORM_RUNBOOK.md @@ -136,7 +136,7 @@ where a.id is null and o.ext1 in ('aihr-knowledge','aihr-knowledge-staging'); ## 6. 查询、日志与限流观察 -内部统一入口为 `POST /api/knowledge/query`,内部移动端可带 `conversationId/contextVersion` 启用最近 6 轮、30 分钟不活跃过期的短期会话;外部入口 `POST /api/open/knowledge/query` 始终无状态。内部原文件/视频通过 `GET /api/knowledge/resources/{attachmentId}/content` 在下载时重新鉴权。外部请求使用 `Authorization: Bearer `。查询日志只保存问题哈希、有效空间、来源类型、状态、耗时和提示版本,不保存完整问题或令牌。 +知识底层内部入口为 `POST /api/knowledge/query`,移动端“问”的规范入口是 `/api/aihr/agent/**`,仅在 Agent 识别为知识/资源意图后调用该层。知识查询可带 `conversationId/contextVersion` 启用最近 6 轮、30 分钟不活跃过期的短期会话;外部入口 `POST /api/open/knowledge/query` 始终无状态。内部原文件/视频通过 `GET /api/knowledge/resources/{attachmentId}/content` 在下载时重新鉴权。外部请求使用 `Authorization: Bearer `。查询日志只保存问题哈希、有效空间、来源类型、状态、耗时和提示版本,不保存完整问题或令牌。 `aihr_knowledge_conversation` 只保存脱敏截断后的短期上下文,过期记录由查询流量每 5 分钟惰性清理最多 500 条。可只读观察积压: diff --git a/docs/README.md b/docs/README.md index 1a6203cf..1c9782b9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,7 +11,7 @@ 3. 专项 TechSpec 细化单个领域;实施计划可记录本地实现与验证,但部署和生产状态仍以审查文档、接口事实和真实环境证据为准。 4. `prototypes/` 只作视觉回归基准;会议纪要、历史 Prompt、`legacy/` 与 `archive/` 只作需求来源和追溯材料。 -工作助手相关术语、实施状态与文档关系集中在[《工作助手与今日工作成果迭代计划》](工作助手与今日工作成果迭代计划-20260721.md);当前产品优先级与本轮增量见[《银城帮道产品功能优先级与实施计划》](银城帮道产品功能优先级与实施计划-20260721.md),大喇叭与消息追问的实际交付范围见[《银城大喇叭与问模块纠偏增量方案》](银城大喇叭与问模块纠偏增量方案-20260722.md)。不得把本地验证外推为完整个人知识空间、完整大喇叭运营能力或外部流转已经实现。 +“问”模块的最终 Agent 边界见[《数字师傅工作 Agent 总体设计》](superpowers/specs/2026-07-24-digital-master-agent-design.md),本地实施与验证进度见[《实施计划》](superpowers/plans/2026-07-24-digital-master-agent.md);工作助手相关术语和领域数据关系见[《工作助手与今日工作成果迭代计划》](工作助手与今日工作成果迭代计划-20260721.md)。不得把本地验证外推为已部署 Agent、完整个人知识空间、完整大喇叭运营能力或外部流转已经实现。 ## 当前项目文档 @@ -26,8 +26,10 @@ | [FIGMA_ONLINE_DELTA.md](FIGMA_ONLINE_DELTA.md) | Figma 目标与线上 H5 实测差异矩阵、当前实施边界和验收口径 | | [FIGMA需求覆盖与版本偏差审计-20260717.md](FIGMA需求覆盖与版本偏差审计-20260717.md) | 旧版功能、已确认需求、Figma 实际画板与当前实现的四方对照,以及防止遗漏旧功能和误拉后续阶段的事实源规则 | | [DEMO_ACCEPTANCE.md](DEMO_ACCEPTANCE.md) | 一期 MVP 演示脚本、录屏兜底、MVP 演示流验收清单 | -| [API_INTEGRATION.md](API_INTEGRATION.md) | 后端 API 对接顺序、正式试点 CSV、移动端训练记录/复盘详情、候选资料上传/审核、SOP 上传解析接口 | -| [20260718/问师傅多轮会话与原始资料交付设计.md](20260718/问师傅多轮会话与原始资料交付设计.md) | 问师傅短期多轮问答、指代改写、意图路由和受控原文件/视频交付的实现与验收记录 | +| [API_INTEGRATION.md](API_INTEGRATION.md) | 后端 API 对接顺序、数字师傅 Agent、正式试点 CSV、移动端训练/复盘、候选资料和 SOP 接口 | +| [superpowers/specs/2026-07-24-digital-master-agent-design.md](superpowers/specs/2026-07-24-digital-master-agent-design.md) | “问”模块最终 Agent 产品/架构边界,以及当前已实现与后续工具范围 | +| [superpowers/plans/2026-07-24-digital-master-agent.md](superpowers/plans/2026-07-24-digital-master-agent.md) | Agent 本地实施、自动化/H5/浏览器验证记录和剩余部署/正式验收边界 | +| [20260718/问师傅多轮会话与原始资料交付设计.md](20260718/问师傅多轮会话与原始资料交付设计.md) | Agent 底层复用的知识短会话、指代改写和受控原文件/视频交付契约 | | [KNOWLEDGE_PLATFORM_RUNBOOK.md](KNOWLEDGE_PLATFORM_RUNBOOK.md) | 银城/美途知识空间初始化、授权、令牌、内容迁移、监控验证和安全回滚手册 | | [RUOYI_AI_INCREMENTAL_MIGRATION.md](RUOYI_AI_INCREMENTAL_MIGRATION.md) | 从 `ageerle/ruoyi-ai` 分片迁移知识库、模型能力、文档解析、Qdrant/RAG 和 chat 的执行边界 | | [superpowers/specs/2026-07-16-multi-tenant-knowledge-platform-design.md](superpowers/specs/2026-07-16-multi-tenant-knowledge-platform-design.md) | 银城/美途独立租户、多知识空间、多调用应用统一问答、授权交集、受控数据工具和安全验收的完整需求方案 | @@ -50,7 +52,7 @@ | [BRD_IMPLEMENTATION_AUDIT.md](BRD_IMPLEMENTATION_AUDIT.md) | 当前生产基线、三端输入/BRD 匹配、客户反馈完成分层和正式试点剩余硬门槛;旧发布流水从当前真相源移除 | | [BRD_PRODUCTION_MIGRATION_RUNBOOK.md](BRD_PRODUCTION_MIGRATION_RUNBOOK.md) | AIHR BRD 生产 schema/内置内容迁移顺序、57 项结构核验、私有个人资料存储配置和发布后回归口径 | | [20260708/uni-app用户侧前端重建计划.md](20260708/uni-app用户侧前端重建计划.md) | `mobile-uni/` 重建阶段留档;当前完成状态以 BRD 审查和版本功能对比为准 | -| [20260708/数字师傅学练问报整合方案.md](20260708/数字师傅学练问报整合方案.md) | 产品定义(学练问报+问题榜+学分晋升+个人 AI 助理)、工作上报微信式语音交互定案、半年会发布会方案分层及客户需求逐项处置对照 | +| [20260708/数字师傅学练问报整合方案.md](20260708/数字师傅学练问报整合方案.md) | 产品定义(学练问报+问题榜+学分晋升+个人 AI 助理)及 v1.8 “问”模块 Agent 关联与实施边界 | | [20260708/发布会演示候选题单.md](20260708/发布会演示候选题单.md) | 2026-07-08 发布会演示候选题单,作为产品讨论留档,不作为阶段一开发入口 | | [基于AI的银城员工端APP项目立项与开发规划会议-2026年07月07日-来自【Get 笔记】.md](基于AI的银城员工端APP项目立项与开发规划会议-2026年07月07日-来自【Get%20笔记】.md) | 2026-07-07 立项会纪要原文(总纲的输入源,只作留档) | | [20260708/企业内部AI培训学习APP产品需求与发布会内容讨论(纪要)](20260708/) | 2026-07-08 产品讨论纪要原文及客户"第三版"docx(整合方案的输入源,只作留档) | diff --git a/docs/superpowers/plans/2026-07-24-digital-master-agent.md b/docs/superpowers/plans/2026-07-24-digital-master-agent.md index c7750505..5725a3bc 100644 --- a/docs/superpowers/plans/2026-07-24-digital-master-agent.md +++ b/docs/superpowers/plans/2026-07-24-digital-master-agent.md @@ -8,6 +8,8 @@ **Tech Stack:** Java 17、Spring Boot、Sa-Token、JdbcTemplate、Jackson、JUnit 5/Mockito、uni-app Vue 3/TypeScript、Node test、MySQL 8。 +**实施状态(2026-07-24):** Tasks 1–8 及 Task 9 的自动化、H5 构建和当前事实文档已完成;后端相关回归 91/91、移动端 Agent 契约 3/3。390×844 浏览器已验证寒暄、训练实时来源、全网同意和普通媒体分析;确认式写入、现场风险图 + SOP、旧资源撤权,以及主管/候选人入口仍未完成正式账号/真机浏览器验收。本分支尚未部署或生产验证。 + --- ## Scope split @@ -21,7 +23,7 @@ - Create: `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentPlanner.java` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentPlannerTest.java` -- [ ] **Step 1: Write failing planner tests** +- [x] **Step 1: Write failing planner tests** Cover exact routes: @@ -35,7 +37,7 @@ assertEquals(Intent.MEDIA_UNDERSTANDING, planner.plan("图中是什么宠物", t assertEquals(Intent.KNOWLEDGE_QA, planner.plan("装修人员怎么进场", false).intent()); ``` -- [ ] **Step 2: Run the focused test and verify RED** +- [x] **Step 2: Run the focused test and verify RED** Run: @@ -47,7 +49,7 @@ timeout 120s mvn -pl ruoyi-modules/ruoyi-aihr -am \ Expected: compilation failure because Agent contract and planner do not exist. -- [ ] **Step 3: Add the minimal typed contract** +- [x] **Step 3: Add the minimal typed contract** `AihrAgentDto` defines: @@ -76,11 +78,11 @@ record AgentPlan( Add request/response records matching the approved design. Requests accept question, conversation/version, project, broadcast ID and explicit external consent; they do not accept identity, role or tool name. -- [ ] **Step 4: Implement deterministic safe routing, then optional model refinement** +- [x] **Step 4: Implement deterministic safe routing, then optional model refinement** Known high-confidence intents route deterministically. Model output is parsed only when it matches known enums, contains at most one tool and does not supply identity/project IDs. Invalid or unavailable model output returns deterministic `CLARIFY`, never default RAG. -- [ ] **Step 5: Run planner tests and commit** +- [x] **Step 5: Run planner tests and commit** Expected: all `AihrAgentPlannerTest` tests pass. @@ -96,7 +98,7 @@ git commit -m "feat(agent): add conservative intent planner" - Create: `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentPolicy.java` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentPolicyTest.java` -- [ ] **Step 1: Write failing policy tests** +- [x] **Step 1: Write failing policy tests** Required assertions: @@ -108,15 +110,15 @@ assertThrows(ServiceException.class, () -> policy.authorize(candidate, plan(MY_C assertThrows(ServiceException.class, () -> policy.authorize(employee, forgedUnknownToolPlan)); ``` -- [ ] **Step 2: Verify RED** +- [x] **Step 2: Verify RED** Run `AihrAgentPolicyTest` with the same Maven command pattern. -- [ ] **Step 3: Implement one explicit switch** +- [x] **Step 3: Implement one explicit switch** `AihrAgentPolicy` declares risk and allowed roles for each `Tool`; it rejects unsupported role/tool pairs, write-like plans without confirmation, external plans without consent and multiple calls. Do not introduce an interface/factory/registry framework. -- [ ] **Step 4: Verify GREEN and commit** +- [x] **Step 4: Verify GREEN and commit** ```bash git add backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentPolicy.java \ @@ -132,7 +134,7 @@ git commit -m "feat(agent): enforce tool policy" - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentOrchestratorTest.java` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentControllerContractTest.java` -- [ ] **Step 1: Write failing orchestrator tests** +- [x] **Step 1: Write failing orchestrator tests** Verify: @@ -142,7 +144,7 @@ Verify: - unavailable data maps to `UNAVAILABLE`; no task maps to `COMPLETED` plus `data.state=NO_TASKS`. - the controller has login protection and does not expose identity/tool parameters. -- [ ] **Step 2: Verify RED** +- [x] **Step 2: Verify RED** Run: @@ -152,7 +154,7 @@ timeout 120s mvn -pl ruoyi-modules/ruoyi-aihr -am \ -Dtest=AihrAgentOrchestratorTest,AihrAgentControllerContractTest test ``` -- [ ] **Step 3: Implement the unified text endpoint** +- [x] **Step 3: Implement the unified text endpoint** Add: @@ -162,7 +164,7 @@ POST /api/aihr/agent/messages The orchestrator resolves the current principal server-side, calls Planner, then Policy, and delegates to existing services. It maps citations, resources, conversation/version and data into `AgentResponse`. -- [ ] **Step 4: Verify GREEN and commit** +- [x] **Step 4: Verify GREEN and commit** ```bash git add backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent \ @@ -179,7 +181,7 @@ git commit -m "feat(agent): orchestrate read-only work tools" - Modify: `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentController.java` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentMediaTest.java` -- [ ] **Step 1: Write failing tests for both media modes** +- [x] **Step 1: Write failing tests for both media modes** Verify: @@ -187,15 +189,15 @@ Verify: - “图中电梯门打不开怎么办” may combine vision context with authorized SOP search. - no-evidence work media still returns the vision observation and explicitly marks missing SOP evidence. -- [ ] **Step 2: Verify RED** +- [x] **Step 2: Verify RED** Run focused knowledge and Agent media tests. -- [ ] **Step 3: Expose one internal media mode** +- [x] **Step 3: Expose one internal media mode** Change the knowledge media method to accept an internal enum `MEDIA_ONLY|MEDIA_WITH_KNOWLEDGE`; the client cannot submit it. Reuse current extraction, authorization, size checks and conversation append. `MEDIA_ONLY` skips `queryDocuments`. -- [ ] **Step 4: Add the multipart Agent endpoint** +- [x] **Step 4: Add the multipart Agent endpoint** Add: @@ -205,7 +207,7 @@ POST /api/aihr/agent/messages/media Request parameters mirror text conversation/project fields and explicit consent only. -- [ ] **Step 5: Verify GREEN and commit** +- [x] **Step 5: Verify GREEN and commit** ```bash git add backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent \ @@ -221,7 +223,7 @@ git commit -m "fix(agent): route media by intent" - Modify: `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentController.java` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentActionServiceTest.java` -- [ ] **Step 1: Write failing capture-action tests** +- [x] **Step 1: Write failing capture-action tests** Verify: @@ -231,22 +233,22 @@ Verify: - changed payload with the same key, expired candidate and cross-user candidate are rejected; - dismiss delegates to the existing candidate state machine. -- [ ] **Step 2: Verify RED** +- [x] **Step 2: Verify RED** Run `AihrAgentActionServiceTest`. -- [ ] **Step 3: Implement reference-backed actions** +- [x] **Step 3: Implement reference-backed actions** Agent `draftId` is opaque and resolves server-side to an existing domain draft. Confirmation delegates to `AihrMemoryService.confirm`; dismissal delegates to `AihrMemoryService.dismiss`. Do not duplicate memory normalization, authorization, persistence or idempotency logic. -- [ ] **Step 4: Add endpoints and verify GREEN** +- [x] **Step 4: Add endpoints and verify GREEN** ```text POST /api/aihr/agent/actions/{draftId}/confirm POST /api/aihr/agent/actions/{draftId}/dismiss ``` -- [ ] **Step 5: Commit** +- [x] **Step 5: Commit** ```bash git add backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent \ @@ -260,15 +262,15 @@ git commit -m "feat(agent): confirm existing domain drafts" - Modify: `backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentOrchestrator.java` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentWebResearchTest.java` -- [ ] **Step 1: Write failing consent tests** +- [x] **Step 1: Write failing consent tests** Without consent, `WEB_RESEARCH` returns a clarification/consent card and never calls `AihrWebAiService`. With consent, it delegates to the existing web service and maps only web sources; enterprise citations stay empty. -- [ ] **Step 2: Verify RED, implement minimal delegation, verify GREEN** +- [x] **Step 2: Verify RED, implement minimal delegation, verify GREEN** Keep existing provider enablement, HTTPS validation, privacy redaction and rate limits inside `AihrWebAiService`. -- [ ] **Step 3: Commit** +- [x] **Step 3: Commit** ```bash git add backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentOrchestrator.java \ @@ -287,11 +289,11 @@ git commit -m "feat(agent): require web research consent" - Modify: `scripts/tests/aihr-schema-migrations.test.sh` - Test: `backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentAuditServiceTest.java` -- [ ] **Step 1: Write failing schema and audit tests** +- [x] **Step 1: Write failing schema and audit tests** Assert the migration provides `aihr_agent_run` with run, tenant/app/user, conversation/version, intent, tool, status, source type, duration and sanitized error code. Action details remain in existing domain draft tables and are linked by `result_ref`; do not duplicate sensitive request bodies. -- [ ] **Step 2: Verify RED** +- [x] **Step 2: Verify RED** Run Java audit test plus: @@ -299,15 +301,15 @@ Run Java audit test plus: bash scripts/tests/aihr-schema-migrations.test.sh ``` -- [ ] **Step 3: Add idempotent MySQL migration and audit writer** +- [x] **Step 3: Add idempotent MySQL migration and audit writer** The service records final state in a `finally`-safe path. Audit failure logs a sanitized warning and does not turn a valid user response into failure. -- [ ] **Step 4: Extend reset and read-only preflight checks** +- [x] **Step 4: Extend reset and read-only preflight checks** Production request code must not run DDL. Preflight checks the table and required indexes. -- [ ] **Step 5: Verify GREEN and commit** +- [x] **Step 5: Verify GREEN and commit** ```bash git add backend/script/sql backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent \ @@ -325,11 +327,11 @@ git commit -m "feat(agent): audit orchestrated runs" - Test: `mobile-uni/tests/agent.test.mjs` - Test: `mobile-uni/tests/mobile-user-pages.test.mjs` -- [ ] **Step 1: Write failing contract tests** +- [x] **Step 1: Write failing contract tests** Verify source chips, `NO_EVIDENCE/UNAVAILABLE/FORBIDDEN`, clarification cards, memory confirmation cards, external-consent prompts, citations/resources and media uploads all use the new Agent endpoints. Verify the UI never derives an action button from answer text. -- [ ] **Step 2: Verify RED** +- [x] **Step 2: Verify RED** Run: @@ -337,18 +339,18 @@ Run: node --test mobile-uni/tests/agent.test.mjs mobile-uni/tests/mobile-user-pages.test.mjs ``` -- [ ] **Step 3: Add typed Agent service and map the existing chat page** +- [x] **Step 3: Add typed Agent service and map the existing chat page** Reuse existing audio recording, upload, citation, resource, memory-card and conversation-version UI. Add only source chips, clarification/consent card and status-specific copy. Keep legacy knowledge service for compatibility outside this page. -- [ ] **Step 4: Verify tests and H5 build** +- [x] **Step 4: Verify tests and H5 build** ```bash node --test mobile-uni/tests/agent.test.mjs mobile-uni/tests/mobile-user-pages.test.mjs npm --prefix mobile-uni run build:h5 ``` -- [ ] **Step 5: Commit** +- [x] **Step 5: Commit** ```bash git add mobile-uni/src/services/agent.ts mobile-uni/src/types/api.ts \ @@ -364,7 +366,7 @@ git commit -m "feat(mobile): use digital master agent" - Modify: `docs/20260708/数字师傅学练问报整合方案.md` - Modify: `docs/superpowers/specs/2026-07-24-digital-master-agent-design.md` -- [ ] **Step 1: Run backend regression** +- [x] **Step 1: Run backend regression** ```bash timeout 120s mvn -pl ruoyi-modules/ruoyi-aihr -am \ @@ -372,7 +374,7 @@ timeout 120s mvn -pl ruoyi-modules/ruoyi-aihr -am \ -Dtest='AihrAgent*Test,AihrKnowledgeQueryServiceTest,AihrKnowledgeDataToolServiceTest,AihrMemoryServiceTest' test ``` -- [ ] **Step 2: Run mobile regression and build** +- [x] **Step 2: Run mobile regression and build** ```bash node --test mobile-uni/tests/*.test.mjs @@ -380,29 +382,25 @@ npm --prefix mobile-uni run build:h5 git diff --check ``` -- [ ] **Step 3: Update current-truth documentation** +- [x] **Step 3: Update current-truth documentation** Document exact API contract, migration order, implemented/verified/deployed distinction and remaining courseware/personal-resource subprojects. Remove “待评审” from the approved design. -- [ ] **Step 4: Run authenticated browser acceptance** +- [ ] **Step 4: Complete authenticated browser and real-device acceptance** -At 390×844 and desktop widths, exercise: +已在 390×844 完成寒暄、训练实时来源、全网同意和普通媒体分析。发布前仍须以正式账号/真机补齐: -1. “你好” — no RAG/source card. -2. “我今天有什么待办” — live-data source and truthful `NO_TASKS|HAS_TASKS`. -3. “记一下,3栋1201要回访” — confirmation before persistence. -4. pet image — media source, no SOP lookup. -5. work-risk image — media + authorized SOP or explicit no evidence. -6. web question — consent before external call. -7. old file follow-up — protected resource delivery and revoked-access rejection. +1. “记一下,3栋1201要回访” — confirmation before persistence. +2. work-risk image — media + authorized SOP or explicit no evidence. +3. old file follow-up — protected resource delivery and revoked-access rejection. -Capture screenshots and inspect layout, overflow, keyboard, focus and action-state feedback. +同时补齐桌面宽度、键盘、焦点、确认/撤销反馈和主管/候选人角色正反例;截图不能替代实际交互。 -- [ ] **Step 5: Final commit and release gate** +- [x] **Step 5: Prepare the final documentation commit and preserve the release gate** ```bash git add docs git commit -m "docs(agent): record implementation and acceptance" ``` -Do not deploy until the complete remote static/backend/schema preflight can be run from a clean committed tree. Deployment and formal production account/real-device acceptance remain separate explicit actions. +本次只提交本地实现和事实文档。未执行发布;只有在干净已提交树上完成远端静态、后端、schema 三项预检并补齐上面的正式验收,才可更新为 deployed / production-verified。 diff --git a/docs/superpowers/specs/2026-07-24-digital-master-agent-design.md b/docs/superpowers/specs/2026-07-24-digital-master-agent-design.md index cf77634f..ec59f024 100644 --- a/docs/superpowers/specs/2026-07-24-digital-master-agent-design.md +++ b/docs/superpowers/specs/2026-07-24-digital-master-agent-design.md @@ -6,7 +6,7 @@ > > 适用入口:员工端、主管端、候选人端的“问”能力;管理端只允许受限运营预览,不可代替移动用户身份。 > -> 本设计定义产品最终形态,不代表已经实现、发布或通过阶段一正式试点验收。 +> 本设计定义产品最终形态。当前本地已实现员工“问”的文字/媒体编排、知识与资源、本人待办/训练、主管训练概况、确认式记忆、全网同意、结构化响应和最小运行审计;主管/候选人统一入口及工作成果、指派、复盘、成果投稿等草稿工具仍是后续范围。该增量尚未部署,也未通过正式账号、真机或阶段一试点验收。 ## 1. 结论 @@ -18,9 +18,9 @@ Agent 不拥有任意数据库、任意 HTTP 或任意写入权限;它只可 ## 2. 要解决的问题 -当前能力已有会话改写、`QA/FILE/VIDEO/DATA_TOOL`、受控训练数据工具、确认式记忆、媒体识别和独立全网 AI,但普通 `QA` 会统一进入知识检索。因此以下消息的体验都不正确: +升级前已有会话改写、`QA/FILE/VIDEO/DATA_TOOL`、受控训练数据工具、确认式记忆、媒体识别和独立全网 AI,但普通 `QA` 会统一进入知识检索;本地 Agent 增量正是为纠正以下路由: -| 用户表达 | 正确处理 | 当前错误倾向 | +| 用户表达 | 正确处理 | 升级前错误倾向 | |---|---|---| | “我今天有什么待办?” | 读取当前登录员工的真实待办 | 当作 SOP 检索 | | “记一下,3 栋 1201 要回访” | 生成可编辑确认卡 | 先检索知识库,再后置猜测 | @@ -31,7 +31,7 @@ Agent 不拥有任意数据库、任意 HTTP 或任意写入权限;它只可 ## 3. 设计原则 -1. **先授权,再理解,再调用。** 租户、应用、移动端身份、角色、项目范围和媒体大小在模型调用前由服务端固定;模型不能选择或扩张这些边界。 +1. **可信上下文不可由模型决定。** 登录态、租户和应用由服务端固定;请求长度和附件先做基础校验,领域/外发工具调用前再校验角色、项目、媒体和同意范围。Planner 只能理解语义,不能选择或扩张权限边界。 2. **计划可验证,工具不可越权。** 模型只产生受严格 JSON Schema 校验的计划;执行器只接受注册工具和结构化参数。 3. **事实与建议分开。** 实时任务、训练、成绩、项目数据必须来自领域工具;制度结论必须带知识引用;模型建议不得伪装为已分配任务或已执行动作。 4. **读可自动,写必确认。** 读取权限范围内的资料或数据可直接执行;创建记录、提交成果、指派训练、通知主管等操作先生成草稿,确认后才调用领域写接口。 @@ -90,9 +90,10 @@ flowchart TD |---|---|---| | `AihrAgentOrchestrator` | 唯一编排入口:组装上下文、调用 Planner、过 Policy、执行工具、生成响应 | 新增 | | `AihrAgentPlanner` | 输出结构化意图和工具计划;模型不可用时使用保守规则 | 新增,替代会话服务中仅查询改写的职责 | -| `AihrAgentPolicy` | 校验角色、项目、工具参数、外发同意、确认要求和最大调用数 | 新增 | -| `AihrAgentToolRegistry` | 注册工具元数据、输入/输出 schema、读写风险和权限谓词 | 新增 | -| 领域工具适配器 | 将 Agent 计划映射到已有训练、工作成果、记忆、知识、全网等服务 | 新增薄适配层;不复制领域逻辑 | +| `AihrAgentPolicy` | 用显式 `switch` 校验角色、已知工具、外发同意和确认要求 | 新增;当前工具数量无需注册表或工厂 | +| `AihrAgentActionService` | 将不透明 `draftId` 映射到既有记忆候选,确认/忽略继续走领域版本与幂等规则 | 新增;Redis 票据 30 分钟有效 | +| `AihrAgentAuditService` | 尽力写入最小运行元数据,失败不泄漏业务内容 | 新增 | +| 领域服务调用 | Orchestrator 将已校验计划直接映射到训练、待办、记忆、知识、媒体和全网服务 | 复用;不复制领域逻辑 | | `AihrKnowledgeQueryService` | 被 `KNOWLEDGE_SEARCH/FILE/VIDEO` 工具调用,继续负责空间授权、RAG、引用和受保护资源 | 复用 | | `AihrKnowledgeDataToolService` | 被训练/待办读取工具调用,继续做 APP 身份和主管范围校验 | 复用并按领域扩充 | | `AihrMemoryService` | 被记录草稿工具调用,继续生成、确认和落库确认式记忆 | 复用 | @@ -146,9 +147,9 @@ Planner 只能返回以下受校验 JSON。服务端忽略任何未知字段和 3. Planner 可提取“今天”“本项目”“刚才那份”等语义,但不能输出员工 ID、项目编码、知识空间 ID、收件人 ID 等权限主体;这些值必须由工具侧再解析。 4. Planner 失败时用确定性规则路由 `RESOURCE_DELIVERY`、`LIVE_MY_WORK`、`CAPTURE_FACT`、`WEB_RESEARCH`;其余返回 `CLARIFY`,而不是自动 RAG。 -## 7. 工具注册表 +## 7. 受控工具目录 -最终工具集合按“工具名—服务端能力—授权—写入”登记。以下表中的“现有”表示已有领域接口或服务可复用,不表示客户端可绕过 Agent 直接扩大权限。 +最终工具集合按“工具名—服务端能力—授权—写入”维护。当前实现用枚举和 `AihrAgentPolicy` 显式 `switch` 固定工具集;以下“现有”表示已有领域接口或服务可复用,不表示客户端可绕过 Agent 扩大权限。 | 工具 | 类型 | 当前能力来源 | 授权与输出约束 | |---|---|---|---| @@ -157,16 +158,16 @@ Planner 只能返回以下受校验 JSON。服务端忽略任何未知字段和 | `MY_CURRENT_TASKS` | 读 | `AihrKnowledgeDataToolService` | 认证 APP 员工本人;无任务要明确返回无任务 | | `MY_PRACTICE_SUMMARY` | 读 | 既有训练历史服务 | 仅认证员工本人 | | `TEAM_PRACTICE_SUMMARY` | 读 | 既有主管团队服务 | 仅主管且仅可信项目范围 | -| `MY_WORK_RESULTS` | 读 | 既有工作成果服务 | 员工 + 项目 + 自然日;禁止未来日期 | -| `TEAM_WORK_RESULTS` | 读 | 既有主管工作成果服务 | 主管项目范围 | +| `MY_WORK_RESULTS` | 读 | 既有工作成果服务 | 最终范围;当前 Agent 尚未接入 | +| `TEAM_WORK_RESULTS` | 读 | 既有主管工作成果服务 | 最终范围;当前 Agent 尚未接入 | | `CAPTURE_MEMORY_DRAFT` | 草稿 | `AihrMemoryService` | 只能形成 `DRAFT/NEEDS_INPUT`,由用户选择 PRIVATE/COMPANY 后确认 | -| `PRACTICE_ASSIGNMENT_DRAFT` | 草稿 | 既有训练指派领域契约 | 仅主管范围;确认前不创建任务 | -| `REVIEW_DRAFT` | 草稿 | 既有复盘领域契约 | 仅主管范围;确认前不改变复盘状态 | -| `WORK_REPORT_DRAFT` | 草稿 | 成果投稿领域契约 | 只覆盖 CASE/VIDEO/SOP/KNOWLEDGE,不与日常记忆互写 | +| `PRACTICE_ASSIGNMENT_DRAFT` | 草稿 | 既有训练指派领域契约 | 最终范围;当前 Agent 尚未接入 | +| `REVIEW_DRAFT` | 草稿 | 既有复盘领域契约 | 最终范围;当前 Agent 尚未接入 | +| `WORK_REPORT_DRAFT` | 草稿 | 成果投稿领域契约 | 最终范围;当前 Agent 尚未接入,且不得与日常记忆互写 | | `MEDIA_ANALYZE` | 读 | 现有 vision/ASR/media 提取 | 当次附件、大小限制、临时上下文;不自动入库 | | `WEB_RESEARCH` | 读/外发 | `AihrWebAiService` | 独立来源、用户同意、HTTPS 提供方、现有限流;不写企业知识 | -每个工具必须声明:`risk=READ|DRAFT|WRITE`、允许角色、项目范围谓词、输入 schema、最大返回大小、是否可带附件、幂等要求、审计事件类型。任何未登记工具一律拒绝。 +每个工具必须在枚举、Policy 和测试中同时固定风险、允许角色、输入边界、附件/同意/确认要求与审计类型。工具数量和动态配置需求显著增加前不引入注册表框架;任何未知工具一律拒绝。 ## 8. 确认式动作和真实状态 @@ -256,25 +257,24 @@ POST /api/aihr/agent/actions/{draftId}/dismiss ## 11. 移动端交互 -1. 将“问”首页改为一个统一入口“问数字师傅”;不要求用户先判断该选“工作助手”还是“查全网”。 +1. “工作助手”即数字师傅 Agent 主入口,普通消息由 Agent 自动路由;现有“查全网”显式页签保留独立来源与免责声明,同时 Agent 内识别到全网意图时也必须先展示外发同意卡。 2. 输入框接受文字、录音、图片、视频;附件选择后显示“仅本次分析”,并在发出前显示是否可能外发。 3. 回复顶部展示精简来源条:`已查内部 SOP`、`已读取我的待办`、`图片识别`、`需全网授权`、`待你确认`。 4. `NEEDS_INPUT` 使用不超过三个字段的澄清卡,优先从当前可选项目、日期和已授权对象中选择,不让用户输入内部编码。 5. `NEEDS_CONFIRMATION` 显示结构化草稿及“确认/修改/取消”;完成后显示领域系统返回的真实编号、时间和状态。 6. RAG 结果保留引用、原文件/视频卡和总结卡;全网结果保持独立免责声明与来源,不能与企业引用混排。 -7. 主管和候选人复用同一交互组件,但只展示其工具注册表允许的快捷入口和结果卡。 +7. 主管和候选人后续复用同一响应契约和结果卡;当前移动端接入仅覆盖员工“问”,不得据此宣称三端已完成。 ## 12. 审计、模型评价和运营 ### 12.1 审计对象 -新增 `aihr_agent_run` 与 `aihr_agent_action_draft`,记录最小必要信息: +新增 `aihr_agent_run`,只记录最小必要信息: -- `runId`、tenant/app/user、项目范围快照、会话版本; -- 识别意图、执行工具、策略结果、来源类别、耗时、脱敏错误码; -- 动作草稿版本、确认人、幂等键哈希、领域回执 ID 和最终状态。 +- `runId`、tenant/client/user、会话与上下文版本; +- 识别意图、执行工具、最终状态、主要来源类别、耗时、脱敏错误码和领域结果类型引用。 -不得在审计表保存原始密钥、完整敏感提示词、未脱敏聊天正文、原始 OSS URL 或模型隐藏推理。 +动作草稿不新增数据库表:当前仅用 30 分钟有效的 Redis 不透明票据引用既有 `aihr_memory_candidate`,最终版本、幂等键和回执继续由领域表负责。不得在 Agent 审计保存问题、答案、附件、原始密钥、敏感提示词、OSS URL 或模型隐藏推理。 ### 12.2 质量指标 @@ -282,7 +282,7 @@ POST /api/aihr/agent/actions/{draftId}/dismiss ## 13. 安全与降级 -- Policy Gate 在任何模型调用和工具调用前执行;工具内部仍需重复做授权,不能信任 Planner 结果。 +- 登录态和请求基础校验先于 Planner;Policy 在任何领域或外发工具调用前执行,工具内部仍需重复授权,不能信任 Planner 结果。 - 模型输出不能直接触发写操作、通知、下载、外发、身份切换或项目选择。 - 全网、图片外发必须使用现有 HTTPS 提供方白名单、连接测试、大小限制、限流和用户同意。 - 解析失败、模型关闭或 JSON 不合法时:优先规则路由已知只读/确认式意图;无法可靠判定则返回澄清,不回退到全量 RAG。 diff --git a/docs/物业AI人力资源系统开发规格TechSpec.md b/docs/物业AI人力资源系统开发规格TechSpec.md index 361f794f..76f03316 100644 --- a/docs/物业AI人力资源系统开发规格TechSpec.md +++ b/docs/物业AI人力资源系统开发规格TechSpec.md @@ -1,6 +1,6 @@ # 物业行业 AI 人力资源系统 · 开发规格(Tech Spec) -> 版本:v1.9 | 日期:2026-07-22 +> 版本:v2.0 | 日期:2026-07-24 > 定位:**开发层唯一依据**。回答"怎么建"——工程结构、数据表、API 契约、Prompt 规格、集成适配。 > v1.1 变更:数据模型对齐《手册》卷1 第9章 HR 主干,补 3 张 backbone 表(职位职责/雇员绩效/雇用终止),新增附录 D 对照表。 > v1.2 变更:第 6 章按 Codex 设计评审重写——状态机补异常/终止态、COACH_CHECK 工程化、评分引擎分层(P0 单 LLM / P1 融合)、澄清"单场对练评分 vs 跨期能力画像"两套评分、Prompt 加固 + RAG 硬约束、新增 6.5 P0/P1 切分。 @@ -11,6 +11,7 @@ > v1.7 文档收口:明确当前“工作上报”是四类成果投稿审核链,工作助手负责日常事实采集;项目名称选择、项目化会话、来源追溯和今日工作成果仍属后续迭代,不能从规划文档推断已实现。详见[迭代计划](工作助手与今日工作成果迭代计划-20260721.md)。 > v1.8 发布前本地实施快照:项目名称选择、项目化会话、确认记录来源/状态、员工今日成果、主管项目成果和“成果投稿”界面名称已完成本地实现与 390×844 验证;该快照记录的是发布前状态,外部线索、工单和考勤投递仍保持 PENDING。 > v1.9 发布与本轮回填: v1.8 所列多项目、项目化确认采集、来源/状态、员工今日成果、主管项目成果和“成果投稿”界面名称已于 2026-07-21 部署。成果历史日期选择、服务端拒绝未来日期及主管手机号授权兜底已于 2026-07-22 发布,并完成远端服务、schema 与产物匹配复核;外部线索、工单和考勤投递仍保持 PENDING。 +> v2.0 本地实施快照:“问”改由 `/api/aihr/agent/**` 统一规划意图并执行受控工具,知识 RAG 退回底层能力;新增 `aihr_agent_run` 最小路由审计。该增量已完成本地自动化、H5 构建和部分 390×844 浏览器验证,尚未部署或完成正式账号/真机验收。 > 配套:需求见[《物业AI人力资源系统业务需求文档BRD》](物业AI人力资源系统业务需求文档BRD.md);2026-07 MVP 执行计划已归档到[《AI人力资源系统一期MVP版作战清单》](archive/2026-07-mvp-delivery/AI人力资源系统一期MVP版作战清单.md)。 > **优先级图例**:`P0`=2026-07-05 MVP 演示必需 · `P1`=一期必需 · `P2`=二期/推迟。 > 决策基线:若依基座 / 集中式前后端分离 / 本地登录 / 公有大模型API / 一期RAG / 组织人员外部同步(MVP 用快照) / 数据范围以项目为主体。 @@ -25,7 +26,7 @@ |---|---| | 后端 | Java + Spring Boot 4(若依 RuoYi 后端) | | 管理端前端 | Vue + plus-ui(若依前端,前后端分离) | -| 移动端前端 | 独立 `mobile/` Vue/Vite Web/H5;小程序技术栈后续再定 | +| 移动端前端 | `mobile-uni/` uni-app Vue3 H5 + App-Plus;旧 `mobile/` 只作 MVP 演示兜底 | | 数据库 | MySQL(主数据/事务)+ MinIO(原始文件)+ Qdrant(向量索引) | | 检索 | MySQL Fulltext + Qdrant 混合 RAG(一期);知识图谱 Neo4j(P2) | | 大模型 | 公有大模型 API(对话/出题/评分/案例整理) | @@ -43,8 +44,10 @@ backend/ script/sql/aihr_model_mysql8.sql frontend/ src/views/{index,recruit,train,knowledge,system/model} # 管理端 MVP 页面 +mobile-uni/ + src/pages/ # 员工端/候选人端/主管端当前页面 mobile/ - src/App.vue # 员工端/候选人端/主管端 H5 首页 + src/App.vue # 旧 MVP 演示兜底 ``` - 复用若依 `ruoyi-system` 的用户/角色/菜单/数据权限;自有后端 API 集中在 `ruoyi-aihr`,不要塞回上游 `ruoyi-demo`。 @@ -68,6 +71,7 @@ mobile/ | M8 治理/版本/审核 | 支撑 | P1 | | M9 AI 适配层 | 支撑 | P0 | | M10 管理驾驶舱/报表 | 分析 | P1 | +| M11 数字师傅 Agent | 业务编排 | 本地已实现,待发布验收 | --- @@ -164,6 +168,7 @@ mobile/ | `content_version`(版本留痕) | id, target_type, target_id, version, diff, change_by | P1 | | `llm_call_log`(大模型调用/成本) | id, module, model, tokens_in, tokens_out, cost, latency_ms, created_at | P1(成本闸门G6) | | `asr_config`(语音配置) | id, vendor, dialect, endpoint, enabled | P0 | +| `aihr_agent_run`(Agent 最小运行审计) | run_id, tenant_id, client_key, user_id, conversation_id, context_version, intent, tool, status, source_type, duration_ms, error_code, result_ref | 本地已落;不保存原始问题、答案、附件或模型推理 | --- @@ -181,7 +186,7 @@ mobile/ | `/h5/#/pages/user/today/index` | 员工端首页,手机号登录后可“开始训练”并同步主管待复盘计数;旧 `/h5/user` 兼容重定向 | P0跑通 | | `/h5/#/pages/candidate/index/index` | 候选人端首页,手机号登录后可面试练习、查岗位 SOP/案例、上传补充资料;旧 `/h5/candidate` 兼容重定向 | P0跑通 | | `/h5/#/pages/supervisor/index/index` | 主管端首页,查看团队、待复盘、案例/SOP 工具;旧 `/h5/supervisor` 兼容重定向 | P0跑通 | -| `/h5/#/pages/user/sop/index` | 工作助手;按项目名称选择当前项目,语音/文字/照片/视频统一采集,确认后形成日常工作记录 | 2026-07-21 已部署;媒体生产真机回归未完成 | +| `/h5/#/pages/user/sop/index` | 问·数字师傅 Agent;文字、语音、图片/视频自动路由知识、训练、待办、记忆、媒体或全网工具,项目按名称选择 | Agent 本地已实现,未部署;正式账号/真机验收未完成 | | `/h5/#/pages/user/work-results/index` | 员工工作成果;按员工、项目、自然日汇总确认记录和待跟进 | 2026-07-22 已发布历史日期选择与未来日期拒绝 | | `/h5/#/pages/supervisor/work-results/index` | 主管项目成果;按目标项目权限查看员工成果和高优问题 | 2026-07-22 已发布历史日期选择与手机号授权兜底 | | `/h5/#/pages/user/report/index` | 员工成果投稿;复用「问」的微信式语音会话,AI 整理确认后提交既有审核链 | 会话式页面和接口已部署;本地界面已正式改名;项目归属和媒体内容理解未实现 | @@ -347,6 +352,21 @@ POST /api/ai/score req:{ rubricId, dialogue } resp:{ dimensions, co - 混合检索:`POST /api/knowledge/search` 先查 MySQL Fulltext,同时在 vector 模型和 Qdrant 可用时生成 query embedding 走 Qdrant,最后按 RRF 融合并回 MySQL hydrate 片段;Qdrant 不存正文事实源。 - Rubric 配置:`/api/competency/rubric/**` CRUD +### 5.6 数字师傅 Agent + +```text +POST /api/aihr/agent/messages +POST /api/aihr/agent/messages/media +POST /api/aihr/agent/actions/{draftId}/confirm +POST /api/aihr/agent/actions/{draftId}/dismiss +``` + +- 文字请求只接受 `question`、短会话版本、当前项目、大喇叭消息引用和明确的外发同意;`question` 去空白后必填且不超过 1000 字。multipart 请求只增加当次附件,不接受客户端身份、角色、工具名、知识空间 ID 或任意 URL。 +- Planner 只输出已知 `intent/tool`;服务端固定策略按认证主体与角色授权,领域工具再次校验项目、会话和资源。寒暄/澄清不调用 RAG;普通图片只做当次媒体分析,明确制度/流程问题才补充授权知识。 +- 响应状态限定为 `COMPLETED/NEEDS_INPUT/NEEDS_CONFIRMATION/NO_EVIDENCE/FORBIDDEN/UNAVAILABLE/FAILED`,并分别返回来源、引用、资源、数据、动作草稿或澄清字段;客户端不得从回答文本猜按钮或业务状态。 +- 全网工具必须先取得用户本次明确同意;写入只通过 30 分钟有效的 `draftId` 确认/忽略,并复用领域服务的 `expectedVersion + idempotencyKey + saveScope`。`aihr_agent_run` 只记录最小路由元数据。 +- 旧 `/api/knowledge/query`、`query-media` 和 `/api/aihr/web-ai/**` 保留为底层/兼容接口。完整请求示例、错误码和当前发布边界见 [API_INTEGRATION.md](API_INTEGRATION.md)。 + --- ## 6. 核心自建组件规格(无框架可复用,最关键)