myagent-ai 1.15.32 → 1.15.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/agents/base.py +1 -0
  2. package/agents/main_agent.py +187 -73
  3. package/agents/memory_agent.py +93 -5
  4. package/config.py +2 -1
  5. package/core/context_builder.py +279 -63
  6. package/core/deps_checker.py +27 -72
  7. package/core/llm.py +4 -0
  8. package/core/output_parser.py +428 -394
  9. package/departments/manager.py +4 -0
  10. package/main.py +34 -53
  11. package/memory/manager.py +204 -27
  12. package/package.json +1 -1
  13. package/requirements.txt +14 -4
  14. package/setup.py +12 -8
  15. package/skills/browser_skill.py +24 -768
  16. package/skills/chromedev_mcp.py +933 -0
  17. package/skills/registry.py +6 -239
  18. package/skills/search_skill.py +88 -25
  19. package/start.js +3 -4
  20. package/start.sh +2 -2
  21. package/web/api_server.py +612 -195
  22. package/web/ui/chat/chat.css +45 -191
  23. package/web/ui/chat/chat.js +16 -39
  24. package/web/ui/chat/chat_container.html +256 -12
  25. package/web/ui/chat/chat_main.js +669 -488
  26. package/web/ui/chat/flow_engine.js +416 -192
  27. package/web/ui/chat/groupchat.js +1 -3
  28. package/web/ui/chat/left_sessions.html +1 -1
  29. package/web/ui/chat/middle_chat.html +4 -21
  30. package/web/ui/chat/right_agents.html +1 -1
  31. package/web/ui/index.html +231 -200
  32. package/skills/ASR/LICENSE.txt +0 -21
  33. package/skills/ASR/SKILL.md +0 -580
  34. package/skills/ASR/scripts/asr.ts +0 -27
  35. package/skills/LLM/LICENSE.txt +0 -21
  36. package/skills/LLM/SKILL.md +0 -856
  37. package/skills/LLM/scripts/chat.ts +0 -32
  38. package/skills/TTS/LICENSE.txt +0 -21
  39. package/skills/TTS/SKILL.md +0 -735
  40. package/skills/TTS/scripts/tts.ts +0 -25
  41. package/skills/VLM/LICENSE.txt +0 -21
  42. package/skills/VLM/SKILL.md +0 -621
  43. package/skills/VLM/scripts/vlm.ts +0 -57
  44. package/skills/agent-browser/SKILL.md +0 -327
  45. package/skills/ai-news-collectors/SKILL.md +0 -157
  46. package/skills/ai-news-collectors/_meta.json +0 -6
  47. package/skills/ai-news-collectors/references/sources.md +0 -128
  48. package/skills/aminer-open-academic/SKILL.md +0 -312
  49. package/skills/aminer-open-academic/_meta.json +0 -6
  50. package/skills/aminer-open-academic/evals/evals.json +0 -46
  51. package/skills/aminer-open-academic/references/api-catalog.md +0 -1032
  52. package/skills/aminer-open-academic/scripts/aminer_client.py +0 -875
  53. package/skills/auto-target-tracker/SKILL.md +0 -316
  54. package/skills/charts/LICENSE.txt +0 -13
  55. package/skills/charts/SKILL.md +0 -427
  56. package/skills/charts/references/_rules.md +0 -49
  57. package/skills/charts/references/d3.md +0 -199
  58. package/skills/charts/references/echarts.md +0 -651
  59. package/skills/charts/references/matplotlib.md +0 -617
  60. package/skills/charts/references/mermaid.md +0 -797
  61. package/skills/charts/references/mindmap-css.md +0 -911
  62. package/skills/charts/references/playwright-css.md +0 -801
  63. package/skills/charts/references/radial-grid.md +0 -576
  64. package/skills/charts/references/seaborn.md +0 -324
  65. package/skills/charts/setup.sh +0 -228
  66. package/skills/coding-agent/SKILL.md +0 -119
  67. package/skills/coding-agent/_meta.json +0 -6
  68. package/skills/coding-agent/criteria.md +0 -48
  69. package/skills/coding-agent/execution.md +0 -42
  70. package/skills/coding-agent/memory-template.md +0 -38
  71. package/skills/coding-agent/planning.md +0 -31
  72. package/skills/coding-agent/state.md +0 -60
  73. package/skills/coding-agent/verification.md +0 -39
  74. package/skills/contentanalysis/ExtractWisdom/SKILL.md +0 -226
  75. package/skills/contentanalysis/ExtractWisdom/Workflows/Extract.md +0 -60
  76. package/skills/contentanalysis/SKILL.md +0 -14
  77. package/skills/docx/CHANGELOG.md +0 -85
  78. package/skills/docx/LICENSE.txt +0 -13
  79. package/skills/docx/SKILL.md +0 -200
  80. package/skills/docx/docx-js.md +0 -681
  81. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  82. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  83. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  84. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  85. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  86. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  87. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  88. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  89. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  90. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  91. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  92. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  93. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  94. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  95. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  96. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  97. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  98. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  99. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  100. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  101. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  102. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  103. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  104. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  105. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  106. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  107. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  108. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  109. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  110. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  111. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  112. package/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
  113. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  114. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  115. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  116. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  117. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  118. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  119. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  120. package/skills/docx/ooxml/scripts/pack.py +0 -159
  121. package/skills/docx/ooxml/scripts/unpack.py +0 -29
  122. package/skills/docx/ooxml/scripts/validate.py +0 -69
  123. package/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
  124. package/skills/docx/ooxml/scripts/validation/base.py +0 -951
  125. package/skills/docx/ooxml/scripts/validation/docx.py +0 -274
  126. package/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
  127. package/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
  128. package/skills/docx/ooxml.md +0 -615
  129. package/skills/docx/references/chart-templates.md +0 -386
  130. package/skills/docx/references/common-rules.md +0 -419
  131. package/skills/docx/references/decorations.md +0 -538
  132. package/skills/docx/references/design-system.md +0 -1797
  133. package/skills/docx/references/docx-js-advanced.md +0 -257
  134. package/skills/docx/references/docx-js-core.md +0 -333
  135. package/skills/docx/references/faq.md +0 -323
  136. package/skills/docx/references/math-formulas.md +0 -276
  137. package/skills/docx/references/ooxml.md +0 -222
  138. package/skills/docx/references/toc.md +0 -254
  139. package/skills/docx/routes/comment.md +0 -88
  140. package/skills/docx/routes/create.md +0 -207
  141. package/skills/docx/routes/edit.md +0 -115
  142. package/skills/docx/routes/format.md +0 -120
  143. package/skills/docx/routes/read.md +0 -114
  144. package/skills/docx/scenes/academic.md +0 -783
  145. package/skills/docx/scenes/contract.md +0 -463
  146. package/skills/docx/scenes/copywriting.md +0 -139
  147. package/skills/docx/scenes/exam.md +0 -698
  148. package/skills/docx/scenes/official-doc.md +0 -411
  149. package/skills/docx/scenes/report.md +0 -340
  150. package/skills/docx/scenes/resume.md +0 -534
  151. package/skills/docx/scripts/__init__.py +0 -1
  152. package/skills/docx/scripts/add_toc_placeholders.py +0 -749
  153. package/skills/docx/scripts/document.py +0 -1333
  154. package/skills/docx/scripts/postcheck.py +0 -807
  155. package/skills/docx/scripts/templates/comments.xml +0 -3
  156. package/skills/docx/scripts/templates/commentsExtended.xml +0 -3
  157. package/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
  158. package/skills/docx/scripts/templates/commentsIds.xml +0 -3
  159. package/skills/docx/scripts/templates/people.xml +0 -3
  160. package/skills/docx/scripts/utilities.py +0 -374
  161. package/skills/docx/setup.sh +0 -177
  162. package/skills/finance/Finance_API_Doc.md +0 -445
  163. package/skills/finance/SKILL.md +0 -53
  164. package/skills/gift-evaluator/SKILL.md +0 -83
  165. package/skills/gift-evaluator/html_tools.py +0 -268
  166. package/skills/image-edit/LICENSE.txt +0 -21
  167. package/skills/image-edit/SKILL.md +0 -896
  168. package/skills/image-edit/scripts/image-edit.ts +0 -36
  169. package/skills/image-generation/LICENSE.txt +0 -21
  170. package/skills/image-generation/SKILL.md +0 -583
  171. package/skills/image-generation/scripts/image-generation.ts +0 -28
  172. package/skills/market-research-reports/SKILL.md +0 -901
  173. package/skills/market-research-reports/assets/FORMATTING_GUIDE.md +0 -428
  174. package/skills/market-research-reports/assets/market_report_template.tex +0 -1380
  175. package/skills/market-research-reports/assets/market_research.sty +0 -564
  176. package/skills/market-research-reports/references/data_analysis_patterns.md +0 -548
  177. package/skills/market-research-reports/references/report_structure_guide.md +0 -999
  178. package/skills/market-research-reports/references/visual_generation_guide.md +0 -1077
  179. package/skills/market-research-reports/scripts/generate_market_visuals.py +0 -529
  180. package/skills/marketing-mode/README.md +0 -49
  181. package/skills/marketing-mode/SKILL.md +0 -677
  182. package/skills/marketing-mode/_meta.json +0 -6
  183. package/skills/marketing-mode/mode-prompt.md +0 -39
  184. package/skills/marketing-mode/skill.json +0 -20
  185. package/skills/pdf/LICENSE.txt +0 -13
  186. package/skills/pdf/SKILL.md +0 -927
  187. package/skills/pdf/briefs/academic.md +0 -1049
  188. package/skills/pdf/briefs/creative.md +0 -770
  189. package/skills/pdf/briefs/poster.md +0 -702
  190. package/skills/pdf/briefs/process-advanced.md +0 -284
  191. package/skills/pdf/briefs/process.md +0 -319
  192. package/skills/pdf/briefs/report.md +0 -1657
  193. package/skills/pdf/configs/components.md +0 -153
  194. package/skills/pdf/configs/fonts.md +0 -93
  195. package/skills/pdf/configs/visual_framework.md +0 -263
  196. package/skills/pdf/forms.md +0 -205
  197. package/skills/pdf/reference.md +0 -765
  198. package/skills/pdf/references/resume-academic.tex +0 -130
  199. package/skills/pdf/references/resume-altacv.tex +0 -190
  200. package/skills/pdf/scripts/add_zai_metadata.py +0 -172
  201. package/skills/pdf/scripts/check_bounding_boxes.py +0 -70
  202. package/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
  203. package/skills/pdf/scripts/check_fillable_fields.py +0 -12
  204. package/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
  205. package/skills/pdf/scripts/cover_validate.js +0 -367
  206. package/skills/pdf/scripts/create_validation_image.py +0 -41
  207. package/skills/pdf/scripts/design_engine.py +0 -2816
  208. package/skills/pdf/scripts/extract_form_field_info.py +0 -152
  209. package/skills/pdf/scripts/fill_fillable_fields.py +0 -114
  210. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
  211. package/skills/pdf/scripts/html2pdf-next.js +0 -754
  212. package/skills/pdf/scripts/html2poster.js +0 -256
  213. package/skills/pdf/scripts/pdf.py +0 -2959
  214. package/skills/pdf/scripts/pdf_qa.py +0 -901
  215. package/skills/pdf/scripts/poster_validate.py +0 -1337
  216. package/skills/pdf/scripts/sanitize_code.py +0 -110
  217. package/skills/pdf/scripts/setup.sh +0 -269
  218. package/skills/pdf/scripts/tectonic +0 -0
  219. package/skills/pdf/scripts/toc_validate.py +0 -2075
  220. package/skills/pdf/typesetting/charts.md +0 -320
  221. package/skills/pdf/typesetting/cover-backgrounds.md +0 -384
  222. package/skills/pdf/typesetting/cover.md +0 -1442
  223. package/skills/pdf/typesetting/fill-engine.md +0 -527
  224. package/skills/pdf/typesetting/geometry.md +0 -142
  225. package/skills/pdf/typesetting/overflow.md +0 -630
  226. package/skills/pdf/typesetting/pagination.md +0 -367
  227. package/skills/pdf/typesetting/palette.md +0 -217
  228. package/skills/pdf/typesetting/typography.md +0 -20
  229. package/skills/podcast-generate/LICENSE.txt +0 -21
  230. package/skills/podcast-generate/SKILL.md +0 -198
  231. package/skills/podcast-generate/generate.ts +0 -661
  232. package/skills/podcast-generate/package.json +0 -30
  233. package/skills/podcast-generate/readme.md +0 -177
  234. package/skills/podcast-generate/test_data/segments.jsonl +0 -3
  235. package/skills/podcast-generate/tsconfig.json +0 -26
  236. package/skills/ppt/LICENSE.txt +0 -13
  237. package/skills/ppt/SKILL.md +0 -436
  238. package/skills/ppt/beamer.md +0 -1457
  239. package/skills/ppt/components.md +0 -1634
  240. package/skills/ppt/data-viz-components.md +0 -529
  241. package/skills/ppt/design-system.md +0 -206
  242. package/skills/ppt/html2pptx.md +0 -394
  243. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  244. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  245. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  246. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  247. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  248. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  249. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  250. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  251. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  252. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  253. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  254. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  255. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  256. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  257. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  258. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  259. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  260. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  261. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  262. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  263. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  264. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  265. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  266. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  267. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  268. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  269. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  270. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  271. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  272. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  273. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  274. package/skills/ppt/ooxml/schemas/mce/mc.xsd +0 -75
  275. package/skills/ppt/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  276. package/skills/ppt/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  277. package/skills/ppt/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  278. package/skills/ppt/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  279. package/skills/ppt/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  280. package/skills/ppt/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  281. package/skills/ppt/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  282. package/skills/ppt/ooxml/scripts/pack.py +0 -159
  283. package/skills/ppt/ooxml/scripts/unpack.py +0 -29
  284. package/skills/ppt/ooxml/scripts/validate.py +0 -69
  285. package/skills/ppt/ooxml/scripts/validation/__init__.py +0 -15
  286. package/skills/ppt/ooxml/scripts/validation/base.py +0 -951
  287. package/skills/ppt/ooxml/scripts/validation/docx.py +0 -274
  288. package/skills/ppt/ooxml/scripts/validation/pptx.py +0 -315
  289. package/skills/ppt/ooxml/scripts/validation/redlining.py +0 -279
  290. package/skills/ppt/ooxml.md +0 -427
  291. package/skills/ppt/references/beamer.md +0 -721
  292. package/skills/ppt/references/latex.md +0 -342
  293. package/skills/ppt/references/paper-navbar.tex +0 -73
  294. package/skills/ppt/references/progress-navbar.tex +0 -151
  295. package/skills/ppt/scripts/html2pptx.js +0 -1329
  296. package/skills/ppt/scripts/inventory.py +0 -512
  297. package/skills/ppt/scripts/pdf.py +0 -2959
  298. package/skills/ppt/scripts/rearrange.py +0 -135
  299. package/skills/ppt/scripts/replace.py +0 -231
  300. package/skills/ppt/scripts/tectonic +0 -0
  301. package/skills/ppt/scripts/thumbnail.py +0 -352
  302. package/skills/ppt/setup.sh +0 -197
  303. package/skills/ppt/themes.md +0 -506
  304. package/skills/qingyan-research/SKILL.md +0 -294
  305. package/skills/qingyan-research/generate_html.py +0 -33
  306. package/skills/seo-content-writer/SKILL.md +0 -625
  307. package/skills/seo-content-writer/_meta.json +0 -6
  308. package/skills/seo-content-writer/references/content-structure-templates.md +0 -875
  309. package/skills/seo-content-writer/references/title-formulas.md +0 -339
  310. package/skills/skill-creator/LICENSE.txt +0 -202
  311. package/skills/skill-creator/SKILL.md +0 -485
  312. package/skills/skill-creator/agents/analyzer.md +0 -274
  313. package/skills/skill-creator/agents/comparator.md +0 -202
  314. package/skills/skill-creator/agents/grader.md +0 -223
  315. package/skills/skill-creator/assets/eval_review.html +0 -146
  316. package/skills/skill-creator/eval-viewer/generate_review.py +0 -471
  317. package/skills/skill-creator/eval-viewer/viewer.html +0 -1325
  318. package/skills/skill-creator/references/schemas.md +0 -430
  319. package/skills/skill-creator/scripts/__init__.py +0 -0
  320. package/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
  321. package/skills/skill-creator/scripts/generate_report.py +0 -326
  322. package/skills/skill-creator/scripts/improve_description.py +0 -236
  323. package/skills/skill-creator/scripts/package_skill.py +0 -136
  324. package/skills/skill-creator/scripts/quick_validate.py +0 -103
  325. package/skills/skill-creator/scripts/run_eval.py +0 -310
  326. package/skills/skill-creator/scripts/run_loop.py +0 -328
  327. package/skills/skill-creator/scripts/utils.py +0 -47
  328. package/skills/stock-analysis-skill/SKILL.md +0 -156
  329. package/skills/stock-analysis-skill/package.json +0 -21
  330. package/skills/stock-analysis-skill/src/analyzer.ts +0 -264
  331. package/skills/stock-analysis-skill/src/dataFetcher.ts +0 -130
  332. package/skills/stock-analysis-skill/src/dividend.ts +0 -226
  333. package/skills/stock-analysis-skill/src/index.ts +0 -327
  334. package/skills/stock-analysis-skill/src/rumorScanner.ts +0 -200
  335. package/skills/stock-analysis-skill/src/types.ts +0 -167
  336. package/skills/stock-analysis-skill/src/watchlist.ts +0 -308
  337. package/skills/stock-analysis-skill/tsconfig.json +0 -15
  338. package/skills/storyboard-manager/SKILL.md +0 -532
  339. package/skills/storyboard-manager/index.js +0 -9
  340. package/skills/storyboard-manager/package.json +0 -11
  341. package/skills/storyboard-manager/references/character_development.md +0 -232
  342. package/skills/storyboard-manager/references/story_structures.md +0 -148
  343. package/skills/storyboard-manager/scripts/consistency_checker.py +0 -391
  344. package/skills/storyboard-manager/scripts/timeline_tracker.py +0 -352
  345. package/skills/ui-ux-pro-max/SKILL.md +0 -43
  346. package/skills/ui-ux-pro-max/_meta.json +0 -6
  347. package/skills/ui-ux-pro-max/assets/data/charts.csv +0 -26
  348. package/skills/ui-ux-pro-max/assets/data/colors.csv +0 -97
  349. package/skills/ui-ux-pro-max/assets/data/icons.csv +0 -101
  350. package/skills/ui-ux-pro-max/assets/data/landing.csv +0 -31
  351. package/skills/ui-ux-pro-max/assets/data/products.csv +0 -97
  352. package/skills/ui-ux-pro-max/assets/data/react-performance.csv +0 -45
  353. package/skills/ui-ux-pro-max/assets/data/stacks/astro.csv +0 -54
  354. package/skills/ui-ux-pro-max/assets/data/stacks/flutter.csv +0 -53
  355. package/skills/ui-ux-pro-max/assets/data/stacks/html-tailwind.csv +0 -56
  356. package/skills/ui-ux-pro-max/assets/data/stacks/jetpack-compose.csv +0 -53
  357. package/skills/ui-ux-pro-max/assets/data/stacks/nextjs.csv +0 -53
  358. package/skills/ui-ux-pro-max/assets/data/stacks/nuxt-ui.csv +0 -51
  359. package/skills/ui-ux-pro-max/assets/data/stacks/nuxtjs.csv +0 -59
  360. package/skills/ui-ux-pro-max/assets/data/stacks/react-native.csv +0 -52
  361. package/skills/ui-ux-pro-max/assets/data/stacks/react.csv +0 -54
  362. package/skills/ui-ux-pro-max/assets/data/stacks/shadcn.csv +0 -61
  363. package/skills/ui-ux-pro-max/assets/data/stacks/svelte.csv +0 -54
  364. package/skills/ui-ux-pro-max/assets/data/stacks/swiftui.csv +0 -51
  365. package/skills/ui-ux-pro-max/assets/data/stacks/vue.csv +0 -50
  366. package/skills/ui-ux-pro-max/assets/data/styles.csv +0 -68
  367. package/skills/ui-ux-pro-max/assets/data/typography.csv +0 -58
  368. package/skills/ui-ux-pro-max/assets/data/ui-reasoning.csv +0 -101
  369. package/skills/ui-ux-pro-max/assets/data/ux-guidelines.csv +0 -100
  370. package/skills/ui-ux-pro-max/assets/data/web-interface.csv +0 -31
  371. package/skills/ui-ux-pro-max/references/upstream-README.md +0 -488
  372. package/skills/ui-ux-pro-max/references/upstream-skill-content.md +0 -288
  373. package/skills/ui-ux-pro-max/scripts/__init__.py +0 -0
  374. package/skills/ui-ux-pro-max/scripts/core.py +0 -253
  375. package/skills/ui-ux-pro-max/scripts/design_system.py +0 -1071
  376. package/skills/ui-ux-pro-max/scripts/search.py +0 -111
  377. package/skills/video-generation/LICENSE.txt +0 -21
  378. package/skills/video-generation/SKILL.md +0 -1082
  379. package/skills/video-generation/scripts/video.ts +0 -168
  380. package/skills/web-reader/LICENSE.txt +0 -21
  381. package/skills/web-reader/SKILL.md +0 -1140
  382. package/skills/web-reader/scripts/web-reader.ts +0 -37
  383. package/skills/web-search/LICENSE.txt +0 -21
  384. package/skills/web-search/SKILL.md +0 -912
  385. package/skills/web-search/scripts/web_search.ts +0 -44
  386. package/skills/web-shader-extractor/SKILL.md +0 -145
  387. package/skills/web-shader-extractor/references/config-extraction.md +0 -50
  388. package/skills/web-shader-extractor/references/encoded-definitions.md +0 -53
  389. package/skills/web-shader-extractor/references/extraction-workflow.md +0 -61
  390. package/skills/web-shader-extractor/references/porting-strategy.md +0 -164
  391. package/skills/web-shader-extractor/references/shader-injection.md +0 -126
  392. package/skills/web-shader-extractor/references/shaders-com.md +0 -190
  393. package/skills/web-shader-extractor/references/tech-signatures.md +0 -54
  394. package/skills/web-shader-extractor/references/tsl-extraction.md +0 -41
  395. package/skills/web-shader-extractor/references/unicorn-studio.md +0 -353
  396. package/skills/web-shader-extractor/scripts/fetch-rendered-dom.mjs +0 -153
  397. package/skills/web-shader-extractor/scripts/scan-bundle.sh +0 -76
  398. package/skills/writing-plans/SKILL.md +0 -113
  399. package/skills/writing-plans/_meta.json +0 -6
  400. package/skills/xlsx/LICENSE.txt +0 -13
  401. package/skills/xlsx/SKILL.md +0 -230
  402. package/skills/xlsx/engines/chart-templates.md +0 -167
  403. package/skills/xlsx/engines/chart.md +0 -87
  404. package/skills/xlsx/engines/design.md +0 -575
  405. package/skills/xlsx/engines/vba-templates.md +0 -435
  406. package/skills/xlsx/quality/pipeline.md +0 -196
  407. package/skills/xlsx/recalc.py +0 -178
  408. package/skills/xlsx/scenes/advanced.md +0 -271
  409. package/skills/xlsx/scenes/analyze-recipes.md +0 -234
  410. package/skills/xlsx/scenes/analyze.md +0 -95
  411. package/skills/xlsx/scenes/convert.md +0 -133
  412. package/skills/xlsx/scenes/create.md +0 -105
  413. package/skills/xlsx/scenes/edit-patterns.md +0 -222
  414. package/skills/xlsx/scenes/edit.md +0 -195
  415. package/skills/xlsx/scenes/finance.md +0 -318
  416. package/skills/xlsx/scenes/finance_lite.md +0 -192
  417. package/skills/xlsx/scenes/vba.md +0 -298
  418. package/skills/xlsx/setup.sh +0 -136
  419. package/skills/xlsx/templates/base.py +0 -632
  420. package/skills/xlsx/templates/palettes.py +0 -521
  421. package/skills/xlsx/xlsx.py +0 -1299
