myagent-ai 1.0.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 (486) hide show
  1. package/Dockerfile +30 -0
  2. package/README.md +333 -0
  3. package/agents/__init__.py +6 -0
  4. package/agents/__pycache__/main_agent.cpython-312.pyc +0 -0
  5. package/agents/base.py +115 -0
  6. package/agents/main_agent.py +695 -0
  7. package/agents/memory_agent.py +313 -0
  8. package/agents/tool_agent.py +248 -0
  9. package/chatbot/__init__.py +5 -0
  10. package/chatbot/base.py +124 -0
  11. package/chatbot/discord_bot.py +146 -0
  12. package/chatbot/feishu_bot.py +548 -0
  13. package/chatbot/manager.py +164 -0
  14. package/chatbot/qq_bot.py +189 -0
  15. package/chatbot/telegram_bot.py +167 -0
  16. package/chatbot/wechat_bot.py +558 -0
  17. package/communication/__init__.py +66 -0
  18. package/communication/channel.py +576 -0
  19. package/communication/crypto.py +347 -0
  20. package/communication/manager.py +397 -0
  21. package/communication/peer.py +156 -0
  22. package/config.py +464 -0
  23. package/core/__init__.py +10 -0
  24. package/core/config_broadcast.py +276 -0
  25. package/core/llm.py +878 -0
  26. package/core/logger.py +241 -0
  27. package/core/task_queue.py +362 -0
  28. package/core/utils.py +184 -0
  29. package/executor/__init__.py +4 -0
  30. package/executor/__pycache__/engine.cpython-312.pyc +0 -0
  31. package/executor/engine.py +1215 -0
  32. package/groups/__init__.py +15 -0
  33. package/groups/manager.py +724 -0
  34. package/knowledge/__init__.py +4 -0
  35. package/knowledge/rag.py +444 -0
  36. package/main.py +801 -0
  37. package/memory/__init__.py +4 -0
  38. package/memory/manager.py +840 -0
  39. package/organization/__init__.py +4 -0
  40. package/organization/manager.py +350 -0
  41. package/package.json +58 -0
  42. package/requirements.txt +59 -0
  43. package/setup.py +40 -0
  44. package/skills/ASR/LICENSE.txt +21 -0
  45. package/skills/ASR/SKILL.md +580 -0
  46. package/skills/ASR/scripts/asr.ts +27 -0
  47. package/skills/LLM/LICENSE.txt +21 -0
  48. package/skills/LLM/SKILL.md +856 -0
  49. package/skills/LLM/scripts/chat.ts +32 -0
  50. package/skills/TTS/LICENSE.txt +21 -0
  51. package/skills/TTS/SKILL.md +735 -0
  52. package/skills/TTS/tts.ts +25 -0
  53. package/skills/VLM/LICENSE.txt +21 -0
  54. package/skills/VLM/SKILL.md +588 -0
  55. package/skills/VLM/scripts/vlm.ts +57 -0
  56. package/skills/__init__.py +5 -0
  57. package/skills/agent-browser/SKILL.md +328 -0
  58. package/skills/ai-news-collectors/SKILL.md +157 -0
  59. package/skills/ai-news-collectors/_meta.json +6 -0
  60. package/skills/ai-news-collectors/references/sources.md +128 -0
  61. package/skills/aminer-open-academic/SKILL.md +312 -0
  62. package/skills/aminer-open-academic/_meta.json +6 -0
  63. package/skills/aminer-open-academic/evals/evals.json +46 -0
  64. package/skills/aminer-open-academic/references/api-catalog.md +1032 -0
  65. package/skills/aminer-open-academic/scripts/__pycache__/aminer_client.cpython-312.pyc +0 -0
  66. package/skills/aminer-open-academic/scripts/aminer_client.py +875 -0
  67. package/skills/auto-target-tracker/SKILL.md +317 -0
  68. package/skills/base.py +147 -0
  69. package/skills/blog-writer/2024-02-17-radical-transparency-sales.md +35 -0
  70. package/skills/blog-writer/2024-02-17-raycast-spotlight-superpowers.md +33 -0
  71. package/skills/blog-writer/2024-02-17-short-form-content-marketing.md +47 -0
  72. package/skills/blog-writer/2024-02-17-typing-speed-benefits.md +33 -0
  73. package/skills/blog-writer/2024-03-14-effective-ai-prompts.md +55 -0
  74. package/skills/blog-writer/2024-11-08-ai-revolutionizing-entry-level-sales.md +43 -0
  75. package/skills/blog-writer/2025-11-12-why-ai-art-is-useless.md +49 -0
  76. package/skills/blog-writer/README.md +2 -0
  77. package/skills/blog-writer/SKILL.md +158 -0
  78. package/skills/blog-writer/__pycache__/manage_examples.cpython-312.pyc +0 -0
  79. package/skills/blog-writer/_meta.json +6 -0
  80. package/skills/blog-writer/manage_examples.py +90 -0
  81. package/skills/blog-writer/style-guide.md +160 -0
  82. package/skills/browser_skill.py +146 -0
  83. package/skills/coding-agent/SKILL.md +120 -0
  84. package/skills/coding-agent/_meta.json +6 -0
  85. package/skills/coding-agent/criteria.md +48 -0
  86. package/skills/coding-agent/execution.md +42 -0
  87. package/skills/coding-agent/memory-template.md +38 -0
  88. package/skills/coding-agent/planning.md +31 -0
  89. package/skills/coding-agent/state.md +60 -0
  90. package/skills/coding-agent/verification.md +39 -0
  91. package/skills/content-strategy/SKILL.md +181 -0
  92. package/skills/content-strategy/_meta.json +6 -0
  93. package/skills/contentanalysis/ExtractWisdom/SKILL.md +229 -0
  94. package/skills/contentanalysis/ExtractWisdom/Workflows/Extract.md +60 -0
  95. package/skills/contentanalysis/SKILL.md +14 -0
  96. package/skills/docx/CHANGELOG.md +85 -0
  97. package/skills/docx/LICENSE.txt +30 -0
  98. package/skills/docx/SKILL.md +455 -0
  99. package/skills/docx/docx-js.md +681 -0
  100. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  101. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  102. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  103. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  104. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  105. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  106. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  107. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  108. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  109. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  110. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  111. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  112. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  113. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  114. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  115. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  116. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  117. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  118. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  119. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  120. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  121. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  122. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  123. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  124. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  125. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  126. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  127. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  128. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  129. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  130. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  131. package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  132. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  133. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  134. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  135. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  136. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  137. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  138. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  139. package/skills/docx/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
  140. package/skills/docx/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
  141. package/skills/docx/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
  142. package/skills/docx/ooxml/scripts/pack.py +159 -0
  143. package/skills/docx/ooxml/scripts/unpack.py +29 -0
  144. package/skills/docx/ooxml/scripts/validate.py +69 -0
  145. package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  146. package/skills/docx/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
  147. package/skills/docx/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
  148. package/skills/docx/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
  149. package/skills/docx/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
  150. package/skills/docx/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
  151. package/skills/docx/ooxml/scripts/validation/base.py +951 -0
  152. package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  153. package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  154. package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  155. package/skills/docx/ooxml.md +615 -0
  156. package/skills/docx/scripts/__init__.py +1 -0
  157. package/skills/docx/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  158. package/skills/docx/scripts/__pycache__/add_toc_placeholders.cpython-312.pyc +0 -0
  159. package/skills/docx/scripts/__pycache__/document.cpython-312.pyc +0 -0
  160. package/skills/docx/scripts/__pycache__/utilities.cpython-312.pyc +0 -0
  161. package/skills/docx/scripts/add_toc_placeholders.py +220 -0
  162. package/skills/docx/scripts/document.py +1302 -0
  163. package/skills/docx/scripts/templates/comments.xml +3 -0
  164. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  165. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  166. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  167. package/skills/docx/scripts/templates/people.xml +3 -0
  168. package/skills/docx/scripts/utilities.py +374 -0
  169. package/skills/dream-interpreter/SKILL.md +88 -0
  170. package/skills/dream-interpreter/assets/example_asset.txt +24 -0
  171. package/skills/dream-interpreter/references/api_reference.md +34 -0
  172. package/skills/dream-interpreter/references/interpretation-guide.md +83 -0
  173. package/skills/dream-interpreter/references/output-schema.md +65 -0
  174. package/skills/dream-interpreter/references/questioning-strategy.md +62 -0
  175. package/skills/dream-interpreter/references/visual-mapping.md +81 -0
  176. package/skills/dream-interpreter/scripts/__pycache__/example.cpython-312.pyc +0 -0
  177. package/skills/dream-interpreter/scripts/example.py +19 -0
  178. package/skills/dream-interpreter/skill.json +7 -0
  179. package/skills/file_skill.py +246 -0
  180. package/skills/finance/Finance_API_Doc.md +445 -0
  181. package/skills/finance/SKILL.md +53 -0
  182. package/skills/fullstack-dev/SKILL.md +205 -0
  183. package/skills/get-fortune-analysis/SKILL.md +370 -0
  184. package/skills/get-fortune-analysis/lunar_python.py +91 -0
  185. package/skills/gift-evaluator/SKILL.md +83 -0
  186. package/skills/gift-evaluator/__pycache__/html_tools.cpython-312.pyc +0 -0
  187. package/skills/gift-evaluator/html_tools.py +268 -0
  188. package/skills/image-edit/LICENSE.txt +21 -0
  189. package/skills/image-edit/SKILL.md +896 -0
  190. package/skills/image-edit/scripts/image-edit.ts +36 -0
  191. package/skills/image-generation/LICENSE.txt +21 -0
  192. package/skills/image-generation/SKILL.md +583 -0
  193. package/skills/image-generation/scripts/image-generation.ts +28 -0
  194. package/skills/image-understand/LICENSE.txt +21 -0
  195. package/skills/image-understand/SKILL.md +855 -0
  196. package/skills/image-understand/scripts/image-understand.ts +41 -0
  197. package/skills/interview-designer/README.md +70 -0
  198. package/skills/interview-designer/SKILL.md +53 -0
  199. package/skills/interview-designer/_meta.json +6 -0
  200. package/skills/interview-designer/references/design_rationale.md +43 -0
  201. package/skills/interview-designer/templates/interview_guide_template.md +62 -0
  202. package/skills/market-research-reports/SKILL.md +901 -0
  203. package/skills/market-research-reports/assets/FORMATTING_GUIDE.md +428 -0
  204. package/skills/market-research-reports/assets/market_report_template.tex +1380 -0
  205. package/skills/market-research-reports/assets/market_research.sty +564 -0
  206. package/skills/market-research-reports/references/data_analysis_patterns.md +548 -0
  207. package/skills/market-research-reports/references/report_structure_guide.md +999 -0
  208. package/skills/market-research-reports/references/visual_generation_guide.md +1077 -0
  209. package/skills/market-research-reports/scripts/__pycache__/generate_market_visuals.cpython-312.pyc +0 -0
  210. package/skills/market-research-reports/scripts/generate_market_visuals.py +529 -0
  211. package/skills/marketing-mode/README.md +49 -0
  212. package/skills/marketing-mode/SKILL.md +693 -0
  213. package/skills/marketing-mode/_meta.json +6 -0
  214. package/skills/marketing-mode/mode-prompt.md +39 -0
  215. package/skills/marketing-mode/skill.json +51 -0
  216. package/skills/mindfulness-meditation/SKILL.md +65 -0
  217. package/skills/mindfulness-meditation/_meta.json +6 -0
  218. package/skills/multi-search-engine/CHANGELOG.md +15 -0
  219. package/skills/multi-search-engine/CHANNELLOG.md +48 -0
  220. package/skills/multi-search-engine/SKILL.md +78 -0
  221. package/skills/multi-search-engine/_meta.json +6 -0
  222. package/skills/multi-search-engine/config.json +14 -0
  223. package/skills/multi-search-engine/metadata.json +7 -0
  224. package/skills/multi-search-engine/references/international-search.md +651 -0
  225. package/skills/pdf/LICENSE.txt +30 -0
  226. package/skills/pdf/SKILL.md +1534 -0
  227. package/skills/pdf/forms.md +205 -0
  228. package/skills/pdf/reference.md +765 -0
  229. package/skills/pdf/scripts/__pycache__/add_zai_metadata.cpython-312.pyc +0 -0
  230. package/skills/pdf/scripts/__pycache__/check_bounding_boxes.cpython-312.pyc +0 -0
  231. package/skills/pdf/scripts/__pycache__/check_bounding_boxes_test.cpython-312.pyc +0 -0
  232. package/skills/pdf/scripts/__pycache__/check_fillable_fields.cpython-312.pyc +0 -0
  233. package/skills/pdf/scripts/__pycache__/convert_pdf_to_images.cpython-312.pyc +0 -0
  234. package/skills/pdf/scripts/__pycache__/create_validation_image.cpython-312.pyc +0 -0
  235. package/skills/pdf/scripts/__pycache__/extract_form_field_info.cpython-312.pyc +0 -0
  236. package/skills/pdf/scripts/__pycache__/fill_fillable_fields.cpython-312.pyc +0 -0
  237. package/skills/pdf/scripts/__pycache__/fill_pdf_form_with_annotations.cpython-312.pyc +0 -0
  238. package/skills/pdf/scripts/__pycache__/sanitize_code.cpython-312.pyc +0 -0
  239. package/skills/pdf/scripts/add_zai_metadata.py +172 -0
  240. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  241. package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  242. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  243. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  244. package/skills/pdf/scripts/create_validation_image.py +41 -0
  245. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  246. package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  247. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  248. package/skills/pdf/scripts/sanitize_code.py +110 -0
  249. package/skills/podcast-generate/LICENSE.txt +21 -0
  250. package/skills/podcast-generate/SKILL.md +198 -0
  251. package/skills/podcast-generate/generate.ts +661 -0
  252. package/skills/podcast-generate/package.json +30 -0
  253. package/skills/podcast-generate/readme.md +177 -0
  254. package/skills/podcast-generate/test_data/segments.jsonl +3 -0
  255. package/skills/podcast-generate/tsconfig.json +26 -0
  256. package/skills/pptx/LICENSE.txt +30 -0
  257. package/skills/pptx/SKILL.md +507 -0
  258. package/skills/pptx/html2pptx.md +625 -0
  259. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  260. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  261. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  262. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  263. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  264. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  265. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  266. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  267. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  268. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  269. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  270. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  271. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  272. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  273. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  274. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  275. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  276. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  277. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  278. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  279. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  280. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  281. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  282. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  283. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  284. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  285. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  286. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  287. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  288. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  289. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  290. package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  291. package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  292. package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  293. package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  294. package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  295. package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  296. package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  297. package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  298. package/skills/pptx/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
  299. package/skills/pptx/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
  300. package/skills/pptx/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
  301. package/skills/pptx/ooxml/scripts/pack.py +159 -0
  302. package/skills/pptx/ooxml/scripts/unpack.py +29 -0
  303. package/skills/pptx/ooxml/scripts/validate.py +69 -0
  304. package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  305. package/skills/pptx/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
  306. package/skills/pptx/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
  307. package/skills/pptx/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
  308. package/skills/pptx/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
  309. package/skills/pptx/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
  310. package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  311. package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  312. package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  313. package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  314. package/skills/pptx/ooxml.md +427 -0
  315. package/skills/pptx/scripts/__pycache__/inventory.cpython-312.pyc +0 -0
  316. package/skills/pptx/scripts/__pycache__/inventory.cpython-313.pyc +0 -0
  317. package/skills/pptx/scripts/__pycache__/rearrange.cpython-312.pyc +0 -0
  318. package/skills/pptx/scripts/__pycache__/replace.cpython-312.pyc +0 -0
  319. package/skills/pptx/scripts/__pycache__/thumbnail.cpython-312.pyc +0 -0
  320. package/skills/pptx/scripts/html2pptx.js +1044 -0
  321. package/skills/pptx/scripts/inventory.py +1020 -0
  322. package/skills/pptx/scripts/rearrange.py +231 -0
  323. package/skills/pptx/scripts/replace.py +385 -0
  324. package/skills/pptx/scripts/thumbnail.py +450 -0
  325. package/skills/qingyan-research/SKILL.md +294 -0
  326. package/skills/qingyan-research/__pycache__/generate_html.cpython-312.pyc +0 -0
  327. package/skills/qingyan-research/generate_html.py +33 -0
  328. package/skills/registry.py +344 -0
  329. package/skills/search_skill.py +228 -0
  330. package/skills/seo-content-writer/SKILL.md +661 -0
  331. package/skills/seo-content-writer/_meta.json +6 -0
  332. package/skills/seo-content-writer/references/content-structure-templates.md +875 -0
  333. package/skills/seo-content-writer/references/title-formulas.md +339 -0
  334. package/skills/skill-creator/LICENSE.txt +202 -0
  335. package/skills/skill-creator/SKILL.md +485 -0
  336. package/skills/skill-creator/agents/analyzer.md +274 -0
  337. package/skills/skill-creator/agents/comparator.md +202 -0
  338. package/skills/skill-creator/agents/grader.md +223 -0
  339. package/skills/skill-creator/assets/eval_review.html +146 -0
  340. package/skills/skill-creator/eval-viewer/__pycache__/generate_review.cpython-312.pyc +0 -0
  341. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  342. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  343. package/skills/skill-creator/references/schemas.md +430 -0
  344. package/skills/skill-creator/scripts/__init__.py +0 -0
  345. package/skills/skill-creator/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  346. package/skills/skill-creator/scripts/__pycache__/aggregate_benchmark.cpython-312.pyc +0 -0
  347. package/skills/skill-creator/scripts/__pycache__/generate_report.cpython-312.pyc +0 -0
  348. package/skills/skill-creator/scripts/__pycache__/improve_description.cpython-312.pyc +0 -0
  349. package/skills/skill-creator/scripts/__pycache__/package_skill.cpython-312.pyc +0 -0
  350. package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-312.pyc +0 -0
  351. package/skills/skill-creator/scripts/__pycache__/run_eval.cpython-312.pyc +0 -0
  352. package/skills/skill-creator/scripts/__pycache__/run_loop.cpython-312.pyc +0 -0
  353. package/skills/skill-creator/scripts/__pycache__/utils.cpython-312.pyc +0 -0
  354. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  355. package/skills/skill-creator/scripts/generate_report.py +326 -0
  356. package/skills/skill-creator/scripts/improve_description.py +236 -0
  357. package/skills/skill-creator/scripts/package_skill.py +136 -0
  358. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  359. package/skills/skill-creator/scripts/run_eval.py +310 -0
  360. package/skills/skill-creator/scripts/run_loop.py +328 -0
  361. package/skills/skill-creator/scripts/utils.py +47 -0
  362. package/skills/skill-finder-cn/SKILL.md +66 -0
  363. package/skills/skill-finder-cn/_meta.json +6 -0
  364. package/skills/skill-finder-cn/package.json +5 -0
  365. package/skills/skill-finder-cn/scripts/search.sh +15 -0
  366. package/skills/skill-vetter/SKILL.md +137 -0
  367. package/skills/stock-analysis-skill/SKILL.md +156 -0
  368. package/skills/stock-analysis-skill/package.json +21 -0
  369. package/skills/stock-analysis-skill/src/analyzer.ts +264 -0
  370. package/skills/stock-analysis-skill/src/dataFetcher.ts +130 -0
  371. package/skills/stock-analysis-skill/src/dividend.ts +226 -0
  372. package/skills/stock-analysis-skill/src/index.ts +327 -0
  373. package/skills/stock-analysis-skill/src/rumorScanner.ts +200 -0
  374. package/skills/stock-analysis-skill/src/types.ts +167 -0
  375. package/skills/stock-analysis-skill/src/watchlist.ts +292 -0
  376. package/skills/stock-analysis-skill/tsconfig.json +15 -0
  377. package/skills/storyboard-manager/SKILL.md +532 -0
  378. package/skills/storyboard-manager/index.js +9 -0
  379. package/skills/storyboard-manager/package.json +11 -0
  380. package/skills/storyboard-manager/references/character_development.md +232 -0
  381. package/skills/storyboard-manager/references/story_structures.md +148 -0
  382. package/skills/storyboard-manager/scripts/__pycache__/consistency_checker.cpython-312.pyc +0 -0
  383. package/skills/storyboard-manager/scripts/__pycache__/timeline_tracker.cpython-312.pyc +0 -0
  384. package/skills/storyboard-manager/scripts/consistency_checker.py +391 -0
  385. package/skills/storyboard-manager/scripts/timeline_tracker.py +352 -0
  386. package/skills/system_skill.py +249 -0
  387. package/skills/ui-ux-pro-max/SKILL.md +43 -0
  388. package/skills/ui-ux-pro-max/_meta.json +6 -0
  389. package/skills/ui-ux-pro-max/assets/data/charts.csv +26 -0
  390. package/skills/ui-ux-pro-max/assets/data/colors.csv +97 -0
  391. package/skills/ui-ux-pro-max/assets/data/icons.csv +101 -0
  392. package/skills/ui-ux-pro-max/assets/data/landing.csv +31 -0
  393. package/skills/ui-ux-pro-max/assets/data/products.csv +97 -0
  394. package/skills/ui-ux-pro-max/assets/data/react-performance.csv +45 -0
  395. package/skills/ui-ux-pro-max/assets/data/stacks/astro.csv +54 -0
  396. package/skills/ui-ux-pro-max/assets/data/stacks/flutter.csv +53 -0
  397. package/skills/ui-ux-pro-max/assets/data/stacks/html-tailwind.csv +56 -0
  398. package/skills/ui-ux-pro-max/assets/data/stacks/jetpack-compose.csv +53 -0
  399. package/skills/ui-ux-pro-max/assets/data/stacks/nextjs.csv +53 -0
  400. package/skills/ui-ux-pro-max/assets/data/stacks/nuxt-ui.csv +51 -0
  401. package/skills/ui-ux-pro-max/assets/data/stacks/nuxtjs.csv +59 -0
  402. package/skills/ui-ux-pro-max/assets/data/stacks/react-native.csv +52 -0
  403. package/skills/ui-ux-pro-max/assets/data/stacks/react.csv +54 -0
  404. package/skills/ui-ux-pro-max/assets/data/stacks/shadcn.csv +61 -0
  405. package/skills/ui-ux-pro-max/assets/data/stacks/svelte.csv +54 -0
  406. package/skills/ui-ux-pro-max/assets/data/stacks/swiftui.csv +51 -0
  407. package/skills/ui-ux-pro-max/assets/data/stacks/vue.csv +50 -0
  408. package/skills/ui-ux-pro-max/assets/data/styles.csv +68 -0
  409. package/skills/ui-ux-pro-max/assets/data/typography.csv +58 -0
  410. package/skills/ui-ux-pro-max/assets/data/ui-reasoning.csv +101 -0
  411. package/skills/ui-ux-pro-max/assets/data/ux-guidelines.csv +100 -0
  412. package/skills/ui-ux-pro-max/assets/data/web-interface.csv +31 -0
  413. package/skills/ui-ux-pro-max/data/charts.csv +26 -0
  414. package/skills/ui-ux-pro-max/data/colors.csv +97 -0
  415. package/skills/ui-ux-pro-max/data/icons.csv +101 -0
  416. package/skills/ui-ux-pro-max/data/landing.csv +31 -0
  417. package/skills/ui-ux-pro-max/data/products.csv +97 -0
  418. package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  419. package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  420. package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  421. package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  422. package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  423. package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  424. package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  425. package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  426. package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  427. package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  428. package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  429. package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  430. package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  431. package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  432. package/skills/ui-ux-pro-max/data/styles.csv +68 -0
  433. package/skills/ui-ux-pro-max/data/typography.csv +58 -0
  434. package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  435. package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  436. package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  437. package/skills/ui-ux-pro-max/references/upstream-README.md +488 -0
  438. package/skills/ui-ux-pro-max/references/upstream-skill-content.md +288 -0
  439. package/skills/ui-ux-pro-max/scripts/__init__.py +0 -0
  440. package/skills/ui-ux-pro-max/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  441. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  442. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  443. package/skills/ui-ux-pro-max/scripts/__pycache__/search.cpython-312.pyc +0 -0
  444. package/skills/ui-ux-pro-max/scripts/core.py +253 -0
  445. package/skills/ui-ux-pro-max/scripts/design_system.py +1071 -0
  446. package/skills/ui-ux-pro-max/scripts/search.py +111 -0
  447. package/skills/video-generation/LICENSE.txt +21 -0
  448. package/skills/video-generation/SKILL.md +1082 -0
  449. package/skills/video-generation/scripts/video.ts +168 -0
  450. package/skills/video-understand/LICENSE.txt +21 -0
  451. package/skills/video-understand/SKILL.md +916 -0
  452. package/skills/video-understand/scripts/video-understand.ts +41 -0
  453. package/skills/visual-design-foundations/SKILL.md +318 -0
  454. package/skills/visual-design-foundations/references/color-systems.md +417 -0
  455. package/skills/visual-design-foundations/references/spacing-iconography.md +425 -0
  456. package/skills/visual-design-foundations/references/typography-systems.md +432 -0
  457. package/skills/web-reader/LICENSE.txt +21 -0
  458. package/skills/web-reader/SKILL.md +1140 -0
  459. package/skills/web-reader/scripts/web-reader.ts +37 -0
  460. package/skills/web-search/LICENSE.txt +21 -0
  461. package/skills/web-search/SKILL.md +912 -0
  462. package/skills/web-search/scripts/web_search.ts +44 -0
  463. package/skills/web-shader-extractor/SKILL.md +145 -0
  464. package/skills/web-shader-extractor/references/config-extraction.md +50 -0
  465. package/skills/web-shader-extractor/references/encoded-definitions.md +53 -0
  466. package/skills/web-shader-extractor/references/extraction-workflow.md +61 -0
  467. package/skills/web-shader-extractor/references/porting-strategy.md +164 -0
  468. package/skills/web-shader-extractor/references/shader-injection.md +126 -0
  469. package/skills/web-shader-extractor/references/shaders-com.md +190 -0
  470. package/skills/web-shader-extractor/references/tech-signatures.md +54 -0
  471. package/skills/web-shader-extractor/references/tsl-extraction.md +41 -0
  472. package/skills/web-shader-extractor/references/unicorn-studio.md +353 -0
  473. package/skills/web-shader-extractor/scripts/fetch-rendered-dom.mjs +153 -0
  474. package/skills/web-shader-extractor/scripts/scan-bundle.sh +76 -0
  475. package/skills/writing-plans/SKILL.md +116 -0
  476. package/skills/writing-plans/_meta.json +6 -0
  477. package/skills/xlsx/LICENSE.txt +30 -0
  478. package/skills/xlsx/SKILL.md +496 -0
  479. package/skills/xlsx/__pycache__/recalc.cpython-312.pyc +0 -0
  480. package/skills/xlsx/recalc.py +178 -0
  481. package/start.sh +36 -0
  482. package/web/__init__.py +1 -0
  483. package/web/__pycache__/api_server.cpython-312.pyc +0 -0
  484. package/web/api_server.py +2043 -0
  485. package/web/ui/chat.html +3235 -0
  486. package/web/ui/index.html +458 -0
