myagent-ai 1.11.2 → 1.12.0

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 (406) hide show
  1. package/agents/__pycache__/main_agent.cpython-312.pyc +0 -0
  2. package/agents/__pycache__/memory_agent.cpython-312.pyc +0 -0
  3. package/config.py +1 -0
  4. package/core/__pycache__/context_builder.cpython-312.pyc +0 -0
  5. package/core/__pycache__/output_parser.cpython-312.pyc +0 -0
  6. package/memory/__pycache__/manager.cpython-312.pyc +0 -0
  7. package/package.json +1 -1
  8. package/skills/__pycache__/browser_skill.cpython-312.pyc +0 -0
  9. package/skills/__pycache__/file_skill.cpython-312.pyc +0 -0
  10. package/skills/__pycache__/registry.cpython-312.pyc +0 -0
  11. package/web/__pycache__/api_server.cpython-312.pyc +0 -0
  12. package/web/api_server.py +76 -75
  13. package/web/ui/chat/chat_main.js +4 -0
  14. package/web/ui/chat/flow_engine.js +32 -1
  15. package/web/ui/chat/groupchat.js +1 -3
  16. package/web/ui/index.html +14 -102
  17. package/skills/ASR/LICENSE.txt +0 -21
  18. package/skills/ASR/SKILL.md +0 -580
  19. package/skills/ASR/scripts/asr.ts +0 -27
  20. package/skills/LLM/LICENSE.txt +0 -21
  21. package/skills/LLM/SKILL.md +0 -856
  22. package/skills/LLM/scripts/chat.ts +0 -32
  23. package/skills/TTS/LICENSE.txt +0 -21
  24. package/skills/TTS/SKILL.md +0 -735
  25. package/skills/TTS/scripts/tts.ts +0 -25
  26. package/skills/VLM/LICENSE.txt +0 -21
  27. package/skills/VLM/SKILL.md +0 -621
  28. package/skills/VLM/scripts/vlm.ts +0 -57
  29. package/skills/agent-browser/SKILL.md +0 -327
  30. package/skills/ai-news-collectors/SKILL.md +0 -157
  31. package/skills/ai-news-collectors/_meta.json +0 -6
  32. package/skills/ai-news-collectors/references/sources.md +0 -128
  33. package/skills/aminer-open-academic/SKILL.md +0 -312
  34. package/skills/aminer-open-academic/_meta.json +0 -6
  35. package/skills/aminer-open-academic/evals/evals.json +0 -46
  36. package/skills/aminer-open-academic/references/api-catalog.md +0 -1032
  37. package/skills/aminer-open-academic/scripts/aminer_client.py +0 -875
  38. package/skills/auto-target-tracker/SKILL.md +0 -316
  39. package/skills/charts/LICENSE.txt +0 -13
  40. package/skills/charts/SKILL.md +0 -427
  41. package/skills/charts/references/_rules.md +0 -49
  42. package/skills/charts/references/d3.md +0 -199
  43. package/skills/charts/references/echarts.md +0 -651
  44. package/skills/charts/references/matplotlib.md +0 -617
  45. package/skills/charts/references/mermaid.md +0 -797
  46. package/skills/charts/references/mindmap-css.md +0 -911
  47. package/skills/charts/references/playwright-css.md +0 -801
  48. package/skills/charts/references/radial-grid.md +0 -576
  49. package/skills/charts/references/seaborn.md +0 -324
  50. package/skills/charts/setup.sh +0 -228
  51. package/skills/coding-agent/SKILL.md +0 -119
  52. package/skills/coding-agent/_meta.json +0 -6
  53. package/skills/coding-agent/criteria.md +0 -48
  54. package/skills/coding-agent/execution.md +0 -42
  55. package/skills/coding-agent/memory-template.md +0 -38
  56. package/skills/coding-agent/planning.md +0 -31
  57. package/skills/coding-agent/state.md +0 -60
  58. package/skills/coding-agent/verification.md +0 -39
  59. package/skills/contentanalysis/ExtractWisdom/SKILL.md +0 -226
  60. package/skills/contentanalysis/ExtractWisdom/Workflows/Extract.md +0 -60
  61. package/skills/contentanalysis/SKILL.md +0 -14
  62. package/skills/docx/CHANGELOG.md +0 -85
  63. package/skills/docx/LICENSE.txt +0 -13
  64. package/skills/docx/SKILL.md +0 -200
  65. package/skills/docx/docx-js.md +0 -681
  66. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  67. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  68. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  69. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  70. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  71. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  72. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  73. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  74. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  75. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  76. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  77. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  78. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  79. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  80. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  81. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  82. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  83. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  84. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  85. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  86. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  87. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  88. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  89. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  90. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  91. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  92. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  93. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  94. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  95. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  96. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  97. package/skills/docx/ooxml/schemas/mce/mc.xsd +0 -75
  98. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  99. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  100. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  101. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  102. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  103. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  104. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  105. package/skills/docx/ooxml/scripts/pack.py +0 -159
  106. package/skills/docx/ooxml/scripts/unpack.py +0 -29
  107. package/skills/docx/ooxml/scripts/validate.py +0 -69
  108. package/skills/docx/ooxml/scripts/validation/__init__.py +0 -15
  109. package/skills/docx/ooxml/scripts/validation/base.py +0 -951
  110. package/skills/docx/ooxml/scripts/validation/docx.py +0 -274
  111. package/skills/docx/ooxml/scripts/validation/pptx.py +0 -315
  112. package/skills/docx/ooxml/scripts/validation/redlining.py +0 -279
  113. package/skills/docx/ooxml.md +0 -615
  114. package/skills/docx/references/chart-templates.md +0 -386
  115. package/skills/docx/references/common-rules.md +0 -419
  116. package/skills/docx/references/decorations.md +0 -538
  117. package/skills/docx/references/design-system.md +0 -1797
  118. package/skills/docx/references/docx-js-advanced.md +0 -257
  119. package/skills/docx/references/docx-js-core.md +0 -333
  120. package/skills/docx/references/faq.md +0 -323
  121. package/skills/docx/references/math-formulas.md +0 -276
  122. package/skills/docx/references/ooxml.md +0 -222
  123. package/skills/docx/references/toc.md +0 -254
  124. package/skills/docx/routes/comment.md +0 -88
  125. package/skills/docx/routes/create.md +0 -207
  126. package/skills/docx/routes/edit.md +0 -115
  127. package/skills/docx/routes/format.md +0 -120
  128. package/skills/docx/routes/read.md +0 -114
  129. package/skills/docx/scenes/academic.md +0 -783
  130. package/skills/docx/scenes/contract.md +0 -463
  131. package/skills/docx/scenes/copywriting.md +0 -139
  132. package/skills/docx/scenes/exam.md +0 -698
  133. package/skills/docx/scenes/official-doc.md +0 -411
  134. package/skills/docx/scenes/report.md +0 -340
  135. package/skills/docx/scenes/resume.md +0 -534
  136. package/skills/docx/scripts/__init__.py +0 -1
  137. package/skills/docx/scripts/add_toc_placeholders.py +0 -749
  138. package/skills/docx/scripts/document.py +0 -1333
  139. package/skills/docx/scripts/postcheck.py +0 -807
  140. package/skills/docx/scripts/templates/comments.xml +0 -3
  141. package/skills/docx/scripts/templates/commentsExtended.xml +0 -3
  142. package/skills/docx/scripts/templates/commentsExtensible.xml +0 -3
  143. package/skills/docx/scripts/templates/commentsIds.xml +0 -3
  144. package/skills/docx/scripts/templates/people.xml +0 -3
  145. package/skills/docx/scripts/utilities.py +0 -374
  146. package/skills/docx/setup.sh +0 -177
  147. package/skills/finance/Finance_API_Doc.md +0 -445
  148. package/skills/finance/SKILL.md +0 -53
  149. package/skills/gift-evaluator/SKILL.md +0 -83
  150. package/skills/gift-evaluator/html_tools.py +0 -268
  151. package/skills/image-edit/LICENSE.txt +0 -21
  152. package/skills/image-edit/SKILL.md +0 -896
  153. package/skills/image-edit/scripts/image-edit.ts +0 -36
  154. package/skills/image-generation/LICENSE.txt +0 -21
  155. package/skills/image-generation/SKILL.md +0 -583
  156. package/skills/image-generation/scripts/image-generation.ts +0 -28
  157. package/skills/market-research-reports/SKILL.md +0 -901
  158. package/skills/market-research-reports/assets/FORMATTING_GUIDE.md +0 -428
  159. package/skills/market-research-reports/assets/market_report_template.tex +0 -1380
  160. package/skills/market-research-reports/assets/market_research.sty +0 -564
  161. package/skills/market-research-reports/references/data_analysis_patterns.md +0 -548
  162. package/skills/market-research-reports/references/report_structure_guide.md +0 -999
  163. package/skills/market-research-reports/references/visual_generation_guide.md +0 -1077
  164. package/skills/market-research-reports/scripts/generate_market_visuals.py +0 -529
  165. package/skills/marketing-mode/README.md +0 -49
  166. package/skills/marketing-mode/SKILL.md +0 -677
  167. package/skills/marketing-mode/_meta.json +0 -6
  168. package/skills/marketing-mode/mode-prompt.md +0 -39
  169. package/skills/marketing-mode/skill.json +0 -20
  170. package/skills/pdf/LICENSE.txt +0 -13
  171. package/skills/pdf/SKILL.md +0 -927
  172. package/skills/pdf/briefs/academic.md +0 -1049
  173. package/skills/pdf/briefs/creative.md +0 -770
  174. package/skills/pdf/briefs/poster.md +0 -702
  175. package/skills/pdf/briefs/process-advanced.md +0 -284
  176. package/skills/pdf/briefs/process.md +0 -319
  177. package/skills/pdf/briefs/report.md +0 -1657
  178. package/skills/pdf/configs/components.md +0 -153
  179. package/skills/pdf/configs/fonts.md +0 -93
  180. package/skills/pdf/configs/visual_framework.md +0 -263
  181. package/skills/pdf/forms.md +0 -205
  182. package/skills/pdf/reference.md +0 -765
  183. package/skills/pdf/references/resume-academic.tex +0 -130
  184. package/skills/pdf/references/resume-altacv.tex +0 -190
  185. package/skills/pdf/scripts/add_zai_metadata.py +0 -172
  186. package/skills/pdf/scripts/check_bounding_boxes.py +0 -70
  187. package/skills/pdf/scripts/check_bounding_boxes_test.py +0 -226
  188. package/skills/pdf/scripts/check_fillable_fields.py +0 -12
  189. package/skills/pdf/scripts/convert_pdf_to_images.py +0 -35
  190. package/skills/pdf/scripts/cover_validate.js +0 -367
  191. package/skills/pdf/scripts/create_validation_image.py +0 -41
  192. package/skills/pdf/scripts/design_engine.py +0 -2816
  193. package/skills/pdf/scripts/extract_form_field_info.py +0 -152
  194. package/skills/pdf/scripts/fill_fillable_fields.py +0 -114
  195. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +0 -108
  196. package/skills/pdf/scripts/html2pdf-next.js +0 -754
  197. package/skills/pdf/scripts/html2poster.js +0 -256
  198. package/skills/pdf/scripts/pdf.py +0 -2959
  199. package/skills/pdf/scripts/pdf_qa.py +0 -901
  200. package/skills/pdf/scripts/poster_validate.py +0 -1337
  201. package/skills/pdf/scripts/sanitize_code.py +0 -110
  202. package/skills/pdf/scripts/setup.sh +0 -269
  203. package/skills/pdf/scripts/tectonic +0 -0
  204. package/skills/pdf/scripts/toc_validate.py +0 -2075
  205. package/skills/pdf/typesetting/charts.md +0 -320
  206. package/skills/pdf/typesetting/cover-backgrounds.md +0 -384
  207. package/skills/pdf/typesetting/cover.md +0 -1442
  208. package/skills/pdf/typesetting/fill-engine.md +0 -527
  209. package/skills/pdf/typesetting/geometry.md +0 -142
  210. package/skills/pdf/typesetting/overflow.md +0 -630
  211. package/skills/pdf/typesetting/pagination.md +0 -367
  212. package/skills/pdf/typesetting/palette.md +0 -217
  213. package/skills/pdf/typesetting/typography.md +0 -20
  214. package/skills/podcast-generate/LICENSE.txt +0 -21
  215. package/skills/podcast-generate/SKILL.md +0 -198
  216. package/skills/podcast-generate/generate.ts +0 -661
  217. package/skills/podcast-generate/package.json +0 -30
  218. package/skills/podcast-generate/readme.md +0 -177
  219. package/skills/podcast-generate/test_data/segments.jsonl +0 -3
  220. package/skills/podcast-generate/tsconfig.json +0 -26
  221. package/skills/ppt/LICENSE.txt +0 -13
  222. package/skills/ppt/SKILL.md +0 -436
  223. package/skills/ppt/beamer.md +0 -1457
  224. package/skills/ppt/components.md +0 -1634
  225. package/skills/ppt/data-viz-components.md +0 -529
  226. package/skills/ppt/design-system.md +0 -206
  227. package/skills/ppt/html2pptx.md +0 -394
  228. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  229. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  230. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  231. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  232. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  233. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  234. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  235. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  236. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  237. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  238. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  239. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  240. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  241. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  242. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  243. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  244. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  245. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  246. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  247. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  248. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  249. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  250. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  251. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  252. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  253. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  254. package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  255. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  256. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  257. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  258. package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  259. package/skills/ppt/ooxml/schemas/mce/mc.xsd +0 -75
  260. package/skills/ppt/ooxml/schemas/microsoft/wml-2010.xsd +0 -560
  261. package/skills/ppt/ooxml/schemas/microsoft/wml-2012.xsd +0 -67
  262. package/skills/ppt/ooxml/schemas/microsoft/wml-2018.xsd +0 -14
  263. package/skills/ppt/ooxml/schemas/microsoft/wml-cex-2018.xsd +0 -20
  264. package/skills/ppt/ooxml/schemas/microsoft/wml-cid-2016.xsd +0 -13
  265. package/skills/ppt/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  266. package/skills/ppt/ooxml/schemas/microsoft/wml-symex-2015.xsd +0 -8
  267. package/skills/ppt/ooxml/scripts/pack.py +0 -159
  268. package/skills/ppt/ooxml/scripts/unpack.py +0 -29
  269. package/skills/ppt/ooxml/scripts/validate.py +0 -69
  270. package/skills/ppt/ooxml/scripts/validation/__init__.py +0 -15
  271. package/skills/ppt/ooxml/scripts/validation/base.py +0 -951
  272. package/skills/ppt/ooxml/scripts/validation/docx.py +0 -274
  273. package/skills/ppt/ooxml/scripts/validation/pptx.py +0 -315
  274. package/skills/ppt/ooxml/scripts/validation/redlining.py +0 -279
  275. package/skills/ppt/ooxml.md +0 -427
  276. package/skills/ppt/references/beamer.md +0 -721
  277. package/skills/ppt/references/latex.md +0 -342
  278. package/skills/ppt/references/paper-navbar.tex +0 -73
  279. package/skills/ppt/references/progress-navbar.tex +0 -151
  280. package/skills/ppt/scripts/html2pptx.js +0 -1329
  281. package/skills/ppt/scripts/inventory.py +0 -512
  282. package/skills/ppt/scripts/pdf.py +0 -2959
  283. package/skills/ppt/scripts/rearrange.py +0 -135
  284. package/skills/ppt/scripts/replace.py +0 -231
  285. package/skills/ppt/scripts/tectonic +0 -0
  286. package/skills/ppt/scripts/thumbnail.py +0 -352
  287. package/skills/ppt/setup.sh +0 -197
  288. package/skills/ppt/themes.md +0 -506
  289. package/skills/qingyan-research/SKILL.md +0 -294
  290. package/skills/qingyan-research/generate_html.py +0 -33
  291. package/skills/seo-content-writer/SKILL.md +0 -625
  292. package/skills/seo-content-writer/_meta.json +0 -6
  293. package/skills/seo-content-writer/references/content-structure-templates.md +0 -875
  294. package/skills/seo-content-writer/references/title-formulas.md +0 -339
  295. package/skills/skill-creator/LICENSE.txt +0 -202
  296. package/skills/skill-creator/SKILL.md +0 -485
  297. package/skills/skill-creator/agents/analyzer.md +0 -274
  298. package/skills/skill-creator/agents/comparator.md +0 -202
  299. package/skills/skill-creator/agents/grader.md +0 -223
  300. package/skills/skill-creator/assets/eval_review.html +0 -146
  301. package/skills/skill-creator/eval-viewer/generate_review.py +0 -471
  302. package/skills/skill-creator/eval-viewer/viewer.html +0 -1325
  303. package/skills/skill-creator/references/schemas.md +0 -430
  304. package/skills/skill-creator/scripts/__init__.py +0 -0
  305. package/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
  306. package/skills/skill-creator/scripts/generate_report.py +0 -326
  307. package/skills/skill-creator/scripts/improve_description.py +0 -236
  308. package/skills/skill-creator/scripts/package_skill.py +0 -136
  309. package/skills/skill-creator/scripts/quick_validate.py +0 -103
  310. package/skills/skill-creator/scripts/run_eval.py +0 -310
  311. package/skills/skill-creator/scripts/run_loop.py +0 -328
  312. package/skills/skill-creator/scripts/utils.py +0 -47
  313. package/skills/stock-analysis-skill/SKILL.md +0 -156
  314. package/skills/stock-analysis-skill/package.json +0 -21
  315. package/skills/stock-analysis-skill/src/analyzer.ts +0 -264
  316. package/skills/stock-analysis-skill/src/dataFetcher.ts +0 -130
  317. package/skills/stock-analysis-skill/src/dividend.ts +0 -226
  318. package/skills/stock-analysis-skill/src/index.ts +0 -327
  319. package/skills/stock-analysis-skill/src/rumorScanner.ts +0 -200
  320. package/skills/stock-analysis-skill/src/types.ts +0 -167
  321. package/skills/stock-analysis-skill/src/watchlist.ts +0 -308
  322. package/skills/stock-analysis-skill/tsconfig.json +0 -15
  323. package/skills/storyboard-manager/SKILL.md +0 -532
  324. package/skills/storyboard-manager/index.js +0 -9
  325. package/skills/storyboard-manager/package.json +0 -11
  326. package/skills/storyboard-manager/references/character_development.md +0 -232
  327. package/skills/storyboard-manager/references/story_structures.md +0 -148
  328. package/skills/storyboard-manager/scripts/consistency_checker.py +0 -391
  329. package/skills/storyboard-manager/scripts/timeline_tracker.py +0 -352
  330. package/skills/ui-ux-pro-max/SKILL.md +0 -43
  331. package/skills/ui-ux-pro-max/_meta.json +0 -6
  332. package/skills/ui-ux-pro-max/assets/data/charts.csv +0 -26
  333. package/skills/ui-ux-pro-max/assets/data/colors.csv +0 -97
  334. package/skills/ui-ux-pro-max/assets/data/icons.csv +0 -101
  335. package/skills/ui-ux-pro-max/assets/data/landing.csv +0 -31
  336. package/skills/ui-ux-pro-max/assets/data/products.csv +0 -97
  337. package/skills/ui-ux-pro-max/assets/data/react-performance.csv +0 -45
  338. package/skills/ui-ux-pro-max/assets/data/stacks/astro.csv +0 -54
  339. package/skills/ui-ux-pro-max/assets/data/stacks/flutter.csv +0 -53
  340. package/skills/ui-ux-pro-max/assets/data/stacks/html-tailwind.csv +0 -56
  341. package/skills/ui-ux-pro-max/assets/data/stacks/jetpack-compose.csv +0 -53
  342. package/skills/ui-ux-pro-max/assets/data/stacks/nextjs.csv +0 -53
  343. package/skills/ui-ux-pro-max/assets/data/stacks/nuxt-ui.csv +0 -51
  344. package/skills/ui-ux-pro-max/assets/data/stacks/nuxtjs.csv +0 -59
  345. package/skills/ui-ux-pro-max/assets/data/stacks/react-native.csv +0 -52
  346. package/skills/ui-ux-pro-max/assets/data/stacks/react.csv +0 -54
  347. package/skills/ui-ux-pro-max/assets/data/stacks/shadcn.csv +0 -61
  348. package/skills/ui-ux-pro-max/assets/data/stacks/svelte.csv +0 -54
  349. package/skills/ui-ux-pro-max/assets/data/stacks/swiftui.csv +0 -51
  350. package/skills/ui-ux-pro-max/assets/data/stacks/vue.csv +0 -50
  351. package/skills/ui-ux-pro-max/assets/data/styles.csv +0 -68
  352. package/skills/ui-ux-pro-max/assets/data/typography.csv +0 -58
  353. package/skills/ui-ux-pro-max/assets/data/ui-reasoning.csv +0 -101
  354. package/skills/ui-ux-pro-max/assets/data/ux-guidelines.csv +0 -100
  355. package/skills/ui-ux-pro-max/assets/data/web-interface.csv +0 -31
  356. package/skills/ui-ux-pro-max/references/upstream-README.md +0 -488
  357. package/skills/ui-ux-pro-max/references/upstream-skill-content.md +0 -288
  358. package/skills/ui-ux-pro-max/scripts/__init__.py +0 -0
  359. package/skills/ui-ux-pro-max/scripts/core.py +0 -253
  360. package/skills/ui-ux-pro-max/scripts/design_system.py +0 -1071
  361. package/skills/ui-ux-pro-max/scripts/search.py +0 -111
  362. package/skills/video-generation/LICENSE.txt +0 -21
  363. package/skills/video-generation/SKILL.md +0 -1082
  364. package/skills/video-generation/scripts/video.ts +0 -168
  365. package/skills/web-reader/LICENSE.txt +0 -21
  366. package/skills/web-reader/SKILL.md +0 -1140
  367. package/skills/web-reader/scripts/web-reader.ts +0 -37
  368. package/skills/web-search/LICENSE.txt +0 -21
  369. package/skills/web-search/SKILL.md +0 -912
  370. package/skills/web-search/scripts/web_search.ts +0 -44
  371. package/skills/web-shader-extractor/SKILL.md +0 -145
  372. package/skills/web-shader-extractor/references/config-extraction.md +0 -50
  373. package/skills/web-shader-extractor/references/encoded-definitions.md +0 -53
  374. package/skills/web-shader-extractor/references/extraction-workflow.md +0 -61
  375. package/skills/web-shader-extractor/references/porting-strategy.md +0 -164
  376. package/skills/web-shader-extractor/references/shader-injection.md +0 -126
  377. package/skills/web-shader-extractor/references/shaders-com.md +0 -190
  378. package/skills/web-shader-extractor/references/tech-signatures.md +0 -54
  379. package/skills/web-shader-extractor/references/tsl-extraction.md +0 -41
  380. package/skills/web-shader-extractor/references/unicorn-studio.md +0 -353
  381. package/skills/web-shader-extractor/scripts/fetch-rendered-dom.mjs +0 -153
  382. package/skills/web-shader-extractor/scripts/scan-bundle.sh +0 -76
  383. package/skills/writing-plans/SKILL.md +0 -113
  384. package/skills/writing-plans/_meta.json +0 -6
  385. package/skills/xlsx/LICENSE.txt +0 -13
  386. package/skills/xlsx/SKILL.md +0 -230
  387. package/skills/xlsx/engines/chart-templates.md +0 -167
  388. package/skills/xlsx/engines/chart.md +0 -87
  389. package/skills/xlsx/engines/design.md +0 -575
  390. package/skills/xlsx/engines/vba-templates.md +0 -435
  391. package/skills/xlsx/quality/pipeline.md +0 -196
  392. package/skills/xlsx/recalc.py +0 -178
  393. package/skills/xlsx/scenes/advanced.md +0 -271
  394. package/skills/xlsx/scenes/analyze-recipes.md +0 -234
  395. package/skills/xlsx/scenes/analyze.md +0 -95
  396. package/skills/xlsx/scenes/convert.md +0 -133
  397. package/skills/xlsx/scenes/create.md +0 -105
  398. package/skills/xlsx/scenes/edit-patterns.md +0 -222
  399. package/skills/xlsx/scenes/edit.md +0 -195
  400. package/skills/xlsx/scenes/finance.md +0 -318
  401. package/skills/xlsx/scenes/finance_lite.md +0 -192
  402. package/skills/xlsx/scenes/vba.md +0 -298
  403. package/skills/xlsx/setup.sh +0 -136
  404. package/skills/xlsx/templates/base.py +0 -632
  405. package/skills/xlsx/templates/palettes.py +0 -521
  406. package/skills/xlsx/xlsx.py +0 -1299