package/agents/base.py CHANGED
@@ -367,6 +367,7 @@ class BaseAgent(ABC):
367
367
  tool_calls=final_tool_calls,
368
368
  finish_reason=finish_reason,
369
369
  model=request_kwargs.get("model", self.llm.model),
370
+ reasoning=full_reasoning,
370
371
  )
371
372
  except Exception as e:
372
373
  logger.error(f"LLM 流式调用失败: {e}")
@@ -6,6 +6,7 @@ agents/main_agent.py - 主 Agent
6
6
  from __future__ import annotations
7
7
 
8
8
  import asyncio
9
+ import re
9
10
  from typing import Any, Callable, Dict, List, Optional
10
11
 
11
12
  from core.logger import get_logger
@@ -42,41 +43,48 @@ class MainAgent(BaseAgent):
42
43
  严格以XML格式化输出以下内容:
43
44
  <output>
44
45
  <response>直接回复用户的内容。这是一段友好、自然的话语,用于向用户说明你正在做什么,或者回应用户的问题/问候。要求简洁、有礼貌、符合对话场景。如果用户只是问候,简单回应即可;如果用户有具体任务,要说明你的计划。</response>
45
- <usersays_correct>根据用户输入的"usersays"内容,结合上下文优化为新的用户输入,如果"usersays"为空,这里输出为空。</usersays_correct>
46
- <task_plan>如"context"包含非空"task_plan",则更新它,变为当前输出。否则,根据"context", 以MD 的格式,制定新任务列表。</task_plan>
46
+ <usersays_correct>根据用户输入的"usersays"内容(语音转写文本),结合对话语境优化为更准确的用户意图表达(修正识别错误、补充标点、口语转书面语)。如果"usersays"为空,这里输出为空。</usersays_correct>
47
+ <task_plan>任务计划(仅复杂任务使用):如"context"包含非空"task_plan",则更新它。否则,先评估任务复杂度——如果预计操作步骤不超过3步(如:单次查询、简单问答、格式转换、单文件修改、简单计算等简单任务),则<task_plan>输出为空,不要创建任务列表;只有当任务较复杂(预计超过3步操作,如:多文件修改、需要调研+实现+测试、涉及多个模块联动等),才以Markdown列表格式制定新任务列表。格式:每项用 "- [ ] 任务描述" "- [x] 已完成任务",含完成状态标记。</task_plan>
47
48
 