@@ -0,0 +1,1140 @@
1
+ ---
2
+ name: web-reader
3
+ description: Implement web page content extraction capabilities using the z-ai-web-dev-sdk. Use this skill when the user needs to scrape web pages, extract article content, retrieve page metadata, or build applications that process web content. Supports automatic content extraction with title, HTML, and publication time retrieval.
4
+ license: MIT
5
+ ---
6
+
7
+ # Web Reader Skill
8
+
9
+ This skill guides the implementation of web page reading and content extraction functionality using the z-ai-web-dev-sdk package, enabling applications to fetch and process web page content programmatically.
10
+
11
+ ## Skills Path
12
+
13
+ **Skill Location**: `{project_path}/skills/web-reader`
14
+
15
+ This skill is located at the above path in your project.
16
+
17
+ **Reference Scripts**: Example test scripts are available in the `{Skill Location}/scripts/` directory for quick testing and reference. See `{Skill Location}/scripts/web-reader.ts` for a working example.
18
+
19
+ ## Overview
20
+
21
+ Web Reader allows you to build applications that can extract content from web pages, retrieve article metadata, and process HTML content. The API automatically handles content extraction, providing clean, structured data from any web URL.
22
+
23
+ **IMPORTANT**: z-ai-web-dev-sdk MUST be used in backend code only. Never use it in client-side code.
24
+
25
+ ## Prerequisites
26
+
27
+ The z-ai-web-dev-sdk package is already installed. Import it as shown in the examples below.
28
+
29
+ ## CLI Usage (For Simple Tasks)
30
+
31
+ For simple web page content extraction, you can use the z-ai CLI instead of writing code. This is ideal for quick content scraping, testing URLs, or simple automation tasks.
32
+
33
+ ### Basic Page Reading
34
+
35
+ ```bash
36
+ # Extract content from a web page
37
+ z-ai function --name "page_reader" --args '{"url": "https://example.com"}'
38
+
39
+ # Using short options
40
+ z-ai function -n page_reader -a '{"url": "https://www.example.com/article"}'
41
+ ```
42
+
43
+ ### Save Page Content
44
+
45
+ ```bash
46
+ # Save extracted content to JSON file
47
+ z-ai function \
48
+ -n page_reader \
49
+ -a '{"url": "https://news.example.com/article"}' \
50
+ -o page_content.json
51
+
52
+ # Extract and save blog post
53
+ z-ai function \
54
+ -n page_reader \
55
+ -a '{"url": "https://blog.example.com/post/123"}' \
56
+ -o blog_post.json
57
+ ```
58
+
59
+ ### Common Use Cases
60
+
61
+ ```bash
62
+ # Extract news article
63
+ z-ai function \
64
+ -n page_reader \
65
+ -a '{"url": "https://news.site.com/breaking-news"}' \
66
+ -o news.json
67
+
68
+ # Read documentation page
69
+ z-ai function \
70
+ -n page_reader \
71
+ -a '{"url": "https://docs.example.com/getting-started"}' \
72
+ -o docs.json
73
+
74
+ # Scrape blog content
75
+ z-ai function \
76
+ -n page_reader \
77
+ -a '{"url": "https://techblog.com/ai-trends-2024"}' \
78
+ -o blog.json
79
+
80
+ # Extract research article
81
+ z-ai function \
82
+ -n page_reader \
83
+ -a '{"url": "https://research.org/papers/quantum-computing"}' \
84
+ -o research.json
85
+ ```
86
+
87
+ ### CLI Parameters
88
+
89
+ - `--name, -n`: **Required** - Function name (use "page_reader")
90
+ - `--args, -a`: **Required** - JSON arguments object with:
91
+ - `url` (string, required): The URL of the web page to read
92
+ - `--output, -o <path>`: Optional - Output file path (JSON format)
93
+
94
+ ### Response Structure
95
+
96
+ The CLI returns a JSON object containing:
97
+ - `title`: Page title
98
+ - `html`: Main content HTML
99
+ - `text`: Plain text content
100
+ - `publish_time`: Publication timestamp (if available)
101
+ - `url`: Original URL
102
+ - `metadata`: Additional page metadata
103
+
104
+ ### Example Response
105
+
106
+ ```json
107
+ {
108
+ "title": "Introduction to Machine Learning",
109
+ "html": "<article><h1>Introduction to Machine Learning</h1><p>Machine learning is...</p></article>",
110
+ "text": "Introduction to Machine Learning\n\nMachine learning is...",
111
+ "publish_time": "2024-01-15T10:30:00Z",
112
+ "url": "https://example.com/ml-intro",
113
+ "metadata": {
114
+ "author": "John Doe",
115
+ "description": "A comprehensive guide to ML"
116
+ }
117
+ }
118
+ ```
119
+
120
+ ### Processing Multiple URLs
121
+
122
+ ```bash
123
+ # Create a simple script to process multiple URLs
124
+ for url in \
125
+ "https://site1.com/article1" \
126
+ "https://site2.com/article2" \
127
+ "https://site3.com/article3"
128
+ do
129
+ filename=$(echo $url | md5sum | cut -d' ' -f1)
130
+ z-ai function -n page_reader -a "{\"url\": \"$url\"}" -o "${filename}.json"
131
+ done
132
+ ```
133
+
134
+ ### When to Use CLI vs SDK
135
+
136
+ **Use CLI for:**
137
+ - Quick content extraction
138
+ - Testing URL accessibility
139
+ - Simple web scraping tasks
140
+ - One-off content retrieval
141
+
142
+ **Use SDK for:**
143
+ - Batch URL processing with custom logic
144
+ - Integration with web applications
145
+ - Complex content processing pipelines
146
+ - Production applications with error handling
147
+
148
+ ## How It Works
149
+
150
+ The Web Reader uses the `page_reader` function to:
151
+ 1. Fetch the web page content
152
+ 2. Extract main article content and metadata
153
+ 3. Parse and clean the HTML
154
+ 4. Return structured data including title, content, and publication time
155
+
156
+ ## Basic Web Reading Implementation
157
+
158
+ ### Simple Page Reading
159
+
160
+ ```javascript
161
+ import ZAI from 'z-ai-web-dev-sdk';
162
+
163
+ async function readWebPage(url) {
164
+ try {
165
+ const zai = await ZAI.create();
166
+
167
+ const result = await zai.functions.invoke('page_reader', {
168
+ url: url
169
+ });
170
+
171
+ console.log('Title:', result.data.title);
172
+ console.log('URL:', result.data.url);
173
+ console.log('Published:', result.data.publishedTime);
174
+ console.log('HTML Content:', result.data.html);
175
+ console.log('Tokens Used:', result.data.usage.tokens);
176
+
177
+ return result.data;
178
+ } catch (error) {
179
+ console.error('Page reading failed:', error.message);
180
+ throw error;
181
+ }
182
+ }
183
+
184
+ // Usage
185
+ const pageData = await readWebPage('https://example.com/article');
186
+ console.log('Page title:', pageData.title);
187
+ ```
188
+
189
+ ### Extract Article Text Only
190
+
191
+ ```javascript
192
+ import ZAI from 'z-ai-web-dev-sdk';
193
+
194
+ async function extractArticleText(url) {
195
+ const zai = await ZAI.create();
196
+
197
+ const result = await zai.functions.invoke('page_reader', {
198
+ url: url
199
+ });
200
+
201
+ // Convert HTML to plain text (basic approach)
202
+ const plainText = result.data.html
203
+ .replace(/<[^>]*>/g, ' ')
204
+ .replace(/\s+/g, ' ')
205
+ .trim();
206
+
207
+ return {
208
+ title: result.data.title,
209
+ text: plainText,
210
+ url: result.data.url,
211
+ publishedTime: result.data.publishedTime
212
+ };
213
+ }
214
+
215
+ // Usage
216
+ const article = await extractArticleText('https://news.example.com/story');
217
+ console.log(article.title);
218
+ console.log(article.text.substring(0, 200) + '...');
219
+ ```
220
+
221
+ ### Read Multiple Pages
222
+
223
+ ```javascript
224
+ import ZAI from 'z-ai-web-dev-sdk';
225
+
226
+ async function readMultiplePages(urls) {
227
+ const zai = await ZAI.create();
228
+ const results = [];
229
+
230
+ for (const url of urls) {
231
+ try {
232
+ const result = await zai.functions.invoke('page_reader', {
233
+ url: url
234
+ });
235
+
236
+ results.push({
237
+ url: url,
238
+ success: true,
239
+ data: result.data
240
+ });
241
+ } catch (error) {
242
+ results.push({
243
+ url: url,
244
+ success: false,
245
+ error: error.message
246
+ });
247
+ }
248
+ }
249
+
250
+ return results;
251
+ }
252
+
253
+ // Usage
254
+ const urls = [
255
+ 'https://example.com/article1',
256
+ 'https://example.com/article2',
257
+ 'https://example.com/article3'
258
+ ];
259
+
260
+ const pages = await readMultiplePages(urls);
261
+ pages.forEach(page => {
262
+ if (page.success) {
263
+ console.log(`✓ ${page.data.title}`);
264
+ } else {
265
+ console.log(`✗ ${page.url}: ${page.error}`);
266
+ }
267
+ });
268
+ ```
269
+
270
+ ## Advanced Use Cases
271
+
272
+ ### Web Content Analyzer
273
+
274
+ ```javascript
275
+ import ZAI from 'z-ai-web-dev-sdk';
276
+
277
+ class WebContentAnalyzer {
278
+ constructor() {
279
+ this.cache = new Map();
280
+ }
281
+
282
+ async initialize() {
283
+ this.zai = await ZAI.create();
284
+ }
285
+
286
+ async readPage(url, useCache = true) {
287
+ // Check cache
288
+ if (useCache && this.cache.has(url)) {
289
+ console.log('Returning cached result for:', url);
290
+ return this.cache.get(url);
291
+ }
292
+
293
+ // Fetch fresh content
294
+ const result = await this.zai.functions.invoke('page_reader', {
295
+ url: url
296
+ });
297
+
298
+ // Cache the result
299
+ if (useCache) {
300
+ this.cache.set(url, result.data);
301
+ }
302
+
303
+ return result.data;
304
+ }
305
+
306
+ async getPageMetadata(url) {
307
+ const data = await this.readPage(url);
308
+
309
+ return {
310
+ title: data.title,
311
+ url: data.url,
312
+ publishedTime: data.publishedTime,
313
+ contentLength: data.html.length,
314
+ wordCount: this.estimateWordCount(data.html)
315
+ };
316
+ }
317
+
318
+ estimateWordCount(html) {
319
+ const text = html.replace(/<[^>]*>/g, ' ');
320
+ const words = text.split(/\s+/).filter(word => word.length > 0);
321
+ return words.length;
322
+ }
323
+
324
+ async comparePages(url1, url2) {
325
+ const [page1, page2] = await Promise.all([
326
+ this.readPage(url1),
327
+ this.readPage(url2)
328
+ ]);
329
+
330
+ return {
331
+ page1: {
332
+ title: page1.title,
333
+ wordCount: this.estimateWordCount(page1.html),
334
+ published: page1.publishedTime
335
+ },
336
+ page2: {
337
+ title: page2.title,
338
+ wordCount: this.estimateWordCount(page2.html),
339
+ published: page2.publishedTime
340
+ }
341
+ };
342
+ }
343
+
344
+ clearCache() {
345
+ this.cache.clear();
346
+ }
347
+ }
348
+
349
+ // Usage
350
+ const analyzer = new WebContentAnalyzer();
351
+ await analyzer.initialize();
352
+
353
+ const metadata = await analyzer.getPageMetadata('https://example.com/article');
354
+ console.log('Article Metadata:', metadata);
355
+
356
+ const comparison = await analyzer.comparePages(
357
+ 'https://example.com/article1',
358
+ 'https://example.com/article2'
359
+ );
360
+ console.log('Comparison:', comparison);
361
+ ```
362
+
363
+ ### RSS Feed Reader
364
+
365
+ ```javascript
366
+ import ZAI from 'z-ai-web-dev-sdk';
367
+
368
+ class FeedReader {
369
+ constructor() {
370
+ this.articles = [];
371
+ }
372
+
373
+ async initialize() {
374
+ this.zai = await ZAI.create();
375
+ }
376
+
377
+ async fetchArticlesFromUrls(urls) {
378
+ const articles = [];
379
+
380
+ for (const url of urls) {
381
+ try {
382
+ const result = await this.zai.functions.invoke('page_reader', {
383
+ url: url
384
+ });
385
+
386
+ articles.push({
387
+ title: result.data.title,
388
+ url: result.data.url,
389
+ publishedTime: result.data.publishedTime,
390
+ content: result.data.html,
391
+ fetchedAt: new Date().toISOString()
392
+ });
393
+
394
+ console.log(`Fetched: ${result.data.title}`);
395
+ } catch (error) {
396
+ console.error(`Failed to fetch ${url}:`, error.message);
397
+ }
398
+ }
399
+
400
+ this.articles = articles;
401
+ return articles;
402
+ }
403
+
404
+ getRecentArticles(limit = 10) {
405
+ return this.articles
406
+ .sort((a, b) => {
407
+ const dateA = new Date(a.publishedTime || a.fetchedAt);
408
+ const dateB = new Date(b.publishedTime || b.fetchedAt);
409
+ return dateB - dateA;
410
+ })
411
+ .slice(0, limit);
412
+ }
413
+
414
+ searchArticles(keyword) {
415
+ return this.articles.filter(article => {
416
+ const searchText = `${article.title} ${article.content}`.toLowerCase();
417
+ return searchText.includes(keyword.toLowerCase());
418
+ });
419
+ }
420
+ }
421
+
422
+ // Usage
423
+ const reader = new FeedReader();
424
+ await reader.initialize();
425
+
426
+ const feedUrls = [
427
+ 'https://example.com/article1',
428
+ 'https://example.com/article2',
429
+ 'https://example.com/article3'
430
+ ];
431
+
432
+ await reader.fetchArticlesFromUrls(feedUrls);
433
+ const recent = reader.getRecentArticles(5);
434
+ console.log('Recent articles:', recent.map(a => a.title));
435
+ ```
436
+
437
+ ### Content Aggregator
438
+
439
+ ```javascript
440
+ import ZAI from 'z-ai-web-dev-sdk';
441
+
442
+ async function aggregateContent(urls, options = {}) {
443
+ const zai = await ZAI.create();
444
+ const aggregated = {
445
+ sources: [],
446
+ totalWords: 0,
447
+ aggregatedAt: new Date().toISOString()
448
+ };
449
+
450
+ for (const url of urls) {
451
+ try {
452
+ const result = await zai.functions.invoke('page_reader', {
453
+ url: url
454
+ });
455
+
456
+ const text = result.data.html.replace(/<[^>]*>/g, ' ');
457
+ const wordCount = text.split(/\s+/).filter(w => w.length > 0).length;
458
+
459
+ aggregated.sources.push({
460
+ title: result.data.title,
461
+ url: result.data.url,
462
+ publishedTime: result.data.publishedTime,
463
+ wordCount: wordCount,
464
+ excerpt: text.substring(0, 200).trim() + '...'
465
+ });
466
+
467
+ aggregated.totalWords += wordCount;
468
+
469
+ if (options.delay) {
470
+ await new Promise(resolve => setTimeout(resolve, options.delay));
471
+ }
472
+ } catch (error) {
473
+ console.error(`Failed to fetch ${url}:`, error.message);
474
+ }
475
+ }
476
+
477
+ return aggregated;
478
+ }
479
+
480
+ // Usage
481
+ const sources = [
482
+ 'https://example.com/news1',
483
+ 'https://example.com/news2',
484
+ 'https://example.com/news3'
485
+ ];
486
+
487
+ const aggregated = await aggregateContent(sources, { delay: 1000 });
488
+ console.log(`Aggregated ${aggregated.sources.length} sources`);
489
+ console.log(`Total words: ${aggregated.totalWords}`);
490
+ ```
491
+
492
+ ### Web Scraping Pipeline
493
+
494
+ ```javascript
495
+ import ZAI from 'z-ai-web-dev-sdk';
496
+
497
+ class ScrapingPipeline {
498
+ constructor() {
499
+ this.processors = [];
500
+ }
501
+
502
+ async initialize() {
503
+ this.zai = await ZAI.create();
504
+ }
505
+
506
+ addProcessor(name, processorFn) {
507
+ this.processors.push({ name, fn: processorFn });
508
+ }
509
+
510
+ async scrape(url) {
511
+ // Fetch the page
512
+ const result = await this.zai.functions.invoke('page_reader', {
513
+ url: url
514
+ });
515
+
516
+ let data = {
517
+ raw: result.data,
518
+ processed: {}
519
+ };
520
+
521
+ // Run through processors
522
+ for (const processor of this.processors) {
523
+ try {
524
+ data.processed[processor.name] = await processor.fn(data.raw);
525
+ console.log(`✓ Processed with ${processor.name}`);
526
+ } catch (error) {
527
+ console.error(`✗ Failed ${processor.name}:`, error.message);
528
+ data.processed[processor.name] = null;
529
+ }
530
+ }
531
+
532
+ return data;
533
+ }
534
+ }
535
+
536
+ // Processor functions
537
+ function extractLinks(pageData) {
538
+ const linkRegex = /href=["'](https?:\/\/[^"']+)["']/g;
539
+ const links = [];
540
+ let match;
541
+
542
+ while ((match = linkRegex.exec(pageData.html)) !== null) {
543
+ links.push(match[1]);
544
+ }
545
+
546
+ return [...new Set(links)]; // Remove duplicates
547
+ }
548
+
549
+ function extractImages(pageData) {
550
+ const imgRegex = /src=["'](https?:\/\/[^"']+\.(jpg|jpeg|png|gif|webp))["']/gi;
551
+ const images = [];
552
+ let match;
553
+
554
+ while ((match = imgRegex.exec(pageData.html)) !== null) {
555
+ images.push(match[1]);
556
+ }
557
+
558
+ return [...new Set(images)];
559
+ }
560
+
561
+ function extractPlainText(pageData) {
562
+ return pageData.html
563
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
564
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
565
+ .replace(/<[^>]*>/g, ' ')
566
+ .replace(/\s+/g, ' ')
567
+ .trim();
568
+ }
569
+
570
+ // Usage
571
+ const pipeline = new ScrapingPipeline();
572
+ await pipeline.initialize();
573
+
574
+ pipeline.addProcessor('links', extractLinks);
575
+ pipeline.addProcessor('images', extractImages);
576
+ pipeline.addProcessor('plainText', extractPlainText);
577
+
578
+ const result = await pipeline.scrape('https://example.com/article');
579
+ console.log('Links found:', result.processed.links.length);
580
+ console.log('Images found:', result.processed.images.length);
581
+ console.log('Text length:', result.processed.plainText.length);
582
+ ```
583
+
584
+ ## Response Format
585
+
586
+ ### Successful Response
587
+
588
+ ```typescript
589
+ {
590
+ code: 200,
591
+ status: 200,
592
+ data: {
593
+ title: "Article Title",
594
+ url: "https://example.com/article",
595
+ html: "<div>Article content...</div>",
596
+ publishedTime: "2025-01-15T10:30:00Z",
597
+ usage: {
598
+ tokens: 1500
599
+ }
600
+ },
601
+ meta: {
602
+ usage: {
603
+ tokens: 1500
604
+ }
605
+ }
606
+ }
607
+ ```
608
+
609
+ ### Response Fields
610
+
611
+ | Field | Type | Description |
612
+ |-------|------|-------------|
613
+ | `code` | number | Response status code |
614
+ | `status` | number | HTTP status code |
615
+ | `data.title` | string | Page title |
616
+ | `data.url` | string | Page URL |
617
+ | `data.html` | string | Extracted HTML content |
618
+ | `data.publishedTime` | string | Publication date (optional) |
619
+ | `data.usage.tokens` | number | Tokens used for processing |
620
+ | `meta.usage.tokens` | number | Total tokens used |
621
+
622
+ ## Best Practices
623
+
624
+ ### 1. Error Handling
625
+
626
+ ```javascript
627
+ async function safeReadPage(url) {
628
+ try {
629
+ const zai = await ZAI.create();
630
+
631
+ // Validate URL
632
+ if (!url || !url.startsWith('http')) {
633
+ throw new Error('Invalid URL format');
634
+ }
635
+
636
+ const result = await zai.functions.invoke('page_reader', {
637
+ url: url
638
+ });
639
+
640
+ // Check response status
641
+ if (result.code !== 200) {
642
+ throw new Error(`Failed to fetch page: ${result.code}`);
643
+ }
644
+
645
+ // Verify essential data
646
+ if (!result.data.html || !result.data.title) {
647
+ throw new Error('Incomplete page data received');
648
+ }
649
+
650
+ return {
651
+ success: true,
652
+ data: result.data
653
+ };
654
+ } catch (error) {
655
+ console.error('Page reading error:', error);
656
+ return {
657
+ success: false,
658
+ error: error.message
659
+ };
660
+ }
661
+ }
662
+ ```
663
+
664
+ ### 2. Rate Limiting
665
+
666
+ ```javascript
667
+ class RateLimitedReader {
668
+ constructor(requestsPerMinute = 10) {
669
+ this.requestsPerMinute = requestsPerMinute;
670
+ this.requestTimes = [];
671
+ }
672
+
673
+ async initialize() {
674
+ this.zai = await ZAI.create();
675
+ }
676
+
677
+ async readPage(url) {
678
+ await this.waitForRateLimit();
679
+
680
+ const result = await this.zai.functions.invoke('page_reader', {
681
+ url: url
682
+ });
683
+
684
+ this.requestTimes.push(Date.now());
685
+ return result.data;
686
+ }
687
+
688
+ async waitForRateLimit() {
689
+ const now = Date.now();
690
+ const oneMinuteAgo = now - 60000;
691
+
692
+ // Remove old timestamps
693
+ this.requestTimes = this.requestTimes.filter(time => time > oneMinuteAgo);
694
+
695
+ // Check if we need to wait
696
+ if (this.requestTimes.length >= this.requestsPerMinute) {
697
+ const oldestRequest = this.requestTimes[0];
698
+ const waitTime = 60000 - (now - oldestRequest);
699
+
700
+ if (waitTime > 0) {
701
+ console.log(`Rate limit reached. Waiting ${waitTime}ms...`);
702
+ await new Promise(resolve => setTimeout(resolve, waitTime));
703
+ }
704
+ }
705
+ }
706
+ }
707
+
708
+ // Usage
709
+ const reader = new RateLimitedReader(10); // 10 requests per minute
710
+ await reader.initialize();
711
+
712
+ const urls = ['https://example.com/1', 'https://example.com/2'];
713
+ for (const url of urls) {
714
+ const data = await reader.readPage(url);
715
+ console.log('Fetched:', data.title);
716
+ }
717
+ ```
718
+
719
+ ### 3. Caching Strategy
720
+
721
+ ```javascript
722
+ import ZAI from 'z-ai-web-dev-sdk';
723
+
724
+ class CachedWebReader {
725
+ constructor(cacheDuration = 3600000) { // 1 hour default
726
+ this.cache = new Map();
727
+ this.cacheDuration = cacheDuration;
728
+ }
729
+
730
+ async initialize() {
731
+ this.zai = await ZAI.create();
732
+ }
733
+
734
+ async readPage(url, forceRefresh = false) {
735
+ const cacheKey = url;
736
+ const cached = this.cache.get(cacheKey);
737
+
738
+ // Return cached if valid and not forcing refresh
739
+ if (cached && !forceRefresh) {
740
+ const age = Date.now() - cached.timestamp;
741
+ if (age < this.cacheDuration) {
742
+ console.log('Returning cached content for:', url);
743
+ return cached.data;
744
+ }
745
+ }
746
+
747
+ // Fetch fresh content
748
+ const result = await this.zai.functions.invoke('page_reader', {
749
+ url: url
750
+ });
751
+
752
+ // Update cache
753
+ this.cache.set(cacheKey, {
754
+ data: result.data,
755
+ timestamp: Date.now()
756
+ });
757
+
758
+ return result.data;
759
+ }
760
+
761
+ clearCache() {
762
+ this.cache.clear();
763
+ }
764
+
765
+ getCacheStats() {
766
+ return {
767
+ size: this.cache.size,
768
+ entries: Array.from(this.cache.keys())
769
+ };
770
+ }
771
+ }
772
+
773
+ // Usage
774
+ const reader = new CachedWebReader(3600000); // 1 hour cache
775
+ await reader.initialize();
776
+
777
+ const data1 = await reader.readPage('https://example.com'); // Fresh fetch
778
+ const data2 = await reader.readPage('https://example.com'); // From cache
779
+ const data3 = await reader.readPage('https://example.com', true); // Force refresh
780
+ ```
781
+
782
+ ### 4. Parallel Processing
783
+
784
+ ```javascript
785
+ import ZAI from 'z-ai-web-dev-sdk';
786
+
787
+ async function readPagesInParallel(urls, concurrency = 3) {
788
+ const zai = await ZAI.create();
789
+ const results = [];
790
+
791
+ // Process in batches
792
+ for (let i = 0; i < urls.length; i += concurrency) {
793
+ const batch = urls.slice(i, i + concurrency);
794
+
795
+ const batchResults = await Promise.allSettled(
796
+ batch.map(url =>
797
+ zai.functions.invoke('page_reader', { url })
798
+ .then(result => ({
799
+ url: url,
800
+ success: true,
801
+ data: result.data
802
+ }))
803
+ .catch(error => ({
804
+ url: url,
805
+ success: false,
806
+ error: error.message
807
+ }))
808
+ )
809
+ );
810
+
811
+ results.push(...batchResults.map(r => r.value));
812
+ console.log(`Completed batch ${Math.floor(i / concurrency) + 1}`);
813
+ }
814
+
815
+ return results;
816
+ }
817
+
818
+ // Usage
819
+ const urls = [
820
+ 'https://example.com/1',
821
+ 'https://example.com/2',
822
+ 'https://example.com/3',
823
+ 'https://example.com/4',
824
+ 'https://example.com/5'
825
+ ];
826
+
827
+ const results = await readPagesInParallel(urls, 2); // 2 concurrent requests
828
+ results.forEach(result => {
829
+ if (result.success) {
830
+ console.log(`✓ ${result.data.title}`);
831
+ } else {
832
+ console.log(`✗ ${result.url}: ${result.error}`);
833
+ }
834
+ });
835
+ ```
836
+
837
+ ### 5. Content Processing
838
+
839
+ ```javascript
840
+ import ZAI from 'z-ai-web-dev-sdk';
841
+
842
+ class ContentProcessor {
843
+ static extractMainContent(html) {
844
+ // Remove scripts, styles, and comments
845
+ let content = html
846
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
847
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
848
+ .replace(/<!--[\s\S]*?-->/g, '');
849
+
850
+ return content;
851
+ }
852
+
853
+ static htmlToPlainText(html) {
854
+ return html
855
+ .replace(/<br\s*\/?>/gi, '\n')
856
+ .replace(/<\/p>/gi, '\n\n')
857
+ .replace(/<[^>]*>/g, '')
858
+ .replace(/&nbsp;/g, ' ')
859
+ .replace(/&amp;/g, '&')
860
+ .replace(/&lt;/g, '<')
861
+ .replace(/&gt;/g, '>')
862
+ .replace(/&quot;/g, '"')
863
+ .replace(/\s+/g, ' ')
864
+ .trim();
865
+ }
866
+
867
+ static extractMetadata(html) {
868
+ const metadata = {};
869
+
870
+ // Extract meta description
871
+ const descMatch = html.match(/<meta\s+name=["']description["']\s+content=["']([^"']+)["']/i);
872
+ if (descMatch) metadata.description = descMatch[1];
873
+
874
+ // Extract keywords
875
+ const keywordsMatch = html.match(/<meta\s+name=["']keywords["']\s+content=["']([^"']+)["']/i);
876
+ if (keywordsMatch) metadata.keywords = keywordsMatch[1].split(',').map(k => k.trim());
877
+
878
+ // Extract author
879
+ const authorMatch = html.match(/<meta\s+name=["']author["']\s+content=["']([^"']+)["']/i);
880
+ if (authorMatch) metadata.author = authorMatch[1];
881
+
882
+ return metadata;
883
+ }
884
+ }
885
+
886
+ // Usage
887
+ async function processWebPage(url) {
888
+ const zai = await ZAI.create();
889
+ const result = await zai.functions.invoke('page_reader', { url });
890
+
891
+ return {
892
+ title: result.data.title,
893
+ url: result.data.url,
894
+ mainContent: ContentProcessor.extractMainContent(result.data.html),
895
+ plainText: ContentProcessor.htmlToPlainText(result.data.html),
896
+ metadata: ContentProcessor.extractMetadata(result.data.html),
897
+ publishedTime: result.data.publishedTime
898
+ };
899
+ }
900
+
901
+ const processed = await processWebPage('https://example.com/article');
902
+ console.log('Processed content:', processed.title);
903
+ ```
904
+
905
+ ## Common Use Cases
906
+
907
+ 1. **News Aggregation**: Collect and aggregate news articles from multiple sources
908
+ 2. **Content Monitoring**: Track changes on specific web pages
909
+ 3. **Research Tools**: Extract information from academic or reference websites
910
+ 4. **Price Tracking**: Monitor product pages for price changes
911
+ 5. **SEO Analysis**: Extract page metadata and content for SEO purposes
912
+ 6. **Archive Creation**: Create local copies of web content
913
+ 7. **Content Curation**: Collect and organize web content by topic
914
+ 8. **Competitive Intelligence**: Monitor competitor websites for updates
915
+
916
+ ## Integration Examples
917
+
918
+ ### Express.js API Endpoint
919
+
920
+ ```javascript
921
+ import express from 'express';
922
+ import ZAI from 'z-ai-web-dev-sdk';
923
+
924
+ const app = express();
925
+ app.use(express.json());
926
+
927
+ let zaiInstance;
928
+
929
+ async function initZAI() {
930
+ zaiInstance = await ZAI.create();
931
+ }
932
+
933
+ app.post('/api/read-page', async (req, res) => {
934
+ try {
935
+ const { url } = req.body;
936
+
937
+ if (!url) {
938
+ return res.status(400).json({
939
+ error: 'URL is required'
940
+ });
941
+ }
942
+
943
+ const result = await zaiInstance.functions.invoke('page_reader', {
944
+ url: url
945
+ });
946
+
947
+ res.json({
948
+ success: true,
949
+ data: {
950
+ title: result.data.title,
951
+ url: result.data.url,
952
+ content: result.data.html,
953
+ publishedTime: result.data.publishedTime,
954
+ tokensUsed: result.data.usage.tokens
955
+ }
956
+ });
957
+ } catch (error) {
958
+ res.status(500).json({
959
+ success: false,
960
+ error: error.message
961
+ });
962
+ }
963
+ });
964
+
965
+ app.post('/api/read-multiple', async (req, res) => {
966
+ try {
967
+ const { urls } = req.body;
968
+
969
+ if (!urls || !Array.isArray(urls)) {
970
+ return res.status(400).json({
971
+ error: 'URLs array is required'
972
+ });
973
+ }
974
+
975
+ const results = await Promise.allSettled(
976
+ urls.map(url =>
977
+ zaiInstance.functions.invoke('page_reader', { url })
978
+ .then(result => ({
979
+ url: url,
980
+ success: true,
981
+ data: result.data
982
+ }))
983
+ .catch(error => ({
984
+ url: url,
985
+ success: false,
986
+ error: error.message
987
+ }))
988
+ )
989
+ );
990
+
991
+ res.json({
992
+ success: true,
993
+ results: results.map(r => r.value)
994
+ });
995
+ } catch (error) {
996
+ res.status(500).json({
997
+ success: false,
998
+ error: error.message
999
+ });
1000
+ }
1001
+ });
1002
+
1003
+ initZAI().then(() => {
1004
+ app.listen(3000, () => {
1005
+ console.log('Web reader API running on port 3000');
1006
+ });
1007
+ });
1008
+ ```
1009
+
1010
+ ### Scheduled Content Fetcher
1011
+
1012
+ ```javascript
1013
+ import ZAI from 'z-ai-web-dev-sdk';
1014
+ import cron from 'node-cron';
1015
+
1016
+ class ScheduledFetcher {
1017
+ constructor() {
1018
+ this.urls = [];
1019
+ this.results = [];
1020
+ }
1021
+
1022
+ async initialize() {
1023
+ this.zai = await ZAI.create();
1024
+ }
1025
+
1026
+ addUrl(url, schedule) {
1027
+ this.urls.push({ url, schedule });
1028
+ }
1029
+
1030
+ async fetchContent(url) {
1031
+ try {
1032
+ const result = await this.zai.functions.invoke('page_reader', {
1033
+ url: url
1034
+ });
1035
+
1036
+ return {
1037
+ url: url,
1038
+ success: true,
1039
+ title: result.data.title,
1040
+ content: result.data.html,
1041
+ fetchedAt: new Date().toISOString()
1042
+ };
1043
+ } catch (error) {
1044
+ return {
1045
+ url: url,
1046
+ success: false,
1047
+ error: error.message,
1048
+ fetchedAt: new Date().toISOString()
1049
+ };
1050
+ }
1051
+ }
1052
+
1053
+ startScheduledFetch(url, schedule) {
1054
+ cron.schedule(schedule, async () => {
1055
+ console.log(`Fetching ${url}...`);
1056
+ const result = await this.fetchContent(url);
1057
+ this.results.push(result);
1058
+
1059
+ // Keep only last 100 results
1060
+ if (this.results.length > 100) {
1061
+ this.results = this.results.slice(-100);
1062
+ }
1063
+
1064
+ console.log(`Fetched: ${result.success ? result.title : result.error}`);
1065
+ });
1066
+ }
1067
+
1068
+ start() {
1069
+ for (const { url, schedule } of this.urls) {
1070
+ this.startScheduledFetch(url, schedule);
1071
+ }
1072
+ }
1073
+
1074
+ getResults() {
1075
+ return this.results;
1076
+ }
1077
+ }
1078
+
1079
+ // Usage
1080
+ const fetcher = new ScheduledFetcher();
1081
+ await fetcher.initialize();
1082
+
1083
+ // Fetch every hour
1084
+ fetcher.addUrl('https://example.com/news', '0 * * * *');
1085
+
1086
+ // Fetch every day at midnight
1087
+ fetcher.addUrl('https://example.com/daily', '0 0 * * *');
1088
+
1089
+ fetcher.start();
1090
+ console.log('Scheduled fetching started');
1091
+ ```
1092
+
1093
+ ## Troubleshooting
1094
+
1095
+ **Issue**: "SDK must be used in backend"
1096
+ - **Solution**: Ensure z-ai-web-dev-sdk is only imported and used in server-side code
1097
+
1098
+ **Issue**: Failed to fetch page (404, 403, etc.)
1099
+ - **Solution**: Verify the URL is accessible and not behind authentication/paywall
1100
+
1101
+ **Issue**: Incomplete or missing content
1102
+ - **Solution**: Some pages may have dynamic content that requires JavaScript. The reader extracts static HTML content.
1103
+
1104
+ **Issue**: High token usage
1105
+ - **Solution**: The token usage depends on page size. Consider caching frequently accessed pages.
1106
+
1107
+ **Issue**: Slow response times
1108
+ - **Solution**: Implement caching, use parallel processing for multiple URLs, and consider rate limiting
1109
+
1110
+ **Issue**: Empty HTML content
1111
+ - **Solution**: Check if the page requires authentication or has anti-scraping measures. Verify the URL is correct.
1112
+
1113
+ ## Performance Tips
1114
+
1115
+ 1. **Implement caching**: Cache frequently accessed pages to reduce API calls
1116
+ 2. **Use parallel processing**: Fetch multiple pages concurrently (with rate limiting)
1117
+ 3. **Process content efficiently**: Extract only needed information from HTML
1118
+ 4. **Set timeouts**: Implement reasonable timeouts for page fetching
1119
+ 5. **Monitor token usage**: Track usage to optimize costs
1120
+ 6. **Batch operations**: Group multiple URL fetches when possible
1121
+
1122
+ ## Security Considerations
1123
+
1124
+ - Validate all URLs before processing
1125
+ - Sanitize extracted HTML content before displaying
1126
+ - Implement rate limiting to prevent abuse
1127
+ - Never expose SDK credentials in client-side code
1128
+ - Be respectful of robots.txt and website terms of service
1129
+ - Handle user data according to privacy regulations
1130
+ - Implement proper error handling for failed requests
1131
+
1132
+ ## Remember
1133
+
1134
+ - Always use z-ai-web-dev-sdk in backend code only
1135
+ - The SDK is already installed - import as shown in examples
1136
+ - Implement proper error handling for robust applications
1137
+ - Use caching to improve performance and reduce costs
1138
+ - Respect website terms of service and rate limits
1139
+ - Process HTML content carefully to extract meaningful data
1140
+ - Monitor token usage for cost optimization