From eda3e7d77db022456138c36e57c98be7b9d3efdf Mon Sep 17 00:00:00 2001 From: chenyangzhao Date: Fri, 30 May 2025 17:20:30 +0800 Subject: [PATCH] filegenerator --- Organization/filegenerator.signed.difypkg | Bin 0 -> 10168 bytes Organization/filegenerator/.difyignore | 179 ++++++++++++++++++ Organization/filegenerator/.env.example | 3 + .../.github/workflows/plugin-publish.yml | 109 +++++++++++ Organization/filegenerator/.gitignore | 176 +++++++++++++++++ Organization/filegenerator/GUIDE.md | 148 +++++++++++++++ Organization/filegenerator/PRIVACY.md | 3 + Organization/filegenerator/README.md | 10 + Organization/filegenerator/_assets/icon.svg | 6 + Organization/filegenerator/main.py | 6 + Organization/filegenerator/manifest.yaml | 48 +++++ .../filegenerator/provider/filegenerator.py | 15 ++ .../filegenerator/provider/filegenerator.yaml | 17 ++ Organization/filegenerator/requirements.txt | 2 + .../filegenerator/tools/filegenerator.py | 68 +++++++ .../filegenerator/tools/filegenerator.yaml | 55 ++++++ 16 files changed, 845 insertions(+) create mode 100644 Organization/filegenerator.signed.difypkg create mode 100644 Organization/filegenerator/.difyignore create mode 100644 Organization/filegenerator/.env.example create mode 100644 Organization/filegenerator/.github/workflows/plugin-publish.yml create mode 100644 Organization/filegenerator/.gitignore create mode 100644 Organization/filegenerator/GUIDE.md create mode 100644 Organization/filegenerator/PRIVACY.md create mode 100644 Organization/filegenerator/README.md create mode 100644 Organization/filegenerator/_assets/icon.svg create mode 100644 Organization/filegenerator/main.py create mode 100644 Organization/filegenerator/manifest.yaml create mode 100644 Organization/filegenerator/provider/filegenerator.py create mode 100644 Organization/filegenerator/provider/filegenerator.yaml create mode 100644 Organization/filegenerator/requirements.txt create mode 100644 Organization/filegenerator/tools/filegenerator.py create mode 100644 Organization/filegenerator/tools/filegenerator.yaml diff --git a/Organization/filegenerator.signed.difypkg b/Organization/filegenerator.signed.difypkg new file mode 100644 index 0000000000000000000000000000000000000000..18d80e9250f76a97f68c17809cc4180629406281 GIT binary patch literal 10168 zcmaJ{bzGF+(x*EGDG6z$yAc*xx*HT^VHa3xVRvZ|K}x!n?glYH>5}da>F$sa3wYP} z{oJ3v-s_$HoIjpDJ9FmDGjnFXJ4a6w6N?fJ5B2$z2vJ|~gQ0dlP$#=Z1HdZ%#1j?^)}ID_LZEuriXUEbi9)SbTjG z-tfJ(#(~=Tp2p!yw#LxpNQz`|5O}eGfr~^V&}^?)|3U;CmfS;uqr*U=B-C$Mrs8wI zr)`?LU>eeVjkPzw9TzCbJ@+t5A2KC5=RE17O!P+lV>CytZNtD?mNk+x&N;c*tehCV z*|P_j@%DHcIQcc>F6AM|py?7%4$(_Q=~!RStErF95s(3i{#|CSJa8 z5@OBD8z$KEDBk7-VUhybH7r*EGbJCp88J-`_SA~blE;jPHRp|Gz6cqFMivF5_izq+ zD)hdPoXPK&#_r)PKyIRj^K#VencDKbMOh^vKbHegUK?O}34yB3q7!&P%pX*?Qx=-ln(bFWaK$C4G{MA#;ZW+o?#BGK*@{ z&+?kKbnO@xwrHP?r~z0nVLf0J;2KiTS1LHC^?N`tJzn+RP{!MBu6UEBLNnuCjHrP> z#)xaS;I!S#(}PGUXZ~gSgQDooJ?QRCp8nJpx)a5h$5d3pP1})jX9eTQsk2NA5l2Eo zT_5ug4ym;6y{+49UmqLJqXSmRFw*z168nnr@zLn6MV^F-nBh&@XHc&+b#WenR%tot zx(V#>IGuGdM=mc(2j=a3B#``!XGF)<6**QwT_mfTi#I{fUG(J1C*`yPL4%f{t#Nzq zx^PeCp!6qeQJ=ruddE2kjG(BvXE}I1Ej66Ic2~8K-TbZVQOmc98NXZtqq_y`&;~li zvCuhI|6I0r`)x=1yz?YzJ+JLZ8dh)8M!Y+ksL|~SF__xj@!oAOFv3ZZA!FH{SojC5 z+hs{71*}phFE$o-@S@^@0R%qlPs+@4Q^sBR3Ee>e%uh) z56AgQaljY9Ji5Ihz(RojzQJMx*&+AA3$3<~AI(s|Z+AY^NFno=Ap4&L(cdE)G0* zhZ?rjqs0VT`?E|-Z#MlT0xQH)sJ9FVB?_cSi`fg8sNjna51!a@dK)!{Za3lgZ%XGC zSNP-ix;ExDFz4#;mplqLmA}F$d%oytbV`xjPfJ)hXduui;-jvfc)BHKT?7uMYVJ3j zRg#|(*nZY~;fQ6qwmWd_3z^dWCaF(f)031S{HWY~Zh=Tx2Hzl3$*WlUI{HI}rORYh zbxkZxqidh^WNN1MJI+?Hl?CzS)3BgD$;*$Qz(9X@JbnO;Kp?okD{mf)E*(r(9 zNoqA_@|;WPgvsM0WqDPTuBJtD>Twb2n3df(L<0O;*179p|9YYupPiHbh{JT^ym;hF zqj9gwozxtYd*)_yj~Z3uu4EO=i?fyVU8`1I+@0=N#fZOG`_8yO;Czp&E;UE`fFlEPTwa1(J~QshBY9_r|8}gbD(O2bhO6#`>Ad>A^!skG4bd~pl_i|B zP)saS`tdogFVip~PU6ndnw2@4VL=dM`l@!A27)(W*MbdGG1F3Ez5(%-GnDm*3d^Rat}oD+ zkeIpyU^y9HRf@5dBOc5LZurh&RZ^%^7lfPDtW@{^{AJ2l1y9uh)DULqh`Un*{KS3sU!(aP=^p zud~I494W>7Mc`uNJ$5^bG&&lZf{Ihmn3}0z3`<@tA~*DZRA_h`9IB350ErrZSK((~ zQ#Dps2J*XrE6tbT^Wtw?w+#;@>Prum)YT^@(h6jH+zqlgUaNQxr)d@225m%ka*|o2 zj}m<63P^1+e6*Tj`Gm5pQ=4-lqm$#w)y?+%eNNq#W+lSv2j+KQFc@v2Ehz+%mTF;Q zSoK@tI!&b-aQ5lm@(-ml)ayQA;Hp>M(IQOoRv_!o=aTN_BZ$L}_`;9vLXtZgxSgv! zLYhgPdPHAX9bq@}TIKL2g-thGHmIVXCLHtji6zAghLF#!%t;&AN6}phBAYyPuhHxs zL$oB*K3HWu?Z{UqOM}WG=o37kHyKVD-DbxT_aC2@61FsoXrw)zWRK9|-es4LPmg)4 zW#{JZZXexHXNGY_>g2=-4icx^sTC?xtOJ71xI-TZ2#20~&PYR%1UqL^YNYj}@yskG9E%CF?yy_kT_|pM1ZKoF0F$o_jW+XZ{sSckGlJn10EYaOXqVrfa$KNwh<6 zaLXFiOR-Y#(F=w+GWS_@Ns<(P#_@-cE2;6~Ru`)xN_c0wy2Qp=Ags7-)?7r6>4U%X%`UKloO(+z$Z9V{!-5`4(F7ff_U zl|{ksYCd>~gGeS#I)?Y?h5~yn%D#}Z*AK+-t%QEs&DE^lTe&!i{9^v2HiarGN$Lo<8ySUxf0+@xq1kE5b7 z7G*bS2!Lgjk7uA?$%>Xm0q00dMmO;`xRmXFbmRjo+Hl|Vhyi_no9}m}jSN6sPYSEg z@0mZm6L{`!g>T7H)Od@L56nQTbtLVpu<^cj6dpc2BBNiycTkv5Q3`#vJ&eIDD9%=ZS*4f&t@ zCkGd@u{B5Yg{HRRM`DfUtCXw5LKh2Q$+_hPgl;KNV{}C+%r8znic%ZfxG|~G?XErD zlDjd7iL_h^dD82FB`i%YDbGdNk#mu^((HxzAFMT>*k_oUj^xPSA&4uHg**i?J(^l;+3BGNWVG= zzUf|=_{#CvHVTZF4^8f5L4N^=seR3mseTyvBgmLK2fR3a1<<_B8ET;he+^`}8M{Lx zR4cnKn=1P>70jb?mX$yu~nfaaK^drTN^$l1x&W+2yZAA6xUNi0!5tb)&hEr9IexIOT z%JO$7wy_G(E!5FblN~TgD=pLxii0ZKKQhKkytZ|?#cK21Xz^*I=5FaYG4Y|35v%@~ zXdFIg`qr_5`;wV{>{OF8-IRN-n9;k;66I$z*Nn!+Jb@oZY~?@K2yMobB&lTsN)h}T z7eyAd>9n{PXg4?xtd6(K8xx01?h4x*?I#$fY0#%UX~UpPIF=%}-QOmWK1`u++TEyW z%bLV$VSO$a4Amp-t731<%`$SdR*A;cArHVUer|^xOd*he-5HHVBHT90#VXc@Iktdb zwv~BQ9bFa51bHLF8Y3UJb~EtxR$ZA$a>2u5&pbAZ=eM%isKe(v2-Uwf*~0IM5`-3v zH?Y0{t+0OZWDI^R#j3ZO8U+NwB}%$wso~^TwQfG4wJ%=#ux(CscH5vSH4zU=LhD^G|kcRJ7$se5Apt+27wTZu6A3@`Epj4QuB zTB~L}1`4#fJ*(m}xgiM(+zX{d;oqkjZMrHm`oZ{tL&Yd}; z_xA5fRQ(qg0#C25z&I6)Ujrbj&V*HO~<4vwm%@&Bm43H&ov1?Lf7Ft?e`tfu@?1=bmsn)`aVj9zcuL_z$#^MF$ zI-S)V{0P6r$+Q-h|LBRMQa5i$Cx^9+>Xl&J`MMF~(?z=Vym%@^I!~F3R`A|($P4%c z(g@y!pZqQ-sCvOH>ZK5<@AR&bCZNZOb!qN|1!?qX1z@KBVp>~}2~xa}RcWR^^C?V; zc35P|*TwYM^_YLTsXovz;BsPU;P95KR6ToK)PtznPj%WKzT>G%IUx$fw(@#IYMH4^ zUj@_@^L@}UE0CudARIZ|`gS<9co8u2>1u1pQ@x063APl!Xl9^u(yy%gX|3&mW!s$j z6^9_h3{b{t@9v!P6UtYaA5!}+1R-CSb#v}753gE;H5-MVBruJ2N-K)5OKe;7`Xfs{ zMQ-6m-OErtA=?8!Thg=~UJLUl*SvIAb_9S-*1vj#ez3D%`Cow=u_A|OU#@*#jIFHg z;eQcalim=F5u{c^MosGe36lPp{Z@blAz!~P*@GLphm#=JW)28y&4U;s*>)!5^ zOL`_tZY-!%B2_E&yvMmy#9FzLqtA4MEr4C9T z%`jMW*L6-XBGSv8e=Y_bIFS&q^vJlk%Pl_ty_k%V^Y(5mk*)q@WO1GQb?vI~=9ErC z=Laj{eBqFp@ta9IH`*0(&fUVUFbGwp#E0x?7iwDi8L(Ta-ozxMcZewl?`bI+C9^Rv z9N{&N+jI_Mb6ud+_JlnLCk8M*Er>iWzMP&GmDH0qnOjdc+_S!uPu&?*A&|kWo;|c$ zZVHN-rsbo2xFscx>tz=w)JAIZ?Gsgyi>P3`4e#0|qK=m!_OYrQ86qm%Gz{B$2Da2{ z)!f+H)bL=jX`Uqiu^k!rypiC;Q-3zl@$#rkNcf?w=pZm~ZS6$NNs())(ZZ#Gd`U*1 zrGnlz%6z-H4b*VV8D;g7VpgTWGRymiJA)dsd^6Z3;Fha<&?*OLFp$ya8@T>rOQ4e8 z$Tx`2YaH>!lE++g2suNc=lttheLQYfx30GCvuTx{Ch4$zljnK$aj4}W zoS?&gxqjWOo3CQXahG+8MX0CIoBvb)3%Sraz^n~kqZN=Xpp?P-Q+3GT?dz77cc*|2 zhRT>kpXY4*WP(Y=7ER+PDM=)L7z2*4x4X$L5kKa))n<`3QRXm{8!w*=kQH@nCPU!; zIJf1``}7hwx+sM4f1n6muWSDy3iFWN{cnhb;3r-&P&WZ6nWHd?fr$woS3j?&*2|4G z10y3Nyk2!}UL9k#fx$lg-a$jIJ~d;mC%rtB8{1$GQ|^rtfHFd3Lgefm4gFuMhB*2V z+(*e&_$l|VPz)b6YXAf&YySj7lzl=39SUUFqt`h$poT{wvmfyp0SD9~dkPCo9JZ^6 z?3?Rpwf2?Qr>k?C`0>wS%_;V8AWTvB=bn@GHf}T0sSZxaW+^N^&S2t)Vh>hY1_Xkg zZ_}Zjkp4?2`}>UvmZ%l2|Eo@9sM$v#1OkFY2taLNuKWm3dvNS)l3+nfpjXS<*5SCl zu_6(~&RtOGh->y1H+xOq|LYBQxQtk(fNEL?dMO$nX_glbgUBaLH7yB zZ3ox+y`rcR(?TDKP0{KNxd`r1X0a&=zhq|x843<>Qfqc+yWgY1E=bVojsHwjX)Ib_ zc9U?Q*Y)7`qO%{<%?}PSCbdcP3-z+)e~kP#y00V&rS8Cg-4HHn)&&H0<#+SZ;OQSR zR_oKMh!*I*r#&)g*gMGAE5NOfhjxafd?-A@&FnnWB+SoW%JQJJ2`929tlC!DKiz-^#|-(Z4CUsw&vm-`~~7&dR^3;r8?3;9!i- zht2upvc%f_3aI7(&l8ijmK1$aPsyn9cb`CEca*xWP&)_$$?pSlaZWbWj++o9YyNH; z{W+2@@p0J~oQF>)9KXg(0w=uFX%5^)J^RBR#VvR~7$>Old!};SoYv%%cA%b5T$#t) zpKky?P**w*n|{;5>;VwPdxLK^I-5%)2c0!nOO*lA?8f4u$&|7LT3lYuGeIL=Sv-G+E*_prPw;cRstU{N;O zohM(dcT$(~qL3I_XNGsjY|Hy#eKZ4y$rQIXa!kKbmM9!NOLxuQ)_Ufwa&mHY-62Ku zEl%m+d*G{{J27cP%$)_!IL#r=Vr#g zlEQqX9u4(RIqN?zOZ7G0b<}S%cP<~=GOizkl=;5)b5saFnA)$B#Mg3lfDL zUs2|p;-8a5RX4g-09&c5zuU0EA4}B+tb{h(v6NK>{Fd*1q@`i zS_}_0PL$CfM04qw^P73@_ip2$wb^1$?K-!Yw?rDI3W^%msc)^6O}{S`X1M;G{h{?n z&#m(-ikEl}nUhLi~EDirCy?|T$1ci3>;mYk?(0LPNwG1^=;&gfjPS?ziv=qJw68*30+v!_ctvMApSxMe zxjfsgwtb%zmpQgDY%qHh*#DyAvw>A}O z772qnBmT`vGfn1W*TsnfE=|d}^(4*Wir~Q8hNp4(brk6^rckC-RIX z)d8-XbB}4g$Pf0~g*sUoPvi3qeN6#J(e0TvZvo}JxRz7H6itdzRtabN;rZ{TJ>}_I zYh6T}e4~Ap^9IDLwBOEnhFooBn$xmdj28;2!H0SCQ|Hxsy1|hUkQDROwF`YpU)f zDn^u^=~?5K9R)vYB(_4=PD2aNobIn6zz>*J%tJJgZct2b? z6Pg7uS`aM;DmPL7bS|UAIwqFE9-TO}YCZ(G+HtSrZA40B&j{|VV7Ce^1~RXbLXhn# z=U;RS}irmJztV(&8nFK*(4IWd;1i2SD)^K ze{l7;NYCI?2RG@PPz)^Qu;a?1bK#YDzO1b(C$ou5@#}aHSF10jcxY+&%AgR@%amd& zMJPED+U}kZE4Qv6#u3$Ace8)EdKeQDPQ8FxrsjJZL$u++0Lvyk9h@o>bz*E6ijwNP z7s`;lc1{#{e>Gv)=3ZX~j?#__Rveesm(%iYvZxPlmZw#A>m7--{HzHYeQJ8;zVGsW zqUiuSP5@rgEH4an+MSVf4mRSY`1|>UK*uZDiC*3LuA4t(8T8trwCSs_&s^@n=K)tm z(WTFZTG+kO1J(|F5v>ytLR=RjS?&ikAqvB9Hw|5bI4xI1$yP6C6 z4-lRkp?u5N&7(+qR{xg%f)~5VIvD$(zgoj$B>d-eI6vP$lJ|>`k=TA)w{?2FamQ;nS6bqFk}7V3D;expgT^7$ByJ9QNk-iJ?Sfu%Yv-UqpMea=AR2F z!gS?tm_Q%-GBLi=NbrsZ{uB5-ni{$4sDv?r`fvR2!ASF$VElRR6((!KCKSkej=xeC zWJXdh_{9QcNz~NXQ|f?s{1SQJcn$e3aAf8>s&mtct?3)r>wV(FP$rf{_&3mZ4=i3l|6PE|;Bq z8s;l=?88z#G@#G!wKGH8y6;yKilx?<54i<+bsm}Rq(wG%7DXiQw|wYSj++1Uh@2*w zG1*#&TQDH55Oek}CFAq8^y!dtBkR7~AWge=f)eS;FTw z?Uyrv_Y|)0aa83W%bUjt&JBkgc2ZQ#;)M`L9u7oew?f_42hIdD{YDx zy>Rzjw~?a|v*Zm{jf_gaulJ>Qo1ls%{#2g{VxYym97(j;iwF6%GiD?BO~>9Sn}DD7 z-Q6lX0!x#iJsMrDTixw(ti4FuL%A3bsh^X3&&htHTjTA^n0Ch+ikQ4)2UB5f+fU_2 zIzr{Wug3jva*Xb!q^(jO52Z*#%X+B?fsJll1qVXE&T4~ z+2qd5y2z0PL=RzG>8J^ain8z=7`6?M(e$e9cRs#_lt@z9UeUy9kZzxp9yB+Dv}m`< z36=t|6$e@9=86C51 z84jxjAA>+d^d3aw!ZAyU&&K>GMMw<*OKz1-=$GAbZAh-!yIm|)u1S0Nw{^euM|(ch zn9s=Zh7i9`OS)fwKSl0sZ0ySzL~=^FgGzgYMnh>t0rdcTwaJ_*G+ty3Q%kG4##@3; zEFh#nC`n*x+|PdF`k#D6KKLNG8P!P&K((;`9s<;;5a9QOz@c_fTM!b80w_PPL-0Ey zV6NpR8oYdcy#oD}8rsivb$HdaM+C}^-Wc?&4{GY_4h`_~nUrJyvmEQ>HIy4Aj14vP zG|@3A(SBXI_`Q?%^UB5lr{6AM{K@!x|LbR??H4JbcJ+JP?N83%aq9oS_tA~w{8zW^ zPp;o_=1&a!i_B2<=r2V3C*SW_@FxoWMZ+k*e=zBvY`-I}pGC+ovZ4HU*!U;+?*Qm0 zD*HtuxBtOte=_}EP5;D3zi91$nSMh`f3p5wPW~*ne^Ecmi~d@C|0(A8n(Sxo`HQen zQvV|6=ZXBMpx+Cw|8G4Ux_>X|{^b5WL;Nhtei0nS{hv#;KV|$LVn1`qFS=p)&ochg zK7Nm!pW*n6Fqr=uoO+trC_hF+BSC#^QHjnS_0wStKNbY)CKCwh0f(?ivnatuMV%cb zUCog?j-Fz^+P1pxZe|`n5I1cpQ3EeUn7X4H9O2;%HHVuy^SC3lT_u!&PF}`BzA$ky zQ6UwihN_p3mYI}~kUHGM6kurTgVeMY*OhcZnD~0@dwUr}bTrIh#zJlassLB0kf6Gb zv4wB8m2}+!ZsK+bB`r}AdwVex zAjI5GhsQ$S#9SN<^nj{~>j;{7yLkwU+IcH_=()N3f>p$QY(2Ha!Fo3OW~w&s#(LiN z2xlOV1rP@G()M6GEp-&(lWEv7BII^Hg=K}5jQaP)sh53Burevj!+#>O7#U!O19PFfg&0W2fwROCm-C$3LmVNgVFc6G zQ!|4iO@#G@1%#9#Qkr%`5?*4;Ff}m^xEH`sMcK&=-~tj;H1L+PH3!&xt4et|fHedi zT`YhAClh5?MFW@{%v{9`fCQP^xZ7$1kp@s5b8o1Ckbr;$1R%%4%YuZupuAQ{LR3;r LN=QmVBH(`j>e3g3 literal 0 HcmV?d00001 diff --git a/Organization/filegenerator/.difyignore b/Organization/filegenerator/.difyignore new file mode 100644 index 0000000000..4ea917564e --- /dev/null +++ b/Organization/filegenerator/.difyignore @@ -0,0 +1,179 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Vscode +.vscode/ + +# Git +.git/ +.gitignore +.github/ + +# Mac +.DS_Store + +# Windows +Thumbs.db diff --git a/Organization/filegenerator/.env.example b/Organization/filegenerator/.env.example new file mode 100644 index 0000000000..60358af873 --- /dev/null +++ b/Organization/filegenerator/.env.example @@ -0,0 +1,3 @@ +INSTALL_METHOD=remote +REMOTE_INSTALL_URL=debug.dify.ai:5003 +REMOTE_INSTALL_KEY=********-****-****-****-************ diff --git a/Organization/filegenerator/.github/workflows/plugin-publish.yml b/Organization/filegenerator/.github/workflows/plugin-publish.yml new file mode 100644 index 0000000000..d24c4dd51f --- /dev/null +++ b/Organization/filegenerator/.github/workflows/plugin-publish.yml @@ -0,0 +1,109 @@ +name: Plugin Publish Workflow + +on: + release: + types: [published] + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Download CLI tool + run: | + mkdir -p $RUNNER_TEMP/bin + cd $RUNNER_TEMP/bin + + wget https://github.com/langgenius/dify-plugin-daemon/releases/download/0.0.6/dify-plugin-linux-amd64 + chmod +x dify-plugin-linux-amd64 + + echo "CLI tool location:" + pwd + ls -la dify-plugin-linux-amd64 + + - name: Get basic info from manifest + id: get_basic_info + run: | + PLUGIN_NAME=$(grep "^name:" manifest.yaml | cut -d' ' -f2) + echo "Plugin name: $PLUGIN_NAME" + echo "plugin_name=$PLUGIN_NAME" >> $GITHUB_OUTPUT + + VERSION=$(grep "^version:" manifest.yaml | cut -d' ' -f2) + echo "Plugin version: $VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # If the author's name is not your github username, you can change the author here + AUTHOR=$(grep "^author:" manifest.yaml | cut -d' ' -f2) + echo "Plugin author: $AUTHOR" + echo "author=$AUTHOR" >> $GITHUB_OUTPUT + + - name: Package Plugin + id: package + run: | + cd $GITHUB_WORKSPACE + PACKAGE_NAME="${{ steps.get_basic_info.outputs.plugin_name }}-${{ steps.get_basic_info.outputs.version }}.difypkg" + $RUNNER_TEMP/bin/dify-plugin-linux-amd64 plugin package . -o "$PACKAGE_NAME" + + echo "Package result:" + ls -la "$PACKAGE_NAME" + echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT + + echo "\nFull file path:" + pwd + echo "\nDirectory structure:" + tree || ls -R + + - name: Checkout target repo + uses: actions/checkout@v3 + with: + repository: ${{steps.get_basic_info.outputs.author}}/dify-plugins + path: dify-plugins + token: ${{ secrets.PLUGIN_ACTION }} + fetch-depth: 1 + persist-credentials: true + + - name: Prepare and create PR + run: | + PACKAGE_NAME="${{ steps.get_basic_info.outputs.plugin_name }}-${{ steps.get_basic_info.outputs.version }}.difypkg" + mkdir -p dify-plugins/${{ steps.get_basic_info.outputs.author }}/${{ steps.get_basic_info.outputs.plugin_name }} + mv "$PACKAGE_NAME" dify-plugins/${{ steps.get_basic_info.outputs.author }}/${{ steps.get_basic_info.outputs.plugin_name }}/ + + cd dify-plugins + + git config user.name "GitHub Actions" + git config user.email "actions@github.com" + + git fetch origin main + git checkout main + git pull origin main + + BRANCH_NAME="bump-${{ steps.get_basic_info.outputs.plugin_name }}-plugin-${{ steps.get_basic_info.outputs.version }}" + git checkout -b "$BRANCH_NAME" + + git add . + git commit -m "bump ${{ steps.get_basic_info.outputs.plugin_name }} plugin to version ${{ steps.get_basic_info.outputs.version }}" + + git push -u origin "$BRANCH_NAME" --force + + git branch -a + echo "Waiting for branch to sync..." + sleep 10 # Wait 10 seconds for branch sync + + - name: Create PR via GitHub API + env: + # How to config the token: + # 1. Profile -> Settings -> Developer settings -> Personal access tokens -> Generate new token (with repo scope) -> Copy the token + # 2. Go to the target repository -> Settings -> Secrets and variables -> Actions -> New repository secret -> Add the token as PLUGIN_ACTION + GH_TOKEN: ${{ secrets.PLUGIN_ACTION }} + run: | + gh pr create \ + --repo langgenius/dify-plugins \ + --head "${{ steps.get_basic_info.outputs.author }}:${{ steps.get_basic_info.outputs.plugin_name }}-${{ steps.get_basic_info.outputs.version }}" \ + --base main \ + --title "bump ${{ steps.get_basic_info.outputs.plugin_name }} plugin to version ${{ steps.get_basic_info.outputs.version }}" \ + --body "bump ${{ steps.get_basic_info.outputs.plugin_name }} plugin package to version ${{ steps.get_basic_info.outputs.version }} + + Changes: + - Updated plugin package file" || echo "PR already exists or creation skipped." # Handle cases where PR already exists diff --git a/Organization/filegenerator/.gitignore b/Organization/filegenerator/.gitignore new file mode 100644 index 0000000000..a16dc9791a --- /dev/null +++ b/Organization/filegenerator/.gitignore @@ -0,0 +1,176 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Vscode +.vscode/ + +# macOS +.DS_Store +.AppleDouble +.LSOverride \ No newline at end of file diff --git a/Organization/filegenerator/GUIDE.md b/Organization/filegenerator/GUIDE.md new file mode 100644 index 0000000000..7b9b466d37 --- /dev/null +++ b/Organization/filegenerator/GUIDE.md @@ -0,0 +1,148 @@ +## User Guide of how to develop a Dify Plugin + +Hi there, looks like you have already created a Plugin, now let's get you started with the development! + +### Choose a Plugin type you want to develop + +Before start, you need some basic knowledge about the Plugin types, Plugin supports to extend the following abilities in Dify: +- **Tool**: Tool Providers like Google Search, Stable Diffusion, etc. it can be used to perform a specific task. +- **Model**: Model Providers like OpenAI, Anthropic, etc. you can use their models to enhance the AI capabilities. +- **Endpoint**: Like Service API in Dify and Ingress in Kubernetes, you can extend a http service as an endpoint and control its logics using your own code. + +Based on the ability you want to extend, we have divided the Plugin into three types: **Tool**, **Model**, and **Extension**. + +- **Tool**: It's a tool provider, but not only limited to tools, you can implement an endpoint there, for example, you need both `Sending Message` and `Receiving Message` if you are building a Discord Bot, **Tool** and **Endpoint** are both required. +- **Model**: Just a model provider, extending others is not allowed. +- **Extension**: Other times, you may only need a simple http service to extend the functionalities, **Extension** is the right choice for you. + +I believe you have chosen the right type for your Plugin while creating it, if not, you can change it later by modifying the `manifest.yaml` file. + +### Manifest + +Now you can edit the `manifest.yaml` file to describe your Plugin, here is the basic structure of it: + +- version(version, required):Plugin's version +- type(type, required):Plugin's type, currently only supports `plugin`, future support `bundle` +- author(string, required):Author, it's the organization name in Marketplace and should also equals to the owner of the repository +- label(label, required):Multi-language name +- created_at(RFC3339, required):Creation time, Marketplace requires that the creation time must be less than the current time +- icon(asset, required):Icon path +- resource (object):Resources to be applied + - memory (int64):Maximum memory usage, mainly related to resource application on SaaS for serverless, unit bytes + - permission(object):Permission application + - tool(object):Reverse call tool permission + - enabled (bool) + - model(object):Reverse call model permission + - enabled(bool) + - llm(bool) + - text_embedding(bool) + - rerank(bool) + - tts(bool) + - speech2text(bool) + - moderation(bool) + - node(object):Reverse call node permission + - enabled(bool) + - endpoint(object):Allow to register endpoint permission + - enabled(bool) + - app(object):Reverse call app permission + - enabled(bool) + - storage(object):Apply for persistent storage permission + - enabled(bool) + - size(int64):Maximum allowed persistent memory, unit bytes +- plugins(object, required):Plugin extension specific ability yaml file list, absolute path in the plugin package, if you need to extend the model, you need to define a file like openai.yaml, and fill in the path here, and the file on the path must exist, otherwise the packaging will fail. + - Format + - tools(list[string]): Extended tool suppliers, as for the detailed format, please refer to [Tool Guide](https://docs.dify.ai/plugins/schema-definition/tool) + - models(list[string]):Extended model suppliers, as for the detailed format, please refer to [Model Guide](https://docs.dify.ai/plugins/schema-definition/model) + - endpoints(list[string]):Extended Endpoints suppliers, as for the detailed format, please refer to [Endpoint Guide](https://docs.dify.ai/plugins/schema-definition/endpoint) + - Restrictions + - Not allowed to extend both tools and models + - Not allowed to have no extension + - Not allowed to extend both models and endpoints + - Currently only supports up to one supplier of each type of extension +- meta(object) + - version(version, required):manifest format version, initial version 0.0.1 + - arch(list[string], required):Supported architectures, currently only supports amd64 arm64 + - runner(object, required):Runtime configuration + - language(string):Currently only supports python + - version(string):Language version, currently only supports 3.12 + - entrypoint(string):Program entry, in python it should be main + +### Install Dependencies + +- First of all, you need a Python 3.11+ environment, as our SDK requires that. +- Then, install the dependencies: + ```bash + pip install -r requirements.txt + ``` +- If you want to add more dependencies, you can add them to the `requirements.txt` file, once you have set the runner to python in the `manifest.yaml` file, `requirements.txt` will be automatically generated and used for packaging and deployment. + +### Implement the Plugin + +Now you can start to implement your Plugin, by following these examples, you can quickly understand how to implement your own Plugin: + +- [OpenAI](https://github.com/langgenius/dify-plugin-sdks/tree/main/python/examples/openai): best practice for model provider +- [Google Search](https://github.com/langgenius/dify-plugin-sdks/tree/main/python/examples/google): a simple example for tool provider +- [Neko](https://github.com/langgenius/dify-plugin-sdks/tree/main/python/examples/neko): a funny example for endpoint group + +### Test and Debug the Plugin + +You may already noticed that a `.env.example` file in the root directory of your Plugin, just copy it to `.env` and fill in the corresponding values, there are some environment variables you need to set if you want to debug your Plugin locally. + +- `INSTALL_METHOD`: Set this to `remote`, your plugin will connect to a Dify instance through the network. +- `REMOTE_INSTALL_URL`: The URL of debugging host and port of plugin-daemon service from your Dify instance, eg. `debug.dify.ai:5003`. Either the [Dify SaaS](https://debug.dify.ai) or [self-hosted Dify instance](https://docs.dify.ai/en/getting-started/install-self-hosted/readme) can be used. +- `REMOTE_INSTALL_KEY`: You should get your debugging key from the Dify instance you used, at the right top of the plugin management page, you can see a button with a `debug` icon, click it and you will get the key. + +Run the following command to start your Plugin: + +```bash +python -m main +``` + +Refresh the page of your Dify instance, you should be able to see your Plugin in the list now, but it will be marked as `debugging`, you can use it normally, but not recommended for production. + +### Publish and Update the Plugin + +To streamline your plugin update workflow, you can configure GitHub Actions to automatically create PRs to the Dify plugin repository whenever you create a release. + +##### Prerequisites + +- Your plugin source repository +- A fork of the dify-plugins repository +- Proper plugin directory structure in your fork + +#### Configure GitHub Action + +1. Create a Personal Access Token with write permissions to your forked repository +2. Add it as a secret named `PLUGIN_ACTION` in your source repository settings +3. Create a workflow file at `.github/workflows/plugin-publish.yml` + +#### Usage + +1. Update your code and the version in your `manifest.yaml` +2. Create a release in your source repository +3. The action automatically packages your plugin and creates a PR to your forked repository + +#### Benefits + +- Eliminates manual packaging and PR creation steps +- Ensures consistency in your release process +- Saves time during frequent updates + +--- + +For detailed setup instructions and example configuration, visit: [GitHub Actions Workflow Documentation](https://docs.dify.ai/plugins/publish-plugins/plugin-auto-publish-pr) + +### Package the Plugin + +After all, just package your Plugin by running the following command: + +```bash +dify-plugin plugin package ./ROOT_DIRECTORY_OF_YOUR_PLUGIN +``` + +you will get a `plugin.difypkg` file, that's all, you can submit it to the Marketplace now, look forward to your Plugin being listed! + + +## User Privacy Policy + +Please fill in the privacy policy of the plugin if you want to make it published on the Marketplace, refer to [PRIVACY.md](PRIVACY.md) for more details. \ No newline at end of file diff --git a/Organization/filegenerator/PRIVACY.md b/Organization/filegenerator/PRIVACY.md new file mode 100644 index 0000000000..b088c73aa1 --- /dev/null +++ b/Organization/filegenerator/PRIVACY.md @@ -0,0 +1,3 @@ +## Privacy + +!!! Please fill in the privacy policy of the plugin. \ No newline at end of file diff --git a/Organization/filegenerator/README.md b/Organization/filegenerator/README.md new file mode 100644 index 0000000000..ecf5bebafd --- /dev/null +++ b/Organization/filegenerator/README.md @@ -0,0 +1,10 @@ +## filegenerator + +**Author:** randomradio +**Version:** 0.0.1 +**Type:** tool + +### Description + + + diff --git a/Organization/filegenerator/_assets/icon.svg b/Organization/filegenerator/_assets/icon.svg new file mode 100644 index 0000000000..375222f801 --- /dev/null +++ b/Organization/filegenerator/_assets/icon.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/Organization/filegenerator/main.py b/Organization/filegenerator/main.py new file mode 100644 index 0000000000..7e1a983dbd --- /dev/null +++ b/Organization/filegenerator/main.py @@ -0,0 +1,6 @@ +from dify_plugin import Plugin, DifyPluginEnv + +plugin = Plugin(DifyPluginEnv(MAX_REQUEST_TIMEOUT=120)) + +if __name__ == '__main__': + plugin.run() diff --git a/Organization/filegenerator/manifest.yaml b/Organization/filegenerator/manifest.yaml new file mode 100644 index 0000000000..0173d0c94c --- /dev/null +++ b/Organization/filegenerator/manifest.yaml @@ -0,0 +1,48 @@ +version: 0.0.1 +type: plugin +author: randomradio +name: filegenerator +label: + en_US: filegenerator + ja_JP: filegenerator + zh_Hans: filegenerator + pt_BR: filegenerator +description: + en_US: generate file with extension and content + ja_JP: generate file with extension and content + zh_Hans: generate file with extension and content + pt_BR: generate file with extension and content +icon: icon.svg +resource: + memory: 268435456 + permission: + tool: + enabled: true + model: + enabled: false + llm: false + text_embedding: false + rerank: false + tts: false + speech2text: false + moderation: false + node: + enabled: false + app: + enabled: false +plugins: + tools: + - provider/filegenerator.yaml +meta: + version: 0.0.1 + arch: + - amd64 + - arm64 + runner: + language: python + version: "3.12" + entrypoint: main + minimum_dify_version: null +created_at: 2025-05-30T14:51:13.938188+08:00 +privacy: PRIVACY.md +verified: false diff --git a/Organization/filegenerator/provider/filegenerator.py b/Organization/filegenerator/provider/filegenerator.py new file mode 100644 index 0000000000..be4a3ff661 --- /dev/null +++ b/Organization/filegenerator/provider/filegenerator.py @@ -0,0 +1,15 @@ +from typing import Any + +from dify_plugin import ToolProvider +from dify_plugin.errors.tool import ToolProviderCredentialValidationError + + +class FilegeneratorProvider(ToolProvider): + def _validate_credentials(self, credentials: dict[str, Any]) -> None: + try: + """ + IMPLEMENT YOUR VALIDATION HERE + """ + return None + except Exception as e: + raise ToolProviderCredentialValidationError(str(e)) diff --git a/Organization/filegenerator/provider/filegenerator.yaml b/Organization/filegenerator/provider/filegenerator.yaml new file mode 100644 index 0000000000..6217f26265 --- /dev/null +++ b/Organization/filegenerator/provider/filegenerator.yaml @@ -0,0 +1,17 @@ +identity: + author: randomradio + name: filegenerator + label: + en_US: filegenerator + zh_Hans: filegenerator + pt_BR: filegenerator + description: + en_US: generate file with extension and content + zh_Hans: generate file with extension and content + pt_BR: generate file with extension and content + icon: icon.svg +tools: + - tools/filegenerator.yaml +extra: + python: + source: provider/filegenerator.py diff --git a/Organization/filegenerator/requirements.txt b/Organization/filegenerator/requirements.txt new file mode 100644 index 0000000000..3e961fc2a1 --- /dev/null +++ b/Organization/filegenerator/requirements.txt @@ -0,0 +1,2 @@ +dify_plugin>=0.2.0,<0.3.0 +filegenerator diff --git a/Organization/filegenerator/tools/filegenerator.py b/Organization/filegenerator/tools/filegenerator.py new file mode 100644 index 0000000000..eebaa9452f --- /dev/null +++ b/Organization/filegenerator/tools/filegenerator.py @@ -0,0 +1,68 @@ +from collections.abc import Generator +from typing import Any +import re + +from dify_plugin import Tool +from dify_plugin.entities.tool import ToolInvokeMessage + + +import mimetypes + + +class FilegeneratorTool(Tool): + """Generate a downloadable text file based on user input.""" + + def _invoke( + self, tool_parameters: dict[str, Any] + ) -> Generator[ToolInvokeMessage, None, None]: + # 1. Retrieve parameters + content = tool_parameters.get("content") + title = tool_parameters.get("title") + ext = tool_parameters.get("ext", ".txt") + + # Normalize extension + if not ext.startswith("."): + ext = "." + ext + + # 2. Validate required parameters + if not content: + yield self.create_text_message("Error: content is required.") + return + if not title: + yield self.create_text_message("Error: title is required.") + return + + # Sanitize title to create a safe filename (remove/replace problematic characters) + sanitized_title = re.sub(r"[^\w\-. ]+", "_", title).strip() + if not sanitized_title: + sanitized_title = "file" + + filename = f"{sanitized_title}{ext}" + + # Guess mime type, default to text/plain + mime_type, _ = mimetypes.guess_type(filename) + if mime_type is None: + mime_type = "text/plain" + + try: + file_bytes = content.encode("utf-8") + + # 3. Return file as blob message (Dify will handle storage & provide download URL) + yield self.create_blob_message( + blob=file_bytes, + meta={ + "filename": filename, + "mime_type": mime_type, + }, + ) + + # 4. Provide workflow variables / JSON + yield self.create_variable_message("download_filename", filename) + yield self.create_variable_message("download_url", "{{files[0].url}}") + yield self.create_json_message({ + "download_url": "{{download_url}}", # Will be replaced by Dify + "filename": filename, + }) + + except Exception as e: + yield self.create_text_message(f"Error generating file: {str(e)}") diff --git a/Organization/filegenerator/tools/filegenerator.yaml b/Organization/filegenerator/tools/filegenerator.yaml new file mode 100644 index 0000000000..0b57234fbc --- /dev/null +++ b/Organization/filegenerator/tools/filegenerator.yaml @@ -0,0 +1,55 @@ +identity: + name: filegenerator + author: randomradio + label: + en_US: filegenerator + zh_Hans: filegenerator + pt_BR: filegenerator +description: + human: + en_US: Generate a TXT (or custom extension) file for download with given content and title. + zh_Hans: 根据输入内容和标题生成可下载的 TXT 或指定扩展名文件。 + llm: Generate a downloadable text file with given content, title and optional extension. +parameters: + - name: content + type: string + required: true + label: + en_US: File Content + zh_Hans: 文件内容 + human_description: + en_US: Body content of the file to generate. + zh_Hans: 要生成的文件正文内容。 + llm_description: The file body content. + form: llm + - name: title + type: string + required: true + label: + en_US: File Title + zh_Hans: 文件标题 + human_description: + en_US: File name (without extension). + zh_Hans: 文件名称(不含扩展名)。 + llm_description: The name of the file, not including extension. + form: llm + - name: ext + type: string + required: false + label: + en_US: File Extension + zh_Hans: 文件扩展名 + human_description: + en_US: File extension (default is .txt, e.g. .md/.csv). + zh_Hans: 文件扩展名(默认为 .txt,可自定义,如 .md/.csv)。 + llm_description: File extension to use, include the leading dot, e.g. ".txt" or ".md". Optional. + form: llm +extra: + python: + source: tools/filegenerator.py +output_schema: + type: object + properties: + download_url: + type: string + description: URL to download the generated file.