File without changes
File without changes
package/config.py CHANGED
@@ -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
File without changes
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myagent-ai",
3
- "version": "1.11.2",
3
+ "version": "1.12.0",
4
4
  "description": "本地桌面端执行型AI助手 - Open Interpreter 风格 | Local Desktop Execution-Oriented AI Assistant",
5
5
  "main": "main.py",
6
6
  "bin": {
File without changes
File without changes
File without changes
File without changes
package/web/api_server.py CHANGED
@@ -2594,73 +2594,52 @@ class ApiServer:
2594
2594
  return web.json_response({"ok": True, "hot_reload": True})
2595
2595
 
2596
2596
  async def handle_test_llm(self, request):
2597
- """POST /api/llm/test - 测试 LLM 连接,支持使用请求体中的临时配置"""
2598
- print(f"handle_test_llm 被调用!", flush=True)
2597
+ """POST /api/llm/test - 独立测试指定模型连接,不使用任何兜底/fallback逻辑"""
2599
2598
  try:
2600
- # 尝试从请求体读取临时配置
2601
- temp_client = None
2602
- try:
2603
- data = await request.json()
2604
- print(f"请求数据: {data}", flush=True)
2605
- api_key = data.get("api_key", "")
2606
- base_url = data.get("base_url", "")
2607
- model = data.get("model", "")
2608
- api_type = data.get("api_type", "")
2609
- temperature = data.get("temperature", 0.1)
2610
- # 如果请求中有 provider,直接使用;否则根据 api_type 或 base_url 推断
2611
- provider = data.get("provider", "")
2612
- if not provider:
2613
- if api_type in ("openai-chat", "openai-completions"):
2614
- provider = "openai"
2615
- elif api_type == "anthropic":
2616
- provider = "anthropic"
2617
- elif api_type == "ollama":
2618
- provider = "ollama"
2619
- elif "zhipu" in base_url or "bigmodel" in base_url:
2620
- provider = "zhipu"
2621
- elif "anthropic" in base_url:
2622
- provider = "anthropic"
2623
- elif "ollama" in base_url or "localhost" in base_url or "127.0.0.1" in base_url:
2624
- provider = "ollama"
2625
- elif "dashscope" in base_url or "qwen" in base_url.lower() or "modelscope" in base_url:
2626
- provider = "custom" # DashScope/ModelScope 使用自定义 provider
2627
- else:
2628
- provider = "openai"
2629
- print(f"准备创建 temp_client: provider={provider}, api_key={api_key[:10] if api_key else 'empty'}...", flush=True)
2630
- if api_key or base_url or model:
2631
- # 使用请求体中的配置创建临时客户端测试
2632
- from core.llm import LLMClient
2633
- temp_client = LLMClient(
2634
- provider=provider,
2635
- api_key=api_key or self.core.llm.api_key if self.core.llm else "",
2636
- base_url=base_url or self.core.llm.base_url if self.core.llm else "",
2637
- model=model or self.core.llm.model if self.core.llm else "gpt-4",
2638
- temperature=temperature,
2639
- timeout=30,
2640
- max_retries=1,
2641
- )
2642
- print(f"temp_client 创建成功: {temp_client}, base_url={temp_client.base_url}", flush=True)
2599
+ data = await request.json()
2600
+ api_key = data.get("api_key", "")
2601
+ base_url = data.get("base_url", "")
2602
+ model = data.get("model", "")
2603
+ api_type = data.get("api_type", "")
2604
+ temperature = data.get("temperature", 0.1)
2605
+ provider = data.get("provider", "")
2606
+
2607
+ if not model:
2608
+ return web.json_response({"ok": False, "error": "缺少 model 参数"})
2609
+
2610
+ # 根据 api_type 或 base_url 推断 provider
2611
+ if not provider:
2612
+ if api_type == "anthropic":
2613
+ provider = "anthropic"
2614
+ elif api_type == "ollama":
2615
+ provider = "ollama"
2616
+ elif "zhipu" in base_url or "bigmodel" in base_url:
2617
+ provider = "zhipu"
2618
+ elif "anthropic" in base_url:
2619
+ provider = "anthropic"
2620
+ elif "ollama" in base_url or "localhost" in base_url or "127.0.0.1" in base_url:
2621
+ provider = "ollama"
2622
+ elif "dashscope" in base_url or "qwen" in base_url.lower() or "modelscope" in base_url:
2623
+ provider = "custom"
2643
2624
  else:
2644
- print("条件不满足,temp_client 未创建", flush=True)
2645
- except Exception as e:
2646
- print(f"创建 temp_client 异常: {e}", flush=True)
2647
- logger.warning(f"读取请求体失败: {e}")
2648
- pass # 如果没有请求体或解析失败,使用当前配置
2649
-
2650
- client = temp_client or self.core.llm
2651
- print(f"DEBUG: temp_client={temp_client is not None}, client={client}, client_type={type(client).__name__}, client_base_url={getattr(client, 'base_url', 'N/A')}", flush=True)
2652
- if not client:
2653
- print("没有 LLM 客户端", flush=True)
2654
- return web.json_response({"ok": False, "error": "没有配置 LLM 客户端"})
2655
- msg = await client.chat([Message(role="user", content="Hi, reply OK")])
2656
- print(f"TEST: msg.success={msg.success}, msg.content={repr(msg.content[:50] if msg.content else '')}, msg.error={msg.error}", flush=True)
2657
- # 必须检查 msg.success,否则即使请求失败也会返回成功
2625
+ provider = "openai"
2626
+
2627
+ # 纯粹使用请求体中的参数创建临时客户端,绝不 fallback 到全局配置
2628
+ from core.llm import LLMClient
2629
+ temp_client = LLMClient(
2630
+ provider=provider,
2631
+ api_key=api_key,
2632
+ base_url=base_url,
2633
+ model=model,
2634
+ temperature=temperature,
2635
+ timeout=30,
2636
+ max_retries=1,
2637
+ )
2638
+ msg = await temp_client.chat([Message(role="user", content="Hi, reply OK")])
2658
2639
  if not msg.success:
2659
- print(f"返回失败: {msg.error}", flush=True)
2660
2640
  return web.json_response({"ok": False, "error": msg.error or "LLM 调用失败"})
2661
2641
  return web.json_response({"ok": True, "response": msg.content[:100] if msg.content else ""})
2662
2642
  except Exception as e:
2663
- print(f"handle_test_llm 异常: {e}", flush=True)
2664
2643
  return web.json_response({"ok": False, "error": str(e)})
2665
2644
 
2666
2645
  async def handle_llm_usage(self, request):
@@ -2680,6 +2659,7 @@ class ApiServer:
2680
2659
  "input_modes": m.input_modes,
2681
2660
  "reasoning": m.reasoning,
2682
2661
  "enabled": m.enabled,
2662
+ "is_global_fallback": getattr(m, 'is_global_fallback', True),
2683
2663
  "has_api_key": bool(m.api_key),
2684
2664
  })
