langflow-base-nightly 0.5.0.dev33__py3-none-any.whl → 0.5.0.dev35__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.
- langflow/alembic/versions/1cb603706752_modify_uniqueness_constraint_on_file_.py +279 -0
- langflow/api/v1/endpoints.py +1 -1
- langflow/base/composio/composio_base.py +1092 -126
- langflow/components/agents/mcp_component.py +21 -4
- langflow/components/composio/__init__.py +24 -0
- langflow/components/composio/composio_api.py +116 -136
- langflow/components/composio/dropbox_compnent.py +11 -0
- langflow/components/composio/github_composio.py +1 -639
- langflow/components/composio/gmail_composio.py +26 -394
- langflow/components/composio/googlecalendar_composio.py +2 -778
- langflow/components/composio/googlemeet_composio.py +11 -0
- langflow/components/composio/googletasks_composio.py +8 -0
- langflow/components/composio/linear_composio.py +11 -0
- langflow/components/composio/outlook_composio.py +1 -755
- langflow/components/composio/reddit_composio.py +11 -0
- langflow/components/composio/slack_composio.py +1 -576
- langflow/components/composio/slackbot_composio.py +11 -0
- langflow/components/composio/supabase_composio.py +11 -0
- langflow/components/composio/todoist_composio.py +11 -0
- langflow/components/composio/youtube_composio.py +11 -0
- langflow/components/data/kb_ingest.py +15 -16
- langflow/components/processing/save_file.py +31 -4
- langflow/custom/utils.py +30 -7
- langflow/frontend/assets/{SlackIcon-Bikuxo8x.js → SlackIcon-B260Qg_R.js} +1 -1
- langflow/frontend/assets/{Wikipedia-B6aCFf5-.js → Wikipedia-BB2mbgyd.js} +1 -1
- langflow/frontend/assets/{Wolfram-CekL_M-a.js → Wolfram-DytXC9hF.js} +1 -1
- langflow/frontend/assets/{index-D1RgjMON.js → index-3TJWUdmx.js} +1 -1
- langflow/frontend/assets/{index-B4xLpgbM.js → index-3qMh9x6K.js} +1 -1
- langflow/frontend/assets/{index-DEuXrfXH.js → index-3uOAA_XX.js} +1 -1
- langflow/frontend/assets/{index-DTJX3yQa.js → index-4eRtaV45.js} +1 -1
- langflow/frontend/assets/index-7xXgqu09.js +1 -0
- langflow/frontend/assets/{index-BRNhftot.js → index-AY5Dm2mG.js} +1 -1
- langflow/frontend/assets/{index-4Tl3Nxdo.js → index-AlJ7td-D.js} +1 -1
- langflow/frontend/assets/{index-D2nHdRne.js → index-B-c82Fnu.js} +1 -1
- langflow/frontend/assets/{index-C3RZz8WE.js → index-B2ggrBuR.js} +1 -1
- langflow/frontend/assets/{index-in188l0A.js → index-B536IPXH.js} +1 -1
- langflow/frontend/assets/{index-CP0tFKwN.js → index-B5ed-sAv.js} +1 -1
- langflow/frontend/assets/{index-CAzSTGAM.js → index-B8TlNgn-.js} +1 -1
- langflow/frontend/assets/{index-09CVJwsY.js → index-B8y58M9b.js} +1 -1
- langflow/frontend/assets/{index-B9uOBe6Y.js → index-B9Mo3ndZ.js} +1 -1
- langflow/frontend/assets/{index-DAJafn16.js → index-BCK-ZyIh.js} +1 -1
- langflow/frontend/assets/{index-Cy-ZEfWh.js → index-BEDxAk3N.js} +1 -1
- langflow/frontend/assets/{index-DbmqjLy6.js → index-BEKoRwsX.js} +1 -1
- langflow/frontend/assets/{index-BcqeL_f4.js → index-BIkqesA-.js} +1 -1
- langflow/frontend/assets/{index-7x3wNZ-4.js → index-BJrY2Fiu.js} +1 -1
- langflow/frontend/assets/{index-Iamzh9ZT.js → index-BKvKC-12.js} +1 -1
- langflow/frontend/assets/{index-COqjpsdy.js → index-BLROcaSz.js} +1 -1
- langflow/frontend/assets/{index-BRwkzs92.js → index-BNbWMmAV.js} +1 -1
- langflow/frontend/assets/{index-C_UkF-RJ.js → index-BOEf7-ty.js} +1 -1
- langflow/frontend/assets/index-BOYTBrh9.js +1 -0
- langflow/frontend/assets/{index-DDcpxWU4.js → index-BQB-iDYl.js} +1 -1
- langflow/frontend/assets/{index-Crq_yhkG.js → index-BRWNIt9F.js} +1 -1
- langflow/frontend/assets/{index-DmaQAn3K.js → index-BVHvIhT5.js} +1 -1
- langflow/frontend/assets/{index-Cs_jt3dj.js → index-BVtf6m9S.js} +1 -1
- langflow/frontend/assets/{index-T2jJOG85.js → index-BWq9GTzt.js} +1 -1
- langflow/frontend/assets/{index-Dz0r9Idb.js → index-BXMhmvTj.js} +1 -1
- langflow/frontend/assets/{index-eJwu5YEi.js → index-Ba3RTMXI.js} +1 -1
- langflow/frontend/assets/{index-xVx59Op-.js → index-Baka5dKE.js} +1 -1
- langflow/frontend/assets/{index-DnusMCK1.js → index-BbsND1Qg.js} +1 -1
- langflow/frontend/assets/index-BcgB3rXH.js +1 -0
- langflow/frontend/assets/{index-CmiRgF_-.js → index-BdIWbCEL.js} +1 -1
- langflow/frontend/assets/{index-BllNr21U.js → index-BdYgKk1d.js} +1 -1
- langflow/frontend/assets/{index-BIKbxmIh.js → index-BeNby7qF.js} +1 -1
- langflow/frontend/assets/{index-CUe1ivTn.js → index-BejHxU5W.js} +1 -1
- langflow/frontend/assets/{index-CVphnxXi.js → index-Bisa4IQF.js} +1 -1
- langflow/frontend/assets/{index-Cr2oy5K2.js → index-BjENqyKe.js} +1 -1
- langflow/frontend/assets/{index-CEn_71Wk.js → index-BlBl2tvQ.js} +1 -1
- langflow/frontend/assets/{index-DOb9c2bf.js → index-BnLT29qW.js} +1 -1
- langflow/frontend/assets/{index-BRizlHaN.js → index-BqUeOc7Y.js} +1 -1
- langflow/frontend/assets/{index-D7nFs6oq.js → index-BsBWP-Dh.js} +1 -1
- langflow/frontend/assets/{index-BlRTHXW5.js → index-BtJ2o21k.js} +1 -1
- langflow/frontend/assets/{index-AOX7bbjJ.js → index-BxWXWRmZ.js} +1 -1
- langflow/frontend/assets/{index-B20KmxhS.js → index-BxkZkBgQ.js} +1 -1
- langflow/frontend/assets/{index-DoFlaGDx.js → index-Bxml6wXu.js} +1 -1
- langflow/frontend/assets/{index-B9KRIJFi.js → index-ByFXr9Iq.js} +1 -1
- langflow/frontend/assets/{index-CY6LUi4V.js → index-C2Xd7UkR.js} +1 -1
- langflow/frontend/assets/index-C76aBV_h.js +1 -0
- langflow/frontend/assets/{index-9gkURvG2.js → index-C7V5U9yH.js} +1 -1
- langflow/frontend/assets/{index-BDmbsLY2.js → index-C7x9R_Yo.js} +1 -1
- langflow/frontend/assets/{index-DI0zAExi.js → index-C8KD3LPb.js} +1 -1
- langflow/frontend/assets/{index-DzDNhMMW.js → index-C9N80hP8.js} +1 -1
- langflow/frontend/assets/{index-6GWpsedd.js → index-CDFLVFB4.js} +1 -1
- langflow/frontend/assets/{index-pkOi9P45.js → index-CF4dtI6S.js} +1 -1
- langflow/frontend/assets/{index-CdwjD4IX.js → index-CG7cp0nD.js} +1 -1
- langflow/frontend/assets/{index-J0pvFqLk.js → index-CHFO5O4g.js} +1 -1
- langflow/frontend/assets/{index-5G402gB8.js → index-CJwYfDBz.js} +1 -1
- langflow/frontend/assets/{index-BzCjyHto.js → index-CMGZGIx_.js} +1 -1
- langflow/frontend/assets/{index-Bm7a2vMS.js → index-COL0eiWI.js} +1 -1
- langflow/frontend/assets/{index-JHCxbvlW.js → index-CWWo2zOA.js} +1 -1
- langflow/frontend/assets/{index-C7wDSVVH.js → index-C_1RBTul.js} +1 -1
- langflow/frontend/assets/{index-BIjUtp6d.js → index-Ccb5B8zG.js} +1 -1
- langflow/frontend/assets/{index-yIh6-LZT.js → index-Cd5zuUUK.js} +1 -1
- langflow/frontend/assets/{index-CPIdMJkX.js → index-CkQ-bJ4G.js} +1 -1
- langflow/frontend/assets/{index-TRyDa01A.js → index-CkSzjCqM.js} +1 -1
- langflow/frontend/assets/{index-CSRizl2S.js → index-CoUlHbtg.js} +1 -1
- langflow/frontend/assets/index-Cpgkb0Q3.js +1 -0
- langflow/frontend/assets/{index-Cp7Pmn03.js → index-CqDUqHfd.js} +1 -1
- langflow/frontend/assets/{index-CGVDXKtN.js → index-Ct9_T9ox.js} +1 -1
- langflow/frontend/assets/{index-BwlYjc56.js → index-CvQ0w8Pj.js} +1 -1
- langflow/frontend/assets/{index-DkJCCraf.js → index-CwIxqYlT.js} +1 -1
- langflow/frontend/assets/{index-Bgd7yLoW.js → index-Cx__T92e.js} +1 -1
- langflow/frontend/assets/{index-RveG4dl9.js → index-D-zkHcob.js} +1 -1
- langflow/frontend/assets/{index-DVV_etfW.js → index-D0HmkH0H.js} +1 -1
- langflow/frontend/assets/{index-CglSqvB5.js → index-D0s9f6Re.js} +1 -1
- langflow/frontend/assets/{index-J98sU-1p.js → index-D5PeCofu.js} +1 -1
- langflow/frontend/assets/{index-BJIsQS8D.js → index-D87Zw62M.js} +1 -1
- langflow/frontend/assets/{index-FYcoJPMP.js → index-D9eflZfP.js} +1 -1
- langflow/frontend/assets/{index-DJs6FoYC.js → index-DDNNv4C0.js} +1 -1
- langflow/frontend/assets/index-DHlEwAxb.js +1 -0
- langflow/frontend/assets/{index-DqDQk0Cu.js → index-DIqSyDVO.js} +1 -1
- langflow/frontend/assets/{index-DOI0ceS-.js → index-DK8vNpXK.js} +1 -1
- langflow/frontend/assets/{index-D29n5mus.js → index-DKEXZFUO.js} +1 -1
- langflow/frontend/assets/{index-dfaj9-hY.js → index-DPX6X_bw.js} +1 -1
- langflow/frontend/assets/{index-CgbINWS8.js → index-DS1EgA10.js} +1 -1
- langflow/frontend/assets/{index-C69gdJqw.js → index-DS9I4y48.js} +1 -1
- langflow/frontend/assets/{index-B2EmwqKj.js → index-DWkMJnbd.js} +1 -1
- langflow/frontend/assets/{index-CIYzjH2y.js → index-DWr_zPkx.js} +1 -1
- langflow/frontend/assets/{index-D-HTZ68O.js → index-DX7XsAcx.js} +1 -1
- langflow/frontend/assets/{index-Cq30cQcP.js → index-DZzbmg3J.js} +1 -1
- langflow/frontend/assets/{index-BZCt_UnJ.js → index-DasrI03Y.js} +1 -1
- langflow/frontend/assets/index-DdzVmJHE.js +1 -0
- langflow/frontend/assets/{index-DmvjdU1N.js → index-DhzEUXfr.js} +1 -1
- langflow/frontend/assets/{index-B_ytx_iA.js → index-DpJiH-Rk.js} +1 -1
- langflow/frontend/assets/{index-Cyk3aCmP.js → index-DpQKtcXu.js} +1 -1
- langflow/frontend/assets/{index-DrvRK4_i.js → index-Dpz3oBf5.js} +1 -1
- langflow/frontend/assets/{index-DF0oWRdd.js → index-DqSH4x-R.js} +1 -1
- langflow/frontend/assets/{index-DX_InNVT.js → index-DtJyCbzF.js} +1 -1
- langflow/frontend/assets/{index-B4AtFbkN.js → index-Du9aJK7m.js} +1 -1
- langflow/frontend/assets/{index-qXcoVIRo.js → index-DuAeoC-H.js} +1 -1
- langflow/frontend/assets/{index-D7Vx6mgS.js → index-DxIs8VSp.js} +1 -1
- langflow/frontend/assets/{index-U7J1YiWE.js → index-DyJDHm2D.js} +1 -1
- langflow/frontend/assets/{index-1MEYR1La.js → index-DzeIsaBm.js} +1 -1
- langflow/frontend/assets/{index-Cbwk3f-p.js → index-DztLFiip.js} +1 -1
- langflow/frontend/assets/{index-C_2G2ZqJ.js → index-GODbXlHC.js} +1 -1
- langflow/frontend/assets/{index-2vQdFIK_.js → index-G_U_kPAd.js} +1 -1
- langflow/frontend/assets/{index-DS4F_Phe.js → index-IFGgPiye.js} +1 -1
- langflow/frontend/assets/{index-5hW8VleF.js → index-LrMzDsq9.js} +1 -1
- langflow/frontend/assets/{index-L7FKc9QN.js → index-R7q8cAek.js} +1 -1
- langflow/frontend/assets/{index-BRE8A4Q_.js → index-Uq2ij_SS.js} +1 -1
- langflow/frontend/assets/{index-Bn4HAVDG.js → index-VHmUHUUU.js} +1 -1
- langflow/frontend/assets/{index-VO-pk-Hg.js → index-VZnN0P6C.js} +1 -1
- langflow/frontend/assets/{index-Dy7ehgeV.js → index-VcXZzovW.js} +1 -1
- langflow/frontend/assets/{index-DNS4La1f.js → index-Ym6gz0T6.js} +1 -1
- langflow/frontend/assets/{index-UI2ws3qp.js → index-ci4XHjbJ.js} +176 -176
- langflow/frontend/assets/{index-DlMAYATX.js → index-dkS0ek2S.js} +1 -1
- langflow/frontend/assets/{index-Dc0p1Oxl.js → index-hOkEW3JP.js} +1 -1
- langflow/frontend/assets/{index-KnS52ylc.js → index-js8ceOaP.js} +1 -1
- langflow/frontend/assets/{index-DtCsjX48.js → index-lKEJpUsF.js} +1 -1
- langflow/frontend/assets/{index-BO4fl1uU.js → index-mBjJYD9q.js} +1 -1
- langflow/frontend/assets/{index-C_K6Tof7.js → index-r1LZg-PY.js} +1 -1
- langflow/frontend/assets/index-rcdQpNcU.js +1 -0
- langflow/frontend/assets/{index-_3qag0I4.js → index-sS6XLk3j.js} +1 -1
- langflow/frontend/assets/{index-C6P0vvSP.js → index-tOy_uloT.js} +1 -1
- langflow/frontend/assets/lazyIconImports-Bh1TFfvH.js +2 -0
- langflow/frontend/assets/{use-post-add-user-Bt6vZvvT.js → use-post-add-user-HN0rRnhv.js} +1 -1
- langflow/frontend/index.html +1 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +2 -2
- langflow/initial_setup/starter_projects/News Aggregator.json +19 -2
- langflow/initial_setup/starter_projects/Nvidia Remix.json +19 -2
- langflow/interface/initialize/loading.py +3 -1
- langflow/main.py +19 -2
- langflow/services/database/models/file/model.py +4 -2
- langflow/services/database/service.py +3 -1
- langflow/services/telemetry/schema.py +7 -0
- langflow/services/telemetry/service.py +25 -0
- langflow/services/tracing/service.py +14 -4
- {langflow_base_nightly-0.5.0.dev33.dist-info → langflow_base_nightly-0.5.0.dev35.dist-info}/METADATA +1 -1
- {langflow_base_nightly-0.5.0.dev33.dist-info → langflow_base_nightly-0.5.0.dev35.dist-info}/RECORD +170 -152
- langflow/frontend/assets/lazyIconImports-kvf_Kak2.js +0 -2
- {langflow_base_nightly-0.5.0.dev33.dist-info → langflow_base_nightly-0.5.0.dev35.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev33.dist-info → langflow_base_nightly-0.5.0.dev35.dist-info}/entry_points.txt +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,r as e}from"./index-
|
|
1
|
+
import{j as r,r as e}from"./index-ci4XHjbJ.js";const s=o=>r.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 18 18",fill:"none",...o,children:[r.jsx("path",{d:"M15.75 15.75L12.525 12.525L15.75 15.75Z",fill:"currentColor"}),r.jsx("path",{d:"M3.75 15H5.25H6.75",fill:"currentColor"}),r.jsx("path",{d:"M5.25 9.75V15V9.75Z",fill:"currentColor"}),r.jsx("path",{d:"M8.25 11.25V9.75H5.25H2.25V11.25",fill:"currentColor"}),r.jsx("path",{d:"M15.75 15.75L12.525 12.525M2.43903 6.75C3.1051 4.16216 5.45425 2.25 8.25001 2.25C11.5637 2.25 14.25 4.93629 14.25 8.25C14.25 11.0458 12.3378 13.3949 9.75001 14.061M3.75 15H5.25M6.75 15H5.25M5.25 9.75V15M5.25 9.75H8.25V11.25M5.25 9.75H2.25V11.25",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"})]}),n=e.forwardRef((o,t)=>r.jsx(s,{ref:t,...o}));export{n as SearchLexicalIcon};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as h,r as o}from"./index-
|
|
1
|
+
import{j as h,r as o}from"./index-ci4XHjbJ.js";const r=s=>h.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",height:"2222",viewBox:"0 0 9 8",width:"2500",...s,children:[h.jsx("path",{d:"m0 7h1v1h-1z",fill:"#f00"}),h.jsx("path",{d:"m0 0h1v7h-1zm2 0h1v8h-1zm2 0h1v8h-1zm2 0h1v8h-1zm2 3.25h1v1.5h-1z",fill:"#fc0"})]}),i=o.forwardRef((s,t)=>h.jsx(r,{ref:t,...s}));export{i as ClickhouseIcon};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,r as e}from"./index-
|
|
1
|
+
import{j as r,r as e}from"./index-ci4XHjbJ.js";const s=o=>r.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 18 18",fill:"none",...o,children:[r.jsx("path",{d:"M15.75 15.75L12.525 12.525L15.75 15.75Z",fill:"currentColor"}),r.jsx("path",{d:"M15.75 15.75L12.525 12.525M2.43903 6.75C3.1051 4.16216 5.45425 2.25 8.25001 2.25C11.5637 2.25 14.25 4.93629 14.25 8.25C14.25 11.0458 12.3378 13.3949 9.75001 14.061M2.25 14.25V11.25M2.25 14.25H5.25M2.25 14.25L7.5 9",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"})]}),c=e.forwardRef((o,t)=>r.jsx(s,{ref:t,...o}));export{c as SearchVectorIcon};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as t,r as l}from"./index-
|
|
1
|
+
import{j as t,r as l}from"./index-ci4XHjbJ.js";const o=s=>t.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",width:"1em",height:"1em",...s,children:[t.jsxs("defs",{children:[t.jsxs("linearGradient",{id:"Searx_logo_svg__b",children:[t.jsx("stop",{offset:0,style:{stopColor:"#fff",stopOpacity:1}}),t.jsx("stop",{offset:1,style:{stopColor:"#fff",stopOpacity:0}})]}),t.jsxs("linearGradient",{id:"Searx_logo_svg__a",children:[t.jsx("stop",{offset:0,style:{stopColor:"#a9a9a9",stopOpacity:1}}),t.jsx("stop",{offset:1,style:{stopColor:"#000",stopOpacity:1}})]}),t.jsx("linearGradient",{xlinkHref:"#Searx_logo_svg__b",id:"Searx_logo_svg__d",x1:120.689,x2:120.689,y1:239.618,y2:602.175,gradientUnits:"userSpaceOnUse"}),t.jsx("radialGradient",{xlinkHref:"#Searx_logo_svg__a",id:"Searx_logo_svg__c",cx:294.459,cy:208.38,r:107.581,fx:294.459,fy:208.38,gradientUnits:"userSpaceOnUse"}),t.jsx("filter",{id:"Searx_logo_svg__e",width:1.26,height:1.294,x:-.13,y:-.147,colorInterpolationFilters:"sRGB",children:t.jsx("feGaussianBlur",{stdDeviation:6.476})})]}),t.jsxs("g",{transform:"translate(-61.72 -34.87)",children:[t.jsx("path",{d:"M70.523 34.87c-7.12 15.244-10.178 31.78-8.225 48.815 5.016 43.774 41.675 79.325 91.536 95.163-6.626-22.407-5.341-44.936 2.64-65.844-47.738-14.183-81.646-42.809-85.95-78.133zM303.779 36.214c7.12 15.243 10.178 31.78 8.225 48.815-5.016 43.774-41.675 79.324-91.536 95.163 6.626-22.408 5.341-44.937-2.64-65.845 47.738-14.182 81.646-42.808 85.95-78.133z",style:{fill:"#000",fillOpacity:1,fillRule:"nonzero",stroke:"none"}}),t.jsx("path",{d:"M-5.09 259.06h18.416c6.22 0 11.228 16.683 11.228 37.404v172.837c0 20.722-5.007 37.404-11.228 37.404H-5.09c-6.22 0-11.228-16.682-11.228-37.404V296.464c0-20.721 5.008-37.403 11.228-37.403z",style:{fill:"#000",fillOpacity:1,fillRule:"nonzero",stroke:"none"},transform:"rotate(-49.03)"}),t.jsx("path",{d:"M402.04 208.38a107.581 107.581 0 1 1-215.162 0 107.581 107.581 0 1 1 215.163 0z",style:{fill:"url(#Searx_logo_svg__c)",fillOpacity:1,fillRule:"nonzero",stroke:"none"},transform:"translate(-107.076 -60.61)"}),t.jsx("path",{d:"M233.345 299.293a101.52 101.52 0 1 1-203.04 0 101.52 101.52 0 1 1 203.04 0z",style:{fill:"url(#Searx_logo_svg__d)",fillOpacity:1,fillRule:"nonzero",stroke:"none"},transform:"matrix(.76866 0 0 .76866 85.803 -82.536)"}),t.jsx("path",{d:"M210.617 156.357a27.274 27.274 0 1 1-54.548 0 27.274 27.274 0 1 1 54.548 0z",style:{fill:"#1a1a1a",fillOpacity:1,fillRule:"nonzero",stroke:"none"},transform:"translate(5 -7.143)"}),t.jsx("path",{d:"M203.546 203.329a5.556 5.556 0 1 1-11.112 0 5.556 5.556 0 1 1 11.112 0z",style:{fill:"#fff",fillOpacity:1,fillRule:"nonzero",stroke:"none"},transform:"translate(1.485 -63.565)"}),t.jsx("rect",{width:2.239,height:159.438,x:19.526,y:337.84,rx:2.867,ry:9.001,style:{fill:"#fff",fillOpacity:.82211531,fillRule:"nonzero",stroke:"none",filter:"url(#Searx_logo_svg__e)"},transform:"matrix(.74467 -.84318 .84318 .74467 -35.543 -26.35)"})]})]}),a=l.forwardRef((s,e)=>t.jsx(o,{ref:e,...s}));export{a as SearxIcon};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as C,r}from"./index-UI2ws3qp.js";const s=t=>C.jsxs("svg",{width:"189",height:"267",viewBox:"0 0 189 267",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t,children:[C.jsx("path",{d:"M0 0 C3.06321791 1.91292239 5.45079154 4.4596893 8 7 C9.8508184 8.67038411 11.70529484 10.33671987 13.5625 12 C19.07787808 17.02522109 24.35027634 22.28150765 29.57250977 27.609375 C32.5939679 30.67417964 35.65891534 33.61406295 38.921875 36.421875 C44.10950064 40.89742443 48.84688739 45.79856111 53.64453125 50.68359375 C57.66464894 54.7478078 61.77436223 58.6065472 66.10742188 62.33447266 C69.03335456 64.90938401 71.7678273 67.66002342 74.5 70.4375 C75.03625 70.97826172 75.5725 71.51902344 76.125 72.07617188 C77.41904036 73.38176617 78.70988174 74.69052996 80 76 C85.1426468 72.38920544 89.62711213 68.50001906 94.0078125 64 C96.51837733 61.47958982 99.17224396 59.16742137 101.8671875 56.84765625 C104.27376821 54.7628345 106.63764945 52.63478467 109 50.5 C112.61267904 47.23977745 116.25488991 44.01856435 119.92578125 40.82421875 C123.18551949 37.95736798 126.39410784 35.03411516 129.60546875 32.11328125 C137.34815391 25.28001424 137.34815391 25.28001424 142.94140625 24.8359375 C147.68501605 25.2139861 150.92781614 27.76028741 154 31.3125 C155.40950462 35.10054368 155.12155084 37.10755883 154 41 C152.30245093 43.92391532 150.18101072 46.42400308 148 49 C147.20078125 49.9590625 146.4015625 50.918125 145.578125 51.90625 C141.73758129 56.49222765 137.83764358 61.02721854 133.9375 65.5625 C132.91664207 66.74997885 131.89580867 67.9374788 130.875 69.125 C130.37033203 69.71144287 129.86566406 70.29788574 129.34570312 70.90209961 C125.56250432 75.31070693 121.89219438 79.80216286 118.25 84.328125 C116.60361094 86.28321201 114.94893747 88.13940053 113.1875 89.984375 C112.71908691 90.47848877 112.25067383 90.97260254 111.76806641 91.48168945 C110.44753599 92.86169697 109.11091734 94.22625694 107.7734375 95.58984375 C105.75436851 97.76886089 105.75436851 97.76886089 106.20043945 99.96386719 C107.12781134 102.32547986 108.10653192 103.33925864 110.01953125 104.98828125 C110.62990234 105.53033203 111.24027344 106.07238281 111.86914062 106.63085938 C113.15221419 107.7411371 114.43605365 108.85053043 115.72070312 109.95898438 C120.98419941 114.63703406 125.20355106 119.50756986 126 126.8125 C126.39670106 133.89951089 124.33863378 139.25535341 119.75 144.640625 C115.09293989 149.38287524 110.12237597 153.76847203 105 158 C106.68194618 162.08046114 109.55174447 165.11242756 112.4375 168.375 C116.6887433 173.24873759 120.79185883 178.19789081 124.75 183.3125 C128.36095871 187.96976162 132.0872841 192.4431192 136.05078125 196.80859375 C139.0059196 200.13090359 141.78077766 203.59472771 144.58203125 207.046875 C147.18689495 210.22825942 149.83680038 213.36750392 152.5 216.5 C174.41458074 242.31754315 174.41458074 242.31754315 174.359375 249.89453125 C173.72418186 253.61593453 171.66020984 255.40312849 169 258 C165.42531796 259.78734102 161.88841712 259.7132973 158 259 C154.81886665 257.21398234 152.51475627 254.61583168 150 252 C148.16575643 250.15670764 146.32431564 248.32075561 144.48291016 246.48461914 C143.19316842 245.19376584 141.90867844 243.89763652 140.63037109 242.59545898 C137.57807883 239.49762816 134.49130224 236.51694439 131.1875 233.6875 C125.045697 228.39160973 119.46681442 222.50937991 113.77734375 216.73828125 C109.32800024 212.25007884 104.84027886 207.92397219 100.04101562 203.81396484 C95.84677314 200.08630675 91.9465789 196.04848406 88 192.0625 C87.12988281 191.18787109 86.25976562 190.31324219 85.36328125 189.41210938 C83.23986451 187.27702551 81.11883622 185.13962795 79 183 C66.53706738 193.64275245 54.66097258 204.87551527 42.74902344 216.12597656 C40.58433793 218.16908254 38.41736707 220.2097394 36.25 222.25 C35.59499512 222.86955566 34.93999023 223.48911133 34.26513672 224.12744141 C24.96226945 232.87780705 24.96226945 232.87780705 20.0625 233.5 C15.83463627 233.28421111 13.25895481 231.71579568 10 229 C7.97726442 225.96589663 7.68473731 225.14629 7.625 221.6875 C7.59664062 220.94886719 7.56828125 220.21023437 7.5390625 219.44921875 C8.70198438 213.26996437 14.26594664 208.07700408 18.1875 203.3125 C19.05568359 202.25095703 19.05568359 202.25095703 19.94140625 201.16796875 C21.62520208 199.10999607 23.31228961 197.05476264 25 195 C26.50026653 193.16688477 28.00030305 191.33358124 29.5 189.5 C30.19738281 188.64792969 30.89476562 187.79585937 31.61328125 186.91796875 C32.40089844 185.95503906 33.18851563 184.99210938 34 184 C34.51095215 183.37561035 35.0219043 182.7512207 35.54833984 182.10791016 C37.2631234 180.01084685 38.97549716 177.9118338 40.6875 175.8125 C41.22246094 175.15894531 41.75742187 174.50539062 42.30859375 173.83203125 C45.99323207 169.30831688 49.53193307 164.69163386 53 160 C51.17188813 155.96414496 48.49925756 153.5927788 45.1875 150.75 C39.31894548 145.55520052 33.77936878 140.06794267 32.7265625 131.87109375 C32.43131564 124.7965247 33.71729015 119.69441791 38 114 C42.70916137 109.02981655 47.83299974 104.48552008 53 100 C50.45314999 96.07956795 47.8040917 92.4143982 44.8125 88.8125 C44.0184375 87.85214844 43.224375 86.89179687 42.40625 85.90234375 C41.6121875 84.94457031 40.818125 83.98679687 40 83 C38.60288993 81.29271065 37.20705815 79.58437445 35.8125 77.875 C34.20900796 75.9161092 32.60495761 73.95768918 31 72 C30.47744629 71.36255859 29.95489258 70.72511719 29.41650391 70.06835938 C23.43211199 62.77290531 17.4398864 55.48851816 11.3125 48.3125 C7.07791917 43.34685767 3.01358082 38.26531056 -0.99438477 33.11547852 C-4.68613817 28.37504538 -8.47899503 23.7298921 -12.3203125 19.109375 C-14.95707497 15.7980919 -15.39046315 13.37231751 -15.359375 9.10546875 C-14.72418186 5.38406547 -12.66020984 3.59687151 -10 1 C-6.68887676 -0.65556162 -3.55295081 -0.73967125 0 0 Z",fill:"#AF1A19",transform:"translate(15,4)"}),C.jsx("path",{d:"M0 0 C1.77292382 2.0010015 3.35426839 3.98107573 4.9375 6.125 C5.92044262 7.41744879 6.90621055 8.70775285 7.89453125 9.99609375 C8.65950928 10.99358643 8.65950928 10.99358643 9.43994141 12.01123047 C11.90511947 15.15385026 14.50707228 18.17191237 17.125 21.1875 C22.19048007 27.04131904 27.11677661 32.99286012 32 39 C39.38114532 48.0518617 46.83456186 57.0208033 54.51757812 65.81835938 C58.16253268 70.00264136 61.68299856 74.26425914 65.12109375 78.62109375 C70.8953038 85.93189192 76.88178655 93.0648837 82.91333008 100.16333008 C86.56128527 104.4630923 90.13418611 108.82012196 93.69140625 113.1953125 C95.78056796 115.73341421 97.90125206 118.23888412 100.03759766 120.73706055 C104.35967315 125.7940547 108.56718347 130.9152143 112.625 136.1875 C113.05095459 136.74034668 113.47690918 137.29319336 113.91577148 137.86279297 C117.10891324 142.05062764 118.39874896 144.49045563 118.359375 149.89453125 C117.72418186 153.61593453 115.66020984 155.40312849 113 158 C109.42531796 159.78734102 105.88841712 159.7132973 102 159 C98.81886665 157.21398234 96.51475627 154.61583168 94 152 C92.16575643 150.15670764 90.32431564 148.32075561 88.48291016 146.48461914 C87.19316842 145.19376584 85.90867844 143.89763652 84.63037109 142.59545898 C81.57807883 139.49762816 78.49130224 136.51694439 75.1875 133.6875 C69.045697 128.39160973 63.46681442 122.50937991 57.77734375 116.73828125 C53.32800024 112.25007884 48.84027886 107.92397219 44.04101562 103.81396484 C39.84677314 100.08630675 35.9465789 96.04848406 32 92.0625 C31.12988281 91.18787109 30.25976562 90.31324219 29.36328125 89.41210938 C27.23986451 87.27702551 25.11883622 85.13962795 23 83 C10.53706738 93.64275245 -1.33902742 104.87551527 -13.25097656 116.12597656 C-15.41566207 118.16908254 -17.58263293 120.2097394 -19.75 122.25 C-20.40500488 122.86955566 -21.06000977 123.48911133 -21.73486328 124.12744141 C-31.03773055 132.87780705 -31.03773055 132.87780705 -35.9375 133.5 C-40.16536373 133.28421111 -42.74104519 131.71579568 -46 129 C-48.02273558 125.96589663 -48.31526269 125.14629 -48.375 121.6875 C-48.40335938 120.94886719 -48.43171875 120.21023437 -48.4609375 119.44921875 C-47.29801562 113.26996437 -41.73405336 108.07700408 -37.8125 103.3125 C-37.23371094 102.60480469 -36.65492187 101.89710938 -36.05859375 101.16796875 C-34.37479792 99.10999607 -32.68771039 97.05476264 -31 95 C-29.49973347 93.16688477 -27.99969695 91.33358124 -26.5 89.5 C-25.80261719 88.64792969 -25.10523437 87.79585938 -24.38671875 86.91796875 C-23.59910156 85.95503906 -22.81148437 84.99210937 -22 84 C-21.48904785 83.37561035 -20.9780957 82.7512207 -20.45166016 82.10791016 C-18.7368766 80.01084685 -17.02450284 77.9118338 -15.3125 75.8125 C-14.77753906 75.15894531 -14.24257813 74.50539063 -13.69140625 73.83203125 C-10.00676793 69.30831688 -6.46806693 64.69163386 -3 60 C-4.82811187 55.96414496 -7.50074244 53.5927788 -10.8125 50.75 C-16.68105452 45.55520052 -22.22063122 40.06794267 -23.2734375 31.87109375 C-23.56911298 24.78625433 -22.27103486 19.71062017 -18 14 C-5.11044938 0 -5.11044938 0 0 0 Z",fill:"#BCB8B3",transform:"translate(71,104)"}),C.jsx("path",{d:"M0 0 C3.36663199 2.12244191 5.8875061 4.10627134 7 8 C7 14.68990211 4.12088479 18.13281324 0 23 C-0.79921875 23.9590625 -1.5984375 24.918125 -2.421875 25.90625 C-6.26241871 30.49222765 -10.16235642 35.02721854 -14.0625 39.5625 C-15.08335793 40.74997885 -16.10419133 41.9374788 -17.125 43.125 C-17.62966797 43.71144287 -18.13433594 44.29788574 -18.65429688 44.90209961 C-21.70155483 48.45310616 -24.68395801 52.04744275 -27.625 55.6875 C-30.7860604 59.56253397 -33.99852427 63.38043951 -37.3125 67.125 C-38.11300781 68.03507812 -38.91351563 68.94515625 -39.73828125 69.8828125 C-42.93761411 72.87769749 -42.93761411 72.87769749 -46 73 C-48.38183594 71.18579102 -48.38183594 71.18579102 -50.984375 68.50390625 C-51.44483215 68.03637436 -51.90528931 67.56884247 -52.37969971 67.08714294 C-53.84859761 65.59024181 -55.2991807 64.07690962 -56.75 62.5625 C-57.74233158 61.5450932 -58.73580829 60.52880197 -59.73046875 59.51367188 C-62.16706933 57.02192521 -64.58753329 54.51514503 -67 52 C-65.10694916 47.8213276 -62.24895283 45.20414928 -58.875 42.1875 C-58.28678467 41.65342529 -57.69856934 41.11935059 -57.0925293 40.5690918 C-53.41665177 37.24084365 -49.70693728 33.95168678 -45.95703125 30.70703125 C-43.6144085 28.66366569 -41.30726578 26.58319141 -39 24.5 C-35.38732096 21.23977745 -31.74511009 18.01856435 -28.07421875 14.82421875 C-24.81448051 11.95736798 -21.60589216 9.03411516 -18.39453125 6.11328125 C-12.24775018 0.6884712 -8.39784462 -2.13226524 0 0 Z",fill:"#BCB8B3",transform:"translate(163,30)"}),C.jsx("path",{d:"M0 0 C4.14995519 0.83282899 5.82461266 2.54123182 8.75 5.625 C12.46350949 9.45918483 16.24225919 13.07223275 20.30859375 16.52734375 C21.94783789 17.95458403 23.48225476 19.44512338 25 21 C23.66604327 23.99602215 22.24215997 25.96601609 19.83203125 28.1796875 C19.19394531 28.77136719 18.55585937 29.36304688 17.8984375 29.97265625 C17.21007812 30.60042969 16.52171875 31.22820312 15.8125 31.875 C15.09707031 32.53628906 14.38164063 33.19757813 13.64453125 33.87890625 C12.15775053 35.25313139 10.66895765 36.62518258 9.17822266 37.99511719 C5.93590964 40.97941157 2.71865107 43.99024037 -0.5 47 C-1.72653391 48.14325984 -2.95309671 49.28648869 -4.1796875 50.4296875 C-6.90063691 52.96876667 -9.61260187 55.51712125 -12.3203125 58.0703125 C-13.03896484 58.74707031 -13.75761719 59.42382812 -14.49804688 60.12109375 C-15.87842565 61.42161591 -17.25741626 62.72361364 -18.63476562 64.02734375 C-28.03430558 72.87737214 -28.03430558 72.87737214 -32.9375 73.5 C-37.16536373 73.28421111 -39.74104519 71.71579568 -43 69 C-45.02273558 65.96589663 -45.31526269 65.14629 -45.375 61.6875 C-45.40335938 60.94886719 -45.43171875 60.21023437 -45.4609375 59.44921875 C-44.29801562 53.26996437 -38.73405336 48.07700408 -34.8125 43.3125 C-34.23371094 42.60480469 -33.65492187 41.89710938 -33.05859375 41.16796875 C-31.37479792 39.10999607 -29.68771039 37.05476264 -28 35 C-26.49973347 33.16688477 -24.99969695 31.33358124 -23.5 29.5 C-22.80261719 28.64792969 -22.10523437 27.79585937 -21.38671875 26.91796875 C-20.59910156 25.95503906 -19.81148437 24.99210937 -19 24 C-18.48904785 23.37561035 -17.9780957 22.7512207 -17.45166016 22.10791016 C-15.7368766 20.01084685 -14.02450284 17.9118338 -12.3125 15.8125 C-11.77753906 15.15894531 -11.24257813 14.50539062 -10.69140625 13.83203125 C-7.00676793 9.30831688 -3.46806693 4.69163386 0 0 Z",fill:"#AE1919",transform:"translate(68,164)"}),C.jsx("path",{d:"M0 0 C1.32 0.33 2.64 0.66 4 1 C3.195625 1.61875 2.39125 2.2375 1.5625 2.875 C-1.03874519 4.74164041 -1.03874519 4.74164041 -2 7 C-1.67 7.99 -1.34 8.98 -1 10 C-1.99 10 -2.98 10 -4 10 C-4.22429688 10.73605469 -4.44859375 11.47210938 -4.6796875 12.23046875 C-6.29264462 15.61386106 -8.1508051 17.06278848 -11.125 19.3125 C-12.03507812 20.00988281 -12.94515625 20.70726562 -13.8828125 21.42578125 C-14.93082031 22.20501953 -14.93082031 22.20501953 -16 23 C-16 18.73826628 -13.51054098 16.78157935 -10.8125 13.75 C-9.80008934 12.58636728 -8.78964856 11.42101755 -7.78125 10.25390625 C-7.29785156 9.69461426 -6.81445312 9.13532227 -6.31640625 8.55908203 C-4.01353537 5.8316834 -1.9941694 2.95687186 0 0 Z",fill:"#921115",transform:"translate(68,164)"}),C.jsx("path",{d:"M0 0 C3.46125202 1.94219077 6.20719483 3.96666141 8.98828125 6.79296875 C9.69404297 7.50517578 10.39980469 8.21738281 11.12695312 8.95117188 C11.84818359 9.68916016 12.56941406 10.42714844 13.3125 11.1875 C14.05306641 11.93708984 14.79363281 12.68667969 15.55664062 13.45898438 C17.37571712 15.30153282 19.18994389 17.14859662 21 19 C20.67 19.66 20.34 20.32 20 21 C19.56131592 20.54560547 19.12263184 20.09121094 18.6706543 19.62304688 C16.68411205 17.57425281 14.68604501 15.53708444 12.6875 13.5 C11.99720703 12.78457031 11.30691406 12.06914063 10.59570312 11.33203125 C9.92861328 10.65527344 9.26152344 9.97851562 8.57421875 9.28125 C7.96151123 8.65283203 7.34880371 8.02441406 6.7175293 7.37695312 C4.97678075 5.68724689 4.97678075 5.68724689 2 6 C2 4.68 2 3.36 2 2 C1.34 2 0.68 2 0 2 C0 1.34 0 0.68 0 0 Z",fill:"#860F0D",transform:"translate(74,61)"}),C.jsx("path",{d:"M0 0 C0.66 0.33 1.32 0.66 2 1 C-9.33712984 12.70615034 -9.33712984 12.70615034 -16 17 C-14.14285714 9.42857143 -14.14285714 9.42857143 -11 7 C-10.34 7.66 -9.68 8.32 -9 9 C-6.03 6.03 -3.06 3.06 0 0 Z",fill:"#911012",transform:"translate(80,196)"}),C.jsx("path",{d:"M0 0 C1.32 0.33 2.64 0.66 4 1 C3.195625 1.61875 2.39125 2.2375 1.5625 2.875 C-1.03874519 4.74164041 -1.03874519 4.74164041 -2 7 C-1.67 7.99 -1.34 8.98 -1 10 C-1.99 10 -2.98 10 -4 10 C-4.66 11.32 -5.32 12.64 -6 14 C-6.33 13.01 -6.66 12.02 -7 11 C-6.34 10.34 -5.68 9.68 -5 9 C-4.690625 8.21625 -4.38125 7.4325 -4.0625 6.625 C-3.00983103 4.02428842 -1.76321255 2.16394268 0 0 Z",fill:"#A01616",transform:"translate(68,164)"}),C.jsx("path",{d:"M0 0 C1.75 1.875 1.75 1.875 2 4.5625 C1.9175 5.325625 1.835 6.08875 1.75 6.875 C-2.0452131 5.38402342 -3.86042731 3.11799151 -6.25 -0.125 C-3.56681527 -1.17910828 -2.63145757 -1.31572879 0 0 Z",fill:"#C6A6A0",transform:"translate(82.25,169.125)"}),C.jsx("path",{d:"M0 0 C3.36591866 1.44253657 5.51047079 3.33264727 8 6 C7.67 6.66 7.34 7.32 7 8 C4.03 7.505 4.03 7.505 1 7 C1.33 6.01 1.66 5.02 2 4 C1.34 3.67 0.68 3.34 0 3 C0 2.01 0 1.02 0 0 Z",fill:"#A52423",transform:"translate(85,179)"}),C.jsx("path",{d:"M0 0 C1.98 1.65 3.96 3.3 6 5 C4.68 5.33 3.36 5.66 2 6 C1.34 4.02 0.68 2.04 0 0 Z M0 6 C0.66 6 1.32 6 2 6 C2.66 7.65 3.32 9.3 4 11 C3.01 11 2.02 11 1 11 C0.67 9.35 0.34 7.7 0 6 Z",fill:"#9B1817",transform:"translate(26,14)"}),C.jsx("path",{d:"M0 0 C0.66 1.32 1.32 2.64 2 4 C1.34 4.66 0.68 5.32 0 6 C-1.32 6 -2.64 6 -4 6 C-6.20067421 6.93283296 -6.20067421 6.93283296 -8 8 C-7.04578192 6.85073734 -6.08647955 5.70569459 -5.125 4.5625 C-4.59132813 3.92441406 -4.05765625 3.28632812 -3.5078125 2.62890625 C-2 1 -2 1 0 0 Z",fill:"#B4B2AD",transform:"translate(122,57)"}),C.jsx("path",{d:"M0 0 C4.18423892 3.50897269 8.19588166 7.08060535 12 11 C7.71844354 10.08252362 4.87588097 9.2651614 2.3125 5.5625 C1 3 1 3 0 0 Z",fill:"#8C1317",transform:"translate(40,28)"}),C.jsx("path",{d:"M0 0 C9.1 4.2 9.1 4.2 11.375 8.75 C11.58125 9.4925 11.7875 10.235 12 11 C8.57472113 9.52651292 6.35044942 7.59092154 3.75 4.9375 C3.04359375 4.22464844 2.3371875 3.51179687 1.609375 2.77734375 C0 1 0 1 0 0 Z",fill:"#B1AFAB",transform:"translate(138,229)"}),C.jsx("path",{d:"M0 0 C0.78375 0.185625 1.5675 0.37125 2.375 0.5625 C4.97089775 1.25962266 4.97089775 1.25962266 7 0 C7.99 0.66 8.98 1.32 10 2 C8.68 2.99 7.36 3.98 6 5 C2.83884224 3.63016497 2.0072908 3.0109362 0 0 Z",fill:"#C3A7A2",transform:"translate(113,98)"}),C.jsx("path",{d:"M0 0 C0.66 0.33 1.32 0.66 2 1 C-1.96 4.465 -1.96 4.465 -6 8 C-6.66 7.67 -7.32 7.34 -8 7 C-7.67 5.35 -7.34 3.7 -7 2 C-6.01 2.33 -5.02 2.66 -4 3 C-1.80961577 1.62831762 -1.80961577 1.62831762 0 0 Z",fill:"#8A1013",transform:"translate(126,154)"}),C.jsx("path",{d:"M0 0 C0.66 0.33 1.32 0.66 2 1 C1.54625 1.5775 1.0925 2.155 0.625 2.75 C-0.84113516 4.7800333 -1.94857784 6.73539843 -3 9 C-3.66 7.68 -4.32 6.36 -5 5 C-3.35 3.35 -1.7 1.7 0 0 Z",fill:"#B9A7A1",transform:"translate(101,75)"}),C.jsx("path",{d:"M0 0 C1.32 0.66 2.64 1.32 4 2 C3.34 2.66 2.68 3.32 2 4 C2 4.99 2 5.98 2 7 C0.35 5.35 -1.3 3.7 -3 2 C-2.01 1.34 -1.02 0.68 0 0 Z",fill:"#C4B3AE",transform:"translate(90,177)"}),C.jsx("path",{d:"M0 0 C2.04119788 1.61594832 4.04072937 3.2856382 6 5 C6 5.66 6 6.32 6 7 C3.03 6.505 3.03 6.505 0 6 C0.66 5.67 1.32 5.34 2 5 C2 4.34 2 3.68 2 3 C1.34 3 0.68 3 0 3 C0 2.01 0 1.02 0 0 Z",fill:"#C6AAA2",transform:"translate(113,157)"}),C.jsx("path",{d:"M0 0 C1.98 0.66 3.96 1.32 6 2 C6.33 3.65 6.66 5.3 7 7 C5.83040013 6.02433888 4.66438823 5.044375 3.5 4.0625 C2.8503125 3.51722656 2.200625 2.97195312 1.53125 2.41015625 C1.0259375 1.94480469 0.520625 1.47945312 0 1 C0 0.67 0 0.34 0 0 Z",fill:"#B1AFAB",transform:"translate(110,202)"}),C.jsx("path",{d:"M0 0 C2.97 0.495 2.97 0.495 6 1 C6 1.99 6 2.98 6 4 C6.66 4.33 7.32 4.66 8 5 C5 5 5 5 2.3125 2.5 C1.549375 1.675 0.78625 0.85 0 0 Z",fill:"#CBA19D",transform:"translate(69,163)"})]}),n=r.forwardRef((t,a)=>C.jsx(s,{ref:a,...t}));export{n as ArXivIcon,n as default};
|
|
1
|
+
import{j as C,r}from"./index-ci4XHjbJ.js";const s=t=>C.jsxs("svg",{width:"189",height:"267",viewBox:"0 0 189 267",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t,children:[C.jsx("path",{d:"M0 0 C3.06321791 1.91292239 5.45079154 4.4596893 8 7 C9.8508184 8.67038411 11.70529484 10.33671987 13.5625 12 C19.07787808 17.02522109 24.35027634 22.28150765 29.57250977 27.609375 C32.5939679 30.67417964 35.65891534 33.61406295 38.921875 36.421875 C44.10950064 40.89742443 48.84688739 45.79856111 53.64453125 50.68359375 C57.66464894 54.7478078 61.77436223 58.6065472 66.10742188 62.33447266 C69.03335456 64.90938401 71.7678273 67.66002342 74.5 70.4375 C75.03625 70.97826172 75.5725 71.51902344 76.125 72.07617188 C77.41904036 73.38176617 78.70988174 74.69052996 80 76 C85.1426468 72.38920544 89.62711213 68.50001906 94.0078125 64 C96.51837733 61.47958982 99.17224396 59.16742137 101.8671875 56.84765625 C104.27376821 54.7628345 106.63764945 52.63478467 109 50.5 C112.61267904 47.23977745 116.25488991 44.01856435 119.92578125 40.82421875 C123.18551949 37.95736798 126.39410784 35.03411516 129.60546875 32.11328125 C137.34815391 25.28001424 137.34815391 25.28001424 142.94140625 24.8359375 C147.68501605 25.2139861 150.92781614 27.76028741 154 31.3125 C155.40950462 35.10054368 155.12155084 37.10755883 154 41 C152.30245093 43.92391532 150.18101072 46.42400308 148 49 C147.20078125 49.9590625 146.4015625 50.918125 145.578125 51.90625 C141.73758129 56.49222765 137.83764358 61.02721854 133.9375 65.5625 C132.91664207 66.74997885 131.89580867 67.9374788 130.875 69.125 C130.37033203 69.71144287 129.86566406 70.29788574 129.34570312 70.90209961 C125.56250432 75.31070693 121.89219438 79.80216286 118.25 84.328125 C116.60361094 86.28321201 114.94893747 88.13940053 113.1875 89.984375 C112.71908691 90.47848877 112.25067383 90.97260254 111.76806641 91.48168945 C110.44753599 92.86169697 109.11091734 94.22625694 107.7734375 95.58984375 C105.75436851 97.76886089 105.75436851 97.76886089 106.20043945 99.96386719 C107.12781134 102.32547986 108.10653192 103.33925864 110.01953125 104.98828125 C110.62990234 105.53033203 111.24027344 106.07238281 111.86914062 106.63085938 C113.15221419 107.7411371 114.43605365 108.85053043 115.72070312 109.95898438 C120.98419941 114.63703406 125.20355106 119.50756986 126 126.8125 C126.39670106 133.89951089 124.33863378 139.25535341 119.75 144.640625 C115.09293989 149.38287524 110.12237597 153.76847203 105 158 C106.68194618 162.08046114 109.55174447 165.11242756 112.4375 168.375 C116.6887433 173.24873759 120.79185883 178.19789081 124.75 183.3125 C128.36095871 187.96976162 132.0872841 192.4431192 136.05078125 196.80859375 C139.0059196 200.13090359 141.78077766 203.59472771 144.58203125 207.046875 C147.18689495 210.22825942 149.83680038 213.36750392 152.5 216.5 C174.41458074 242.31754315 174.41458074 242.31754315 174.359375 249.89453125 C173.72418186 253.61593453 171.66020984 255.40312849 169 258 C165.42531796 259.78734102 161.88841712 259.7132973 158 259 C154.81886665 257.21398234 152.51475627 254.61583168 150 252 C148.16575643 250.15670764 146.32431564 248.32075561 144.48291016 246.48461914 C143.19316842 245.19376584 141.90867844 243.89763652 140.63037109 242.59545898 C137.57807883 239.49762816 134.49130224 236.51694439 131.1875 233.6875 C125.045697 228.39160973 119.46681442 222.50937991 113.77734375 216.73828125 C109.32800024 212.25007884 104.84027886 207.92397219 100.04101562 203.81396484 C95.84677314 200.08630675 91.9465789 196.04848406 88 192.0625 C87.12988281 191.18787109 86.25976562 190.31324219 85.36328125 189.41210938 C83.23986451 187.27702551 81.11883622 185.13962795 79 183 C66.53706738 193.64275245 54.66097258 204.87551527 42.74902344 216.12597656 C40.58433793 218.16908254 38.41736707 220.2097394 36.25 222.25 C35.59499512 222.86955566 34.93999023 223.48911133 34.26513672 224.12744141 C24.96226945 232.87780705 24.96226945 232.87780705 20.0625 233.5 C15.83463627 233.28421111 13.25895481 231.71579568 10 229 C7.97726442 225.96589663 7.68473731 225.14629 7.625 221.6875 C7.59664062 220.94886719 7.56828125 220.21023437 7.5390625 219.44921875 C8.70198438 213.26996437 14.26594664 208.07700408 18.1875 203.3125 C19.05568359 202.25095703 19.05568359 202.25095703 19.94140625 201.16796875 C21.62520208 199.10999607 23.31228961 197.05476264 25 195 C26.50026653 193.16688477 28.00030305 191.33358124 29.5 189.5 C30.19738281 188.64792969 30.89476562 187.79585937 31.61328125 186.91796875 C32.40089844 185.95503906 33.18851563 184.99210938 34 184 C34.51095215 183.37561035 35.0219043 182.7512207 35.54833984 182.10791016 C37.2631234 180.01084685 38.97549716 177.9118338 40.6875 175.8125 C41.22246094 175.15894531 41.75742187 174.50539062 42.30859375 173.83203125 C45.99323207 169.30831688 49.53193307 164.69163386 53 160 C51.17188813 155.96414496 48.49925756 153.5927788 45.1875 150.75 C39.31894548 145.55520052 33.77936878 140.06794267 32.7265625 131.87109375 C32.43131564 124.7965247 33.71729015 119.69441791 38 114 C42.70916137 109.02981655 47.83299974 104.48552008 53 100 C50.45314999 96.07956795 47.8040917 92.4143982 44.8125 88.8125 C44.0184375 87.85214844 43.224375 86.89179687 42.40625 85.90234375 C41.6121875 84.94457031 40.818125 83.98679687 40 83 C38.60288993 81.29271065 37.20705815 79.58437445 35.8125 77.875 C34.20900796 75.9161092 32.60495761 73.95768918 31 72 C30.47744629 71.36255859 29.95489258 70.72511719 29.41650391 70.06835938 C23.43211199 62.77290531 17.4398864 55.48851816 11.3125 48.3125 C7.07791917 43.34685767 3.01358082 38.26531056 -0.99438477 33.11547852 C-4.68613817 28.37504538 -8.47899503 23.7298921 -12.3203125 19.109375 C-14.95707497 15.7980919 -15.39046315 13.37231751 -15.359375 9.10546875 C-14.72418186 5.38406547 -12.66020984 3.59687151 -10 1 C-6.68887676 -0.65556162 -3.55295081 -0.73967125 0 0 Z",fill:"#AF1A19",transform:"translate(15,4)"}),C.jsx("path",{d:"M0 0 C1.77292382 2.0010015 3.35426839 3.98107573 4.9375 6.125 C5.92044262 7.41744879 6.90621055 8.70775285 7.89453125 9.99609375 C8.65950928 10.99358643 8.65950928 10.99358643 9.43994141 12.01123047 C11.90511947 15.15385026 14.50707228 18.17191237 17.125 21.1875 C22.19048007 27.04131904 27.11677661 32.99286012 32 39 C39.38114532 48.0518617 46.83456186 57.0208033 54.51757812 65.81835938 C58.16253268 70.00264136 61.68299856 74.26425914 65.12109375 78.62109375 C70.8953038 85.93189192 76.88178655 93.0648837 82.91333008 100.16333008 C86.56128527 104.4630923 90.13418611 108.82012196 93.69140625 113.1953125 C95.78056796 115.73341421 97.90125206 118.23888412 100.03759766 120.73706055 C104.35967315 125.7940547 108.56718347 130.9152143 112.625 136.1875 C113.05095459 136.74034668 113.47690918 137.29319336 113.91577148 137.86279297 C117.10891324 142.05062764 118.39874896 144.49045563 118.359375 149.89453125 C117.72418186 153.61593453 115.66020984 155.40312849 113 158 C109.42531796 159.78734102 105.88841712 159.7132973 102 159 C98.81886665 157.21398234 96.51475627 154.61583168 94 152 C92.16575643 150.15670764 90.32431564 148.32075561 88.48291016 146.48461914 C87.19316842 145.19376584 85.90867844 143.89763652 84.63037109 142.59545898 C81.57807883 139.49762816 78.49130224 136.51694439 75.1875 133.6875 C69.045697 128.39160973 63.46681442 122.50937991 57.77734375 116.73828125 C53.32800024 112.25007884 48.84027886 107.92397219 44.04101562 103.81396484 C39.84677314 100.08630675 35.9465789 96.04848406 32 92.0625 C31.12988281 91.18787109 30.25976562 90.31324219 29.36328125 89.41210938 C27.23986451 87.27702551 25.11883622 85.13962795 23 83 C10.53706738 93.64275245 -1.33902742 104.87551527 -13.25097656 116.12597656 C-15.41566207 118.16908254 -17.58263293 120.2097394 -19.75 122.25 C-20.40500488 122.86955566 -21.06000977 123.48911133 -21.73486328 124.12744141 C-31.03773055 132.87780705 -31.03773055 132.87780705 -35.9375 133.5 C-40.16536373 133.28421111 -42.74104519 131.71579568 -46 129 C-48.02273558 125.96589663 -48.31526269 125.14629 -48.375 121.6875 C-48.40335938 120.94886719 -48.43171875 120.21023437 -48.4609375 119.44921875 C-47.29801562 113.26996437 -41.73405336 108.07700408 -37.8125 103.3125 C-37.23371094 102.60480469 -36.65492187 101.89710938 -36.05859375 101.16796875 C-34.37479792 99.10999607 -32.68771039 97.05476264 -31 95 C-29.49973347 93.16688477 -27.99969695 91.33358124 -26.5 89.5 C-25.80261719 88.64792969 -25.10523437 87.79585938 -24.38671875 86.91796875 C-23.59910156 85.95503906 -22.81148437 84.99210937 -22 84 C-21.48904785 83.37561035 -20.9780957 82.7512207 -20.45166016 82.10791016 C-18.7368766 80.01084685 -17.02450284 77.9118338 -15.3125 75.8125 C-14.77753906 75.15894531 -14.24257813 74.50539063 -13.69140625 73.83203125 C-10.00676793 69.30831688 -6.46806693 64.69163386 -3 60 C-4.82811187 55.96414496 -7.50074244 53.5927788 -10.8125 50.75 C-16.68105452 45.55520052 -22.22063122 40.06794267 -23.2734375 31.87109375 C-23.56911298 24.78625433 -22.27103486 19.71062017 -18 14 C-5.11044938 0 -5.11044938 0 0 0 Z",fill:"#BCB8B3",transform:"translate(71,104)"}),C.jsx("path",{d:"M0 0 C3.36663199 2.12244191 5.8875061 4.10627134 7 8 C7 14.68990211 4.12088479 18.13281324 0 23 C-0.79921875 23.9590625 -1.5984375 24.918125 -2.421875 25.90625 C-6.26241871 30.49222765 -10.16235642 35.02721854 -14.0625 39.5625 C-15.08335793 40.74997885 -16.10419133 41.9374788 -17.125 43.125 C-17.62966797 43.71144287 -18.13433594 44.29788574 -18.65429688 44.90209961 C-21.70155483 48.45310616 -24.68395801 52.04744275 -27.625 55.6875 C-30.7860604 59.56253397 -33.99852427 63.38043951 -37.3125 67.125 C-38.11300781 68.03507812 -38.91351563 68.94515625 -39.73828125 69.8828125 C-42.93761411 72.87769749 -42.93761411 72.87769749 -46 73 C-48.38183594 71.18579102 -48.38183594 71.18579102 -50.984375 68.50390625 C-51.44483215 68.03637436 -51.90528931 67.56884247 -52.37969971 67.08714294 C-53.84859761 65.59024181 -55.2991807 64.07690962 -56.75 62.5625 C-57.74233158 61.5450932 -58.73580829 60.52880197 -59.73046875 59.51367188 C-62.16706933 57.02192521 -64.58753329 54.51514503 -67 52 C-65.10694916 47.8213276 -62.24895283 45.20414928 -58.875 42.1875 C-58.28678467 41.65342529 -57.69856934 41.11935059 -57.0925293 40.5690918 C-53.41665177 37.24084365 -49.70693728 33.95168678 -45.95703125 30.70703125 C-43.6144085 28.66366569 -41.30726578 26.58319141 -39 24.5 C-35.38732096 21.23977745 -31.74511009 18.01856435 -28.07421875 14.82421875 C-24.81448051 11.95736798 -21.60589216 9.03411516 -18.39453125 6.11328125 C-12.24775018 0.6884712 -8.39784462 -2.13226524 0 0 Z",fill:"#BCB8B3",transform:"translate(163,30)"}),C.jsx("path",{d:"M0 0 C4.14995519 0.83282899 5.82461266 2.54123182 8.75 5.625 C12.46350949 9.45918483 16.24225919 13.07223275 20.30859375 16.52734375 C21.94783789 17.95458403 23.48225476 19.44512338 25 21 C23.66604327 23.99602215 22.24215997 25.96601609 19.83203125 28.1796875 C19.19394531 28.77136719 18.55585937 29.36304688 17.8984375 29.97265625 C17.21007812 30.60042969 16.52171875 31.22820312 15.8125 31.875 C15.09707031 32.53628906 14.38164063 33.19757813 13.64453125 33.87890625 C12.15775053 35.25313139 10.66895765 36.62518258 9.17822266 37.99511719 C5.93590964 40.97941157 2.71865107 43.99024037 -0.5 47 C-1.72653391 48.14325984 -2.95309671 49.28648869 -4.1796875 50.4296875 C-6.90063691 52.96876667 -9.61260187 55.51712125 -12.3203125 58.0703125 C-13.03896484 58.74707031 -13.75761719 59.42382812 -14.49804688 60.12109375 C-15.87842565 61.42161591 -17.25741626 62.72361364 -18.63476562 64.02734375 C-28.03430558 72.87737214 -28.03430558 72.87737214 -32.9375 73.5 C-37.16536373 73.28421111 -39.74104519 71.71579568 -43 69 C-45.02273558 65.96589663 -45.31526269 65.14629 -45.375 61.6875 C-45.40335938 60.94886719 -45.43171875 60.21023437 -45.4609375 59.44921875 C-44.29801562 53.26996437 -38.73405336 48.07700408 -34.8125 43.3125 C-34.23371094 42.60480469 -33.65492187 41.89710938 -33.05859375 41.16796875 C-31.37479792 39.10999607 -29.68771039 37.05476264 -28 35 C-26.49973347 33.16688477 -24.99969695 31.33358124 -23.5 29.5 C-22.80261719 28.64792969 -22.10523437 27.79585937 -21.38671875 26.91796875 C-20.59910156 25.95503906 -19.81148437 24.99210937 -19 24 C-18.48904785 23.37561035 -17.9780957 22.7512207 -17.45166016 22.10791016 C-15.7368766 20.01084685 -14.02450284 17.9118338 -12.3125 15.8125 C-11.77753906 15.15894531 -11.24257813 14.50539062 -10.69140625 13.83203125 C-7.00676793 9.30831688 -3.46806693 4.69163386 0 0 Z",fill:"#AE1919",transform:"translate(68,164)"}),C.jsx("path",{d:"M0 0 C1.32 0.33 2.64 0.66 4 1 C3.195625 1.61875 2.39125 2.2375 1.5625 2.875 C-1.03874519 4.74164041 -1.03874519 4.74164041 -2 7 C-1.67 7.99 -1.34 8.98 -1 10 C-1.99 10 -2.98 10 -4 10 C-4.22429688 10.73605469 -4.44859375 11.47210938 -4.6796875 12.23046875 C-6.29264462 15.61386106 -8.1508051 17.06278848 -11.125 19.3125 C-12.03507812 20.00988281 -12.94515625 20.70726562 -13.8828125 21.42578125 C-14.93082031 22.20501953 -14.93082031 22.20501953 -16 23 C-16 18.73826628 -13.51054098 16.78157935 -10.8125 13.75 C-9.80008934 12.58636728 -8.78964856 11.42101755 -7.78125 10.25390625 C-7.29785156 9.69461426 -6.81445312 9.13532227 -6.31640625 8.55908203 C-4.01353537 5.8316834 -1.9941694 2.95687186 0 0 Z",fill:"#921115",transform:"translate(68,164)"}),C.jsx("path",{d:"M0 0 C3.46125202 1.94219077 6.20719483 3.96666141 8.98828125 6.79296875 C9.69404297 7.50517578 10.39980469 8.21738281 11.12695312 8.95117188 C11.84818359 9.68916016 12.56941406 10.42714844 13.3125 11.1875 C14.05306641 11.93708984 14.79363281 12.68667969 15.55664062 13.45898438 C17.37571712 15.30153282 19.18994389 17.14859662 21 19 C20.67 19.66 20.34 20.32 20 21 C19.56131592 20.54560547 19.12263184 20.09121094 18.6706543 19.62304688 C16.68411205 17.57425281 14.68604501 15.53708444 12.6875 13.5 C11.99720703 12.78457031 11.30691406 12.06914063 10.59570312 11.33203125 C9.92861328 10.65527344 9.26152344 9.97851562 8.57421875 9.28125 C7.96151123 8.65283203 7.34880371 8.02441406 6.7175293 7.37695312 C4.97678075 5.68724689 4.97678075 5.68724689 2 6 C2 4.68 2 3.36 2 2 C1.34 2 0.68 2 0 2 C0 1.34 0 0.68 0 0 Z",fill:"#860F0D",transform:"translate(74,61)"}),C.jsx("path",{d:"M0 0 C0.66 0.33 1.32 0.66 2 1 C-9.33712984 12.70615034 -9.33712984 12.70615034 -16 17 C-14.14285714 9.42857143 -14.14285714 9.42857143 -11 7 C-10.34 7.66 -9.68 8.32 -9 9 C-6.03 6.03 -3.06 3.06 0 0 Z",fill:"#911012",transform:"translate(80,196)"}),C.jsx("path",{d:"M0 0 C1.32 0.33 2.64 0.66 4 1 C3.195625 1.61875 2.39125 2.2375 1.5625 2.875 C-1.03874519 4.74164041 -1.03874519 4.74164041 -2 7 C-1.67 7.99 -1.34 8.98 -1 10 C-1.99 10 -2.98 10 -4 10 C-4.66 11.32 -5.32 12.64 -6 14 C-6.33 13.01 -6.66 12.02 -7 11 C-6.34 10.34 -5.68 9.68 -5 9 C-4.690625 8.21625 -4.38125 7.4325 -4.0625 6.625 C-3.00983103 4.02428842 -1.76321255 2.16394268 0 0 Z",fill:"#A01616",transform:"translate(68,164)"}),C.jsx("path",{d:"M0 0 C1.75 1.875 1.75 1.875 2 4.5625 C1.9175 5.325625 1.835 6.08875 1.75 6.875 C-2.0452131 5.38402342 -3.86042731 3.11799151 -6.25 -0.125 C-3.56681527 -1.17910828 -2.63145757 -1.31572879 0 0 Z",fill:"#C6A6A0",transform:"translate(82.25,169.125)"}),C.jsx("path",{d:"M0 0 C3.36591866 1.44253657 5.51047079 3.33264727 8 6 C7.67 6.66 7.34 7.32 7 8 C4.03 7.505 4.03 7.505 1 7 C1.33 6.01 1.66 5.02 2 4 C1.34 3.67 0.68 3.34 0 3 C0 2.01 0 1.02 0 0 Z",fill:"#A52423",transform:"translate(85,179)"}),C.jsx("path",{d:"M0 0 C1.98 1.65 3.96 3.3 6 5 C4.68 5.33 3.36 5.66 2 6 C1.34 4.02 0.68 2.04 0 0 Z M0 6 C0.66 6 1.32 6 2 6 C2.66 7.65 3.32 9.3 4 11 C3.01 11 2.02 11 1 11 C0.67 9.35 0.34 7.7 0 6 Z",fill:"#9B1817",transform:"translate(26,14)"}),C.jsx("path",{d:"M0 0 C0.66 1.32 1.32 2.64 2 4 C1.34 4.66 0.68 5.32 0 6 C-1.32 6 -2.64 6 -4 6 C-6.20067421 6.93283296 -6.20067421 6.93283296 -8 8 C-7.04578192 6.85073734 -6.08647955 5.70569459 -5.125 4.5625 C-4.59132813 3.92441406 -4.05765625 3.28632812 -3.5078125 2.62890625 C-2 1 -2 1 0 0 Z",fill:"#B4B2AD",transform:"translate(122,57)"}),C.jsx("path",{d:"M0 0 C4.18423892 3.50897269 8.19588166 7.08060535 12 11 C7.71844354 10.08252362 4.87588097 9.2651614 2.3125 5.5625 C1 3 1 3 0 0 Z",fill:"#8C1317",transform:"translate(40,28)"}),C.jsx("path",{d:"M0 0 C9.1 4.2 9.1 4.2 11.375 8.75 C11.58125 9.4925 11.7875 10.235 12 11 C8.57472113 9.52651292 6.35044942 7.59092154 3.75 4.9375 C3.04359375 4.22464844 2.3371875 3.51179687 1.609375 2.77734375 C0 1 0 1 0 0 Z",fill:"#B1AFAB",transform:"translate(138,229)"}),C.jsx("path",{d:"M0 0 C0.78375 0.185625 1.5675 0.37125 2.375 0.5625 C4.97089775 1.25962266 4.97089775 1.25962266 7 0 C7.99 0.66 8.98 1.32 10 2 C8.68 2.99 7.36 3.98 6 5 C2.83884224 3.63016497 2.0072908 3.0109362 0 0 Z",fill:"#C3A7A2",transform:"translate(113,98)"}),C.jsx("path",{d:"M0 0 C0.66 0.33 1.32 0.66 2 1 C-1.96 4.465 -1.96 4.465 -6 8 C-6.66 7.67 -7.32 7.34 -8 7 C-7.67 5.35 -7.34 3.7 -7 2 C-6.01 2.33 -5.02 2.66 -4 3 C-1.80961577 1.62831762 -1.80961577 1.62831762 0 0 Z",fill:"#8A1013",transform:"translate(126,154)"}),C.jsx("path",{d:"M0 0 C0.66 0.33 1.32 0.66 2 1 C1.54625 1.5775 1.0925 2.155 0.625 2.75 C-0.84113516 4.7800333 -1.94857784 6.73539843 -3 9 C-3.66 7.68 -4.32 6.36 -5 5 C-3.35 3.35 -1.7 1.7 0 0 Z",fill:"#B9A7A1",transform:"translate(101,75)"}),C.jsx("path",{d:"M0 0 C1.32 0.66 2.64 1.32 4 2 C3.34 2.66 2.68 3.32 2 4 C2 4.99 2 5.98 2 7 C0.35 5.35 -1.3 3.7 -3 2 C-2.01 1.34 -1.02 0.68 0 0 Z",fill:"#C4B3AE",transform:"translate(90,177)"}),C.jsx("path",{d:"M0 0 C2.04119788 1.61594832 4.04072937 3.2856382 6 5 C6 5.66 6 6.32 6 7 C3.03 6.505 3.03 6.505 0 6 C0.66 5.67 1.32 5.34 2 5 C2 4.34 2 3.68 2 3 C1.34 3 0.68 3 0 3 C0 2.01 0 1.02 0 0 Z",fill:"#C6AAA2",transform:"translate(113,157)"}),C.jsx("path",{d:"M0 0 C1.98 0.66 3.96 1.32 6 2 C6.33 3.65 6.66 5.3 7 7 C5.83040013 6.02433888 4.66438823 5.044375 3.5 4.0625 C2.8503125 3.51722656 2.200625 2.97195312 1.53125 2.41015625 C1.0259375 1.94480469 0.520625 1.47945312 0 1 C0 0.67 0 0.34 0 0 Z",fill:"#B1AFAB",transform:"translate(110,202)"}),C.jsx("path",{d:"M0 0 C2.97 0.495 2.97 0.495 6 1 C6 1.99 6 2.98 6 4 C6.66 4.33 7.32 4.66 8 5 C5 5 5 5 2.3125 2.5 C1.549375 1.675 0.78625 0.85 0 0 Z",fill:"#CBA19D",transform:"translate(69,163)"})]}),n=r.forwardRef((t,a)=>C.jsx(s,{ref:a,...t}));export{n as ArXivIcon,n as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as L,r as i}from"./index-
|
|
1
|
+
import{j as L,r as i}from"./index-ci4XHjbJ.js";const r=e=>L.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",...e,children:[L.jsxs("g",{"clip-path":"url(#clip0_216_1303)",children:[L.jsx("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M3.61287 0H12.3871C14.3742 0 16 1.63334 16 3.62961V12.3704C16 14.3667 14.3742 16 12.3871 16H3.61287C1.62581 16 0 14.3667 0 12.3704V3.62961C0 1.63334 1.62581 0 3.61287 0Z",fill:"#D77655"}),L.jsx("path",{d:"M4.44587 9.94002L6.74759 8.64261L6.78627 8.52993L6.74759 8.46727L6.63543 8.46723L6.25074 8.44341L4.93562 8.40768L3.79505 8.36008L2.69002 8.30056L2.41199 8.24107L2.15137 7.89588L2.17821 7.72371L2.41202 7.5658L2.74693 7.59515L3.48702 7.64592L4.59755 7.7229L5.40324 7.77052L6.59677 7.8951H6.78627L6.81315 7.81815L6.74837 7.77052L6.6978 7.7229L5.54855 6.94048L4.30449 6.1136L3.65287 5.63747L3.30059 5.39627L3.12287 5.1701L3.04627 4.67654L3.36618 4.32263L3.79587 4.35198L3.90565 4.38137L4.3409 4.7178L5.27055 5.44072L6.48455 6.33899L6.66227 6.48739L6.73337 6.43662L6.74205 6.4009L6.66227 6.26681L6.00196 5.06775L5.2974 3.84813L4.9838 3.34264L4.90087 3.03953C4.87165 2.91495 4.85034 2.81022 4.85034 2.68245L5.21446 2.18569L5.41587 2.12061L5.90165 2.18569L6.10624 2.36423L6.40796 3.0578L6.8969 4.14971L7.65518 5.6344L7.87715 6.0748L7.99562 6.48268L8.03987 6.60725L8.1164 6.60722V6.5358L8.1788 5.69941L8.29412 4.67259L8.40627 3.35137L8.44499 2.97922L8.62821 2.53323L8.99234 2.29202L9.27668 2.42852L9.51049 2.76495L9.47812 2.98239L9.33909 3.89017L9.06659 5.31216L8.88887 6.26439H8.9924L9.1109 6.14538L9.59034 5.5058L10.396 4.49405L10.7515 4.09254L11.1661 3.64896L11.4323 3.43786L11.9354 3.43783L12.3059 3.99091L12.14 4.56227L11.6219 5.22247L11.1922 5.78189L10.5761 6.6151L10.1914 7.28164L10.227 7.33483L10.3186 7.3261L11.7103 7.02851L12.4623 6.89204L13.3596 6.73732L13.7656 6.92776L13.8098 7.12137L13.6503 7.51736L12.6906 7.75542L11.565 7.98159L9.8889 8.37996L9.86837 8.39503L9.89205 8.42438L10.6472 8.4958L10.9702 8.51326H11.7609L13.2332 8.62358L13.6178 8.8791L13.8485 9.19176L13.8098 9.42983L13.2174 9.73294L12.4181 9.5425L10.5524 9.09654L9.91255 8.93624L9.82412 8.93621V8.98939L10.3573 9.51312L11.3343 10.3995L12.5578 11.5422L12.6202 11.8247L12.4631 12.0476L12.2972 12.0238L11.2222 11.2113L10.8075 10.8455L9.86834 10.0511L9.80596 10.0511V10.1344L10.0224 10.4526L11.1653 12.1786L11.2246 12.7078L11.1416 12.88L10.8454 12.984L10.52 12.9245L9.85099 11.981L9.16062 10.9184L8.60377 9.96621L8.53587 10.0051L8.20727 13.5609L8.05324 13.7426L7.6978 13.8791L7.40162 13.6529L7.24443 13.2871L7.40162 12.5642L7.59118 11.6207L7.74518 10.8708L7.88421 9.93921L7.96715 9.62972L7.96162 9.60909L7.89371 9.61782L7.19465 10.582L6.13149 12.0254L5.29027 12.93L5.08887 13.0102L4.73971 12.8284L4.77212 12.5039L4.96721 12.2151L6.13149 10.7272L6.83368 9.80512L7.28706 9.27263L7.2839 9.19569H7.25705L4.16474 11.2128L3.61418 11.2843L3.37721 11.0613L3.40646 10.6954L3.51862 10.5764L4.44827 9.93365L4.44512 9.93685L4.44587 9.94002Z",fill:"#FCF2EE"})]}),L.jsx("defs",{children:L.jsx("clipPath",{id:"clip0_216_1303",children:L.jsx("rect",{width:"16",height:"16",fill:"white"})})})]}),s=i.forwardRef((e,l)=>L.jsx(r,{ref:l,...e}));export{s as ClaudeIcon};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as s,r as c}from"./index-ci4XHjbJ.js";const t=o=>s.jsxs("svg",{version:"1.0",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 755.78 560.77",height:"23",width:"23",...o,children:[s.jsx("polygon",{fill:"#0066DA",points:"505.79,113.39 469.59,133.29 451.59,167.59 469.59,209.59 503.59,246.39 540.29,225.89 562.89,186.99 540.29,138.79"}),s.jsx("path",{fill:"#2684FC",d:"M365.49,253.69l86.2-86.2c25.4,19.3,44,46.9,51.9,78.8l-118.3,118.4c-10.6,10.6-27.9,10.6-38.5,0l-79.7-79.7c-8.5-8.5-8.5-22.3,0-30.8l34-34c8.5-8.5,22.3-8.5,30.8,0L365.49,253.69z M601.19,117.99l-34.6-34.6c-8.5-8.5-22.3-8.5-30.8,0l-30,30c24,20,43.5,45.1,57.1,73.6l38.3-38.3C609.69,140.29,609.69,126.39,601.19,117.99z M507.69,280.39c0,78.2-63.4,141.6-141.6,141.6s-141.6-63.4-141.6-141.6s63.3-141.6,141.6-141.6c32.2,0,61.8,10.7,85.6,28.8l54.2-54.2c-37.8-31.8-86.5-50.9-139.8-50.9c-120.4,0.1-217.9,97.6-217.9,217.9s97.5,217.8,217.8,217.8s217.9-97.5,217.9-217.8c0-33.4-7.6-65.1-21-93.4l-59.3,59.4C506.19,257.29,507.69,268.69,507.69,280.39z"})]}),e=c.forwardRef((o,l)=>s.jsx(t,{ref:l,...o}));export{e as GoogleTasksIcon};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as n,r as i}from"./index-
|
|
1
|
+
import{j as n,r as i}from"./index-ci4XHjbJ.js";const r=C=>n.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",shapeRendering:"geometricPrecision",textRendering:"geometricPrecision",imageRendering:"optimizeQuality",fillRule:"evenodd",clipRule:"evenodd",viewBox:"0 0 384 384",width:"1em",height:"1em",...C,children:[n.jsx("defs",{children:n.jsx("clipPath",{id:"clip-corners",children:n.jsx("path",{d:`
|
|
2
2
|
M20,0
|
|
3
3
|
H364
|
|
4
4
|
L384,20
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as c,r as t}from"./index-
|
|
1
|
+
import{j as c,r as t}from"./index-ci4XHjbJ.js";const a=o=>c.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 32 32",...o,children:[c.jsx("path",{fill:"#599636",d:"m15.9.087.854 1.604c.192.296.4.558.645.802a22.406 22.406 0 0 1 2.004 2.266c1.447 1.9 2.423 4.01 3.12 6.292.418 1.394.645 2.824.662 4.27.07 4.323-1.412 8.035-4.4 11.12a12.7 12.7 0 0 1-1.57 1.342c-.296 0-.436-.227-.558-.436a3.589 3.589 0 0 1-.436-1.255c-.105-.523-.174-1.046-.14-1.586v-.244C16.057 24.21 15.796.21 15.9.087z"}),c.jsx("path",{fill:"#6cac48",d:"M15.9.034c-.035-.07-.07-.017-.105.017.017.35-.105.662-.296.96-.21.296-.488.523-.767.767-1.55 1.342-2.77 2.963-3.747 4.776-1.3 2.44-1.97 5.055-2.16 7.808-.087.993.314 4.497.627 5.508.854 2.684 2.388 4.933 4.375 6.885.488.47 1.01.906 1.55 1.325.157 0 .174-.14.21-.244a4.78 4.78 0 0 0 .157-.68l.35-2.614L15.9.034z"}),c.jsx("path",{fill:"#c2bfbf",d:"M16.754 28.845c.035-.4.227-.732.436-1.063-.21-.087-.366-.26-.488-.453a3.235 3.235 0 0 1-.26-.575c-.244-.732-.296-1.5-.366-2.248v-.453c-.087.07-.105.662-.105.75a17.37 17.37 0 0 1-.314 2.353c-.052.314-.087.627-.28.906 0 .035 0 .07.017.122.314.924.4 1.865.453 2.824v.35c0 .418-.017.33.33.47.14.052.296.07.436.174.105 0 .122-.087.122-.157l-.052-.575v-1.604c-.017-.28.035-.558.07-.82z"})]}),x=t.forwardRef((o,s)=>c.jsx(a,{ref:s,...o}));export{x as MongoDBIcon};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-BKvKC-12.js","./index-ci4XHjbJ.js","./index-CqS7zir1.css","./index-BeNby7qF.js","./index-BLROcaSz.js","./index-D0HmkH0H.js","./index-4eRtaV45.js","./index-mBjJYD9q.js","./index-DzeIsaBm.js","./index-BdYgKk1d.js","./index-CDFLVFB4.js","./index-DPX6X_bw.js","./index-BbsND1Qg.js","./index-3TJWUdmx.js","./index-DWkMJnbd.js","./index-BtJ2o21k.js","./index-Dpz3oBf5.js","./index-BejHxU5W.js","./index-CG7cp0nD.js","./index-BOEf7-ty.js","./index-hOkEW3JP.js","./index-C7x9R_Yo.js","./index-CvQ0w8Pj.js","./index-R7q8cAek.js","./index-Bxml6wXu.js","./index-BRWNIt9F.js","./index-r1LZg-PY.js","./index-DKEXZFUO.js","./index-CoUlHbtg.js","./index-CHFO5O4g.js","./index-CkSzjCqM.js","./index-VHmUHUUU.js","./index-Ba3RTMXI.js","./index-DWr_zPkx.js","./index-3uOAA_XX.js","./index-CkQ-bJ4G.js","./index-D-zkHcob.js","./index-BVtf6m9S.js","./index-BjENqyKe.js","./index-BVHvIhT5.js","./index-BQB-iDYl.js","./index-GODbXlHC.js","./index-DX7XsAcx.js","./index-DhzEUXfr.js","./index-DqSH4x-R.js","./index-Cpgkb0Q3.js","./index-rcdQpNcU.js","./index-C76aBV_h.js","./index-Bisa4IQF.js","./index-Uq2ij_SS.js","./index-B5ed-sAv.js","./index-BNbWMmAV.js","./index-BcgB3rXH.js","./index-DdzVmJHE.js","./index-BOYTBrh9.js","./index-D5PeCofu.js","./index-AY5Dm2mG.js","./index-BxWXWRmZ.js","./index-BxkZkBgQ.js","./index-IFGgPiye.js","./index-CF4dtI6S.js","./index-AlJ7td-D.js","./index-LrMzDsq9.js","./index-G_U_kPAd.js","./index-D0s9f6Re.js","./index-7xXgqu09.js","./index-DpQKtcXu.js","./index-D9eflZfP.js","./index-BsBWP-Dh.js","./index-C9N80hP8.js","./index-CWWo2zOA.js","./index-COL0eiWI.js","./index-DpJiH-Rk.js","./index-Ccb5B8zG.js","./index-DDNNv4C0.js","./index-ByFXr9Iq.js","./index-tOy_uloT.js","./index-Cx__T92e.js","./index-B8y58M9b.js","./index-B2ggrBuR.js","./index-B9Mo3ndZ.js","./index-BWq9GTzt.js","./index-DS9I4y48.js","./index-C7V5U9yH.js","./index-VZnN0P6C.js","./index-DIqSyDVO.js","./index-sS6XLk3j.js","./index-B-c82Fnu.js","./index-DztLFiip.js","./index-Du9aJK7m.js","./index-BJrY2Fiu.js","./index-Baka5dKE.js","./index-B536IPXH.js","./index-CMGZGIx_.js","./index-DHlEwAxb.js","./index-DtJyCbzF.js","./index-3qMh9x6K.js","./index-BEKoRwsX.js","./index-dkS0ek2S.js","./index-VcXZzovW.js","./index-js8ceOaP.js","./index-lKEJpUsF.js","./index-DasrI03Y.js","./index-BIkqesA-.js","./index-CJwYfDBz.js","./index-D87Zw62M.js","./SlackIcon-B260Qg_R.js","./index-Ym6gz0T6.js","./index-C2Xd7UkR.js","./index-BqUeOc7Y.js","./index-CwIxqYlT.js","./index-Ct9_T9ox.js","./index-C_1RBTul.js","./index-BEDxAk3N.js","./index-B8TlNgn-.js","./index-BlBl2tvQ.js","./index-DxIs8VSp.js","./index-DS1EgA10.js","./index-BnLT29qW.js","./index-DZzbmg3J.js","./Wikipedia-BB2mbgyd.js","./index-BdIWbCEL.js","./Wolfram-DytXC9hF.js","./index-Cd5zuUUK.js","./index-DyJDHm2D.js","./index-BXMhmvTj.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a8 as e}from"./index-ci4XHjbJ.js";const r={AIML:()=>e(()=>import("./index-BKvKC-12.js"),__vite__mapDeps([0,1,2]),import.meta.url).then(t=>({default:t.AIMLIcon})),AgentQL:()=>e(()=>import("./index-BeNby7qF.js"),__vite__mapDeps([3,1,2]),import.meta.url).then(t=>({default:t.AgentQLIcon})),Airbyte:()=>e(()=>import("./index-BLROcaSz.js"),__vite__mapDeps([4,1,2]),import.meta.url).then(t=>({default:t.AirbyteIcon})),Anthropic:()=>e(()=>import("./index-D0HmkH0H.js"),__vite__mapDeps([5,1,2]),import.meta.url).then(t=>({default:t.AnthropicIcon})),Apify:()=>e(()=>import("./index-4eRtaV45.js"),__vite__mapDeps([6,1,2]),import.meta.url).then(t=>({default:t.ApifyIcon})),ApifyWhite:()=>e(()=>import("./index-4eRtaV45.js"),__vite__mapDeps([6,1,2]),import.meta.url).then(t=>({default:t.ApifyWhiteIcon})),ArXiv:()=>e(()=>import("./index-mBjJYD9q.js"),__vite__mapDeps([7,1,2]),import.meta.url).then(t=>({default:t.ArXivIcon})),Arize:()=>e(()=>import("./index-DzeIsaBm.js"),__vite__mapDeps([8,1,2]),import.meta.url).then(t=>({default:t.ArizeIcon})),AssemblyAI:()=>e(()=>import("./index-BdYgKk1d.js"),__vite__mapDeps([9,1,2]),import.meta.url).then(t=>({default:t.AssemblyAIIcon})),AstraDB:()=>e(()=>import("./index-CDFLVFB4.js"),__vite__mapDeps([10,1,2]),import.meta.url).then(t=>({default:t.AstraDBIcon})),Athena:()=>e(()=>import("./index-DPX6X_bw.js"),__vite__mapDeps([11,1,2]),import.meta.url).then(t=>({default:t.AthenaIcon})),AWS:()=>e(()=>import("./index-BbsND1Qg.js"),__vite__mapDeps([12,1,2]),import.meta.url).then(t=>({default:t.AWSIcon})),AWSInverted:()=>e(()=>import("./index-3TJWUdmx.js"),__vite__mapDeps([13,1,2]),import.meta.url).then(t=>({default:t.AWSInvertedIcon})),Azure:()=>e(()=>import("./index-DWkMJnbd.js"),__vite__mapDeps([14,1,2]),import.meta.url).then(t=>({default:t.AzureIcon})),Bing:()=>e(()=>import("./index-BtJ2o21k.js"),__vite__mapDeps([15,1,2]),import.meta.url).then(t=>({default:t.BingIcon})),BotMessageSquareIcon:()=>e(()=>import("./index-ci4XHjbJ.js").then(t=>t.a9),__vite__mapDeps([1,2]),import.meta.url).then(t=>({default:t.BotMessageSquareIcon})),BWPython:()=>e(()=>import("./index-Dpz3oBf5.js"),__vite__mapDeps([16,1,2]),import.meta.url).then(t=>({default:t.BWPythonIcon})),Cassandra:()=>e(()=>import("./index-BejHxU5W.js"),__vite__mapDeps([17,1,2]),import.meta.url).then(t=>({default:t.CassandraIcon})),Chroma:()=>e(()=>import("./index-CG7cp0nD.js"),__vite__mapDeps([18,1,2]),import.meta.url).then(t=>({default:t.ChromaIcon})),Cleanlab:()=>e(()=>import("./index-BOEf7-ty.js"),__vite__mapDeps([19,1,2]),import.meta.url).then(t=>({default:t.CleanlabIcon})),Clickhouse:()=>e(()=>import("./index-hOkEW3JP.js"),__vite__mapDeps([20,1,2]),import.meta.url).then(t=>({default:t.ClickhouseIcon})),Cloudflare:()=>e(()=>import("./index-C7x9R_Yo.js"),__vite__mapDeps([21,1,2]),import.meta.url).then(t=>({default:t.CloudflareIcon})),Cohere:()=>e(()=>import("./index-CvQ0w8Pj.js"),__vite__mapDeps([22,1,2]),import.meta.url).then(t=>({default:t.CohereIcon})),Composio:()=>e(()=>import("./index-R7q8cAek.js"),__vite__mapDeps([23,1,2]),import.meta.url).then(t=>({default:t.ComposioIcon})),Confluence:()=>e(()=>import("./index-Bxml6wXu.js"),__vite__mapDeps([24,1,2]),import.meta.url).then(t=>({default:t.ConfluenceIcon})),Couchbase:()=>e(()=>import("./index-BRWNIt9F.js"),__vite__mapDeps([25,1,2]),import.meta.url).then(t=>({default:t.CouchbaseIcon})),Claude:()=>e(()=>import("./index-r1LZg-PY.js"),__vite__mapDeps([26,1,2]),import.meta.url).then(t=>({default:t.ClaudeIcon})),CrewAI:()=>e(()=>import("./index-DKEXZFUO.js"),__vite__mapDeps([27,1,2]),import.meta.url).then(t=>({default:t.CrewAiIcon})),Cursor:()=>e(()=>import("./index-CoUlHbtg.js"),__vite__mapDeps([28,1,2]),import.meta.url).then(t=>({default:t.CursorIcon})),DeepSeek:()=>e(()=>import("./index-CHFO5O4g.js"),__vite__mapDeps([29,1,2]),import.meta.url).then(t=>({default:t.DeepSeekIcon})),Docling:()=>e(()=>import("./index-CkSzjCqM.js"),__vite__mapDeps([30,1,2]),import.meta.url).then(t=>({default:t.DoclingIcon})),Dropbox:()=>e(()=>import("./index-VHmUHUUU.js"),__vite__mapDeps([31,1,2]),import.meta.url).then(t=>({default:t.DropboxIcon})),DuckDuckGo:()=>e(()=>import("./index-Ba3RTMXI.js"),__vite__mapDeps([32,1,2]),import.meta.url).then(t=>({default:t.DuckDuckGoIcon})),ElasticsearchStore:()=>e(()=>import("./index-DWr_zPkx.js"),__vite__mapDeps([33,1,2]),import.meta.url).then(t=>({default:t.ElasticsearchIcon})),Evernote:()=>e(()=>import("./index-3uOAA_XX.js"),__vite__mapDeps([34,1,2]),import.meta.url).then(t=>({default:t.EvernoteIcon})),Exa:()=>e(()=>import("./index-CkQ-bJ4G.js"),__vite__mapDeps([35,1,2]),import.meta.url).then(t=>({default:t.ExaIcon})),FacebookMessenger:()=>e(()=>import("./index-D-zkHcob.js"),__vite__mapDeps([36,1,2]),import.meta.url).then(t=>({default:t.FBIcon})),Firecrawl:()=>e(()=>import("./index-BVtf6m9S.js"),__vite__mapDeps([37,1,2]),import.meta.url).then(t=>({default:t.FirecrawlIcon})),FreezeAll:()=>e(()=>import("./index-BjENqyKe.js"),__vite__mapDeps([38,1,2]),import.meta.url).then(t=>({default:t.freezeAllIcon})),GitBook:()=>e(()=>import("./index-BVHvIhT5.js"),__vite__mapDeps([39,1,2]),import.meta.url).then(t=>({default:t.GitBookIcon})),GitLoader:()=>e(()=>import("./index-BQB-iDYl.js"),__vite__mapDeps([40,1,2]),import.meta.url).then(t=>({default:t.GitLoaderIcon})),Glean:()=>e(()=>import("./index-GODbXlHC.js"),__vite__mapDeps([41,1,2]),import.meta.url).then(t=>({default:t.GleanIcon})),GlobeOk:()=>e(()=>import("./index-DX7XsAcx.js"),__vite__mapDeps([42,1,2]),import.meta.url).then(t=>({default:t.GlobeOkIcon})),Google:()=>e(()=>import("./index-DhzEUXfr.js"),__vite__mapDeps([43,1,2]),import.meta.url).then(t=>({default:t.GoogleIcon})),GoogleDrive:()=>e(()=>import("./index-DqSH4x-R.js"),__vite__mapDeps([44,1,2]),import.meta.url).then(t=>({default:t.GoogleDriveIcon})),Googlemeet:()=>e(()=>import("./index-Cpgkb0Q3.js"),__vite__mapDeps([45,1,2]),import.meta.url).then(t=>({default:t.GooglemeetIcon})),GoogleTasks:()=>e(()=>import("./index-rcdQpNcU.js"),__vite__mapDeps([46,1,2]),import.meta.url).then(t=>({default:t.GoogleTasksIcon})),Googlesheets:()=>e(()=>import("./index-C76aBV_h.js"),__vite__mapDeps([47,1,2]),import.meta.url).then(t=>({default:t.GooglesheetsIcon})),GoogleGenerativeAI:()=>e(()=>import("./index-Bisa4IQF.js"),__vite__mapDeps([48,1,2]),import.meta.url).then(t=>({default:t.GoogleGenerativeAIIcon})),Gmail:()=>e(()=>import("./index-Uq2ij_SS.js"),__vite__mapDeps([49,1,2]),import.meta.url).then(t=>({default:t.GmailIcon})),Outlook:()=>e(()=>import("./index-B5ed-sAv.js"),__vite__mapDeps([50,1,2]),import.meta.url).then(t=>({default:t.OutlookIcon})),Googlecalendar:()=>e(()=>import("./index-BNbWMmAV.js"),__vite__mapDeps([51,1,2]),import.meta.url).then(t=>({default:t.GooglecalendarIcon})),GradientInfinity:()=>e(()=>import("./index-ci4XHjbJ.js").then(t=>t.aa),__vite__mapDeps([1,2]),import.meta.url).then(t=>({default:t.GradientInfinity})),Googlemaps:()=>e(()=>import("./index-BcgB3rXH.js"),__vite__mapDeps([52,1,2]),import.meta.url).then(t=>({default:t.GooglemapsIcon})),Todoist:()=>e(()=>import("./index-DdzVmJHE.js"),__vite__mapDeps([53,1,2]),import.meta.url).then(t=>({default:t.TodoistIcon})),Zoom:()=>e(()=>import("./index-BOYTBrh9.js"),__vite__mapDeps([54,1,2]),import.meta.url).then(t=>({default:t.ZoomIcon})),GradientUngroup:()=>e(()=>import("./index-ci4XHjbJ.js").then(t=>t.aa),__vite__mapDeps([1,2]),import.meta.url).then(t=>({default:t.GradientUngroup})),GradientSave:()=>e(()=>import("./index-ci4XHjbJ.js").then(t=>t.aa),__vite__mapDeps([1,2]),import.meta.url).then(t=>({default:t.GradientSave})),GridHorizontal:()=>e(()=>import("./index-D5PeCofu.js"),__vite__mapDeps([55,1,2]),import.meta.url).then(t=>({default:t.GridHorizontalIcon})),Groq:()=>e(()=>import("./index-AY5Dm2mG.js"),__vite__mapDeps([56,1,2]),import.meta.url).then(t=>({default:t.GroqIcon})),HackerNews:()=>e(()=>import("./index-BxWXWRmZ.js"),__vite__mapDeps([57,1,2]),import.meta.url).then(t=>({default:t.HackerNewsIcon})),HCD:()=>e(()=>import("./index-BxkZkBgQ.js"),__vite__mapDeps([58,1,2]),import.meta.url).then(t=>({default:t.HCDIcon})),HomeAssistant:()=>e(()=>import("./index-IFGgPiye.js"),__vite__mapDeps([59,1,2]),import.meta.url).then(t=>({default:t.HomeAssistantIcon})),HuggingFace:()=>e(()=>import("./index-CF4dtI6S.js"),__vite__mapDeps([60,1,2]),import.meta.url).then(t=>({default:t.HuggingFaceIcon})),Icosa:()=>e(()=>import("./index-AlJ7td-D.js"),__vite__mapDeps([61,1,2]),import.meta.url).then(t=>({default:t.IcosaIcon})),IFixIt:()=>e(()=>import("./index-LrMzDsq9.js"),__vite__mapDeps([62,1,2]),import.meta.url).then(t=>({default:t.IFixIcon})),javascript:()=>e(()=>import("./index-G_U_kPAd.js"),__vite__mapDeps([63,1,2]),import.meta.url).then(t=>({default:t.JSIcon})),JigsawStack:()=>e(()=>import("./index-D0s9f6Re.js"),__vite__mapDeps([64,1,2]),import.meta.url).then(t=>({default:t.JigsawStackIcon})),Linear:()=>e(()=>import("./index-7xXgqu09.js"),__vite__mapDeps([65,1,2]),import.meta.url).then(t=>({default:t.LinearIcon})),LangChain:()=>e(()=>import("./index-DpQKtcXu.js"),__vite__mapDeps([66,1,2]),import.meta.url).then(t=>({default:t.LangChainIcon})),Langwatch:()=>e(()=>import("./index-D9eflZfP.js"),__vite__mapDeps([67,1,2]),import.meta.url).then(t=>({default:t.LangwatchIcon})),LMStudio:()=>e(()=>import("./index-BsBWP-Dh.js"),__vite__mapDeps([68,1,2]),import.meta.url).then(t=>({default:t.LMStudioIcon})),Maritalk:()=>e(()=>import("./index-C9N80hP8.js"),__vite__mapDeps([69,1,2]),import.meta.url).then(t=>({default:t.MaritalkIcon})),Mcp:()=>e(()=>import("./index-CWWo2zOA.js"),__vite__mapDeps([70,1,2]),import.meta.url).then(t=>({default:t.McpIcon})),Mem0:()=>e(()=>import("./index-COL0eiWI.js"),__vite__mapDeps([71,1,2]),import.meta.url).then(t=>({default:t.Mem0})),Meta:()=>e(()=>import("./index-DpJiH-Rk.js"),__vite__mapDeps([72,1,2]),import.meta.url).then(t=>({default:t.MetaIcon})),Midjourney:()=>e(()=>import("./index-Ccb5B8zG.js"),__vite__mapDeps([73,1,2]),import.meta.url).then(t=>({default:t.MidjourneyIcon})),Milvus:()=>e(()=>import("./index-DDNNv4C0.js"),__vite__mapDeps([74,1,2]),import.meta.url).then(t=>({default:t.MilvusIcon})),Mistral:()=>e(()=>import("./index-ByFXr9Iq.js"),__vite__mapDeps([75,1,2]),import.meta.url).then(t=>({default:t.MistralIcon})),MongoDB:()=>e(()=>import("./index-tOy_uloT.js"),__vite__mapDeps([76,1,2]),import.meta.url).then(t=>({default:t.MongoDBIcon})),Needle:()=>e(()=>import("./index-Cx__T92e.js"),__vite__mapDeps([77,1,2]),import.meta.url).then(t=>({default:t.NeedleIcon})),NotDiamond:()=>e(()=>import("./index-B8y58M9b.js"),__vite__mapDeps([78,1,2]),import.meta.url).then(t=>({default:t.NotDiamondIcon})),Notion:()=>e(()=>import("./index-B2ggrBuR.js"),__vite__mapDeps([79,1,2]),import.meta.url).then(t=>({default:t.NotionIcon})),Novita:()=>e(()=>import("./index-B9Mo3ndZ.js"),__vite__mapDeps([80,1,2]),import.meta.url).then(t=>({default:t.NovitaIcon})),NVIDIA:()=>e(()=>import("./index-BWq9GTzt.js"),__vite__mapDeps([81,1,2]),import.meta.url).then(t=>({default:t.NvidiaIcon})),Olivya:()=>e(()=>import("./index-DS9I4y48.js"),__vite__mapDeps([82,1,2]),import.meta.url).then(t=>({default:t.OlivyaIcon})),Ollama:()=>e(()=>import("./index-C7V5U9yH.js"),__vite__mapDeps([83,1,2]),import.meta.url).then(t=>({default:t.OllamaIcon})),OpenAI:()=>e(()=>import("./index-VZnN0P6C.js"),__vite__mapDeps([84,1,2]),import.meta.url).then(t=>({default:t.OpenAiIcon})),OpenRouter:()=>e(()=>import("./index-DIqSyDVO.js"),__vite__mapDeps([85,1,2]),import.meta.url).then(t=>({default:t.OpenRouterIcon})),OpenSearch:()=>e(()=>import("./index-sS6XLk3j.js"),__vite__mapDeps([86,1,2]),import.meta.url).then(t=>({default:t.OpenSearch})),Perplexity:()=>e(()=>import("./index-B-c82Fnu.js"),__vite__mapDeps([87,1,2]),import.meta.url).then(t=>({default:t.PerplexityIcon})),Pinecone:()=>e(()=>import("./index-DztLFiip.js"),__vite__mapDeps([88,1,2]),import.meta.url).then(t=>({default:t.PineconeIcon})),Postgres:()=>e(()=>import("./index-Du9aJK7m.js"),__vite__mapDeps([89,1,2]),import.meta.url).then(t=>({default:t.PostgresIcon})),Python:()=>e(()=>import("./index-BJrY2Fiu.js"),__vite__mapDeps([90,1,2]),import.meta.url).then(t=>({default:t.PythonIcon})),QDrant:()=>e(()=>import("./index-Baka5dKE.js"),__vite__mapDeps([91,1,2]),import.meta.url).then(t=>({default:t.QDrantIcon})),QianFanChat:()=>e(()=>import("./index-B536IPXH.js"),__vite__mapDeps([92,1,2]),import.meta.url).then(t=>({default:t.QianFanChatIcon})),Redis:()=>e(()=>import("./index-CMGZGIx_.js"),__vite__mapDeps([93,1,2]),import.meta.url).then(t=>({default:t.RedisIcon})),Reddit:()=>e(()=>import("./index-DHlEwAxb.js"),__vite__mapDeps([94,1,2]),import.meta.url).then(t=>({default:t.RedditIcon})),SambaNova:()=>e(()=>import("./index-DtJyCbzF.js"),__vite__mapDeps([95,1,2]),import.meta.url).then(t=>({default:t.SambaNovaIcon})),ScrapeGraph:()=>e(()=>import("./index-3qMh9x6K.js"),__vite__mapDeps([96,1,2]),import.meta.url).then(t=>({default:t.ScrapeGraph})),SearchAPI:()=>e(()=>import("./index-BEKoRwsX.js"),__vite__mapDeps([97,1,2]),import.meta.url).then(t=>({default:t.SearchAPIIcon})),SearchLexical:()=>e(()=>import("./index-dkS0ek2S.js"),__vite__mapDeps([98,1,2]),import.meta.url).then(t=>({default:t.SearchLexicalIcon})),SearchHybrid:()=>e(()=>import("./index-VcXZzovW.js"),__vite__mapDeps([99,1,2]),import.meta.url).then(t=>({default:t.SearchHybridIcon})),SearchVector:()=>e(()=>import("./index-js8ceOaP.js"),__vite__mapDeps([100,1,2]),import.meta.url).then(t=>({default:t.SearchVectorIcon})),Searx:()=>e(()=>import("./index-lKEJpUsF.js"),__vite__mapDeps([101,1,2]),import.meta.url).then(t=>({default:t.SearxIcon})),SerpSearch:()=>e(()=>import("./index-DasrI03Y.js"),__vite__mapDeps([102,1,2]),import.meta.url).then(t=>({default:t.SerpSearchIcon})),Serper:()=>e(()=>import("./index-BIkqesA-.js"),__vite__mapDeps([103,1,2]),import.meta.url).then(t=>({default:t.SerperIcon})),Share:()=>e(()=>import("./index-CJwYfDBz.js"),__vite__mapDeps([104,1,2]),import.meta.url).then(t=>({default:t.ShareIcon})),Share2:()=>e(()=>import("./index-D87Zw62M.js"),__vite__mapDeps([105,1,2]),import.meta.url).then(t=>({default:t.Share2Icon})),Slack:()=>e(()=>import("./SlackIcon-B260Qg_R.js"),__vite__mapDeps([106,1,2]),import.meta.url).then(t=>({default:t.default})),Spider:()=>e(()=>import("./index-Ym6gz0T6.js"),__vite__mapDeps([107,1,2]),import.meta.url).then(t=>({default:t.SpiderIcon})),Streamlit:()=>e(()=>import("./index-C2Xd7UkR.js"),__vite__mapDeps([108,1,2]),import.meta.url).then(t=>({default:t.Streamlit})),Supabase:()=>e(()=>import("./index-BqUeOc7Y.js"),__vite__mapDeps([109,1,2]),import.meta.url).then(t=>({default:t.SupabaseIcon})),Tavily:()=>e(()=>import("./index-CwIxqYlT.js"),__vite__mapDeps([110,1,2]),import.meta.url).then(t=>({default:t.TavilyIcon})),ThumbDownCustom:()=>e(()=>import("./index-Ct9_T9ox.js"),__vite__mapDeps([111,1,2]),import.meta.url).then(t=>({default:t.ThumbDownIconCustom})),ThumbUpCustom:()=>e(()=>import("./index-Ct9_T9ox.js"),__vite__mapDeps([111,1,2]),import.meta.url).then(t=>({default:t.ThumbUpIconCustom})),TwelveLabs:()=>e(()=>import("./index-C_1RBTul.js"),__vite__mapDeps([112,1,2]),import.meta.url).then(t=>({default:t.TwelveLabsIcon})),TwitterX:()=>e(()=>import("./index-BEDxAk3N.js"),__vite__mapDeps([113,1,2]),import.meta.url).then(t=>({default:t.TwitterXIcon})),Unstructured:()=>e(()=>import("./index-B8TlNgn-.js"),__vite__mapDeps([114,1,2]),import.meta.url).then(t=>({default:t.UnstructuredIcon})),Upstash:()=>e(()=>import("./index-BlBl2tvQ.js"),__vite__mapDeps([115,1,2]),import.meta.url).then(t=>({default:t.UpstashSvgIcon})),Vectara:()=>e(()=>import("./index-DxIs8VSp.js"),__vite__mapDeps([116,1,2]),import.meta.url).then(t=>({default:t.VectaraIcon})),VertexAI:()=>e(()=>import("./index-DS1EgA10.js"),__vite__mapDeps([117,1,2]),import.meta.url).then(t=>({default:t.VertexAIIcon})),WatsonxAI:()=>e(()=>import("./index-BnLT29qW.js"),__vite__mapDeps([118,1,2]),import.meta.url).then(t=>({default:t.WatsonxAiIcon})),Weaviate:()=>e(()=>import("./index-DZzbmg3J.js"),__vite__mapDeps([119,1,2]),import.meta.url).then(t=>({default:t.WeaviateIcon})),Wikipedia:()=>e(()=>import("./Wikipedia-BB2mbgyd.js"),__vite__mapDeps([120,1,2]),import.meta.url).then(t=>({default:t.default})),Windsurf:()=>e(()=>import("./index-BdIWbCEL.js"),__vite__mapDeps([121,1,2]),import.meta.url).then(t=>({default:t.WindsurfIcon})),Wolfram:()=>e(()=>import("./Wolfram-DytXC9hF.js"),__vite__mapDeps([122,1,2]),import.meta.url).then(t=>({default:t.default})),xAI:()=>e(()=>import("./index-Cd5zuUUK.js"),__vite__mapDeps([123,1,2]),import.meta.url).then(t=>({default:t.XAIIcon})),YouTube:()=>e(()=>import("./index-DyJDHm2D.js"),__vite__mapDeps([124,1,2]),import.meta.url).then(t=>({default:t.YouTubeSvgIcon})),ZepMemory:()=>e(()=>import("./index-BXMhmvTj.js"),__vite__mapDeps([125,1,2]),import.meta.url).then(t=>({default:t.ZepMemoryIcon}))};export{r as lazyIconsMapping};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{U as a,a as o,g as r}from"./index-
|
|
1
|
+
import{U as a,a as o,g as r}from"./index-ci4XHjbJ.js";const U=s=>{const{mutate:t}=a();return t(["useAddUser"],async e=>(await o.post(`${r("USERS")}/`,e)).data,s)};export{U as u};
|
langflow/frontend/index.html
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
rel="stylesheet"
|
|
15
15
|
/>
|
|
16
16
|
<title>Langflow</title>
|
|
17
|
-
<script type="module" crossorigin src="./assets/index-
|
|
17
|
+
<script type="module" crossorigin src="./assets/index-ci4XHjbJ.js"></script>
|
|
18
18
|
<link rel="stylesheet" crossorigin href="./assets/index-CqS7zir1.css">
|
|
19
19
|
</head>
|
|
20
20
|
<body id="body" class="dark" style="width: 100%; height: 100%">
|
|
@@ -702,7 +702,7 @@
|
|
|
702
702
|
"last_updated": "2025-08-13T19:45:49.122Z",
|
|
703
703
|
"legacy": false,
|
|
704
704
|
"metadata": {
|
|
705
|
-
"code_hash": "
|
|
705
|
+
"code_hash": "e1ebcd66ecbc",
|
|
706
706
|
"module": "langflow.components.data.kb_ingest.KBIngestionComponent"
|
|
707
707
|
},
|
|
708
708
|
"minimized": false,
|
|
@@ -795,7 +795,7 @@
|
|
|
795
795
|
"show": true,
|
|
796
796
|
"title_case": false,
|
|
797
797
|
"type": "code",
|
|
798
|
-
"value": "from __future__ import annotations\n\nimport hashlib\nimport json\nimport re\nimport uuid\nfrom dataclasses import asdict, dataclass, field\nfrom datetime import datetime, timezone\nfrom pathlib import Path\nfrom typing import Any\n\nimport pandas as pd\nfrom cryptography.fernet import InvalidToken\nfrom langchain_chroma import Chroma\nfrom loguru import logger\n\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, DataFrameInput, DropdownInput, IntInput, Output, SecretStrInput, StrInput, TableInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dotdict import dotdict # noqa: TC001\nfrom langflow.schema.table import EditMode\nfrom langflow.services.auth.utils import decrypt_api_key, encrypt_api_key\nfrom langflow.services.deps import get_settings_service\n\nHUGGINGFACE_MODEL_NAMES = [\"sentence-transformers/all-MiniLM-L6-v2\", \"sentence-transformers/all-mpnet-base-v2\"]\nCOHERE_MODEL_NAMES = [\"embed-english-v3.0\", \"embed-multilingual-v3.0\"]\n\nsettings = get_settings_service().settings\nknowledge_directory = settings.knowledge_bases_dir\nif not knowledge_directory:\n msg = \"Knowledge bases directory is not set in the settings.\"\n raise ValueError(msg)\nKNOWLEDGE_BASES_ROOT_PATH = Path(knowledge_directory).expanduser()\n\n\nclass KBIngestionComponent(Component):\n \"\"\"Create or append to Langflow Knowledge from a DataFrame.\"\"\"\n\n # ------ UI metadata ---------------------------------------------------\n display_name = \"Knowledge Ingestion\"\n description = \"Create or update knowledge in Langflow.\"\n icon = \"database\"\n name = \"KBIngestion\"\n\n @dataclass\n class NewKnowledgeBaseInput:\n functionality: str = \"create\"\n fields: dict[str, dict] = field(\n default_factory=lambda: {\n \"data\": {\n \"node\": {\n \"name\": \"create_knowledge_base\",\n \"description\": \"Create new knowledge in Langflow.\",\n \"display_name\": \"Create new knowledge\",\n \"field_order\": [\"01_new_kb_name\", \"02_embedding_model\", \"03_api_key\"],\n \"template\": {\n \"01_new_kb_name\": StrInput(\n name=\"new_kb_name\",\n display_name=\"Knowledge Name\",\n info=\"Name of the new knowledge to create.\",\n required=True,\n ),\n \"02_embedding_model\": DropdownInput(\n name=\"embedding_model\",\n display_name=\"Model Name\",\n info=\"Select the embedding model to use for this knowledge base.\",\n required=True,\n options=OPENAI_EMBEDDING_MODEL_NAMES + HUGGINGFACE_MODEL_NAMES + COHERE_MODEL_NAMES,\n options_metadata=[{\"icon\": \"OpenAI\"} for _ in OPENAI_EMBEDDING_MODEL_NAMES]\n + [{\"icon\": \"HuggingFace\"} for _ in HUGGINGFACE_MODEL_NAMES]\n + [{\"icon\": \"Cohere\"} for _ in COHERE_MODEL_NAMES],\n ),\n \"03_api_key\": SecretStrInput(\n name=\"api_key\",\n display_name=\"API Key\",\n info=\"Provider API key for embedding model\",\n required=True,\n load_from_db=True,\n ),\n },\n },\n }\n }\n )\n\n # ------ Inputs --------------------------------------------------------\n inputs = [\n DropdownInput(\n name=\"knowledge_base\",\n display_name=\"Knowledge\",\n info=\"Select the knowledge to load data from.\",\n required=True,\n options=[\n str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(\".\") and d.is_dir()\n ]\n if KNOWLEDGE_BASES_ROOT_PATH.exists()\n else [],\n refresh_button=True,\n dialog_inputs=asdict(NewKnowledgeBaseInput()),\n ),\n DataFrameInput(\n name=\"input_df\",\n display_name=\"Data\",\n info=\"Table with all original columns (already chunked / processed).\",\n required=True,\n ),\n TableInput(\n name=\"column_config\",\n display_name=\"Column Configuration\",\n info=\"Configure column behavior for the knowledge base.\",\n required=True,\n table_schema=[\n {\n \"name\": \"column_name\",\n \"display_name\": \"Column Name\",\n \"type\": \"str\",\n \"description\": \"Name of the column in the source DataFrame\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"vectorize\",\n \"display_name\": \"Vectorize\",\n \"type\": \"boolean\",\n \"description\": \"Create embeddings for this column\",\n \"default\": False,\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"identifier\",\n \"display_name\": \"Identifier\",\n \"type\": \"boolean\",\n \"description\": \"Use this column as unique identifier\",\n \"default\": False,\n \"edit_mode\": EditMode.INLINE,\n },\n ],\n value=[\n {\n \"column_name\": \"text\",\n \"vectorize\": True,\n \"identifier\": False,\n }\n ],\n ),\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=\"Batch size for processing embeddings\",\n advanced=True,\n value=1000,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Embedding Provider API Key\",\n info=\"API key for the embedding provider to generate embeddings.\",\n advanced=True,\n required=False,\n ),\n BoolInput(\n name=\"allow_duplicates\",\n display_name=\"Allow Duplicates\",\n info=\"Allow duplicate rows in the knowledge base\",\n advanced=True,\n value=False,\n ),\n ]\n\n # ------ Outputs -------------------------------------------------------\n outputs = [Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"build_kb_info\")]\n\n # ------ Internal helpers ---------------------------------------------\n def _get_kb_root(self) -> Path:\n \"\"\"Return the root directory for knowledge bases.\"\"\"\n return KNOWLEDGE_BASES_ROOT_PATH\n\n def _validate_column_config(self, df_source: pd.DataFrame) -> list[dict[str, Any]]:\n \"\"\"Validate column configuration using Structured Output patterns.\"\"\"\n if not self.column_config:\n msg = \"Column configuration cannot be empty\"\n raise ValueError(msg)\n\n # Convert table input to list of dicts (similar to Structured Output)\n config_list = self.column_config if isinstance(self.column_config, list) else []\n\n # Validate column names exist in DataFrame\n df_columns = set(df_source.columns)\n for config in config_list:\n col_name = config.get(\"column_name\")\n if col_name not in df_columns and not self.silent_errors:\n msg = f\"Column '{col_name}' not found in DataFrame. Available columns: {sorted(df_columns)}\"\n self.log(f\"Warning: {msg}\")\n raise ValueError(msg)\n\n return config_list\n\n def _get_embedding_provider(self, embedding_model: str) -> str:\n \"\"\"Get embedding provider by matching model name to lists.\"\"\"\n if embedding_model in OPENAI_EMBEDDING_MODEL_NAMES:\n return \"OpenAI\"\n if embedding_model in HUGGINGFACE_MODEL_NAMES:\n return \"HuggingFace\"\n if embedding_model in COHERE_MODEL_NAMES:\n return \"Cohere\"\n return \"Custom\"\n\n def _build_embeddings(self, embedding_model: str, api_key: str):\n \"\"\"Build embedding model using provider patterns.\"\"\"\n # Get provider by matching model name to lists\n provider = self._get_embedding_provider(embedding_model)\n\n # Validate provider and model\n if provider == \"OpenAI\":\n from langchain_openai import OpenAIEmbeddings\n\n if not api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return OpenAIEmbeddings(\n model=embedding_model,\n api_key=api_key,\n chunk_size=self.chunk_size,\n )\n if provider == \"HuggingFace\":\n from langchain_huggingface import HuggingFaceEmbeddings\n\n return HuggingFaceEmbeddings(\n model=embedding_model,\n )\n if provider == \"Cohere\":\n from langchain_cohere import CohereEmbeddings\n\n if not api_key:\n msg = \"Cohere API key is required when using Cohere provider\"\n raise ValueError(msg)\n return CohereEmbeddings(\n model=embedding_model,\n cohere_api_key=api_key,\n )\n if provider == \"Custom\":\n # For custom embedding models, we would need additional configuration\n msg = \"Custom embedding models not yet supported\"\n raise NotImplementedError(msg)\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def _build_embedding_metadata(self, embedding_model, api_key) -> dict[str, Any]:\n \"\"\"Build embedding model metadata.\"\"\"\n # Get provider by matching model name to lists\n embedding_provider = self._get_embedding_provider(embedding_model)\n\n api_key_to_save = None\n if api_key and hasattr(api_key, \"get_secret_value\"):\n api_key_to_save = api_key.get_secret_value()\n elif isinstance(api_key, str):\n api_key_to_save = api_key\n\n encrypted_api_key = None\n if api_key_to_save:\n settings_service = get_settings_service()\n try:\n encrypted_api_key = encrypt_api_key(api_key_to_save, settings_service=settings_service)\n except (TypeError, ValueError) as e:\n self.log(f\"Could not encrypt API key: {e}\")\n logger.error(f\"Could not encrypt API key: {e}\")\n\n return {\n \"embedding_provider\": embedding_provider,\n \"embedding_model\": embedding_model,\n \"api_key\": encrypted_api_key,\n \"api_key_used\": bool(api_key),\n \"chunk_size\": self.chunk_size,\n \"created_at\": datetime.now(timezone.utc).isoformat(),\n }\n\n def _save_embedding_metadata(self, kb_path: Path, embedding_model: str, api_key: str) -> None:\n \"\"\"Save embedding model metadata.\"\"\"\n embedding_metadata = self._build_embedding_metadata(embedding_model, api_key)\n metadata_path = kb_path / \"embedding_metadata.json\"\n metadata_path.write_text(json.dumps(embedding_metadata, indent=2))\n\n def _save_kb_files(\n self,\n kb_path: Path,\n config_list: list[dict[str, Any]],\n ) -> None:\n \"\"\"Save KB files using File Component storage patterns.\"\"\"\n try:\n # Create directory (following File Component patterns)\n kb_path.mkdir(parents=True, exist_ok=True)\n\n # Save column configuration\n # Only do this if the file doesn't exist already\n cfg_path = kb_path / \"schema.json\"\n if not cfg_path.exists():\n cfg_path.write_text(json.dumps(config_list, indent=2))\n\n except Exception as e:\n if not self.silent_errors:\n raise\n self.log(f\"Error saving KB files: {e}\")\n\n def _build_column_metadata(self, config_list: list[dict[str, Any]], df_source: pd.DataFrame) -> dict[str, Any]:\n \"\"\"Build detailed column metadata.\"\"\"\n metadata: dict[str, Any] = {\n \"total_columns\": len(df_source.columns),\n \"mapped_columns\": len(config_list),\n \"unmapped_columns\": len(df_source.columns) - len(config_list),\n \"columns\": [],\n \"summary\": {\"vectorized_columns\": [], \"identifier_columns\": []},\n }\n\n for config in config_list:\n col_name = config.get(\"column_name\")\n vectorize = config.get(\"vectorize\") == \"True\" or config.get(\"vectorize\") is True\n identifier = config.get(\"identifier\") == \"True\" or config.get(\"identifier\") is True\n\n # Add to columns list\n metadata[\"columns\"].append(\n {\n \"name\": col_name,\n \"vectorize\": vectorize,\n \"identifier\": identifier,\n }\n )\n\n # Update summary\n if vectorize:\n metadata[\"summary\"][\"vectorized_columns\"].append(col_name)\n if identifier:\n metadata[\"summary\"][\"identifier_columns\"].append(col_name)\n\n return metadata\n\n def _create_vector_store(\n self, df_source: pd.DataFrame, config_list: list[dict[str, Any]], embedding_model: str, api_key: str\n ) -> None:\n \"\"\"Create vector store following Local DB component pattern.\"\"\"\n try:\n # Set up vector store directory\n base_dir = self._get_kb_root()\n\n vector_store_dir = base_dir / self.knowledge_base\n vector_store_dir.mkdir(parents=True, exist_ok=True)\n\n # Create embeddings model\n embedding_function = self._build_embeddings(embedding_model, api_key)\n\n # Convert DataFrame to Data objects (following Local DB pattern)\n data_objects = self._convert_df_to_data_objects(df_source, config_list)\n\n # Create vector store\n chroma = Chroma(\n persist_directory=str(vector_store_dir),\n embedding_function=embedding_function,\n collection_name=self.knowledge_base,\n )\n\n # Convert Data objects to LangChain Documents\n documents = []\n for data_obj in data_objects:\n doc = data_obj.to_lc_document()\n documents.append(doc)\n\n # Add documents to vector store\n if documents:\n chroma.add_documents(documents)\n self.log(f\"Added {len(documents)} documents to vector store '{self.knowledge_base}'\")\n\n except Exception as e:\n if not self.silent_errors:\n raise\n self.log(f\"Error creating vector store: {e}\")\n\n def _convert_df_to_data_objects(self, df_source: pd.DataFrame, config_list: list[dict[str, Any]]) -> list[Data]:\n \"\"\"Convert DataFrame to Data objects for vector store.\"\"\"\n data_objects: list[Data] = []\n\n # Set up vector store directory\n base_dir = self._get_kb_root()\n\n # If we don't allow duplicates, we need to get the existing hashes\n chroma = Chroma(\n persist_directory=str(base_dir / self.knowledge_base),\n collection_name=self.knowledge_base,\n )\n\n # Get all documents and their metadata\n all_docs = chroma.get()\n\n # Extract all _id values from metadata\n id_list = [metadata.get(\"_id\") for metadata in all_docs[\"metadatas\"] if metadata.get(\"_id\")]\n\n # Get column roles\n content_cols = []\n identifier_cols = []\n\n for config in config_list:\n col_name = config.get(\"column_name\")\n vectorize = config.get(\"vectorize\") == \"True\" or config.get(\"vectorize\") is True\n identifier = config.get(\"identifier\") == \"True\" or config.get(\"identifier\") is True\n\n if vectorize:\n content_cols.append(col_name)\n elif identifier:\n identifier_cols.append(col_name)\n\n # Convert each row to a Data object\n for _, row in df_source.iterrows():\n # Build content text from vectorized columns using list comprehension\n content_parts = [str(row[col]) for col in content_cols if col in row and pd.notna(row[col])]\n\n page_content = \" \".join(content_parts)\n\n # Build metadata from NON-vectorized columns only (simple key-value pairs)\n data_dict = {\n \"text\": page_content, # Main content for vectorization\n }\n\n # Add metadata columns as simple key-value pairs\n for col in df_source.columns:\n if col not in content_cols and col in row and pd.notna(row[col]):\n # Convert to simple types for Chroma metadata\n value = row[col]\n data_dict[col] = str(value) # Convert complex types to string\n\n # Hash the page_content for unique ID\n page_content_hash = hashlib.sha256(page_content.encode()).hexdigest()\n data_dict[\"_id\"] = page_content_hash\n\n # If duplicates are disallowed, and hash exists, prevent adding this row\n if not self.allow_duplicates and page_content_hash in id_list:\n self.log(f\"Skipping duplicate row with hash {page_content_hash}\")\n continue\n\n # Create Data object - everything except \"text\" becomes metadata\n data_obj = Data(data=data_dict)\n data_objects.append(data_obj)\n\n return data_objects\n\n def is_valid_collection_name(self, name, min_length: int = 3, max_length: int = 63) -> bool:\n \"\"\"Validates collection name against conditions 1-3.\n\n 1. Contains 3-63 characters\n 2. Starts and ends with alphanumeric character\n 3. Contains only alphanumeric characters, underscores, or hyphens.\n\n Args:\n name (str): Collection name to validate\n min_length (int): Minimum length of the name\n max_length (int): Maximum length of the name\n\n Returns:\n bool: True if valid, False otherwise\n \"\"\"\n # Check length (condition 1)\n if not (min_length <= len(name) <= max_length):\n return False\n\n # Check start/end with alphanumeric (condition 2)\n if not (name[0].isalnum() and name[-1].isalnum()):\n return False\n\n # Check allowed characters (condition 3)\n return re.match(r\"^[a-zA-Z0-9_-]+$\", name) is not None\n\n # ---------------------------------------------------------------------\n # OUTPUT METHODS\n # ---------------------------------------------------------------------\n def build_kb_info(self) -> Data:\n \"\"\"Main ingestion routine → returns a dict with KB metadata.\"\"\"\n try:\n # Get source DataFrame\n df_source: pd.DataFrame = self.input_df\n\n # Validate column configuration (using Structured Output patterns)\n config_list = self._validate_column_config(df_source)\n column_metadata = self._build_column_metadata(config_list, df_source)\n\n # Prepare KB folder (using File Component patterns)\n kb_root = self._get_kb_root()\n kb_path = kb_root / self.knowledge_base\n\n # Read the embedding info from the knowledge base folder\n metadata_path = kb_path / \"embedding_metadata.json\"\n\n # If the API key is not provided, try to read it from the metadata file\n if metadata_path.exists():\n settings_service = get_settings_service()\n metadata = json.loads(metadata_path.read_text())\n embedding_model = metadata.get(\"embedding_model\")\n try:\n api_key = decrypt_api_key(metadata[\"api_key\"], settings_service)\n except (InvalidToken, TypeError, ValueError) as e:\n logger.error(f\"Could not decrypt API key. Please provide it manually. Error: {e}\")\n\n # Check if a custom API key was provided, update metadata if so\n if self.api_key:\n api_key = self.api_key\n self._save_embedding_metadata(\n kb_path=kb_path,\n embedding_model=embedding_model,\n api_key=api_key,\n )\n\n # Create vector store following Local DB component pattern\n self._create_vector_store(df_source, config_list, embedding_model=embedding_model, api_key=api_key)\n\n # Save KB files (using File Component storage patterns)\n self._save_kb_files(kb_path, config_list)\n\n # Build metadata response\n meta: dict[str, Any] = {\n \"kb_id\": str(uuid.uuid4()),\n \"kb_name\": self.knowledge_base,\n \"rows\": len(df_source),\n \"column_metadata\": column_metadata,\n \"path\": str(kb_path),\n \"config_columns\": len(config_list),\n \"timestamp\": datetime.now(tz=timezone.utc).isoformat(),\n }\n\n # Set status message\n self.status = f\"✅ KB **{self.knowledge_base}** saved · {len(df_source)} chunks.\"\n\n return Data(data=meta)\n\n except Exception as e:\n if not self.silent_errors:\n raise\n self.log(f\"Error in KB ingestion: {e}\")\n self.status = f\"❌ KB ingestion failed: {e}\"\n return Data(data={\"error\": str(e), \"kb_name\": self.knowledge_base})\n\n def _get_knowledge_bases(self) -> list[str]:\n \"\"\"Retrieve a list of available knowledge bases.\n\n Returns:\n A list of knowledge base names.\n \"\"\"\n # Return the list of directories in the knowledge base root path\n kb_root_path = self._get_kb_root()\n\n if not kb_root_path.exists():\n return []\n\n return [str(d.name) for d in kb_root_path.iterdir() if not d.name.startswith(\".\") and d.is_dir()]\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n \"\"\"Update build configuration based on provider selection.\"\"\"\n # Create a new knowledge base\n if field_name == \"knowledge_base\":\n if isinstance(field_value, dict) and \"01_new_kb_name\" in field_value:\n # Validate the knowledge base name - Make sure it follows these rules:\n if not self.is_valid_collection_name(field_value[\"01_new_kb_name\"]):\n msg = f\"Invalid knowledge base name: {field_value['01_new_kb_name']}\"\n raise ValueError(msg)\n\n # We need to test the API Key one time against the embedding model\n embed_model = self._build_embeddings(\n embedding_model=field_value[\"02_embedding_model\"], api_key=field_value[\"03_api_key\"]\n )\n\n # Try to generate a dummy embedding to validate the API key\n embed_model.embed_query(\"test\")\n\n # Create the new knowledge base directory\n kb_path = KNOWLEDGE_BASES_ROOT_PATH / field_value[\"01_new_kb_name\"]\n kb_path.mkdir(parents=True, exist_ok=True)\n\n # Save the embedding metadata\n build_config[\"knowledge_base\"][\"value\"] = field_value[\"01_new_kb_name\"]\n self._save_embedding_metadata(\n kb_path=kb_path,\n embedding_model=field_value[\"02_embedding_model\"],\n api_key=field_value[\"03_api_key\"],\n )\n\n # Update the knowledge base options dynamically\n build_config[\"knowledge_base\"][\"options\"] = self._get_knowledge_bases()\n if build_config[\"knowledge_base\"][\"value\"] not in build_config[\"knowledge_base\"][\"options\"]:\n build_config[\"knowledge_base\"][\"value\"] = None\n\n return build_config\n"
|
|
798
|
+
"value": "from __future__ import annotations\n\nimport hashlib\nimport json\nimport re\nimport uuid\nfrom dataclasses import asdict, dataclass, field\nfrom datetime import datetime, timezone\nfrom pathlib import Path\nfrom typing import Any\n\nimport pandas as pd\nfrom cryptography.fernet import InvalidToken\nfrom langchain_chroma import Chroma\nfrom loguru import logger\n\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, DataFrameInput, DropdownInput, IntInput, Output, SecretStrInput, StrInput, TableInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dotdict import dotdict # noqa: TC001\nfrom langflow.schema.table import EditMode\nfrom langflow.services.auth.utils import decrypt_api_key, encrypt_api_key\nfrom langflow.services.deps import get_settings_service\n\nHUGGINGFACE_MODEL_NAMES = [\"sentence-transformers/all-MiniLM-L6-v2\", \"sentence-transformers/all-mpnet-base-v2\"]\nCOHERE_MODEL_NAMES = [\"embed-english-v3.0\", \"embed-multilingual-v3.0\"]\n\nsettings = get_settings_service().settings\nknowledge_directory = settings.knowledge_bases_dir\nif not knowledge_directory:\n msg = \"Knowledge bases directory is not set in the settings.\"\n raise ValueError(msg)\nKNOWLEDGE_BASES_ROOT_PATH = Path(knowledge_directory).expanduser()\n\n\nclass KBIngestionComponent(Component):\n \"\"\"Create or append to Langflow Knowledge from a DataFrame.\"\"\"\n\n # ------ UI metadata ---------------------------------------------------\n display_name = \"Knowledge Ingestion\"\n description = \"Create or update knowledge in Langflow.\"\n icon = \"database\"\n name = \"KBIngestion\"\n\n @dataclass\n class NewKnowledgeBaseInput:\n functionality: str = \"create\"\n fields: dict[str, dict] = field(\n default_factory=lambda: {\n \"data\": {\n \"node\": {\n \"name\": \"create_knowledge_base\",\n \"description\": \"Create new knowledge in Langflow.\",\n \"display_name\": \"Create new knowledge\",\n \"field_order\": [\"01_new_kb_name\", \"02_embedding_model\", \"03_api_key\"],\n \"template\": {\n \"01_new_kb_name\": StrInput(\n name=\"new_kb_name\",\n display_name=\"Knowledge Name\",\n info=\"Name of the new knowledge to create.\",\n required=True,\n ),\n \"02_embedding_model\": DropdownInput(\n name=\"embedding_model\",\n display_name=\"Model Name\",\n info=\"Select the embedding model to use for this knowledge base.\",\n required=True,\n options=OPENAI_EMBEDDING_MODEL_NAMES + HUGGINGFACE_MODEL_NAMES + COHERE_MODEL_NAMES,\n options_metadata=[{\"icon\": \"OpenAI\"} for _ in OPENAI_EMBEDDING_MODEL_NAMES]\n + [{\"icon\": \"HuggingFace\"} for _ in HUGGINGFACE_MODEL_NAMES]\n + [{\"icon\": \"Cohere\"} for _ in COHERE_MODEL_NAMES],\n ),\n \"03_api_key\": SecretStrInput(\n name=\"api_key\",\n display_name=\"API Key\",\n info=\"Provider API key for embedding model\",\n required=True,\n load_from_db=True,\n ),\n },\n },\n }\n }\n )\n\n # ------ Inputs --------------------------------------------------------\n inputs = [\n DropdownInput(\n name=\"knowledge_base\",\n display_name=\"Knowledge\",\n info=\"Select the knowledge to load data from.\",\n required=True,\n options=[\n str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(\".\") and d.is_dir()\n ]\n if KNOWLEDGE_BASES_ROOT_PATH.exists()\n else [],\n refresh_button=True,\n dialog_inputs=asdict(NewKnowledgeBaseInput()),\n ),\n DataFrameInput(\n name=\"input_df\",\n display_name=\"Data\",\n info=\"Table with all original columns (already chunked / processed).\",\n required=True,\n ),\n TableInput(\n name=\"column_config\",\n display_name=\"Column Configuration\",\n info=\"Configure column behavior for the knowledge base.\",\n required=True,\n table_schema=[\n {\n \"name\": \"column_name\",\n \"display_name\": \"Column Name\",\n \"type\": \"str\",\n \"description\": \"Name of the column in the source DataFrame\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"vectorize\",\n \"display_name\": \"Vectorize\",\n \"type\": \"boolean\",\n \"description\": \"Create embeddings for this column\",\n \"default\": False,\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"identifier\",\n \"display_name\": \"Identifier\",\n \"type\": \"boolean\",\n \"description\": \"Use this column as unique identifier\",\n \"default\": False,\n \"edit_mode\": EditMode.INLINE,\n },\n ],\n value=[\n {\n \"column_name\": \"text\",\n \"vectorize\": True,\n \"identifier\": True,\n },\n ],\n ),\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=\"Batch size for processing embeddings\",\n advanced=True,\n value=1000,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Embedding Provider API Key\",\n info=\"API key for the embedding provider to generate embeddings.\",\n advanced=True,\n required=False,\n ),\n BoolInput(\n name=\"allow_duplicates\",\n display_name=\"Allow Duplicates\",\n info=\"Allow duplicate rows in the knowledge base\",\n advanced=True,\n value=False,\n ),\n ]\n\n # ------ Outputs -------------------------------------------------------\n outputs = [Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"build_kb_info\")]\n\n # ------ Internal helpers ---------------------------------------------\n def _get_kb_root(self) -> Path:\n \"\"\"Return the root directory for knowledge bases.\"\"\"\n return KNOWLEDGE_BASES_ROOT_PATH\n\n def _validate_column_config(self, df_source: pd.DataFrame) -> list[dict[str, Any]]:\n \"\"\"Validate column configuration using Structured Output patterns.\"\"\"\n if not self.column_config:\n msg = \"Column configuration cannot be empty\"\n raise ValueError(msg)\n\n # Convert table input to list of dicts (similar to Structured Output)\n config_list = self.column_config if isinstance(self.column_config, list) else []\n\n # Validate column names exist in DataFrame\n df_columns = set(df_source.columns)\n for config in config_list:\n col_name = config.get(\"column_name\")\n if col_name not in df_columns:\n msg = f\"Column '{col_name}' not found in DataFrame. Available columns: {sorted(df_columns)}\"\n raise ValueError(msg)\n\n return config_list\n\n def _get_embedding_provider(self, embedding_model: str) -> str:\n \"\"\"Get embedding provider by matching model name to lists.\"\"\"\n if embedding_model in OPENAI_EMBEDDING_MODEL_NAMES:\n return \"OpenAI\"\n if embedding_model in HUGGINGFACE_MODEL_NAMES:\n return \"HuggingFace\"\n if embedding_model in COHERE_MODEL_NAMES:\n return \"Cohere\"\n return \"Custom\"\n\n def _build_embeddings(self, embedding_model: str, api_key: str):\n \"\"\"Build embedding model using provider patterns.\"\"\"\n # Get provider by matching model name to lists\n provider = self._get_embedding_provider(embedding_model)\n\n # Validate provider and model\n if provider == \"OpenAI\":\n from langchain_openai import OpenAIEmbeddings\n\n if not api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return OpenAIEmbeddings(\n model=embedding_model,\n api_key=api_key,\n chunk_size=self.chunk_size,\n )\n if provider == \"HuggingFace\":\n from langchain_huggingface import HuggingFaceEmbeddings\n\n return HuggingFaceEmbeddings(\n model=embedding_model,\n )\n if provider == \"Cohere\":\n from langchain_cohere import CohereEmbeddings\n\n if not api_key:\n msg = \"Cohere API key is required when using Cohere provider\"\n raise ValueError(msg)\n return CohereEmbeddings(\n model=embedding_model,\n cohere_api_key=api_key,\n )\n if provider == \"Custom\":\n # For custom embedding models, we would need additional configuration\n msg = \"Custom embedding models not yet supported\"\n raise NotImplementedError(msg)\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def _build_embedding_metadata(self, embedding_model, api_key) -> dict[str, Any]:\n \"\"\"Build embedding model metadata.\"\"\"\n # Get provider by matching model name to lists\n embedding_provider = self._get_embedding_provider(embedding_model)\n\n api_key_to_save = None\n if api_key and hasattr(api_key, \"get_secret_value\"):\n api_key_to_save = api_key.get_secret_value()\n elif isinstance(api_key, str):\n api_key_to_save = api_key\n\n encrypted_api_key = None\n if api_key_to_save:\n settings_service = get_settings_service()\n try:\n encrypted_api_key = encrypt_api_key(api_key_to_save, settings_service=settings_service)\n except (TypeError, ValueError) as e:\n self.log(f\"Could not encrypt API key: {e}\")\n logger.error(f\"Could not encrypt API key: {e}\")\n\n return {\n \"embedding_provider\": embedding_provider,\n \"embedding_model\": embedding_model,\n \"api_key\": encrypted_api_key,\n \"api_key_used\": bool(api_key),\n \"chunk_size\": self.chunk_size,\n \"created_at\": datetime.now(timezone.utc).isoformat(),\n }\n\n def _save_embedding_metadata(self, kb_path: Path, embedding_model: str, api_key: str) -> None:\n \"\"\"Save embedding model metadata.\"\"\"\n embedding_metadata = self._build_embedding_metadata(embedding_model, api_key)\n metadata_path = kb_path / \"embedding_metadata.json\"\n metadata_path.write_text(json.dumps(embedding_metadata, indent=2))\n\n def _save_kb_files(\n self,\n kb_path: Path,\n config_list: list[dict[str, Any]],\n ) -> None:\n \"\"\"Save KB files using File Component storage patterns.\"\"\"\n try:\n # Create directory (following File Component patterns)\n kb_path.mkdir(parents=True, exist_ok=True)\n\n # Save column configuration\n # Only do this if the file doesn't exist already\n cfg_path = kb_path / \"schema.json\"\n if not cfg_path.exists():\n cfg_path.write_text(json.dumps(config_list, indent=2))\n\n except (OSError, TypeError, ValueError) as e:\n self.log(f\"Error saving KB files: {e}\")\n\n def _build_column_metadata(self, config_list: list[dict[str, Any]], df_source: pd.DataFrame) -> dict[str, Any]:\n \"\"\"Build detailed column metadata.\"\"\"\n metadata: dict[str, Any] = {\n \"total_columns\": len(df_source.columns),\n \"mapped_columns\": len(config_list),\n \"unmapped_columns\": len(df_source.columns) - len(config_list),\n \"columns\": [],\n \"summary\": {\"vectorized_columns\": [], \"identifier_columns\": []},\n }\n\n for config in config_list:\n col_name = config.get(\"column_name\")\n vectorize = config.get(\"vectorize\") == \"True\" or config.get(\"vectorize\") is True\n identifier = config.get(\"identifier\") == \"True\" or config.get(\"identifier\") is True\n\n # Add to columns list\n metadata[\"columns\"].append(\n {\n \"name\": col_name,\n \"vectorize\": vectorize,\n \"identifier\": identifier,\n }\n )\n\n # Update summary\n if vectorize:\n metadata[\"summary\"][\"vectorized_columns\"].append(col_name)\n if identifier:\n metadata[\"summary\"][\"identifier_columns\"].append(col_name)\n\n return metadata\n\n def _create_vector_store(\n self, df_source: pd.DataFrame, config_list: list[dict[str, Any]], embedding_model: str, api_key: str\n ) -> None:\n \"\"\"Create vector store following Local DB component pattern.\"\"\"\n try:\n # Set up vector store directory\n base_dir = self._get_kb_root()\n\n vector_store_dir = base_dir / self.knowledge_base\n vector_store_dir.mkdir(parents=True, exist_ok=True)\n\n # Create embeddings model\n embedding_function = self._build_embeddings(embedding_model, api_key)\n\n # Convert DataFrame to Data objects (following Local DB pattern)\n data_objects = self._convert_df_to_data_objects(df_source, config_list)\n\n # Create vector store\n chroma = Chroma(\n persist_directory=str(vector_store_dir),\n embedding_function=embedding_function,\n collection_name=self.knowledge_base,\n )\n\n # Convert Data objects to LangChain Documents\n documents = []\n for data_obj in data_objects:\n doc = data_obj.to_lc_document()\n documents.append(doc)\n\n # Add documents to vector store\n if documents:\n chroma.add_documents(documents)\n self.log(f\"Added {len(documents)} documents to vector store '{self.knowledge_base}'\")\n\n except (OSError, ValueError, RuntimeError) as e:\n self.log(f\"Error creating vector store: {e}\")\n\n def _convert_df_to_data_objects(self, df_source: pd.DataFrame, config_list: list[dict[str, Any]]) -> list[Data]:\n \"\"\"Convert DataFrame to Data objects for vector store.\"\"\"\n data_objects: list[Data] = []\n\n # Set up vector store directory\n base_dir = self._get_kb_root()\n\n # If we don't allow duplicates, we need to get the existing hashes\n chroma = Chroma(\n persist_directory=str(base_dir / self.knowledge_base),\n collection_name=self.knowledge_base,\n )\n\n # Get all documents and their metadata\n all_docs = chroma.get()\n\n # Extract all _id values from metadata\n id_list = [metadata.get(\"_id\") for metadata in all_docs[\"metadatas\"] if metadata.get(\"_id\")]\n\n # Get column roles\n content_cols = []\n identifier_cols = []\n\n for config in config_list:\n col_name = config.get(\"column_name\")\n vectorize = config.get(\"vectorize\") == \"True\" or config.get(\"vectorize\") is True\n identifier = config.get(\"identifier\") == \"True\" or config.get(\"identifier\") is True\n\n if vectorize:\n content_cols.append(col_name)\n elif identifier:\n identifier_cols.append(col_name)\n\n # Convert each row to a Data object\n for _, row in df_source.iterrows():\n # Build content text from identifier columns using list comprehension\n identifier_parts = [str(row[col]) for col in content_cols if col in row and pd.notna(row[col])]\n\n # Join all parts into a single string\n page_content = \" \".join(identifier_parts)\n\n # Build metadata from NON-vectorized columns only (simple key-value pairs)\n data_dict = {\n \"text\": page_content, # Main content for vectorization\n }\n\n # Add identifier columns if they exist\n if identifier_cols:\n identifier_parts = [str(row[col]) for col in identifier_cols if col in row and pd.notna(row[col])]\n page_content = \" \".join(identifier_parts)\n\n # Add metadata columns as simple key-value pairs\n for col in df_source.columns:\n if col not in content_cols and col in row and pd.notna(row[col]):\n # Convert to simple types for Chroma metadata\n value = row[col]\n data_dict[col] = str(value) # Convert complex types to string\n\n # Hash the page_content for unique ID\n page_content_hash = hashlib.sha256(page_content.encode()).hexdigest()\n data_dict[\"_id\"] = page_content_hash\n\n # If duplicates are disallowed, and hash exists, prevent adding this row\n if not self.allow_duplicates and page_content_hash in id_list:\n self.log(f\"Skipping duplicate row with hash {page_content_hash}\")\n continue\n\n # Create Data object - everything except \"text\" becomes metadata\n data_obj = Data(data=data_dict)\n data_objects.append(data_obj)\n\n return data_objects\n\n def is_valid_collection_name(self, name, min_length: int = 3, max_length: int = 63) -> bool:\n \"\"\"Validates collection name against conditions 1-3.\n\n 1. Contains 3-63 characters\n 2. Starts and ends with alphanumeric character\n 3. Contains only alphanumeric characters, underscores, or hyphens.\n\n Args:\n name (str): Collection name to validate\n min_length (int): Minimum length of the name\n max_length (int): Maximum length of the name\n\n Returns:\n bool: True if valid, False otherwise\n \"\"\"\n # Check length (condition 1)\n if not (min_length <= len(name) <= max_length):\n return False\n\n # Check start/end with alphanumeric (condition 2)\n if not (name[0].isalnum() and name[-1].isalnum()):\n return False\n\n # Check allowed characters (condition 3)\n return re.match(r\"^[a-zA-Z0-9_-]+$\", name) is not None\n\n # ---------------------------------------------------------------------\n # OUTPUT METHODS\n # ---------------------------------------------------------------------\n def build_kb_info(self) -> Data:\n \"\"\"Main ingestion routine → returns a dict with KB metadata.\"\"\"\n try:\n # Get source DataFrame\n df_source: pd.DataFrame = self.input_df\n\n # Validate column configuration (using Structured Output patterns)\n config_list = self._validate_column_config(df_source)\n column_metadata = self._build_column_metadata(config_list, df_source)\n\n # Prepare KB folder (using File Component patterns)\n kb_root = self._get_kb_root()\n kb_path = kb_root / self.knowledge_base\n\n # Read the embedding info from the knowledge base folder\n metadata_path = kb_path / \"embedding_metadata.json\"\n\n # If the API key is not provided, try to read it from the metadata file\n if metadata_path.exists():\n settings_service = get_settings_service()\n metadata = json.loads(metadata_path.read_text())\n embedding_model = metadata.get(\"embedding_model\")\n try:\n api_key = decrypt_api_key(metadata[\"api_key\"], settings_service)\n except (InvalidToken, TypeError, ValueError) as e:\n logger.error(f\"Could not decrypt API key. Please provide it manually. Error: {e}\")\n\n # Check if a custom API key was provided, update metadata if so\n if self.api_key:\n api_key = self.api_key\n self._save_embedding_metadata(\n kb_path=kb_path,\n embedding_model=embedding_model,\n api_key=api_key,\n )\n\n # Create vector store following Local DB component pattern\n self._create_vector_store(df_source, config_list, embedding_model=embedding_model, api_key=api_key)\n\n # Save KB files (using File Component storage patterns)\n self._save_kb_files(kb_path, config_list)\n\n # Build metadata response\n meta: dict[str, Any] = {\n \"kb_id\": str(uuid.uuid4()),\n \"kb_name\": self.knowledge_base,\n \"rows\": len(df_source),\n \"column_metadata\": column_metadata,\n \"path\": str(kb_path),\n \"config_columns\": len(config_list),\n \"timestamp\": datetime.now(tz=timezone.utc).isoformat(),\n }\n\n # Set status message\n self.status = f\"✅ KB **{self.knowledge_base}** saved · {len(df_source)} chunks.\"\n\n return Data(data=meta)\n\n except (OSError, ValueError, RuntimeError, KeyError) as e:\n self.log(f\"Error in KB ingestion: {e}\")\n self.status = f\"❌ KB ingestion failed: {e}\"\n return Data(data={\"error\": str(e), \"kb_name\": self.knowledge_base})\n\n def _get_knowledge_bases(self) -> list[str]:\n \"\"\"Retrieve a list of available knowledge bases.\n\n Returns:\n A list of knowledge base names.\n \"\"\"\n # Return the list of directories in the knowledge base root path\n kb_root_path = self._get_kb_root()\n\n if not kb_root_path.exists():\n return []\n\n return [str(d.name) for d in kb_root_path.iterdir() if not d.name.startswith(\".\") and d.is_dir()]\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n \"\"\"Update build configuration based on provider selection.\"\"\"\n # Create a new knowledge base\n if field_name == \"knowledge_base\":\n if isinstance(field_value, dict) and \"01_new_kb_name\" in field_value:\n # Validate the knowledge base name - Make sure it follows these rules:\n if not self.is_valid_collection_name(field_value[\"01_new_kb_name\"]):\n msg = f\"Invalid knowledge base name: {field_value['01_new_kb_name']}\"\n raise ValueError(msg)\n\n # We need to test the API Key one time against the embedding model\n embed_model = self._build_embeddings(\n embedding_model=field_value[\"02_embedding_model\"], api_key=field_value[\"03_api_key\"]\n )\n\n # Try to generate a dummy embedding to validate the API key\n embed_model.embed_query(\"test\")\n\n # Create the new knowledge base directory\n kb_path = KNOWLEDGE_BASES_ROOT_PATH / field_value[\"01_new_kb_name\"]\n kb_path.mkdir(parents=True, exist_ok=True)\n\n # Save the embedding metadata\n build_config[\"knowledge_base\"][\"value\"] = field_value[\"01_new_kb_name\"]\n self._save_embedding_metadata(\n kb_path=kb_path,\n embedding_model=field_value[\"02_embedding_model\"],\n api_key=field_value[\"03_api_key\"],\n )\n\n # Update the knowledge base options dynamically\n build_config[\"knowledge_base\"][\"options\"] = self._get_knowledge_bases()\n if build_config[\"knowledge_base\"][\"value\"] not in build_config[\"knowledge_base\"][\"options\"]:\n build_config[\"knowledge_base\"][\"value\"] = None\n\n return build_config\n"
|
|
799
799
|
},
|
|
800
800
|
"column_config": {
|
|
801
801
|
"_input_type": "TableInput",
|
|
@@ -1208,7 +1208,7 @@
|
|
|
1208
1208
|
"legacy": false,
|
|
1209
1209
|
"lf_version": "1.4.3",
|
|
1210
1210
|
"metadata": {
|
|
1211
|
-
"code_hash": "
|
|
1211
|
+
"code_hash": "d9af728ce02a",
|
|
1212
1212
|
"module": "langflow.components.processing.save_file.SaveToFileComponent"
|
|
1213
1213
|
},
|
|
1214
1214
|
"minimized": false,
|
|
@@ -1232,6 +1232,23 @@
|
|
|
1232
1232
|
"pinned": false,
|
|
1233
1233
|
"template": {
|
|
1234
1234
|
"_type": "Component",
|
|
1235
|
+
"api_key": {
|
|
1236
|
+
"_input_type": "SecretStrInput",
|
|
1237
|
+
"advanced": true,
|
|
1238
|
+
"display_name": "Langflow API Key",
|
|
1239
|
+
"dynamic": false,
|
|
1240
|
+
"info": "Langflow API key for authentication when saving the file.",
|
|
1241
|
+
"input_types": [],
|
|
1242
|
+
"load_from_db": true,
|
|
1243
|
+
"name": "api_key",
|
|
1244
|
+
"password": true,
|
|
1245
|
+
"placeholder": "",
|
|
1246
|
+
"required": false,
|
|
1247
|
+
"show": true,
|
|
1248
|
+
"title_case": false,
|
|
1249
|
+
"type": "str",
|
|
1250
|
+
"value": ""
|
|
1251
|
+
},
|
|
1235
1252
|
"code": {
|
|
1236
1253
|
"advanced": true,
|
|
1237
1254
|
"dynamic": true,
|
|
@@ -1248,7 +1265,7 @@
|
|
|
1248
1265
|
"show": true,
|
|
1249
1266
|
"title_case": false,
|
|
1250
1267
|
"type": "code",
|
|
1251
|
-
"value": "import json\nfrom collections.abc import AsyncIterator, Iterator\nfrom pathlib import Path\n\nimport orjson\nimport pandas as pd\nfrom fastapi import UploadFile\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.api.v2.files import upload_user_file\nfrom langflow.custom import Component\nfrom langflow.io import DropdownInput, HandleInput, StrInput\nfrom langflow.schema import Data, DataFrame, Message\nfrom langflow.services.auth.utils import create_user_longterm_token\nfrom langflow.services.database.models.user.crud import get_user_by_id\nfrom langflow.services.deps import get_session, get_settings_service, get_storage_service\nfrom langflow.template.field.base import Output\n\n\nclass SaveToFileComponent(Component):\n display_name = \"Save File\"\n description = \"Save data to a local file in the selected format.\"\n documentation: str = \"https://docs.langflow.org/components-processing#save-file\"\n icon = \"save\"\n name = \"SaveToFile\"\n\n # File format options for different types\n DATA_FORMAT_CHOICES = [\"csv\", \"excel\", \"json\", \"markdown\"]\n MESSAGE_FORMAT_CHOICES = [\"txt\", \"json\", \"markdown\"]\n\n inputs = [\n HandleInput(\n name=\"input\",\n display_name=\"Input\",\n info=\"The input to save.\",\n dynamic=True,\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\n ),\n StrInput(\n name=\"file_name\",\n display_name=\"File Name\",\n info=\"Name file will be saved as (without extension).\",\n required=True,\n ),\n DropdownInput(\n name=\"file_format\",\n display_name=\"File Format\",\n options=list(dict.fromkeys(DATA_FORMAT_CHOICES + MESSAGE_FORMAT_CHOICES)),\n info=\"Select the file format to save the input. If not provided, the default format will be used.\",\n value=\"\",\n advanced=True,\n ),\n ]\n\n outputs = [Output(display_name=\"File Path\", name=\"message\", method=\"save_to_file\")]\n\n async def save_to_file(self) -> Message:\n \"\"\"Save the input to a file and upload it, returning a confirmation message.\"\"\"\n # Validate inputs\n if not self.file_name:\n msg = \"File name must be provided.\"\n raise ValueError(msg)\n if not self._get_input_type():\n msg = \"Input type is not set.\"\n raise ValueError(msg)\n\n # Validate file format based on input type\n file_format = self.file_format or self._get_default_format()\n allowed_formats = (\n self.MESSAGE_FORMAT_CHOICES if self._get_input_type() == \"Message\" else self.DATA_FORMAT_CHOICES\n )\n if file_format not in allowed_formats:\n msg = f\"Invalid file format '{file_format}' for {self._get_input_type()}. Allowed: {allowed_formats}\"\n raise ValueError(msg)\n\n # Prepare file path\n file_path = Path(self.file_name).expanduser()\n if not file_path.parent.exists():\n file_path.parent.mkdir(parents=True, exist_ok=True)\n file_path = self._adjust_file_path_with_format(file_path, file_format)\n\n # Save the input to file based on type\n if self._get_input_type() == \"DataFrame\":\n confirmation = self._save_dataframe(self.input, file_path, file_format)\n elif self._get_input_type() == \"Data\":\n confirmation = self._save_data(self.input, file_path, file_format)\n elif self._get_input_type() == \"Message\":\n confirmation = await self._save_message(self.input, file_path, file_format)\n else:\n msg = f\"Unsupported input type: {self._get_input_type()}\"\n raise ValueError(msg)\n\n # Upload the saved file\n await self._upload_file(file_path)\n\n # Return the final file path and confirmation message\n final_path = Path.cwd() / file_path if not file_path.is_absolute() else file_path\n\n return Message(text=f\"{confirmation} at {final_path}\")\n\n def _get_input_type(self) -> str:\n \"\"\"Determine the input type based on the provided input.\"\"\"\n # Use exact type checking (type() is) instead of isinstance() to avoid inheritance issues.\n # Since Message inherits from Data, isinstance(message, Data) would return True for Message objects,\n # causing Message inputs to be incorrectly identified as Data type.\n if type(self.input) is DataFrame:\n return \"DataFrame\"\n if type(self.input) is Message:\n return \"Message\"\n if type(self.input) is Data:\n return \"Data\"\n msg = f\"Unsupported input type: {type(self.input)}\"\n raise ValueError(msg)\n\n def _get_default_format(self) -> str:\n \"\"\"Return the default file format based on input type.\"\"\"\n if self._get_input_type() == \"DataFrame\":\n return \"csv\"\n if self._get_input_type() == \"Data\":\n return \"json\"\n if self._get_input_type() == \"Message\":\n return \"json\"\n return \"json\" # Fallback\n\n def _adjust_file_path_with_format(self, path: Path, fmt: str) -> Path:\n \"\"\"Adjust the file path to include the correct extension.\"\"\"\n file_extension = path.suffix.lower().lstrip(\".\")\n if fmt == \"excel\":\n return Path(f\"{path}.xlsx\").expanduser() if file_extension not in [\"xlsx\", \"xls\"] else path\n return Path(f\"{path}.{fmt}\").expanduser() if file_extension != fmt else path\n\n async def _upload_file(self, file_path: Path) -> None:\n \"\"\"Upload the saved file using the upload_user_file service.\"\"\"\n if not file_path.exists():\n msg = f\"File not found: {file_path}\"\n raise FileNotFoundError(msg)\n\n with file_path.open(\"rb\") as f:\n async for db in get_session():\n user_id, _ = await create_user_longterm_token(db)\n current_user = await get_user_by_id(db, user_id)\n\n await upload_user_file(\n file=UploadFile(filename=file_path.name, file=f, size=file_path.stat().st_size),\n session=db,\n current_user=current_user,\n storage_service=get_storage_service(),\n settings_service=get_settings_service(),\n )\n\n def _save_dataframe(self, dataframe: DataFrame, path: Path, fmt: str) -> str:\n \"\"\"Save a DataFrame to the specified file format.\"\"\"\n if fmt == \"csv\":\n dataframe.to_csv(path, index=False)\n elif fmt == \"excel\":\n dataframe.to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n dataframe.to_json(path, orient=\"records\", indent=2)\n elif fmt == \"markdown\":\n path.write_text(dataframe.to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported DataFrame format: {fmt}\"\n raise ValueError(msg)\n return f\"DataFrame saved successfully as '{path}'\"\n\n def _save_data(self, data: Data, path: Path, fmt: str) -> str:\n \"\"\"Save a Data object to the specified file format.\"\"\"\n if fmt == \"csv\":\n pd.DataFrame(data.data).to_csv(path, index=False)\n elif fmt == \"excel\":\n pd.DataFrame(data.data).to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n path.write_text(\n orjson.dumps(jsonable_encoder(data.data), option=orjson.OPT_INDENT_2).decode(\"utf-8\"), encoding=\"utf-8\"\n )\n elif fmt == \"markdown\":\n path.write_text(pd.DataFrame(data.data).to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Data format: {fmt}\"\n raise ValueError(msg)\n return f\"Data saved successfully as '{path}'\"\n\n async def _save_message(self, message: Message, path: Path, fmt: str) -> str:\n \"\"\"Save a Message to the specified file format, handling async iterators.\"\"\"\n content = \"\"\n if message.text is None:\n content = \"\"\n elif isinstance(message.text, AsyncIterator):\n async for item in message.text:\n content += str(item) + \" \"\n content = content.strip()\n elif isinstance(message.text, Iterator):\n content = \" \".join(str(item) for item in message.text)\n else:\n content = str(message.text)\n\n if fmt == \"txt\":\n path.write_text(content, encoding=\"utf-8\")\n elif fmt == \"json\":\n path.write_text(json.dumps({\"message\": content}, indent=2), encoding=\"utf-8\")\n elif fmt == \"markdown\":\n path.write_text(f\"**Message:**\\n\\n{content}\", encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Message format: {fmt}\"\n raise ValueError(msg)\n return f\"Message saved successfully as '{path}'\"\n"
|
|
1268
|
+
"value": "import json\nfrom collections.abc import AsyncIterator, Iterator\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nimport orjson\nimport pandas as pd\nfrom fastapi import UploadFile\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.api.v2.files import upload_user_file\nfrom langflow.custom import Component\nfrom langflow.io import DropdownInput, HandleInput, SecretStrInput, StrInput\nfrom langflow.schema import Data, DataFrame, Message\nfrom langflow.services.auth.utils import create_user_longterm_token, get_current_user\nfrom langflow.services.database.models.user.crud import get_user_by_id\nfrom langflow.services.deps import get_session, get_settings_service, get_storage_service\nfrom langflow.template.field.base import Output\n\nif TYPE_CHECKING:\n from langflow.services.database.models.user.model import User\n\n\nclass SaveToFileComponent(Component):\n display_name = \"Save File\"\n description = \"Save data to a local file in the selected format.\"\n documentation: str = \"https://docs.langflow.org/components-processing#save-file\"\n icon = \"save\"\n name = \"SaveToFile\"\n\n # File format options for different types\n DATA_FORMAT_CHOICES = [\"csv\", \"excel\", \"json\", \"markdown\"]\n MESSAGE_FORMAT_CHOICES = [\"txt\", \"json\", \"markdown\"]\n\n inputs = [\n HandleInput(\n name=\"input\",\n display_name=\"Input\",\n info=\"The input to save.\",\n dynamic=True,\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\n ),\n StrInput(\n name=\"file_name\",\n display_name=\"File Name\",\n info=\"Name file will be saved as (without extension).\",\n required=True,\n ),\n DropdownInput(\n name=\"file_format\",\n display_name=\"File Format\",\n options=list(dict.fromkeys(DATA_FORMAT_CHOICES + MESSAGE_FORMAT_CHOICES)),\n info=\"Select the file format to save the input. If not provided, the default format will be used.\",\n value=\"\",\n advanced=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Langflow API Key\",\n info=\"Langflow API key for authentication when saving the file.\",\n required=False,\n advanced=True,\n ),\n ]\n\n outputs = [Output(display_name=\"File Path\", name=\"message\", method=\"save_to_file\")]\n\n async def save_to_file(self) -> Message:\n \"\"\"Save the input to a file and upload it, returning a confirmation message.\"\"\"\n # Validate inputs\n if not self.file_name:\n msg = \"File name must be provided.\"\n raise ValueError(msg)\n if not self._get_input_type():\n msg = \"Input type is not set.\"\n raise ValueError(msg)\n\n # Validate file format based on input type\n file_format = self.file_format or self._get_default_format()\n allowed_formats = (\n self.MESSAGE_FORMAT_CHOICES if self._get_input_type() == \"Message\" else self.DATA_FORMAT_CHOICES\n )\n if file_format not in allowed_formats:\n msg = f\"Invalid file format '{file_format}' for {self._get_input_type()}. Allowed: {allowed_formats}\"\n raise ValueError(msg)\n\n # Prepare file path\n file_path = Path(self.file_name).expanduser()\n if not file_path.parent.exists():\n file_path.parent.mkdir(parents=True, exist_ok=True)\n file_path = self._adjust_file_path_with_format(file_path, file_format)\n\n # Save the input to file based on type\n if self._get_input_type() == \"DataFrame\":\n confirmation = self._save_dataframe(self.input, file_path, file_format)\n elif self._get_input_type() == \"Data\":\n confirmation = self._save_data(self.input, file_path, file_format)\n elif self._get_input_type() == \"Message\":\n confirmation = await self._save_message(self.input, file_path, file_format)\n else:\n msg = f\"Unsupported input type: {self._get_input_type()}\"\n raise ValueError(msg)\n\n # Upload the saved file\n await self._upload_file(file_path)\n\n # Return the final file path and confirmation message\n final_path = Path.cwd() / file_path if not file_path.is_absolute() else file_path\n\n return Message(text=f\"{confirmation} at {final_path}\")\n\n def _get_input_type(self) -> str:\n \"\"\"Determine the input type based on the provided input.\"\"\"\n # Use exact type checking (type() is) instead of isinstance() to avoid inheritance issues.\n # Since Message inherits from Data, isinstance(message, Data) would return True for Message objects,\n # causing Message inputs to be incorrectly identified as Data type.\n if type(self.input) is DataFrame:\n return \"DataFrame\"\n if type(self.input) is Message:\n return \"Message\"\n if type(self.input) is Data:\n return \"Data\"\n msg = f\"Unsupported input type: {type(self.input)}\"\n raise ValueError(msg)\n\n def _get_default_format(self) -> str:\n \"\"\"Return the default file format based on input type.\"\"\"\n if self._get_input_type() == \"DataFrame\":\n return \"csv\"\n if self._get_input_type() == \"Data\":\n return \"json\"\n if self._get_input_type() == \"Message\":\n return \"json\"\n return \"json\" # Fallback\n\n def _adjust_file_path_with_format(self, path: Path, fmt: str) -> Path:\n \"\"\"Adjust the file path to include the correct extension.\"\"\"\n file_extension = path.suffix.lower().lstrip(\".\")\n if fmt == \"excel\":\n return Path(f\"{path}.xlsx\").expanduser() if file_extension not in [\"xlsx\", \"xls\"] else path\n return Path(f\"{path}.{fmt}\").expanduser() if file_extension != fmt else path\n\n async def _upload_file(self, file_path: Path) -> None:\n \"\"\"Upload the saved file using the upload_user_file service.\"\"\"\n if not file_path.exists():\n msg = f\"File not found: {file_path}\"\n raise FileNotFoundError(msg)\n\n with file_path.open(\"rb\") as f:\n async for db in get_session():\n # TODO: In 1.6, this may need to be removed or adjusted\n # Try to get the super user token, if possible\n current_user: User | None = None\n if self.api_key:\n current_user = await get_current_user(\n token=\"\",\n query_param=self.api_key,\n header_param=\"\",\n db=db,\n )\n else:\n user_id, _ = await create_user_longterm_token(db)\n current_user = await get_user_by_id(db, user_id)\n\n # Fail if the user is not found\n if not current_user:\n msg = \"User not found. Please provide a valid API key or ensure the user exists.\"\n raise ValueError(msg)\n\n await upload_user_file(\n file=UploadFile(filename=file_path.name, file=f, size=file_path.stat().st_size),\n session=db,\n current_user=current_user,\n storage_service=get_storage_service(),\n settings_service=get_settings_service(),\n )\n\n def _save_dataframe(self, dataframe: DataFrame, path: Path, fmt: str) -> str:\n \"\"\"Save a DataFrame to the specified file format.\"\"\"\n if fmt == \"csv\":\n dataframe.to_csv(path, index=False)\n elif fmt == \"excel\":\n dataframe.to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n dataframe.to_json(path, orient=\"records\", indent=2)\n elif fmt == \"markdown\":\n path.write_text(dataframe.to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported DataFrame format: {fmt}\"\n raise ValueError(msg)\n return f\"DataFrame saved successfully as '{path}'\"\n\n def _save_data(self, data: Data, path: Path, fmt: str) -> str:\n \"\"\"Save a Data object to the specified file format.\"\"\"\n if fmt == \"csv\":\n pd.DataFrame(data.data).to_csv(path, index=False)\n elif fmt == \"excel\":\n pd.DataFrame(data.data).to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n path.write_text(\n orjson.dumps(jsonable_encoder(data.data), option=orjson.OPT_INDENT_2).decode(\"utf-8\"), encoding=\"utf-8\"\n )\n elif fmt == \"markdown\":\n path.write_text(pd.DataFrame(data.data).to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Data format: {fmt}\"\n raise ValueError(msg)\n return f\"Data saved successfully as '{path}'\"\n\n async def _save_message(self, message: Message, path: Path, fmt: str) -> str:\n \"\"\"Save a Message to the specified file format, handling async iterators.\"\"\"\n content = \"\"\n if message.text is None:\n content = \"\"\n elif isinstance(message.text, AsyncIterator):\n async for item in message.text:\n content += str(item) + \" \"\n content = content.strip()\n elif isinstance(message.text, Iterator):\n content = \" \".join(str(item) for item in message.text)\n else:\n content = str(message.text)\n\n if fmt == \"txt\":\n path.write_text(content, encoding=\"utf-8\")\n elif fmt == \"json\":\n path.write_text(json.dumps({\"message\": content}, indent=2), encoding=\"utf-8\")\n elif fmt == \"markdown\":\n path.write_text(f\"**Message:**\\n\\n{content}\", encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Message format: {fmt}\"\n raise ValueError(msg)\n return f\"Message saved successfully as '{path}'\"\n"
|
|
1252
1269
|
},
|
|
1253
1270
|
"file_format": {
|
|
1254
1271
|
"_input_type": "DropdownInput",
|