48
49
  <toolstocal>
49
50
  <tool><beforecalltext>连接词,介绍调用什么工具,达到什么目的。</beforecalltext><toolname>工具名</toolname><parms>JSON格式的参数对象,例如: {"query": "搜索关键词", "num": 5}</parms><timeout>预估超时时限(秒)</timeout><callback>true/false,要求解析器在该工具执行完后是否要回调llm大模型,将所有工具输出结果+新构造的"context"输入给llm</callback></tool>
50
51
  </toolstocal>
51
52
  <remember><type>global或session</type><content>仅从最新用户输入(userprint 或 usersays_correct)中提炼值得记忆的信息(如用户偏好、重要结论、错误经验等)。type=global表示跨会话全局记忆,type=session表示仅当前会话可用的记忆。如果本轮没有新信息需要记忆,则<content>为空、<type>不填。</content></remember>
52
- <recall>下一轮执行需要调取的记忆,这里要设计接上记忆库</recall>
53
+ <recall>下一轮需要主动召回的记忆描述。填写需要从记忆库中检索的关键字或描述。如果不填写则为空。如果需要更多记忆支持当前任务,填写相关关键词(可包含时间参考,如"2025年1月的项目"),系统将在下一轮搜索top5相关记忆并通过<recall_memory>注入上下文。你也可以直接调用recall_memory工具即时搜索。</recall>
53
54
  <knowledge>从本轮对话或工具执行结果中提炼值得长期保存到知识库的专业知识、事实、经验法则、技术要点等。这些知识将被持久化存储,未来可通过 <get_knowledge> 检索复用。如果本轮没有需要保存的知识,则为空。格式要求:简洁明确,每条知识一行,用换行分隔。</knowledge>