2685
2665
  return web.json_response(models)
@@ -2708,6 +2688,7 @@ class ApiServer:
2708
2688
  input_modes=data.get("input_modes", ["text"]),
2709
2689
  reasoning=data.get("reasoning", False),
2710
2690
  enabled=data.get("enabled", True),
2691
+ is_global_fallback=data.get("is_global_fallback", True),
2711
2692
  )
2712
2693
  self.core.config.models_library.append(entry)
2713
2694
  self.core.config_mgr.save()
@@ -2721,7 +2702,7 @@ class ApiServer:
2721
2702
  found = False
2722
2703
  for m in self.core.config.models_library:
2723
2704
  if m.id == model_id:
2724
- for k in ("name", "provider", "api_type", "model", "base_url", "max_tokens", "temperature", "context_window", "input_modes", "reasoning", "enabled"):
2705
+ for k in ("name", "provider", "api_type", "model", "base_url", "max_tokens", "temperature", "context_window", "input_modes", "reasoning", "enabled", "is_global_fallback"):
2725
2706
  if k in data:
2726
2707
  setattr(m, k, data[k])
2727
2708
  if data.get("api_key"):
@@ -3062,20 +3043,40 @@ class ApiServer:
3062
3043
  "is_backup": False,
3063
3044
  })
