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
@@ -0,0 +1,123 @@
1
+ import json
2
+ import logging
3
+
4
+ from writer.abstract import register_abstract_template
5
+ from writer.blocks.base_block import WriterBlock
6
+ from writer.ss_types import AbstractTemplate
7
+
8
+
9
+ class WriterAskGraphQuestion(WriterBlock):
10
+ @classmethod
11
+ def register(cls, type: str):
12
+ super(WriterAskGraphQuestion, cls).register(type)
13
+ register_abstract_template(type, AbstractTemplate(
14
+ baseType="blueprints_node",
15
+ writer={
16
+ "name": "Ask graph question",
17
+ "description": "Asks a natural language question using one or more knowledge graphs and puts the result into a state variable.",
18
+ "category": "Writer",
19
+ "fields": {
20
+ "question": {
21
+ "name": "Question",
22
+ "type": "Text",
23
+ "desc": "The natural language question to ask.",
24
+ "control": "Textarea",
25
+ },
26
+ "useStreaming": {
27
+ "name": "Use streaming",
28
+ "type": "Boolean",
29
+ "default": "yes",
30
+ "validator": {
31
+ "type": "boolean",
32
+ },
33
+ },
34
+ "stateElement": {
35
+ "name": "Link Variable",
36
+ "type": "Binding",
37
+ "desc": "Set the variable here and use it across your agent.",
38
+ },
39
+ "graphIds": {
40
+ "name": "Graph Ids",
41
+ "type": "Graph Ids",
42
+ "desc": "IDs of the graphs to query.",
43
+ "default": "",
44
+ "validator": {
45
+ "type": "string",
46
+ }
47
+ },
48
+ "subqueries": {
49
+ "name": "Use subqueries",
50
+ "type": "Boolean",
51
+ "desc": "Enables LLM to ask follow-up questions to the knowledge graph. This improves answers, but may be slower.",
52
+ "default": "yes",
53
+ "validator": {
54
+ "type": "boolean",
55
+ },
56
+ }
57
+ },
58
+ "outs": {
59
+ "success": {
60
+ "name": "Success",
61
+ "description": "Successfully streamed the answer.",
62
+ "style": "success"
63
+ },
64
+ "error": {
65
+ "name": "Error",
66
+ "description": "There was an error answering the question.",
67
+ "style": "error"
68
+ }
69
+ }
70
+ }
71
+ ))
72
+
73
+ def run(self):
74
+ try:
75
+ client = self.writer_sdk_client
76
+
77
+ graph_ids = self._get_field(
78
+ "graphIds", as_json=True, required=True)
79
+ use_streaming = self._get_field(
80
+ "useStreaming", False, "yes") == "yes"
81
+ if isinstance(graph_ids, str):
82
+ graph_ids = [graph_ids]
83
+ elif not isinstance(graph_ids, list):
84
+ raise ValueError(
85
+ "graphIds must be a string or a list of strings")
86
+ if len(graph_ids) == 0:
87
+ raise ValueError("graphIds must not be empty")
88
+
89
+ question = self._get_field("question", required=True)
90
+ state_element = self._get_field("stateElement", required=False)
91
+ if not state_element and use_streaming:
92
+ raise ValueError(
93
+ "A state element must be provided when using streaming.")
94
+ subqueries = self._get_field(
95
+ "subqueries", default_field_value="yes") == "yes"
96
+
97
+ answer_so_far = ""
98
+
99
+ response = client.graphs.question(
100
+ graph_ids=graph_ids,
101
+ question=question,
102
+ stream=use_streaming,
103
+ subqueries=subqueries
104
+ )
105
+ if use_streaming:
106
+ for chunk in response:
107
+ try:
108
+ delta = chunk.model_extra.get("answer", "")
109
+ answer_so_far += delta
110
+ self._set_state(state_element, answer_so_far)
111
+ except json.JSONDecodeError:
112
+ logging.error(
113
+ "Could not parse stream chunk from graph.question")
114
+ else:
115
+ answer_so_far = response.answer
116
+ self._set_state(state_element, answer_so_far)
117
+
118
+ self.result = answer_so_far
119
+ self.outcome = "success"
120
+
121
+ except BaseException as e:
122
+ self.outcome = "error"
123
+ raise e
@@ -1,80 +1,93 @@
1
1
  from writer.abstract import register_abstract_template