54
55
  <get_knowledge>下一轮执行时需要从知识库搜索获得的知识,填写检索关键词或描述。如context中已包含充足的<knowledge>内容,则为空。如需更多专业知识支撑,则填写相关搜索词。</get_knowledge>
55
56
  <askuser>需要询问用户的内容,如无,则为空</askuser>
56
57
  <finish>true/false,是否结束循环调用llm。如"askuser"为非空,则"finish"输出true。否则,根据"context"判断任务是否已完成,是否结束llm回调</finish>
57
58
  <finish_reason>当 finish=true 时必填,详细说明为什么现在结束任务(如:任务已完成/需要用户补充信息/信息不足无法继续等)。finish=false 时为空。</finish_reason>
58
59
  <next_step>当 finish=false 时必填,描述下一步计划做什么(简洁明了,1-2句话)。finish=true 时为空。</next_step>
60
+ <mainsubject>为当前对话生成一个简短的标题(6个字以内),概括对话主题。仅在对话刚开始(前几轮)时需要输出,已有标题的对话此标签留空即可。要求简洁精炼,例如"Python安装"、"请假流程"、"翻译助手"等。</mainsubject>
59
61
 
60
62
  </output>
61
63
 
62
64
  ## 核心规则
63
65
  1. 你必须且只能输出 <output> XML 结构,不要输出任何其他文本
64
66
  2. <response>: 必须输出一段直接回复用户的话语(这是用户实际看到的回复),要求简洁友好、自然流畅。不要只输出任务计划而不说话!
65
- 3. <usersays_correct>: 如果 context 中 usersays 非空,则根据对话语境优化为更准确的用户意图表达
66
- 4. <task_plan>: 使用 Markdown 列表格式,每项包含任务描述和完成状态标记 [x]/[ ]
67
+ 3. <usersays_correct>: 如果 context 中 usersays 非空(说明用户通过语音输入),则根据对话语境将语音转写文本优化为更准确的用户意图表达,修正识别错误、补充标点、口语转书面语。如果 usersays 为空,这里输出为空。
68
+ 4. <task_plan>: 仅用于复杂任务(预计超过3步操作)。简单任务(≤3步)输出为空。复杂任务使用 Markdown 列表格式,每项包含任务描述和完成状态标记 [x]/[ ]
67
69
  5. <toolstocal>: 列出所有需要执行的工具调用,每个工具包含完整的参数说明
68
70
  6. <parms>: **必须使用严格合法的JSON格式**,例如 {"query": "关键词", "num": 10},不要使用其他格式
69
71
  7. <timeout>: 预估超时秒数(简单操作10-30s,文件操作30-60s,网络请求60-120s,数据处理120-300s)
70
72
  8. <callback>: 如果该工具的执行结果对后续决策有影响,设为 true;否则设为 false
