From 671c7e24016b7df2c8597694630337760e824771 Mon Sep 17 00:00:00 2001 From: Edgars Date: Thu, 12 Mar 2026 16:42:34 +0000 Subject: [PATCH] feat(partners): add Morpheus as GenLayer LLM provider Resolved conflicts with Chutes PR. Adds Morpheus partner page, logo, and GenVM configuration references. Co-authored-by: ScottBerenzweig <76454555+betterbrand@users.noreply.github.com> Closes #350 --- pages/partners/_meta.json | 3 ++- pages/partners/morpheus.mdx | 9 +++++++++ pages/validators/genvm-configuration.mdx | 4 +++- pages/validators/setup-guide.mdx | 11 +++++++++++ public/morpheus.png | Bin 0 -> 16205 bytes 5 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 pages/partners/morpheus.mdx create mode 100644 public/morpheus.png diff --git a/pages/partners/_meta.json b/pages/partners/_meta.json index 23555c96..584d5bf2 100644 --- a/pages/partners/_meta.json +++ b/pages/partners/_meta.json @@ -3,5 +3,6 @@ "heurist": "Heurist", "ionet": "io.net", "comput3": "Comput3", - "chutes": "Chutes" + "chutes": "Chutes", + "morpheus": "Morpheus" } \ No newline at end of file diff --git a/pages/partners/morpheus.mdx b/pages/partners/morpheus.mdx new file mode 100644 index 00000000..1bdfe403 --- /dev/null +++ b/pages/partners/morpheus.mdx @@ -0,0 +1,9 @@ +# Morpheus + +Morpheus + +[Morpheus](https://mor.org/) is a decentralized AI inference network where open-source model providers compete on a peer-to-peer marketplace. Instead of relying on a single centralized API, Morpheus routes requests across independent compute providers offering models like DeepSeek, Llama, Qwen, and others — with the available model list updating dynamically as providers join and leave the network. + +In partnership with GenLayer, Morpheus provides decentralized LLM inference for Intelligent Contract validators through an OpenAI-compatible API. GenLayer Studio fetches available models from the Morpheus marketplace in real time, so validators always see the latest options. Developers can obtain a [Morpheus API key](https://mor.org/) to get started. + +This partnership brings decentralized, censorship-resistant AI inference to the GenLayer ecosystem, ensuring that Intelligent Contracts are not dependent on any single provider. diff --git a/pages/validators/genvm-configuration.mdx b/pages/validators/genvm-configuration.mdx index 49e289bb..dc9dcb97 100644 --- a/pages/validators/genvm-configuration.mdx +++ b/pages/validators/genvm-configuration.mdx @@ -14,6 +14,8 @@ You need to set up an LLM for your node to use to provide answers to natural lan **[io.net](/partners/ionet)** - A decentralized compute network providing GPU access for AI inference. GenLayer Validators can create an account at [id.io.net](https://id.io.net/login) and obtain free credits by [filling out this form](https://form.typeform.com/to/pDmCCViV). **[Chutes](/partners/chutes)** - Serverless inference for open-source AI models running on decentralized GPU infrastructure. GenLayer Validators can create an account at [chutes.ai](https://chutes.ai) and generate an API key from their account settings. + + **[Morpheus](/partners/morpheus)** - A decentralized AI inference network where open-source model providers compete on a peer-to-peer marketplace. GenLayer Validators can obtain a [Morpheus API key](https://mor.org/) to access models like DeepSeek, Llama, Qwen, and others through an OpenAI-compatible API. The GenVM configuration files are located at `third_party/genvm/config/` @@ -27,7 +29,7 @@ You should not need to modify this in general. However, from here you can: - turn on and off various LLMs by setting the `enabled` field to `false`: By default they all come enabled for you to use. You will get warnings in the logs for each one that's enabled and not configured. Disabling non used LLM providers will hide those warnings -Note environment variable names for LLM API keys (e.g., `HEURISTKEY`, `COMPUT3KEY`, `IOINTELLIGENCE_API_KEY`, `CHUTES_API_KEY`). You will need to ensure the appropriate key is correctly set before [running the node](/validators/setup-guide#running-the-node). +Note environment variable names for LLM API keys (e.g., `HEURISTKEY`, `COMPUT3KEY`, `IOINTELLIGENCE_API_KEY`, `CHUTES_API_KEY`, `MORPHEUS_API_KEY`). You will need to ensure the appropriate key is correctly set before [running the node](/validators/setup-guide#running-the-node). ## genvm-module-web.yaml diff --git a/pages/validators/setup-guide.mdx b/pages/validators/setup-guide.mdx index fd852210..e11714a4 100644 --- a/pages/validators/setup-guide.mdx +++ b/pages/validators/setup-guide.mdx @@ -534,8 +534,13 @@ Once you have configured everything, you are ready to start the node. # For io.net export IOINTELLIGENCE_API_KEY='your_ionet_api_key' +<<<<<<< ours # For Chutes export CHUTES_API_KEY='your_chutes_api_key' +======= + # For Morpheus + export MORPHEUS_API_KEY='your_morpheus_api_key' +>>>>>>> theirs # For other providers, use the appropriate environment variable name ``` @@ -693,11 +698,17 @@ NODE_OPS_PORT=9153 # LLM API Key (required for GenVM LLM module) HEURISTKEY= +COMPUT3KEY= +IOINTELLIGENCE_API_KEY= ANTHROPICKEY= XAIKEY= GEMINIKEY= ATOMAKEY= +<<<<<<< ours CHUTES_API_KEY= +======= +MORPHEUS_API_KEY= +>>>>>>> theirs ``` or simply use the provided `docker-compose.yaml`, `.env.example` and the `genvm-module-web-docker.yaml` from the extracted tarball. diff --git a/public/morpheus.png b/public/morpheus.png new file mode 100644 index 0000000000000000000000000000000000000000..61ec388eb7d0305cbfc4d9d2ecd6d5e65125dcce GIT binary patch literal 16205 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

