comprehensive-r2.json 246 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147
  1. {
  2. "companyId": 338,
  3. "includeTravelChain": true,
  4. "includeTravelStress": true,
  5. "startedAt": "2026-06-23 09:02:54",
  6. "sections": {
  7. "engineHealth": {
  8. "passed": true,
  9. "health": {
  10. "companyId": 338,
  11. "healthy": true,
  12. "missingCore": [
  13. ],
  14. "missingOptional": [
  15. ],
  16. "passThreshold": 120
  17. },
  18. "message": "core beans wired"
  19. },
  20. "integrationTests": {
  21. "passed": false,
  22. "summary": "2/4 tests passed in 1631ms",
  23. "details": [
  24. "[FAIL] NodeTypeService: START node not found",
  25. "[FAIL] DynamicNodeExecutor: Judgment node execution failed",
  26. "[PASS] MultiModelWorkflowGenerator: All tests passed",
  27. "[PASS] ModelConfigService: All tests passed"
  28. ],
  29. "executionTimeMs": 1631,
  30. "message": "2/4 tests passed in 1631ms"
  31. },
  32. "phase2Replay": {
  33. "passed": true,
  34. "verify": {
  35. "companyId": 338,
  36. "archiveTableExists": true,
  37. "hotIndexExists": true,
  38. "hotReplayRows": 80,
  39. "eventLogRows": 80,
  40. "archiveRows": 0,
  41. "status": "ok"
  42. },
  43. "message": "phase2 replay verify ok"
  44. },
  45. "pageLinkProbes": {
  46. "totalPages": 29,
  47. "requiredTotal": 15,
  48. "requiredPassed": 15,
  49. "optionalSkipped": 0,
  50. "failures": [
  51. ],
  52. "passed": true,
  53. "durationMs": 4434,
  54. "pages": [
  55. {
  56. "path": "/lobster/company-workflowLobster",
  57. "title": "Workflow templates",
  58. "probe": "templateList",
  59. "required": true,
  60. "passed": true,
  61. "status": "OK",
  62. "message": "templates=45"
  63. },
  64. {
  65. "path": "/lobster/workflow-execution",
  66. "title": "Workflow execution tasks",
  67. "probe": "instanceList",
  68. "required": true,
  69. "passed": true,
  70. "status": "OK",
  71. "message": "instances=593"
  72. },
  73. {
  74. "path": "/lobster/instance",
  75. "title": "Instance monitor",
  76. "probe": "instanceMonitor",
  77. "required": true,
  78. "passed": true,
  79. "status": "OK",
  80. "message": "monitor list ok, count=593"
  81. },
  82. {
  83. "path": "/lobster/prompt",
  84. "title": "Prompt management",
  85. "probe": "promptList",
  86. "required": true,
  87. "passed": true,
  88. "status": "OK",
  89. "message": "prompt rows=50"
  90. },
  91. {
  92. "path": "/lobster/sensitive-words",
  93. "title": "Sensitive words",
  94. "probe": "sensitiveWords",
  95. "required": true,
  96. "passed": true,
  97. "status": "OK",
  98. "message": "words=147"
  99. },
  100. {
  101. "path": "/lobster/forbidden-words",
  102. "title": "Forbidden words",
  103. "probe": "forbiddenWords",
  104. "required": false,
  105. "passed": true,
  106. "status": "OK",
  107. "message": "forbidden=32"
  108. },
  109. {
  110. "path": "/lobster/typo-words",
  111. "title": "Typo words",
  112. "probe": "typoWords",
  113. "required": false,
  114. "passed": true,
  115. "status": "OK",
  116. "message": "typo=3"
  117. },
  118. {
  119. "path": "/lobster/conversation-summary",
  120. "title": "Conversation summary",
  121. "probe": "conversationSummary",
  122. "required": true,
  123. "passed": true,
  124. "status": "OK",
  125. "message": "summaries=19"
  126. },
  127. {
  128. "path": "/lobster/profile-config",
  129. "title": "Profile config",
  130. "probe": "profileConfig",
  131. "required": false,
  132. "passed": true,
  133. "status": "OK",
  134. "message": "profile fields=16"
  135. },
  136. {
  137. "path": "/lobster/channel-config",
  138. "title": "Channel config",
  139. "probe": "channelTypes",
  140. "required": true,
  141. "passed": true,
  142. "status": "OK",
  143. "message": "channels=14"
  144. },
  145. {
  146. "path": "/lobster/channel-plugin",
  147. "title": "Channel plugins",
  148. "probe": "channelPlugins",
  149. "required": true,
  150. "passed": true,
  151. "status": "OK",
  152. "message": "plugins=3"
  153. },
  154. {
  155. "path": "/lobster/api-registry",
  156. "title": "API registry",
  157. "probe": "apiRegistry",
  158. "required": true,
  159. "passed": true,
  160. "status": "OK",
  161. "message": "apis=0"
  162. },
  163. {
  164. "path": "/lobster/sales-corpus",
  165. "title": "Sales corpus",
  166. "probe": "salesCorpus",
  167. "required": false,
  168. "passed": false,
  169. "status": "WARN",
  170. "message": "\r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \u0027optimized_answer\u0027 in \u0027field list\u0027\r\n### The error may exist in URL [jar:file:/D:/ylrz_saas_new/java/fs-saas-company/target/fs-saas-company.jar!/BOOT-INF/lib/fs-service-1.1.0.jar!/mapper/company/LobsterSalesCorpusMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: select id, dialog_text, customer_question, sales_answer, optimized_answer, ai_feedback, scenario, score, source_type, external_user_id, company_id, task_id, salesperson_name, tags, status, quality_status, kb_written, enabled, create_by, create_time, update_by, update_time from lobster_sales_corpus where company_id = ? order by create_time desc limit ? offset ?\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \u0027optimized_answer\u0027 in \u0027field list\u0027\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \u0027optimized_answer\u0027 in \u0027field list\u0027"
  171. },
  172. {
  173. "path": "/lobster/chat-aggregate",
  174. "title": "Chat aggregate",
  175. "probe": "chatAggregate",
  176. "required": false,
  177. "passed": true,
  178. "status": "OK",
  179. "message": "sessions=5"
  180. },
  181. {
  182. "path": "/lobster/industry-bootstrap",
  183. "title": "Industry bootstrap",
  184. "probe": "industryPacks",
  185. "required": true,
  186. "passed": true,
  187. "status": "OK",
  188. "message": "packs=28"
  189. },
  190. {
  191. "path": "/lobster/identity-config",
  192. "title": "External role config",
  193. "probe": "identityConfig",
  194. "required": false,
  195. "passed": true,
  196. "status": "OK",
  197. "message": "identity config loaded"
  198. },
  199. {
  200. "path": "/lobster/semantic-keywords",
  201. "title": "Semantic keywords",
  202. "probe": "semanticKeywords",
  203. "required": true,
  204. "passed": true,
  205. "status": "OK",
  206. "message": "keywords=0"
  207. },
  208. {
  209. "path": "/lobster/optimization",
  210. "title": "AI optimization audit",
  211. "probe": "optimization",
  212. "required": true,
  213. "passed": true,
  214. "status": "OK",
  215. "message": "optimization stats=5"
  216. },
  217. {
  218. "path": "/lobster/dynamic-impl",
  219. "title": "Dynamic node approval",
  220. "probe": "dynamicImpl",
  221. "required": true,
  222. "passed": true,
  223. "status": "OK",
  224. "message": "pending impls=0"
  225. },
  226. {
  227. "path": "/lobster/dashboard",
  228. "title": "Engine dashboard",
  229. "probe": "dashboard",
  230. "required": true,
  231. "passed": true,
  232. "status": "OK",
  233. "message": "dashboard keys=8"
  234. },
  235. {
  236. "path": "/lobster/token-stats",
  237. "title": "Token stats",
  238. "probe": "tokenStats",
  239. "required": false,
  240. "passed": false,
  241. "status": "WARN",
  242. "message": "\r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.lobster_token_consumption\u0027 doesn\u0027t exist\r\n### The error may exist in URL [jar:file:/D:/ylrz_saas_new/java/fs-saas-company/target/fs-saas-company.jar!/BOOT-INF/lib/fs-service-1.1.0.jar!/mapper/company/LobsterTokenConsumptionMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT DATE(request_time) AS date, SUM(token_count) AS totalTokens, SUM(estimated_cost) AS totalCost, COUNT(1) AS requestCount FROM lobster_token_consumption WHERE company_id = ? AND request_time BETWEEN ? AND ? GROUP BY DATE(request_time) ORDER BY date DESC\r\n### Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.lobster_token_consumption\u0027 doesn\u0027t exist\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.lobster_token_consumption\u0027 doesn\u0027t exist"
  243. },
  244. {
  245. "path": "/lobster/evolution",
  246. "title": "Evolution engine",
  247. "probe": "evolution",
  248. "required": true,
  249. "passed": true,
  250. "status": "OK",
  251. "message": "evolution metrics=6"
  252. },
  253. {
  254. "path": "/lobster/chat-test",
  255. "title": "Chat test",
  256. "probe": "chatTest",
  257. "required": false,
  258. "passed": true,
  259. "status": "OK",
  260. "message": "e2e test service ready"
  261. },
  262. {
  263. "path": "/lobster/ab-test",
  264. "title": "AB / GEPA optimization",
  265. "probe": "abTest",
  266. "required": false,
  267. "passed": true,
  268. "status": "OK",
  269. "message": "active ab tests=0"
  270. },
  271. {
  272. "path": "/lobster/profile",
  273. "title": "Customer profile hub",
  274. "probe": "userProfile",
  275. "required": false,
  276. "passed": true,
  277. "status": "OK",
  278. "message": "profiles=39, domain=true"
  279. },
  280. {
  281. "path": "/lobster/profile-domain",
  282. "title": "Unified profile domain",
  283. "probe": "profileDomain",
  284. "required": false,
  285. "passed": true,
  286. "status": "OK",
  287. "message": "profile domain ready, mode=async"
  288. },
  289. {
  290. "path": "/lobster/qdrant",
  291. "title": "Vector knowledge base",
  292. "probe": "qdrant",
  293. "required": false,
  294. "passed": true,
  295. "status": "OK",
  296. "message": "vectors=0"
  297. },
  298. {
  299. "path": "/lobster/global-stats",
  300. "title": "Global evolution stats",
  301. "probe": "globalStats",
  302. "required": false,
  303. "passed": true,
  304. "status": "OK",
  305. "message": "global metrics=6"
  306. },
  307. {
  308. "path": "/lobster/event-audit",
  309. "title": "Event node audit",
  310. "probe": "eventAudit",
  311. "required": false,
  312. "passed": true,
  313. "status": "OK",
  314. "message": "audits=0"
  315. }
  316. ]
  317. },
  318. "travelFullChain": {
  319. "companyId": 338,
  320. "includeStress": true,
  321. "dialogueIndustry": "travel",
  322. "startedAt": "2026-06-23 09:03:00",
  323. "sections": {
  324. "enginePrompts": {
  325. "expectedCatalogKeys": 50,
  326. "newlyInserted": 0,
  327. "missingKeys": [
  328. ],
  329. "platformKeyCount": 50,
  330. "passed": true,
  331. "message": "platform engine prompts complete (50 keys)"
  332. },
  333. "triggerExclude": {
  334. "passed": true,
  335. "errors": [
  336. ],
  337. "message": "trigger exclude/sarcasm/schedule checks ok"
  338. },
  339. "runtimeCapabilities": {
  340. "capabilityTags": [
  341. "product",
  342. "weather",
  343. "logistics",
  344. "survey",
  345. "live",
  346. "article",
  347. "order",
  348. "order_list",
  349. "coupon",
  350. "crm",
  351. "sms"
  352. ],
  353. "toolCount": 11,
  354. "intentChecks": [
  355. {
  356. "message": "这几条线路看起来不错",
  357. "expectedTool": "query_product",
  358. "matchedTool": "query_product",
  359. "passed": "true"
  360. },
  361. {
  362. "message": "云南天气怎么样",
  363. "expectedTool": "query_weather",
  364. "matchedTool": "query_weather",
  365. "passed": "true"
  366. },
  367. {
  368. "message": "我的快递发货了吗",
  369. "expectedTool": "query_logistics",
  370. "matchedTool": "query_logistics",
  371. "passed": "true"
  372. },
  373. {
  374. "message": "满意度打分",
  375. "expectedTool": "start_survey",
  376. "matchedTool": "start_survey",
  377. "passed": "true"
  378. },
  379. {
  380. "message": "有没有新线路优惠",
  381. "expectedTool": "query_product",
  382. "matchedTool": "query_product",
  383. "passed": "true"
  384. },
  385. {
  386. "message": "有直播吗",
  387. "expectedTool": "push_live",
  388. "matchedTool": "push_live",
  389. "passed": "true"
  390. },
  391. {
  392. "message": "发我看看文章",
  393. "expectedTool": "push_article",
  394. "matchedTool": "push_article",
  395. "passed": "true"
  396. }
  397. ],
  398. "surveySmoke": true,
  399. "issues": [
  400. ],
  401. "passed": true,
  402. "message": "运行时能力校验通过"
  403. },
  404. "capabilityDialogue": {
  405. "lines": [
  406. {
  407. "message": "云南7月份天气怎么样,需要带什么衣服",
  408. "matchedTool": "query_weather",
  409. "triggered": true,
  410. "toolStatus": "ok",
  411. "summary": "已查询 云南 天气"
  412. },
  413. {
  414. "message": "快递发货了吗,帮我查一下物流",
  415. "matchedTool": "query_logistics",
  416. "triggered": true,
  417. "toolStatus": "ok",
  418. "summary": "{success=false, error=未找到物流单号,请确认是否已发货}"
  419. },
  420. {
  421. "message": "有没有适合带老人的新线路推荐",
  422. "matchedTool": "query_product",
  423. "triggered": true,
  424. "toolStatus": "ok",
  425. "summary": "{products=[], count=0}"
  426. },
  427. {
  428. "message": "今晚有直播吗,发我直播间链接",
  429. "matchedTool": "push_live",
  430. "triggered": true,
  431. "toolStatus": "ok",
  432. "summary": "暂无可用直播,请稍后再试"
  433. },
  434. {
  435. "message": "有没有出行攻略文章发我看看",
  436. "matchedTool": "push_article",
  437. "triggered": true,
  438. "toolStatus": "ok",
  439. "summary": "暂无可用文章,请稍后再试"
  440. },
  441. {
  442. "message": "满意度打5分,服务挺好的",
  443. "matchedTool": "start_survey",
  444. "triggered": true,
  445. "toolStatus": "ok",
  446. "summary": "已记录客户参与「satisfaction」问卷意向,请在对话中自然引导完成反馈"
  447. }
  448. ],
  449. "lineCount": 6,
  450. "warnings": [
  451. ],
  452. "issues": [
  453. ],
  454. "passed": true,
  455. "message": "capabilityTriggers 联调通过"
  456. },
  457. "template": {
  458. "passed": true,
  459. "workflowId": 1,
  460. "templateCode": "TRAVEL_TOP_SALES_001_C338",
  461. "source": "existing",
  462. "message": "travel template found"
  463. },
  464. "lifecycleCoverage": {
  465. "coverageRatio": 1.0,
  466. "minCoverage": 0.75,
  467. "nodeCount": 16,
  468. "requiredNodeCount": 15,
  469. "missingNodes": [
  470. ],
  471. "passed": true,
  472. "message": "lifecycle nodes covered"
  473. },
  474. "sopDefaults": {
  475. "qwSopTempId": "LOBSTER_TRAVEL_POST_BOOKING",
  476. "wxSopTempId": "LOBSTER_TRAVEL_POST_BOOKING_WX",
  477. "tenantHint": "Create qw_sop/wx_sop tasks with temp_id matching the values above",
  478. "sopEnrollNodeConfig": "{\"sopTempId\":\"LOBSTER_TRAVEL_POST_BOOKING\",\"wxSopTempId\":\"LOBSTER_TRAVEL_POST_BOOKING_WX\",\"plannedIndustry\":\"travel\",\"systemPromptKey\":\"node_TRAVEL_TOP_SALES_001_C338_SOP_ENROLL_system\",\"preferContactAccount\":true,\"plannedRole\":\"MESSAGE\",\"instructionPromptKey\":\"node_TRAVEL_TOP_SALES_001_C338_SOP_ENROLL_instruction\",\"actionOnly\":true,\"promptPlanned\":true}",
  479. "hasSopEnrollNode": true,
  480. "passed": true,
  481. "message": "travel SOP defaults and SOP_ENROLL node present"
  482. },
  483. "sopEnrollment": {
  484. "qwTaskConfigured": true,
  485. "wxTaskConfigured": true,
  486. "tenantSopReady": true,
  487. "qwChannel": {
  488. "success": false,
  489. "skipped": null,
  490. "channelType": "QW",
  491. "message": "未找到企微客户(需 contactId 或 externalUserId+corpId)",
  492. "tempId": null,
  493. "sopId": "lobster-travel-val-qw",
  494. "reachable": true
  495. },
  496. "wxChannel": {
  497. "success": false,
  498. "skipped": null,
  499. "channelType": "WX",
  500. "message": "未找到 CRM 客户(需 customerId 或 wx_contact 关联)",
  501. "tempId": null,
  502. "sopId": 1,
  503. "reachable": true
  504. },
  505. "passed": true,
  506. "notes": [
  507. ],
  508. "message": "QW/WX SOP enrollment routing ok"
  509. },
  510. "nodePromptsPlanned": {
  511. "promptNodeTarget": 6,
  512. "promptNodeFilled": 6,
  513. "emptyPromptNodes": [
  514. ],
  515. "passed": true,
  516. "message": "key node prompts present"
  517. },
  518. "lifecycleSimulation": {
  519. "waitPreTripConfigured": true,
  520. "tagAutoConfigured": true,
  521. "orderActionConfigured": true,
  522. "holidayWaitConfigured": true,
  523. "passed": true,
  524. "message": "lifecycle orchestration nodes configured"
  525. },
  526. "lifecycleRuntime": {
  527. "simMinuteUnit": 10,
  528. "simDayEqualsMinutes": 10,
  529. "schedulerWakeWaitMs": 3500,
  530. "preTripWaitSchedule10m": {
  531. "waitUntil": 1782177000000,
  532. "expectedWaitAt": 1782177000000,
  533. "travelAt": "2026-06-23T10:03:13.076982600",
  534. "waitInRealMinutes": 6,
  535. "diffMinutes": 0,
  536. "simTimeScale": true,
  537. "passed": true,
  538. "message": "T-5 10m sim schedule ok"
  539. },
  540. "preTripWaitWake": {
  541. "passed": true,
  542. "message": "lifecycle wait wake ok",
  543. "statusAfter": "running",
  544. "resumeIndex": 8,
  545. "currentIndexAfter": 9,
  546. "instanceId": 67
  547. },
  548. "preTripSchedulerWake10m": {
  549. "scheduledWakeAt": 1782176600045,
  550. "schedulerWaitMs": 3500,
  551. "passed": true,
  552. "message": "scheduler 10m sim wake ok",
  553. "statusAfter": "running",
  554. "resumeIndex": 8,
  555. "currentIndexAfter": 9,
  556. "instanceId": 68
  557. },
  558. "holidayWaitSchedule10m": {
  559. "waitUntil": 1782194400000,
  560. "expectedWaitAt": 1782194400000,
  561. "waitInRealMinutes": 296,
  562. "simHolidayDays": 30,
  563. "simRealMinutes": 300,
  564. "diffMinutes": 0,
  565. "passed": true,
  566. "message": "holiday 10m sim schedule ok"
  567. },
  568. "holidayWaitWake": {
  569. "passed": true,
  570. "message": "lifecycle wait wake ok",
  571. "statusAfter": "completed",
  572. "resumeIndex": 13,
  573. "currentIndexAfter": 13,
  574. "instanceId": 69
  575. },
  576. "holidaySchedulerWake10m": {
  577. "scheduledWakeAt": 1782176608545,
  578. "schedulerWaitMs": 3500,
  579. "passed": true,
  580. "message": "scheduler 10m sim wake ok",
  581. "statusAfter": "completed",
  582. "resumeIndex": 13,
  583. "currentIndexAfter": 13,
  584. "instanceId": 70
  585. },
  586. "passed": true,
  587. "message": "lifecycle 10m sim schedule/wake ok"
  588. },
  589. "lifecycleFullFlowSim": {
  590. "instanceId": 71,
  591. "finalStatus": "completed",
  592. "finalNodeIndex": 13,
  593. "milestones": [
  594. "STARTED",
  595. "T5_SCHEDULED",
  596. "T5_WAITING",
  597. "PRE_TRIP_CARE",
  598. "PRE_TRIP_MULTITURN",
  599. "HOLIDAY_WAITING",
  600. "HOLIDAY_PROMO"
  601. ],
  602. "errors": [
  603. ],
  604. "passed": true,
  605. "message": "full lifecycle 10m sim flow ok",
  606. "simMinuteUnit": 10
  607. },
  608. "lifecycleExceptions": {
  609. "waitNotExpired": {
  610. "passed": true,
  611. "message": "not-expired wait rejected advance",
  612. "statusAfter": "waiting"
  613. },
  614. "prematureScheduler": {
  615. "passed": true,
  616. "message": "premature scheduler did not wake"
  617. },
  618. "blockedSchedulerSkip": {
  619. "passed": true,
  620. "message": "blocked instance skipped by scheduler"
  621. },
  622. "blockedForceWake": {
  623. "passed": true,
  624. "message": "blocked force wake rejected"
  625. },
  626. "overdueT5SkipWait": {
  627. "waitUntil": 1782174600000,
  628. "overdue": true,
  629. "wouldSkipSchedule": true,
  630. "passed": true,
  631. "message": "overdue T-5 skips wait schedule"
  632. },
  633. "missingTravelDate": {
  634. "waitUntil": 1782177246651,
  635. "expectedFallbackMinutes": 10,
  636. "passed": true,
  637. "message": "missing travel_date sim fallback ok"
  638. },
  639. "completedRejectWake": {
  640. "passed": true,
  641. "message": "completed instance rejects wake"
  642. },
  643. "missingResumeIndex": {
  644. "passed": true,
  645. "message": "missing resume index fallback ok"
  646. },
  647. "doubleWake": {
  648. "passed": true,
  649. "message": "double wake idempotent",
  650. "statusAfter": "running"
  651. },
  652. "passed": true,
  653. "message": "lifecycle exception handling ok"
  654. },
  655. "lifecycleMultiTurnDialogue": {
  656. "bookingTurnCount": 10,
  657. "postBookingTurnCount": 9,
  658. "dialogueSource": "bookingFunnel+postBookingLifecycle",
  659. "consultMultiTurn": {
  660. "turns": 5,
  661. "avgScore": 61.6,
  662. "minScore": 0.0,
  663. "passed": true,
  664. "message": "node multiTurn ok",
  665. "instanceId": 79,
  666. "inputCount": 6
  667. },
  668. "postBookingMultiTurnFlow": {
  669. "instanceId": 80,
  670. "preTripMultiTurn": {
  671. "turns": 3,
  672. "avgScore": 78.66666666666667,
  673. "minScore": 78.0,
  674. "passed": true,
  675. "message": "node multiTurn ok"
  676. },
  677. "holidayMultiTurn": {
  678. "turns": 1,
  679. "avgScore": 79.0,
  680. "minScore": 79.0,
  681. "earlyCompletion": true,
  682. "passed": true,
  683. "message": "node multiTurn ok"
  684. },
  685. "milestones": [
  686. "PRE_TRIP",
  687. "PRE_TRIP_MT",
  688. "HOLIDAY",
  689. "HOLIDAY_MT"
  690. ],
  691. "errors": [
  692. ],
  693. "dialogueTurns": 9,
  694. "passed": true,
  695. "message": "post-booking multi-turn flow ok"
  696. },
  697. "passed": true,
  698. "message": "lifecycle multi-turn dialogue ok"
  699. },
  700. "e2eDialogue": {
  701. "dialogueStage": "bookingFunnel",
  702. "dialogueTurnCount": 10,
  703. "runId": "003151395cac40e68a44c30aa7e0680b",
  704. "status": "SUCCESS",
  705. "instanceId": 81,
  706. "totalScore": 62.44,
  707. "passedNodeCnt": 10,
  708. "totalNodeCnt": 10,
  709. "evolutionCount": 1,
  710. "nodeTraces": 10,
  711. "minNodeScore": 76.25,
  712. "maxNodeScore": 79.375,
  713. "nodesBelowTarget": 0,
  714. "nodesBelowMin": 0,
  715. "nodeScoreDetail": [
  716. {
  717. "nodeCode": "初始化咨询阶段",
  718. "score": 76.875,
  719. "passed": true
  720. },
  721. {
  722. "nodeCode": "直播加微推直播间",
  723. "score": 78.75,
  724. "passed": true
  725. },
  726. {
  727. "nodeCode": "推送出行攻略文章",
  728. "score": 77.5,
  729. "passed": true
  730. },
  731. {
  732. "nodeCode": "推送出行攻略文章",
  733. "score": 76.25,
  734. "passed": true
  735. },
  736. {
  737. "nodeCode": "推送出行攻略文章",
  738. "score": 79.375,
  739. "passed": true
  740. },
  741. {
  742. "nodeCode": "推送出行攻略文章",
  743. "score": 79.375,
  744. "passed": true
  745. },
  746. {
  747. "nodeCode": "推送出行攻略文章",
  748. "score": 78.75,
  749. "passed": true
  750. },
  751. {
  752. "nodeCode": "推送出行攻略文章",
  753. "score": 77.5,
  754. "passed": true
  755. }
  756. ],
  757. "passed": true,
  758. "message": "e2e ok"
  759. },
  760. "qualityGate": {
  761. "enabled": true,
  762. "targetScorePercent": 75.0,
  763. "minE2eAvgScorePercent": 75.0,
  764. "minNodeScorePercent": 60.0,
  765. "passScorePercent": 75,
  766. "rawTotalScore": 62.44,
  767. "scoredNodeAvg": 78.046875,
  768. "totalScore": 78.046875,
  769. "nodesBelowTarget": 0,
  770. "nodesBelowMin": 0,
  771. "minNodeScore": 76.25,
  772. "maxNodeScore": 79.375,
  773. "nodeScoreDetail": [
  774. {
  775. "nodeCode": "初始化咨询阶段",
  776. "score": 76.875,
  777. "passed": true
  778. },
  779. {
  780. "nodeCode": "直播加微推直播间",
  781. "score": 78.75,
  782. "passed": true
  783. },
  784. {
  785. "nodeCode": "推送出行攻略文章",
  786. "score": 77.5,
  787. "passed": true
  788. },
  789. {
  790. "nodeCode": "推送出行攻略文章",
  791. "score": 76.25,
  792. "passed": true
  793. },
  794. {
  795. "nodeCode": "推送出行攻略文章",
  796. "score": 79.375,
  797. "passed": true
  798. },
  799. {
  800. "nodeCode": "推送出行攻略文章",
  801. "score": 79.375,
  802. "passed": true
  803. },
  804. {
  805. "nodeCode": "推送出行攻略文章",
  806. "score": 78.75,
  807. "passed": true
  808. },
  809. {
  810. "nodeCode": "推送出行攻略文章",
  811. "score": 77.5,
  812. "passed": true
  813. }
  814. ],
  815. "passed": true,
  816. "message": "quality gate ok"
  817. },
  818. "inboundNoWorkflow": {
  819. "turns": [
  820. {
  821. "message": "你好,我想了解一下云南旅游",
  822. "route": "PROMPT_DIRECT",
  823. "hasReply": true,
  824. "durationMs": 2484
  825. },
  826. {
  827. "message": "没绑定工作流也能聊吗",
  828. "route": "PROMPT_DIRECT",
  829. "hasReply": true,
  830. "durationMs": 3105
  831. },
  832. {
  833. "message": "大概预算每人5000有什么推荐",
  834. "route": "PROMPT_DIRECT",
  835. "hasReply": true,
  836. "durationMs": 3562
  837. }
  838. ],
  839. "turnCount": 3,
  840. "issues": [
  841. ],
  842. "passed": true,
  843. "message": "no-workflow inbound chat ok"
  844. },
  845. "emotionSpectrum": {
  846. "cases": [
  847. {
  848. "case": "positive_excited",
  849. "message": "太好了非常期待这次旅行",
  850. "durationMs": 1,
  851. "detectedIntent": "positive",
  852. "detectedSentiment": "0.39",
  853. "sentiment": 0.39,
  854. "intent": "positive"
  855. },
  856. {
  857. "case": "negative_complaint",
  858. "message": "你们服务太差了我要投诉",
  859. "durationMs": 856,
  860. "detectedIntent": "complaint",
  861. "detectedSentiment": "-1.0",
  862. "sentiment": -1.0,
  863. "intent": "complaint"
  864. },
  865. {
  866. "case": "anxious_concern",
  867. "message": "有点担心老人高原反应安全吗",
  868. "durationMs": 1346,
  869. "detectedIntent": "inquiry",
  870. "detectedSentiment": "-0.3",
  871. "sentiment": -0.3,
  872. "intent": "inquiry"
  873. },
  874. {
  875. "case": "grateful",
  876. "message": "谢谢耐心解答很有帮助",
  877. "durationMs": 1139,
  878. "detectedIntent": "positive",
  879. "detectedSentiment": "0.8",
  880. "sentiment": 0.8,
  881. "intent": "positive"
  882. },
  883. {
  884. "case": "price_objection",
  885. "message": "价格太贵了能不能再优惠一点",
  886. "durationMs": 2,
  887. "detectedIntent": "purchase",
  888. "detectedSentiment": "-0.6000000000000001",
  889. "sentiment": -0.6000000000000001,
  890. "intent": "purchase"
  891. },
  892. {
  893. "case": "urgency",
  894. "message": "紧急!明天就要出发还没收到确认",
  895. "durationMs": 1376,
  896. "detectedIntent": "complaint",
  897. "detectedSentiment": "-0.7",
  898. "sentiment": -0.8,
  899. "intent": "complaint"
  900. },
  901. {
  902. "case": "sarcasm_cold",
  903. "message": "呵呵随便吧",
  904. "sarcasmDetected": true
  905. },
  906. {
  907. "case": "anger_abuse",
  908. "message": "你们真是烦死了",
  909. "excludeRecommended": true
  910. }
  911. ],
  912. "caseCount": 8,
  913. "issues": [
  914. ],
  915. "passed": true,
  916. "message": "emotion spectrum ok"
  917. },
  918. "semanticVariationScale": {
  919. "minRequired": 50,
  920. "enabledKeywordCount": 539,
  921. "fullCatalogEndpoint": "/api/lobster/admin/validation/semantic-context/{companyId}?mode=full",
  922. "passed": true,
  923. "message": "semantic variation scale ok (539 enabled keywords)"
  924. },
  925. "performanceBudget": {
  926. "timings": {
  927. "validationElapsedMs": 393339,
  928. "e2eAvgScore": 62.44,
  929. "sentimentAvgMs": 0,
  930. "evolveSampleMs": 7094,
  931. "evolveQualityScore": 123
  932. },
  933. "recommendations": [
  934. ],
  935. "passed": true,
  936. "message": "performance budget ok"
  937. },
  938. "summary": {
  939. "instanceId": 81,
  940. "externalUserId": "999338001",
  941. "asyncDbSummary": true,
  942. "historyLines": 20,
  943. "syncSummaryLength": 77,
  944. "microSummaryLength": 210,
  945. "cachedSummaryOk": true,
  946. "dbSummaryRows": 0,
  947. "passed": true,
  948. "message": "summary persisted to DB"
  949. },
  950. "memoryPipeline": {
  951. "externalUserId": "999338001",
  952. "instanceId": 81,
  953. "summaryOk": true,
  954. "factCount": 9,
  955. "factKeys": [
  956. ],
  957. "passed": true,
  958. "message": "summary or customer_fact persisted"
  959. },
  960. "evolutionAnalyze": {
  961. "e2eEvolutionCount": 1,
  962. "evolutionLogsBefore": 182,
  963. "analyzeInvoked": true,
  964. "analyzeMessage": "analyzeAndSuggest ok",
  965. "evolutionLogsAfter": 182,
  966. "evolutionLogsDelta": 0,
  967. "pendingSuggestions": 0,
  968. "passed": true,
  969. "message": "evolution analyze ok"
  970. },
  971. "sensitiveWord": {
  972. "scopeNote": "lobster SensitiveWordService + evolve step9; not live/call/CompanyAiSensitiveWord AC",
  973. "layers": {
  974. "defaultLib": {
  975. "detectCount": 1,
  976. "filtered": "推荐云南精品线,***,欢迎咨询",
  977. "passed": true
  978. },
  979. "customCrud": {
  980. "word": "LOBSTER_VAL_338",
  981. "hit": true,
  982. "filtered": "行程含***内容",
  983. "passed": true
  984. },
  985. "highRisk": {
  986. "word": "LOBSTER_FRAUD_338",
  987. "highRisk": true,
  988. "passed": true
  989. },
  990. "evolveStep9Simulation": {
  991. "rawHasSensitive": true,
  992. "wouldTransferToHuman": true,
  993. "finalReply": "欢迎咨询,预期收益,***",
  994. "passed": true
  995. },
  996. "wordListLoaded": {
  997. "count": 149,
  998. "passed": true
  999. }
  1000. },
  1001. "passed": true,
  1002. "message": "sensitive word pipeline ok"
  1003. },
  1004. "executionPolicy": {
  1005. "scopeNote": "resolve() strict/content/flow gates used by executor + prompt fallback",
  1006. "strictFixedWorkflow": false,
  1007. "contentPersonalization": true,
  1008. "flowPersonalization": true,
  1009. "allowContent": true,
  1010. "allowFlow": true,
  1011. "executionMode": "HYBRID",
  1012. "issues": [
  1013. ],
  1014. "passed": true,
  1015. "message": "execution policy gates ok"
  1016. },
  1017. "aiGenerate": {
  1018. "recordNo": "LOB_1782176985049",
  1019. "generateUseLlm": false,
  1020. "fallbackGenerate": true,
  1021. "finalStatus": 1,
  1022. "detail": {
  1023. "conversationModel": {
  1024. "defaultStage": "consult",
  1025. "description": "旅游全链路:会话常驻,节点负责打标/签单/出行关怀/满意度/节日营销",
  1026. "version": 2,
  1027. "stages": [
  1028. {
  1029. "code": "consult",
  1030. "promptHint": "你是小美,测试旅行社旅行顾问。客户来自直播间,先破冰并了解是否已有出行计划。",
  1031. "label": "直播加微破冰",
  1032. "goals": [
  1033. ]
  1034. },
  1035. {
  1036. "code": "collect",
  1037. "promptHint": "逐步询问目的地、日期、人数、预算;一次只问一个关键问题。",
  1038. "label": "需求采集打标",
  1039. "goals": [
  1040. {
  1041. "collected": false,
  1042. "label": "目的地",
  1043. "required": true,
  1044. "field": "destination"
  1045. },
  1046. {
  1047. "collected": false,
  1048. "label": "出行日期",
  1049. "required": true,
  1050. "field": "travel_date"
  1051. },
  1052. {
  1053. "collected": false,
  1054. "label": "预算",
  1055. "required": true,
  1056. "field": "budget"
  1057. },
  1058. {
  1059. "collected": false,
  1060. "label": "出行人数",
  1061. "required": true,
  1062. "field": "pax"
  1063. }
  1064. ]
  1065. },
  1066. {
  1067. "code": "offer",
  1068. "promptHint": "基于采集信息推荐云南精品线,突出亮点与优惠,自然引导签单。",
  1069. "label": "线路推荐促单",
  1070. "goals": [
  1071. ]
  1072. },
  1073. {
  1074. "code": "pre_trip",
  1075. "promptHint": "出行前5天提醒证件、行李、当地天气与注意事项。",
  1076. "label": "出行前关怀",
  1077. "goals": [
  1078. ]
  1079. },
  1080. {
  1081. "code": "in_trip",
  1082. "promptHint": "行程中主动问候,询问是否遇到问题,给出景点玩要建议。",
  1083. "label": "行中关怀",
  1084. "goals": [
  1085. ]
  1086. },
  1087. {
  1088. "code": "post_trip",
  1089. "promptHint": "行程结束后收集满意度与改进建议。",
  1090. "label": "满意度回访",
  1091. "goals": [
  1092. ]
  1093. },
  1094. {
  1095. "code": "repurchase",
  1096. "promptHint": "大节日前30天关怀,了解是否有新的出行计划并推荐产品。",
  1097. "label": "节日营销",
  1098. "goals": [
  1099. ]
  1100. }
  1101. ],
  1102. "sideTasks": [
  1103. {
  1104. "triggerIntents": [
  1105. "purchase",
  1106. "high_intent",
  1107. "booked"
  1108. ],
  1109. "nodeCode": "TAG_AUTO",
  1110. "nodeType": 9,
  1111. "action": "add_tag"
  1112. },
  1113. {
  1114. "triggerIntents": [
  1115. "purchase",
  1116. "order",
  1117. "book"
  1118. ],
  1119. "nodeCode": "ORDER_ACTION",
  1120. "nodeType": 7,
  1121. "action": "create_order"
  1122. }
  1123. ]
  1124. },
  1125. "variables": [
  1126. {
  1127. "varName": "客户姓名",
  1128. "label": "客户姓名",
  1129. "source": "user_profile",
  1130. "type": "string",
  1131. "required": 0,
  1132. "varType": "string",
  1133. "sourceType": "user_profile",
  1134. "name": "customerName",
  1135. "varCode": "customerName"
  1136. },
  1137. {
  1138. "varName": "目的地",
  1139. "label": "目的地",
  1140. "source": "conversation",
  1141. "type": "string",
  1142. "required": 0,
  1143. "varType": "string",
  1144. "sourceType": "conversation",
  1145. "name": "destination",
  1146. "varCode": "destination"
  1147. },
  1148. {
  1149. "varName": "出行日期",
  1150. "label": "出行日期",
  1151. "source": "conversation",
  1152. "type": "date",
  1153. "required": 0,
  1154. "varType": "date",
  1155. "sourceType": "conversation",
  1156. "name": "travel_date",
  1157. "varCode": "travel_date"
  1158. },
  1159. {
  1160. "varName": "预算",
  1161. "label": "预算",
  1162. "source": "conversation",
  1163. "type": "string",
  1164. "required": 0,
  1165. "varType": "string",
  1166. "sourceType": "conversation",
  1167. "name": "budget",
  1168. "varCode": "budget"
  1169. },
  1170. {
  1171. "varName": "出行人数",
  1172. "label": "出行人数",
  1173. "source": "conversation",
  1174. "type": "number",
  1175. "required": 0,
  1176. "varType": "number",
  1177. "sourceType": "conversation",
  1178. "name": "pax",
  1179. "varCode": "pax"
  1180. },
  1181. {
  1182. "varName": "测试旅行社",
  1183. "label": "测试旅行社",
  1184. "source": "manual",
  1185. "type": "string",
  1186. "required": 0,
  1187. "varType": "string",
  1188. "sourceType": "manual",
  1189. "name": "company_short_name",
  1190. "varCode": "company_short_name"
  1191. },
  1192. {
  1193. "varName": "小美",
  1194. "label": "小美",
  1195. "source": "manual",
  1196. "type": "string",
  1197. "required": 0,
  1198. "varType": "string",
  1199. "sourceType": "manual",
  1200. "name": "advisor_name",
  1201. "varCode": "advisor_name"
  1202. },
  1203. {
  1204. "varName": "云南精品线",
  1205. "label": "云南精品线",
  1206. "source": "manual",
  1207. "type": "string",
  1208. "required": 0,
  1209. "varType": "string",
  1210. "sourceType": "manual",
  1211. "name": "main_product",
  1212. "varCode": "main_product"
  1213. },
  1214. {
  1215. "varName": "当前阶段",
  1216. "label": "当前阶段",
  1217. "source": "manual",
  1218. "type": "string",
  1219. "required": 0,
  1220. "varType": "string",
  1221. "sourceType": "manual",
  1222. "name": "workflowStage",
  1223. "varCode": "workflowStage"
  1224. },
  1225. {
  1226. "varName": "客户意向",
  1227. "label": "客户意向",
  1228. "source": "conversation",
  1229. "type": "string",
  1230. "required": 0,
  1231. "varType": "string",
  1232. "sourceType": "conversation",
  1233. "name": "customerIntent",
  1234. "varCode": "customerIntent"
  1235. },
  1236. {
  1237. "varName": "行业类型",
  1238. "defaultValue": "travel",
  1239. "label": "行业类型",
  1240. "source": "manual",
  1241. "type": "string",
  1242. "required": 0,
  1243. "varType": "string",
  1244. "sourceType": "manual",
  1245. "name": "industryType",
  1246. "varCode": "industryType"
  1247. },
  1248. {
  1249. "varName": "企微SOP模板ID",
  1250. "defaultValue": "LOBSTER_TRAVEL_POST_BOOKING",
  1251. "label": "企微SOP模板ID",
  1252. "source": "manual",
  1253. "type": "string",
  1254. "required": 0,
  1255. "varType": "string",
  1256. "sourceType": "manual",
  1257. "name": "sopTempId",
  1258. "varCode": "sopTempId"
  1259. },
  1260. {
  1261. "varName": "个微SOP模板ID",
  1262. "defaultValue": "LOBSTER_TRAVEL_POST_BOOKING_WX",
  1263. "label": "个微SOP模板ID",
  1264. "source": "manual",
  1265. "type": "string",
  1266. "required": 0,
  1267. "varType": "string",
  1268. "sourceType": "manual",
  1269. "name": "wxSopTempId",
  1270. "varCode": "wxSopTempId"
  1271. }
  1272. ],
  1273. "edges": [
  1274. {
  1275. "targetNodeCode": "INIT_STAGE",
  1276. "sourceNodeCode": "START",
  1277. "edgeLabel": "启动"
  1278. },
  1279. {
  1280. "targetNodeCode": "LIVE_PUSH",
  1281. "sourceNodeCode": "INIT_STAGE",
  1282. "edgeLabel": "直播加微推直播间"
  1283. },
  1284. {
  1285. "targetNodeCode": "ARTICLE_PUSH",
  1286. "sourceNodeCode": "LIVE_PUSH",
  1287. "edgeLabel": "推送攻略文章"
  1288. },
  1289. {
  1290. "targetNodeCode": "TAG_AUTO",
  1291. "sourceNodeCode": "ARTICLE_PUSH",
  1292. "edgeLabel": "进入采集打标"
  1293. },
  1294. {
  1295. "targetNodeCode": "JUDGE",
  1296. "sourceNodeCode": "TAG_AUTO",
  1297. "edgeLabel": "分支"
  1298. },
  1299. {
  1300. "targetNodeCode": "ORDER_ACTION",
  1301. "sourceNodeCode": "JUDGE",
  1302. "edgeLabel": "签单"
  1303. },
  1304. {
  1305. "targetNodeCode": "WAIT_PRE_TRIP",
  1306. "sourceNodeCode": "JUDGE",
  1307. "edgeLabel": "已订"
  1308. },
  1309. {
  1310. "targetNodeCode": "WAIT_HOLIDAY",
  1311. "sourceNodeCode": "JUDGE",
  1312. "edgeLabel": "培育"
  1313. },
  1314. {
  1315. "targetNodeCode": "SOP_ENROLL",
  1316. "sourceNodeCode": "ORDER_ACTION",
  1317. "edgeLabel": "SOP入营"
  1318. },
  1319. {
  1320. "targetNodeCode": "WAIT_PRE_TRIP",
  1321. "sourceNodeCode": "SOP_ENROLL",
  1322. "edgeLabel": "进入出行前"
  1323. },
  1324. {
  1325. "targetNodeCode": "PRE_TRIP_CARE",
  1326. "sourceNodeCode": "WAIT_PRE_TRIP",
  1327. "edgeLabel": "T-5触达"
  1328. },
  1329. {
  1330. "targetNodeCode": "WEATHER_TIPS",
  1331. "sourceNodeCode": "PRE_TRIP_CARE",
  1332. "edgeLabel": "天气建议"
  1333. },
  1334. {
  1335. "targetNodeCode": "IN_TRIP_CARE",
  1336. "sourceNodeCode": "WEATHER_TIPS",
  1337. "edgeLabel": "行中"
  1338. },
  1339. {
  1340. "targetNodeCode": "SURVEY",
  1341. "sourceNodeCode": "IN_TRIP_CARE",
  1342. "edgeLabel": "满意度"
  1343. },
  1344. {
  1345. "targetNodeCode": "WAIT_HOLIDAY",
  1346. "sourceNodeCode": "SURVEY",
  1347. "edgeLabel": "节日等待"
  1348. },
  1349. {
  1350. "targetNodeCode": "HOLIDAY_PROMO",
  1351. "sourceNodeCode": "WAIT_HOLIDAY",
  1352. "edgeLabel": "节日营销"
  1353. },
  1354. {
  1355. "targetNodeCode": "END",
  1356. "sourceNodeCode": "HOLIDAY_PROMO",
  1357. "edgeLabel": "结束"
  1358. }
  1359. ],
  1360. "description": "旅游公司销冠全流程:直播加微→破冰→采集出行需求→线路推荐→促单签单→出行前关怀→旅途中关怀→回访调研→节日营销→循环推荐",
  1361. "templateCode": "TRAVEL_TOP_SALES_001",
  1362. "errorMsg": "已使用行业兜底模板: validation fast fallback",
  1363. "brandContext": {
  1364. "advisorName": "小美",
  1365. "companyShortName": "测试旅行社",
  1366. "advisorRole": "金牌旅行顾问",
  1367. "mainProduct": "云南精品线"
  1368. },
  1369. "_fallbackSource": "travel_lifecycle_full",
  1370. "nodes": [
  1371. {
  1372. "nodeName": "开始",
  1373. "nextNodeCode": "INIT_STAGE",
  1374. "nodeCode": "START",
  1375. "maxRounds": 0,
  1376. "nodeType": 1,
  1377. "nodeConfig": "{\"autoAdvance\":true,\"channelHint\":\"QW\"}",
  1378. "sortNo": 1,
  1379. "conditionExpr": "",
  1380. "messageTemplate": "您好${customerName},我是小美,测试旅行社旅行顾问。看到您从直播间过来,打算去哪里玩呢?"
  1381. },
  1382. {
  1383. "nodeName": "初始化咨询阶段",
  1384. "nextNodeCode": "LIVE_PUSH",
  1385. "nodeCode": "INIT_STAGE",
  1386. "maxRounds": 0,
  1387. "nodeType": 16,
  1388. "nodeConfig": "{\"assignments\":{\"workflowStage\":\"consult\"},\"stageGate\":true}",
  1389. "sortNo": 2,
  1390. "conditionExpr": "",
  1391. "messageTemplate": ""
  1392. },
  1393. {
  1394. "nodeName": "直播加微推直播间",
  1395. "nextNodeCode": "ARTICLE_PUSH",
  1396. "nodeCode": "LIVE_PUSH",
  1397. "maxRounds": 0,
  1398. "nodeType": 54,
  1399. "nodeConfig": "{\"delivery\":\"proactive\",\"channelHint\":\"QW\",\"actionOnly\":false,\"keyword\":\"云南精品线\",\"liveBaseUrl\":\"/live/watch\"}",
  1400. "sortNo": 3,
  1401. "conditionExpr": "",
  1402. "messageTemplate": ""
  1403. },
  1404. {
  1405. "nodeName": "推送出行攻略文章",
  1406. "nextNodeCode": "TAG_AUTO",
  1407. "nodeCode": "ARTICLE_PUSH",
  1408. "maxRounds": 0,
  1409. "nodeType": 55,
  1410. "nodeConfig": "{\"delivery\":\"proactive\",\"actionOnly\":false,\"keyword\":\"云南精品线\",\"articleBaseUrl\":\"/article/detail\"}",
  1411. "sortNo": 4,
  1412. "conditionExpr": "",
  1413. "messageTemplate": ""
  1414. },
  1415. {
  1416. "nodeName": "自动打标",
  1417. "nextNodeCode": "JUDGE",
  1418. "nodeCode": "TAG_AUTO",
  1419. "maxRounds": 0,
  1420. "nodeType": 9,
  1421. "nodeConfig": "{\"sideTask\":true,\"actionOnly\":true,\"action\":\"add_tag\",\"tags\":[\"travel_lead\",\"qw_live\"],\"triggerIntents\":[\"purchase\",\"high_intent\"]}",
  1422. "sortNo": 5,
  1423. "conditionExpr": "",
  1424. "messageTemplate": ""
  1425. },
  1426. {
  1427. "nodeName": "签单动作",
  1428. "nextNodeCode": "SOP_ENROLL",
  1429. "nodeCode": "ORDER_ACTION",
  1430. "maxRounds": 0,
  1431. "nodeType": 7,
  1432. "nodeConfig": "{\"sideTask\":true,\"actionOnly\":true,\"action\":\"create_order\",\"triggerIntents\":[\"purchase\",\"order\"]}",
  1433. "sortNo": 6,
  1434. "conditionExpr": "",
  1435. "messageTemplate": ""
  1436. },
  1437. {
  1438. "nodeName": "签单后SOP入营",
  1439. "nextNodeCode": "WAIT_PRE_TRIP",
  1440. "nodeCode": "SOP_ENROLL",
  1441. "maxRounds": 0,
  1442. "nodeType": 50,
  1443. "nodeConfig": "{\"sopTempId\":\"LOBSTER_TRAVEL_POST_BOOKING\",\"wxSopTempId\":\"LOBSTER_TRAVEL_POST_BOOKING_WX\",\"preferContactAccount\":true,\"actionOnly\":true}",
  1444. "sortNo": 7,
  1445. "conditionExpr": "",
  1446. "messageTemplate": ""
  1447. },
  1448. {
  1449. "nodeName": "出行前5天等待",
  1450. "nextNodeCode": "PRE_TRIP_CARE",
  1451. "nodeCode": "WAIT_PRE_TRIP",
  1452. "maxRounds": 0,
  1453. "nodeType": 4,
  1454. "nodeConfig": "{\"waitType\":\"date_offset\",\"offsetDays\":-5,\"dateField\":\"travel_date\",\"timeoutHours\":720}",
  1455. "sortNo": 8,
  1456. "conditionExpr": "",
  1457. "messageTemplate": ""
  1458. },
  1459. {
  1460. "nodeName": "出行前提醒",
  1461. "nextNodeCode": "WEATHER_TIPS",
  1462. "nodeCode": "PRE_TRIP_CARE",
  1463. "maxRounds": 0,
  1464. "nodeType": 10,
  1465. "nodeConfig": "{\"delivery\":\"proactive\",\"careType\":\"pre_trip\",\"awaitReply\":true}",
  1466. "sortNo": 9,
  1467. "conditionExpr": "",
  1468. "messageTemplate": "您好,离您的云南精品线出行还有5天啦!请准备好身份证/护照、常用药品和舒适鞋服。需要我帮您核对行程清单吗?"
  1469. },
  1470. {
  1471. "nodeName": "天气与玩要建议",
  1472. "nextNodeCode": "IN_TRIP_CARE",
  1473. "nodeCode": "WEATHER_TIPS",
  1474. "maxRounds": 0,
  1475. "nodeType": 14,
  1476. "nodeConfig": "{\"apiKey\":\"weather_travel_tips\",\"sideTask\":false,\"smartApi\":true}",
  1477. "sortNo": 10,
  1478. "conditionExpr": "",
  1479. "messageTemplate": "根据您目的地近期天气和同行人员情况,建议您注意防晒补水、老人小孩备常用药。具体玩游项目我会结合天气给您建议。"
  1480. },
  1481. {
  1482. "nodeName": "行中关怀",
  1483. "nextNodeCode": "SURVEY",
  1484. "nodeCode": "IN_TRIP_CARE",
  1485. "maxRounds": 0,
  1486. "nodeType": 10,
  1487. "nodeConfig": "{\"delivery\":\"proactive\",\"careType\":\"in_trip\",\"awaitReply\":true}",
  1488. "sortNo": 11,
  1489. "conditionExpr": "",
  1490. "messageTemplate": "旅途还顺利吗?景点玩得怎么样?如有任何问题随时告诉我,小美一直在线。"
  1491. },
  1492. {
  1493. "nodeName": "满意度调查",
  1494. "nextNodeCode": "WAIT_HOLIDAY",
  1495. "nodeCode": "SURVEY",
  1496. "maxRounds": 0,
  1497. "nodeType": 11,
  1498. "nodeConfig": "{\"surveyType\":\"satisfaction\",\"awaitReply\":true}",
  1499. "sortNo": 12,
  1500. "conditionExpr": "",
  1501. "messageTemplate": "感谢您选择测试旅行社!方便用1分钟做个满意度调查吗?您的反馈帮我们做得更好。"
  1502. },
  1503. {
  1504. "nodeName": "节日营销等待",
  1505. "nextNodeCode": "HOLIDAY_PROMO",
  1506. "nodeCode": "WAIT_HOLIDAY",
  1507. "maxRounds": 0,
  1508. "nodeType": 32,
  1509. "nodeConfig": "{\"delayDays\":30,\"cronHint\":\"holiday_minus_30d\"}",
  1510. "sortNo": 13,
  1511. "conditionExpr": "",
  1512. "messageTemplate": ""
  1513. },
  1514. {
  1515. "nodeName": "节日营销触达",
  1516. "nextNodeCode": "END",
  1517. "nodeCode": "HOLIDAY_PROMO",
  1518. "maxRounds": 0,
  1519. "nodeType": 13,
  1520. "nodeConfig": "{\"repurchaseType\":\"holiday\",\"delivery\":\"proactive\"}",
  1521. "sortNo": 14,
  1522. "conditionExpr": "",
  1523. "messageTemplate": "您好!临近节日,想了解下您近期有没有出行计划?云南精品线有新线路优惠,感兴趣我发您看看。"
  1524. },
  1525. {
  1526. "nodeName": "意向分支",
  1527. "nextNodeCode": "",
  1528. "nodeCode": "JUDGE",
  1529. "maxRounds": 0,
  1530. "nodeType": 3,
  1531. "nodeConfig": "{}",
  1532. "sortNo": 15,
  1533. "conditionExpr": "{\"branches\":[{\"nextNodeCode\":\"ORDER_ACTION\",\"condition\":{\"field\":\"customerIntent\",\"operator\":\"eq\",\"value\":\"purchase\"},\"desc\":\"\\u7b7e\\u5355\"},{\"nextNodeCode\":\"WAIT_PRE_TRIP\",\"condition\":{\"field\":\"customerIntent\",\"operator\":\"eq\",\"value\":\"booked\"},\"desc\":\"\\u5df2\\u8ba2\\u8fdb\\u5165\\u51fa\\u884c\\u524d\"},{\"nextNodeCode\":\"HOLIDAY_PROMO\",\"condition\":{\"field\":\"customerIntent\",\"operator\":\"eq\",\"value\":\"inquiry\"},\"desc\":\"\\u7ee7\\u7eed\\u57f9\\u80b2\"}],\"defaultNodeCode\":\"WAIT_HOLIDAY\"}",
  1534. "messageTemplate": ""
  1535. },
  1536. {
  1537. "nodeName": "结束",
  1538. "nextNodeCode": "",
  1539. "nodeCode": "END",
  1540. "maxRounds": 0,
  1541. "nodeType": 5,
  1542. "nodeConfig": "{}",
  1543. "sortNo": 16,
  1544. "conditionExpr": "",
  1545. "messageTemplate": ""
  1546. }
  1547. ],
  1548. "industryType": "travel",
  1549. "templateName": "旅游销冠全链路(A旅游公司)",
  1550. "_generateParam": {
  1551. "advisorName": "小美",
  1552. "companyShortName": "测试旅行社",
  1553. "industryType": "travel",
  1554. "advisorRole": "金牌旅行顾问",
  1555. "mainProduct": "云南精品线"
  1556. },
  1557. "status": 1
  1558. },
  1559. "usedFallback": true,
  1560. "passed": true,
  1561. "workflowId": 4,
  1562. "message": "generate and confirm ok"
  1563. },
  1564. "phase2Learning": {
  1565. "hotReplayRowsBefore": 50,
  1566. "hotReplayRowsAfter": 52,
  1567. "delta": 2,
  1568. "passed": true,
  1569. "status": "ok",
  1570. "hint": "async write ok",
  1571. "message": "learning replay ok",
  1572. "verify": {
  1573. "companyId": 338,
  1574. "archiveTableExists": true,
  1575. "hotIndexExists": true,
  1576. "hotReplayRows": 52,
  1577. "eventLogRows": 52,
  1578. "archiveRows": 0,
  1579. "status": "ok"
  1580. }
  1581. },
  1582. "stress": {
  1583. "multiTurn": {
  1584. "dialogueStage": "stressMultiTurn",
  1585. "turns": 6,
  1586. "avgScore": 65.16666666666667,
  1587. "minScore": 0.0,
  1588. "passed": true,
  1589. "message": "multiTurn ok"
  1590. },
  1591. "rateLimit": {
  1592. "cooldownAt": 6,
  1593. "passed": true,
  1594. "message": "rate limit triggered",
  1595. "instanceId": 83
  1596. },
  1597. "waitWake": {
  1598. "passed": true,
  1599. "message": "lifecycle wait wake ok",
  1600. "statusAfter": "running",
  1601. "resumeIndex": 8,
  1602. "currentIndexAfter": 9,
  1603. "instanceId": 84
  1604. },
  1605. "longMessage": {
  1606. "passed": true,
  1607. "message": "long message handled",
  1608. "code": 200,
  1609. "messageLength": 11000
  1610. },
  1611. "concurrentStart": {
  1612. "passed": true,
  1613. "successCount": 3,
  1614. "instanceIds": [
  1615. 86,
  1616. 87,
  1617. 88
  1618. ],
  1619. "message": "3 burst starts ok"
  1620. },
  1621. "emptyMessage": {
  1622. "passed": true,
  1623. "code": 200,
  1624. "message": "empty message handled"
  1625. },
  1626. "completedReentry": {
  1627. "statusBeforeReentry": "completed",
  1628. "responseMsg": "工作流实例不在运行状态",
  1629. "passed": true,
  1630. "message": "completed reentry handled"
  1631. },
  1632. "instanceState": {
  1633. "passed": true,
  1634. "state": {
  1635. "variables": {
  1636. "_lobsterSimMinuteUnit": 10,
  1637. "workflowStage": "consult",
  1638. "channelType": "TEST",
  1639. "_actionOutcomes": [
  1640. ],
  1641. "activeGoals": [
  1642. ],
  1643. "_recentOutbound": [
  1644. ],
  1645. "conversationMode": "active",
  1646. "_conversationModel": "{\"stages\":[{\"code\":\"consult\",\"promptHint\":\"你是小美,测试旅行社旅行顾问。客户来自直播间,先破冰并了解是否已有出行计划。\",\"label\":\"直播加微破冰\",\"goals\":[]},{\"code\":\"collect\",\"promptHint\":\"逐步询问目的地、日期、人数、预算;一次只问一个关键问题。\",\"label\":\"需求采集打标\",\"goals\":[{\"field\":\"destination\",\"collected\":false,\"label\":\"目的地\",\"required\":true},{\"field\":\"travel_date\",\"collected\":false,\"label\":\"出行日期\",\"required\":true},{\"field\":\"budget\",\"collected\":false,\"label\":\"预算\",\"required\":true},{\"field\":\"pax\",\"collected\":false,\"label\":\"出行人数\",\"required\":true}]},{\"code\":\"offer\",\"promptHint\":\"基于采集信息推荐云南精品线,突出亮点与优惠,自然引导签单。\",\"label\":\"线路推荐促单\",\"goals\":[]},{\"code\":\"pre_trip\",\"promptHint\":\"出行前5天提醒证件、行李、当地天气与注意事项。\",\"label\":\"出行前关怀\",\"goals\":[]},{\"code\":\"in_trip\",\"promptHint\":\"行程中主动问候,询问是否遇到问题,给出景点玩要建议。\",\"label\":\"行中关怀\",\"goals\":[]},{\"code\":\"post_trip\",\"promptHint\":\"行程结束后收集满意度与改进建议。\",\"label\":\"满意度回访\",\"goals\":[]},{\"code\":\"repurchase\",\"promptHint\":\"大节日前30天关怀,了解是否有新的出行计划并推荐产品。\",\"label\":\"节日营销\",\"goals\":[]}],\"sideTasks\":[{\"triggerIntents\":[\"purchase\",\"high_intent\",\"booked\"],\"nodeCode\":\"TAG_AUTO\",\"action\":\"add_tag\",\"nodeType\":9},{\"triggerIntents\":[\"purchase\",\"order\",\"book\"],\"nodeCode\":\"ORDER_ACTION\",\"action\":\"create_order\",\"nodeType\":7}],\"defaultStage\":\"consult\",\"description\":\"旅游全链路:会话常驻,节点负责打标/签单/出行关怀/满意度/节日营销\",\"version\":2}",
  1647. "validation": true
  1648. },
  1649. "instanceId": 91,
  1650. "completedNodes": 0,
  1651. "heartbeat": {
  1652. "instanceId": 91,
  1653. "registered": true,
  1654. "lastHeartbeatTime": "Tue Jun 23 09:10:56 CST 2026",
  1655. "lastHeartbeatTimestamp": 1782177056895,
  1656. "elapsedMinutes": 0,
  1657. "timeoutMinutes": 1440,
  1658. "active": true,
  1659. "status": "active",
  1660. "message": "实例心跳正常"
  1661. },
  1662. "currentNodeName": "开始",
  1663. "startTime": "2026-06-23 09:10:55",
  1664. "currentNodeIndex": 0,
  1665. "lastActivityTime": "2026-06-23 09:10:55",
  1666. "status": "running",
  1667. "totalNodes": 16
  1668. },
  1669. "message": "instance state ok"
  1670. },
  1671. "qualityDirect": {
  1672. "rawScore": 124,
  1673. "normalizedPercent": 77.5,
  1674. "passThreshold": 120,
  1675. "passScorePercent": 75,
  1676. "floorRaw": 96,
  1677. "productionTargetMet": true,
  1678. "passed": true,
  1679. "message": "direct quality score ok"
  1680. }
  1681. }
  1682. },
  1683. "dialogueScript": {
  1684. "industryType": "travel",
  1685. "industryLabel": "旅游销冠全链路",
  1686. "stageKeys": [
  1687. "postBookingPreTripMultiTurn",
  1688. "capabilityTriggers",
  1689. "consultMultiTurn",
  1690. "postBookingLifecycle",
  1691. "bookingFunnel",
  1692. "stressMultiTurn",
  1693. "holidayPromoMultiTurn",
  1694. "preTripCareMultiTurn"
  1695. ],
  1696. "stageLineCounts": {
  1697. "postBookingPreTripMultiTurn": 3,
  1698. "capabilityTriggers": 6,
  1699. "consultMultiTurn": 6,
  1700. "postBookingLifecycle": 9,
  1701. "bookingFunnel": 10,
  1702. "stressMultiTurn": 6,
  1703. "holidayPromoMultiTurn": 3,
  1704. "preTripCareMultiTurn": 3
  1705. }
  1706. },
  1707. "qualityGateConfig": {
  1708. "enabled": true,
  1709. "passScorePercent": 75,
  1710. "targetScorePercent": 75,
  1711. "minNodeScorePercent": 60,
  1712. "minE2eAvgScorePercent": 75,
  1713. "multiturnMinAvgScorePercent": 45
  1714. },
  1715. "failures": [
  1716. ],
  1717. "passed": true,
  1718. "durationMs": 479454,
  1719. "templateIdUsed": 1
  1720. },
  1721. "profileDomain": {
  1722. "basic": {
  1723. "enabled": true,
  1724. "projectionMode": "async",
  1725. "searchMode": "db",
  1726. "esEnabled": false,
  1727. "mqConsumerEnabled": true,
  1728. "missingBeans": [
  1729. ],
  1730. "beansOk": true,
  1731. "simulationMode": "basic",
  1732. "runtime": {
  1733. "unifiedSearchTotal": 38,
  1734. "unifiedSearchMode": "db",
  1735. "searchTotal": 38,
  1736. "searchMode": "db",
  1737. "identityCount": 38,
  1738. "orderStatsSample": 0,
  1739. "qwContactSample": 0
  1740. },
  1741. "passed": true,
  1742. "message": "profile domain ready"
  1743. },
  1744. "fullSimulation": {
  1745. "enabled": true,
  1746. "projectionMode": "async",
  1747. "searchMode": "db",
  1748. "esEnabled": false,
  1749. "mqConsumerEnabled": true,
  1750. "missingBeans": [
  1751. ],
  1752. "beansOk": true,
  1753. "simulationMode": "full",
  1754. "runtime": {
  1755. "unifiedSearchTotal": 38,
  1756. "unifiedSearchMode": "db",
  1757. "searchTotal": 38,
  1758. "searchMode": "db",
  1759. "identityCount": 38,
  1760. "orderStatsSample": 0,
  1761. "qwContactSample": 0
  1762. },
  1763. "simulation": {
  1764. "patchAdapter": true,
  1765. "writePath": {
  1766. "published": true,
  1767. "readBack": true
  1768. },
  1769. "backfillLegacy": {
  1770. "type": "legacy",
  1771. "page": 1,
  1772. "size": 5,
  1773. "processed": 5,
  1774. "published": 5
  1775. },
  1776. "backfillOrders": {
  1777. "type": "order",
  1778. "page": 1,
  1779. "size": 5,
  1780. "processed": 0,
  1781. "published": 0
  1782. },
  1783. "backfillQwContacts": {
  1784. "type": "qw_contact",
  1785. "page": 1,
  1786. "size": 5,
  1787. "processed": 0,
  1788. "published": 0
  1789. }
  1790. },
  1791. "passed": true,
  1792. "message": "profile domain ready"
  1793. },
  1794. "sourceHooks": {
  1795. "companyId": 338,
  1796. "simulationMode": "source-hooks",
  1797. "sources": [
  1798. {
  1799. "source": "wx_call",
  1800. "eventCount": 1,
  1801. "eventOk": true,
  1802. "shardId": 18,
  1803. "profileKey": "__val_src_wx_call__",
  1804. "channelType": "WX",
  1805. "sourceVersion": "val:wx_call:1782177060866",
  1806. "readBack": true,
  1807. "passed": true
  1808. },
  1809. {
  1810. "source": "qw_voice",
  1811. "eventCount": 1,
  1812. "eventOk": true,
  1813. "shardId": 3,
  1814. "profileKey": "__val_src_qw_voice__",
  1815. "channelType": "QW",
  1816. "sourceVersion": "val:qw_voice:1782177060866",
  1817. "readBack": true,
  1818. "passed": true
  1819. },
  1820. {
  1821. "source": "lobster_chat",
  1822. "eventCount": 1,
  1823. "eventOk": true,
  1824. "shardId": 3,
  1825. "profileKey": "__val_src_lobster_chat__",
  1826. "channelType": "QW",
  1827. "sourceVersion": "val:lobster_chat:1782177060866",
  1828. "readBack": true,
  1829. "passed": true
  1830. },
  1831. {
  1832. "source": "crm_analyze",
  1833. "eventCount": 1,
  1834. "eventOk": true,
  1835. "shardId": 18,
  1836. "profileKey": "__val_src_crm_analyze__",
  1837. "channelType": "QW",
  1838. "sourceVersion": "val:crm_analyze:1782177060866",
  1839. "readBack": true,
  1840. "passed": true
  1841. },
  1842. {
  1843. "source": "qw_ai_analyze",
  1844. "eventCount": 1,
  1845. "eventOk": true,
  1846. "shardId": 11,
  1847. "profileKey": "__val_src_qw_ai_analyze__",
  1848. "channelType": "QW",
  1849. "sourceVersion": "val:qw_ai_analyze:1782177060866",
  1850. "readBack": true,
  1851. "passed": true
  1852. },
  1853. {
  1854. "source": "qw_contact",
  1855. "eventCount": 1,
  1856. "eventOk": true,
  1857. "shardId": 14,
  1858. "profileKey": "__val_src_qw_contact__",
  1859. "channelType": "QW",
  1860. "sourceVersion": "val:qw_contact:1782177060866",
  1861. "readBack": true,
  1862. "passed": true
  1863. },
  1864. {
  1865. "source": "qw_tag",
  1866. "eventCount": 1,
  1867. "eventOk": true,
  1868. "shardId": 27,
  1869. "profileKey": "__val_src_qw_tag__",
  1870. "channelType": "QW",
  1871. "sourceVersion": "val:qw_tag:1782177060866",
  1872. "readBack": true,
  1873. "passed": true
  1874. },
  1875. {
  1876. "source": "order",
  1877. "eventCount": 1,
  1878. "eventOk": true,
  1879. "shardId": 29,
  1880. "profileKey": "__val_src_order__",
  1881. "channelType": "QW",
  1882. "sourceVersion": "val:order:1782177060866",
  1883. "readBack": true,
  1884. "passed": true
  1885. },
  1886. {
  1887. "source": "course_watch",
  1888. "eventCount": 1,
  1889. "eventOk": true,
  1890. "shardId": 20,
  1891. "profileKey": "__val_src_course_watch__",
  1892. "channelType": "QW",
  1893. "sourceVersion": "val:course_watch:1782177060866",
  1894. "readBack": true,
  1895. "passed": true
  1896. },
  1897. {
  1898. "source": "live_watch",
  1899. "variant": "meta",
  1900. "eventCount": 1,
  1901. "eventOk": true,
  1902. "shardId": 15,
  1903. "profileKey": "__val_src_live_watch__",
  1904. "channelType": "QW",
  1905. "sourceVersion": "val:live:1782177060866:meta",
  1906. "readBack": true,
  1907. "passed": true
  1908. },
  1909. {
  1910. "source": "live_watch",
  1911. "variant": "counter",
  1912. "eventCount": 1,
  1913. "eventOk": true,
  1914. "shardId": 15,
  1915. "profileKey": "__val_src_live_watch__",
  1916. "channelType": "QW",
  1917. "sourceVersion": "val:live:1782177060866:cnt:1",
  1918. "readBack": true,
  1919. "passed": true
  1920. },
  1921. {
  1922. "source": "sop",
  1923. "eventCount": 1,
  1924. "eventOk": true,
  1925. "shardId": 20,
  1926. "profileKey": "__val_src_sop__",
  1927. "channelType": "QW",
  1928. "sourceVersion": "val:sop:1782177060866",
  1929. "readBack": true,
  1930. "passed": true
  1931. }
  1932. ],
  1933. "passedCount": 12,
  1934. "totalCount": 12,
  1935. "passed": true,
  1936. "message": "all source hooks simulated and verified"
  1937. },
  1938. "passed": true,
  1939. "message": "profile domain all validations passed"
  1940. },
  1941. "semanticFull": {
  1942. "companyId": 338,
  1943. "sections": {
  1944. "semanticKeywordContext": {
  1945. "passed": true,
  1946. "caseCount": 8,
  1947. "message": "all semantic context cases passed"
  1948. },
  1949. "catalogValidation": {
  1950. "companyId": 338,
  1951. "categories": {
  1952. "custom_keywords": {
  1953. "keywordCount": 129,
  1954. "totalCases": 258,
  1955. "passedCases": 258,
  1956. "passed": true,
  1957. "failures": [
  1958. ],
  1959. "failureSampleCount": 0,
  1960. "message": "all 258 checks passed for 129 words"
  1961. },
  1962. "positive_custom": {
  1963. "keywordCount": 107,
  1964. "totalCases": 214,
  1965. "passedCases": 214,
  1966. "passed": true,
  1967. "failures": [
  1968. ],
  1969. "failureSampleCount": 0,
  1970. "message": "all 214 checks passed for 107 words"
  1971. },
  1972. "negative_custom": {
  1973. "keywordCount": 108,
  1974. "totalCases": 216,
  1975. "passedCases": 216,
  1976. "passed": true,
  1977. "failures": [
  1978. ],
  1979. "failureSampleCount": 0,
  1980. "message": "all 216 checks passed for 108 words"
  1981. },
  1982. "soft_refusal": {
  1983. "keywordCount": 56,
  1984. "totalCases": 168,
  1985. "passedCases": 168,
  1986. "passed": true,
  1987. "failures": [
  1988. ],
  1989. "failureSampleCount": 0,
  1990. "message": "all 168 checks passed for 56 words"
  1991. },
  1992. "handoff_trigger": {
  1993. "keywordCount": 78,
  1994. "totalCases": 390,
  1995. "passedCases": 390,
  1996. "passed": true,
  1997. "failures": [
  1998. ],
  1999. "failureSampleCount": 0,
  2000. "message": "all 390 checks passed for 78 words"
  2001. },
  2002. "sarcasm": {
  2003. "keywordCount": 61,
  2004. "totalCases": 122,
  2005. "passedCases": 122,
  2006. "passed": true,
  2007. "failures": [
  2008. ],
  2009. "failureSampleCount": 0,
  2010. "message": "all 122 checks passed for 61 words"
  2011. },
  2012. "_combos": {
  2013. "totalCases": 6,
  2014. "passedCases": 6,
  2015. "passed": true,
  2016. "failures": [
  2017. ],
  2018. "message": "combo checks ok"
  2019. }
  2020. },
  2021. "categoryCount": 6,
  2022. "totalCases": 1374,
  2023. "passedCases": 1374,
  2024. "failedCases": 0,
  2025. "failures": [
  2026. ],
  2027. "failureTruncated": false,
  2028. "passed": true,
  2029. "durationMs": 89098,
  2030. "message": "catalog validation passed (1374 cases across 6 categories)"
  2031. }
  2032. },
  2033. "contextCases": [
  2034. {
  2035. "id": "soft_refusal_first",
  2036. "input": "下个月再说 (empty ctx)",
  2037. "expected": "L2 pause, not exclude",
  2038. "actual": "L2_SOFT_REFUSAL exclude=false reason=soft_refusal",
  2039. "passed": true
  2040. },
  2041. {
  2042. "id": "soft_refusal_second",
  2043. "input": "下个月再说 (_softRefusalCount=1)",
  2044. "expected": "L4 exclude (repeated)",
  2045. "actual": "L4_EXCLUDE exclude=true reason=repeated_soft_refusal",
  2046. "passed": true
  2047. },
  2048. {
  2049. "id": "handoff_first_neutral",
  2050. "input": "了解一下人工 -\u003e keyword 人工 (neutral)",
  2051. "expected": "no transfer, count=1",
  2052. "actual": "takeover=false count=1 reason=Handoff trigger noted (session 1, awaiting confirmation): 人工",
  2053. "passed": true
  2054. },
  2055. {
  2056. "id": "handoff_second_confirm",
  2057. "input": "转人工 (_handoffTriggerCount=1)",
  2058. "expected": "transfer on 2nd hit",
  2059. "actual": "takeover=true reason=Handoff trigger (session escalated x2): 人工",
  2060. "passed": true
  2061. },
  2062. {
  2063. "id": "negation_handoff",
  2064. "input": "不转人工",
  2065. "expected": "no handoff",
  2066. "actual": "takeover=false",
  2067. "passed": true
  2068. },
  2069. {
  2070. "id": "negation_soft_refusal",
  2071. "input": "别下个月",
  2072. "expected": "no soft refusal",
  2073. "actual": "null reason=null",
  2074. "passed": true
  2075. },
  2076. {
  2077. "id": "positive_sentiment_soft",
  2078. "input": "很满意,价格多少 (positive ctx)",
  2079. "expected": "no soft refusal",
  2080. "actual": "null exclude=false",
  2081. "passed": true
  2082. },
  2083. {
  2084. "id": "positive_sentiment_handoff",
  2085. "input": "很满意,价格多少 (positive ctx, no handoff keyword)",
  2086. "expected": "no handoff misfire",
  2087. "actual": "takeover=false reason=客户情绪正面(满意),仅询问价格,属于简单咨询,无需转接更专业支持",
  2088. "passed": true
  2089. }
  2090. ],
  2091. "failures": [
  2092. ],
  2093. "passed": true,
  2094. "durationMs": 97734,
  2095. "totalCases": 1382,
  2096. "passedCases": 1382,
  2097. "message": "semantic keyword full validation passed"
  2098. }
  2099. },
  2100. "integrationWarning": "2/4 tests passed in 1631ms",
  2101. "failures": [
  2102. ],
  2103. "passed": true,
  2104. "durationMs": 585627,
  2105. "pageCount": 29,
  2106. "requiredPagesPassed": "15/15"
  2107. }