writer 0.8.3rc4__py3-none-any.whl → 1.25.1rc1__py3-none-any.whl

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 (378) hide show
  1. writer/__init__.py +1 -1
  2. writer/abstract.py +1 -1
  3. writer/{ai.py → ai/__init__.py} +867 -163
  4. writer/app_runner.py +596 -241
  5. writer/app_templates/default/.wf/components-blueprints_blueprint-0-0decp3w5erhvl0nw.jsonl +11 -0
  6. writer/app_templates/default/.wf/components-blueprints_root.jsonl +1 -0
  7. writer/app_templates/default/.wf/components-page-0-c0f99a9e-5004-4e75-a6c6-36f17490b134.jsonl +27 -0
  8. writer/app_templates/default/.wf/components-root.jsonl +1 -0
  9. writer/app_templates/default/.wf/components-workflows_root.jsonl +1 -0
  10. writer/app_templates/default/.wf/components-workflows_workflow-0-lfltcky7l1fsm6j2.jsonl +1 -0
  11. writer/app_templates/default/.wf/metadata.json +3 -0
  12. writer/app_templates/default/README.md +3 -0
  13. writer/app_templates/default/main.py +16 -0
  14. writer/app_templates/default/requirements.txt +1 -0
  15. writer/app_templates/default/static/README.md +8 -0
  16. writer/app_templates/default/static/agent_builder_demo.png +0 -0
  17. writer/app_templates/default/static/favicon.png +0 -0
  18. writer/app_templates/hello/.wf/components-blueprints_blueprint-0-t84xyhxau9ej3823.jsonl +18 -0
  19. writer/app_templates/hello/.wf/components-blueprints_root.jsonl +1 -0
  20. writer/app_templates/hello/.wf/components-page-0-c0f99a9e-5004-4e75-a6c6-36f17490b134.jsonl +15 -0
  21. writer/app_templates/hello/.wf/components-root.jsonl +1 -0
  22. writer/app_templates/hello/.wf/metadata.json +3 -0
  23. writer/app_templates/hello/main.py +16 -0
  24. writer/app_templates/hello/static/README.md +8 -0
  25. writer/app_templates/hello/static/favicon.png +0 -0
  26. writer/app_templates/hello/static/welcome.svg +40 -0
  27. writer/auth.py +7 -2
  28. writer/autogen.py +352 -0
  29. writer/blocks/__init__.py +51 -17
  30. writer/blocks/addtostatelist.py +10 -9
  31. writer/blocks/apitrigger.py +45 -0
  32. writer/blocks/base_block.py +332 -21
  33. writer/blocks/base_trigger.py +14 -0
  34. writer/blocks/calleventhandler.py +39 -35
  35. writer/blocks/changepage.py +48 -0
  36. writer/blocks/code.py +102 -0
  37. writer/blocks/crontrigger.py +49 -0
  38. writer/blocks/foreach.py +70 -53
  39. writer/blocks/httprequest.py +112 -99
  40. writer/blocks/ifelse.py +71 -0
  41. writer/blocks/logmessage.py +34 -39
  42. writer/blocks/parsejson.py +30 -29
  43. writer/blocks/returnvalue.py +7 -7
  44. writer/blocks/runblueprint.py +63 -0
  45. writer/blocks/setstate.py +43 -33
  46. writer/blocks/sharedblueprint.py +86 -0
  47. writer/blocks/uieventtrigger.py +49 -0
  48. writer/blocks/writeraddchatmessage.py +50 -12
  49. writer/blocks/writeraddtokg.py +38 -11
  50. writer/blocks/writeraskkg.py +123 -0
  51. writer/blocks/writerchat.py +80 -61
  52. writer/blocks/writerchatreply.py +279 -0
  53. writer/blocks/writerchatreplywithtoolconfig.py +393 -0
  54. writer/blocks/writerclassification.py +78 -39
  55. writer/blocks/writercompletion.py +49 -44
  56. writer/blocks/writerfileapi.py +85 -0
  57. writer/blocks/writerinitchat.py +24 -12
  58. writer/blocks/writerkeyvaluestorage.py +106 -0
  59. writer/blocks/writernocodeapp.py +35 -37
  60. writer/blocks/writerparsepdf.py +73 -0
  61. writer/blocks/writerstructuredoutput.py +105 -0
  62. writer/blocks/writertoolcalling.py +251 -0
  63. writer/blocks/writervision.py +141 -0
  64. writer/blocks/writerwebsearch.py +175 -0
  65. writer/blueprints.py +839 -0
  66. writer/command_line.py +52 -16
  67. writer/core.py +562 -290
  68. writer/core_ui.py +6 -2
  69. writer/evaluator.py +98 -46
  70. writer/journal.py +227 -0
  71. writer/keyvalue_storage.py +93 -0
  72. writer/logs.py +277 -0
  73. writer/serve.py +625 -327
  74. writer/ss_types.py +101 -12
  75. writer/static/assets/Arrow.dom-GBJpMYQS.js +1 -0
  76. writer/static/assets/BaseMarkdown-Wrvby5J8.js +1 -0
  77. writer/static/assets/BlueprintToolbar-BuXNRxWT.js +1 -0
  78. writer/static/assets/BlueprintToolbar-wpfX0jo_.css +1 -0
  79. writer/static/assets/BuilderApp-PTOI76jZ.js +8 -0
  80. writer/static/assets/BuilderApp-WimUfNZr.css +1 -0
  81. writer/static/assets/BuilderApplicationSelect-DXzy4e_h.js +7 -0
  82. writer/static/assets/BuilderApplicationSelect-XaM1D5fv.css +1 -0
  83. writer/static/assets/BuilderBlueprintLibraryPanel-Ckrhknlh.css +1 -0
  84. writer/static/assets/BuilderBlueprintLibraryPanel-DBDzhTlc.js +1 -0
  85. writer/static/assets/BuilderEmbeddedCodeEditor-B0bcjlhk.css +1 -0
  86. writer/static/assets/BuilderEmbeddedCodeEditor-Dn7eDICN.js +726 -0
  87. writer/static/assets/BuilderGraphSelect-C-LRsO8W.js +7 -0
  88. writer/static/assets/BuilderGraphSelect-D7B61d5s.css +1 -0
  89. writer/static/assets/BuilderInsertionLabel-BhyL9wgn.js +1 -0
  90. writer/static/assets/BuilderInsertionLabel-_YS5WPfq.css +1 -0
  91. writer/static/assets/BuilderInsertionOverlay-D2XS0ij9.css +1 -0
  92. writer/static/assets/BuilderInsertionOverlay-MkAIVruY.js +1 -0
  93. writer/static/assets/BuilderJournal-A0LcEwGI.js +7 -0
  94. writer/static/assets/BuilderJournal-DHv3Pvvm.css +1 -0
  95. writer/static/assets/BuilderModelSelect-CdSo_sih.js +7 -0
  96. writer/static/assets/BuilderModelSelect-Dc4IPLp2.css +1 -0
  97. writer/static/assets/BuilderSettings-BDwZBveu.js +16 -0
  98. writer/static/assets/BuilderSettings-lZkOXEYw.css +1 -0
  99. writer/static/assets/BuilderSettingsArtifactAPITriggerDetails-3O6jKBXD.js +4 -0
  100. writer/static/assets/BuilderSettingsArtifactAPITriggerDetails-DnX66iRg.css +1 -0
  101. writer/static/assets/BuilderSettingsDeploySharedBlueprint-BR_3ptsd.js +1 -0
  102. writer/static/assets/BuilderSettingsDeploySharedBlueprint-KJTl8gxP.css +1 -0
  103. writer/static/assets/BuilderSettingsHandlers-CBtEQFSo.js +1 -0
  104. writer/static/assets/BuilderSettingsHandlers-DJPeASfz.css +1 -0
  105. writer/static/assets/BuilderSidebarComponentTree-DLltgas5.js +1 -0
  106. writer/static/assets/BuilderSidebarComponentTree-DYu1F793.css +1 -0
  107. writer/static/assets/BuilderSidebarToolkit-CApZNTAq.js +7 -0
  108. writer/static/assets/BuilderSidebarToolkit-CwqbjRv8.css +1 -0
  109. writer/static/assets/BuilderTemplateEditor-CYSDeWgV.css +1 -0
  110. writer/static/assets/BuilderTemplateEditor-DnRDRcA0.js +87 -0
  111. writer/static/assets/BuilderVault-2vGoV0sx.js +1 -0
  112. writer/static/assets/BuilderVault-Cx6oQSES.css +1 -0
  113. writer/static/assets/ComponentRenderer-72hqvEvI.css +1 -0
  114. writer/static/assets/ComponentRenderer-D4Pj1i3s.js +1 -0
  115. writer/static/assets/SharedCopyClipboardButton-BipJKGtz.css +1 -0
  116. writer/static/assets/SharedCopyClipboardButton-DNI9kLe6.js +1 -0
  117. writer/static/assets/WdsCheckbox-DKvpPA4D.css +1 -0
  118. writer/static/assets/WdsCheckbox-edQcn1cf.js +1 -0
  119. writer/static/assets/WdsDropdownMenu-CzzPN9Wg.css +1 -0
  120. writer/static/assets/WdsDropdownMenu-DQnrRBNV.js +1 -0
  121. writer/static/assets/WdsFieldWrapper-Cmufx5Nj.js +1 -0
  122. writer/static/assets/WdsFieldWrapper-CsemOh8D.css +1 -0
  123. writer/static/assets/WdsTabs-DKj7BqI0.css +1 -0
  124. writer/static/assets/WdsTabs-DcfY_zn5.js +1 -0
  125. writer/static/assets/abap-D8nrxEjS.js +6 -0
  126. writer/static/assets/apex-BrXDlLUW.js +6 -0
  127. writer/static/assets/art-paper-D70v1WMA.svg +180 -0
  128. writer/static/assets/azcli-CElzELwZ.js +6 -0
  129. writer/static/assets/bat-CUsyEhik.js +6 -0
  130. writer/static/assets/bicep-BtxyJn6H.js +7 -0
  131. writer/static/assets/cameligo-ClBCoF8h.js +6 -0
  132. writer/static/assets/clojure-B9TqLHAk.js +6 -0
  133. writer/static/assets/codicon-BA2IlpFX.ttf +0 -0
  134. writer/static/assets/coffee-DYsfeylR.js +6 -0
  135. writer/static/assets/cpp-VVGvvgir.js +6 -0
  136. writer/static/assets/csharp-Z6z2stHy.js +6 -0
  137. writer/static/assets/csp-DgZoLDI1.js +6 -0
  138. writer/static/assets/css-KqQ96-gC.js +8 -0
  139. writer/static/assets/css.worker-DvNUQFd1.js +84 -0
  140. writer/static/assets/cssMode-BYq4oZGq.js +9 -0
  141. writer/static/assets/cypher-CYoSlgTu.js +6 -0
  142. writer/static/assets/dart-BGDl7St1.js +6 -0
  143. writer/static/assets/dockerfile-CuCtxA7T.js +6 -0
  144. writer/static/assets/ecl-BCTFAUpS.js +6 -0
  145. writer/static/assets/editor.worker-BVwmgLrR.js +11 -0
  146. writer/static/assets/elixir-C7hRTYZ9.js +6 -0
  147. writer/static/assets/flow9-Bi_qi707.js +6 -0
  148. writer/static/assets/freemarker2-CnNourkO.js +8 -0
  149. writer/static/assets/fsharp-CxaaEKKi.js +6 -0
  150. writer/static/assets/go-DUImKuGY.js +6 -0
  151. writer/static/assets/graphql-D5sGVkLV.js +6 -0
  152. writer/static/assets/handlebars-Bm22yapJ.js +6 -0
  153. writer/static/assets/hcl-zD_CCkZ1.js +6 -0
  154. writer/static/assets/html-CAKAfoZF.js +6 -0
  155. writer/static/assets/html.worker-BJMlcbMU.js +458 -0
  156. writer/static/assets/htmlMode-BGZ97n-V.js +9 -0
  157. writer/static/assets/index-5u5REPT4.js +16 -0
  158. writer/static/assets/index-BKNuk68o.css +1 -0
  159. writer/static/assets/index-BQNXU3IR.js +17 -0
  160. writer/static/assets/index-BQr1pfrb.js +1 -0
  161. writer/static/assets/index-DHXAd5Yn.js +4 -0
  162. writer/static/assets/index-Zki-pfO-.js +8525 -0
  163. writer/static/assets/index.esm-B1ZQtduY.js +17 -0
  164. writer/static/assets/ini-8kKHd4ZL.js +6 -0
  165. writer/static/assets/java-De1axCfe.js +6 -0
  166. writer/static/assets/javascript-X1f02eyK.js +6 -0
  167. writer/static/assets/json.worker-BwvX8PuZ.js +42 -0
  168. writer/static/assets/jsonMode-hT0bNgT8.js +11 -0
  169. writer/static/assets/julia-D3ApGBxz.js +6 -0
  170. writer/static/assets/kotlin-GbSrCElU.js +6 -0
  171. writer/static/assets/less-DNUaDNdz.js +7 -0
  172. writer/static/assets/lexon-Bg9QKxBu.js +6 -0
  173. writer/static/assets/liquid-KmCCiJw2.js +6 -0
  174. writer/static/assets/lua-Crkvc3mc.js +6 -0
  175. writer/static/assets/m3-DsrzVyM1.js +6 -0
  176. writer/static/assets/mapbox-gl-C0cyFYYW.js +2329 -0
  177. writer/static/assets/markdown-CY5IOZuu.js +6 -0
  178. writer/static/assets/marked.esm-273vDTCT.js +45 -0
  179. writer/static/assets/mdx-DtRFauUw.js +6 -0
  180. writer/static/assets/mips-BE8RsGBA.js +6 -0
  181. writer/static/assets/msdax-N5ajIiFQ.js +6 -0
  182. writer/static/assets/mysql-DRxbB97D.js +6 -0
  183. writer/static/assets/objective-c-BHUZy23s.js +6 -0
  184. writer/static/assets/pascal-BemVzBTY.js +6 -0
  185. writer/static/assets/pascaligo-BACCcnx_.js +6 -0
  186. writer/static/assets/pdf-B6-yWJ-Y.js +12 -0
  187. writer/static/assets/pdf.worker.min-CyUfim15.mjs +21 -0
  188. writer/static/assets/perl-CuU66Ptk.js +6 -0
  189. writer/static/assets/pgsql-CQ6TMH2r.js +6 -0
  190. writer/static/assets/php-BvyzZa65.js +6 -0
  191. writer/static/assets/pla-DrIuu9u1.js +6 -0
  192. writer/static/assets/plotly.min-DutuuatZ.js +4030 -0
  193. writer/static/assets/poppins-latin-300-italic-4WBEAciR.woff +0 -0
  194. writer/static/assets/poppins-latin-300-italic-EWCPeN2Y.woff2 +0 -0
  195. writer/static/assets/poppins-latin-300-normal-DCNuMXUj.woff +0 -0
  196. writer/static/assets/poppins-latin-300-normal-Dku2WoCh.woff2 +0 -0
  197. writer/static/assets/poppins-latin-400-italic-B4GYq972.woff2 +0 -0
  198. writer/static/assets/poppins-latin-400-italic-BPejoDS-.woff +0 -0
  199. writer/static/assets/poppins-latin-400-normal-BOb3E3N0.woff +0 -0
  200. writer/static/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  201. writer/static/assets/poppins-latin-500-italic-Ce_qjtl5.woff +0 -0
  202. writer/static/assets/poppins-latin-500-italic-o28Otv0U.woff2 +0 -0
  203. writer/static/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  204. writer/static/assets/poppins-latin-500-normal-DGXqpDMm.woff +0 -0
  205. writer/static/assets/poppins-latin-600-italic-BhOZippK.woff +0 -0
  206. writer/static/assets/poppins-latin-600-italic-CZ4wqKBi.woff2 +0 -0
  207. writer/static/assets/poppins-latin-600-normal-BJdTmd5m.woff +0 -0
  208. writer/static/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  209. writer/static/assets/poppins-latin-700-italic-CW91C-LJ.woff +0 -0
  210. writer/static/assets/poppins-latin-700-italic-RKf6esGj.woff2 +0 -0
  211. writer/static/assets/poppins-latin-700-normal-BVuQR_eA.woff +0 -0
  212. writer/static/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  213. writer/static/assets/poppins-latin-ext-300-italic-CBzyU4Pf.woff +0 -0
  214. writer/static/assets/poppins-latin-ext-300-italic-DdDvTq5-.woff2 +0 -0
  215. writer/static/assets/poppins-latin-ext-300-normal-7Zg2msWE.woff2 +0 -0
  216. writer/static/assets/poppins-latin-ext-300-normal-C9p7gvmA.woff +0 -0
  217. writer/static/assets/poppins-latin-ext-400-italic-BiCGV3eO.woff2 +0 -0
  218. writer/static/assets/poppins-latin-ext-400-italic-gsPYOGqV.woff +0 -0
  219. writer/static/assets/poppins-latin-ext-400-normal-CIpeJEZw.woff2 +0 -0
  220. writer/static/assets/poppins-latin-ext-400-normal-Ce_uWq1Z.woff +0 -0
  221. writer/static/assets/poppins-latin-ext-500-italic-CwrTHwbn.woff2 +0 -0
  222. writer/static/assets/poppins-latin-ext-500-italic-jdc8Bv4M.woff +0 -0
  223. writer/static/assets/poppins-latin-ext-500-normal-Bl1-S02S.woff +0 -0
  224. writer/static/assets/poppins-latin-ext-500-normal-H4Q0z8D2.woff2 +0 -0
  225. writer/static/assets/poppins-latin-ext-600-italic-BqeDa496.woff2 +0 -0
  226. writer/static/assets/poppins-latin-ext-600-italic-C7MQPb_A.woff +0 -0
  227. writer/static/assets/poppins-latin-ext-600-normal-Cn4C8475.woff2 +0 -0
  228. writer/static/assets/poppins-latin-ext-600-normal-DB6FJURc.woff +0 -0
  229. writer/static/assets/poppins-latin-ext-700-italic-BAdhB_WS.woff2 +0 -0
  230. writer/static/assets/poppins-latin-ext-700-italic-WKTwQMp8.woff +0 -0
  231. writer/static/assets/poppins-latin-ext-700-normal-CE2WFKmF.woff +0 -0
  232. writer/static/assets/poppins-latin-ext-700-normal-DDaViAzG.woff2 +0 -0
  233. writer/static/assets/postiats-BR_hrfni.js +6 -0
  234. writer/static/assets/powerquery-CKDUeRmd.js +6 -0
  235. writer/static/assets/powershell-Dsa4rhA_.js +6 -0
  236. writer/static/assets/protobuf-CGsvhooB.js +7 -0
  237. writer/static/assets/pug-D2p3uOX2.js +6 -0
  238. writer/static/assets/python-DVhxg746.js +6 -0
  239. writer/static/assets/qsharp-B7F3HtPF.js +6 -0
  240. writer/static/assets/r-3aLoi2fs.js +6 -0
  241. writer/static/assets/razor-DR5Ns_BC.js +6 -0
  242. writer/static/assets/redis-jqFeRM5s.js +6 -0
  243. writer/static/assets/redshift-BriwQgXR.js +6 -0
  244. writer/static/assets/restructuredtext-hbBFZ0w9.js +6 -0
  245. writer/static/assets/ruby-ByThyB2Q.js +6 -0
  246. writer/static/assets/rust-DIEZMp5R.js +6 -0
  247. writer/static/assets/sb-C6Gjjw_x.js +6 -0
  248. writer/static/assets/scala-DZNw3jJB.js +6 -0
  249. writer/static/assets/scheme-55eqh71t.js +6 -0
  250. writer/static/assets/scss-D-OVkc4F.js +8 -0
  251. writer/static/assets/serialization-DJC7NP0N.js +20 -0
  252. writer/static/assets/shell-DSpi8_qN.js +6 -0
  253. writer/static/assets/solidity-BHddiNFS.js +6 -0
  254. writer/static/assets/sophia-D6taVZFb.js +6 -0
  255. writer/static/assets/sparql-LA0C7mUc.js +6 -0
  256. writer/static/assets/sql-C3-3IcFM.js +6 -0
  257. writer/static/assets/st-C4g7059C.js +6 -0
  258. writer/static/assets/swift-DNI1vH3h.js +8 -0
  259. writer/static/assets/systemverilog-DL_FVbcQ.js +6 -0
  260. writer/static/assets/tcl-DVJXmIwd.js +6 -0
  261. writer/static/assets/ts.worker-CwG1rUES.js +37021 -0
  262. writer/static/assets/tsMode-BNUEZzir.js +16 -0
  263. writer/static/assets/twig-BVWDLtw5.js +6 -0
  264. writer/static/assets/typescript-CRVt7Hx0.js +6 -0
  265. writer/static/assets/useBlueprintRun-C00bCxh-.js +1 -0
  266. writer/static/assets/useKeyValueEditor-nDmI7cTJ.js +1 -0
  267. writer/static/assets/useListResources-DLkZhRSJ.js +1 -0
  268. writer/static/assets/vb-Btz91-7U.js +6 -0
  269. writer/static/assets/vega-embed.module-SNP5iNdJ.js +201 -0
  270. writer/static/assets/wgsl-D8V_buCG.js +303 -0
  271. writer/static/assets/xml-C_6-t1tb.js +6 -0
  272. writer/static/assets/yaml-DIw8G7jk.js +6 -0
  273. writer/static/components/annotatedtext.svg +4 -0
  274. writer/static/components/avatar.svg +4 -0
  275. writer/static/components/blueprints_addtostatelist.svg +4 -0
  276. writer/static/components/blueprints_apitrigger.svg +4 -0
  277. writer/static/components/blueprints_calleventhandler.svg +9 -0
  278. writer/static/components/blueprints_category_Logic.svg +4 -0
  279. writer/static/components/blueprints_category_Other.svg +4 -0
  280. writer/static/components/blueprints_category_Triggers.svg +4 -0
  281. writer/static/components/blueprints_category_Writer.svg +25 -0
  282. writer/static/components/blueprints_code.svg +9 -0
  283. writer/static/components/blueprints_crontrigger.svg +6 -0
  284. writer/static/components/blueprints_foreach.svg +4 -0
  285. writer/static/components/blueprints_httprequest.svg +11 -0
  286. writer/static/components/blueprints_logmessage.svg +11 -0
  287. writer/static/components/blueprints_parsejson.svg +4 -0
  288. writer/static/components/blueprints_returnvalue.svg +4 -0
  289. writer/static/components/blueprints_runblueprint.svg +4 -0
  290. writer/static/components/blueprints_setstate.svg +4 -0
  291. writer/static/components/blueprints_uieventtrigger.svg +4 -0
  292. writer/static/components/blueprints_writeraddchatmessage.svg +19 -0
  293. writer/static/components/blueprints_writeraddtokg.svg +19 -0
  294. writer/static/components/blueprints_writerchat.svg +11 -0
  295. writer/static/components/blueprints_writerchatreply.svg +19 -0
  296. writer/static/components/blueprints_writerclassification.svg +24 -0
  297. writer/static/components/blueprints_writercompletion.svg +14 -0
  298. writer/static/components/blueprints_writerinitchat.svg +11 -0
  299. writer/static/components/blueprints_writernocodeapp.svg +14 -0
  300. writer/static/components/button.svg +4 -0
  301. writer/static/components/category_Content.svg +4 -0
  302. writer/static/components/category_Embed.svg +4 -0
  303. writer/static/components/category_Input.svg +5 -0
  304. writer/static/components/category_Layout.svg +9 -0
  305. writer/static/components/category_Other.svg +4 -0
  306. writer/static/components/chatbot.svg +4 -0
  307. writer/static/components/checkboxinput.svg +4 -0
  308. writer/static/components/colorinput.svg +11 -0
  309. writer/static/components/column.svg +4 -0
  310. writer/static/components/columns.svg +4 -0
  311. writer/static/components/dataframe.svg +4 -0
  312. writer/static/components/dateinput.svg +4 -0
  313. writer/static/components/dropdowninput.svg +5 -0
  314. writer/static/components/fileinput.svg +4 -0
  315. writer/static/components/googlemaps.svg +4 -0
  316. writer/static/components/header.svg +4 -0
  317. writer/static/components/heading.svg +9 -0
  318. writer/static/components/horizontalstack.svg +4 -0
  319. writer/static/components/html.svg +9 -0
  320. writer/static/components/icon.svg +4 -0
  321. writer/static/components/iframe.svg +4 -0
  322. writer/static/components/image.svg +11 -0
  323. writer/static/components/jsonviewer.svg +4 -0
  324. writer/static/components/link.svg +12 -0
  325. writer/static/components/mapbox.svg +4 -0
  326. writer/static/components/message.svg +4 -0
  327. writer/static/components/metric.svg +4 -0
  328. writer/static/components/multiselectinput.svg +4 -0
  329. writer/static/components/numberinput.svg +4 -0
  330. writer/static/components/page.svg +50 -0
  331. writer/static/components/pagination.svg +4 -0
  332. writer/static/components/pdf.svg +4 -0
  333. writer/static/components/plotlygraph.svg +7 -0
  334. writer/static/components/progressbar.svg +5 -0
  335. writer/static/components/radioinput.svg +4 -0
  336. writer/static/components/rangeinput.svg +4 -0
  337. writer/static/components/ratinginput.svg +4 -0
  338. writer/static/components/repeater.svg +4 -0
  339. writer/static/components/reuse.svg +4 -0
  340. writer/static/components/section.svg +4 -0
  341. writer/static/components/selectinput.svg +5 -0
  342. writer/static/components/separator.svg +4 -0
  343. writer/static/components/sidebar.svg +4 -0
  344. writer/static/components/sliderinput.svg +4 -0
  345. writer/static/components/step.svg +4 -0
  346. writer/static/components/steps.svg +4 -0
  347. writer/static/components/switchinput.svg +4 -0
  348. writer/static/components/tab.svg +4 -0
  349. writer/static/components/tabs.svg +4 -0
  350. writer/static/components/tags.svg +11 -0
  351. writer/static/components/text.svg +4 -0
  352. writer/static/components/textareainput.svg +11 -0
  353. writer/static/components/textinput.svg +4 -0
  354. writer/static/components/timeinput.svg +4 -0
  355. writer/static/components/timer.svg +4 -0
  356. writer/static/components/vegalitechart.svg +7 -0
  357. writer/static/components/videoplayer.svg +11 -0
  358. writer/static/components/webcamcapture.svg +4 -0
  359. writer/static/favicon.png +0 -0
  360. writer/static/index.html +84 -0
  361. writer/static/status/cancelled.svg +5 -0
  362. writer/static/status/error.svg +5 -0
  363. writer/static/status/skipped.svg +4 -0
  364. writer/static/status/stopped.svg +4 -0
  365. writer/static/status/success.svg +4 -0
  366. writer/sync.py +431 -0
  367. writer/ui.py +2268 -0
  368. writer/vault.py +48 -0
  369. writer/wf_project.py +90 -66
  370. writer-1.25.1rc1.dist-info/METADATA +92 -0
  371. writer-1.25.1rc1.dist-info/RECORD +382 -0
  372. {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info}/WHEEL +1 -1
  373. writer/blocks/runworkflow.py +0 -59
  374. writer/workflows.py +0 -183
  375. writer-0.8.3rc4.dist-info/METADATA +0 -117
  376. writer-0.8.3rc4.dist-info/RECORD +0 -44
  377. {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info}/entry_points.txt +0 -0
  378. {writer-0.8.3rc4.dist-info → writer-1.25.1rc1.dist-info/licenses}/LICENSE.txt +0 -0