A7Z;^GWp17a{pNK4V^VONG55aMRtcgQXwxOsVU z+c94SH{m2^g$BOxkay;!4?bS#{aJ&$7m#`4h-?CVr1G7Wv}6%o(H*bX`+2@$ zg9(qsHz@ zt)-vHu6R{)vbGUC=+#gKYFp+B#WKw&pEO)>jBI|DTf{d++t^u>K_;aaStrXg;LHLi zyPzH4b3NJt5nN*&e*KId$X%S`{z%Y?SzI@sZlM>;i@Li?U6vv>WHhQC2NI`X8}I#v z-^>cBpx2s``)v&c@Xtn->4@C}0F{KAJy_X)xh|5TvHXE*UA1C4S}rW!7?c@k8F8ir z_2csX^Q|VpDJestYFG#yop6qHKGf5&29?NkF<>@Q%W^UR!ef>qZUHs`*e1wpLBmbb2-WEzNF?Y z=xIVDt$T&D5TdZ7*qE$;Ahnu*k9+oq3WLu$DhI#ugGKs;!0*-~B`rhL^4^#0 zFTwhqjUx$!PmzK0MWS`1%kg!tuXpG)V(vQtIpyAM6(cdN+$ zgJl;62nUIGxGTPOhTjjeg%!*(YC?^&!^%G&5&@ggn?XP)4Aqzp-P{TX;w z-|e@H7;oO*%LuSe=K4%fO%#zLdRUk?+(MS8hD@xm07uCx8C7gs93xjs$-EkTw|m7W zI-z~Pxf3S51_SG>jn8r7p2fB7dgWAg)jWg#ML73RC;?bsu%d7bg%l$Q(S;TDyEgWs*qRxb~fRi>dTiOT*SfnXKMjsS^ zlW!>Q+#lWaK|QCL&uqD&Jl%#!(5ZYg%Skie=<}+o0PU<=o5#<>Bl)@Ac|x${$sI?NmWlk( zuS$xfX`_6d)fDZg38b;nkpbvz;Pg(*Q5ns%d%`{T~X+Zv*NkbAo}W zNDr}!=h^F|t0MaaJQ(tVFXpBhmh%>#fn^yY%*#9q%)YQ=g-=QUY{6HFqf03n!*+f-*66g2Uxv3C*$&bH3TtU2Xo5$5CRbP33=zQ%L~R3)A1R9` zAZ7A#g`e&U5U5+&Fu~J4_)wARK5JXK?zh5_!9-XJ^F6A?776g2E=0hux=p-Z!>=~N z2e==#F(c#M+Pj4F*9(o0y2Wm`DaZ)FOLj#&{iXe38$To-WRLrBLZ=Np zO`>+ao($)moNLe~Q)>CtgYxIZIA|qoBx)GTs z9q-t88pgepUG@ATh^iyfL2~O6^a4VeUX$;OOLCti{XK~N4Jr(TkEK$19=<1hfsE&F zWL3O?>*(Xm2uD52<`6e0m!NS9jqdUr?wctG3a$DCL`v z)s>QyOTV3l`MWBV{IthMd>&uTO9z2#pb02!h3mJ__)PS?Al}5uc z^|wpkESH?|Nv_Xc;TL_8eJFbkJ$c3_30-#wny9sgxL@S?twiM%OvOGqrWiahgR>Uq(3@b0$aD{(%U#pnB3glIIcMIx<)m(HaMz)h*z;y(3 z<|T8k9aFilPt5TzNP1~E#24Q`9i2B^Gdx3Zsny)tu#nQ3=CEM7#fNUAYplWNZu-NW zc+n8rAY-kXJ|Ek_;SGtnqn@^BnThf)6dl2&mGAe?0hy!rMj$;ZAY*?!KaB6J<9^ZDD&D@|;4hkGqw)nUC^*&e^e>4JJ`thJCOmNTP* zFqL$=*#vK%IP=vEaQT&Ym4s7pG8Zfk3?~jIf?C#HlyV?DJ-Hq-mL>jHTd8bY++s&* zMB0Ae3UCR&Z->Z0;H(ZEa)9fmAhmmMCXh=68ZKpSv8t{svRo{XZ-^wZcpwia?0n@n zS*xakfyAv&hF!u&N1}2J#!ndCf!f*AT|0OC<$u|% z=}%f-wMyf*9$T6&ZezWzxO}b}GvYQedoMW{8ig#f8B#|?bm_`yKMAC@;S!O!LexdX zO?aMeb^S=gW5rpy%fUS>tEvvMtm4c+DRo=J^kC z>iLHoTkgb+9?#!W-G7eQim1wbss>y{ue&Q#cH{FMP9@w*qrH0l^ow>?Dk53m$S->c*rdtmd@bb z$X^f_;m`URawi#IIU%KM7BpS}2U&}@P#%=~2Y*mz#X^6!ZjVA!jhHq@h}I@yL5z(S6yte=>r)xRQ&}j%W|eie!Kbp_;*DpC95^g#Mg{I11-LivP^yY zbNq)zjiXUu)WS-Ulk20M#e9+mv-8_Z;=Bxm)W4eMTYK8!7ePVd_lj_J^NeSR{juj? zA=Glm{0t}j(BA^ND*284%SeBi`^4n%tnX}DCrhHd-;A44`zi9xv#CC8@ty2U30i_e z?GxptMJ43jpH2RL>0I0}4|`qOM&{0btt|$n;-5k^;}(p*4tH6o#Ff-qv}|2V*~)Fd zO!IQl0h{g(FDgyV;xs7~PE%22Q~<^hv+$upIcRfri7k$s=u)TeMavfaQkR$3`4}Fz znk*fxIB5u`kD?xgT*QJ_&P4_ZNM_0+-hz2l!^IUXH}07RW<^z(=!d4trp}Exy$%g) zZ1%7U&c*k-o$bsM6FD_{oOLwlBU-@D8=i)TO8#jGX`+XzEU*&+2K2t6SeWUp%llPR z`Qj%;B-2s)Rjl~LoFNElw$A+Lp|iaGM%sb;NBh@y;(nUOa4Xuz6fD!?9f+()H4`3O zrbinTWm7X`nCrIWvjb7IqMyc*bfMz~{j#49N00SvKGON?Fl*k52tZ!y=ng_)a*j$V zGl7v@+Q`D-K?UxT$sd14oTNiAMl*8#<;uZTx=KsG>-gTC!}2BK%GD4Ush&f|)xl{^ z=Fx5Pl^*^v%hA#(i_vjEb<-1B#EAStgNuJ~UGIx)J=~h{HrhW)Gd0&!KhZ0m<&u|u zNc-X1Uep*t_`R-?rGDeU>h-G>K9bh8i#;L&2@U?d9M?d~>!UZumu@ZN+TSR0rz*v8 zxTa`gMoRrQD-9wc6Sa^Ds?87Y-82gaKRm`WdV*cnVp)-AYN7F3kq5Xh#)yZu(bU#W z_?NO>ZljovO~_lPuqVcTS}+^Adf8H4>yqkwh{*s>(DYmT{4YL(nz**lA-DvRKrCnv zh+OL>b8dbcTKfff5kAQ+K>_qdx?g!Ne-#oMv)^AsMD^CdxlSUEe4<$!l0On`E@+Q1Lxa%YL@vBO?uz{GQ3 z)sFT0H8-;~xgm5mNpRKd2uDwB4*uE5#l0B2<5sTnnCPjHI^_4NP5=w2 z<&+72dyK#Ds_A7fKi~z?<4wqgA?5 zZV23XbX7bj240@UlL1CcJvRusd;dvM?gI-*?hX_Pp# z6j5e6CPs3Om{ zR^K^yc7n?DN4_hbw$q_F?OD+7i&}aXY}kA^7UEtvG9_(k0tpMB`J5A3Dv6BMVZY_UWMM+Uap&2 zt8BDmt809gs~b455W+ynGE+|Z=KV_&k_@sIFwzkE^hfNMAe}5keZskO14yKw$DCze z%1E3}fliFI#;KKnO#=&0<_hpU!GDu|KpQmRH9UT2adwr&#e(TTJ&>&3da}T;q>RHE zI67y~cNFS_l#Qo;|2`$@@YX%5uxHivqNxs4sVwskMi|+-K<`z}c28B8;CxGv_*(xR zK49#NzQZ*%^qFpy4?m}ZS$}&g6!&;pY^ah96qY#NVssZnx7=@3k7R2oZFPSt+9`WY zmkXf3w4uRhmhys$vSIA3kdM`9wSIuRBpWNXXqSug9bq%8P4Zs#_R@}IrzpPjN> zoOMwI)YSjdcKH;07^ZT`wAG*Y4(FGYSUZUQAnEt*=GXbY%E~=wre_dN&=w^3N!x8QQ-s^<)dckI+43$w7ht=be3E;@xIOb99G`!d;QtVi_^s2L$#$H zSq+%Ev35={q!O-wW>e`w^~K?<;}rC8t{6l;J)qfl{xyZIhLz${?Y)}PmOy=zI8Jsu z*0L^;s<~~H`3K=7Gj6-Yf0)kbGrgQdDD3|!e8~MPB6hS5^?-qJft}~*UHq5zkxZK( zKNOyjv0?U<>EZCt!pa3vE&Ed`dUmR@Mm^?)#8v}x3A&licX5+U1~@e6#%Z<{N{{HA zL}Hqq6Va4o&ODlc{x*93;X?JWE?nVRlJ-ZwWg zE;~6(Y+)WC$i}%5q^Aso86QpiD{M`_=wRIb?N52?dfJ(=Op4YiQPE97G5Mznfq%|b zS>%gk^i2TTsdB7%OB|^zv4(RAaVsCVx3M)gmFgji9oerb3w$MBaIwkdKdddYReUkt zit(nHl;y8yF#5F2a#*+YbNLQkrE6d$v_|xf!k`LeDVu~6@5#!H zwUfm8;b#y0EGR$(oJTEF-;bT0N$W`dQL8fa_@n6n5vMv)tNkLgGkHJ(xj`|BG-zrU zh=Tw$Sv?O-g~f#1)!qX&dv7y>J^-Q~^zM#nrt+)Ttn3w-0_!U%E1Gmko|JR4wMu2= znvfx|fnUR1m1(`F%jv!~MV#QwcS~m;$?h-;tFv3+r)@`R>x&BxIkmMelgk08^_fkC zmt!+G|G^CMWY|lURos1@NzHDn8nkd5ZKGJAJX}zBnPv-#u&) z(Ucu|0mun>+hJeyeN0-!OP;Vf|DIc<-$@POCIA7bTlQiJ zYv-$92eyhOYgV{V*b%?U!an=UPRmkI&F!`wVtMe?XI6AZ>C725>tGzR);3HRZQwd| zbrSV}z1C%jBam@`C1p9Ie9Q+Td#yzmvDWSKdx)b>^0x~)h=7FbTN~@Wh}e%axBN8b z*wJ?*JQR1vt@2Vy{2kRw{{dc}q2si3?@`gKyR?mEx*?)p1MlTuFiX*qcd*{y6{QUV zDrd*@T=$^j}Ee!vi6 z>d^Pgz0pw{-{g?d&HEA9r4-NAv+b4vI7(seBWrTegg1W`TOn zQw{giJs_9ZQ&J#@7OVU3*jYuM;cm_i9$B0w{8m$G(U)f=J`Uftp>|6jU6RXLHHHg> zT64WoauX4Io91?Fv(?f=AjQC1!(r2(w(&%}3i~I-1I@)ohC2@eWtlf|w_R$}&Jh^c z?5Gd9zVwULG4$JID-U3x6Ri*gHp#qxrFFDN|Co0?$O}=A_AKp(Da? zLQYPY(oYw*H`4#U@Tk1e=Q}loTxpPT*i?u-JBxX<`FL(!G8`AE?#S^meGKq3A(Qyg zntLx2_s>QV6XnILS)ljiBg?I%t;@<1Jl7R>OZK>_@oL)Tp{46`72BL01>0wsH@@tb z4eu2niq~p=mD?pH9#va^I=`(`CJ$6JbHNz|(8h)hwI^l@9s>InNN(Unf&3SezqjcC zO|Pg8mq=7?*_nZgi#`5TxTu{{eRDD=6yjuk0nzF^uU_n@+tdJ|+KJ@B;&W8P3Io=O zm{Ui!jEy2{t?n!HYR`v9IqW7D9dd?iIU(LDKaB97>3x8rvR9r&3QF6y;MKE%R$CRS z>&n0=5-2Z8r6+S!Gwvg=^z;?u(K|Beufg5(^B=q(=~Fd4J{L_q*qe}mv*Wdww0s z^q~3Zh)cEf7d{5o!E+FnA`~xsDYZLAr%q?-+ApQqeS9ZksBz^NQTm zsKX){zOOr=R`iS>9*o|cGam_ieE%KgClkj}tLI1P#Cc-hARMok%g1IL2i9k5)`u6f z*#tO+)v;pd%l0jNH)cSYRF#k*Bj+=;yy%NCE7~B__2q`YdP{CWf%4NTr>ZqqD+eW# zR=`t!wAlAR27>Df`}mlc*nM->m*13ts;Ge~qKo2jk?QyjpgLB!$-&YM9)b(uz-C2- zRr+4INq^i8cHCSC>iVn1mxfjcID>Ux7@FM&LtA}yGCBg`Kuo8F{e1mb*Ux_FNnrf9 z2%rEcLgdTc<37EYJV4<-kEND4&};xyU4b!sH45-V(X{4k$2fz5$wKxF6#xV$7{&lR zlTu&WPt&H0hvCD)nA?61c9?g89vazmUyn!cYXNo4rl?=y$6X3kpu!zr4yl5euWggf z*|8Qs%c@ZF0%Df_xpqJ)GW^(8aJNc7766eCC_`ChO;lRMXOAMv=#yMA@amMI25<)t z+zF|>wSL^Lfd&|5!r{1&fTc8Kk5a;LJS=zBzy%oAc|3uvxb9!WjDTTTm;FpKWIXnu z8=y>wwJIEB_zF;|tOzJ-R!oO-EDZrp18NDAUB4eweL#JGZy-^lW?cek)fr!#sJ0uD z>DY^5e;=!?h