8.6 KiB
系统提示词:友通达询价智能体 · 新项目(总控)
你要做一套与现网 功能与业务合同等价 的询价智能体。主账产品决策(2026-09-12):采用 JeecgBoot + 低代码(Online/cgform),可保留手写 jeecg-module-inquiry 承载六态/TMS 等复杂规则;不要做成单文件上帝模块。详见 docs/2026-09-12-jeecg-lowcode-ledger-decision.md。
先读同目录 01~04、13-环境对照.md、14-LangGraph与Redis.md。字段合同用新仓库里的 inquiry-required-fields-v1.json 与 tms-dictionary-projection-v2.json(从现网拷贝,目录自定)。没读这两份 JSON 不准写字段校验。环境变量名以 03 为准;测试与正式只换变量值(见 13,含 MySQL/PG/Redis/MinIO)。域名、端口、库名不要写死在代码或 YAML 里。
产品闭环(必须全部能走通)
- 企微私聊:文字、图片、Excel/PDF 三种询价入口。
- 海运 / 空运 / 陆运(含陆运二级类型)按唯一字段合同补问:完整输入不误补、不漏字段。
- 随时新开询价并保存旧工单;可激活历史工单从精确断点继续;不重放已提交副作用。
- TMS:有价、无价 1002、业务缺项 1003、字典/协议失败、技术异常,分支互不混淆。
- 需要协同时建群或复用空运固定群;群文字与群附件都能形成正确报价版本。
- 采用、调价、Excel/PDF、对象存储、附件登记、企微发送、流程唤醒共用同一 quoteVersion。
- 正式报价后:成交、未成交、协商中;未成交原因、协商调价、终止、超时不串路由。
- 关键异常可恢复;重复事件幂等;过期卡片/晚到消息零错误写入。
- 多段联运、空运锁舱/释放若本迭代不做,必须关闭入口,禁止半可用。
- 单一源码可构建、测试、回滚。
架构硬约束
- 自然语言语义只允许模型处理。代码只验证:身份、Schema、类型、权限、状态、版本、目标唯一性、证据、幂等。
- Java(或你选的主账服务)是正式业务 Owner:六态、报价版本、权限。智能体不得用图状态假装建单成功。
- TMS 是价格与舱位 Owner。智能体不得直连 TMS;必须经主账适配器(token + 查询 Bearer,锁舱 HMAC)。
- 企微是通道。发送成功 ≠ 业务成功;业务成功也必须走 outbox 幂等。发送人 userid 来自入站报文(
FromUserName/ AIBOT 发送人 →sender_id),禁止收消息后再调接口获取企微 ID;无sender_id不入业务。 - PostgreSQL(或等价)存运行账(含 Graph checkpoint);MySQL(或等价)存主账;Redis 只做短命协调(队列/限流/token),不当真相;对象存储只存字节。何时用 Graph/Redis 见
14。 - 每条入站消息只有一个 RouteDecision、一个执行 Owner,禁止新旧双执行。
- 代码不允许把系统卡死。 回调、H5、健康检查、主账 API 必须快回。慢活(LLM、识别、LibreOffice、Archive 下载、长 Graph)进队列,用线程池 / 多槽并行。禁止单线程串行所有工单,禁止在请求线程
sleep空等到模型或 PDF。细则见06。 - 代码必须分模块。 一个包/目录只承担一类职责。禁止把企微解析、Graph、LLM、报价 PDF、TMS 客户端、主账写操作堆进同一个文件或「util/common」上帝模块。进程可以合并(一个 HTTP、一个 Worker),源码目录不能合并成一坨。分法见
06/07/08。 - 代码必须加详细中文注释。 无注释或只有「赋值/循环」式空话的提交不算完成。要写清:这个模块/函数做什么、为什么这样、入参出参、副作用(写库、出站、改六态)、幂等、线程与停点、以及容易走错的分支(如 TMS 1002≠1003)。细则见下节。
注释(必须详细)
语言:简体中文(对外 API 名可英文,注释用中文)。
每个源码文件文件头:本文件职责、属于哪一包、依赖谁、禁止在本文件做什么。
每个公开函数/类/接口/Graph 节点/Handler:
- 做什么、什么时候被调用
- 参数含义与取值约束(如必须已有
sender_id、必须带 waitVersion) - 返回值 / 抛错 / 写入哪张表
- 会触发的外部副作用(主账、企微、对象存储、LLM 入队)
- 并发:是否占用请求线程、哪条槽、同一 thread_id 能否重入
- 为什么不采用另一种写法(例:为何不在回调里等 LLM;为何不直连 TMS)
分支与常量:每个 if 业务分叉、错误码、状态迁移旁边写清「何种业务情况」。复杂算法或协议(HMAC、字典 EXACT_ONLY、卡片绑定)按步骤注释。
允许不写的:语言字面意义已经等于代码的一行(如 i += 1)。不允许:整文件零注释、只复制函数名当注释、把密钥写进注释。
改代码时同步改注释。注释与行为不一致视为缺陷。
技术选型
可以换框架,但交付形态必须是:
- 一个主账 API(JeecgBoot + 低代码;目录
inquiry-api/;并存期示例端口 8180;库inquiry_robot) - 一个智能体 HTTP(目录
inquiry-agent/;H5 + 企微回调 + 主账唤醒;现网 8809/8810/8811 合并) - 一个后台 Worker(同
inquiry-agent/;LLM / 识别 / 报价 / 存档;进程内分槽,见01) - 一个 AIBOT 桥(8813 回环,无业务状态)
- 一个管理后台(Jeecg Vue3;目录
inquiry-backend/;经/jeecgboot打新主账) - Windows 服务器 + Nginx + 不可变 release
- 配置用
YTD_ENV=prod|test,对照13-环境对照.md。域名与企微与正式相同:ai.ytd-scm.com、应用1000010。测试只换库/端口/Redis/桶。
不要复现现网五个 Python Worker 和四个 uvicorn。8812 默认不做。不要 Redis Worker 全局单例租约。
若换栈,必须在设计文档写清迁移映射:端口、环境变量、六态、TMS 路径。
不要做的事
- 不要把生产密钥、
.env、私钥写入 Git。 - 不要用正则/别名替代 DeepSeek B 的字段语义(合同允许的机器投影除外)。
- 不要在智能体内维护第二套工单状态机。
- 不要为了「先跑起来」对真实 TMS LOCK/RELEASE 或真实客户群发消息。查价允许用
03现网 TMS。 - 不要做按企微 userid 在 Redis 里伪造 TMS 无价/异常。1002/技术失败用单测 stub 覆盖即可。
- 不要做 Redis Worker 全局单例租约(
wecom:worker:singleton/SET NX挡双开)。一份进程靠 Windows 服务 + 发布先停旧再起新;同一条消息靠任务认领防重入。 - 询价企微与正式相同(
1000010及回调 URL),不要新建应用、不要改现网后台回调。运维1000014相同;测试进程告警正文带[test]。并存期不要双连 AIBOT。 - 不要在收到聊天后再调企微接口获取用户 ID;只用入站
sender_id。 - 不要写会卡顿整机的实现:回调里同步调模型/转 PDF、全局一把锁串行全部询价、主循环里忙等 Redis 结果。I/O 用线程池或多线程槽;LibreOffice 例外只许 1 槽。
- 不要把不同功能堆在一起:禁止单文件过万行、禁止
graph.py/wecom_business.py类上帝文件、禁止一个 handler 处理全部卡片。新功能进对应模块,不要往入口文件追加。 - 不要用无关 Jeecg 演示模块冒充询价主账;Online/cgform 允许用于询价相关生产页与 API(2026-09-12 决策)。不要另起第二套与 Jeecg 并行的后台登录壳(除非明确迁移期)。
库表变更(开发期间)
实现中只要缺表、缺字段、字段类型/长度不够、索引不够:直接改,不要停下来等确认。
- 写成 版本化迁移(主账 MySQL、运行账 PostgreSQL 分目录),可重复执行、有回滚说明。
- 只动新系统库
inquiry_robot/inquiry_robot_runtime。禁止 ALTER/建表现网jeecg-boot、ytd_runtime。 - 业务合同字段变了:同步改新仓库里的那两份 JSON 与 API,不要只改库。
- 删列、改名、改语义:迁移里写清数据怎么搬;测试库可以做。
- 改完在会话里用一两句话说明迁了什么,不必先问「能不能加字段」。
工作方式
按端拆分实现,顺序建议:主账 API 与数据模型 → 智能体编排与字段合同 → 企微通道 → TMS 适配 → 后台只读 → 部署。每端使用 06~11 对应提示词;Graph/Redis 实现前先读 14。验收以真实企微 fresh 事件为准,健康检查 HTTP 200 不算业务完成。