3064
3045
 
3065
- # 如果没有找到任何主模型配置,使用全局默认 LLM 作为 fallback
3046
+ # 如果没有找到任何主模型配置,使用模型库中标记为全局兜底的模型
3066
3047
  if not chain:
3067
- chain.append({
3068
- "id": "default",
3069
- "name": llm_defaults.model,
3070
- "provider": llm_defaults.provider,
3071
- "api_type": llm_defaults.api_type,
3072
- "model": llm_defaults.model,
3073
- "base_url": llm_defaults.base_url,
3074
- "api_key": llm_defaults.api_key,
3075
- "temperature": llm_defaults.temperature,
3076
- "max_tokens": llm_defaults.max_tokens,
3077
- "is_backup": False,
3078
- })
3048
+ fallback_model = None
3049
+ for me in self.core.config.models_library:
3050
+ if getattr(me, 'is_global_fallback', True) and me.enabled:
3051
+ fallback_model = me
3052
+ break
3053
+ if fallback_model:
3054
+ chain.append({
3055
+ "id": fallback_model.id,
3056
+ "name": fallback_model.name,
3057
+ "provider": fallback_model.provider or llm_defaults.provider,
3058
+ "api_type": getattr(fallback_model, 'api_type', '') or llm_defaults.api_type,
3059
+ "model": fallback_model.model or fallback_model.id,
3060
+ "base_url": fallback_model.base_url or llm_defaults.base_url,
3061
+ "api_key": fallback_model.api_key or llm_defaults.api_key,
3062
+ "temperature": fallback_model.temperature if fallback_model.temperature is not None else llm_defaults.temperature,
3063
+ "max_tokens": fallback_model.max_tokens if fallback_model.max_tokens else llm_defaults.max_tokens,
3064
+ "is_backup": False,
3065
+ })
3066
+ else:
3067
+ # 兜底到全局默认 LLM 配置
3068
+ chain.append({
3069
+ "id": "default",
3070
+ "name": llm_defaults.model,
3071
+ "provider": llm_defaults.provider,
3072
+ "api_type": llm_defaults.api_type,
3073
+ "model": llm_defaults.model,
3074
+ "base_url": llm_defaults.base_url,
3075
+ "api_key": llm_defaults.api_key,
3076
+ "temperature": llm_defaults.temperature,
3077
+ "max_tokens": llm_defaults.max_tokens,
3078
+ "is_backup": False,
3079
+ })
3079
3080
 