71
73
  9. <remember>: 包含 <type> 和 <content> 子标签。type 填 "global"(跨会话全局记忆)或 "session"(仅当前会话)。content 填从最新用户输入中提炼的值得记忆的关键信息。如果本轮无需记忆,content 为空且不填 type。注意:用户个人偏好、重要结论、通用经验用 global;当前任务的临时上下文、过程信息用 session
72
- 10. <recall>: 描述下一轮执行时需要从记忆库中检索的内容关键词
74
+ 10. <recall>: 填写下一轮需要从记忆库中主动召回的内容描述和关键字(可包含时间参考)。系统将根据这些信息搜索top5相关记忆,在下一轮通过 <recall_memory> 标签注入上下文。如果当前 <automemory> 中的记忆已足够完成任务,<recall> 为空;如果需要更多历史记忆支撑,则填写。你也可以直接使用 recall_memory 工具在当前轮即时搜索
73
75
  11. <knowledge>: 从本轮对话或工具执行结果中提炼值得长期保存的专业知识、事实、经验法则、技术要点等。这些知识会被持久化到知识库文件,未来可通过 get_knowledge 检索复用。如果没有需要保存的知识,则为空。格式:简洁明确,每条知识一行
74
76
  12. <get_knowledge>: 如果当前 <knowledge> 内容不足以完成任务,填写需要从知识库搜索的关键词;否则为空
75
77
  13. <askuser>: 当信息不足需要用户补充时,在此填写要问的问题
76
78
  14. <finish>: 当任务已完成或需要等待用户回应时为 true;否则为 false 继续执行
77
79
  15. <finish_reason>: **finish=true 时必须填写**,详细说明结束原因(任务完成/等待用户/信息不足/无法处理等)
78
80
  16. <next_step>: **finish=false 时必须填写**,描述下一步计划做什么,要求简洁明确(1-2句话)
79
- 17. 使用中文输出所有内容
81
+ 17. <mainsubject>: 为当前对话生成6字以内的简短标题,概括对话主题。仅在对话刚开始的前几轮需要输出,已有标题后留空
82
+ 18. 使用中文输出所有内容
83
+
84
+ ## 上下文中的记忆系统说明
85
+ - <automemory>: 系统自动根据你通过 <remember> 保存的记忆和当前用户输入,搜索出的 top10 相关记忆。这些是你过去主动记住的内容(包含时间信息),可供参考。
86
+ - <recall_memory>: 你在上一轮通过 <recall> 指定的记忆搜索结果。系统根据你提供的关键字和时间点搜索了 top5 相关记忆。
87
+ - 两种记忆互补:automemory 是自动匹配的,recall_memory 是你主动指定搜索的。如果 automemory 不足,使用 <recall> 请求更多。
80
88
 
81
89
  ## 工具选择指南
82
90
  - **搜索信息**: 用 `web_search`(返回标题+URL+摘要),不要用 browser_open
@@ -85,6 +93,7 @@ class MainAgent(BaseAgent):
85
93
  - **执行代码**: 用 `code` 工具(language: python/javascript/shell)
86
94
  - **执行命令**: 用 `command` 或 `command_run` 工具
87
95
  - **文件操作**: 用 `file_read` / `file_write` / `file_list` 等文件工具
96
+ - **主动召回记忆**: 用 `recall_memory` 工具(参数: keyword=关键字, time_point=可选时间点如"2025-01", limit=数量默认5),根据关键字和时间搜索历史记忆
88
97
  """
89
98
 
90
99
  def __init__(self, tool_agent=None, memory_agent=None, **kwargs):
@@ -102,14 +111,19 @@ class MainAgent(BaseAgent):
102
111
  # 活跃会话上下文追踪(用于消息注入)
103
112
  self.active_contexts: Dict[str, AgentContext] = {}
104
113
 
105
- def init_context_builder(self, memory_manager=None, skill_registry=None, knowledge_base_dir=None):
114
+ def init_context_builder(self, memory_manager=None, skill_registry=None, knowledge_base_dir=None, context_window=None):
106
115
  """初始化 Context Builder(在系统启动后调用,注入依赖)"""
116
+ if context_window is None and self.llm:
117
+ context_window = getattr(self.llm, 'context_window', 128000)
118
+ if context_window is None:
119
+ context_window = 128000
107
120
  self.context_builder = ContextBuilder(
108
121
  memory_manager=memory_manager,
109
122
  skill_registry=skill_registry,
110
123
  knowledge_base_dir=knowledge_base_dir,
124
+ context_window=context_window,
111
125
  )
112
- logger.info("Context Builder 已初始化" + (f" (知识库: {knowledge_base_dir})" if knowledge_base_dir else ""))
126
+ logger.info(f"Context Builder 已初始化 (context_window={context_window})" + (f" (知识库: {knowledge_base_dir})" if knowledge_base_dir else ""))
113
127
 
114
128
  def _add_exec_event(self, event_type: str, data: Dict):
115
129
  """记录一个执行事件(供前端展示)"""
@@ -281,14 +295,24 @@ class MainAgent(BaseAgent):
281
295
  Returns:
282
296
  True 表示成功存储了新知识,False 表示跳过(重复)或失败
283
297
  """
284
- if not self.context_builder or not self.context_builder.knowledge_base_dir:
298
+ if not self.context_builder:
285
299
  logger.debug(f"[{task_id}] 知识库未配置,跳过 knowledge 存储")
286
300
  return False
287
301
 
288
302
  from datetime import datetime
289
303
  from pathlib import Path
290
304
 
291
- kb_dir = Path(self.context_builder.knowledge_base_dir)
305
+ # 优先写入 Agent 专属知识库,其次回退到组织知识库
306
+ kb_dir = None
307
+ if self.context_builder.agent_knowledge_dir:
308
+ kb_dir = Path(self.context_builder.agent_knowledge_dir)
309
+ elif self.context_builder.knowledge_base_dir:
310
+ kb_dir = Path(self.context_builder.knowledge_base_dir)
311
+
312
+ if not kb_dir:
313
+ logger.debug(f"[{task_id}] 知识库目录未配置,跳过 knowledge 存储")
314
+ return False
315
+
292
316
  auto_kb_dir = kb_dir / "auto_knowledge"
293
317
  auto_kb_dir.mkdir(parents=True, exist_ok=True)
294
318
 
@@ -359,7 +383,7 @@ class MainAgent(BaseAgent):
359
383
  f.write(f"\n## {now_str}\n")
360
384
  f.write(content.strip() + "\n")
361
385
  logger.info(
362
- f"[{task_id}] 知识已存入知识库: {kb_file.name} "
386
+ f"[{task_id}] 知识已存入知识库: {kb_file} "
363
387
  f"({len(content)} 字符, {len(content.strip().split(chr(10)))} 条)"
364
388
  )
365
389
  return True
@@ -436,6 +460,8 @@ class MainAgent(BaseAgent):
436
460
  get_knowledge_content = ""
437
461
  # 追踪流式推送的 reasoning 文本(用于构建有意义的最终回复)
438
462
  _v2_reasoning_collected: List[str] = []
463
+ # XML 解析失败时的 LLM 修正重试计数
464
+ _xml_correction_retries: int = 0
439
465
 
440
466
  conversation_history = list(context.conversation_history or [])
441
467
 
@@ -448,13 +474,23 @@ class MainAgent(BaseAgent):
448
474
  )
449
475
  if db_history:
450
476
  conversation_history = [
451
- Message(role=entry.role, content=entry.content)
477
+ Message(
478
+ role=entry.role,
479
+ content=entry.content,
480
+ metadata={"time": (entry.created_at[:19] if entry.created_at else "")}
481
+ )
452
482
  for entry in db_history
453
483
  ]
454
484
  logger.info(f"[{task_id}] 从 DB 加载了 {len(conversation_history)} 条历史对话")
455
485
  except Exception as e:
456
486
  logger.warning(f"[{task_id}] 加载历史对话失败: {e}")