@@ -1,48 +1,49 @@
1
1
  import json
2
2
 
3
3
  from writer.abstract import register_abstract_template
4
- from writer.blocks.base_block import WorkflowBlock
4
+ from writer.blocks.base_block import BlueprintBlock
5
5
  from writer.ss_types import AbstractTemplate
6
6
 
7
7
 
8
- class ParseJSON(WorkflowBlock):
9
-
8
+ class ParseJSON(BlueprintBlock):
10
9
  @classmethod
11
10
  def register(cls, type: str):
12
11
  super(ParseJSON, cls).register(type)
13
- register_abstract_template(type, AbstractTemplate(
14
- baseType="workflows_node",
15
- writer={
16
- "name": "Parse JSON",
17
- "description": "Parses a JSON string.",
18
- "category": "Other",
19
- "fields": {
20
- "plainText": {
21
- "name": "Plain text",
22
- "type": "Text",
23
- "control": "Textarea"
24
- },
25
- },
26
- "outs": {
27
- "success": {
28
- "name": "Success",
29
- "description": "The request was successful.",
30
- "style": "success",
12
+ register_abstract_template(
13
+ type,
14
+ AbstractTemplate(
15
+ baseType="blueprints_node",
16
+ writer={
17
+ "name": "Parse JSON",
18
+ "description": "Converts a JSON string into an object, so you can work with it in your logic.",
19
+ "category": "Other",
20
+ "fields": {
21
+ "plainText": {"name": "Plain text", "type": "Text", "control": "Textarea"},
31
22
  },
32
- "error": {
33
- "name": "Error",
34
- "description": "The text provided couldn't be parsed.",
35
- "style": "error",
23
+ "outs": {
24
+ "success": {
25
+ "name": "Success",
26
+ "description": "The request was successful.",
27
+ "style": "success",
28
+ },
29
+ "error": {
30
+ "name": "Error",
31
+ "description": "The text provided couldn't be parsed.",
32
+ "style": "error",
33
+ },
36
34
  },
37
35
  },
38
- }
39
- ))
36
+ ),
37
+ )
40
38
 
41
39
  def run(self):
42
40
  try:
43
41
  plain_text = self._get_field("plainText")
44
- self.result = json.loads(plain_text)
42
+ if isinstance(plain_text, dict):
43
+ self.result = plain_text
44
+ else:
45
+ self.result = json.loads(plain_text)
45
46
  self.outcome = "success"
46
47
  except BaseException as e:
47
48
  self.outcome = "error"
48
- raise e
49
+ raise e
@@ -1,18 +1,18 @@
1
1
  from writer.abstract import register_abstract_template
2
- from writer.blocks.base_block import WorkflowBlock
2
+ from writer.blocks.base_block import BlueprintBlock
3
3
  from writer.ss_types import AbstractTemplate, WriterConfigurationError
4
4
 
5
5
 
6
- class ReturnValue(WorkflowBlock):
6
+ class ReturnValue(BlueprintBlock):
7
7
 
8
8
  @classmethod
9
9
  def register(cls, type: str):
10
10
  super(ReturnValue, cls).register(type)
11
11
  register_abstract_template(type, AbstractTemplate(
12
- baseType="workflows_node",
12
+ baseType="blueprints_node",
13
13
  writer={
14
14
  "name": "Return value",
15
- "description": "Returns a value from a workflow or sub-workflow.",
15
+ "description": "Returns a value from this block to the caller. Use to pass results to another blueprint.",
16
16
  "category": "Logic",
17
17
  "fields": {
18
18
  "value": {
@@ -24,12 +24,12 @@ class ReturnValue(WorkflowBlock):
24
24
  "outs": {
25
25
  "success": {
26
26
  "name": "Success",
27
- "description": "If the function doesn't raise an Exception.",
27
+ "description": "The value was returned successfully.",
28
28
  "style": "success",
29
29
  },
30
30
  "error": {
31
31
  "name": "Error",
32
- "description": "If the function raises an Exception.",
32
+ "description": "There was an error returning the value.",
33
33
  "style": "error",
34
34
  },
35
35
  },
@@ -46,4 +46,4 @@ class ReturnValue(WorkflowBlock):
46
46
  self.outcome = "success"
47
47
  except BaseException as e:
48
48
  self.outcome = "error"
49
- raise e
49
+ raise e
@@ -0,0 +1,63 @@
1
+ from writer.abstract import register_abstract_template
2
+ from writer.blocks.base_block import BlueprintBlock
3
+ from writer.ss_types import AbstractTemplate
4
+
5
+
6
+ class RunBlueprint(BlueprintBlock):
7
+ @classmethod
8
+ def register(cls, type: str):
9
+ super(RunBlueprint, cls).register(type)
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "Run blueprint",
16
+ "description": "Starts another blueprint by key. Useful for breaking logic into smaller, reusable parts.",
17
+ "category": "Logic",
18
+ "fields": {
19
+ "blueprintKey": {
20
+ "name": "Blueprint Key",
21
+ "type": "Blueprint Key",
22
+ "validator": {
23
+ "type": "string",
24
+ "format": "writer#blueprintKey",
25
+ },
26
+ },
27
+ "payload": {
28
+ "name": "Payload",
29
+ "desc": "The value specified will be available using the template syntax, e.g. @{payload}.",
30
+ "default": "{}",
31
+ "type": "Text",
32
+ "control": "Textarea",
33
+ },
34
+ },
35
+ "outs": {
36
+ "success": {
37
+ "name": "Success",
38
+ "description": "The request was successful.",
39
+ "style": "success",
40
+ },
41
+ "error": {
42
+ "name": "Error",
43
+ "description": "The blueprint execution failed.",
44
+ "style": "error",
45
+ },
46
+ },
47
+ },
48
+ ),
49
+ )
50
+
51
+ def run(self):
52
+ try:
53
+ blueprint_key = self._get_field("blueprintKey")
54
+ payload = self._get_field("payload")
55
+ expanded_execution_environment = self.execution_environment | {"payload": payload}
56
+ return_value = self.runner.run_blueprint_by_key(
57
+ blueprint_key, expanded_execution_environment
58
+ )
59
+ self.result = return_value
60
+ self.outcome = "success"
61
+ except BaseException as e:
62
+ self.outcome = "error"
63
+ raise e
writer/blocks/setstate.py CHANGED
@@ -1,53 +1,63 @@
1
1
  from writer.abstract import register_abstract_template
2
- from writer.blocks.base_block import WorkflowBlock
2
+ from writer.blocks.base_block import BlueprintBlock
3
3
  from writer.ss_types import AbstractTemplate
4
4
 
5
5
 
6
- class SetState(WorkflowBlock):
7
-
6
+ class SetState(BlueprintBlock):
8
7
  @classmethod
9
8
  def register(cls, type: str):
10
9
  super(SetState, cls).register(type)
11
- register_abstract_template(type, AbstractTemplate(
12
- baseType="workflows_node",
13
- writer={
14
- "name": "Set state",
15
- "description": "Set the value for a state element.",
16
- "category": "Other",
17
- "fields": {
18
- "element": {
19
- "name": "State element",
20
- "type": "Text"
21
- },
22
- "value": {
23
- "name": "Value",
24
- "type": "Text",
25
- "control": "Textarea"
26
- },
27
- },
28
- "outs": {
29
- "success": {
30
- "name": "Success",
31
- "description": "If the function doesn't raise an Exception.",
32
- "style": "success",
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "Set state",
16
+ "description": "Stores a value in the Agent's state. Use to remember data across steps.",
17
+ "category": "Other",
18
+ "fields": {
19
+ "element": {
20
+ "name": "Link Variable",
21
+ "type": "Binding",
22
+ "desc": "Set the variable here and use it across your agent.",
23
+ },
24
+ "valueType": {
25
+ "name": "Value type",
26
+ "type": "Text",
27
+ "description": "Specify whether to interpret the value as plain text or JSON.",
28
+ "options": {
29
+ "text": "Plain text",
30
+ "JSON": "JSON",
31
+ },
32
+ "default": "text",
33
+ },
34
+ "value": {"name": "Value", "type": "Text", "control": "Textarea"},
33
35
  },
34
- "error": {
35
- "name": "Error",
36
- "description": "If the function raises an Exception.",
37
- "style": "error",
36
+ "outs": {
37
+ "success": {
38
+ "name": "Success",
39
+ "description": "The state was updated successfully.",
40
+ "style": "success",
41
+ },
42
+ "error": {
43
+ "name": "Error",
44
+ "description": "There was an error updating the state.",
45
+ "style": "error",
46
+ },
38
47
  },
39
48
  },
40
- }
41
- ))
49
+ ),
50
+ )
42
51
 
43
52
  def run(self):
44
53
  try:
45
54
  element = self._get_field("element", required=True)
46
- value = self._get_field("value")
55
+ value_type = self._get_field("valueType")
56
+ value = self._get_field("value", as_json=value_type == "JSON")
47
57
 
48
58
  self._set_state(element, value)
49
59
  self.result = value
50
60
  self.outcome = "success"
51
61
  except BaseException as e:
52
62
  self.outcome = "error"
53
- raise e
63
+ raise e
@@ -0,0 +1,86 @@
1
+ """
2
+ Shared blueprint implementation for user-created reusable blueprints.
3
+
4
+ Shared blueprints execute stored blueprint components by loading them from the component tree.
5
+ The component's content.sourceBlueprintId field references the source blueprint.
6
+ """
7
+
8
+ from writer.abstract import register_abstract_template
9
+ from writer.blocks.base_block import BlueprintBlock
10
+ from writer.ss_types import AbstractTemplate
11
+
12
+
13
+ class SharedBlueprint(BlueprintBlock):
14
+ """
15
+ Shared blueprint that executes components from a source blueprint in the component tree.
16
+
17
+ The source blueprint is identified by the sourceBlueprintId content field.
18
+ """
19
+
20
+ @classmethod
21
+ def register(cls, type: str):
22
+ """Register the blueprints_shared type with its abstract template."""
23
+ super(SharedBlueprint, cls).register(type)
24
+ register_abstract_template(
25
+ type,
26
+ AbstractTemplate(
27
+ baseType="blueprints_node",
28
+ writer={
29
+ "name": "Shared Blueprint",
30
+ "description": "Executes a shared blueprint from the component tree.",
31
+ "category": "Logic",
32
+ "toolkit": "blueprints",
33
+ "featureFlags": ["shared_blueprints"],
34
+ "fields": {
35
+ "payload": {
36
+ "name": "Payload",
37
+ "desc": "The value specified will be available using the template syntax, e.g. @{payload}.",
38
+ "default": "{}",
39
+ "type": "Text",
40
+ "control": "Textarea",
41
+ },
42
+ },
43
+ "outs": {
44
+ "success": {
45
+ "name": "Success",
46
+ "description": "Blueprint executed successfully.",
47
+ "style": "success",
48
+ },
49
+ "error": {
50
+ "name": "Error",
51
+ "description": "Blueprint execution failed.",
52
+ "style": "error",
53
+ },
54
+ },
55
+ },
56
+ ),
57
+ )
58
+
59
+ def run(self):
60
+ """Execute the source blueprint's components."""
61
+ source_blueprint_id = self.component.content.get("sourceBlueprintId", "")
62
+
63
+ if not source_blueprint_id:
64
+ raise ValueError("No source blueprint ID specified")
65
+
66
+ try:
67
+ payload = self._get_field("payload")
68
+ expanded_execution_environment = self.execution_environment | {"payload": payload}
69
+
70
+ # Get blueprint name for title (matching run_blueprint_by_key pattern)
71
+ source_blueprint = self.runner.session.session_component_tree.get_component(
72
+ source_blueprint_id
73
+ )
74
+ blueprint_name = source_blueprint.content.get("key", "Shared Blueprint") if source_blueprint else "Shared Blueprint"
75
+
76
+ return_value = self.runner.run_blueprint(
77
+ source_blueprint_id,
78
+ expanded_execution_environment,
79
+ title=f"Shared blueprint execution ({blueprint_name})"
80
+ )
81
+
82
+ self.result = return_value
83
+ self.outcome = "success"
84
+ except BaseException as e:
85
+ self.outcome = "error"
86
+ raise e
@@ -0,0 +1,49 @@
1
+ from writer.abstract import register_abstract_template
2
+ from writer.blocks.base_trigger import BlueprintTrigger
3
+ from writer.ss_types import AbstractTemplate
4
+
5
+
6
+ class UIEventTrigger(BlueprintTrigger):
7
+ @classmethod
8
+ def register(cls, type: str):
9
+ super(UIEventTrigger, cls).register(type)
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "UI Trigger",
16
+ "description": "Triggers an event based on UI interactions like button clicks or input changes.",
17
+ "category": "Triggers",
18
+ "fields": {
19
+ "refComponentId": {
20
+ "name": "Component Id",
21
+ "type": "Component Id",
22
+ "options": "uiComponentsWithEvents",
23
+ "desc": "The id of the component that will trigger this branch.",
24
+ },
25
+ "refEventType": {
26
+ "name": "Event type",
27
+ "type": "Component Event Type",
28
+ "desc": "The type of the event that will trigger this branch. For example, wf-click.",
29
+ "options": "eventTypes",
30
+ },
31
+ "defaultResult": {
32
+ "name": "Default result",
33
+ "type": "Code",
34
+ "desc": 'The result that is used when the blueprint is triggered from the "Run blueprint" button',
35
+ },
36
+ },
37
+ "outs": {
38
+ "trigger": {
39
+ "name": "Trigger",
40
+ "style": "success",
41
+ },
42
+ },
43
+ },
44
+ ),
45
+ )
46
+
47
+ def run(self):
48
+ super().run()
49
+ self.outcome = "trigger"
@@ -1,34 +1,72 @@
1
1
  from writer.abstract import register_abstract_template
2
- from writer.blocks.base_block import WorkflowBlock
2
+ from writer.blocks.base_block import BlueprintBlock
3
3
  from writer.ss_types import AbstractTemplate, WriterConfigurationError
4
4
 
5
5
 
6
- class WriterAddChatMessage(WorkflowBlock):
6
+ class WriterAddChatMessage(BlueprintBlock):
7
7
 
8
8
  @classmethod
9
9
  def register(cls, type: str):
10
10
  super(WriterAddChatMessage, cls).register(type)
11
11
  register_abstract_template(type, AbstractTemplate(
12
- baseType="workflows_node",
12
+ baseType="blueprints_node",
13
13
  writer={
14
14
  "name": "Add chat message",
15
- "description": "Add a message to a conversation.",
15
+ "description": "Adds a message to the conversation history. Use for displaying user or AI messages.",
16
16
  "category": "Writer",
17
+ "deprecated": True,
17
18
  "fields": {
18
19
  "conversationStateElement": {
19
20
  "name": "Conversation state element",
20
- "desc": "Where the conversation is stored",
21
- "type": "Text",
21
+ "desc": "The variable that has your conversation object.",
22
+ "type": "Binding",
22
23
  },
23
24
  "message": {
24
25
  "name": "Message",
25
26
  "type": "Object",
26
27
  "init": '{ "role": "assistant", "content": "Hello" }',
28
+ "desc": "A message object. Content can be text string or array of objects for multimodal (text + images) with X5 model.",
27
29
  "validator": {
28
30
  "type": "object",
29
31
  "properties": {
30
- "role": { "type": "string" },
31
- "content": { "type": "string" },
32
+ "role": {"type": "string"},
33
+ "content": {
34
+ "oneOf": [
35
+ {"type": "string"},
36
+ {
37
+ "type": "array",
38
+ "items": {
39
+ "oneOf": [
40
+ {
41
+ "type": "object",
42
+ "properties": {
43
+ "type": {"type": "string", "enum": ["text"]},
44
+ "text": {"type": "string"}
45
+ },
46
+ "required": ["type", "text"],
47
+ "additionalProperties": False
48
+ },
49
+ {
50
+ "type": "object",
51
+ "properties": {
52
+ "type": {"type": "string", "enum": ["image_url"]},
53
+ "image_url": {
54
+ "type": "object",
55
+ "properties": {
56
+ "url": {"type": "string"}
57
+ },
58
+ "required": ["url"],
59
+ "additionalProperties": False
60
+ }
61
+ },
62
+ "required": ["type", "image_url"],
63
+ "additionalProperties": False
64
+ }
65
+ ]
66
+ }
67
+ }
68
+ ]
69
+ },
32
70
  },
33
71
  "additionalProperties": False,
34
72
  }
@@ -37,12 +75,12 @@ class WriterAddChatMessage(WorkflowBlock):
37
75
  "outs": {
38
76
  "success": {
39
77
  "name": "Success",
40
- "description": "If the function doesn't raise an Exception.",
78
+ "description": "The message was added to the conversation.",
41
79
  "style": "success",
42
80
  },
43
81
  "error": {
44
82
  "name": "Error",
45
- "description": "If the function raises an Exception.",
83
+ "description": "There was an error adding the message.",
46
84
  "style": "error",
47
85
  },
48
86
  },
@@ -59,7 +97,7 @@ class WriterAddChatMessage(WorkflowBlock):
59
97
  conversation = self.evaluator.evaluate_expression(conversation_state_element, self.instance_path, self.execution_environment)
60
98
 
61
99
  if conversation is None or not isinstance(conversation, writer.ai.Conversation):
62
- raise WriterConfigurationError("The state element specified doesn't contain a conversation. Initialize one using the block 'Initialize chat'.")
100
+ raise WriterConfigurationError("The state element specified doesn't contain a conversation. Initialize one using the block 'Start chat conversation'.")
63
101
 
64
102
  writer.ai.Conversation.validate_message(message)
65
103
  conversation += message
@@ -71,4 +109,4 @@ class WriterAddChatMessage(WorkflowBlock):
71
109
  self.outcome = "error"
72
110
  raise e
73
111
 
74
-
112
+
@@ -1,25 +1,25 @@
1
1
  from typing import Any
2
2
 
3
3
  from writer.abstract import register_abstract_template
4
- from writer.blocks.base_block import WorkflowBlock
4
+ from writer.blocks.base_block import WriterBlock
5
5
  from writer.ss_types import AbstractTemplate, WriterConfigurationError
6
6
 
7
7
 
8
- class WriterAddToKG(WorkflowBlock):
8
+ class WriterAddToKG(WriterBlock):
9
9
 
10
10
  @classmethod
11
11
  def register(cls, type: str):
12
12
  super(WriterAddToKG, cls).register(type)
13
13
  register_abstract_template(type, AbstractTemplate(
14
- baseType="workflows_node",
14
+ baseType="blueprints_node",
15
15
  writer={
16
16
  "name": "Add to Knowledge Graph",
17
- "description": "Adds files to an existing knowledge graph.",
17
+ "description": "Adds structured information to the knowledge graph. Use for storing facts AI can reference.",
18
18
  "category": "Writer",
19
19
  "fields": {
20
20
  "graphId": {
21
- "name": "Graph id",
22
- "type": "Text",
21
+ "name": "Graph Id",
22
+ "type": "Graph Id",
23
23
  "desc": "The id for an existing knowledge graph. It has a UUID format.",
24
24
  "validator": {
25
25
  "type": "string",
@@ -30,21 +30,34 @@ class WriterAddToKG(WorkflowBlock):
30
30
  "name": "Files",
31
31
  "type": "Object",
32
32
  "default": "[]",
33
- "desc": "A list of files to be uploaded and added to the knowledge graph. You can use files uploaded via the File Input component or specify dictionaries with data, type and name.",
33
+ "desc": "A list of files to be uploaded and added to the knowledge graph. You can use files uploaded via the File input component or specify dictionaries with data, type and name.",
34
34
  "validator": {
35
35
  "type": "array",
36
36
  }
37
37
  },
38
+ "urls": {
39
+ "name": "URLs",
40
+ "type": "Object",
41
+ "default": "[]",
42
+ "desc": "A list of URLs to be added to the knowledge graph. Web content from these URLs will be indexed.",
43
+ "validator": {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "string",
47
+ "format": "uri",
48
+ }
49
+ }
50
+ },
38
51
  },
39
52
  "outs": {
40
53
  "success": {
41
54
  "name": "Success",
42
- "description": "If the execution was successful.",
55
+ "description": "Content was added to the knowledge graph.",
43
56
  "style": "success",
44
57
  },
45
58
  "error": {
46
59
  "name": "Error",
47
- "description": "If the function raises an Exception.",
60
+ "description": "There was an error adding content to the knowledge graph.",
48
61
  "style": "error",
49
62
  },
50
63
  },
@@ -65,24 +78,38 @@ class WriterAddToKG(WorkflowBlock):
65
78
  import writer.ai
66
79
 
67
80
  graph_id = self._get_field("graphId", required=True)
68
- raw_files = self._get_field("files", as_json=True)
81
+ raw_files = self._get_field("files", as_json=True, default_field_value="[]")
82
+ urls = self._get_field("urls", as_json=True, default_field_value="[]")
69
83
  prepared_files = []
70
84
 
71
85
  if not isinstance(raw_files, list):
72
86
  raise WriterConfigurationError("Files must be a list.")
87
+
88
+ if not isinstance(urls, list):
89
+ raise WriterConfigurationError("URLs must be a list.")
90
+
91
+ if not raw_files and not urls:
92
+ raise WriterConfigurationError("At least one file or URL must be provided.")
73
93
 
74
94
  for raw_file in raw_files:
75
95
  prepared_files.append(self._get_prepared_file(raw_file))
76
96
 
77
97
  graph = writer.ai.retrieve_graph(graph_id)
78
98
 
99
+ # Add files to the graph
79
100
  for prepared_file in prepared_files:
80
101
  file = writer.ai.upload_file(prepared_file.get("data"),
81
102
  prepared_file.get("type"),
82
103
  prepared_file.get("name"))
83
104
  graph.add_file(file)
105
+
106
+ # Add URLs to the graph using SDK 2.3.0 feature
107
+ for url in urls:
108
+ if not isinstance(url, str):
109
+ raise WriterConfigurationError(f"URL must be a string, got {type(url)}")
110
+ graph.add_url(url)
84
111
 
85
112
  self.outcome = "success"
86
113
  except BaseException as e:
87
114
  self.outcome = "error"
88
- raise e
115
+ raise e