3080
3081
  # 备用模型列表
3081
3082
  backup_ids = agent_cfg.get("backup_model_ids", [])
@@ -304,6 +304,7 @@ function initChat() {
304
304
  // Enable/disable send button
305
305
  document.getElementById('userInput').addEventListener('input', function() {
306
306
  document.getElementById('sendBtn').disabled = !this.value.trim();
307
+ saveDraft();
307
308
  });
308
309
  // Load task plan if in exec mode (collapsed by default)
309
310
  if (state.chatMode === 'exec') {
@@ -1182,6 +1183,7 @@ async function selectAgent(agentPath) {
1182
1183
  // 如果 loadSessions 已经 auto-selected 了 session,UI 已由 selectSession 设置好,不再覆盖
1183
1184
 
1184
1185
  document.getElementById('userInput').focus();
1186
+ loadDraft();
1185
1187
  // Reload task plan if in exec mode
1186
1188
  if (state.chatMode === 'exec') loadTaskPlan();
1187
1189
  // Reset escalation and update exec mode UI
@@ -1668,6 +1670,7 @@ function newChat() {
1668
1670
  updateSidebarAgentIndicator();
1669
1671
  const userInput = document.getElementById('userInput');
1670
1672
  if (userInput) userInput.focus();
1673
+ loadDraft();
1671
1674
  // 移动端:新建会话后自动收起侧边栏
1672
1675
  if (isMobile()) closeMobileSidebar();
1673
1676
  }
@@ -1804,6 +1807,7 @@ async function selectSession(id) {
1804
1807
  }
1805
1808
  } catch (_) {}
1806
1809
  document.getElementById('userInput').focus();
1810
+ loadDraft();
1807
1811
  if (isMobile()) closeMobileSidebar();
1808
1812
  }
1809
1813
 
@@ -3,7 +3,36 @@
3
3
  // ── 负责消息发送、SSE 流式处理、大文本检测与分段、
4
4
  // 消息注入、执行进度轮询、输入处理等核心流程 ──
5
5
  // ══════════════════════════════════════════════════════
6
- //
6
+
7
+ // ── 输入框草稿持久化(按 agent + session 维度保存,刷新页面不丢失) ──
8
+ var _draftTimer = null;
9
+ function _draftKey() {
10
+ return 'myagent_draft_' + (state.activeAgent || 'default') + '_' + (state.activeSessionId || '__new__');
11
+ }
12
+ function saveDraft() {
13
+ if (_draftTimer) clearTimeout(_draftTimer);
14
+ _draftTimer = setTimeout(function() {
15
+ var input = document.getElementById('userInput');
16
+ if (!input) return;
17
+ var val = input.value;
18
+ if (val) { localStorage.setItem(_draftKey(), val); }
19
+ else { localStorage.removeItem(_draftKey()); }
20
+ }, 300);
21
+ }
22
+ function loadDraft() {
23
+ var input = document.getElementById('userInput');
24
+ if (!input) return;
25
+ var val = localStorage.getItem(_draftKey());
26
+ input.value = val || '';
27
+ input.style.height = 'auto';
28
+ if (input.value) autoResize(input);
29
+ document.getElementById('sendBtn').disabled = !input.value.trim();
30
+ }
31
+ function clearDraft() {
32
+ localStorage.removeItem(_draftKey());
33
+ }
34
+
35
+
7
36
  // 依赖的全局对象(由 chat_main.js 提供):
8
37
  // state, api(), toast(), escapeHtml(), renderMarkdown(),
9
38
  // renderMessages(), scrollToBottom(), formatSessionName(),
@@ -1145,6 +1174,7 @@ async function sendMessage() {
1145
1174
  input.value = '';
1146
1175
  input.style.height = 'auto';
1147
1176
  document.getElementById('sendBtn').disabled = true;
1177
+ clearDraft();
1148
1178
 
1149
1179
  // Show typing
1150
1180
  state.isGenerating = true;
@@ -1695,6 +1725,7 @@ async function handleInjectChoice(choice) {
1695
1725
  const input = document.getElementById('userInput');
1696
1726
  input.value = '';
1697
1727
  input.style.height = 'auto';
1728
+ clearDraft();
1698
1729
 
1699
1730
  try {
1700
1731
  const rawSid = state.activeSessionId ? state.activeSessionId.replace(`${state.activeAgent}_`, '') : 'web_default';
@@ -610,9 +610,7 @@ async function sendGroupChat() {
610
610
  input.value = '';
611
611
  input.style.height = 'auto';
612
612
  document.getElementById('sendBtn').disabled = true;
613
-
614
- // Show typing
615
- state.isGenerating = true;
613
+ clearDraft();
616
614
  showTypingIndicator();
617
615
  document.getElementById('sendBtn').style.display = 'none';
618
616
  document.getElementById('stopBtn').style.display = '';
package/web/ui/index.html CHANGED
@@ -1120,47 +1120,10 @@ async function resetAgentPerms(name){
1120
1120
 
1121
1121
  // ========== LLM ==========
1122
1122
  async function renderLLM(){
1123
- const [c,u,models]=await Promise.all([api('/api/llm'),api('/api/llm/usage'),api('/api/models')]);
1124
- if(c.error){$('content').innerHTML='<div class="empty" style="color:var(--danger)">加载失败: '+escHtml(c.error)+'</div>';return}
1123
+ const [u,models]=await Promise.all([api('/api/llm/usage'),api('/api/models')]);
1125
1124
  // 更新模型缓存
1126
1125
  allModelsCache=Array.isArray(models)?models:[];
1127
- const providerOpts=['openai','anthropic','ollama','zhipu','deepseek','moonshot','qwen','custom','modelscope'].map(p=>`<option value="${p}" ${c.provider===p?'selected':''}>${p}</option>`).join('');
1128
- const apiTypeOpts=['openai-completions','openai-chat','anthropic','ollama'].map(t=>`<option value="${t}" ${c.api_type===t?'selected':''}>${t}</option>`).join('');
1129
- const isCustomApiType=c.api_type&&!['openai-completions','openai-chat','anthropic','ollama'].includes(c.api_type);
1130
- const inputModesArr=c.input_modes||['text'];
1131
- const inputModesChecked=['text','image','video','audio'].map(m=>`<label style="display:inline-flex;align-items:center;gap:4px;margin-right:12px"><input type="checkbox" id="llmInputMode_${m}" value="${m}" ${inputModesArr.indexOf(m)>-1?'checked':''}>${m}</label>`).join('');
1132
- let html=`<div class="card"><h3>全局模型配置</h3>
1133
- <div class="form-row">
1134
- <div class="form-group"><label>Provider</label><select id="llmProvider">${providerOpts}</select></div>
1135
- <div class="form-group">
1136
- <label>API 类型</label>
1137
- <select id="llmApiTypeSelect" onchange="toggleApiTypeInput('llm')">
1138
- ${apiTypeOpts}
1139
- <option value="custom" ${isCustomApiType?'selected':''}>custom (自定义)</option>
1140
- </select>
1141
- </div>
1142
- </div>
1143
- <div id="llmApiTypeCustomWrap" style="${isCustomApiType?'':'display:none'}" class="form-group">
1144
- <label>自定义 API 类型</label>
1145
- <input id="llmApiTypeCustom" value="${isCustomApiType?escHtml(c.api_type):''}" placeholder="输入自定义 API 类型">
1146
- </div>
1147
- <div class="form-group"><label>模型</label><input id="llmModel" value="${c.model||''}" placeholder="如 gpt-4o"></div>
1148
- <div class="form-group"><label>Base URL</label><input id="llmUrl" value="${c.base_url||''}" placeholder="https://api.openai.com/v1"></div>
1149
- <div class="form-group"><label>API Key</label><input id="llmKey" type="password" value="" placeholder="${c.api_key_set?'已配置(留空不修改)':'未配置'}"></div>
1150
- <div class="form-row">
1151
- <div class="form-group"><label>上下文窗口</label><input id="llmContextWindow" type="number" value="${c.context_window||128000}" placeholder="128000"></div>
1152
- <div class="form-group"><label>最大输出</label><input id="llmMaxTokens" type="number" value="${c.max_tokens||4096}" placeholder="4096"></div>
1153
- </div>
1154
- <div class="form-row">
1155
- <div class="form-group"><label>Temperature</label><input id="llmTemp" type="number" step="0.1" value="${c.temperature||0.7}" placeholder="0.1"></div>
1156
- <div class="form-group" style="display:flex;align-items:center">
1157
- <input id="llmReasoning" type="checkbox" ${c.reasoning?'checked':''} style="margin-right:6px"><label for="llmReasoning" style="margin:0">支持推理</label>
1158
- </div>
1159
- </div>
1160
- <div class="form-group"><label>输入模式</label><div style="padding:8px 0">${inputModesChecked}</div></div>
1161
- <div class="flex gap-8 mt-16"><button class="btn btn-primary" onclick="saveLLM()">保存配置</button><button class="btn btn-success" onclick="testLLM()" onmouseenter="showTestCode(event,'global')" onmouseleave="hideTestCode()">测试连接</button></div>
1162
- <div id="testCodeTooltip" style="display:none;position:fixed;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:8px;font-size:12px;font-family:Consolas,monospace;max-width:400px;z-index:9999;box-shadow:0 4px 12px rgba(0,0,0,0.3);border:1px solid #3c3c3c"><pre id="testCodeContent" style="margin:0;white-space:pre-wrap"></pre></div>
1163
- </div>`;
1126
+ let html='';
1164
1127
  // 用量统计
1165
1128
  html+=`<div class="card"><h3>用量统计</h3><div class="grid" style="grid-template-columns:repeat(4,1fr)">
1166
1129
  <div class="stat"><div class="label">调用次数</div><div class="value">${u.call_count||0}</div></div>
@@ -1179,11 +1142,12 @@ async function renderLLM(){
1179
1142
  if(!modelList.length){
1180
1143
  html+='<div class="empty">暂无自定义模型,点击上方按钮添加。</div>';
1181
1144
  }else{
1182
- html+='<table style="font-size:12px"><tr><th>ID</th><th>名称</th><th>Provider</th><th>模型</th><th>上下文</th><th>输入</th><th>推理</th><th>状态</th><th>操作</th></tr>';
1145
+ html+='<table style="font-size:12px"><tr><th>ID</th><th>名称</th><th>Provider</th><th>模型</th><th>上下文</th><th>输入</th><th>推理</th><th>兜底</th><th>状态</th><th>操作</th></tr>';
1183
1146
  const providerColors={openai:'badge-green',anthropic:'badge-yellow',ollama:'badge-purple',zhipu:'badge-blue',custom:'badge-red',deepseek:'badge-blue',moonshot:'badge-purple',qwen:'badge-yellow',modelscope:'badge-purple'};
1184
1147
  for(const m of modelList){
1185
1148
  const badgeClass=providerColors[m.provider]||'badge-green';
1186
1149
  const inputModes=m.input_modes?m.input_modes.join(','):'text';
1150
+ const isFallback=m.is_global_fallback!==false;
1187
1151
  html+=`<tr>
1188
1152
  <td><code>${escHtml(m.id)}</code></td>
1189
1153
  <td>${escHtml(m.name||'')}</td>
@@ -1192,9 +1156,10 @@ async function renderLLM(){
1192
1156
  <td>${(m.context_window||128000).toLocaleString()}</td>
1193
1157
  <td>${escHtml(inputModes)}</td>
1194
1158
  <td>${m.reasoning?'<span class="badge badge-purple">是</span>':'-'}</td>
1159
+ <td><span style="cursor:help" title="作为保障系统运行的最终兜底模型">${isFallback?'<span class="badge badge-green">&#9745;</span>':'<span class="badge badge-red">&#9744;</span>'}</span></td>
1195
1160
  <td>${m.enabled?'<span class="badge badge-green">启用</span>':'<span class="badge badge-red">禁用</span>'}</td>
1196
1161
  <td><button class="btn btn-sm btn-ghost" onclick="showEditModelModal('${escHtml(m.id)}')">编辑</button>
1197
- <button class="btn btn-sm btn-success" onclick="testModel('${escHtml(m.id)}')" onmouseenter="showTestCode(event,'model','${escHtml(m.id)}','${escHtml(m.model)}','${escHtml(m.base_url)}','${escHtml(m.provider)}','${escHtml(m.api_type||'')}','${m.temperature||0.1}')" onmouseleave="hideTestCode()">测试</button>
1162
+ <button class="btn btn-sm btn-success" onclick="testModel('${escHtml(m.id)}')">测试</button>
1198
1163
  <button class="btn btn-sm btn-danger" onclick="deleteModel('${escHtml(m.id)}','${escHtml(String(m.name||'').replace(/'/g,"\\'"))}')">删除</button></td></tr>`;
1199
1164
  }
1200
1165
  html+='</table>';
@@ -1202,70 +1167,12 @@ async function renderLLM(){
1202
1167
  html+='</div>';
1203
1168
  $('content').innerHTML=html;
1204
1169
  }
1205
- async function saveLLM(){
1206
- const inputModes=Array.from(document.querySelectorAll('[id^="llmInputMode_"]:checked')).map(c=>c.value);
1207
- const apiTypeSelect=$('llmApiTypeSelect').value;
1208
- const apiType=apiTypeSelect==='custom'?($('llmApiTypeCustom').value||'custom'):apiTypeSelect;
1209
- const payload={
1210
- provider:$('llmProvider').value,
1211
- api_type:apiType,
1212
- model:$('llmModel').value,
1213
- base_url:$('llmUrl').value,
1214
- temperature:parseFloat($('llmTemp').value)||0.1,
1215
- max_tokens:parseInt($('llmMaxTokens').value)||4096,
1216
- context_window:parseInt($('llmContextWindow').value)||128000,
1217
- input_modes:inputModes,
1218
- reasoning:$('llmReasoning').checked
1219
- };
1220
- if($('llmKey').value)payload.api_key=$('llmKey').value;
1221
- const r=await api('/api/llm',{method:'PUT',body:JSON.stringify(payload)});
1222
- if(r.error){showToast(r.error,'danger');return}showToast('已保存','success');renderLLM();
1223
- }
1224
- async function testLLM(){
1225
- const btn=event.target;btn.textContent='测试中...';btn.disabled=true;
1226
- hideTestCode();
1227
- const provider=$('llmProvider').value,model=$('llmModel').value,base_url=$('llmUrl').value;
1228
- const temperature=parseFloat($('llmTemp').value)||0.1;
1229
- const apiTypeSelect=$('llmApiTypeSelect').value;
1230
- const api_type=apiTypeSelect==='custom'?($('llmApiTypeCustom').value||'custom'):apiTypeSelect;
1231
- const r=await api('/api/llm/test',{method:'POST',body:JSON.stringify({provider,api_type,model,base_url,temperature})});btn.textContent='测试连接';btn.disabled=false;
1232
- showToast(r.ok?'连接成功: '+r.response:'连接失败: '+r.error,r.ok?'success':'danger');
1233
- }
1234
- function showTestCode(e,type,modelId,modelName,baseUrl,provider,apiType,temperature){
1235
- const tooltip=document.getElementById('testCodeTooltip');
1236
- const content=document.getElementById('testCodeContent');
1237
- if(!tooltip||!content)return;
1238
- let code;
1239
- if(type==='global'){
1240
- const provider=$('llmProvider').value,model=$('llmModel').value,base_url=$('llmUrl').value;
1241
- const temp=parseFloat($('llmTemp').value)||0.1;
1242
- const apiTypeSelect=$('llmApiTypeSelect').value;
1243
- const api_type=apiTypeSelect==='custom'?($('llmApiTypeCustom').value||'custom'):apiTypeSelect;
1244
- code=`POST /api/llm/test\n\n{\n "provider": "${provider}",\n "api_type": "${api_type}",\n "model": "${model}",\n "base_url": "${base_url}",\n "temperature": ${temp}\n}`;
1245
- }else{
1246
- const showApiType=apiType&&apiType!=='openai-completions';
1247
- const temp=temperature||0.1;
1248
-
1249
- code=`POST /api/llm/test\n\n{\n "provider": "${provider}"${showApiType?`,\n "api_type": "${apiType}"`:''},\n "model": "${modelName}",\n "base_url": "${baseUrl}",\n "temperature": ${temp}\n}`;
1250
- }
1251
- content.textContent=code;
1252
- tooltip.style.display='block';
1253
- const rect=tooltip.getBoundingClientRect();
1254
- let left=e.clientX+10,top=e.clientY+10;
1255
- if(left+400>window.innerWidth)left=e.clientX-420;
1256
- if(top+100>window.innerHeight)top=e.clientY-110;
1257
- tooltip.style.left=left+'px';tooltip.style.top=top+'px';
1258
- }
1259
- function hideTestCode(){
1260
- const tooltip=document.getElementById('testCodeTooltip');
1261
- if(tooltip)tooltip.style.display='none';
1262
- }
1170
+ // saveLLM / testLLM / showTestCode / hideTestCode 已移除(全局模型配置卡片已删除)
1263
1171
  async function testModel(modelId){
1264
1172
  const model=allModelsCache.find(m=>m.id===modelId);
1265
1173
  if(!model){showToast('模型不存在','danger');return;}
1266
- hideTestCode();
1267
1174
  const btn=event.target;btn.textContent='测试中...';btn.disabled=true;
1268
- // 必须发送 api_key,否则后端会 fallback 到全局配置,导致测试不准
1175
+ // 直接发送模型自身配置,使用独立的测试接口,不经过任何兜底/fallback逻辑
1269
1176
  const payload={model:model.model,base_url:model.base_url,provider:model.provider,temperature:model.temperature||0.1,api_key:model.api_key||''};
1270
1177
  if(model.api_type)payload.api_type=model.api_type;
1271
1178
  const r=await api('/api/llm/test',{method:'POST',body:JSON.stringify(payload)});
@@ -1286,6 +1193,7 @@ function showAddModelModal(editId){
1286
1193
  const inputModesArr=model&&model.input_modes?model.input_modes:['text'];
1287
1194
  const reasoning=model?model.reasoning:false;
1288
1195
  const maxTokens=model&&model.max_tokens?model.max_tokens:4096;
1196
+ const isFallback=model?model.is_global_fallback!==false:true;
1289
1197
  const provOpts=['custom','openai','anthropic','ollama','zhipu','deepseek','moonshot','qwen','modelscope'].map(p=>`<option value="${p}" ${provider===p?'selected':''}>${p}</option>`).join('');
1290
1198
  const apiTypeOpts=['openai-completions','openai-chat','anthropic','ollama'].map(t=>`<option value="${t}" ${apiType===t?'selected':''}>${t}</option>`).join('');
1291
1199
  const isCustomApiType=apiType==='custom'||!['openai-completions','openai-chat','anthropic','ollama'].includes(apiType);
@@ -1323,6 +1231,9 @@ function showAddModelModal(editId){
1323
1231
  </div>
1324
1232
  </div>
1325
1233
  <div class="form-group"><label>输入模式</label><div style="padding:8px 0">${inputModesChecked}</div></div>
1234
+ <div class="form-group" style="display:flex;align-items:center">
1235
+ <input id="mlGlobalFallback" type="checkbox" ${isFallback?'checked':''} style="margin-right:6px"><label for="mlGlobalFallback" style="margin:0;cursor:help" title="作为保障系统运行的最终兜底模型">全局兜底</label>
1236
+ </div>
1326
1237
  <div class="flex gap-8 mt-16"><button class="btn btn-primary" onclick="doSaveModel('${escHtml(editId)}')">${isEdit?'保存':'添加'}</button><button class="btn btn-ghost" onclick="closeModal()">取消</button></div>
1327
1238
  </div></div>`;
1328
1239
  }
@@ -1348,7 +1259,8 @@ async function doSaveModel(editId){
1348
1259
  max_tokens:parseInt($('mlMaxTokens').value)||4096,
1349
1260
  temperature:parseFloat($('mlTemp').value)||0.1,
1350
1261
  input_modes:inputModes,
1351
- reasoning:$('mlReasoning').checked
1262
+ reasoning:$('mlReasoning').checked,
1263
+ is_global_fallback:$('mlGlobalFallback').checked
1352
1264
  };
1353
1265
  if($('mlApiKey').value)payload.api_key=$('mlApiKey').value;
1354
1266
  let r;
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 z-ai-web-dev-sdk Skills
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.