457
487
 
488
+ # [v1.15.8] 计算历史用户消息数(用于判断是否需要自动命名会话)
489
+ _history_user_msg_count = sum(
490
+ 1 for m in conversation_history if getattr(m, 'role', '') == 'user'
491
+ and getattr(m, 'metadata', {}).get('key', '') not in ('llm_output', 'conversation_insight')
492
+ )
493
+
458
494
  # 保存用户消息到会话记忆
459
495
  if self.memory:
460
496
  self.memory.add_session(
@@ -480,6 +516,7 @@ class MainAgent(BaseAgent):
480
516
  while self._iteration_count < max_iter:
481
517
  self._iteration_count += 1
482
518
  logger.info(f"[{task_id}] V2 迭代 {self._iteration_count}/{max_iter}")
519
+ _emitted_reasoning_this_iter = False # [v1.15.8] 本轮是否已发送过 v2_reasoning 事件(防 TTS 重复)
483
520
 
484
521
  # ── 检查配置热加载广播 ──
485
522
  if self.config_broadcaster:
@@ -504,7 +541,7 @@ class MainAgent(BaseAgent):
504
541
  session_id=context.session_id,
505
542
  conversation_history=conversation_history,
506
543
  user_typed_text=context.user_message,
507
- user_voice_text="",
544
+ user_voice_text=context.metadata.get("user_voice_text", ""),
508
545
  task_plan=current_task_plan,
509
546
  agent_override_prompt=agent_override_prompt,
510
547
  get_knowledge=get_knowledge_content,
@@ -525,7 +562,7 @@ class MainAgent(BaseAgent):
525
562
  + self.SYSTEM_PROMPT.split("\n", 1)[1]
526
563
  )
527
564
  system_content = _prompt_with_placeholder.replace(_CONTEXT_PLACEHOLDER, context_xml)
528
- # Step 3: 调用 LLM
565
+ # Step 3: 构建 LLM 消息(必须包含 role=user,否则 OpenAI 兼容 API 返回 400)
529
566
  messages = [Message(role="system", content=system_content)]
530
567
 
531
568
  if all_tool_outputs:
@@ -534,6 +571,11 @@ class MainAgent(BaseAgent):
534
571
  content=f"[上一轮工具执行结果汇总]\n{truncate_str(all_tool_outputs, 30000)}"
535
572
  ))
536
573
  all_tool_outputs = ""
574
+ else:
575
+ messages.append(Message(
576
+ role="user",
577
+ content=context.user_message or "请处理上述上下文。"
578
+ ))
537
579
 
538
580
  if stream_response and self.llm:
539
581
  response = await self._call_llm_stream(
@@ -548,12 +590,18 @@ class MainAgent(BaseAgent):
548
590
  error_msg = f"LLM 调用失败: {response.error}"
549
591
  context.working_memory["final_response"] = error_msg
550
592
  await self._emit_v2_event("v2_reasoning", {"content": error_msg}, stream_callback)
593
+ if self.memory:
594
+ self.memory.add_session(
595
+ session_id=context.session_id,
596
+ role="assistant",
597
+ content=error_msg,
598
+ )
551
599
  break
552
600
 
553
601
  llm_raw = response.content
554
602
  logger.debug(f"[{task_id}] LLM 输出 (前500字): {llm_raw[:500]}")
555
603
 
556
- # 保存 LLM 原始输出到会话记忆(用于回溯和审计)
604
+ # 保存 LLM 原始输出到会话记忆(用于回溯和审计,key=llm_output 不出现在对话历史中)
557
605
  if self.memory:
558
606
  self.memory.add_session(
559
607
  session_id=context.session_id,
@@ -562,6 +610,15 @@ class MainAgent(BaseAgent):
562
610
  key="llm_output",
563
611
  importance=0.3,
564
612
  )
613
+ # 保存推理模型的思考过程(key=reasoning 供前端刷新后展示)
614
+ if response.reasoning and response.reasoning.strip():
615
+ self.memory.add_session(
616
+ session_id=context.session_id,
617
+ role="assistant",
618
+ content=response.reasoning.strip(),
619
+ key="reasoning",
620
+ importance=0.2,
621
+ )
565
622
 
566
623
  # Step 4: 解析结构化输出
567
624
  parsed = parse_output(llm_raw)
@@ -577,43 +634,64 @@ class MainAgent(BaseAgent):
577
634
  "finish": parsed.finish,
578
635
  "finish_reason": truncate_str(parsed.finish_reason, 200),
579
636
  "next_step": truncate_str(parsed.next_step, 200),
637
+ "response": truncate_str(parsed.response, 500),
580
638
  "parse_success": parsed.parse_success,
639
+ "needs_correction": parsed.needs_correction,
581
640
  }},
582
641
  stream_callback,
583
642
  )
584
643
 
644
+ # Step 4.5: 解析失败处理 — 回退给 LLM 修正或提取周边文本
585
645
  if not parsed.parse_success:
586
- logger.warning(f"[{task_id}] XML 解析失败 (parse_success=False)")
587
- # 即使解析失败,如果 regex fallback 提取到了工具调用,仍然执行
646
+ # 即使解析失败,如果 regex fallback 提取到了工具调用,仍然继续执行
588
647
  if parsed.tools_to_call:
589
- logger.info(f"[{task_id}] 但提取到 {len(parsed.tools_to_call)} 个工具调用,继续执行")
648
+ logger.warning(f"[{task_id}] XML 解析失败但提取到 {len(parsed.tools_to_call)} 个工具调用,跳过修正直接执行")
649
+ elif parsed.needs_correction and _xml_correction_retries < 1:
650
+ # XML 完全无法解析,让 LLM 重新格式化输出
651
+ _xml_correction_retries += 1
652
+ logger.warning(
653
+ f"[{task_id}] XML 解析完全失败,回退给 LLM 修正 "
654
+ f"(重试 {_xml_correction_retries}/1)"
655
+ )
656
+ correction_prompt = (
657
+ "你上一次的输出格式有误,XML解析器无法识别。"
658
+ "请严格按照 <output>...</output> 格式重新输出你的回答。"
659
+ "注意:不要在 <output> 标签前后输出任何其他文字。\n\n"
660
+ f"你上一次的原始输出如下:\n{llm_raw}"
661
+ )
662
+ conversation_history.append(
663
+ Message(role="assistant", content=llm_raw)
664
+ )
665
+ conversation_history.append(
666
+ Message(role="user", content=correction_prompt)
667
+ )
668
+ await self._emit_v2_event(
669
+ "v2_reasoning",
670
+ {"content": "⚠️ 模型输出格式异常,正在自动修正..."},
671
+ stream_callback,
672
+ )
673
+ continue # 重新进入循环,让 LLM 重新生成
590
674
  else:
591
- logger.warning(f"[{task_id}] 无工具调用可执行,尝试提取周边文本")
675
+ # 已重试过或不需要修正,提取周边文本作为备选
676
+ logger.warning(f"[{task_id}] XML 解析失败,提取周边文本作为备选")
592
677
  before, after = extract_surrounding_text(llm_raw)
593
678
  if before.strip() or after.strip():
594
679
  final_text = (before + "\n" + after).strip()
595
- context.working_memory["final_response"] = final_text
596
- await self._emit_v2_event("v2_reasoning", {"content": final_text}, stream_callback)
597
- if self.memory:
598
- self.memory.add_session(
599
- session_id=context.session_id,
600
- role="assistant",
601
- content=final_text,
602
- )
603
- break
604
680
  else:
605
- # XML 解析失败且无法提取文本,发送原始输出作为备选
606
- logger.warning(f"[{task_id}] 无法提取文本,发送原始 LLM 输出")
607
- final_text = llm_raw.strip() if llm_raw.strip() else "处理完毕。"
608
- context.working_memory["final_response"] = final_text
609
- await self._emit_v2_event("v2_reasoning", {"content": final_text}, stream_callback)
610
- if self.memory:
611
- self.memory.add_session(
612
- session_id=context.session_id,
613
- role="assistant",
614
- content=final_text,
615
- )
616
- break
681
+ # 清除残余 XML 标签后作为纯文本
682
+ final_text = re.sub(r"<[^>]+>", "", llm_raw).strip()
683
+ final_text = final_text if final_text else "处理完毕。"
684
+ context.working_memory["final_response"] = final_text
685
+ await self._emit_v2_event(
686
+ "v2_reasoning", {"content": final_text}, stream_callback
687
+ )
688
+ if self.memory:
689
+ self.memory.add_session(
690
+ session_id=context.session_id,
691
+ role="assistant",
692
+ content=final_text,
693
+ )
694
+ break
617
695
 
618
696
  warnings = validate_output(parsed)
619
697
  for w in warnings:
@@ -630,6 +708,7 @@ class MainAgent(BaseAgent):
630
708
  logger.debug(f"[{task_id}] 模型回复用户: {response_text[:100]}")
631
709
  context.working_memory["model_response"] = response_text
632
710
  _v2_reasoning_collected.append(response_text)