2
- from writer.blocks.base_block import WorkflowBlock
2
+ from writer.blocks.base_block import WriterBlock
3
3
  from writer.ss_types import AbstractTemplate
4
4
 
5
5
 
6
- class WriterChat(WorkflowBlock):
7
-
6
+ class WriterChat(WriterBlock):
8
7
  @classmethod
9
8
  def register(cls, type: str):
10
9
  super(WriterChat, cls).register(type)
11
- register_abstract_template(type, AbstractTemplate(
12
- baseType="workflows_node",
13
- writer={
14
- "name": "Chat completion",
15
- "description": "Handles chat completions.",
16
- "category": "Writer",
17
- "fields": {
18
- "conversationStateElement": {
19
- "name": "Conversation state element",
20
- "desc": "Where the conversation will be stored",
21
- "type": "Text",
22
- },
23
- "useStreaming": {
24
- "name": "Use streaming",
25
- "type": "Text",
26
- "default": "yes",
27
- "options": {
28
- "yes": "Yes",
29
- "no": "No"
30
- }
31
- },
32
- "tools": {
33
- "name": "Tools",
34
- "type": "Tools",
35
- "default": "{}",
36
- "category": "Tools"
37
- }
38
- },
39
- "outs": {
40
- "tools": {
41
- "name": "Tools",
42
- "field": "tools",
43
- "description": "Run associated tools.",
44
- "style": "dynamic"
10
+ register_abstract_template(
11
+ type,
12
+ AbstractTemplate(
13
+ baseType="blueprints_node",
14
+ writer={
15
+ "name": "Generate chat reply",
16
+ "description": "Generates an AI chat response using the full conversation history. Requires prior messages.",
17
+ "category": "Writer",
18
+ "deprecated": True,
19
+ "fields": {
20
+ "conversationStateElement": {
21
+ "name": "Conversation state element",
22
+ "desc": "The variable that has your conversation object.",
23
+ "type": "Binding",
24
+ },
25
+ "useStreaming": {
26
+ "name": "Use streaming",
27
+ "type": "Boolean",
28
+ "default": "yes",
29
+ "validator": {
30
+ "type": "boolean",
31
+ },
32
+ },
33
+ "tools": {
34
+ "name": "Tools",
35
+ "type": "Tools",
36
+ "default": "{}",
37
+ "init": "",
38
+ "category": "Tools",
39
+ },
45
40
  },
46
- "success": {
47
- "name": "Success",
48
- "description": "If the function doesn't raise an Exception.",
49
- "style": "success",
50
- },
51
- "error": {
52
- "name": "Error",
53
- "description": "If the function raises an Exception.",
54
- "style": "error",
41
+ "outs": {
42
+ "tools": {
43
+ "name": "Tools",
44
+ "field": "tools",
45
+ "description": "Run associated tools.",
46
+ "style": "dynamic",
47
+ },
48
+ "success": {
49
+ "name": "Success",
50
+ "description": "The reply was generated successfully.",
51
+ "style": "success",
52
+ },
53
+ "error": {
54
+ "name": "Error",
55
+ "description": "There was an error generating the reply.",
56
+ "style": "error",
57
+ },
55
58
  },
56
59
  },
57
- }
58
- ))
60
+ ),
61
+ )
59
62
 
60
63
  def _make_callable(self, tool_name: str):
61
64
  def callable(**args):
62
65
  expanded_execution_environment = self.execution_environment | args
63
- return_value = self.runner.run_branch(self.component_id, f"tools_{tool_name}", expanded_execution_environment, f"Workflow branch execution (chat tool {tool_name})")
66
+ return_value = self.runner.run_branch(
67
+ self.component.id,
68
+ f"tools_{tool_name}",
69
+ expanded_execution_environment,
70
+ f"Blueprint branch execution (chat tool {tool_name})",
71
+ )
64
72
 
65
73
  if return_value is None:
66
74
  self.outcome = "error"
67
- raise ValueError(f'No value has been returned for the outcome branch "{tool_name}". Use the block "Return value" to specify one.')
75
+ raise ValueError(
76
+ f'No value has been returned for the outcome branch "{tool_name}". Use the block "Return value" to specify one.'
77
+ )
68
78
 
69
79
  return return_value
80
+
70
81
  return callable
71
82
 
72
83
  def run(self):
73
84
  try:
74
85
  import writer.ai
75
86
 
76
- conversation_state_element = self._get_field("conversationStateElement", required=True)
77
- use_streaming = self._get_field("useStreaming", False, "yes") == "yes"
87
+ conversation_state_element = self._get_field(
88
+ "conversationStateElement", required=True)
89
+ use_streaming = self._get_field(
90
+ "useStreaming", False, "yes") == "yes"
78
91
  tools_raw = self._get_field("tools", True)
79
92
  tools = []
80
93
 
@@ -87,21 +100,27 @@ class WriterChat(WorkflowBlock):
87
100
  name=tool_name,
88
101
  description=tool_raw.get("description"),
89
102
  callable=self._make_callable(tool_name),
90
- parameters=tool_raw.get("parameters")
103
+ parameters=tool_raw.get("parameters"),
91
104
  )
92
105
  elif tool_type == "graph":
93
- tool = {
94
- "type": "graph",
95
- "graph_ids": tool_raw.get("graph_ids")
96
- }
106
+ tool = writer.ai.GraphTool(
107
+ type="graph",
108
+ graph_ids=tool_raw.get("graph_ids"),
109
+ subqueries=False,
110
+ description=tool_name,
111
+ )
97
112
  else:
98
113
  continue
99
114
  tools.append(tool)
100
115
 
101
- conversation = self.evaluator.evaluate_expression(conversation_state_element, self.instance_path, self.execution_environment)
116
+ conversation = self.evaluator.evaluate_expression(
117
+ conversation_state_element, self.instance_path, self.execution_environment
118
+ )
102
119
 
103
120
  if conversation is None or not isinstance(conversation, writer.ai.Conversation):
104
- raise ValueError("The state element specified doesn't contain a conversation. Initialize one using the block 'Initialize chat'.")
121
+ raise ValueError(
122
+ "The state element specified doesn't contain a conversation. Initialize one using the block 'Start chat conversation'."
123
+ )
105
124
 
106
125
  msg = ""
107
126
  if not use_streaming:
@@ -115,9 +134,9 @@ class WriterChat(WorkflowBlock):
115
134
  msg += chunk.get("content")
116
135
  conversation += chunk
117
136
  self._set_state(conversation_state_element, conversation)
118
-
137
+
119
138
  self.result = msg
120
139
  self.outcome = "success"
121
140
  except BaseException as e:
122
141
  self.outcome = "error"
123
- raise e
142
+ raise e
@@ -0,0 +1,279 @@
1
+ from writer.abstract import register_abstract_template
2
+ from writer.blocks.base_block import WriterBlock
3
+ from writer.ss_types import AbstractTemplate, WriterConfigurationError
4
+
5
+ DEFAULT_MODEL = "palmyra-x5"
6
+
7
+
8
+ class WriterChatReply(WriterBlock):
9
+ @classmethod
10
+ def register(cls, type: str):
11
+ super(WriterChatReply, cls).register(type)
12
+ register_abstract_template(
13
+ type,
14
+ AbstractTemplate(
15
+ baseType="blueprints_node",
16
+ writer={
17
+ "name": "Chat reply",
18
+ "description": "Initializes conversations, adds messages, and generates replies.",
19
+ "category": "Writer",
20
+ "fields": {
21
+ "conversationStateElement": {
22
+ "name": "Conversation Object",
23
+ "desc": "The variable that has your conversation object.",
24
+ "init": "chat",
25
+ "type": "Binding",
26
+ },
27
+ "systemPrompt": {
28
+ "name": "System prompt",
29
+ "type": "Text",
30
+ "control": "Textarea",
31
+ "default": "",
32
+ "desc": "A system prompt to set the context for the conversation. Can be left empty if conversation is already initialized in state.",
33
+ },
34
+ "message": {
35
+ "name": "Message",
36
+ "type": "Object",
37
+ "init": '{ "role": "user", "content": "Hello" }',
38
+ "desc": "A message object. Content can be text string or array of objects for multimodal (text + images) with X5 model.",
39
+ "validator": {
40
+ "type": "object",
41
+ "properties": {
42
+ "role": {"type": "string"},
43
+ "content": {
44
+ "oneOf": [
45
+ {"type": "string"},
46
+ {
47
+ "type": "array",
48
+ "items": {
49
+ "oneOf": [
50
+ {
51
+ "type": "object",
52
+ "properties": {
53
+ "type": {
54
+ "type": "string",
55
+ "enum": ["text"],
56
+ },
57
+ "text": {"type": "string"},
58
+ },
59
+ "required": ["type", "text"],
60
+ "additionalProperties": False,
61
+ },
62
+ {
63
+ "type": "object",
64
+ "properties": {
65
+ "type": {
66
+ "type": "string",
67
+ "enum": ["image_url"],
68
+ },
69
+ "image_url": {
70
+ "type": "object",
71
+ "properties": {
72
+ "url": {"type": "string"}
73
+ },
74
+ "required": ["url"],
75
+ "additionalProperties": False,
76
+ },
77
+ },
78
+ "required": ["type", "image_url"],
79
+ "additionalProperties": False,
80
+ },
81
+ ]
82
+ },
83
+ },
84
+ ]
85
+ },
86
+ },
87
+ "additionalProperties": False,
88
+ },
89
+ },
90
+ "generateReply": {
91
+ "name": "Generate reply",
92
+ "type": "Boolean",
93
+ "default": "yes",
94
+ "desc": "If set to 'yes', the block will generate a reply from the model after adding the message. If set to 'no', it will only add the message to the conversation.",
95
+ "validator": {
96
+ "type": "boolean",
97
+ },
98
+ },
99
+ "initModelId": {
100
+ "name": "Initial model",
101
+ "type": "Model Id",
102
+ "default": DEFAULT_MODEL,
103
+ },
104
+ "initTemperature": {
105
+ "name": "Initial temperature",
106
+ "type": "Number",
107
+ "default": "0.7",
108
+ "validator": {
109
+ "type": "number",
110
+ "minimum": 0,
111
+ "maximum": 2,
112
+ },
113
+ },
114
+ "initMaxTokens": {
115
+ "name": "Initial max tokens",
116
+ "type": "Number",
117
+ "default": "1024",
118
+ "validator": {
119
+ "type": "number",
120
+ "minimum": 1,
121
+ "maximum": 16384,
122
+ },
123
+ },
124
+ "useStreaming": {
125
+ "name": "Use streaming",
126
+ "type": "Boolean",
127
+ "default": "yes",
128
+ "desc": "If set to 'yes', the block will stream the reply as it is generated. If set to 'no', it will wait for the entire reply to be generated before returning.",
129
+ "validator": {
130
+ "type": "boolean",
131
+ },
132
+ },
133
+ "tools": {
134
+ "name": "Tools",
135
+ "type": "Tools",
136
+ "default": "{}",
137
+ "init": "",
138
+ "category": "Tools",
139
+ },
140
+ },
141
+ "outs": {
142
+ "tools": {
143
+ "name": "Tools",
144
+ "field": "tools",
145
+ "description": "Run associated tools.",
146
+ "style": "dynamic",
147
+ },
148
+ "success": {
149
+ "name": "Success",
150
+ "description": "The reply was generated successfully.",
151
+ "style": "success",
152
+ },
153
+ "error": {
154
+ "name": "Error",
155
+ "description": "There was an error generating the reply.",
156
+ "style": "error",
157
+ },
158
+ },
159
+ },
160
+ ),
161
+ )
162
+
163
+ def _make_callable(self, tool_name: str):
164
+ def callable(**args):
165
+ expanded_execution_environment = self.execution_environment | args
166
+ return_value = self.runner.run_branch(
167
+ self.component.id,
168
+ f"tools_{tool_name}",
169
+ expanded_execution_environment,
170
+ f"Blueprint branch execution (chat tool {tool_name})",
171
+ )
172
+
173
+ if return_value is None:
174
+ self.outcome = "error"
175
+ raise ValueError(
176
+ f'No value has been returned for the outcome branch "{tool_name}". Use the block "Return value" to specify one.'
177
+ )
178
+
179
+ return return_value
180
+
181
+ return callable
182
+
183
+ def run(self):
184
+ try:
185
+ import writer.ai
186
+
187
+ conversation_state_element = self._get_field("conversationStateElement", required=True)
188
+ message = self._get_field("message", as_json=True)
189
+ generate_reply = self._get_field("generateReply", False, "yes") == "yes"
190
+
191
+ system_prompt = self._get_field("systemPrompt", False, default_field_value=None)
192
+ init_model_id = self._get_field("initModelId", False, default_field_value=DEFAULT_MODEL)
193
+ try:
194
+ init_temperature = float(self._get_field("initTemperature", False, "0.7"))
195
+ init_max_tokens = int(self._get_field("initMaxTokens", False, "1024"))
196
+ except ValueError as e:
197
+ raise WriterConfigurationError(f"Invalid numeric value in configuration: {e}")
198
+ use_streaming = self._get_field("useStreaming", False, "yes") == "yes"
199
+ tools_raw = self._get_field("tools", True)
200
+ tools = []
201
+
202
+ conversation = self.evaluator.evaluate_expression(
203
+ conversation_state_element, self.instance_path, self.execution_environment
204
+ )
205
+
206
+ if conversation is None:
207
+ config = {
208
+ "temperature": init_temperature,
209
+ "model": init_model_id,
210
+ "max_tokens": init_max_tokens,
211
+ }
212
+ conversation = writer.ai.Conversation(
213
+ prompt_or_history=system_prompt, config=config
214
+ )
215
+ self._set_state(conversation_state_element, conversation)
216
+ elif not isinstance(conversation, writer.ai.Conversation):
217
+ raise WriterConfigurationError(
218
+ "The state element specified doesn't contain a Conversation."
219
+ )
220
+
221
+ if message not in (None, {}, ""):
222
+ writer.ai.Conversation.validate_message(message)
223
+ conversation += message
224
+ self._set_state(conversation_state_element, conversation)
225
+
226
+ if not generate_reply:
227
+ # Fast exit if no reply generation is needed
228
+ self.result = ""
229
+ self.outcome = "success"
230
+ return
231
+
232
+ for tool_name, tool_raw in tools_raw.items():
233
+ tool_type = tool_raw.get("type")
234
+ tool = None
235
+ if tool_type == "function":
236
+ tool = writer.ai.FunctionTool(
237
+ type="function",
238
+ name=tool_name,
239
+ description=tool_raw.get("description"),
240
+ callable=self._make_callable(tool_name),
241
+ parameters=tool_raw.get("parameters"),
242
+ )
243
+ elif tool_type == "graph":
244
+ tool = writer.ai.GraphTool(
245
+ type="graph",
246
+ graph_ids=tool_raw.get("graph_ids"),
247
+ subqueries=False,
248
+ description=tool_name,
249
+ )
250
+ elif tool_type == "web_search":
251
+ tool = writer.ai.WebSearchTool(
252
+ type="web_search",
253
+ include_domains=tool_raw.get("include_domains"),
254
+ exclude_domains=tool_raw.get("exclude_domains"),
255
+ include_raw_content=tool_raw.get("include_raw_content"),
256
+ )
257
+ else:
258
+ continue
259
+ tools.append(tool)
260
+
261
+ msg = ""
262
+ if not use_streaming:
263
+ reply = conversation.complete(tools=tools)
264
+ msg = reply.get("content") or ""
265
+ conversation += reply
266
+ self._set_state(conversation_state_element, conversation)
267
+ else:
268
+ for chunk in conversation.stream_complete(tools=tools):
269
+ if chunk.get("content") is None:
270
+ chunk["content"] = ""
271
+ msg += chunk.get("content")
272
+ conversation += chunk
273
+ self._set_state(conversation_state_element, conversation)
274
+ self.result = msg
275
+ self._set_state(conversation_state_element, conversation)
276
+ self.outcome = "success"
277
+ except BaseException as e:
278
+ self.outcome = "error"
279
+ raise e