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,172 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Add Z.ai branding metadata to PDF documents.
4
+
5
+ This script adds Z.ai metadata (Author, Creator, Producer) to PDF files.
6
+ It can process single files or batch process multiple PDFs.
7
+ """
8
+
9
+ import os
10
+ import sys
11
+ import argparse
12
+ from pypdf import PdfReader, PdfWriter
13
+
14
+
15
+ def add_zai_metadata(input_pdf_path, output_pdf_path=None, custom_title=None, verbose=True):
16
+ """
17
+ Add Z.ai branding metadata to a PDF document.
18
+
19
+ Args:
20
+ input_pdf_path: Path to input PDF
21
+ output_pdf_path: Path to output PDF (default: overwrites input)
22
+ custom_title: Custom title to use (default: preserves original or uses filename)
23
+ verbose: Print status messages (default: True)
24
+
25
+ Sets:
26
+ - Author: Z.ai
27
+ - Creator: Z.ai
28
+ - Producer: http://z.ai
29
+ - Title: Custom title, original title, or filename (in that priority)
30
+
31
+ Returns:
32
+ Path to the output PDF file
33
+ """
34
+ # Validate input file exists
35
+ if not os.path.exists(input_pdf_path):
36
+ print(f"Error: Input file not found: {input_pdf_path}", file=sys.stderr)
37
+ sys.exit(1)
38
+
39
+ # Read the PDF
40
+ try:
41
+ reader = PdfReader(input_pdf_path)
42
+ except Exception as e:
43
+ print(f"Error: Cannot open PDF: {e}", file=sys.stderr)
44
+ sys.exit(1)
45
+
46
+ writer = PdfWriter()
47
+
48
+ # Copy all pages
49
+ for page in reader.pages:
50
+ writer.add_page(page)
51
+
52
+ # Determine title
53
+ if custom_title:
54
+ title = custom_title
55
+ else:
56
+ original_meta = reader.metadata
57
+ if original_meta and original_meta.title and original_meta.title not in ['(anonymous)', 'unspecified', None]:
58
+ title = original_meta.title
59
+ else:
60
+ # Use filename without extension as title
61
+ title = os.path.splitext(os.path.basename(input_pdf_path))[0]
62
+
63
+ # Add Z.ai metadata
64
+ writer.add_metadata({
65
+ '/Title': title,
66
+ '/Author': 'Z.ai',
67
+ '/Creator': 'Z.ai',
68
+ '/Producer': 'http://z.ai',
69
+ })
70
+
71
+ # Write output
72
+ if output_pdf_path is None:
73
+ output_pdf_path = input_pdf_path
74
+
75
+ try:
76
+ with open(output_pdf_path, "wb") as output:
77
+ writer.write(output)
78
+ except Exception as e:
79
+ print(f"Error: Cannot write output file: {e}", file=sys.stderr)
80
+ sys.exit(1)
81
+
82
+ # Print status
83
+ if verbose:
84
+ print(f"✓ Updated metadata for: {os.path.basename(input_pdf_path)}")
85
+ print(f" Title: {title}")
86
+ print(f" Author: Z.ai")
87
+ print(f" Creator: Z.ai")
88
+ print(f" Producer: http://z.ai")
89
+ if output_pdf_path != input_pdf_path:
90
+ print(f" Output: {output_pdf_path}")
91
+
92
+ return output_pdf_path
93
+
94
+
95
+ def main():
96
+ """Command-line interface for add_zai_metadata."""
97
+ parser = argparse.ArgumentParser(
98
+ description='Add Z.ai branding metadata to PDF documents',
99
+ formatter_class=argparse.RawDescriptionHelpFormatter,
100
+ epilog="""
101
+ Examples:
102
+ # Add metadata to a single PDF (in-place)
103
+ %(prog)s document.pdf
104
+
105
+ # Add metadata to a single PDF (create new file)
106
+ %(prog)s input.pdf -o output.pdf
107
+
108
+ # Add metadata with custom title
109
+ %(prog)s report.pdf -t "Q4 Financial Analysis"
110
+
111
+ # Batch process all PDFs in current directory
112
+ %(prog)s *.pdf
113
+
114
+ # Quiet mode (no output)
115
+ %(prog)s document.pdf -q
116
+ """
117
+ )
118
+
119
+ parser.add_argument(
120
+ 'input',
121
+ nargs='+',
122
+ help='Input PDF file(s) to process'
123
+ )
124
+
125
+ parser.add_argument(
126
+ '-o', '--output',
127
+ help='Output PDF path (only for single input file)'
128
+ )
129
+
130
+ parser.add_argument(
131
+ '-t', '--title',
132
+ help='Custom title for the PDF'
133
+ )
134
+
135
+ parser.add_argument(
136
+ '-q', '--quiet',
137
+ action='store_true',
138
+ help='Quiet mode (no status messages)'
139
+ )
140
+
141
+ args = parser.parse_args()
142
+
143
+ # Check if output is specified for multiple files
144
+ if args.output and len(args.input) > 1:
145
+ print("Error: --output can only be used with a single input file", file=sys.stderr)
146
+ sys.exit(1)
147
+
148
+ # Process each input file
149
+ for input_path in args.input:
150
+ # Determine output path
151
+ if len(args.input) == 1 and args.output:
152
+ output_path = args.output
153
+ else:
154
+ output_path = None # Overwrite in-place
155
+
156
+ # Determine title
157
+ if args.title:
158
+ custom_title = args.title
159
+ else:
160
+ custom_title = None
161
+
162
+ # Add metadata
163
+ add_zai_metadata(
164
+ input_path,
165
+ output_pdf_path=output_path,
166
+ custom_title=custom_title,
167
+ verbose=not args.quiet
168
+ )
169
+
170
+
171
+ if __name__ == '__main__':
172
+ main()
@@ -0,0 +1,70 @@
1
+ from dataclasses import dataclass
2
+ import json
3
+ import sys
4
+
5
+
6
+ # Script to check that the `fields.json` file that GLM creates when analyzing PDFs
7
+ # does not have overlapping bounding boxes. See forms.md.
8
+
9
+
10
+ @dataclass
11
+ class RectAndField:
12
+ rect: list[float]
13
+ rect_type: str
14
+ field: dict
15
+
16
+
17
+ # Returns a list of messages that are printed to stdout for GLM to read.
18
+ def get_bounding_box_messages(fields_json_stream) -> list[str]:
19
+ messages = []
20
+ fields = json.load(fields_json_stream)
21
+ messages.append(f"Read {len(fields['form_fields'])} fields")
22
+
23
+ def rects_intersect(r1, r2):
24
+ disjoint_horizontal = r1[0] >= r2[2] or r1[2] <= r2[0]
25
+ disjoint_vertical = r1[1] >= r2[3] or r1[3] <= r2[1]
26
+ return not (disjoint_horizontal or disjoint_vertical)
27
+
28
+ rects_and_fields = []
29
+ for f in fields["form_fields"]:
30
+ rects_and_fields.append(RectAndField(f["label_bounding_box"], "label", f))
31
+ rects_and_fields.append(RectAndField(f["entry_bounding_box"], "entry", f))
32
+
33
+ has_error = False
34
+ for i, ri in enumerate(rects_and_fields):
35
+ # This is O(N^2); we can optimize if it becomes a problem.
36
+ for j in range(i + 1, len(rects_and_fields)):
37
+ rj = rects_and_fields[j]
38
+ if ri.field["page_number"] == rj.field["page_number"] and rects_intersect(ri.rect, rj.rect):
39
+ has_error = True
40
+ if ri.field is rj.field:
41
+ messages.append(f"FAILURE: intersection between label and entry bounding boxes for `{ri.field['description']}` ({ri.rect}, {rj.rect})")
42
+ else:
43
+ messages.append(f"FAILURE: intersection between {ri.rect_type} bounding box for `{ri.field['description']}` ({ri.rect}) and {rj.rect_type} bounding box for `{rj.field['description']}` ({rj.rect})")
44
+ if len(messages) >= 20:
45
+ messages.append("Aborting further checks; fix bounding boxes and try again")
46
+ return messages
47
+ if ri.rect_type == "entry":
48
+ if "entry_text" in ri.field:
49
+ font_size = ri.field["entry_text"].get("font_size", 14)
50
+ entry_height = ri.rect[3] - ri.rect[1]
51
+ if entry_height < font_size:
52
+ has_error = True
53
+ messages.append(f"FAILURE: entry bounding box height ({entry_height}) for `{ri.field['description']}` is too short for the text content (font size: {font_size}). Increase the box height or decrease the font size.")
54
+ if len(messages) >= 20:
55
+ messages.append("Aborting further checks; fix bounding boxes and try again")
56
+ return messages
57
+
58
+ if not has_error:
59
+ messages.append("SUCCESS: All bounding boxes are valid")
60
+ return messages
61
+
62
+ if __name__ == "__main__":
63
+ if len(sys.argv) != 2:
64
+ print("Usage: check_bounding_boxes.py [fields.json]")
65
+ sys.exit(1)
66
+ # Input file should be in the `fields.json` format described in forms.md.
67
+ with open(sys.argv[1]) as f:
68
+ messages = get_bounding_box_messages(f)
69
+ for msg in messages:
70
+ print(msg)
@@ -0,0 +1,226 @@
1
+ import unittest
2
+ import json
3
+ import io
4
+ from check_bounding_boxes import get_bounding_box_messages
5
+
6
+
7
+ # Currently this is not run automatically in CI; it's just for documentation and manual checking.
8
+ class TestGetBoundingBoxMessages(unittest.TestCase):
9
+
10
+ def create_json_stream(self, data):
11
+ """Helper to create a JSON stream from data"""
12
+ return io.StringIO(json.dumps(data))
13
+
14
+ def test_no_intersections(self):
15
+ """Test case with no bounding box intersections"""
16
+ data = {
17
+ "form_fields": [
18
+ {
19
+ "description": "Name",
20
+ "page_number": 1,
21
+ "label_bounding_box": [10, 10, 50, 30],
22
+ "entry_bounding_box": [60, 10, 150, 30]
23
+ },
24
+ {
25
+ "description": "Email",
26
+ "page_number": 1,
27
+ "label_bounding_box": [10, 40, 50, 60],
28
+ "entry_bounding_box": [60, 40, 150, 60]
29
+ }
30
+ ]
31
+ }
32
+
33
+ stream = self.create_json_stream(data)
34
+ messages = get_bounding_box_messages(stream)
35
+ self.assertTrue(any("SUCCESS" in msg for msg in messages))
36
+ self.assertFalse(any("FAILURE" in msg for msg in messages))
37
+
38
+ def test_label_entry_intersection_same_field(self):
39
+ """Test intersection between label and entry of the same field"""
40
+ data = {
41
+ "form_fields": [
42
+ {
43
+ "description": "Name",
44
+ "page_number": 1,
45
+ "label_bounding_box": [10, 10, 60, 30],
46
+ "entry_bounding_box": [50, 10, 150, 30] # Overlaps with label
47
+ }
48
+ ]
49
+ }
50
+
51
+ stream = self.create_json_stream(data)
52
+ messages = get_bounding_box_messages(stream)
53
+ self.assertTrue(any("FAILURE" in msg and "intersection" in msg for msg in messages))
54
+ self.assertFalse(any("SUCCESS" in msg for msg in messages))
55
+
56
+ def test_intersection_between_different_fields(self):
57
+ """Test intersection between bounding boxes of different fields"""
58
+ data = {
59
+ "form_fields": [
60
+ {
61
+ "description": "Name",
62
+ "page_number": 1,
63
+ "label_bounding_box": [10, 10, 50, 30],
64
+ "entry_bounding_box": [60, 10, 150, 30]
65
+ },
66
+ {
67
+ "description": "Email",
68
+ "page_number": 1,
69
+ "label_bounding_box": [40, 20, 80, 40], # Overlaps with Name's boxes
70
+ "entry_bounding_box": [160, 10, 250, 30]
71
+ }
72
+ ]
73
+ }
74
+
75
+ stream = self.create_json_stream(data)
76
+ messages = get_bounding_box_messages(stream)
77
+ self.assertTrue(any("FAILURE" in msg and "intersection" in msg for msg in messages))
78
+ self.assertFalse(any("SUCCESS" in msg for msg in messages))
79
+
80
+ def test_different_pages_no_intersection(self):
81
+ """Test that boxes on different pages don't count as intersecting"""
82
+ data = {
83
+ "form_fields": [
84
+ {
85
+ "description": "Name",
86
+ "page_number": 1,
87
+ "label_bounding_box": [10, 10, 50, 30],
88
+ "entry_bounding_box": [60, 10, 150, 30]
89
+ },
90
+ {
91
+ "description": "Email",
92
+ "page_number": 2,
93
+ "label_bounding_box": [10, 10, 50, 30], # Same coordinates but different page
94
+ "entry_bounding_box": [60, 10, 150, 30]
95
+ }
96
+ ]
97
+ }
98
+
99
+ stream = self.create_json_stream(data)
100
+ messages = get_bounding_box_messages(stream)
101
+ self.assertTrue(any("SUCCESS" in msg for msg in messages))
102
+ self.assertFalse(any("FAILURE" in msg for msg in messages))
103
+
104
+ def test_entry_height_too_small(self):
105
+ """Test that entry box height is checked against font size"""
106
+ data = {
107
+ "form_fields": [
108
+ {
109
+ "description": "Name",
110
+ "page_number": 1,
111
+ "label_bounding_box": [10, 10, 50, 30],
112
+ "entry_bounding_box": [60, 10, 150, 20], # Height is 10
113
+ "entry_text": {
114
+ "font_size": 14 # Font size larger than height
115
+ }
116
+ }
117
+ ]
118
+ }
119
+
120
+ stream = self.create_json_stream(data)
121
+ messages = get_bounding_box_messages(stream)
122
+ self.assertTrue(any("FAILURE" in msg and "height" in msg for msg in messages))
123
+ self.assertFalse(any("SUCCESS" in msg for msg in messages))
124
+
125
+ def test_entry_height_adequate(self):
126
+ """Test that adequate entry box height passes"""
127
+ data = {
128
+ "form_fields": [
129
+ {
130
+ "description": "Name",
131
+ "page_number": 1,
132
+ "label_bounding_box": [10, 10, 50, 30],
133
+ "entry_bounding_box": [60, 10, 150, 30], # Height is 20
134
+ "entry_text": {
135
+ "font_size": 14 # Font size smaller than height
136
+ }
137
+ }
138
+ ]
139
+ }
140
+
141
+ stream = self.create_json_stream(data)
142
+ messages = get_bounding_box_messages(stream)
143
+ self.assertTrue(any("SUCCESS" in msg for msg in messages))
144
+ self.assertFalse(any("FAILURE" in msg for msg in messages))
145
+
146
+ def test_default_font_size(self):
147
+ """Test that default font size is used when not specified"""
148
+ data = {
149
+ "form_fields": [
150
+ {
151
+ "description": "Name",
152
+ "page_number": 1,
153
+ "label_bounding_box": [10, 10, 50, 30],
154
+ "entry_bounding_box": [60, 10, 150, 20], # Height is 10
155
+ "entry_text": {} # No font_size specified, should use default 14
156
+ }
157
+ ]
158
+ }
159
+
160
+ stream = self.create_json_stream(data)
161
+ messages = get_bounding_box_messages(stream)
162
+ self.assertTrue(any("FAILURE" in msg and "height" in msg for msg in messages))
163
+ self.assertFalse(any("SUCCESS" in msg for msg in messages))
164
+
165
+ def test_no_entry_text(self):
166
+ """Test that missing entry_text doesn't cause height check"""
167
+ data = {
168
+ "form_fields": [
169
+ {
170
+ "description": "Name",
171
+ "page_number": 1,
172
+ "label_bounding_box": [10, 10, 50, 30],
173
+ "entry_bounding_box": [60, 10, 150, 20] # Small height but no entry_text
174
+ }
175
+ ]
176
+ }
177
+
178
+ stream = self.create_json_stream(data)
179
+ messages = get_bounding_box_messages(stream)
180
+ self.assertTrue(any("SUCCESS" in msg for msg in messages))
181
+ self.assertFalse(any("FAILURE" in msg for msg in messages))
182
+
183
+ def test_multiple_errors_limit(self):
184
+ """Test that error messages are limited to prevent excessive output"""
185
+ fields = []
186
+ # Create many overlapping fields
187
+ for i in range(25):
188
+ fields.append({
189
+ "description": f"Field{i}",
190
+ "page_number": 1,
191
+ "label_bounding_box": [10, 10, 50, 30], # All overlap
192
+ "entry_bounding_box": [20, 15, 60, 35] # All overlap
193
+ })
194
+
195
+ data = {"form_fields": fields}
196
+
197
+ stream = self.create_json_stream(data)
198
+ messages = get_bounding_box_messages(stream)
199
+ # Should abort after ~20 messages
200
+ self.assertTrue(any("Aborting" in msg for msg in messages))
201
+ # Should have some FAILURE messages but not hundreds
202
+ failure_count = sum(1 for msg in messages if "FAILURE" in msg)
203
+ self.assertGreater(failure_count, 0)
204
+ self.assertLess(len(messages), 30) # Should be limited
205
+
206
+ def test_edge_touching_boxes(self):
207
+ """Test that boxes touching at edges don't count as intersecting"""
208
+ data = {
209
+ "form_fields": [
210
+ {
211
+ "description": "Name",
212
+ "page_number": 1,
213
+ "label_bounding_box": [10, 10, 50, 30],
214
+ "entry_bounding_box": [50, 10, 150, 30] # Touches at x=50
215
+ }
216
+ ]
217
+ }
218
+
219
+ stream = self.create_json_stream(data)
220
+ messages = get_bounding_box_messages(stream)
221
+ self.assertTrue(any("SUCCESS" in msg for msg in messages))
222
+ self.assertFalse(any("FAILURE" in msg for msg in messages))
223
+
224
+
225
+ if __name__ == '__main__':
226
+ unittest.main()
@@ -0,0 +1,12 @@
1
+ import sys
2
+ from pypdf import PdfReader
3
+
4
+
5
+ # Script for GLM to run to determine whether a PDF has fillable form fields. See forms.md.
6
+
7
+
8
+ reader = PdfReader(sys.argv[1])
9
+ if (reader.get_fields()):
10
+ print("This PDF has fillable form fields")
11
+ else:
12
+ print("This PDF does not have fillable form fields; you will need to visually determine where to enter data")
@@ -0,0 +1,35 @@
1
+ import os
2
+ import sys
3
+
4
+ from pdf2image import convert_from_path
5
+
6
+
7
+ # Converts each page of a PDF to a PNG image.
8
+
9
+
10
+ def convert(pdf_path, output_dir, max_dim=1000):
11
+ images = convert_from_path(pdf_path, dpi=200)
12
+
13
+ for i, image in enumerate(images):
14
+ # Scale image if needed to keep width/height under `max_dim`
15
+ width, height = image.size
16
+ if width > max_dim or height > max_dim:
17
+ scale_factor = min(max_dim / width, max_dim / height)
18
+ new_width = int(width * scale_factor)
19
+ new_height = int(height * scale_factor)
20
+ image = image.resize((new_width, new_height))
21
+
22
+ image_path = os.path.join(output_dir, f"page_{i+1}.png")
23
+ image.save(image_path)
24
+ print(f"Saved page {i+1} as {image_path} (size: {image.size})")
25
+
26
+ print(f"Converted {len(images)} pages to PNG images")
27
+
28
+
29
+ if __name__ == "__main__":
30
+ if len(sys.argv) != 3:
31
+ print("Usage: convert_pdf_to_images.py [input pdf] [output directory]")
32
+ sys.exit(1)
33
+ pdf_path = sys.argv[1]
34
+ output_directory = sys.argv[2]
35
+ convert(pdf_path, output_directory)
@@ -0,0 +1,41 @@
1
+ import json
2
+ import sys
3
+
4
+ from PIL import Image, ImageDraw
5
+
6
+
7
+ # Creates "validation" images with rectangles for the bounding box information that
8
+ # GLM creates when determining where to add text annotations in PDFs. See forms.md.
9
+
10
+
11
+ def create_validation_image(page_number, fields_json_path, input_path, output_path):
12
+ # Input file should be in the `fields.json` format described in forms.md.
13
+ with open(fields_json_path, 'r') as f:
14
+ data = json.load(f)
15
+
16
+ img = Image.open(input_path)
17
+ draw = ImageDraw.Draw(img)
18
+ num_boxes = 0
19
+
20
+ for field in data["form_fields"]:
21
+ if field["page_number"] == page_number:
22
+ entry_box = field['entry_bounding_box']
23
+ label_box = field['label_bounding_box']
24
+ # Draw red rectangle over entry bounding box and blue rectangle over the label.
25
+ draw.rectangle(entry_box, outline='red', width=2)
26
+ draw.rectangle(label_box, outline='blue', width=2)
27
+ num_boxes += 2
28
+
29
+ img.save(output_path)
30
+ print(f"Created validation image at {output_path} with {num_boxes} bounding boxes")
31
+
32
+
33
+ if __name__ == "__main__":
34
+ if len(sys.argv) != 5:
35
+ print("Usage: create_validation_image.py [page number] [fields.json file] [input image path] [output image path]")
36
+ sys.exit(1)
37
+ page_number = int(sys.argv[1])
38
+ fields_json_path = sys.argv[2]
39
+ input_image_path = sys.argv[3]
40
+ output_image_path = sys.argv[4]
41
+ create_validation_image(page_number, fields_json_path, input_image_path, output_image_path)