From 5c84eb22a9b95e15e38aa6bd5e32acdd15377f21 Mon Sep 17 00:00:00 2001 From: supriyalall Date: Sat, 15 Nov 2025 14:57:33 -0500 Subject: [PATCH 1/3] adding Agentstack name change, changing logic to use SamplingResult instead of doing sampling in the Agentstack backend --- agentstack_platform/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 171 bytes .../agentstack_platform.cpython-312.pyc | Bin 0 -> 4943 bytes .../__pycache__/bee_platform.cpython-312.pyc | Bin 0 -> 5425 bytes agentstack_platform/agentstack_platform.py | 78 ++++++++++++++++++ docs/examples/agentstack_agent.py | 45 ++++++++++ 6 files changed, 123 insertions(+) create mode 100644 agentstack_platform/__init__.py create mode 100644 agentstack_platform/__pycache__/__init__.cpython-312.pyc create mode 100644 agentstack_platform/__pycache__/agentstack_platform.cpython-312.pyc create mode 100644 agentstack_platform/__pycache__/bee_platform.cpython-312.pyc create mode 100644 agentstack_platform/agentstack_platform.py create mode 100644 docs/examples/agentstack_agent.py diff --git a/agentstack_platform/__init__.py b/agentstack_platform/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/agentstack_platform/__pycache__/__init__.cpython-312.pyc b/agentstack_platform/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4df0715a1a4d79705ea8c50eb41f64568d0aacb4 GIT binary patch literal 171 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 literal 0 HcmV?d00001 diff --git a/agentstack_platform/__pycache__/bee_platform.cpython-312.pyc b/agentstack_platform/__pycache__/bee_platform.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d9f7601d4bfa9d0f455d3661ed4763f22c379f9 GIT binary patch literal 5425 zcmb7IeQ*=U72lIipSERNvTV!vLpFg#fMr9V#^KYH7zhvun0zQ9%2~IzPu!i9y%oVm zZk;A=+?Gknqz!ZeGoO)^OvI#d303!QxQkM`|J zCmTXC?b^D1`*z>nzPIoF_U-+trpAk)y!h`1WzdJvr@Ubmu}s{^0dWq=NETESE7d|w zfVNGwY4(_16Jw&l`F7QzIb%+f7FCz#j=4?Rp?WlL%xlt4wMwgwRcke|8qF8;X|=Ih ztu9t)_PNx0%^&k?fmlFmh&5=zSkUCV)kdu;)}%GZn$5OH4QVa07L)d>E40>FtJW54 z)7oS0Ca+5E(895>NegOctW&PWqFjT;5mEL%FUGpYg-GpnuHJ(Y8}kh4dWuRE%gp_4 zNmZp`6-NZ-I*1KJ8s%i&D5i0()QnSniUQAh6qA#fL>w%1;J`uNP!jn5QxxlllG00^ ztm#f&X`Eo8AtEJlf~Ls$S7h$g#bv4nMzKzJV=5_XL}Y=%6wz)MuD_MZ#k`z#1nV*; z%rgXwA5^d^gWfdQ@36PH1nVsOLS=ABz zbVeaqgSD_)L($SIj-QlNMFtCkROkriig6oA(5L95M=61>(Qzh@Wb_1c5==8hPY7lA z;#C#=?C`tsBO5|5fV0s`?`7T(Wm2Gggjtf7Yg!Dbe~2!ZWs=Ti>@qoNqaKT!wI%uc zZY$P%tXX71wzZ&1`zV?ev-aKScn7S(krk6Qw+TX%)>^!*BkPduGvej)TCLdxbf!~8 zwB8ygJ7lM9&x$jy%Vk|Aoit$eW}TMYq$?{VgBE|Omff_;YRMkiD_1FkTs>1`y;t_l z)K=&^+FTi1Pg^XSwpJ+6tyGd>i(0BJ%Z%7Uz?A*VX6Uj;(Nz|8+vvcu(W|X7SyySU z5%)A25#)yFt1YQXH|QI!!twkr-S=3T32j#}g;5od|o>C3eH_J51&6bR1?U|6p z5m45B6h&GlPMeWzgeCY7KSQK+8j~;`lW3SqConMe@o*`Q!fBEkC6Wd#Ih;u801ng$ zD=;txqPs92*cUb~I-a8NKM9B@yk6IBL;uZp{QyfRUjG(1sNR(1$W+CO{vfn}wf&H&})qwh)PMk77>QghW;)V zQIxP9Ur|PkJB-RYcr4us$6m6XX%o?;6R<|O6OtwQdT%Rt!ZX=cS*eRwFiW;u+}-G` za2zy-h_fXt__Z{#EN0!ZV*(hjBH4M-F1u#jR&=~2z9O6xgk^ZP47*&(hNW37D(gx% zTJ%y4+zK)+ac4Xha#?Gg^iZ&6sU$0?WpM!eeOb?_E$jS+@RsvM^chLZiz2tFzUl?`!N-z06KE7wt1XOR8d} zmDc>Qj^&^Wv&V%!3KyHkk_Pmv4@1cxz>r&Wn^{OMWVh^EJx zXDi?>K9wfhC)V;lIA)?-)l@=KjqTC$sk6kW489*0VDR(&@96U>lxsb7b<1zMXFF$O z7ltmaDYkWA-SUOOP4T_v79mp uGG9JV%LqAF};5($iDEO$l()8brTp5HRTdy75! zCBd{O0it40IBCDhp2Q|2U62L958G1imK9_>b-*-c$yV^xiuqU3MSFQC*27MS=1w>= z+}5!Aa(#{oVZx912P1aE_n5gLMVBZg%x+Ku%zn-k2op|P+eEeki)@3(|7GI?AYkl( zN6E(R*?jtReoW1cDY+Bs%*I(^rth^?R~)&{?N_8fxaNepZS%3?xhLa=*i(g_Qf|la zd`ALA${Vq%&)SG{OB>+|kHD#qou=1#)BES=H~I3dC3GT2}avt}Y>+7hdS zlPx}yQAZRYxT7&Un1DHmq>o}2SUU3H;zA`ZLU{H`c#_FHJci7OBAa;I&D%VjAi9ik zJ)xwSho<6mj9^J-e#6XBtSldnS9lqm@2uL)XUg{^CMHvG#Mcs@ppkC=i1G)|$C$^| z$XvLc$F9>no(<;ZT0oSKD5FeJn4mGY`7*!*R#m=LnD6t#`{HTIFyNNvgqsS@7=)i4 z20ywW2$z*9bElcB95)lqUl&o_fsB^{2|hRXcF~W5p<=_je8algW4VTPg@!HDo`wEh z#r}Qo_3taxKalU=H@os|r0DO;`@1gPoA=*c^miBh-MRjK)6QJ|0}H|CbC16CXfYVg z2cyN{hJ0|tY=0rRZQ6USzVYnS=bEPn7W}P6e{bI3yU@^j{-I0tKRL~lA#eftG%A+)j>>duF{7n-|@&1>?_YfR3%d}!TGm)POEfyDaS z>4BTosC`wjEt+qOzCmXn%C+sh()eE6&SKNf>Ajz{bQN1R%P}~^S+*Wch499+=Tr5g~b-sJRp2&@B{m~&cSx! zSK+}X@v6A13+Q)O3xloBckkZyEod-t@1dhZ6Q1=O`l7w?x1NcI4;>j&cEW82uD9Y? z%Aib4rwENS6BkU!T#9bMm6$S*p^WO_Lj*G~L>wfxkdzusR241)4hk7DPxW<~)PW%3 zPDbGS2qeyCW=uGk5{_bo0~6sn8Q~X9xJ8>Ob6mz6+ye*)PEy4mJOzUrbVg^k6wD5> ziuIGs4(V{jV|p^UwfRMXIn5Ortjdg;a$;`!f0=feb-ACEZuS9lFhF@-y@AfJPM}JHDAMz$EF^>7HlmBSLcJPFVRA9T`|~~5B5zx z{9(t+OM|cPe{KIS4;DH$%&wn3lIz$!_4vYFtEXb0`rD?13!XsH(~|eJT#=eE-&_Yw^O^>6&H}yF9ZEN=%j~7<-=N!$8PUNb2 zL48&|@0&S2cQBU#j6Ibb9$!T0fNj!t6QSPk*m%RP*{9SS2)T6oqS)o^y)e3np!%?7 z<@{aS=65_?+#%<8$b}svxw}U4Eu)Ke=)BgsW`6DN`N89b!FXq{39a|tbV1JzM`ixSy#jJpzYu#i_R}NW=g*(Kbh;3{_wAK$5C2~I zoigXl9UdxdKUTQ!;i=fX1l9RdH+f~g^S_+=gE#;H literal 0 HcmV?d00001 diff --git a/agentstack_platform/agentstack_platform.py b/agentstack_platform/agentstack_platform.py new file mode 100644 index 0000000..33aab7f --- /dev/null +++ b/agentstack_platform/agentstack_platform.py @@ -0,0 +1,78 @@ +import os +import asyncio +from typing import Annotated, Callable + +from a2a.types import Message +from a2a.utils.message import get_message_text +from agentstack_sdk.a2a.types import AgentMessage +from agentstack_sdk.server import Server +from agentstack_sdk.a2a.extensions import ( + LLMServiceExtensionServer, LLMServiceExtensionSpec, + TrajectoryExtensionServer, TrajectoryExtensionSpec, + AgentDetail +) +from agentstack_sdk.a2a.extensions.ui.form import ( + FormExtensionServer, FormExtensionSpec, FormRender, TextField +) +from mellea import MelleaSession, start_session +from mellea.backends.openai import OpenAIBackend +from mellea.stdlib.requirement import req, Requirement, simple_validate +from mellea.stdlib.sampling import RejectionSamplingStrategy +import inspect + + +def agentstack_app(func: Callable) -> Callable: + """Serves as a wrapper that takes any Mellea program and converts it to a BeeAI Agent. This is an example for an email writer.""" + server = Server() + + params : dict = inspect.signature(func).parameters # Mapping params from Mellea function onto form inputs + form_fields : list[str] = list(params.keys())[1:] + all_fields : list[TextField] = [] + + for field in form_fields: + all_fields.append(TextField(id=field, label=field, col_span=2)) #Maps all input params from Mellea agent into BeeAI Forms + + + form_render = FormRender( + id="input_form", + title="Please provide your information", + columns=2, + fields=all_fields + ) + form_extension_spec = FormExtensionSpec(form_render) + + + @server.agent(name="mellea_agent") + + async def wrapper(input: Message, + llm: Annotated[LLMServiceExtensionServer, LLMServiceExtensionSpec.single_demand()], + trajectory: Annotated[TrajectoryExtensionServer, TrajectoryExtensionSpec()], + form: Annotated[FormExtensionServer, + form_extension_spec]): + + + form_data = form.parse_form_response(message=input) + inputs = [form_data.values[key].value for key in form_data.values] # Extracting all of the user inputs from the form + llm_config = llm.data.llm_fulfillments.get("default") + m = MelleaSession(OpenAIBackend(model_id=llm_config.api_model, api_key=llm_config.api_key, base_url=llm_config.api_base)) + + sampling = await asyncio.to_thread(func, m, *inputs) + #print([elem for elem in sampling]) #printing all of these generations + if sampling.success: + yield AgentMesage(text=sampling.value) + return + + for idx in range(len(sampling.sample_generations)): + yield trajectory.trajectory_metadata( + title=f"Attempt {idx + 1}", content=f"Generating message...") + validations = sampling.sample_validations[idx] # Print out validations + status = "\n".join(f"{'✓' if bool(v) else '✗'} {getattr(r, 'description', str(r))}" for r, v in validations) + yield trajectory.trajectory_metadata(title=f"✗ Attempt {idx + 1} failed", content=status) + + yield AgentMessage(text=sampling.value) + + server.run(host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000))) + + return wrapper + + diff --git a/docs/examples/agentstack_agent.py b/docs/examples/agentstack_agent.py new file mode 100644 index 0000000..3a4d21f --- /dev/null +++ b/docs/examples/agentstack_agent.py @@ -0,0 +1,45 @@ +""" +Example use case for BeeAI integration: utilizing a Mellea program to write an email with an IVF loop. +""" +import os +import asyncio +import sys +import mellea +from typing import Annotated + +from mellea.stdlib.requirement import req, check, simple_validate +from mellea import MelleaSession, start_session +from mellea.stdlib.base import ChatContext, ModelOutputThunk + +from mellea.stdlib.sampling import RejectionSamplingStrategy +from mellea.stdlib.sampling.types import SamplingResult +from mellea.stdlib.sampling.base import Context +from mellea.stdlib.requirement import req, Requirement, simple_validate +from agentstack_platform.agentstack_platform import agentstack_app + + +@agentstack_app +def mellea_func(m: MelleaSession, sender: str, recipient, subject: str, topic: str) -> tuple[ModelOutputThunk, Context] | SamplingResult: + """ + Example email writing module that utilizes an IVR loop in Mellea to generate an email with a specific list of requirements. + Inputs: + sender: str + recipient: str + subject: str + topic: str + Output: + sampling: tuple[ModelOutputThunk, Context] | SamplingResult + """ + requirements = [ + req("Be formal."), + req("Be funny."), + req(f"Make sure that the email is from {sender}, is towards {recipient}, has {subject} as the subject, and is focused on {topic} as a topic"), + Requirement("Use less than 100 words.", + validation_fn=simple_validate(lambda o: len(o.split()) < 100)) + ] + description = f"Write an email from {sender}. Subject of email is {subject}. Name of recipient is {recipient}. Topic of email should be {topic}." + sampling = m.instruct(description=description, requirements=requirements, strategy=RejectionSamplingStrategy(loop_budget=3), return_sampling_results=True) + return sampling + + + From 5f866d356bceb4b116806d2f1d762fea33f5036a Mon Sep 17 00:00:00 2001 From: supriyalall Date: Sat, 15 Nov 2025 14:59:12 -0500 Subject: [PATCH 2/3] removing extraneous files --- .../__pycache__/__init__.cpython-312.pyc | Bin 171 -> 0 bytes .../agentstack_platform.cpython-312.pyc | Bin 4943 -> 0 bytes .../__pycache__/bee_platform.cpython-312.pyc | Bin 5425 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 agentstack_platform/__pycache__/__init__.cpython-312.pyc delete mode 100644 agentstack_platform/__pycache__/agentstack_platform.cpython-312.pyc delete mode 100644 agentstack_platform/__pycache__/bee_platform.cpython-312.pyc diff --git a/agentstack_platform/__pycache__/__init__.cpython-312.pyc b/agentstack_platform/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4df0715a1a4d79705ea8c50eb41f64568d0aacb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 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 diff --git a/agentstack_platform/__pycache__/bee_platform.cpython-312.pyc b/agentstack_platform/__pycache__/bee_platform.cpython-312.pyc deleted file mode 100644 index 8d9f7601d4bfa9d0f455d3661ed4763f22c379f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5425 zcmb7IeQ*=U72lIipSERNvTV!vLpFg#fMr9V#^KYH7zhvun0zQ9%2~IzPu!i9y%oVm zZk;A=+?Gknqz!ZeGoO)^OvI#d303!QxQkM`|J zCmTXC?b^D1`*z>nzPIoF_U-+trpAk)y!h`1WzdJvr@Ubmu}s{^0dWq=NETESE7d|w zfVNGwY4(_16Jw&l`F7QzIb%+f7FCz#j=4?Rp?WlL%xlt4wMwgwRcke|8qF8;X|=Ih ztu9t)_PNx0%^&k?fmlFmh&5=zSkUCV)kdu;)}%GZn$5OH4QVa07L)d>E40>FtJW54 z)7oS0Ca+5E(895>NegOctW&PWqFjT;5mEL%FUGpYg-GpnuHJ(Y8}kh4dWuRE%gp_4 zNmZp`6-NZ-I*1KJ8s%i&D5i0()QnSniUQAh6qA#fL>w%1;J`uNP!jn5QxxlllG00^ ztm#f&X`Eo8AtEJlf~Ls$S7h$g#bv4nMzKzJV=5_XL}Y=%6wz)MuD_MZ#k`z#1nV*; z%rgXwA5^d^gWfdQ@36PH1nVsOLS=ABz zbVeaqgSD_)L($SIj-QlNMFtCkROkriig6oA(5L95M=61>(Qzh@Wb_1c5==8hPY7lA z;#C#=?C`tsBO5|5fV0s`?`7T(Wm2Gggjtf7Yg!Dbe~2!ZWs=Ti>@qoNqaKT!wI%uc zZY$P%tXX71wzZ&1`zV?ev-aKScn7S(krk6Qw+TX%)>^!*BkPduGvej)TCLdxbf!~8 zwB8ygJ7lM9&x$jy%Vk|Aoit$eW}TMYq$?{VgBE|Omff_;YRMkiD_1FkTs>1`y;t_l z)K=&^+FTi1Pg^XSwpJ+6tyGd>i(0BJ%Z%7Uz?A*VX6Uj;(Nz|8+vvcu(W|X7SyySU z5%)A25#)yFt1YQXH|QI!!twkr-S=3T32j#}g;5od|o>C3eH_J51&6bR1?U|6p z5m45B6h&GlPMeWzgeCY7KSQK+8j~;`lW3SqConMe@o*`Q!fBEkC6Wd#Ih;u801ng$ zD=;txqPs92*cUb~I-a8NKM9B@yk6IBL;uZp{QyfRUjG(1sNR(1$W+CO{vfn}wf&H&})qwh)PMk77>QghW;)V zQIxP9Ur|PkJB-RYcr4us$6m6XX%o?;6R<|O6OtwQdT%Rt!ZX=cS*eRwFiW;u+}-G` za2zy-h_fXt__Z{#EN0!ZV*(hjBH4M-F1u#jR&=~2z9O6xgk^ZP47*&(hNW37D(gx% zTJ%y4+zK)+ac4Xha#?Gg^iZ&6sU$0?WpM!eeOb?_E$jS+@RsvM^chLZiz2tFzUl?`!N-z06KE7wt1XOR8d} zmDc>Qj^&^Wv&V%!3KyHkk_Pmv4@1cxz>r&Wn^{OMWVh^EJx zXDi?>K9wfhC)V;lIA)?-)l@=KjqTC$sk6kW489*0VDR(&@96U>lxsb7b<1zMXFF$O z7ltmaDYkWA-SUOOP4T_v79mp uGG9JV%LqAF};5($iDEO$l()8brTp5HRTdy75! zCBd{O0it40IBCDhp2Q|2U62L958G1imK9_>b-*-c$yV^xiuqU3MSFQC*27MS=1w>= z+}5!Aa(#{oVZx912P1aE_n5gLMVBZg%x+Ku%zn-k2op|P+eEeki)@3(|7GI?AYkl( zN6E(R*?jtReoW1cDY+Bs%*I(^rth^?R~)&{?N_8fxaNepZS%3?xhLa=*i(g_Qf|la zd`ALA${Vq%&)SG{OB>+|kHD#qou=1#)BES=H~I3dC3GT2}avt}Y>+7hdS zlPx}yQAZRYxT7&Un1DHmq>o}2SUU3H;zA`ZLU{H`c#_FHJci7OBAa;I&D%VjAi9ik zJ)xwSho<6mj9^J-e#6XBtSldnS9lqm@2uL)XUg{^CMHvG#Mcs@ppkC=i1G)|$C$^| z$XvLc$F9>no(<;ZT0oSKD5FeJn4mGY`7*!*R#m=LnD6t#`{HTIFyNNvgqsS@7=)i4 z20ywW2$z*9bElcB95)lqUl&o_fsB^{2|hRXcF~W5p<=_je8algW4VTPg@!HDo`wEh z#r}Qo_3taxKalU=H@os|r0DO;`@1gPoA=*c^miBh-MRjK)6QJ|0}H|CbC16CXfYVg z2cyN{hJ0|tY=0rRZQ6USzVYnS=bEPn7W}P6e{bI3yU@^j{-I0tKRL~lA#eftG%A+)j>>duF{7n-|@&1>?_YfR3%d}!TGm)POEfyDaS z>4BTosC`wjEt+qOzCmXn%C+sh()eE6&SKNf>Ajz{bQN1R%P}~^S+*Wch499+=Tr5g~b-sJRp2&@B{m~&cSx! zSK+}X@v6A13+Q)O3xloBckkZyEod-t@1dhZ6Q1=O`l7w?x1NcI4;>j&cEW82uD9Y? z%Aib4rwENS6BkU!T#9bMm6$S*p^WO_Lj*G~L>wfxkdzusR241)4hk7DPxW<~)PW%3 zPDbGS2qeyCW=uGk5{_bo0~6sn8Q~X9xJ8>Ob6mz6+ye*)PEy4mJOzUrbVg^k6wD5> ziuIGs4(V{jV|p^UwfRMXIn5Ortjdg;a$;`!f0=feb-ACEZuS9lFhF@-y@AfJPM}JHDAMz$EF^>7HlmBSLcJPFVRA9T`|~~5B5zx z{9(t+OM|cPe{KIS4;DH$%&wn3lIz$!_4vYFtEXb0`rD?13!XsH(~|eJT#=eE-&_Yw^O^>6&H}yF9ZEN=%j~7<-=N!$8PUNb2 zL48&|@0&S2cQBU#j6Ibb9$!T0fNj!t6QSPk*m%RP*{9SS2)T6oqS)o^y)e3np!%?7 z<@{aS=65_?+#%<8$b}svxw}U4Eu)Ke=)BgsW`6DN`N89b!FXq{39a|tbV1JzM`ixSy#jJpzYu#i_R}NW=g*(Kbh;3{_wAK$5C2~I zoigXl9UdxdKUTQ!;i=fX1l9RdH+f~g^S_+=gE#;H From 89df055e128b8963b2dc63b2a18dbcfafb0e1fda Mon Sep 17 00:00:00 2001 From: supriyalall <54196684+supriyalall@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:08:40 -0500 Subject: [PATCH 3/3] Create agentstack_readme.md adding docs --- agentstack_platform/agentstack_readme.md | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 agentstack_platform/agentstack_readme.md diff --git a/agentstack_platform/agentstack_readme.md b/agentstack_platform/agentstack_readme.md new file mode 100644 index 0000000..c083068 --- /dev/null +++ b/agentstack_platform/agentstack_readme.md @@ -0,0 +1,68 @@ +# Mellea-Agentstack + +Mellea is a library for writing generative programs. +Agentstack is an open-source framework for building production-grade multi-agent systems. +This example serves to merge both libraries with a simple module that will allow users to transform +their Mellea programs into Agentstack agentic interfaces with structured (form) inputs. + +We provide the example of an email writer. Only text inputs are currently supported. + +# Installing Agentstack + +To install Agentstack, follow the instructions at this page: https://agentstack.beeai.dev/introduction/welcome + + +# Running the example + +Then, in order to run the example email writer, run the code below in the root of the directory: +```bash +uv run --with mellea --with agentstack-sdk docs/examples/agentstack_agent.py +``` + +In a separate terminal, either run +```bash +agentstack run mellea_agent +``` + +OR open the UI and select the **mellea-agent**. + +```bash +agentstack ui +``` + +# Tutorial + +To create your own Agentstack agent with Mellea, write a traditional program with Mellea, as shown below. We provide the source code of the email writer. + +```bash +@agentstack_app +def mellea_func(m: MelleaSession, sender: str, recipient, subject: str, topic: str) -> tuple[ModelOutputThunk, Context] | SamplingResult: + """ + Example email writing module that utilizes an IVR loop in Mellea to generate an email with a specific list of requirements. + Inputs: + sender: str + recipient: str + subject: str + topic: str + Output: + sampling: tuple[ModelOutputThunk, Context] | SamplingResult + """ + requirements = [ + req("Be formal."), + req("Be funny."), + req(f"Make sure that the email is from {sender}, is towards {recipient}, has {subject} as the subject, and is focused on {topic} as a topic"), + Requirement("Use less than 100 words.", + validation_fn=simple_validate(lambda o: len(o.split()) < 100)) + ] + description = f"Write an email from {sender}. Subject of email is {subject}. Name of recipient is {recipient}. Topic of email should be {topic}." + sampling = m.instruct(description=description, requirements=requirements, strategy=RejectionSamplingStrategy(loop_budget=3), return_sampling_results=True) + return sampling +``` + +Adjust ```requirements``` and ```prompt``` as necessary. + +As shown above, note that the first parameter should be an **m** object. + +Then, to deploy your Mellea program to Agentstack, wrap with the ```@agentstack_app``` decorator, as shown above. + +Place your code in the ```docs/examples/``` folder.