711
+ _emitted_reasoning_this_iter = True
633
712
  await self._emit_v2_event(
634
713
  "v2_reasoning",
635
714
  {"content": response_text},
@@ -715,6 +794,21 @@ class MainAgent(BaseAgent):
715
794
  except Exception as e:
716
795
  logger.warning(f"[{task_id}] 存入知识库失败: {e}")
717
796
 
797
+ # Step 6.6: [v1.15.8] 处理 mainsubject — 自动命名会话标题
798
+ if parsed.mainsubject and _history_user_msg_count < 4:
799
+ try:
800
+ subject = parsed.mainsubject.strip()[:20] # 安全截断
801
+ if self.memory:
802
+ self.memory.rename_session(context.session_id, subject)
803
+ logger.info(f"[{task_id}] 会话自动命名: {subject}")
804
+ await self._emit_v2_event(
805
+ "v2_session_rename",
806
+ {"session_id": context.session_id, "name": subject},
807
+ stream_callback,
808
+ )
809
+ except Exception as e:
810
+ logger.warning(f"[{task_id}] 会话自动命名失败: {e}")
811
+
718
812
  # Step 7: 处理 recall — 记录下一轮需要检索的记忆内容
719
813
  if parsed.recall:
720
814
  recall_content = parsed.recall
@@ -757,31 +851,22 @@ class MainAgent(BaseAgent):
757
851
 
758
852
  # Step 10: 执行工具调用(无论 finish 值如何,先执行工具)
759
853
  if not parsed.tools_to_call:
760
- # 无工具调用: 直接根据 finish 判断是否结束
761
- if parsed.finish:
762
- logger.info(f"[{task_id}] finish=true 且无工具调用,结束循环")
763
- before, after = extract_surrounding_text(llm_raw)
764
- final_text = (before + "\n" + after).strip() if (before.strip() or after.strip()) else "任务已完成。"
765
- context.working_memory["final_response"] = final_text
766
- await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
767
- if self.memory:
768
- self.memory.add_session(
769
- session_id=context.session_id,
770
- role="assistant",
771
- content=final_text,
772
- )
854
+ # 无工具调用: 优先使用已收集的 reasoning 文本(包含 parsed.response),避免丢失第一轮输出
855
+ if _v2_reasoning_collected:
856
+ final_text = "\n".join(_v2_reasoning_collected)
773
857
  else:
774
- logger.info(f"[{task_id}] 无工具调用且 finish=false,结束")
775
858
  before, after = extract_surrounding_text(llm_raw)
776
- final_text = (before + "\n" + after).strip() if (before.strip() or after.strip()) else "处理完毕。"
777
- context.working_memory["final_response"] = final_text
859
+ final_text = (before + "\n" + after).strip() if (before.strip() or after.strip()) else "任务已完成。"
860
+ context.working_memory["final_response"] = final_text
861
+ # [v1.15.8] 跳过已发送的 reasoning 文本,避免 TTS 重复播报
862
+ if not _emitted_reasoning_this_iter:
778
863
  await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
779
- if self.memory:
780
- self.memory.add_session(
781
- session_id=context.session_id,
782
- role="assistant",
783
- content=final_text,
784
- )
864
+ if self.memory:
865
+ self.memory.add_session(
866
+ session_id=context.session_id,
867
+ role="assistant",
868
+ content=final_text,
869
+ )
785
870
  break
786
871
 
787
872
  # Step 11: 有工具调用 — 先执行所有工具,再根据 finish 决定回调
@@ -804,6 +889,7 @@ class MainAgent(BaseAgent):
804
889
  # 发送 beforecalltext 作为显示文本
805
890
  if before_call:
806
891
  _v2_reasoning_collected.append(before_call)
892
+ _emitted_reasoning_this_iter = True
807
893
  await self._emit_v2_event(
808
894
  "v2_reasoning",
809
895
  {"content": before_call},
@@ -815,6 +901,7 @@ class MainAgent(BaseAgent):
815
901
  "v2_tool_start",
816
902
  {"tool": {
817
903
  "toolname": tool_name,
904
+ "beforecalltext": before_call,
818
905
  "parms": truncate_str(parms, 500),
819
906
  "timeout": timeout,
820
907
  "callback": should_callback,
@@ -986,15 +1073,8 @@ class MainAgent(BaseAgent):
986
1073
  # 数据密集型工具允许更长的输出
987
1074
  _HEAVY_TOOLS = ("web_search", "web_read", "url_read", "file_list",
988
1075
  "file_search", "browser_open", "process_list")
989
- # OpenClaw prompt-only 技能也允许较长输出(SKILL.md 指令)
990
- _is_openclaw = (
991
- isinstance(tool_result.get("data"), dict)
992
- and tool_result.get("data", {}).get("skill_type") == "openclaw"
993
- )
994
1076
  if tool_name in _HEAVY_TOOLS:
995
1077
  _max_output = 6000
996
- elif _is_openclaw:
997
- _max_output = 8000
998
1078
  else:
999
1079
  _max_output = 3000
1000
1080
  tool_outputs_parts.append(
@@ -1015,10 +1095,12 @@ class MainAgent(BaseAgent):
1015
1095
 
1016
1096
  # 保存工具调用到会话记忆
1017
1097
  if self.memory:
1098
+ # 构建工具调用记录,包含 beforecalltext 作为标题
1099
+ tool_call_title = before_call if before_call else f"调用工具: {tool_name}"
1018
1100
  self.memory.add_session(
1019
1101
  session_id=context.session_id,
1020
1102
  role="assistant",
1021
- content=f"调用工具: {tool_name}\n参数: {truncate_str(parms, 1000)}",
1103
+ content=f"{tool_call_title}\n调用工具: {tool_name}\n参数: {truncate_str(parms, 1000)}",
1022
1104
  key="tool_call",
1023
1105
  importance=0.4,
1024
1106
  )
@@ -1053,7 +1135,9 @@ class MainAgent(BaseAgent):
1053
1135
  if current_task_plan:
1054
1136
  final_text += f"\n\n任务计划:\n{current_task_plan}"
1055
1137
  context.working_memory["final_response"] = final_text
1056
- await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
1138
+ # [v1.15.8] 跳过已发送的 reasoning 文本,避免 TTS 重复播报
1139
+ if not _emitted_reasoning_this_iter:
1140
+ await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
1057
1141
  if self.memory:
1058
1142
  self.memory.add_session(
1059
1143
  session_id=context.session_id,
@@ -1080,7 +1164,9 @@ class MainAgent(BaseAgent):
1080
1164
  if current_task_plan:
1081
1165
  final_text += f"\n\n任务计划:\n{current_task_plan}"
1082
1166
  context.working_memory["final_response"] = final_text
1083
- await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
1167
+ # [v1.15.8] 跳过已发送的 reasoning 文本,避免 TTS 重复播报
1168
+ if not _emitted_reasoning_this_iter:
1169
+ await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
1084
1170
  if self.memory:
1085
1171
  self.memory.add_session(
1086
1172
  session_id=context.session_id,
@@ -1173,6 +1259,34 @@ class MainAgent(BaseAgent):
1173
1259
  else:
1174
1260
  result["error"] = "执行引擎未初始化"
1175
1261
 
1262
+ elif tool_name == "recall_memory":
1263
+ # === 主动召回记忆工具 ===
1264
+ # 根据 memory_agent.recall_memory() 搜索历史记忆
1265
+ try:
1266
+ if self.memory_agent:
1267
+ recall_results = await self.memory_agent.recall_memory(
1268
+ keyword=params.get("keyword", ""),
1269
+ time_point=params.get("time_point", ""),
1270
+ session_id=params.get("session_id", ""),
1271
+ limit=params.get("limit", 5),
1272
+ )
1273
+ if recall_results:
1274
+ output_lines = [f"找到 {len(recall_results)} 条相关记忆:"]
1275
+ for i, mem in enumerate(recall_results, 1):
1276
+ output_lines.append(
1277
+ f"{i}. [{mem.get('created_at', '')}] "
1278
+ f"[{mem.get('category', '')}] "
1279
+ f"{mem.get('content', '')}"
1280
+ )
1281
+ result = {"success": True, "output": "\n".join(output_lines), "data": recall_results}
1282
+ else:
1283
+ result = {"success": True, "output": "未找到相关记忆", "data": []}
1284
+ else:
1285
+ result = {"success": False, "error": "记忆系统未初始化"}
1286
+ except Exception as re_err:
1287
+ result = {"success": False, "error": f"记忆召回失败: {re_err}"}
1288
+ logger.warning(f"[{task_id}] recall_memory 工具异常: {re_err}")
1289
+
1176
1290
  elif self.skills:
1177
1291
  exec_result = await self.skills.execute(tool_name, **params)
1178
1292
  result = exec_result.to_dict()
@@ -306,14 +306,14 @@ class MemoryAgent(BaseAgent):
306
306
 
307
307
  context.working_memory["relevant_memories"] = {
308
308
  "global": [
309
- {"content": e.content[:500], "key": e.key, "summary": e.summary}
309
+ {"content": e.content, "key": e.key, "summary": e.summary}
310
310
  for e in global_memories
311
311
  ],
312
312
  "error_patterns": [
313
- {"content": e.content[:300]} for e in errors
313
+ {"content": e.content} for e in errors
314
314
  ],
315
315
  "preferences": [
316
- {"content": e.content[:200]} for e in prefs[-5:]
316
+ {"content": e.content} for e in prefs[-5:]
317
317
  ],
318
318
  }
319
319
 
@@ -325,11 +325,99 @@ class MemoryAgent(BaseAgent):
325
325
 
326
326
  if errors:
327
327
  context_parts.append("\n## 历史错误(避免重复)")
328
- context_parts.extend(f"- {e.content[:200]}" for e in errors)
328
+ context_parts.extend(f"- {e.content}" for e in errors)
329
329
 
330
330
  if global_memories:
331
331
  context_parts.append("\n## 相关经验")
332
- context_parts.extend(f"- {e.summary or e.content[:200]}" for e in global_memories)
332
+ context_parts.extend(f"- {e.summary or e.content}" for e in global_memories)
333
333
 
334
334
  if context_parts:
335
335
  context.working_memory["memory_context_prompt"] = "\n".join(context_parts)
336
+
337
+ async def recall_memory(
338
+ self,
339
+ keyword: str = "",
340
+ time_point: str = "",
341
+ session_id: str = "",
342
+ limit: int = 5,
343
+ ) -> list:
344
+ """
345
+ 主动召回记忆 —— 根据关键字和时间点搜索历史记忆。
346
+
347
+ 这是供大模型通过 <recall> 标签调用的工具方法。
348
+ 搜索范围包括全局记忆和会话记忆。
349
+
350
+ Args:
351
+ keyword: 搜索关键字(必填,用于模糊匹配和语义搜索)
352
+ time_point: 时间参考点(可选),格式如 "2025-01" 或 "2025-01-15"
353
+ 系统会将其转换为 start_time 进行时间范围过滤
354
+ session_id: 会话 ID(可选,为空则跨会话搜索)
355
+ limit: 返回数量(默认 5)
356
+
357
+ Returns:
358
+ 匹配的记忆列表,每项包含 content, created_at, key, category
359
+ """
360
+ if not self.memory:
361
+ return []
362
+
363
+ # 解析 time_point 为 start_time
364
+ start_time = ""
365
+ if time_point:
366
+ # 支持多种格式: "2025-01", "2025-01-15", "2025年1月"
367
+ import re as _re
368
+ # 尝试 "YYYY年MM月" 格式
369
+ m = _re.match(r"(\d{4})年(\d{1,2})月", time_point)
370
+ if m:
371
+ start_time = f"{m.group(1)}-{int(m.group(2)):02d}-01 00:00:00"
372
+ else:
373
+ # 尝试 "YYYY-MM" 或 "YYYY-MM-DD"
374
+ m = _re.match(r"(\d{4})-(\d{1,2})(?:-(\d{1,2}))?", time_point)
375
+ if m:
376
+ year = m.group(1)
377
+ month = int(m.group(2))
378
+ day = m.group(3)
379
+ if day:
380
+ start_time = f"{year}-{month:02d}-{int(day):02d} 00:00:00"
381
+ else:
382
+ start_time = f"{year}-{month:02d}-01 00:00:00"
383
+
384
+ # 使用 search_by_time_range 进行精确搜索
385
+ if start_time or keyword:
386
+ results = self.memory.search_by_time_range(
387
+ session_id=session_id,
388
+ start_time=start_time,
389
+ keyword=keyword,
390
+ limit=limit,
391
+ )
392
+ if results:
393
+ return [
394
+ {
395
+ "content": e.content,
396
+ "created_at": e.created_at,
397
+ "key": e.key,
398
+ "category": e.category,
399
+ "summary": e.summary,
400
+ }
401
+ for e in results
402
+ ]
403
+
404
+ # 回退到普通搜索
405
+ if keyword:
406
+ results = self.memory.search(
407
+ query=keyword,
408
+ session_id=session_id,
409
+ limit=limit,
410
+ mode="hybrid",
411
+ )
412
+ return [
413
+ {
414
+ "content": e.content,
415
+ "created_at": e.created_at,
416
+ "key": e.key,
417
+ "category": e.category,
418
+ "summary": e.summary,
419
+ }
420
+ for e in results
421
+ ]
422
+
423
+ return []
package/config.py CHANGED
@@ -45,7 +45,7 @@ class LLMConfig:
45
45
  class MemoryConfig:
46
46
  """记忆系统配置"""
47
47
  db_path: str = "" # SQLite 数据库路径,默认 ~/.myagent/memory.db
48
- max_session: int = 50 # 会话记忆最大对话轮数
48
+ max_session: int = 500 # 会话记忆最大对话轮数([v1.15.13] 从 50 提升到 500,避免过早删除历史)
49
49
  max_working: int = 100 # 任务进度最大条数
50
50
  auto_summarize: bool = True # 自动总结开关
51
51
  summarize_threshold: int = 20 # 触发总结的对话轮数
@@ -100,6 +100,7 @@ class ModelEntry:
100
100
  input_modes: List[str] = field(default_factory=lambda: ["text"]) # 支持的输入模式: text, image, video, audio
101
101
  reasoning: bool = True # 是否支持推理(如 o1 系列)
102
102
  enabled: bool = True
103
+ is_global_fallback: bool = True # 是否作为全局兜底模型(保障系统运行的最终兜底模型)
103
104
 
104
105
 
105
106
  @dataclass